From 2bfe297e7bba35b8bc60080950d8f5c0724c0a46 Mon Sep 17 00:00:00 2001 From: SQFMI Date: Thu, 30 Dec 2021 23:16:03 -0500 Subject: [PATCH] change line endings --- README.md | 6 +- examples/WatchFaces/7_SEG/7_SEG.ino | 26 +- .../WatchFaces/7_SEG/DSEG7_Classic_Bold_25.h | 396 +- .../7_SEG/DSEG7_Classic_Regular_15.h | 396 +- .../7_SEG/DSEG7_Classic_Regular_39.h | 396 +- examples/WatchFaces/7_SEG/Watchy_7_SEG.cpp | 24 +- examples/WatchFaces/7_SEG/Watchy_7_SEG.h | 42 +- examples/WatchFaces/7_SEG/icons.h | 352 +- examples/WatchFaces/Basic/Basic.ino | 18 +- examples/WatchFaces/DOS/DOS.ino | 20 +- examples/WatchFaces/DOS/Watchy_DOS.cpp | 60 +- examples/WatchFaces/DOS/Watchy_DOS.h | 24 +- examples/WatchFaces/Pokemon/Pokemon.ino | 20 +- .../WatchFaces/Pokemon/Watchy_Pokemon.cpp | 34 +- examples/WatchFaces/Pokemon/Watchy_Pokemon.h | 24 +- examples/WatchFaces/Pokemon/pokemon.h | 630 +- .../StarryHorizon/StarryHorizon.ino | 302 +- extras/WatchFaces/index.json | 152 +- library.json | 4 +- library.properties | 20 +- src/DSEG7_Classic_Bold_53.h | 396 +- src/Watchy.cpp | 130 +- src/Watchy.h | 168 +- src/WatchyRTC.cpp | 10 +- src/bma.cpp | 656 +- src/bma.h | 176 +- src/bma4.c | 8408 ++++++++--------- src/bma4.h | 3148 +++--- src/bma423.c | 3390 +++---- src/bma423.h | 1608 ++-- src/bma4_defs.h | 1926 ++-- src/config.h | 106 +- 32 files changed, 11534 insertions(+), 11534 deletions(-) diff --git a/README.md b/README.md index 22750f2..eb58827 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Visit [**https://watchy.sqfmi.com**](https://watchy.sqfmi.com) for documentation 1. In the Arduino IDE Boards Manager, install support for the ESP32. You can find instructions here: https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html * Arduino > Preferences > Additional Board Manager URL's * ```https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json``` - + 2. Install this library (search for **Watchy** in the library manager), and any other depdencies when prompted 3. Check out the examples under ```Examples``` -> ```Watchy``` 4. Compile & Upload with these board settings: @@ -24,5 +24,5 @@ Visit [**https://watchy.sqfmi.com**](https://watchy.sqfmi.com) for documentation You may also have to install the [CP2104 USB to Serial drivers](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers) if the port is not automatically detected ### Have Fun! :) - - + + diff --git a/examples/WatchFaces/7_SEG/7_SEG.ino b/examples/WatchFaces/7_SEG/7_SEG.ino index 2ab7607..f561e09 100644 --- a/examples/WatchFaces/7_SEG/7_SEG.ino +++ b/examples/WatchFaces/7_SEG/7_SEG.ino @@ -1,13 +1,13 @@ -#include "Watchy_7_SEG.h" -#include "settings.h" - -Watchy7SEG watchy(settings); - -void setup(){ - watchy.init(); -} - -void loop(){} - - - +#include "Watchy_7_SEG.h" +#include "settings.h" + +Watchy7SEG watchy(settings); + +void setup(){ + watchy.init(); +} + +void loop(){} + + + diff --git a/examples/WatchFaces/7_SEG/DSEG7_Classic_Bold_25.h b/examples/WatchFaces/7_SEG/DSEG7_Classic_Bold_25.h index aab0b1a..4c082d0 100644 --- a/examples/WatchFaces/7_SEG/DSEG7_Classic_Bold_25.h +++ b/examples/WatchFaces/7_SEG/DSEG7_Classic_Bold_25.h @@ -1,199 +1,199 @@ -// Created by http://oleddisplay.squix.ch/ Consider a donation -// In case of problems make sure that you are using the font file with the correct version! -const uint8_t DSEG7_Classic_Bold_25Bitmaps[] PROGMEM = { - - // Bitmap Data: - 0x00, // ' ' - 0x00, // '!' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '"' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '#' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '$' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '%' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '&' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // ''' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '(' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // ')' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '*' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '+' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // ',' - 0x7F,0xE7,0xFF,0x9F,0xF8, // '-' - 0x67,0x98, // '.' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '/' - 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDC,0x00,0x60,0x00,0x07,0x00,0x1B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xFF,0xEC,0xFF,0xFA,0x3F,0xFE,0x00, // '0' - 0x26,0xEE,0xEE,0xEE,0xEE,0x60,0x6E,0xEE,0xEE,0xEE,0xE6,0x20, // '1' - 0x3F,0xFE,0x1F,0xFE,0x87,0xFE,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC3,0xFF,0x63,0xFF,0xC7,0xFF,0xC3,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xFF,0xE0,0xFF,0xF8,0x3F,0xFE,0x00, // '2' - 0xFF,0xF9,0xFF,0xE9,0xFF,0xB0,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x73,0xFF,0x6F,0xFF,0x0F,0xFD,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x9F,0xFB,0x7F,0xFA,0xFF,0xF8, // '3' - 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x81,0xFF,0xB0,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x18,0x00,0x04, // '4' - 0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1F,0xFF,0x03,0xFF,0xC0,0xFF,0xD8,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x7F,0xEC,0x7F,0xFA,0x3F,0xFE,0x00, // '5' - 0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1F,0xFF,0x03,0xFF,0xC7,0xFF,0xDB,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xFF,0xEC,0xFF,0xFA,0x3F,0xFE,0x00, // '6' - 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDC,0x00,0x60,0x00,0x00,0x00,0x18,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x0C,0x00,0x02, // '7' - 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC7,0xFF,0xDB,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xFF,0xEC,0xFF,0xFA,0x3F,0xFE,0x00, // '8' - 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC0,0xFF,0xD8,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x7F,0xEC,0x7F,0xFA,0x3F,0xFE,0x00, // '9' - 0x4E,0xE0,0x00,0x00,0x00,0x4E,0xE4, // ':' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // ';' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '<' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '=' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '>' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '?' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '@' - 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC7,0xFF,0xDB,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0x80,0x0C,0x80,0x02, // 'A' - 0x40,0x00,0x70,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3F,0xFE,0x07,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'B' - 0x1F,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'C' - 0x00,0x01,0x00,0x01,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x87,0xFE,0xC7,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'D' - 0x3F,0xFE,0x7F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'E' - 0x3F,0xFE,0x7F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xE0,0x00,0x40,0x00, // 'F' - 0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1C,0x00,0x00,0x00,0x07,0x00,0x1B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xFF,0xEC,0xFF,0xFA,0x3F,0xFE,0x00, // 'G' - 0x40,0x00,0x70,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3F,0xFE,0x07,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x00,0x19,0x00,0x04, // 'H' - 0x6E,0xEE,0xEE,0xEE,0xE6,0x20, // 'I' - 0x00,0x01,0x00,0x01,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x00,0xC0,0x00,0x0E,0x00,0x37,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'J' - 0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1F,0xFF,0x03,0xFF,0xC7,0xFF,0xDB,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0x80,0x0C,0x80,0x02, // 'K' - 0x40,0x00,0xE0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'L' - 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDC,0x00,0x60,0x00,0x07,0x00,0x1B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0x80,0x0C,0x80,0x02, // 'M' - 0x1F,0xF8,0x1F,0xFE,0x3F,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDC,0x00,0x64,0x00,0x10, // 'N' - 0x1F,0xF8,0x1F,0xFE,0x3F,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x67,0xFF,0xD1,0xFF,0xF0, // 'O' - 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC7,0xFF,0xC3,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0x80,0x00,0x80,0x00, // 'P' - 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC0,0xFF,0xD8,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x0C,0x00,0x02, // 'Q' - 0x1F,0xF8,0x7F,0xFB,0xFF,0xE7,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x78,0x00,0xF0,0x01,0xE0,0x03,0xC0,0x07,0x00,0x04,0x00,0x00, // 'R' - 0x40,0x00,0x70,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3F,0xFE,0x07,0xFF,0x81,0xFF,0xB0,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0xFF,0xD8,0xFF,0xF4,0x7F,0xFC, // 'S' - 0x40,0x00,0xE0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'T' - 0xE0,0x03,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x7F,0xFD,0x9F,0xFF,0x47,0xFF,0xC0, // 'U' - 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xB8,0x00,0xC0,0x00,0x0E,0x00,0x37,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'V' - 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'W' - 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x00,0x19,0x00,0x04, // 'X' - 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x81,0xFF,0xB0,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0xFF,0xD8,0xFF,0xF4,0x7F,0xFC, // 'Y' - 0x3F,0xFE,0x1F,0xFE,0x87,0xFE,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x07,0x00,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xFF,0xE0,0xFF,0xF8,0x3F,0xFE,0x00, // 'Z' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '[' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '\' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // ']' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '^' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '_' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '`' - 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC7,0xFF,0xDB,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0x80,0x0C,0x80,0x02, // 'a' - 0x40,0x00,0x70,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3F,0xFE,0x07,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'b' - 0x1F,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'c' - 0x00,0x01,0x00,0x01,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x87,0xFE,0xC7,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'd' - 0x3F,0xFE,0x7F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'e' - 0x3F,0xFE,0x7F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xE0,0x00,0x40,0x00, // 'f' - 0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1C,0x00,0x00,0x00,0x07,0x00,0x1B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xFF,0xEC,0xFF,0xFA,0x3F,0xFE,0x00, // 'g' - 0x40,0x00,0x70,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3F,0xFE,0x07,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x00,0x19,0x00,0x04, // 'h' - 0x6E,0xEE,0xEE,0xEE,0xE6,0x20, // 'i' - 0x00,0x01,0x00,0x01,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x00,0xC0,0x00,0x0E,0x00,0x37,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'j' - 0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1F,0xFF,0x03,0xFF,0xC7,0xFF,0xDB,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0x80,0x0C,0x80,0x02, // 'k' - 0x40,0x00,0xE0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'l' - 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDC,0x00,0x60,0x00,0x07,0x00,0x1B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0x80,0x0C,0x80,0x02, // 'm' - 0x1F,0xF8,0x1F,0xFE,0x3F,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDC,0x00,0x64,0x00,0x10, // 'n' - 0x1F,0xF8,0x1F,0xFE,0x3F,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x67,0xFF,0xD1,0xFF,0xF0, // 'o' - 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC7,0xFF,0xC3,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0x80,0x00,0x80,0x00, // 'p' - 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC0,0xFF,0xD8,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x0C,0x00,0x02, // 'q' - 0x1F,0xF8,0x7F,0xFB,0xFF,0xE7,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x78,0x00,0xF0,0x01,0xE0,0x03,0xC0,0x07,0x00,0x04,0x00,0x00, // 'r' - 0x40,0x00,0x70,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3F,0xFE,0x07,0xFF,0x81,0xFF,0xB0,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0xFF,0xD8,0xFF,0xF4,0x7F,0xFC, // 's' - 0x40,0x00,0xE0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 't' - 0xE0,0x03,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x7F,0xFD,0x9F,0xFF,0x47,0xFF,0xC0, // 'u' - 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xB8,0x00,0xC0,0x00,0x0E,0x00,0x37,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'v' - 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'w' - 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x00,0x19,0x00,0x04, // 'x' - 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x81,0xFF,0xB0,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0xFF,0xD8,0xFF,0xF4,0x7F,0xFC, // 'y' - 0x3F,0xFE,0x1F,0xFE,0x87,0xFE,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x07,0x00,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xFF,0xE0,0xFF,0xF8,0x3F,0xFE,0x00, // 'z' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '{' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '|' - 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE // '}' -}; -const GFXglyph DSEG7_Classic_Bold_25Glyphs[] PROGMEM = { -// bitmapOffset, width, height, xAdvance, xOffset, yOffset - { 0, 1, 1, 6, 0, 0 }, // ' ' - { 1, 1, 1, 21, 0, 0 }, // '!' - { 2, 8, 17, 10, 1, -17 }, // '"' - { 19, 8, 17, 10, 1, -17 }, // '#' - { 36, 8, 17, 10, 1, -17 }, // '$' - { 53, 8, 17, 10, 1, -17 }, // '%' - { 70, 8, 17, 10, 1, -17 }, // '&' - { 87, 8, 17, 10, 1, -17 }, // ''' - { 104, 8, 17, 10, 1, -17 }, // '(' - { 121, 8, 17, 10, 1, -17 }, // ')' - { 138, 8, 17, 10, 1, -17 }, // '*' - { 155, 8, 17, 10, 1, -17 }, // '+' - { 172, 8, 17, 10, 1, -17 }, // ',' - { 189, 13, 3, 21, 4, -14 }, // '-' - { 194, 5, 3, 1, -2, -3 }, // '.' - { 196, 8, 17, 10, 1, -17 }, // '/' - { 213, 17, 25, 21, 2, -25 }, // '0' - { 267, 4, 23, 21, 15, -24 }, // '1' - { 279, 17, 25, 21, 2, -25 }, // '2' - { 333, 15, 25, 21, 4, -25 }, // '3' - { 380, 17, 23, 21, 2, -24 }, // '4' - { 429, 17, 25, 21, 2, -25 }, // '5' - { 483, 17, 25, 21, 2, -25 }, // '6' - { 537, 17, 24, 21, 2, -25 }, // '7' - { 588, 17, 25, 21, 2, -25 }, // '8' - { 642, 17, 25, 21, 2, -25 }, // '9' - { 696, 4, 14, 6, 1, -19 }, // ':' - { 703, 8, 17, 10, 1, -17 }, // ';' - { 720, 8, 17, 10, 1, -17 }, // '<' - { 737, 8, 17, 10, 1, -17 }, // '=' - { 754, 8, 17, 10, 1, -17 }, // '>' - { 771, 8, 17, 10, 1, -17 }, // '?' - { 788, 8, 17, 10, 1, -17 }, // '@' - { 805, 17, 24, 21, 2, -25 }, // 'A' - { 856, 17, 24, 21, 2, -24 }, // 'B' - { 907, 16, 14, 21, 2, -14 }, // 'C' - { 935, 17, 24, 21, 2, -24 }, // 'D' - { 986, 16, 25, 21, 2, -25 }, // 'E' - { 1036, 16, 24, 21, 2, -25 }, // 'F' - { 1084, 17, 25, 21, 2, -25 }, // 'G' - { 1138, 17, 23, 21, 2, -24 }, // 'H' - { 1187, 4, 11, 21, 15, -12 }, // 'I' - { 1193, 17, 24, 21, 2, -24 }, // 'J' - { 1244, 17, 24, 21, 2, -25 }, // 'K' - { 1295, 16, 24, 21, 2, -24 }, // 'L' - { 1343, 17, 24, 21, 2, -25 }, // 'M' - { 1394, 17, 13, 21, 2, -14 }, // 'N' - { 1422, 17, 14, 21, 2, -14 }, // 'O' - { 1452, 17, 24, 21, 2, -25 }, // 'P' - { 1503, 17, 24, 21, 2, -25 }, // 'Q' - { 1554, 15, 13, 21, 2, -14 }, // 'R' - { 1579, 17, 24, 21, 2, -24 }, // 'S' - { 1630, 16, 24, 21, 2, -24 }, // 'T' - { 1678, 17, 12, 21, 2, -12 }, // 'U' - { 1704, 17, 24, 21, 2, -24 }, // 'V' - { 1755, 17, 24, 21, 2, -24 }, // 'W' - { 1806, 17, 23, 21, 2, -24 }, // 'X' - { 1855, 17, 24, 21, 2, -24 }, // 'Y' - { 1906, 17, 25, 21, 2, -25 }, // 'Z' - { 1960, 8, 17, 10, 1, -17 }, // '[' - { 1977, 8, 17, 10, 1, -17 }, // '\' - { 1994, 8, 17, 10, 1, -17 }, // ']' - { 2011, 8, 17, 10, 1, -17 }, // '^' - { 2028, 8, 17, 10, 1, -17 }, // '_' - { 2045, 8, 17, 10, 1, -17 }, // '`' - { 2062, 17, 24, 21, 2, -25 }, // 'a' - { 2113, 17, 24, 21, 2, -24 }, // 'b' - { 2164, 16, 14, 21, 2, -14 }, // 'c' - { 2192, 17, 24, 21, 2, -24 }, // 'd' - { 2243, 16, 25, 21, 2, -25 }, // 'e' - { 2293, 16, 24, 21, 2, -25 }, // 'f' - { 2341, 17, 25, 21, 2, -25 }, // 'g' - { 2395, 17, 23, 21, 2, -24 }, // 'h' - { 2444, 4, 11, 21, 15, -12 }, // 'i' - { 2450, 17, 24, 21, 2, -24 }, // 'j' - { 2501, 17, 24, 21, 2, -25 }, // 'k' - { 2552, 16, 24, 21, 2, -24 }, // 'l' - { 2600, 17, 24, 21, 2, -25 }, // 'm' - { 2651, 17, 13, 21, 2, -14 }, // 'n' - { 2679, 17, 14, 21, 2, -14 }, // 'o' - { 2709, 17, 24, 21, 2, -25 }, // 'p' - { 2760, 17, 24, 21, 2, -25 }, // 'q' - { 2811, 15, 13, 21, 2, -14 }, // 'r' - { 2836, 17, 24, 21, 2, -24 }, // 's' - { 2887, 16, 24, 21, 2, -24 }, // 't' - { 2935, 17, 12, 21, 2, -12 }, // 'u' - { 2961, 17, 24, 21, 2, -24 }, // 'v' - { 3012, 17, 24, 21, 2, -24 }, // 'w' - { 3063, 17, 23, 21, 2, -24 }, // 'x' - { 3112, 17, 24, 21, 2, -24 }, // 'y' - { 3163, 17, 25, 21, 2, -25 }, // 'z' - { 3217, 8, 17, 10, 1, -17 }, // '{' - { 3234, 8, 17, 10, 1, -17 }, // '|' - { 3251, 8, 17, 10, 1, -17 } // '}' -}; -const GFXfont DSEG7_Classic_Bold_25 PROGMEM = { +// Created by http://oleddisplay.squix.ch/ Consider a donation +// In case of problems make sure that you are using the font file with the correct version! +const uint8_t DSEG7_Classic_Bold_25Bitmaps[] PROGMEM = { + + // Bitmap Data: + 0x00, // ' ' + 0x00, // '!' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '"' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '#' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '$' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '%' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '&' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // ''' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '(' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // ')' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '*' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '+' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // ',' + 0x7F,0xE7,0xFF,0x9F,0xF8, // '-' + 0x67,0x98, // '.' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '/' + 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDC,0x00,0x60,0x00,0x07,0x00,0x1B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xFF,0xEC,0xFF,0xFA,0x3F,0xFE,0x00, // '0' + 0x26,0xEE,0xEE,0xEE,0xEE,0x60,0x6E,0xEE,0xEE,0xEE,0xE6,0x20, // '1' + 0x3F,0xFE,0x1F,0xFE,0x87,0xFE,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC3,0xFF,0x63,0xFF,0xC7,0xFF,0xC3,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xFF,0xE0,0xFF,0xF8,0x3F,0xFE,0x00, // '2' + 0xFF,0xF9,0xFF,0xE9,0xFF,0xB0,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x73,0xFF,0x6F,0xFF,0x0F,0xFD,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x9F,0xFB,0x7F,0xFA,0xFF,0xF8, // '3' + 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x81,0xFF,0xB0,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x18,0x00,0x04, // '4' + 0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1F,0xFF,0x03,0xFF,0xC0,0xFF,0xD8,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x7F,0xEC,0x7F,0xFA,0x3F,0xFE,0x00, // '5' + 0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1F,0xFF,0x03,0xFF,0xC7,0xFF,0xDB,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xFF,0xEC,0xFF,0xFA,0x3F,0xFE,0x00, // '6' + 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDC,0x00,0x60,0x00,0x00,0x00,0x18,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x0C,0x00,0x02, // '7' + 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC7,0xFF,0xDB,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xFF,0xEC,0xFF,0xFA,0x3F,0xFE,0x00, // '8' + 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC0,0xFF,0xD8,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x7F,0xEC,0x7F,0xFA,0x3F,0xFE,0x00, // '9' + 0x4E,0xE0,0x00,0x00,0x00,0x4E,0xE4, // ':' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // ';' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '<' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '=' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '>' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '?' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '@' + 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC7,0xFF,0xDB,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0x80,0x0C,0x80,0x02, // 'A' + 0x40,0x00,0x70,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3F,0xFE,0x07,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'B' + 0x1F,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'C' + 0x00,0x01,0x00,0x01,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x87,0xFE,0xC7,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'D' + 0x3F,0xFE,0x7F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'E' + 0x3F,0xFE,0x7F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xE0,0x00,0x40,0x00, // 'F' + 0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1C,0x00,0x00,0x00,0x07,0x00,0x1B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xFF,0xEC,0xFF,0xFA,0x3F,0xFE,0x00, // 'G' + 0x40,0x00,0x70,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3F,0xFE,0x07,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x00,0x19,0x00,0x04, // 'H' + 0x6E,0xEE,0xEE,0xEE,0xE6,0x20, // 'I' + 0x00,0x01,0x00,0x01,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x00,0xC0,0x00,0x0E,0x00,0x37,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'J' + 0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1F,0xFF,0x03,0xFF,0xC7,0xFF,0xDB,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0x80,0x0C,0x80,0x02, // 'K' + 0x40,0x00,0xE0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'L' + 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDC,0x00,0x60,0x00,0x07,0x00,0x1B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0x80,0x0C,0x80,0x02, // 'M' + 0x1F,0xF8,0x1F,0xFE,0x3F,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDC,0x00,0x64,0x00,0x10, // 'N' + 0x1F,0xF8,0x1F,0xFE,0x3F,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x67,0xFF,0xD1,0xFF,0xF0, // 'O' + 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC7,0xFF,0xC3,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0x80,0x00,0x80,0x00, // 'P' + 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC0,0xFF,0xD8,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x0C,0x00,0x02, // 'Q' + 0x1F,0xF8,0x7F,0xFB,0xFF,0xE7,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x78,0x00,0xF0,0x01,0xE0,0x03,0xC0,0x07,0x00,0x04,0x00,0x00, // 'R' + 0x40,0x00,0x70,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3F,0xFE,0x07,0xFF,0x81,0xFF,0xB0,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0xFF,0xD8,0xFF,0xF4,0x7F,0xFC, // 'S' + 0x40,0x00,0xE0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'T' + 0xE0,0x03,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x7F,0xFD,0x9F,0xFF,0x47,0xFF,0xC0, // 'U' + 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xB8,0x00,0xC0,0x00,0x0E,0x00,0x37,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'V' + 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'W' + 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x00,0x19,0x00,0x04, // 'X' + 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x81,0xFF,0xB0,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0xFF,0xD8,0xFF,0xF4,0x7F,0xFC, // 'Y' + 0x3F,0xFE,0x1F,0xFE,0x87,0xFE,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x07,0x00,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xFF,0xE0,0xFF,0xF8,0x3F,0xFE,0x00, // 'Z' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '[' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '\' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // ']' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '^' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '_' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '`' + 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC7,0xFF,0xDB,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0x80,0x0C,0x80,0x02, // 'a' + 0x40,0x00,0x70,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3F,0xFE,0x07,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'b' + 0x1F,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'c' + 0x00,0x01,0x00,0x01,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x87,0xFE,0xC7,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'd' + 0x3F,0xFE,0x7F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'e' + 0x3F,0xFE,0x7F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xE0,0x00,0x40,0x00, // 'f' + 0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1C,0x00,0x00,0x00,0x07,0x00,0x1B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xFF,0xEC,0xFF,0xFA,0x3F,0xFE,0x00, // 'g' + 0x40,0x00,0x70,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3F,0xFE,0x07,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x00,0x19,0x00,0x04, // 'h' + 0x6E,0xEE,0xEE,0xEE,0xE6,0x20, // 'i' + 0x00,0x01,0x00,0x01,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x00,0xC0,0x00,0x0E,0x00,0x37,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'j' + 0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1F,0xFF,0x03,0xFF,0xC7,0xFF,0xDB,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0x80,0x0C,0x80,0x02, // 'k' + 0x40,0x00,0xE0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 'l' + 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDC,0x00,0x60,0x00,0x07,0x00,0x1B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0x80,0x0C,0x80,0x02, // 'm' + 0x1F,0xF8,0x1F,0xFE,0x3F,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDC,0x00,0x64,0x00,0x10, // 'n' + 0x1F,0xF8,0x1F,0xFE,0x3F,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x67,0xFF,0xD1,0xFF,0xF0, // 'o' + 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC7,0xFF,0xC3,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0x80,0x00,0x80,0x00, // 'p' + 0x3F,0xFE,0x3F,0xFE,0xBF,0xFE,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDF,0xFF,0x63,0xFF,0xC0,0xFF,0xD8,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x0C,0x00,0x02, // 'q' + 0x1F,0xF8,0x7F,0xFB,0xFF,0xE7,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x78,0x00,0xF0,0x01,0xE0,0x03,0xC0,0x07,0x00,0x04,0x00,0x00, // 'r' + 0x40,0x00,0x70,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3F,0xFE,0x07,0xFF,0x81,0xFF,0xB0,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0xFF,0xD8,0xFF,0xF4,0x7F,0xFC, // 's' + 0x40,0x00,0xE0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x3F,0xFC,0xFF,0xF8,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xFF,0xF8,0x7F,0xFC,0x3F,0xFE, // 't' + 0xE0,0x03,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x7F,0xFD,0x9F,0xFF,0x47,0xFF,0xC0, // 'u' + 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xB8,0x00,0xC0,0x00,0x0E,0x00,0x37,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'v' + 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0xFF,0xD9,0xFF,0xF4,0x7F,0xFC, // 'w' + 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x8F,0xFF,0xB7,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x00,0x19,0x00,0x04, // 'x' + 0x40,0x01,0x70,0x01,0xBC,0x01,0xDE,0x00,0xEF,0x00,0x77,0x80,0x3B,0xC0,0x1D,0xE0,0x0E,0xF0,0x07,0x78,0x03,0xBF,0xFE,0xC7,0xFF,0x81,0xFF,0xB0,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0xFF,0xD8,0xFF,0xF4,0x7F,0xFC, // 'y' + 0x3F,0xFE,0x1F,0xFE,0x87,0xFE,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x07,0x00,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xFF,0xE0,0xFF,0xF8,0x3F,0xFE,0x00, // 'z' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '{' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE, // '|' + 0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE // '}' +}; +const GFXglyph DSEG7_Classic_Bold_25Glyphs[] PROGMEM = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 6, 0, 0 }, // ' ' + { 1, 1, 1, 21, 0, 0 }, // '!' + { 2, 8, 17, 10, 1, -17 }, // '"' + { 19, 8, 17, 10, 1, -17 }, // '#' + { 36, 8, 17, 10, 1, -17 }, // '$' + { 53, 8, 17, 10, 1, -17 }, // '%' + { 70, 8, 17, 10, 1, -17 }, // '&' + { 87, 8, 17, 10, 1, -17 }, // ''' + { 104, 8, 17, 10, 1, -17 }, // '(' + { 121, 8, 17, 10, 1, -17 }, // ')' + { 138, 8, 17, 10, 1, -17 }, // '*' + { 155, 8, 17, 10, 1, -17 }, // '+' + { 172, 8, 17, 10, 1, -17 }, // ',' + { 189, 13, 3, 21, 4, -14 }, // '-' + { 194, 5, 3, 1, -2, -3 }, // '.' + { 196, 8, 17, 10, 1, -17 }, // '/' + { 213, 17, 25, 21, 2, -25 }, // '0' + { 267, 4, 23, 21, 15, -24 }, // '1' + { 279, 17, 25, 21, 2, -25 }, // '2' + { 333, 15, 25, 21, 4, -25 }, // '3' + { 380, 17, 23, 21, 2, -24 }, // '4' + { 429, 17, 25, 21, 2, -25 }, // '5' + { 483, 17, 25, 21, 2, -25 }, // '6' + { 537, 17, 24, 21, 2, -25 }, // '7' + { 588, 17, 25, 21, 2, -25 }, // '8' + { 642, 17, 25, 21, 2, -25 }, // '9' + { 696, 4, 14, 6, 1, -19 }, // ':' + { 703, 8, 17, 10, 1, -17 }, // ';' + { 720, 8, 17, 10, 1, -17 }, // '<' + { 737, 8, 17, 10, 1, -17 }, // '=' + { 754, 8, 17, 10, 1, -17 }, // '>' + { 771, 8, 17, 10, 1, -17 }, // '?' + { 788, 8, 17, 10, 1, -17 }, // '@' + { 805, 17, 24, 21, 2, -25 }, // 'A' + { 856, 17, 24, 21, 2, -24 }, // 'B' + { 907, 16, 14, 21, 2, -14 }, // 'C' + { 935, 17, 24, 21, 2, -24 }, // 'D' + { 986, 16, 25, 21, 2, -25 }, // 'E' + { 1036, 16, 24, 21, 2, -25 }, // 'F' + { 1084, 17, 25, 21, 2, -25 }, // 'G' + { 1138, 17, 23, 21, 2, -24 }, // 'H' + { 1187, 4, 11, 21, 15, -12 }, // 'I' + { 1193, 17, 24, 21, 2, -24 }, // 'J' + { 1244, 17, 24, 21, 2, -25 }, // 'K' + { 1295, 16, 24, 21, 2, -24 }, // 'L' + { 1343, 17, 24, 21, 2, -25 }, // 'M' + { 1394, 17, 13, 21, 2, -14 }, // 'N' + { 1422, 17, 14, 21, 2, -14 }, // 'O' + { 1452, 17, 24, 21, 2, -25 }, // 'P' + { 1503, 17, 24, 21, 2, -25 }, // 'Q' + { 1554, 15, 13, 21, 2, -14 }, // 'R' + { 1579, 17, 24, 21, 2, -24 }, // 'S' + { 1630, 16, 24, 21, 2, -24 }, // 'T' + { 1678, 17, 12, 21, 2, -12 }, // 'U' + { 1704, 17, 24, 21, 2, -24 }, // 'V' + { 1755, 17, 24, 21, 2, -24 }, // 'W' + { 1806, 17, 23, 21, 2, -24 }, // 'X' + { 1855, 17, 24, 21, 2, -24 }, // 'Y' + { 1906, 17, 25, 21, 2, -25 }, // 'Z' + { 1960, 8, 17, 10, 1, -17 }, // '[' + { 1977, 8, 17, 10, 1, -17 }, // '\' + { 1994, 8, 17, 10, 1, -17 }, // ']' + { 2011, 8, 17, 10, 1, -17 }, // '^' + { 2028, 8, 17, 10, 1, -17 }, // '_' + { 2045, 8, 17, 10, 1, -17 }, // '`' + { 2062, 17, 24, 21, 2, -25 }, // 'a' + { 2113, 17, 24, 21, 2, -24 }, // 'b' + { 2164, 16, 14, 21, 2, -14 }, // 'c' + { 2192, 17, 24, 21, 2, -24 }, // 'd' + { 2243, 16, 25, 21, 2, -25 }, // 'e' + { 2293, 16, 24, 21, 2, -25 }, // 'f' + { 2341, 17, 25, 21, 2, -25 }, // 'g' + { 2395, 17, 23, 21, 2, -24 }, // 'h' + { 2444, 4, 11, 21, 15, -12 }, // 'i' + { 2450, 17, 24, 21, 2, -24 }, // 'j' + { 2501, 17, 24, 21, 2, -25 }, // 'k' + { 2552, 16, 24, 21, 2, -24 }, // 'l' + { 2600, 17, 24, 21, 2, -25 }, // 'm' + { 2651, 17, 13, 21, 2, -14 }, // 'n' + { 2679, 17, 14, 21, 2, -14 }, // 'o' + { 2709, 17, 24, 21, 2, -25 }, // 'p' + { 2760, 17, 24, 21, 2, -25 }, // 'q' + { 2811, 15, 13, 21, 2, -14 }, // 'r' + { 2836, 17, 24, 21, 2, -24 }, // 's' + { 2887, 16, 24, 21, 2, -24 }, // 't' + { 2935, 17, 12, 21, 2, -12 }, // 'u' + { 2961, 17, 24, 21, 2, -24 }, // 'v' + { 3012, 17, 24, 21, 2, -24 }, // 'w' + { 3063, 17, 23, 21, 2, -24 }, // 'x' + { 3112, 17, 24, 21, 2, -24 }, // 'y' + { 3163, 17, 25, 21, 2, -25 }, // 'z' + { 3217, 8, 17, 10, 1, -17 }, // '{' + { 3234, 8, 17, 10, 1, -17 }, // '|' + { 3251, 8, 17, 10, 1, -17 } // '}' +}; +const GFXfont DSEG7_Classic_Bold_25 PROGMEM = { (uint8_t *)DSEG7_Classic_Bold_25Bitmaps,(GFXglyph *)DSEG7_Classic_Bold_25Glyphs,0x20, 0x7E, 28}; \ No newline at end of file diff --git a/examples/WatchFaces/7_SEG/DSEG7_Classic_Regular_15.h b/examples/WatchFaces/7_SEG/DSEG7_Classic_Regular_15.h index 505ec5f..87fb984 100644 --- a/examples/WatchFaces/7_SEG/DSEG7_Classic_Regular_15.h +++ b/examples/WatchFaces/7_SEG/DSEG7_Classic_Regular_15.h @@ -1,199 +1,199 @@ -// Created by http://oleddisplay.squix.ch/ Consider a donation -// In case of problems make sure that you are using the font file with the correct version! -const uint8_t DSEG7_Classic_Regular_15Bitmaps[] PROGMEM = { - - // Bitmap Data: - 0x00, // ' ' - 0x00, // '!' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '"' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '#' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '$' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '%' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '&' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // ''' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '(' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // ')' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '*' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '+' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // ',' - 0xFF,0x00, // '-' - 0xD8, // '.' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '/' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x30,0x00,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // '0' - 0xDB,0x6D,0x86,0xDB,0x6C, // '1' - 0x7F,0x80,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x33,0xFC,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE0, // '2' - 0xFF,0x00,0x60,0x18,0x06,0x01,0x80,0x60,0x1B,0xFC,0x01,0x80,0x60,0x18,0x06,0x01,0x80,0x6F,0xF0, // '3' - 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C, // '4' - 0x7F,0x98,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x03,0xFC,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x9F,0xE0, // '5' - 0x7F,0x98,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x03,0xFC,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // '6' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x30,0x00,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80, // '7' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // '8' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x9F,0xE0, // '9' - 0xA0,0x0A, // ':' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // ';' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '<' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '=' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '>' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '?' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '@' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80, // 'A' - 0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'B' - 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x01,0xFE, // 'C' - 0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x9F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'D' - 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x01,0xFE,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x07,0xF8, // 'E' - 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x01,0xFE,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x00, // 'F' - 0x7F,0x98,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x00,0x00,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // 'G' - 0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C, // 'H' - 0xDB,0x6D,0x80, // 'I' - 0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x06,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'J' - 0x7F,0x98,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x03,0xFC,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80, // 'K' - 0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x00,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x1F,0xE0, // 'L' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x30,0x00,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80, // 'M' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x30, // 'N' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC, // 'O' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x00, // 'P' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80, // 'Q' - 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x00, // 'R' - 0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE0,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0xFF,0x00, // 'S' - 0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x07,0xFB,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x1F,0xE0, // 'T' - 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // 'U' - 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80,0x06,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'V' - 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'W' - 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C, // 'X' - 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0xFF,0x00, // 'Y' - 0x7F,0x80,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE0, // 'Z' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '[' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '\' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // ']' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '^' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '_' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '`' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80, // 'a' - 0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'b' - 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x01,0xFE, // 'c' - 0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x9F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'd' - 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x01,0xFE,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x07,0xF8, // 'e' - 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x01,0xFE,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x00, // 'f' - 0x7F,0x98,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x00,0x00,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // 'g' - 0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C, // 'h' - 0xDB,0x6D,0x80, // 'i' - 0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x06,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'j' - 0x7F,0x98,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x03,0xFC,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80, // 'k' - 0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x00,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x1F,0xE0, // 'l' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x30,0x00,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80, // 'm' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x30, // 'n' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC, // 'o' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x00, // 'p' - 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80, // 'q' - 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x00, // 'r' - 0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE0,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0xFF,0x00, // 's' - 0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x07,0xFB,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x1F,0xE0, // 't' - 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // 'u' - 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80,0x06,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'v' - 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'w' - 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C, // 'x' - 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0xFF,0x00, // 'y' - 0x7F,0x80,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE0, // 'z' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '{' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '|' - 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC // '}' -}; -const GFXglyph DSEG7_Classic_Regular_15Glyphs[] PROGMEM = { -// bitmapOffset, width, height, xAdvance, xOffset, yOffset - { 0, 1, 1, 4, 0, 0 }, // ' ' - { 1, 1, 1, 13, 0, 0 }, // '!' - { 2, 5, 11, 6, 1, -11 }, // '"' - { 9, 5, 11, 6, 1, -11 }, // '#' - { 16, 5, 11, 6, 1, -11 }, // '$' - { 23, 5, 11, 6, 1, -11 }, // '%' - { 30, 5, 11, 6, 1, -11 }, // '&' - { 37, 5, 11, 6, 1, -11 }, // ''' - { 44, 5, 11, 6, 1, -11 }, // '(' - { 51, 5, 11, 6, 1, -11 }, // ')' - { 58, 5, 11, 6, 1, -11 }, // '*' - { 65, 5, 11, 6, 1, -11 }, // '+' - { 72, 5, 11, 6, 1, -11 }, // ',' - { 79, 9, 1, 13, 2, -8 }, // '-' - { 81, 3, 2, 1, -1, -2 }, // '.' - { 82, 5, 11, 6, 1, -11 }, // '/' - { 89, 11, 15, 13, 1, -15 }, // '0' - { 110, 3, 13, 13, 9, -14 }, // '1' - { 115, 11, 15, 13, 1, -15 }, // '2' - { 136, 10, 15, 13, 2, -15 }, // '3' - { 155, 11, 13, 13, 1, -14 }, // '4' - { 173, 11, 15, 13, 1, -15 }, // '5' - { 194, 11, 15, 13, 1, -15 }, // '6' - { 215, 11, 14, 13, 1, -15 }, // '7' - { 235, 11, 15, 13, 1, -15 }, // '8' - { 256, 11, 15, 13, 1, -15 }, // '9' - { 277, 2, 8, 4, 1, -11 }, // ':' - { 279, 5, 11, 6, 1, -11 }, // ';' - { 286, 5, 11, 6, 1, -11 }, // '<' - { 293, 5, 11, 6, 1, -11 }, // '=' - { 300, 5, 11, 6, 1, -11 }, // '>' - { 307, 5, 11, 6, 1, -11 }, // '?' - { 314, 5, 11, 6, 1, -11 }, // '@' - { 321, 11, 14, 13, 1, -15 }, // 'A' - { 341, 11, 14, 13, 1, -14 }, // 'B' - { 361, 10, 8, 13, 1, -8 }, // 'C' - { 371, 11, 14, 13, 1, -14 }, // 'D' - { 391, 10, 15, 13, 1, -15 }, // 'E' - { 410, 10, 14, 13, 1, -15 }, // 'F' - { 428, 11, 15, 13, 1, -15 }, // 'G' - { 449, 11, 13, 13, 1, -14 }, // 'H' - { 467, 3, 6, 13, 9, -7 }, // 'I' - { 470, 11, 14, 13, 1, -14 }, // 'J' - { 490, 11, 14, 13, 1, -15 }, // 'K' - { 510, 10, 14, 13, 1, -14 }, // 'L' - { 528, 11, 14, 13, 1, -15 }, // 'M' - { 548, 11, 7, 13, 1, -8 }, // 'N' - { 558, 11, 8, 13, 1, -8 }, // 'O' - { 569, 11, 14, 13, 1, -15 }, // 'P' - { 589, 11, 14, 13, 1, -15 }, // 'Q' - { 609, 10, 7, 13, 1, -8 }, // 'R' - { 618, 11, 14, 13, 1, -14 }, // 'S' - { 638, 10, 14, 13, 1, -14 }, // 'T' - { 656, 11, 7, 13, 1, -7 }, // 'U' - { 666, 11, 14, 13, 1, -14 }, // 'V' - { 686, 11, 14, 13, 1, -14 }, // 'W' - { 706, 11, 13, 13, 1, -14 }, // 'X' - { 724, 11, 14, 13, 1, -14 }, // 'Y' - { 744, 11, 15, 13, 1, -15 }, // 'Z' - { 765, 5, 11, 6, 1, -11 }, // '[' - { 772, 5, 11, 6, 1, -11 }, // '\' - { 779, 5, 11, 6, 1, -11 }, // ']' - { 786, 5, 11, 6, 1, -11 }, // '^' - { 793, 5, 11, 6, 1, -11 }, // '_' - { 800, 5, 11, 6, 1, -11 }, // '`' - { 807, 11, 14, 13, 1, -15 }, // 'a' - { 827, 11, 14, 13, 1, -14 }, // 'b' - { 847, 10, 8, 13, 1, -8 }, // 'c' - { 857, 11, 14, 13, 1, -14 }, // 'd' - { 877, 10, 15, 13, 1, -15 }, // 'e' - { 896, 10, 14, 13, 1, -15 }, // 'f' - { 914, 11, 15, 13, 1, -15 }, // 'g' - { 935, 11, 13, 13, 1, -14 }, // 'h' - { 953, 3, 6, 13, 9, -7 }, // 'i' - { 956, 11, 14, 13, 1, -14 }, // 'j' - { 976, 11, 14, 13, 1, -15 }, // 'k' - { 996, 10, 14, 13, 1, -14 }, // 'l' - { 1014, 11, 14, 13, 1, -15 }, // 'm' - { 1034, 11, 7, 13, 1, -8 }, // 'n' - { 1044, 11, 8, 13, 1, -8 }, // 'o' - { 1055, 11, 14, 13, 1, -15 }, // 'p' - { 1075, 11, 14, 13, 1, -15 }, // 'q' - { 1095, 10, 7, 13, 1, -8 }, // 'r' - { 1104, 11, 14, 13, 1, -14 }, // 's' - { 1124, 10, 14, 13, 1, -14 }, // 't' - { 1142, 11, 7, 13, 1, -7 }, // 'u' - { 1152, 11, 14, 13, 1, -14 }, // 'v' - { 1172, 11, 14, 13, 1, -14 }, // 'w' - { 1192, 11, 13, 13, 1, -14 }, // 'x' - { 1210, 11, 14, 13, 1, -14 }, // 'y' - { 1230, 11, 15, 13, 1, -15 }, // 'z' - { 1251, 5, 11, 6, 1, -11 }, // '{' - { 1258, 5, 11, 6, 1, -11 }, // '|' - { 1265, 5, 11, 6, 1, -11 } // '}' -}; -const GFXfont DSEG7_Classic_Regular_15 PROGMEM = { +// Created by http://oleddisplay.squix.ch/ Consider a donation +// In case of problems make sure that you are using the font file with the correct version! +const uint8_t DSEG7_Classic_Regular_15Bitmaps[] PROGMEM = { + + // Bitmap Data: + 0x00, // ' ' + 0x00, // '!' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '"' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '#' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '$' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '%' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '&' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // ''' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '(' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // ')' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '*' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '+' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // ',' + 0xFF,0x00, // '-' + 0xD8, // '.' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '/' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x30,0x00,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // '0' + 0xDB,0x6D,0x86,0xDB,0x6C, // '1' + 0x7F,0x80,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x33,0xFC,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE0, // '2' + 0xFF,0x00,0x60,0x18,0x06,0x01,0x80,0x60,0x1B,0xFC,0x01,0x80,0x60,0x18,0x06,0x01,0x80,0x6F,0xF0, // '3' + 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C, // '4' + 0x7F,0x98,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x03,0xFC,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x9F,0xE0, // '5' + 0x7F,0x98,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x03,0xFC,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // '6' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x30,0x00,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80, // '7' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // '8' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x9F,0xE0, // '9' + 0xA0,0x0A, // ':' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // ';' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '<' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '=' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '>' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '?' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '@' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80, // 'A' + 0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'B' + 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x01,0xFE, // 'C' + 0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x9F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'D' + 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x01,0xFE,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x07,0xF8, // 'E' + 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x01,0xFE,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x00, // 'F' + 0x7F,0x98,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x00,0x00,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // 'G' + 0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C, // 'H' + 0xDB,0x6D,0x80, // 'I' + 0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x06,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'J' + 0x7F,0x98,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x03,0xFC,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80, // 'K' + 0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x00,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x1F,0xE0, // 'L' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x30,0x00,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80, // 'M' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x30, // 'N' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC, // 'O' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x00, // 'P' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80, // 'Q' + 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x00, // 'R' + 0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE0,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0xFF,0x00, // 'S' + 0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x07,0xFB,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x1F,0xE0, // 'T' + 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // 'U' + 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80,0x06,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'V' + 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'W' + 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C, // 'X' + 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0xFF,0x00, // 'Y' + 0x7F,0x80,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE0, // 'Z' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '[' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '\' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // ']' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '^' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '_' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '`' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80, // 'a' + 0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'b' + 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x01,0xFE, // 'c' + 0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x9F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'd' + 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x01,0xFE,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x07,0xF8, // 'e' + 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x01,0xFE,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x00, // 'f' + 0x7F,0x98,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x00,0x00,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // 'g' + 0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C, // 'h' + 0xDB,0x6D,0x80, // 'i' + 0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x06,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'j' + 0x7F,0x98,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x03,0xFC,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80, // 'k' + 0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x00,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x1F,0xE0, // 'l' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x30,0x00,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80, // 'm' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x30, // 'n' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC, // 'o' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x00, // 'p' + 0x7F,0x98,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x33,0xFC,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80, // 'q' + 0x7F,0xB0,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x00, // 'r' + 0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE0,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0xFF,0x00, // 's' + 0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x07,0xFB,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x1F,0xE0, // 't' + 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0, // 'u' + 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80,0x06,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'v' + 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C,0xFF,0x00, // 'w' + 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE6,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0C, // 'x' + 0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x9F,0xE0,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0xFF,0x00, // 'y' + 0x7F,0x80,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x1F,0xE0, // 'z' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '{' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC, // '|' + 0xF4,0xA5,0x29,0x4A,0x52,0x94,0xBC // '}' +}; +const GFXglyph DSEG7_Classic_Regular_15Glyphs[] PROGMEM = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 4, 0, 0 }, // ' ' + { 1, 1, 1, 13, 0, 0 }, // '!' + { 2, 5, 11, 6, 1, -11 }, // '"' + { 9, 5, 11, 6, 1, -11 }, // '#' + { 16, 5, 11, 6, 1, -11 }, // '$' + { 23, 5, 11, 6, 1, -11 }, // '%' + { 30, 5, 11, 6, 1, -11 }, // '&' + { 37, 5, 11, 6, 1, -11 }, // ''' + { 44, 5, 11, 6, 1, -11 }, // '(' + { 51, 5, 11, 6, 1, -11 }, // ')' + { 58, 5, 11, 6, 1, -11 }, // '*' + { 65, 5, 11, 6, 1, -11 }, // '+' + { 72, 5, 11, 6, 1, -11 }, // ',' + { 79, 9, 1, 13, 2, -8 }, // '-' + { 81, 3, 2, 1, -1, -2 }, // '.' + { 82, 5, 11, 6, 1, -11 }, // '/' + { 89, 11, 15, 13, 1, -15 }, // '0' + { 110, 3, 13, 13, 9, -14 }, // '1' + { 115, 11, 15, 13, 1, -15 }, // '2' + { 136, 10, 15, 13, 2, -15 }, // '3' + { 155, 11, 13, 13, 1, -14 }, // '4' + { 173, 11, 15, 13, 1, -15 }, // '5' + { 194, 11, 15, 13, 1, -15 }, // '6' + { 215, 11, 14, 13, 1, -15 }, // '7' + { 235, 11, 15, 13, 1, -15 }, // '8' + { 256, 11, 15, 13, 1, -15 }, // '9' + { 277, 2, 8, 4, 1, -11 }, // ':' + { 279, 5, 11, 6, 1, -11 }, // ';' + { 286, 5, 11, 6, 1, -11 }, // '<' + { 293, 5, 11, 6, 1, -11 }, // '=' + { 300, 5, 11, 6, 1, -11 }, // '>' + { 307, 5, 11, 6, 1, -11 }, // '?' + { 314, 5, 11, 6, 1, -11 }, // '@' + { 321, 11, 14, 13, 1, -15 }, // 'A' + { 341, 11, 14, 13, 1, -14 }, // 'B' + { 361, 10, 8, 13, 1, -8 }, // 'C' + { 371, 11, 14, 13, 1, -14 }, // 'D' + { 391, 10, 15, 13, 1, -15 }, // 'E' + { 410, 10, 14, 13, 1, -15 }, // 'F' + { 428, 11, 15, 13, 1, -15 }, // 'G' + { 449, 11, 13, 13, 1, -14 }, // 'H' + { 467, 3, 6, 13, 9, -7 }, // 'I' + { 470, 11, 14, 13, 1, -14 }, // 'J' + { 490, 11, 14, 13, 1, -15 }, // 'K' + { 510, 10, 14, 13, 1, -14 }, // 'L' + { 528, 11, 14, 13, 1, -15 }, // 'M' + { 548, 11, 7, 13, 1, -8 }, // 'N' + { 558, 11, 8, 13, 1, -8 }, // 'O' + { 569, 11, 14, 13, 1, -15 }, // 'P' + { 589, 11, 14, 13, 1, -15 }, // 'Q' + { 609, 10, 7, 13, 1, -8 }, // 'R' + { 618, 11, 14, 13, 1, -14 }, // 'S' + { 638, 10, 14, 13, 1, -14 }, // 'T' + { 656, 11, 7, 13, 1, -7 }, // 'U' + { 666, 11, 14, 13, 1, -14 }, // 'V' + { 686, 11, 14, 13, 1, -14 }, // 'W' + { 706, 11, 13, 13, 1, -14 }, // 'X' + { 724, 11, 14, 13, 1, -14 }, // 'Y' + { 744, 11, 15, 13, 1, -15 }, // 'Z' + { 765, 5, 11, 6, 1, -11 }, // '[' + { 772, 5, 11, 6, 1, -11 }, // '\' + { 779, 5, 11, 6, 1, -11 }, // ']' + { 786, 5, 11, 6, 1, -11 }, // '^' + { 793, 5, 11, 6, 1, -11 }, // '_' + { 800, 5, 11, 6, 1, -11 }, // '`' + { 807, 11, 14, 13, 1, -15 }, // 'a' + { 827, 11, 14, 13, 1, -14 }, // 'b' + { 847, 10, 8, 13, 1, -8 }, // 'c' + { 857, 11, 14, 13, 1, -14 }, // 'd' + { 877, 10, 15, 13, 1, -15 }, // 'e' + { 896, 10, 14, 13, 1, -15 }, // 'f' + { 914, 11, 15, 13, 1, -15 }, // 'g' + { 935, 11, 13, 13, 1, -14 }, // 'h' + { 953, 3, 6, 13, 9, -7 }, // 'i' + { 956, 11, 14, 13, 1, -14 }, // 'j' + { 976, 11, 14, 13, 1, -15 }, // 'k' + { 996, 10, 14, 13, 1, -14 }, // 'l' + { 1014, 11, 14, 13, 1, -15 }, // 'm' + { 1034, 11, 7, 13, 1, -8 }, // 'n' + { 1044, 11, 8, 13, 1, -8 }, // 'o' + { 1055, 11, 14, 13, 1, -15 }, // 'p' + { 1075, 11, 14, 13, 1, -15 }, // 'q' + { 1095, 10, 7, 13, 1, -8 }, // 'r' + { 1104, 11, 14, 13, 1, -14 }, // 's' + { 1124, 10, 14, 13, 1, -14 }, // 't' + { 1142, 11, 7, 13, 1, -7 }, // 'u' + { 1152, 11, 14, 13, 1, -14 }, // 'v' + { 1172, 11, 14, 13, 1, -14 }, // 'w' + { 1192, 11, 13, 13, 1, -14 }, // 'x' + { 1210, 11, 14, 13, 1, -14 }, // 'y' + { 1230, 11, 15, 13, 1, -15 }, // 'z' + { 1251, 5, 11, 6, 1, -11 }, // '{' + { 1258, 5, 11, 6, 1, -11 }, // '|' + { 1265, 5, 11, 6, 1, -11 } // '}' +}; +const GFXfont DSEG7_Classic_Regular_15 PROGMEM = { (uint8_t *)DSEG7_Classic_Regular_15Bitmaps,(GFXglyph *)DSEG7_Classic_Regular_15Glyphs,0x20, 0x7E, 17}; \ No newline at end of file diff --git a/examples/WatchFaces/7_SEG/DSEG7_Classic_Regular_39.h b/examples/WatchFaces/7_SEG/DSEG7_Classic_Regular_39.h index 9733569..0fa1558 100644 --- a/examples/WatchFaces/7_SEG/DSEG7_Classic_Regular_39.h +++ b/examples/WatchFaces/7_SEG/DSEG7_Classic_Regular_39.h @@ -1,199 +1,199 @@ -// Created by http://oleddisplay.squix.ch/ Consider a donation -// In case of problems make sure that you are using the font file with the correct version! -const uint8_t DSEG7_Classic_Regular_39Bitmaps[] PROGMEM = { - - // Bitmap Data: - 0x00, // ' ' - 0x00, // '!' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '"' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '#' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '$' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '%' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '&' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // ''' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '(' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // ')' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '*' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '+' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // ',' - 0x7F,0xFF,0xE7,0xFF,0xFF,0x9F,0xFF,0xF8, // '-' - 0x67,0xBD,0xE6,0x00, // '.' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '/' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0,0x00,0x00,0x08,0x00,0x00,0x36,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDD,0xFF,0xFE,0xED,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // '0' - 0x33,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xCE,0x30,0x0C,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF3,0x8C, // '1' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC1,0xFF,0xFE,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x03,0x87,0xFF,0xFE,0xC7,0xFF,0xFF,0x89,0xFF,0xFF,0x86,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1D,0xFF,0xFE,0x0D,0xFF,0xFF,0x81,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // '2' - 0xFF,0xFF,0xF1,0xFF,0xFF,0xE1,0xFF,0xFF,0xB1,0xFF,0xFE,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,0x39,0xFF,0xFF,0xB7,0xFF,0xFF,0x87,0xFF,0xFE,0xC0,0x00,0x03,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,0xF1,0xFF,0xFE,0xE7,0xFF,0xFE,0xDF,0xFF,0xFE,0x3F,0xFF,0xFC,0x00, // '3' - 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC0,0x00,0x00,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x03,0x80,0x00,0x00,0xC0, // '4' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0x1D,0xFF,0xFE,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x37,0xFF,0xFE,0x07,0xFF,0xFF,0x81,0xFF,0xFF,0xB0,0x00,0x00,0x38,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC1,0xFF,0xFE,0xE1,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // '5' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0x1D,0xFF,0xFE,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x37,0xFF,0xFE,0x07,0xFF,0xFF,0x89,0xFF,0xFF,0xB6,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDD,0xFF,0xFE,0xED,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // '6' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x38,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x00,0xE0,0x00,0x00,0x30, // '7' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x89,0xFF,0xFF,0xB6,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDD,0xFF,0xFE,0xED,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // '8' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x81,0xFF,0xFF,0xB0,0x00,0x00,0x38,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC1,0xFF,0xFE,0xE1,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // '9' - 0x79,0xE7,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xE7,0x9E, // ':' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // ';' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '<' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '=' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '>' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '?' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '@' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x89,0xFF,0xFF,0xB6,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x00,0xEC,0x00,0x00,0x30, // 'A' - 0xC0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xDF,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'B' - 0x1F,0xFF,0xF8,0x7F,0xFF,0xFA,0x7F,0xFF,0xE6,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xE3,0x7F,0xFF,0xE1,0xFF,0xFF,0xE3,0xFF,0xFF,0xC0, // 'C' - 0x00,0x00,0x03,0x00,0x00,0x03,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x0E,0x1F,0xFF,0xFB,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'D' - 0x3F,0xFF,0xFC,0x7F,0xFF,0xFB,0x7F,0xFF,0xE7,0x7F,0xFF,0x8E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x7F,0xFF,0xE1,0xFF,0xFF,0xE9,0xFF,0xFF,0x98,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x7F,0xFF,0x8D,0xFF,0xFF,0x87,0xFF,0xFF,0x8F,0xFF,0xFF,0x00, // 'E' - 0x3F,0xFF,0xFC,0x7F,0xFF,0xFB,0x7F,0xFF,0xE7,0x7F,0xFF,0x8E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x7F,0xFF,0xE1,0xFF,0xFF,0xE9,0xFF,0xFF,0x98,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0C,0x00,0x00,0x00, // 'F' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0x1D,0xFF,0xFE,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x36,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDD,0xFF,0xFE,0xED,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // 'G' - 0xC0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xDF,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0, // 'H' - 0x33,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xCE,0x30, // 'I' - 0x00,0x00,0x03,0x00,0x00,0x03,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x0E,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'J' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0x1D,0xFF,0xFE,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x37,0xFF,0xFE,0x07,0xFF,0xFF,0x89,0xFF,0xFF,0xB6,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x00,0xEC,0x00,0x00,0x30, // 'K' - 0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x06,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xE3,0x7F,0xFF,0xE1,0xFF,0xFF,0xE3,0xFF,0xFF,0xC0, // 'L' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0,0x00,0x00,0x08,0x00,0x00,0x36,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x00,0xEC,0x00,0x00,0x30, // 'M' - 0x1F,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0, // 'N' - 0x1F,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'O' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x89,0xFF,0xFF,0x86,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x0C,0x00,0x00,0x00, // 'P' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x81,0xFF,0xFF,0xB0,0x00,0x00,0x38,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x00,0xE0,0x00,0x00,0x30, // 'Q' - 0x1F,0xFF,0xF8,0x7F,0xFF,0xFA,0x7F,0xFF,0xE6,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x00,0x00,0x00, // 'R' - 0xC0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xDF,0xFF,0xF8,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC0,0x00,0x00,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x07,0xFF,0xFB,0x87,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'S' - 0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xDF,0xFF,0xF8,0x7F,0xFF,0xFA,0x7F,0xFF,0xE6,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xE3,0x7F,0xFF,0xE1,0xFF,0xFF,0xE3,0xFF,0xFF,0xC0, // 'T' - 0x80,0x00,0x03,0x60,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xDF,0xFF,0xEE,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x0F,0xFF,0xFF,0x00, // 'U' - 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xC0,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'V' - 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'W' - 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0, // 'X' - 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC0,0x00,0x00,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x07,0xFF,0xFB,0x87,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'Y' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC1,0xFF,0xFE,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x03,0x80,0x00,0x00,0xC0,0x00,0x00,0x08,0x00,0x00,0x06,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1D,0xFF,0xFE,0x0D,0xFF,0xFF,0x81,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // 'Z' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '[' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '\' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // ']' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '^' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '_' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '`' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x89,0xFF,0xFF,0xB6,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x00,0xEC,0x00,0x00,0x30, // 'a' - 0xC0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xDF,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'b' - 0x1F,0xFF,0xF8,0x7F,0xFF,0xFA,0x7F,0xFF,0xE6,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xE3,0x7F,0xFF,0xE1,0xFF,0xFF,0xE3,0xFF,0xFF,0xC0, // 'c' - 0x00,0x00,0x03,0x00,0x00,0x03,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x0E,0x1F,0xFF,0xFB,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'd' - 0x3F,0xFF,0xFC,0x7F,0xFF,0xFB,0x7F,0xFF,0xE7,0x7F,0xFF,0x8E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x7F,0xFF,0xE1,0xFF,0xFF,0xE9,0xFF,0xFF,0x98,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x7F,0xFF,0x8D,0xFF,0xFF,0x87,0xFF,0xFF,0x8F,0xFF,0xFF,0x00, // 'e' - 0x3F,0xFF,0xFC,0x7F,0xFF,0xFB,0x7F,0xFF,0xE7,0x7F,0xFF,0x8E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x7F,0xFF,0xE1,0xFF,0xFF,0xE9,0xFF,0xFF,0x98,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0C,0x00,0x00,0x00, // 'f' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0x1D,0xFF,0xFE,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x36,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDD,0xFF,0xFE,0xED,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // 'g' - 0xC0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xDF,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0, // 'h' - 0x33,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xCE,0x30, // 'i' - 0x00,0x00,0x03,0x00,0x00,0x03,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x0E,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'j' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0x1D,0xFF,0xFE,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x37,0xFF,0xFE,0x07,0xFF,0xFF,0x89,0xFF,0xFF,0xB6,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x00,0xEC,0x00,0x00,0x30, // 'k' - 0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x06,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xE3,0x7F,0xFF,0xE1,0xFF,0xFF,0xE3,0xFF,0xFF,0xC0, // 'l' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0,0x00,0x00,0x08,0x00,0x00,0x36,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x00,0xEC,0x00,0x00,0x30, // 'm' - 0x1F,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0, // 'n' - 0x1F,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'o' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x89,0xFF,0xFF,0x86,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x0C,0x00,0x00,0x00, // 'p' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x81,0xFF,0xFF,0xB0,0x00,0x00,0x38,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x00,0xE0,0x00,0x00,0x30, // 'q' - 0x1F,0xFF,0xF8,0x7F,0xFF,0xFA,0x7F,0xFF,0xE6,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x00,0x00,0x00, // 'r' - 0xC0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xDF,0xFF,0xF8,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC0,0x00,0x00,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x07,0xFF,0xFB,0x87,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 's' - 0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xDF,0xFF,0xF8,0x7F,0xFF,0xFA,0x7F,0xFF,0xE6,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xE3,0x7F,0xFF,0xE1,0xFF,0xFF,0xE3,0xFF,0xFF,0xC0, // 't' - 0x80,0x00,0x03,0x60,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xDF,0xFF,0xEE,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x0F,0xFF,0xFF,0x00, // 'u' - 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xC0,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'v' - 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'w' - 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0, // 'x' - 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC0,0x00,0x00,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x07,0xFF,0xFB,0x87,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'y' - 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC1,0xFF,0xFE,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x03,0x80,0x00,0x00,0xC0,0x00,0x00,0x08,0x00,0x00,0x06,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1D,0xFF,0xFE,0x0D,0xFF,0xFF,0x81,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // 'z' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '{' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '|' - 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8 // '}' -}; -const GFXglyph DSEG7_Classic_Regular_39Glyphs[] PROGMEM = { -// bitmapOffset, width, height, xAdvance, xOffset, yOffset - { 0, 1, 1, 9, 0, 0 }, // ' ' - { 1, 1, 1, 33, 0, 0 }, // '!' - { 2, 11, 26, 15, 1, -26 }, // '"' - { 38, 11, 26, 15, 1, -26 }, // '#' - { 74, 11, 26, 15, 1, -26 }, // '$' - { 110, 11, 26, 15, 1, -26 }, // '%' - { 146, 11, 26, 15, 1, -26 }, // '&' - { 182, 11, 26, 15, 1, -26 }, // ''' - { 218, 11, 26, 15, 1, -26 }, // '(' - { 254, 11, 26, 15, 1, -26 }, // ')' - { 290, 11, 26, 15, 1, -26 }, // '*' - { 326, 11, 26, 15, 1, -26 }, // '+' - { 362, 11, 26, 15, 1, -26 }, // ',' - { 398, 21, 3, 33, 6, -21 }, // '-' - { 406, 5, 5, 1, -2, -5 }, // '.' - { 410, 11, 26, 15, 1, -26 }, // '/' - { 446, 25, 39, 33, 4, -39 }, // '0' - { 568, 5, 35, 33, 24, -37 }, // '1' - { 590, 25, 39, 33, 4, -39 }, // '2' - { 712, 23, 39, 33, 6, -39 }, // '3' - { 825, 25, 35, 33, 4, -37 }, // '4' - { 935, 25, 39, 33, 4, -39 }, // '5' - { 1057, 25, 39, 33, 4, -39 }, // '6' - { 1179, 25, 37, 33, 4, -39 }, // '7' - { 1295, 25, 39, 33, 4, -39 }, // '8' - { 1417, 25, 39, 33, 4, -39 }, // '9' - { 1539, 6, 20, 9, 1, -29 }, // ':' - { 1554, 11, 26, 15, 1, -26 }, // ';' - { 1590, 11, 26, 15, 1, -26 }, // '<' - { 1626, 11, 26, 15, 1, -26 }, // '=' - { 1662, 11, 26, 15, 1, -26 }, // '>' - { 1698, 11, 26, 15, 1, -26 }, // '?' - { 1734, 11, 26, 15, 1, -26 }, // '@' - { 1770, 25, 37, 33, 4, -39 }, // 'A' - { 1886, 25, 37, 33, 4, -37 }, // 'B' - { 2002, 23, 21, 33, 4, -21 }, // 'C' - { 2063, 25, 37, 33, 4, -37 }, // 'D' - { 2179, 23, 39, 33, 4, -39 }, // 'E' - { 2292, 23, 37, 33, 4, -39 }, // 'F' - { 2399, 25, 39, 33, 4, -39 }, // 'G' - { 2521, 25, 35, 33, 4, -37 }, // 'H' - { 2631, 5, 17, 33, 24, -19 }, // 'I' - { 2642, 25, 37, 33, 4, -37 }, // 'J' - { 2758, 25, 37, 33, 4, -39 }, // 'K' - { 2874, 23, 37, 33, 4, -37 }, // 'L' - { 2981, 25, 37, 33, 4, -39 }, // 'M' - { 3097, 25, 19, 33, 4, -21 }, // 'N' - { 3157, 25, 21, 33, 4, -21 }, // 'O' - { 3223, 25, 37, 33, 4, -39 }, // 'P' - { 3339, 25, 37, 33, 4, -39 }, // 'Q' - { 3455, 23, 19, 33, 4, -21 }, // 'R' - { 3510, 25, 37, 33, 4, -37 }, // 'S' - { 3626, 23, 37, 33, 4, -37 }, // 'T' - { 3733, 25, 19, 33, 4, -19 }, // 'U' - { 3793, 25, 37, 33, 4, -37 }, // 'V' - { 3909, 25, 37, 33, 4, -37 }, // 'W' - { 4025, 25, 35, 33, 4, -37 }, // 'X' - { 4135, 25, 37, 33, 4, -37 }, // 'Y' - { 4251, 25, 39, 33, 4, -39 }, // 'Z' - { 4373, 11, 26, 15, 1, -26 }, // '[' - { 4409, 11, 26, 15, 1, -26 }, // '\' - { 4445, 11, 26, 15, 1, -26 }, // ']' - { 4481, 11, 26, 15, 1, -26 }, // '^' - { 4517, 11, 26, 15, 1, -26 }, // '_' - { 4553, 11, 26, 15, 1, -26 }, // '`' - { 4589, 25, 37, 33, 4, -39 }, // 'a' - { 4705, 25, 37, 33, 4, -37 }, // 'b' - { 4821, 23, 21, 33, 4, -21 }, // 'c' - { 4882, 25, 37, 33, 4, -37 }, // 'd' - { 4998, 23, 39, 33, 4, -39 }, // 'e' - { 5111, 23, 37, 33, 4, -39 }, // 'f' - { 5218, 25, 39, 33, 4, -39 }, // 'g' - { 5340, 25, 35, 33, 4, -37 }, // 'h' - { 5450, 5, 17, 33, 24, -19 }, // 'i' - { 5461, 25, 37, 33, 4, -37 }, // 'j' - { 5577, 25, 37, 33, 4, -39 }, // 'k' - { 5693, 23, 37, 33, 4, -37 }, // 'l' - { 5800, 25, 37, 33, 4, -39 }, // 'm' - { 5916, 25, 19, 33, 4, -21 }, // 'n' - { 5976, 25, 21, 33, 4, -21 }, // 'o' - { 6042, 25, 37, 33, 4, -39 }, // 'p' - { 6158, 25, 37, 33, 4, -39 }, // 'q' - { 6274, 23, 19, 33, 4, -21 }, // 'r' - { 6329, 25, 37, 33, 4, -37 }, // 's' - { 6445, 23, 37, 33, 4, -37 }, // 't' - { 6552, 25, 19, 33, 4, -19 }, // 'u' - { 6612, 25, 37, 33, 4, -37 }, // 'v' - { 6728, 25, 37, 33, 4, -37 }, // 'w' - { 6844, 25, 35, 33, 4, -37 }, // 'x' - { 6954, 25, 37, 33, 4, -37 }, // 'y' - { 7070, 25, 39, 33, 4, -39 }, // 'z' - { 7192, 11, 26, 15, 1, -26 }, // '{' - { 7228, 11, 26, 15, 1, -26 }, // '|' - { 7264, 11, 26, 15, 1, -26 } // '}' -}; -const GFXfont DSEG7_Classic_Regular_39 PROGMEM = { +// Created by http://oleddisplay.squix.ch/ Consider a donation +// In case of problems make sure that you are using the font file with the correct version! +const uint8_t DSEG7_Classic_Regular_39Bitmaps[] PROGMEM = { + + // Bitmap Data: + 0x00, // ' ' + 0x00, // '!' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '"' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '#' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '$' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '%' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '&' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // ''' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '(' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // ')' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '*' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '+' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // ',' + 0x7F,0xFF,0xE7,0xFF,0xFF,0x9F,0xFF,0xF8, // '-' + 0x67,0xBD,0xE6,0x00, // '.' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '/' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0,0x00,0x00,0x08,0x00,0x00,0x36,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDD,0xFF,0xFE,0xED,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // '0' + 0x33,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xCE,0x30,0x0C,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF3,0x8C, // '1' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC1,0xFF,0xFE,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x03,0x87,0xFF,0xFE,0xC7,0xFF,0xFF,0x89,0xFF,0xFF,0x86,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1D,0xFF,0xFE,0x0D,0xFF,0xFF,0x81,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // '2' + 0xFF,0xFF,0xF1,0xFF,0xFF,0xE1,0xFF,0xFF,0xB1,0xFF,0xFE,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,0x39,0xFF,0xFF,0xB7,0xFF,0xFF,0x87,0xFF,0xFE,0xC0,0x00,0x03,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,0xF1,0xFF,0xFE,0xE7,0xFF,0xFE,0xDF,0xFF,0xFE,0x3F,0xFF,0xFC,0x00, // '3' + 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC0,0x00,0x00,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x03,0x80,0x00,0x00,0xC0, // '4' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0x1D,0xFF,0xFE,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x37,0xFF,0xFE,0x07,0xFF,0xFF,0x81,0xFF,0xFF,0xB0,0x00,0x00,0x38,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC1,0xFF,0xFE,0xE1,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // '5' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0x1D,0xFF,0xFE,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x37,0xFF,0xFE,0x07,0xFF,0xFF,0x89,0xFF,0xFF,0xB6,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDD,0xFF,0xFE,0xED,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // '6' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x38,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x00,0xE0,0x00,0x00,0x30, // '7' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x89,0xFF,0xFF,0xB6,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDD,0xFF,0xFE,0xED,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // '8' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x81,0xFF,0xFF,0xB0,0x00,0x00,0x38,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC1,0xFF,0xFE,0xE1,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // '9' + 0x79,0xE7,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xE7,0x9E, // ':' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // ';' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '<' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '=' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '>' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '?' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '@' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x89,0xFF,0xFF,0xB6,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x00,0xEC,0x00,0x00,0x30, // 'A' + 0xC0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xDF,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'B' + 0x1F,0xFF,0xF8,0x7F,0xFF,0xFA,0x7F,0xFF,0xE6,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xE3,0x7F,0xFF,0xE1,0xFF,0xFF,0xE3,0xFF,0xFF,0xC0, // 'C' + 0x00,0x00,0x03,0x00,0x00,0x03,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x0E,0x1F,0xFF,0xFB,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'D' + 0x3F,0xFF,0xFC,0x7F,0xFF,0xFB,0x7F,0xFF,0xE7,0x7F,0xFF,0x8E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x7F,0xFF,0xE1,0xFF,0xFF,0xE9,0xFF,0xFF,0x98,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x7F,0xFF,0x8D,0xFF,0xFF,0x87,0xFF,0xFF,0x8F,0xFF,0xFF,0x00, // 'E' + 0x3F,0xFF,0xFC,0x7F,0xFF,0xFB,0x7F,0xFF,0xE7,0x7F,0xFF,0x8E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x7F,0xFF,0xE1,0xFF,0xFF,0xE9,0xFF,0xFF,0x98,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0C,0x00,0x00,0x00, // 'F' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0x1D,0xFF,0xFE,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x36,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDD,0xFF,0xFE,0xED,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // 'G' + 0xC0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xDF,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0, // 'H' + 0x33,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xCE,0x30, // 'I' + 0x00,0x00,0x03,0x00,0x00,0x03,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x0E,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'J' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0x1D,0xFF,0xFE,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x37,0xFF,0xFE,0x07,0xFF,0xFF,0x89,0xFF,0xFF,0xB6,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x00,0xEC,0x00,0x00,0x30, // 'K' + 0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x06,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xE3,0x7F,0xFF,0xE1,0xFF,0xFF,0xE3,0xFF,0xFF,0xC0, // 'L' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0,0x00,0x00,0x08,0x00,0x00,0x36,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x00,0xEC,0x00,0x00,0x30, // 'M' + 0x1F,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0, // 'N' + 0x1F,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'O' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x89,0xFF,0xFF,0x86,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x0C,0x00,0x00,0x00, // 'P' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x81,0xFF,0xFF,0xB0,0x00,0x00,0x38,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x00,0xE0,0x00,0x00,0x30, // 'Q' + 0x1F,0xFF,0xF8,0x7F,0xFF,0xFA,0x7F,0xFF,0xE6,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x00,0x00,0x00, // 'R' + 0xC0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xDF,0xFF,0xF8,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC0,0x00,0x00,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x07,0xFF,0xFB,0x87,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'S' + 0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xDF,0xFF,0xF8,0x7F,0xFF,0xFA,0x7F,0xFF,0xE6,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xE3,0x7F,0xFF,0xE1,0xFF,0xFF,0xE3,0xFF,0xFF,0xC0, // 'T' + 0x80,0x00,0x03,0x60,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xDF,0xFF,0xEE,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x0F,0xFF,0xFF,0x00, // 'U' + 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xC0,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'V' + 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'W' + 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0, // 'X' + 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC0,0x00,0x00,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x07,0xFF,0xFB,0x87,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'Y' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC1,0xFF,0xFE,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x03,0x80,0x00,0x00,0xC0,0x00,0x00,0x08,0x00,0x00,0x06,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1D,0xFF,0xFE,0x0D,0xFF,0xFF,0x81,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // 'Z' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '[' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '\' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // ']' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '^' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '_' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '`' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x89,0xFF,0xFF,0xB6,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x00,0xEC,0x00,0x00,0x30, // 'a' + 0xC0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xDF,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'b' + 0x1F,0xFF,0xF8,0x7F,0xFF,0xFA,0x7F,0xFF,0xE6,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xE3,0x7F,0xFF,0xE1,0xFF,0xFF,0xE3,0xFF,0xFF,0xC0, // 'c' + 0x00,0x00,0x03,0x00,0x00,0x03,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x0E,0x1F,0xFF,0xFB,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'd' + 0x3F,0xFF,0xFC,0x7F,0xFF,0xFB,0x7F,0xFF,0xE7,0x7F,0xFF,0x8E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x7F,0xFF,0xE1,0xFF,0xFF,0xE9,0xFF,0xFF,0x98,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x7F,0xFF,0x8D,0xFF,0xFF,0x87,0xFF,0xFF,0x8F,0xFF,0xFF,0x00, // 'e' + 0x3F,0xFF,0xFC,0x7F,0xFF,0xFB,0x7F,0xFF,0xE7,0x7F,0xFF,0x8E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x7F,0xFF,0xE1,0xFF,0xFF,0xE9,0xFF,0xFF,0x98,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0C,0x00,0x00,0x00, // 'f' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0x1D,0xFF,0xFE,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x36,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDD,0xFF,0xFE,0xED,0xFF,0xFF,0xB1,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // 'g' + 0xC0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xDF,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0, // 'h' + 0x33,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xCE,0x30, // 'i' + 0x00,0x00,0x03,0x00,0x00,0x03,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x0E,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'j' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0x1D,0xFF,0xFE,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x37,0xFF,0xFE,0x07,0xFF,0xFF,0x89,0xFF,0xFF,0xB6,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x00,0xEC,0x00,0x00,0x30, // 'k' + 0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x06,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xE3,0x7F,0xFF,0xE1,0xFF,0xFF,0xE3,0xFF,0xFF,0xC0, // 'l' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0,0x00,0x00,0x08,0x00,0x00,0x36,0x00,0x00,0x3B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x00,0xEC,0x00,0x00,0x30, // 'm' + 0x1F,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0, // 'n' + 0x1F,0xFF,0xF8,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'o' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x89,0xFF,0xFF,0x86,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x0C,0x00,0x00,0x00, // 'p' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x37,0xFF,0xFE,0xDD,0xFF,0xFE,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x81,0xFF,0xFF,0xB0,0x00,0x00,0x38,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x00,0xE0,0x00,0x00,0x30, // 'q' + 0x1F,0xFF,0xF8,0x7F,0xFF,0xFA,0x7F,0xFF,0xE6,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x00,0x00,0x00, // 'r' + 0xC0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xDF,0xFF,0xF8,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC0,0x00,0x00,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x07,0xFF,0xFB,0x87,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 's' + 0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xDF,0xFF,0xF8,0x7F,0xFF,0xFA,0x7F,0xFF,0xE6,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xE3,0x7F,0xFF,0xE1,0xFF,0xFF,0xE3,0xFF,0xFF,0xC0, // 't' + 0x80,0x00,0x03,0x60,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xDF,0xFF,0xEE,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x0F,0xFF,0xFF,0x00, // 'u' + 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xC0,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'v' + 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x77,0xFF,0xFB,0xB7,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'w' + 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x27,0xFF,0xFE,0xD8,0x00,0x00,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x03,0xB0,0x00,0x00,0xC0, // 'x' + 0xC0,0x00,0x03,0x70,0x00,0x03,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x1E,0xE0,0x00,0x0F,0x70,0x00,0x07,0xB8,0x00,0x03,0xDC,0x00,0x01,0xEE,0x00,0x00,0xF7,0x00,0x00,0x7B,0x80,0x00,0x3D,0xC0,0x00,0x0E,0xDF,0xFF,0xFB,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC0,0x00,0x00,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x07,0xFF,0xFB,0x87,0xFF,0xFE,0xC7,0xFF,0xFF,0x83,0xFF,0xFF,0xC0, // 'y' + 0x3F,0xFF,0xFC,0x1F,0xFF,0xFE,0x07,0xFF,0xFE,0xC1,0xFF,0xFE,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x80,0x00,0x03,0xC0,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x03,0x80,0x00,0x00,0xC0,0x00,0x00,0x08,0x00,0x00,0x06,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,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1D,0xFF,0xFE,0x0D,0xFF,0xFF,0x81,0xFF,0xFF,0xE0,0xFF,0xFF,0xF0, // 'z' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '{' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8, // '|' + 0xFF,0xD0,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x50,0x0A,0x01,0x40,0x28,0x05,0x00,0xA0,0x14,0x02,0x80,0x5F,0xF8 // '}' +}; +const GFXglyph DSEG7_Classic_Regular_39Glyphs[] PROGMEM = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 9, 0, 0 }, // ' ' + { 1, 1, 1, 33, 0, 0 }, // '!' + { 2, 11, 26, 15, 1, -26 }, // '"' + { 38, 11, 26, 15, 1, -26 }, // '#' + { 74, 11, 26, 15, 1, -26 }, // '$' + { 110, 11, 26, 15, 1, -26 }, // '%' + { 146, 11, 26, 15, 1, -26 }, // '&' + { 182, 11, 26, 15, 1, -26 }, // ''' + { 218, 11, 26, 15, 1, -26 }, // '(' + { 254, 11, 26, 15, 1, -26 }, // ')' + { 290, 11, 26, 15, 1, -26 }, // '*' + { 326, 11, 26, 15, 1, -26 }, // '+' + { 362, 11, 26, 15, 1, -26 }, // ',' + { 398, 21, 3, 33, 6, -21 }, // '-' + { 406, 5, 5, 1, -2, -5 }, // '.' + { 410, 11, 26, 15, 1, -26 }, // '/' + { 446, 25, 39, 33, 4, -39 }, // '0' + { 568, 5, 35, 33, 24, -37 }, // '1' + { 590, 25, 39, 33, 4, -39 }, // '2' + { 712, 23, 39, 33, 6, -39 }, // '3' + { 825, 25, 35, 33, 4, -37 }, // '4' + { 935, 25, 39, 33, 4, -39 }, // '5' + { 1057, 25, 39, 33, 4, -39 }, // '6' + { 1179, 25, 37, 33, 4, -39 }, // '7' + { 1295, 25, 39, 33, 4, -39 }, // '8' + { 1417, 25, 39, 33, 4, -39 }, // '9' + { 1539, 6, 20, 9, 1, -29 }, // ':' + { 1554, 11, 26, 15, 1, -26 }, // ';' + { 1590, 11, 26, 15, 1, -26 }, // '<' + { 1626, 11, 26, 15, 1, -26 }, // '=' + { 1662, 11, 26, 15, 1, -26 }, // '>' + { 1698, 11, 26, 15, 1, -26 }, // '?' + { 1734, 11, 26, 15, 1, -26 }, // '@' + { 1770, 25, 37, 33, 4, -39 }, // 'A' + { 1886, 25, 37, 33, 4, -37 }, // 'B' + { 2002, 23, 21, 33, 4, -21 }, // 'C' + { 2063, 25, 37, 33, 4, -37 }, // 'D' + { 2179, 23, 39, 33, 4, -39 }, // 'E' + { 2292, 23, 37, 33, 4, -39 }, // 'F' + { 2399, 25, 39, 33, 4, -39 }, // 'G' + { 2521, 25, 35, 33, 4, -37 }, // 'H' + { 2631, 5, 17, 33, 24, -19 }, // 'I' + { 2642, 25, 37, 33, 4, -37 }, // 'J' + { 2758, 25, 37, 33, 4, -39 }, // 'K' + { 2874, 23, 37, 33, 4, -37 }, // 'L' + { 2981, 25, 37, 33, 4, -39 }, // 'M' + { 3097, 25, 19, 33, 4, -21 }, // 'N' + { 3157, 25, 21, 33, 4, -21 }, // 'O' + { 3223, 25, 37, 33, 4, -39 }, // 'P' + { 3339, 25, 37, 33, 4, -39 }, // 'Q' + { 3455, 23, 19, 33, 4, -21 }, // 'R' + { 3510, 25, 37, 33, 4, -37 }, // 'S' + { 3626, 23, 37, 33, 4, -37 }, // 'T' + { 3733, 25, 19, 33, 4, -19 }, // 'U' + { 3793, 25, 37, 33, 4, -37 }, // 'V' + { 3909, 25, 37, 33, 4, -37 }, // 'W' + { 4025, 25, 35, 33, 4, -37 }, // 'X' + { 4135, 25, 37, 33, 4, -37 }, // 'Y' + { 4251, 25, 39, 33, 4, -39 }, // 'Z' + { 4373, 11, 26, 15, 1, -26 }, // '[' + { 4409, 11, 26, 15, 1, -26 }, // '\' + { 4445, 11, 26, 15, 1, -26 }, // ']' + { 4481, 11, 26, 15, 1, -26 }, // '^' + { 4517, 11, 26, 15, 1, -26 }, // '_' + { 4553, 11, 26, 15, 1, -26 }, // '`' + { 4589, 25, 37, 33, 4, -39 }, // 'a' + { 4705, 25, 37, 33, 4, -37 }, // 'b' + { 4821, 23, 21, 33, 4, -21 }, // 'c' + { 4882, 25, 37, 33, 4, -37 }, // 'd' + { 4998, 23, 39, 33, 4, -39 }, // 'e' + { 5111, 23, 37, 33, 4, -39 }, // 'f' + { 5218, 25, 39, 33, 4, -39 }, // 'g' + { 5340, 25, 35, 33, 4, -37 }, // 'h' + { 5450, 5, 17, 33, 24, -19 }, // 'i' + { 5461, 25, 37, 33, 4, -37 }, // 'j' + { 5577, 25, 37, 33, 4, -39 }, // 'k' + { 5693, 23, 37, 33, 4, -37 }, // 'l' + { 5800, 25, 37, 33, 4, -39 }, // 'm' + { 5916, 25, 19, 33, 4, -21 }, // 'n' + { 5976, 25, 21, 33, 4, -21 }, // 'o' + { 6042, 25, 37, 33, 4, -39 }, // 'p' + { 6158, 25, 37, 33, 4, -39 }, // 'q' + { 6274, 23, 19, 33, 4, -21 }, // 'r' + { 6329, 25, 37, 33, 4, -37 }, // 's' + { 6445, 23, 37, 33, 4, -37 }, // 't' + { 6552, 25, 19, 33, 4, -19 }, // 'u' + { 6612, 25, 37, 33, 4, -37 }, // 'v' + { 6728, 25, 37, 33, 4, -37 }, // 'w' + { 6844, 25, 35, 33, 4, -37 }, // 'x' + { 6954, 25, 37, 33, 4, -37 }, // 'y' + { 7070, 25, 39, 33, 4, -39 }, // 'z' + { 7192, 11, 26, 15, 1, -26 }, // '{' + { 7228, 11, 26, 15, 1, -26 }, // '|' + { 7264, 11, 26, 15, 1, -26 } // '}' +}; +const GFXfont DSEG7_Classic_Regular_39 PROGMEM = { (uint8_t *)DSEG7_Classic_Regular_39Bitmaps,(GFXglyph *)DSEG7_Classic_Regular_39Glyphs,0x20, 0x7E, 43}; \ No newline at end of file diff --git a/examples/WatchFaces/7_SEG/Watchy_7_SEG.cpp b/examples/WatchFaces/7_SEG/Watchy_7_SEG.cpp index f0c616a..fc1ca20 100644 --- a/examples/WatchFaces/7_SEG/Watchy_7_SEG.cpp +++ b/examples/WatchFaces/7_SEG/Watchy_7_SEG.cpp @@ -38,8 +38,8 @@ void Watchy7SEG::drawTime(){ display.print(":"); if(currentTime.Minute < 10){ display.print("0"); - } - display.println(currentTime.Minute); + } + display.println(currentTime.Minute); } void Watchy7SEG::drawDate(){ @@ -52,7 +52,7 @@ void Watchy7SEG::drawDate(){ display.getTextBounds(dayOfWeek, 5, 85, &x1, &y1, &w, &h); if(currentTime.Wday == 4){ w = w - 5; - } + } display.setCursor(85 - w, 85); display.println(dayOfWeek); @@ -64,8 +64,8 @@ void Watchy7SEG::drawDate(){ display.setFont(&DSEG7_Classic_Bold_25); display.setCursor(5, 120); if(currentTime.Day < 10){ - display.print("0"); - } + display.print("0"); + } display.println(currentTime.Day); display.setCursor(5, 150); display.println(tmYearToCalendar(currentTime.Year));// offset from 1970, since year is stored in uint8_t @@ -93,7 +93,7 @@ void Watchy7SEG::drawBattery(){ } else if(VBAT > 3.80 && VBAT <= 3.95){ batteryLevel = 1; - } + } else if(VBAT <= 3.80){ batteryLevel = 0; } @@ -108,7 +108,7 @@ void Watchy7SEG::drawWeather(){ weatherData currentWeather = getWeatherData(); int8_t temperature = currentWeather.temperature; - int16_t weatherConditionCode = currentWeather.weatherConditionCode; + int16_t weatherConditionCode = currentWeather.weatherConditionCode; display.setFont(&DSEG7_Classic_Regular_39); int16_t x1, y1; @@ -129,19 +129,19 @@ void Watchy7SEG::drawWeather(){ if(weatherConditionCode > 801){//Cloudy weatherIcon = cloudy; }else if(weatherConditionCode == 801){//Few Clouds - weatherIcon = cloudsun; + weatherIcon = cloudsun; }else if(weatherConditionCode == 800){//Clear - weatherIcon = sunny; + weatherIcon = sunny; }else if(weatherConditionCode >=700){//Atmosphere - weatherIcon = atmosphere; + weatherIcon = atmosphere; }else if(weatherConditionCode >=600){//Snow weatherIcon = snow; }else if(weatherConditionCode >=500){//Rain - weatherIcon = rain; + weatherIcon = rain; }else if(weatherConditionCode >=300){//Drizzle weatherIcon = drizzle; }else if(weatherConditionCode >=200){//Thunderstorm - weatherIcon = thunderstorm; + weatherIcon = thunderstorm; }else return; display.drawBitmap(145, 158, weatherIcon, WEATHER_ICON_WIDTH, WEATHER_ICON_HEIGHT, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK); diff --git a/examples/WatchFaces/7_SEG/Watchy_7_SEG.h b/examples/WatchFaces/7_SEG/Watchy_7_SEG.h index b3d85f1..0ad48c2 100644 --- a/examples/WatchFaces/7_SEG/Watchy_7_SEG.h +++ b/examples/WatchFaces/7_SEG/Watchy_7_SEG.h @@ -1,22 +1,22 @@ -#ifndef WATCHY_7_SEG_H -#define WATCHY_7_SEG_H - -#include -#include "Seven_Segment10pt7b.h" -#include "DSEG7_Classic_Regular_15.h" -#include "DSEG7_Classic_Bold_25.h" -#include "DSEG7_Classic_Regular_39.h" -#include "icons.h" - -class Watchy7SEG : public Watchy{ - using Watchy::Watchy; - public: - void drawWatchFace(); - void drawTime(); - void drawDate(); - void drawSteps(); - void drawWeather(); - void drawBattery(); -}; - +#ifndef WATCHY_7_SEG_H +#define WATCHY_7_SEG_H + +#include +#include "Seven_Segment10pt7b.h" +#include "DSEG7_Classic_Regular_15.h" +#include "DSEG7_Classic_Bold_25.h" +#include "DSEG7_Classic_Regular_39.h" +#include "icons.h" + +class Watchy7SEG : public Watchy{ + using Watchy::Watchy; + public: + void drawWatchFace(); + void drawTime(); + void drawDate(); + void drawSteps(); + void drawWeather(); + void drawBattery(); +}; + #endif \ No newline at end of file diff --git a/examples/WatchFaces/7_SEG/icons.h b/examples/WatchFaces/7_SEG/icons.h index b94e793..66354b6 100644 --- a/examples/WatchFaces/7_SEG/icons.h +++ b/examples/WatchFaces/7_SEG/icons.h @@ -1,176 +1,176 @@ -// 'battery', 37x21px -const unsigned char battery [] PROGMEM = { - 0x3f, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xe0, - 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xf8, 0xe0, 0x00, - 0x00, 0x00, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, - 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, - 0x38, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0xf8, - 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7f, - 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xff, 0x80 -}; -// 'bluetooth', 13x21px -const unsigned char bluetooth [] PROGMEM = { - 0x1f, 0xc0, 0x3f, 0xe0, 0x7f, 0xf0, 0xfd, 0xf8, 0xfc, 0xf8, 0xfc, 0x78, 0xdd, 0x38, 0xcd, 0x98, - 0xe5, 0x38, 0xf0, 0x78, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0x78, 0xe5, 0x38, 0xcd, 0x98, 0xfd, 0x38, - 0xfc, 0x78, 0xfc, 0xf8, 0x7d, 0xf0, 0x3f, 0xe0, 0x1f, 0xc0 -}; -// 'celsius', 26x20px -const unsigned char celsius [] PROGMEM = { - 0x3f, 0x80, 0x1f, 0xc0, 0x7f, 0xc0, 0x3f, 0xc0, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, - 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, - 0xc0, 0x60, 0x60, 0x00, 0xff, 0xc0, 0x40, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x3f, 0xc0 -}; -// 'fahrenheit', 26x20px -const unsigned char fahrenheit [] PROGMEM = { - 0x3f, 0x80, 0x1f, 0xc0, 0x7f, 0xc0, 0x3f, 0xc0, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, - 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, - 0xc0, 0x60, 0x60, 0x00, 0xff, 0xc0, 0x7f, 0xc0, 0x7f, 0x80, 0x3f, 0xc0, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00 -}; -// 'cloudsun', 48x32px -const unsigned char cloudsun [] PROGMEM = { - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x84, 0x40, 0x00, 0x00, 0x00, 0x10, 0x44, 0x42, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, - 0x00, 0x00, 0x00, 0x31, 0x80, 0x61, 0x00, 0x07, 0xe0, 0x19, 0x00, 0x32, 0x00, 0x38, 0x38, 0x02, - 0x00, 0x10, 0x00, 0x60, 0x04, 0x02, 0x00, 0x10, 0x00, 0x80, 0x03, 0xf2, 0x00, 0x10, 0x01, 0x00, - 0x01, 0x9e, 0x00, 0x10, 0x03, 0x00, 0x00, 0x03, 0x00, 0x10, 0x02, 0x00, 0x00, 0x01, 0x80, 0x10, - 0x02, 0x00, 0x00, 0x00, 0x80, 0x32, 0x04, 0x00, 0x00, 0x00, 0x40, 0x61, 0x04, 0x00, 0x00, 0x00, - 0x70, 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x08, 0x60, 0x00, - 0x00, 0x00, 0x01, 0x04, 0x40, 0x00, 0x00, 0x00, 0x01, 0xc2, 0x40, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xfc, 0x00 -}; -// 'cloudy', 48x32px -const unsigned char cloudy [] PROGMEM = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x00, 0x01, 0x80, 0x00, 0x3f, - 0xc0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0 -}; -// 'rain', 48x32px -const unsigned char rain [] PROGMEM = { - 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x30, - 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x07, 0x80, 0x00, 0xc0, 0x00, 0x00, - 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, 0x80, - 0x00, 0x00, 0x00, 0x60, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x21, 0x08, 0x42, 0x10, 0x00, 0x00, 0x42, 0x10, 0x84, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x84, 0x21, 0x00, 0x00, 0x04, 0x21, - 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x84, 0x21, 0x08, 0x00, 0x00 -}; -// 'snow', 48x32px -const unsigned char snow [] PROGMEM = { - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x81, 0x02, 0x40, 0x00, 0x00, 0x02, 0x81, 0x02, 0x80, 0x00, - 0x00, 0x01, 0x81, 0x03, 0x00, 0x00, 0x00, 0x07, 0x81, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x41, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, 0x00, 0x80, - 0x09, 0x20, 0x04, 0x00, 0x00, 0x40, 0x05, 0x40, 0x08, 0x00, 0x00, 0x20, 0x03, 0x80, 0x10, 0x00, - 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x20, 0x03, 0x80, 0x10, 0x00, 0x00, 0x40, 0x05, 0x40, - 0x08, 0x00, 0x00, 0x80, 0x09, 0x20, 0x04, 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x00, 0x03, 0x81, 0x03, 0x80, 0x00, - 0x00, 0x01, 0x81, 0x03, 0x00, 0x00, 0x00, 0x02, 0x81, 0x02, 0x80, 0x00, 0x00, 0x04, 0x01, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 -}; -// 'sunny', 48x32px -const unsigned char sunny [] PROGMEM = { - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x00, 0x18, - 0x20, 0x10, 0x60, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, - 0x00, 0x02, 0x0f, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0c, - 0x00, 0x00, 0x00, 0x30, 0x80, 0x04, 0x30, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, - 0x03, 0xf2, 0x00, 0x01, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, - 0x80, 0x04, 0x30, 0x00, 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, - 0x00, 0x02, 0x0f, 0xc1, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0xc0, 0x00, 0x00, 0x18, 0x20, 0x10, 0x60, 0x00, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 -}; -// 'atmosphere', 48x32px -const unsigned char atmosphere[] PROGMEM = { - 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x30, - 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x07, 0x80, 0x00, 0xc0, 0x00, 0x00, - 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x07, 0xff, 0xf8, 0xf0, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, 0x80, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x9f, 0x1f, 0xff, 0xfc, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0xff, 0xfc, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; -// 'drizzle', 48x32px -const unsigned char drizzle[] PROGMEM = { - 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x30, - 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x07, 0x80, 0x00, 0xc0, 0x00, 0x00, - 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, 0x80, - 0x00, 0x00, 0x00, 0x60, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x08, 0x00, 0x00 -}; -// 'thunderstorm', 48x32px -const unsigned char thunderstorm[] PROGMEM = { - 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x30, - 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x07, 0x80, 0x00, 0xc0, 0x0f, 0x80, - 0x00, 0xc0, 0x03, 0x00, 0x0f, 0x80, 0x00, 0x20, 0x02, 0x00, 0x1f, 0x00, 0x00, 0x10, 0x04, 0x00, - 0x1e, 0x00, 0x00, 0x18, 0x04, 0x00, 0x3e, 0x00, 0x00, 0x08, 0x08, 0x00, 0x3c, 0x00, 0x00, 0x08, - 0x08, 0x00, 0x7c, 0x00, 0x00, 0x08, 0x04, 0x00, 0x78, 0x00, 0x00, 0x08, 0x04, 0x00, 0xf8, 0x00, - 0x00, 0x08, 0x04, 0x00, 0xff, 0x00, 0x00, 0x10, 0x02, 0x00, 0x1f, 0x00, 0x00, 0x30, 0x01, 0x80, - 0x1e, 0x00, 0x00, 0x60, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; -// 'steps', 19x23px -const unsigned char steps [] PROGMEM = { - 0x00, 0x03, 0xc0, 0x00, 0x07, 0xe0, 0x00, 0x07, 0xe0, 0x00, 0x0f, 0xe0, 0x78, 0x0f, 0xe0, 0xfc, - 0x0f, 0xe0, 0xfc, 0x0f, 0xe0, 0xfc, 0x0f, 0xe0, 0xfe, 0x0f, 0xe0, 0xfe, 0x07, 0xc0, 0xfe, 0x07, - 0xc0, 0xfe, 0x07, 0x80, 0xfe, 0x00, 0x00, 0x7c, 0x0e, 0x00, 0x7c, 0x0f, 0x80, 0x7c, 0x1f, 0x80, - 0x20, 0x1f, 0x00, 0x06, 0x0f, 0x00, 0x3e, 0x0e, 0x00, 0x3e, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x1e, - 0x00, 0x00, 0x1e, 0x00, 0x00 -}; -// 'wifi', 26x18px -const unsigned char wifi [] PROGMEM = { - 0x00, 0x7f, 0x80, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x1f, 0xc0, 0xfe, 0x00, - 0x7e, 0x00, 0x1f, 0x80, 0xf8, 0x3f, 0x07, 0xc0, 0x71, 0xff, 0xe3, 0x80, 0x23, 0xff, 0xf1, 0x00, - 0x07, 0xc0, 0xf8, 0x00, 0x0f, 0x00, 0x3c, 0x00, 0x06, 0x3f, 0x18, 0x00, 0x02, 0x7f, 0x90, 0x00, - 0x00, 0xff, 0xc0, 0x00, 0x00, 0xe1, 0xc0, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x1e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00 -}; -// 'wifioff', 26x18px -const unsigned char wifioff [] PROGMEM = { - 0x00, 0x7f, 0x87, 0xc0, 0x03, 0xff, 0xff, 0x80, 0x0f, 0xff, 0xff, 0x00, 0x1f, 0xc0, 0xfe, 0x00, - 0x7e, 0x00, 0x7f, 0x80, 0xf8, 0x3f, 0xf7, 0xc0, 0x71, 0xff, 0xe3, 0x80, 0x23, 0xff, 0xf1, 0x00, - 0x07, 0xcf, 0xf8, 0x00, 0x0f, 0x3e, 0x3c, 0x00, 0x06, 0x7f, 0x18, 0x00, 0x02, 0xff, 0x90, 0x00, - 0x01, 0xff, 0xc0, 0x00, 0x07, 0xe1, 0xc0, 0x00, 0x0f, 0xc0, 0x80, 0x00, 0x1f, 0x0c, 0x00, 0x00, - 0x3c, 0x1e, 0x00, 0x00, 0xf8, 0x0c, 0x00, 0x00 -}; +// 'battery', 37x21px +const unsigned char battery [] PROGMEM = { + 0x3f, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xe0, + 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xf8, 0xe0, 0x00, + 0x00, 0x00, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0xf8, + 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7f, + 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xff, 0x80 +}; +// 'bluetooth', 13x21px +const unsigned char bluetooth [] PROGMEM = { + 0x1f, 0xc0, 0x3f, 0xe0, 0x7f, 0xf0, 0xfd, 0xf8, 0xfc, 0xf8, 0xfc, 0x78, 0xdd, 0x38, 0xcd, 0x98, + 0xe5, 0x38, 0xf0, 0x78, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0x78, 0xe5, 0x38, 0xcd, 0x98, 0xfd, 0x38, + 0xfc, 0x78, 0xfc, 0xf8, 0x7d, 0xf0, 0x3f, 0xe0, 0x1f, 0xc0 +}; +// 'celsius', 26x20px +const unsigned char celsius [] PROGMEM = { + 0x3f, 0x80, 0x1f, 0xc0, 0x7f, 0xc0, 0x3f, 0xc0, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, + 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, + 0xc0, 0x60, 0x60, 0x00, 0xff, 0xc0, 0x40, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x3f, 0xc0 +}; +// 'fahrenheit', 26x20px +const unsigned char fahrenheit [] PROGMEM = { + 0x3f, 0x80, 0x1f, 0xc0, 0x7f, 0xc0, 0x3f, 0xc0, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, + 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x60, 0x00, + 0xc0, 0x60, 0x60, 0x00, 0xff, 0xc0, 0x7f, 0xc0, 0x7f, 0x80, 0x3f, 0xc0, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +// 'cloudsun', 48x32px +const unsigned char cloudsun [] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x84, 0x40, 0x00, 0x00, 0x00, 0x10, 0x44, 0x42, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, + 0x00, 0x00, 0x00, 0x31, 0x80, 0x61, 0x00, 0x07, 0xe0, 0x19, 0x00, 0x32, 0x00, 0x38, 0x38, 0x02, + 0x00, 0x10, 0x00, 0x60, 0x04, 0x02, 0x00, 0x10, 0x00, 0x80, 0x03, 0xf2, 0x00, 0x10, 0x01, 0x00, + 0x01, 0x9e, 0x00, 0x10, 0x03, 0x00, 0x00, 0x03, 0x00, 0x10, 0x02, 0x00, 0x00, 0x01, 0x80, 0x10, + 0x02, 0x00, 0x00, 0x00, 0x80, 0x32, 0x04, 0x00, 0x00, 0x00, 0x40, 0x61, 0x04, 0x00, 0x00, 0x00, + 0x70, 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x08, 0x60, 0x00, + 0x00, 0x00, 0x01, 0x04, 0x40, 0x00, 0x00, 0x00, 0x01, 0xc2, 0x40, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xfc, 0x00 +}; +// 'cloudy', 48x32px +const unsigned char cloudy [] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x00, 0x01, 0x80, 0x00, 0x3f, + 0xc0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0 +}; +// 'rain', 48x32px +const unsigned char rain [] PROGMEM = { + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x07, 0x80, 0x00, 0xc0, 0x00, 0x00, + 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x60, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x21, 0x08, 0x42, 0x10, 0x00, 0x00, 0x42, 0x10, 0x84, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x84, 0x21, 0x00, 0x00, 0x04, 0x21, + 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x84, 0x21, 0x08, 0x00, 0x00 +}; +// 'snow', 48x32px +const unsigned char snow [] PROGMEM = { + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x81, 0x02, 0x40, 0x00, 0x00, 0x02, 0x81, 0x02, 0x80, 0x00, + 0x00, 0x01, 0x81, 0x03, 0x00, 0x00, 0x00, 0x07, 0x81, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x41, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, 0x00, 0x80, + 0x09, 0x20, 0x04, 0x00, 0x00, 0x40, 0x05, 0x40, 0x08, 0x00, 0x00, 0x20, 0x03, 0x80, 0x10, 0x00, + 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x20, 0x03, 0x80, 0x10, 0x00, 0x00, 0x40, 0x05, 0x40, + 0x08, 0x00, 0x00, 0x80, 0x09, 0x20, 0x04, 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x00, 0x03, 0x81, 0x03, 0x80, 0x00, + 0x00, 0x01, 0x81, 0x03, 0x00, 0x00, 0x00, 0x02, 0x81, 0x02, 0x80, 0x00, 0x00, 0x04, 0x01, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 +}; +// 'sunny', 48x32px +const unsigned char sunny [] PROGMEM = { + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x00, 0x18, + 0x20, 0x10, 0x60, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x02, 0x0f, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0c, + 0x00, 0x00, 0x00, 0x30, 0x80, 0x04, 0x30, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, + 0x03, 0xf2, 0x00, 0x01, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, + 0x80, 0x04, 0x30, 0x00, 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x00, 0x02, 0x0f, 0xc1, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x18, 0x20, 0x10, 0x60, 0x00, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 +}; +// 'atmosphere', 48x32px +const unsigned char atmosphere[] PROGMEM = { + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x07, 0x80, 0x00, 0xc0, 0x00, 0x00, + 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x04, 0x07, 0xff, 0xf8, 0xf0, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x60, 0x00, 0x9f, 0x1f, 0xff, 0xfc, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0xff, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +// 'drizzle', 48x32px +const unsigned char drizzle[] PROGMEM = { + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x07, 0x80, 0x00, 0xc0, 0x00, 0x00, + 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x60, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x08, 0x00, 0x00 +}; +// 'thunderstorm', 48x32px +const unsigned char thunderstorm[] PROGMEM = { + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x07, 0x80, 0x00, 0xc0, 0x0f, 0x80, + 0x00, 0xc0, 0x03, 0x00, 0x0f, 0x80, 0x00, 0x20, 0x02, 0x00, 0x1f, 0x00, 0x00, 0x10, 0x04, 0x00, + 0x1e, 0x00, 0x00, 0x18, 0x04, 0x00, 0x3e, 0x00, 0x00, 0x08, 0x08, 0x00, 0x3c, 0x00, 0x00, 0x08, + 0x08, 0x00, 0x7c, 0x00, 0x00, 0x08, 0x04, 0x00, 0x78, 0x00, 0x00, 0x08, 0x04, 0x00, 0xf8, 0x00, + 0x00, 0x08, 0x04, 0x00, 0xff, 0x00, 0x00, 0x10, 0x02, 0x00, 0x1f, 0x00, 0x00, 0x30, 0x01, 0x80, + 0x1e, 0x00, 0x00, 0x60, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +// 'steps', 19x23px +const unsigned char steps [] PROGMEM = { + 0x00, 0x03, 0xc0, 0x00, 0x07, 0xe0, 0x00, 0x07, 0xe0, 0x00, 0x0f, 0xe0, 0x78, 0x0f, 0xe0, 0xfc, + 0x0f, 0xe0, 0xfc, 0x0f, 0xe0, 0xfc, 0x0f, 0xe0, 0xfe, 0x0f, 0xe0, 0xfe, 0x07, 0xc0, 0xfe, 0x07, + 0xc0, 0xfe, 0x07, 0x80, 0xfe, 0x00, 0x00, 0x7c, 0x0e, 0x00, 0x7c, 0x0f, 0x80, 0x7c, 0x1f, 0x80, + 0x20, 0x1f, 0x00, 0x06, 0x0f, 0x00, 0x3e, 0x0e, 0x00, 0x3e, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x1e, + 0x00, 0x00, 0x1e, 0x00, 0x00 +}; +// 'wifi', 26x18px +const unsigned char wifi [] PROGMEM = { + 0x00, 0x7f, 0x80, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x1f, 0xc0, 0xfe, 0x00, + 0x7e, 0x00, 0x1f, 0x80, 0xf8, 0x3f, 0x07, 0xc0, 0x71, 0xff, 0xe3, 0x80, 0x23, 0xff, 0xf1, 0x00, + 0x07, 0xc0, 0xf8, 0x00, 0x0f, 0x00, 0x3c, 0x00, 0x06, 0x3f, 0x18, 0x00, 0x02, 0x7f, 0x90, 0x00, + 0x00, 0xff, 0xc0, 0x00, 0x00, 0xe1, 0xc0, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00 +}; +// 'wifioff', 26x18px +const unsigned char wifioff [] PROGMEM = { + 0x00, 0x7f, 0x87, 0xc0, 0x03, 0xff, 0xff, 0x80, 0x0f, 0xff, 0xff, 0x00, 0x1f, 0xc0, 0xfe, 0x00, + 0x7e, 0x00, 0x7f, 0x80, 0xf8, 0x3f, 0xf7, 0xc0, 0x71, 0xff, 0xe3, 0x80, 0x23, 0xff, 0xf1, 0x00, + 0x07, 0xcf, 0xf8, 0x00, 0x0f, 0x3e, 0x3c, 0x00, 0x06, 0x7f, 0x18, 0x00, 0x02, 0xff, 0x90, 0x00, + 0x01, 0xff, 0xc0, 0x00, 0x07, 0xe1, 0xc0, 0x00, 0x0f, 0xc0, 0x80, 0x00, 0x1f, 0x0c, 0x00, 0x00, + 0x3c, 0x1e, 0x00, 0x00, 0xf8, 0x0c, 0x00, 0x00 +}; diff --git a/examples/WatchFaces/Basic/Basic.ino b/examples/WatchFaces/Basic/Basic.ino index 5bc949b..414a5ce 100644 --- a/examples/WatchFaces/Basic/Basic.ino +++ b/examples/WatchFaces/Basic/Basic.ino @@ -1,10 +1,10 @@ -#include -#include "settings.h" - -Watchy watchy(settings); - -void setup(){ - watchy.init(); -} - +#include +#include "settings.h" + +Watchy watchy(settings); + +void setup(){ + watchy.init(); +} + void loop(){} \ No newline at end of file diff --git a/examples/WatchFaces/DOS/DOS.ino b/examples/WatchFaces/DOS/DOS.ino index ca9682b..4f0610c 100644 --- a/examples/WatchFaces/DOS/DOS.ino +++ b/examples/WatchFaces/DOS/DOS.ino @@ -1,10 +1,10 @@ -#include "Watchy_DOS.h" -#include "settings.h" - -WatchyDOS watchy(settings); - -void setup(){ - watchy.init(); -} - -void loop(){} +#include "Watchy_DOS.h" +#include "settings.h" + +WatchyDOS watchy(settings); + +void setup(){ + watchy.init(); +} + +void loop(){} diff --git a/examples/WatchFaces/DOS/Watchy_DOS.cpp b/examples/WatchFaces/DOS/Watchy_DOS.cpp index 0b807f4..12cdcaa 100644 --- a/examples/WatchFaces/DOS/Watchy_DOS.cpp +++ b/examples/WatchFaces/DOS/Watchy_DOS.cpp @@ -1,31 +1,31 @@ -#include "Watchy_DOS.h" - -void WatchyDOS::drawWatchFace(){ - char time[6]; - time[0] = '0' + ((currentTime.Hour/10)%10); - time[1] = '0' + (currentTime.Hour%10); - time[2] = ':'; - time[3] = '0' + ((currentTime.Minute/10)%10); - time[4] = '0' + (currentTime.Minute%10); - time[5] = 0; - display.fillScreen(GxEPD_BLACK); - display.setTextColor(GxEPD_WHITE); - display.setFont(&Px437_IBM_BIOS5pt7b); - display.setCursor(0, 24); - display.println("WATCHY-DOS 1.1.8"); - display.println("Copyright (c) 2020"); - display.println(" "); - display.print("AUTOEXEC BAT "); - display.println(time); - display.print("COMMAND COM "); - display.println(time); - display.print("CONFIG SYS "); - display.println(time); - display.print("ESPTOOL PY "); - display.println(time); - display.println(" "); - display.println(" 4 files 563 bytes"); - display.println(" 2048 bytes free"); - display.println(" "); - display.println("esptool"); +#include "Watchy_DOS.h" + +void WatchyDOS::drawWatchFace(){ + char time[6]; + time[0] = '0' + ((currentTime.Hour/10)%10); + time[1] = '0' + (currentTime.Hour%10); + time[2] = ':'; + time[3] = '0' + ((currentTime.Minute/10)%10); + time[4] = '0' + (currentTime.Minute%10); + time[5] = 0; + display.fillScreen(GxEPD_BLACK); + display.setTextColor(GxEPD_WHITE); + display.setFont(&Px437_IBM_BIOS5pt7b); + display.setCursor(0, 24); + display.println("WATCHY-DOS 1.1.8"); + display.println("Copyright (c) 2020"); + display.println(" "); + display.print("AUTOEXEC BAT "); + display.println(time); + display.print("COMMAND COM "); + display.println(time); + display.print("CONFIG SYS "); + display.println(time); + display.print("ESPTOOL PY "); + display.println(time); + display.println(" "); + display.println(" 4 files 563 bytes"); + display.println(" 2048 bytes free"); + display.println(" "); + display.println("esptool"); } \ No newline at end of file diff --git a/examples/WatchFaces/DOS/Watchy_DOS.h b/examples/WatchFaces/DOS/Watchy_DOS.h index 94c2fbd..04ce7cc 100644 --- a/examples/WatchFaces/DOS/Watchy_DOS.h +++ b/examples/WatchFaces/DOS/Watchy_DOS.h @@ -1,13 +1,13 @@ -#ifndef WATCHY_DOS_H -#define WATCHY_DOS_H - -#include -#include "Px437_IBM_BIOS5pt7b.h" - -class WatchyDOS : public Watchy{ - using Watchy::Watchy; - public: - void drawWatchFace(); -}; - +#ifndef WATCHY_DOS_H +#define WATCHY_DOS_H + +#include +#include "Px437_IBM_BIOS5pt7b.h" + +class WatchyDOS : public Watchy{ + using Watchy::Watchy; + public: + void drawWatchFace(); +}; + #endif \ No newline at end of file diff --git a/examples/WatchFaces/Pokemon/Pokemon.ino b/examples/WatchFaces/Pokemon/Pokemon.ino index 56f48b3..54b1082 100644 --- a/examples/WatchFaces/Pokemon/Pokemon.ino +++ b/examples/WatchFaces/Pokemon/Pokemon.ino @@ -1,10 +1,10 @@ -#include "Watchy_Pokemon.h" -#include "settings.h" - -WatchyPokemon watchy(settings); - -void setup(){ - watchy.init(); -} - -void loop(){} +#include "Watchy_Pokemon.h" +#include "settings.h" + +WatchyPokemon watchy(settings); + +void setup(){ + watchy.init(); +} + +void loop(){} diff --git a/examples/WatchFaces/Pokemon/Watchy_Pokemon.cpp b/examples/WatchFaces/Pokemon/Watchy_Pokemon.cpp index e514558..717afe6 100644 --- a/examples/WatchFaces/Pokemon/Watchy_Pokemon.cpp +++ b/examples/WatchFaces/Pokemon/Watchy_Pokemon.cpp @@ -1,18 +1,18 @@ -#include "Watchy_Pokemon.h" - -void WatchyPokemon::drawWatchFace(){ - display.fillScreen(GxEPD_WHITE); - display.drawBitmap(0, 0, pokemon, DISPLAY_WIDTH, DISPLAY_HEIGHT, GxEPD_BLACK); - display.setTextColor(GxEPD_BLACK); - display.setFont(&FreeMonoBold9pt7b); - display.setCursor(10, 170); - if(currentTime.Hour < 10){ - display.print('0'); - } - display.print(currentTime.Hour); - display.print(':'); - if(currentTime.Minute < 10){ - display.print('0'); - } - display.print(currentTime.Minute); +#include "Watchy_Pokemon.h" + +void WatchyPokemon::drawWatchFace(){ + display.fillScreen(GxEPD_WHITE); + display.drawBitmap(0, 0, pokemon, DISPLAY_WIDTH, DISPLAY_HEIGHT, GxEPD_BLACK); + display.setTextColor(GxEPD_BLACK); + display.setFont(&FreeMonoBold9pt7b); + display.setCursor(10, 170); + if(currentTime.Hour < 10){ + display.print('0'); + } + display.print(currentTime.Hour); + display.print(':'); + if(currentTime.Minute < 10){ + display.print('0'); + } + display.print(currentTime.Minute); } \ No newline at end of file diff --git a/examples/WatchFaces/Pokemon/Watchy_Pokemon.h b/examples/WatchFaces/Pokemon/Watchy_Pokemon.h index 581f915..41eb244 100644 --- a/examples/WatchFaces/Pokemon/Watchy_Pokemon.h +++ b/examples/WatchFaces/Pokemon/Watchy_Pokemon.h @@ -1,13 +1,13 @@ -#ifndef WATCHY_POKEMON_H -#define WATCHY_POKEMON_H - -#include -#include "pokemon.h" - -class WatchyPokemon : public Watchy{ - using Watchy::Watchy; - public: - void drawWatchFace(); -}; - +#ifndef WATCHY_POKEMON_H +#define WATCHY_POKEMON_H + +#include +#include "pokemon.h" + +class WatchyPokemon : public Watchy{ + using Watchy::Watchy; + public: + void drawWatchFace(); +}; + #endif \ No newline at end of file diff --git a/examples/WatchFaces/Pokemon/pokemon.h b/examples/WatchFaces/Pokemon/pokemon.h index 3b45f22..9e63126 100644 --- a/examples/WatchFaces/Pokemon/pokemon.h +++ b/examples/WatchFaces/Pokemon/pokemon.h @@ -1,315 +1,315 @@ -const unsigned char pokemon [] PROGMEM = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3f, 0xef, 0xfa, 0x06, 0xff, 0xbf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x02, - 0x06, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x03, 0x04, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x08, 0x01, 0x8c, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xcf, 0xf1, 0x8c, 0xff, 0x3f, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x08, 0x00, 0x50, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0xd0, 0x80, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3e, 0x8f, 0xa0, 0x30, 0xfa, 0x3e, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xef, 0xf8, 0x20, - 0xff, 0xbf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x83, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x42, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x63, 0x42, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, - 0x42, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc6, 0x23, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x07, 0xf2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x1a, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x08, 0x1a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x0a, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x4f, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x03, 0x07, 0x4f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, - 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x5d, 0xa1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, - 0x7b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0xdf, 0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x00, 0x00, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, - 0x4c, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1b, 0x10, 0x00, - 0x00, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4c, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x0d, 0x90, 0x00, 0x00, 0xbb, 0xfe, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, - 0xc8, 0x00, 0x00, 0xe7, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xe8, 0x00, 0x01, 0x3f, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0xe4, 0x00, 0x02, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x02, 0xf4, 0x66, 0x0d, 0xff, 0xe0, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, - 0x80, 0x00, 0x00, 0x01, 0xf6, 0x66, 0x07, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x01, 0x33, 0x89, 0xd7, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x00, 0x00, 0x01, 0x16, 0x00, 0x2f, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x01, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x02, 0x01, 0xf8, 0x1a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x01, 0x83, 0xf8, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x05, 0xc7, 0xe0, 0x12, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x19, 0x02, 0x27, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x02, 0xe7, 0x00, - 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x03, 0xef, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x03, - 0xef, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x03, 0xef, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x71, 0xcf, 0x03, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x1e, 0x04, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0xf8, 0x7e, 0x08, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf3, 0xff, 0x18, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3e, 0x03, 0xf1, 0x30, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0xff, 0xf0, - 0xf0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xff, 0xc0, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, - 0x00, 0x00, 0x60, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x08, 0x00, 0x00, 0x70, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x70, 0x01, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xd0, 0x00, 0x20, 0xf8, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x21, 0xf8, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x61, 0xf8, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x00, - 0xf1, 0xf8, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x81, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x07, 0x03, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x27, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xee, 0x7b, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x19, 0xf8, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x38, 0x19, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xf8, - 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xf0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x07, 0xe0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf1, 0xfc, 0x83, 0x02, 0x03, 0xe2, 0x06, 0x81, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, - 0x20, 0x84, 0x05, 0x06, 0x1a, 0x06, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0x20, 0x8c, 0x0d, 0x0c, 0x02, 0x06, 0x81, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xce, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x08, 0x20, 0x88, 0x05, 0x08, 0x02, 0x06, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xce, - 0x00, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x20, 0xb8, 0x18, 0x88, 0x03, - 0xfe, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc3, 0x80, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0x80, - 0x00, 0x00, 0x08, 0x00, 0x20, 0xe4, 0x1f, 0xc8, 0x02, 0x02, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xc3, 0x80, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x08, 0x00, 0x20, 0x82, 0x20, - 0x64, 0x0a, 0x06, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc1, 0xe0, 0x7f, 0x00, 0x00, 0x00, - 0x7f, 0x80, 0x00, 0x00, 0x08, 0x00, 0xf8, 0x81, 0x20, 0x63, 0xe2, 0x02, 0x3f, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x01, 0xc0, 0x70, 0x7f, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x08, 0x01, 0xf8, - 0x80, 0xa0, 0x21, 0xe2, 0x02, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x70, 0x7f, 0x00, - 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x1f, 0xe0, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, - 0x1f, 0xe0, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0f, 0x1f, 0xf8, 0x00, 0x0f, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0x03, 0x9c, 0x38, 0x00, 0x0e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x03, 0x9c, 0x38, 0x00, 0x0e, 0x1c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc3, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x80, 0xe3, 0xff, 0xff, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0xe3, 0xff, 0xff, - 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xc3, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0xe3, 0xff, 0xff, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf1, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xe7, - 0xe0, 0x01, 0xc0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf8, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xe7, 0xe0, 0x01, 0xc0, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, - 0x03, 0xe3, 0x00, 0x01, 0x80, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x03, 0xe3, 0x00, 0x01, 0x80, 0x1c, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, - 0x01, 0xf0, 0x7c, 0x7f, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x02, 0x4f, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x7c, 0x1c, 0x00, 0x00, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x07, 0x4f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, - 0x00, 0x00, 0x01, 0xc0, 0x7c, 0x1c, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x07, 0x5d, 0xa1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x70, 0x18, 0x00, - 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x07, 0xdf, 0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x70, 0x18, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x07, - 0x4c, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 0x00, 0x00, 0x01, 0xf0, 0x70, - 0x78, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x70, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, - 0x70, 0x70, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, - 0x00, 0x00, 0x0e, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, - 0x1f, 0x80, 0x08, 0x00, 0x0c, 0x1f, 0x80, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x3f, 0xc0, 0x10, 0x00, 0x1c, 0x3f, 0xc0, - 0xc0, 0x00, 0x00, 0x00, 0x7f, 0xe3, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1c, 0x38, 0xe0, 0x20, 0x00, 0x1c, 0x38, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x7f, 0xe3, 0x00, - 0x00, 0x00, 0x0e, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x38, 0xe0, 0x40, 0x00, 0x0c, - 0x38, 0xe0, 0xc0, 0x00, 0x00, 0x01, 0xff, 0x83, 0x80, 0x00, 0x00, 0x7e, 0x0c, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0c, 0x1f, 0xe0, 0x80, 0x00, 0x0c, 0x1f, 0xe0, 0xc0, 0x00, 0x00, 0x01, 0xff, - 0x83, 0x80, 0x00, 0x00, 0x7e, 0x0c, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xe1, 0x00, - 0x00, 0x0c, 0x00, 0xe0, 0xc0, 0x00, 0x00, 0x01, 0xff, 0x83, 0xe0, 0x00, 0x00, 0x3c, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x0e, 0xc0, 0x00, 0x00, 0x3f, 0x0e, 0xc0, 0xc0, 0x00, 0x00, - 0x01, 0xfe, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x9f, - 0x84, 0x00, 0x00, 0x7f, 0x9f, 0x80, 0xc0, 0x00, 0x00, 0x01, 0xfe, 0x0f, 0xfc, 0x00, 0x00, 0x00, - 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x7f, 0x9f, 0xff, 0xe0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x7f, 0x9f, 0xff, 0xe0, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0x9c, 0x1f, 0xf8, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x01, 0xf0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0x9c, - 0x07, 0xff, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0x9c, 0x07, 0xff, 0x00, 0x00, 0x03, 0xf8, 0x00, - 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x16, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x58, 0x37, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x37, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdc, 0x7f, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x61, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x61, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x86, 0x33, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x78, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb0, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, - 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x0f, 0xf9, 0xfc, 0x3e, 0x20, - 0x6f, 0xf8, 0x00, 0xf0, 0x33, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x34, 0x1c, 0x08, 0x00, 0x20, 0x61, 0xa0, 0x60, 0x80, 0x00, 0xb0, 0x2d, 0x00, 0x00, - 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x1e, 0x08, 0x00, 0x20, - 0xc0, 0x20, 0x60, 0x80, 0x00, 0xf0, 0x21, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x34, 0x1e, 0x08, 0x00, 0x20, 0x80, 0x20, 0x60, 0x80, 0x00, 0xf0, 0x21, - 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x1f, 0x0f, - 0xf0, 0x20, 0x8f, 0xbf, 0xe0, 0x80, 0x00, 0x85, 0xa1, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x1f, 0xc8, 0x00, 0x20, 0x81, 0xa0, 0x20, 0x80, 0x00, - 0x85, 0xa2, 0x60, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, - 0x1f, 0x08, 0x00, 0x20, 0x41, 0xa0, 0x60, 0x80, 0x00, 0x07, 0x03, 0x20, 0x00, 0xd0, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x1f, 0x08, 0x00, 0xf8, 0x3f, 0x20, 0x20, - 0x80, 0x00, 0x07, 0x03, 0xe0, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x34, 0x1e, 0x08, 0x01, 0xf8, 0x1e, 0x20, 0x20, 0x80, 0x00, 0x05, 0x82, 0xe0, 0x00, 0xd0, - 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x1c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x82, 0x60, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x50, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x07, - 0xe3, 0xfe, 0xff, 0xa0, 0x60, 0x00, 0x00, 0xff, 0x20, 0x28, 0x08, 0xd0, 0x34, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x80, 0x20, 0x80, 0x30, 0xe0, 0x00, 0x00, - 0x80, 0xa0, 0x2c, 0x08, 0x50, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, - 0x00, 0x00, 0x80, 0x20, 0x80, 0x30, 0xe0, 0x00, 0x00, 0x80, 0xa0, 0x2c, 0x08, 0x50, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x80, 0x20, 0x80, 0x25, 0x20, - 0x00, 0x00, 0x81, 0xa0, 0x29, 0x18, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x34, 0x00, 0x00, 0x80, 0x20, 0xfe, 0x22, 0x20, 0x00, 0x00, 0xff, 0x20, 0x68, 0x98, 0x50, - 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x80, 0x20, 0x80, - 0x20, 0x20, 0x00, 0x00, 0x84, 0x20, 0x68, 0x48, 0x50, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x80, 0x20, 0x80, 0x20, 0x20, 0x00, 0x00, 0x82, 0x10, 0x68, - 0x38, 0x50, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x03, 0xe0, - 0x20, 0xee, 0x20, 0x60, 0x00, 0x00, 0x81, 0x06, 0xe8, 0x18, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x07, 0xe0, 0x20, 0xff, 0xa0, 0x20, 0x00, 0x00, 0x80, - 0x87, 0xe8, 0x08, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0d, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb0, 0x17, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xe5, 0x80, 0x00, 0xf2, - 0x80, 0x03, 0xf8, 0x00, 0x1e, 0x10, 0x01, 0x18, 0x37, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x37, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x5c, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x82, 0x33, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x1a, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x7f, 0xff, 0xd0, 0x60, 0x04, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; +const unsigned char pokemon [] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xef, 0xfa, 0x06, 0xff, 0xbf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x02, + 0x06, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x03, 0x04, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x01, 0x8c, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xcf, 0xf1, 0x8c, 0xff, 0x3f, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x08, 0x00, 0x50, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0xd0, 0x80, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3e, 0x8f, 0xa0, 0x30, 0xfa, 0x3e, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xef, 0xf8, 0x20, + 0xff, 0xbf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x83, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x42, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x63, 0x42, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, + 0x42, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc6, 0x23, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x07, 0xf2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x1a, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x08, 0x1a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x0a, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x4f, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x07, 0x4f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x5d, 0xa1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, + 0x7b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0xdf, 0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x00, 0x00, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, + 0x4c, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1b, 0x10, 0x00, + 0x00, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4c, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x0d, 0x90, 0x00, 0x00, 0xbb, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, + 0xc8, 0x00, 0x00, 0xe7, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xe8, 0x00, 0x01, 0x3f, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0xe4, 0x00, 0x02, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x02, 0xf4, 0x66, 0x0d, 0xff, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x80, 0x00, 0x00, 0x01, 0xf6, 0x66, 0x07, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x01, 0x33, 0x89, 0xd7, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x00, 0x00, 0x01, 0x16, 0x00, 0x2f, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x01, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x02, 0x01, 0xf8, 0x1a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x01, 0x83, 0xf8, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x05, 0xc7, 0xe0, 0x12, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x19, 0x02, 0x27, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x02, 0xe7, 0x00, + 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x03, 0xef, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x03, + 0xef, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x03, 0xef, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x71, 0xcf, 0x03, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x1e, 0x04, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0xf8, 0x7e, 0x08, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf3, 0xff, 0x18, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3e, 0x03, 0xf1, 0x30, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0xff, 0xf0, + 0xf0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xff, 0xc0, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x00, 0x60, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x08, 0x00, 0x00, 0x70, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x70, 0x01, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xd0, 0x00, 0x20, 0xf8, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x21, 0xf8, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x61, 0xf8, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x00, + 0xf1, 0xf8, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x81, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x07, 0x03, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x27, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xee, 0x7b, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x19, 0xf8, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x19, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xf8, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xf0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xe0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf1, 0xfc, 0x83, 0x02, 0x03, 0xe2, 0x06, 0x81, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x20, 0x84, 0x05, 0x06, 0x1a, 0x06, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0x20, 0x8c, 0x0d, 0x0c, 0x02, 0x06, 0x81, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xce, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x08, 0x08, 0x20, 0x88, 0x05, 0x08, 0x02, 0x06, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xce, + 0x00, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x20, 0xb8, 0x18, 0x88, 0x03, + 0xfe, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc3, 0x80, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0x80, + 0x00, 0x00, 0x08, 0x00, 0x20, 0xe4, 0x1f, 0xc8, 0x02, 0x02, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xc3, 0x80, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x08, 0x00, 0x20, 0x82, 0x20, + 0x64, 0x0a, 0x06, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc1, 0xe0, 0x7f, 0x00, 0x00, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0x08, 0x00, 0xf8, 0x81, 0x20, 0x63, 0xe2, 0x02, 0x3f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x70, 0x7f, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x08, 0x01, 0xf8, + 0x80, 0xa0, 0x21, 0xe2, 0x02, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x70, 0x7f, 0x00, + 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x1f, 0xe0, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, + 0x1f, 0xe0, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0f, 0x1f, 0xf8, 0x00, 0x0f, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x03, 0x9c, 0x38, 0x00, 0x0e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x03, 0x9c, 0x38, 0x00, 0x0e, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc3, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x80, 0xe3, 0xff, 0xff, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0xe3, 0xff, 0xff, + 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xc3, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0xe3, 0xff, 0xff, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf1, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xe7, + 0xe0, 0x01, 0xc0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xe7, 0xe0, 0x01, 0xc0, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x03, 0xe3, 0x00, 0x01, 0x80, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x03, 0xe3, 0x00, 0x01, 0x80, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x01, 0xf0, 0x7c, 0x7f, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x02, 0x4f, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x7c, 0x1c, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x07, 0x4f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, + 0x00, 0x00, 0x01, 0xc0, 0x7c, 0x1c, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x07, 0x5d, 0xa1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x70, 0x18, 0x00, + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x07, 0xdf, 0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x70, 0x18, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x07, + 0x4c, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 0x00, 0x00, 0x01, 0xf0, 0x70, + 0x78, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x70, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x70, 0x70, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x0e, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x1f, 0x80, 0x08, 0x00, 0x0c, 0x1f, 0x80, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x3f, 0xc0, 0x10, 0x00, 0x1c, 0x3f, 0xc0, + 0xc0, 0x00, 0x00, 0x00, 0x7f, 0xe3, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x38, 0xe0, 0x20, 0x00, 0x1c, 0x38, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x7f, 0xe3, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x38, 0xe0, 0x40, 0x00, 0x0c, + 0x38, 0xe0, 0xc0, 0x00, 0x00, 0x01, 0xff, 0x83, 0x80, 0x00, 0x00, 0x7e, 0x0c, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x1f, 0xe0, 0x80, 0x00, 0x0c, 0x1f, 0xe0, 0xc0, 0x00, 0x00, 0x01, 0xff, + 0x83, 0x80, 0x00, 0x00, 0x7e, 0x0c, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xe1, 0x00, + 0x00, 0x0c, 0x00, 0xe0, 0xc0, 0x00, 0x00, 0x01, 0xff, 0x83, 0xe0, 0x00, 0x00, 0x3c, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x0e, 0xc0, 0x00, 0x00, 0x3f, 0x0e, 0xc0, 0xc0, 0x00, 0x00, + 0x01, 0xfe, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x9f, + 0x84, 0x00, 0x00, 0x7f, 0x9f, 0x80, 0xc0, 0x00, 0x00, 0x01, 0xfe, 0x0f, 0xfc, 0x00, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x7f, 0x9f, 0xff, 0xe0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x7f, 0x9f, 0xff, 0xe0, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0x9c, 0x1f, 0xf8, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x01, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0x9c, + 0x07, 0xff, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0x9c, 0x07, 0xff, 0x00, 0x00, 0x03, 0xf8, 0x00, + 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, + 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x16, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x58, 0x37, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x37, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdc, 0x7f, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x61, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x61, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x86, 0x33, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x78, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb0, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x0f, 0xf9, 0xfc, 0x3e, 0x20, + 0x6f, 0xf8, 0x00, 0xf0, 0x33, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x34, 0x1c, 0x08, 0x00, 0x20, 0x61, 0xa0, 0x60, 0x80, 0x00, 0xb0, 0x2d, 0x00, 0x00, + 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x1e, 0x08, 0x00, 0x20, + 0xc0, 0x20, 0x60, 0x80, 0x00, 0xf0, 0x21, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x34, 0x1e, 0x08, 0x00, 0x20, 0x80, 0x20, 0x60, 0x80, 0x00, 0xf0, 0x21, + 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x1f, 0x0f, + 0xf0, 0x20, 0x8f, 0xbf, 0xe0, 0x80, 0x00, 0x85, 0xa1, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x1f, 0xc8, 0x00, 0x20, 0x81, 0xa0, 0x20, 0x80, 0x00, + 0x85, 0xa2, 0x60, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, + 0x1f, 0x08, 0x00, 0x20, 0x41, 0xa0, 0x60, 0x80, 0x00, 0x07, 0x03, 0x20, 0x00, 0xd0, 0x34, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x1f, 0x08, 0x00, 0xf8, 0x3f, 0x20, 0x20, + 0x80, 0x00, 0x07, 0x03, 0xe0, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x34, 0x1e, 0x08, 0x01, 0xf8, 0x1e, 0x20, 0x20, 0x80, 0x00, 0x05, 0x82, 0xe0, 0x00, 0xd0, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x82, 0x60, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x07, + 0xe3, 0xfe, 0xff, 0xa0, 0x60, 0x00, 0x00, 0xff, 0x20, 0x28, 0x08, 0xd0, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x80, 0x20, 0x80, 0x30, 0xe0, 0x00, 0x00, + 0x80, 0xa0, 0x2c, 0x08, 0x50, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, + 0x00, 0x00, 0x80, 0x20, 0x80, 0x30, 0xe0, 0x00, 0x00, 0x80, 0xa0, 0x2c, 0x08, 0x50, 0x34, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x80, 0x20, 0x80, 0x25, 0x20, + 0x00, 0x00, 0x81, 0xa0, 0x29, 0x18, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x34, 0x00, 0x00, 0x80, 0x20, 0xfe, 0x22, 0x20, 0x00, 0x00, 0xff, 0x20, 0x68, 0x98, 0x50, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x80, 0x20, 0x80, + 0x20, 0x20, 0x00, 0x00, 0x84, 0x20, 0x68, 0x48, 0x50, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x80, 0x20, 0x80, 0x20, 0x20, 0x00, 0x00, 0x82, 0x10, 0x68, + 0x38, 0x50, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x03, 0xe0, + 0x20, 0xee, 0x20, 0x60, 0x00, 0x00, 0x81, 0x06, 0xe8, 0x18, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x07, 0xe0, 0x20, 0xff, 0xa0, 0x20, 0x00, 0x00, 0x80, + 0x87, 0xe8, 0x08, 0xd0, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0d, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb0, 0x17, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xe5, 0x80, 0x00, 0xf2, + 0x80, 0x03, 0xf8, 0x00, 0x1e, 0x10, 0x01, 0x18, 0x37, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x37, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x5c, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x82, 0x33, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x1a, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x7f, 0xff, 0xd0, 0x60, 0x04, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; diff --git a/examples/WatchFaces/StarryHorizon/StarryHorizon.ino b/examples/WatchFaces/StarryHorizon/StarryHorizon.ino index f165405..8ff3562 100644 --- a/examples/WatchFaces/StarryHorizon/StarryHorizon.ino +++ b/examples/WatchFaces/StarryHorizon/StarryHorizon.ino @@ -1,151 +1,151 @@ -// STARRY HORIZON for Watchy by SQFMI -// Copyright 2021 Dan Delany dan.delany@gmail.com -// Released under free MIT License : https://github.com/dandelany/watchy-faces/blob/main/LICENSE - -#include //include the Watchy library -#include //include any fonts you want to use -#include "MadeSunflower39pt7b.h" -#include "stars.h" -#include "settings.h" - -#define STAR_COUNT 900 - -const int horizonY = 150; -const int planetR = 650; - -struct xyPoint { - int x; - int y; -}; - -//Star myStars[STAR_COUNT]; -void initStars() { - // The random star field is loaded from PROGMEM - see stars.h - // this is the function that was used to generate the stars in stars.h - // it does not run normally but can be used to re-generate stars with different parameters - // tweak as needed, call this function in init, open serial monitor, and paste the results into stars.h - srand(5287); // randomSeed() is not stable on ESP32, use srand - printf("const Star STARS[] PROGMEM = {\n"); - for(int i = 0; i < STAR_COUNT; i++) { - int starX = (rand() % 260) - 30; - int starY = (rand() % 260) - 30; - int radius = 0; - if (i > STAR_COUNT * 0.99) radius = 2; - else if (i > STAR_COUNT * 0.80) radius = 1; - printf(" { %d, %d, %d },\n", starX, starY, radius); -// myStars[i] = { starX, starY, radius }; - } - printf("};\n"); -} - -struct xyPoint rotatePointAround(int x, int y, int ox, int oy, double angle) { - // rotate X,Y point around given origin point by a given angle - // based on https://gist.github.com/LyleScott/e36e08bfb23b1f87af68c9051f985302#file-rotate_2d_point-py-L38 - double qx = (double)ox + (cos(angle) * (double)(x - ox)) + (sin(angle) * (double)(y - oy)); - double qy = (double)oy + (-sin(angle) * (double)(x - ox)) + (cos(angle) * (double)(y - oy)); - struct xyPoint newPoint; - newPoint.x = (int)qx; - newPoint.y = (int)qy; - return newPoint; -} - -class StarryHorizon : public Watchy { - public: - StarryHorizon(const watchySettings& s) : Watchy(s) { - // uncomment to re-generate stars - // initStars(); - } - void drawWatchFace(){ - display.fillScreen(GxEPD_BLACK); - display.fillCircle(100, horizonY + planetR, planetR, GxEPD_WHITE); - drawGrid(); - drawStars(STARS); - drawTime(); - drawDate(); - } - void drawGrid() { - int prevY = horizonY; - for(int i = 0; i < 40; i+= 1) { - int y = prevY + int(abs(sin(double(i) / 10) * 10)); - if(y <= 200) { - display.drawFastHLine(0, y, 200, GxEPD_BLACK); - } - prevY = y; - } - int vanishY = horizonY - 25; - for (int x = -230; x < 430; x += 20) { - display.drawLine(x, 200, 100, vanishY, GxEPD_BLACK); - } - } - void drawStars(const Star stars[]) { - // draw field of stars - // rotate stars so that they make an entire revolution once per hour - int minute = (int)currentTime.Minute; - double minuteAngle = ((2.0 * M_PI) / 60.0) * (double)minute; -// printf("Minute %d, angle %f\n", (int)currentTime.Minute, minuteAngle); - - for(int starI = 0; starI < STAR_COUNT; starI++) { - int starX = stars[starI].x; - int starY = stars[starI].y; - int starR = stars[starI].r; - - struct xyPoint rotated = rotatePointAround(starX, starY, 100, 100, minuteAngle); - if(rotated.x < 0 || rotated.y < 0 || rotated.x > 200 || rotated.y > horizonY) { - continue; - } - if(starR == 0) { - display.drawPixel(rotated.x, rotated.y, GxEPD_WHITE); - } else { - display.fillCircle(rotated.x, rotated.y, starR, GxEPD_WHITE); - } - } - } - void drawTime() { - display.setFont(&MADE_Sunflower_PERSONAL_USE39pt7b); - display.setTextColor(GxEPD_WHITE); - display.setTextWrap(false); - char* timeStr; - asprintf(&timeStr, "%d:%02d", currentTime.Hour, currentTime.Minute); - drawCenteredString(timeStr, 100, 115, false); - free(timeStr); - } - - void drawDate() { - String monthStr = monthShortStr(currentTime.Month); - String dayOfWeek = dayShortStr(currentTime.Wday); - display.setFont(&FreeSansBold9pt7b); - display.setTextColor(GxEPD_WHITE); - display.setTextWrap(false); - char* dateStr; - asprintf(&dateStr, "%s %s %d", dayOfWeek.c_str(), monthStr.c_str(), currentTime.Day); - drawCenteredString(dateStr, 100, 140, true); - free(dateStr); - } - - void drawCenteredString(const String &str, int x, int y, bool drawBg) { - int16_t x1, y1; - uint16_t w, h; - - display.getTextBounds(str, x, y, &x1, &y1, &w, &h); -// printf("bounds: %d x %d y, %d x1 %d y1, %d w, %d h\n", 0, 100, x1, y1, w, h); - display.setCursor(x - w / 2, y); - if(drawBg) { - int padY = 3; - int padX = 10; - display.fillRect(x - (w / 2 + padX), y - (h + padY), w + padX*2, h + padY*2, GxEPD_BLACK); - } - // uncomment to draw bounding box -// display.drawRect(x - w / 2, y - h, w, h, GxEPD_WHITE); - display.print(str); - } -}; - -StarryHorizon face(settings); //instantiate watchface - -void setup() { - face.init(); //call init in setup -} - -void loop() { - // this should never run, Watchy deep sleeps after init(); -} +// STARRY HORIZON for Watchy by SQFMI +// Copyright 2021 Dan Delany dan.delany@gmail.com +// Released under free MIT License : https://github.com/dandelany/watchy-faces/blob/main/LICENSE + +#include //include the Watchy library +#include //include any fonts you want to use +#include "MadeSunflower39pt7b.h" +#include "stars.h" +#include "settings.h" + +#define STAR_COUNT 900 + +const int horizonY = 150; +const int planetR = 650; + +struct xyPoint { + int x; + int y; +}; + +//Star myStars[STAR_COUNT]; +void initStars() { + // The random star field is loaded from PROGMEM - see stars.h + // this is the function that was used to generate the stars in stars.h + // it does not run normally but can be used to re-generate stars with different parameters + // tweak as needed, call this function in init, open serial monitor, and paste the results into stars.h + srand(5287); // randomSeed() is not stable on ESP32, use srand + printf("const Star STARS[] PROGMEM = {\n"); + for(int i = 0; i < STAR_COUNT; i++) { + int starX = (rand() % 260) - 30; + int starY = (rand() % 260) - 30; + int radius = 0; + if (i > STAR_COUNT * 0.99) radius = 2; + else if (i > STAR_COUNT * 0.80) radius = 1; + printf(" { %d, %d, %d },\n", starX, starY, radius); +// myStars[i] = { starX, starY, radius }; + } + printf("};\n"); +} + +struct xyPoint rotatePointAround(int x, int y, int ox, int oy, double angle) { + // rotate X,Y point around given origin point by a given angle + // based on https://gist.github.com/LyleScott/e36e08bfb23b1f87af68c9051f985302#file-rotate_2d_point-py-L38 + double qx = (double)ox + (cos(angle) * (double)(x - ox)) + (sin(angle) * (double)(y - oy)); + double qy = (double)oy + (-sin(angle) * (double)(x - ox)) + (cos(angle) * (double)(y - oy)); + struct xyPoint newPoint; + newPoint.x = (int)qx; + newPoint.y = (int)qy; + return newPoint; +} + +class StarryHorizon : public Watchy { + public: + StarryHorizon(const watchySettings& s) : Watchy(s) { + // uncomment to re-generate stars + // initStars(); + } + void drawWatchFace(){ + display.fillScreen(GxEPD_BLACK); + display.fillCircle(100, horizonY + planetR, planetR, GxEPD_WHITE); + drawGrid(); + drawStars(STARS); + drawTime(); + drawDate(); + } + void drawGrid() { + int prevY = horizonY; + for(int i = 0; i < 40; i+= 1) { + int y = prevY + int(abs(sin(double(i) / 10) * 10)); + if(y <= 200) { + display.drawFastHLine(0, y, 200, GxEPD_BLACK); + } + prevY = y; + } + int vanishY = horizonY - 25; + for (int x = -230; x < 430; x += 20) { + display.drawLine(x, 200, 100, vanishY, GxEPD_BLACK); + } + } + void drawStars(const Star stars[]) { + // draw field of stars + // rotate stars so that they make an entire revolution once per hour + int minute = (int)currentTime.Minute; + double minuteAngle = ((2.0 * M_PI) / 60.0) * (double)minute; +// printf("Minute %d, angle %f\n", (int)currentTime.Minute, minuteAngle); + + for(int starI = 0; starI < STAR_COUNT; starI++) { + int starX = stars[starI].x; + int starY = stars[starI].y; + int starR = stars[starI].r; + + struct xyPoint rotated = rotatePointAround(starX, starY, 100, 100, minuteAngle); + if(rotated.x < 0 || rotated.y < 0 || rotated.x > 200 || rotated.y > horizonY) { + continue; + } + if(starR == 0) { + display.drawPixel(rotated.x, rotated.y, GxEPD_WHITE); + } else { + display.fillCircle(rotated.x, rotated.y, starR, GxEPD_WHITE); + } + } + } + void drawTime() { + display.setFont(&MADE_Sunflower_PERSONAL_USE39pt7b); + display.setTextColor(GxEPD_WHITE); + display.setTextWrap(false); + char* timeStr; + asprintf(&timeStr, "%d:%02d", currentTime.Hour, currentTime.Minute); + drawCenteredString(timeStr, 100, 115, false); + free(timeStr); + } + + void drawDate() { + String monthStr = monthShortStr(currentTime.Month); + String dayOfWeek = dayShortStr(currentTime.Wday); + display.setFont(&FreeSansBold9pt7b); + display.setTextColor(GxEPD_WHITE); + display.setTextWrap(false); + char* dateStr; + asprintf(&dateStr, "%s %s %d", dayOfWeek.c_str(), monthStr.c_str(), currentTime.Day); + drawCenteredString(dateStr, 100, 140, true); + free(dateStr); + } + + void drawCenteredString(const String &str, int x, int y, bool drawBg) { + int16_t x1, y1; + uint16_t w, h; + + display.getTextBounds(str, x, y, &x1, &y1, &w, &h); +// printf("bounds: %d x %d y, %d x1 %d y1, %d w, %d h\n", 0, 100, x1, y1, w, h); + display.setCursor(x - w / 2, y); + if(drawBg) { + int padY = 3; + int padX = 10; + display.fillRect(x - (w / 2 + padX), y - (h + padY), w + padX*2, h + padY*2, GxEPD_BLACK); + } + // uncomment to draw bounding box +// display.drawRect(x - w / 2, y - h, w, h, GxEPD_WHITE); + display.print(str); + } +}; + +StarryHorizon face(settings); //instantiate watchface + +void setup() { + face.init(); //call init in setup +} + +void loop() { + // this should never run, Watchy deep sleeps after init(); +} diff --git a/extras/WatchFaces/index.json b/extras/WatchFaces/index.json index eac34dd..2b403f5 100644 --- a/extras/WatchFaces/index.json +++ b/extras/WatchFaces/index.json @@ -1,76 +1,76 @@ -{ - "watchfaces" : [ - { - "id" : "1", - "name" : "Basic", - "author" : "SQFMI", - "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/1_Basic.png", - "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/Basic", - "version" : "1.0.0" - }, - { - "id" : "2", - "name" : "7_SEG", - "author" : "SQFMI", - "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/2_7_SEG.png", - "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/7_SEG", - "version" : "1.0.0" - }, - { - "id" : "2A", - "name" : "7_SEG_LIGHT", - "author" : "SQFMI", - "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/2_7_SEG_LIGHT.png", - "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/7_SEG", - "version" : "1.0.0" - }, - { - "id" : "3", - "name" : "DOS", - "author" : "SQFMI", - "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/3_DOS.png", - "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/DOS", - "version" : "1.0.0" - }, - { - "id" : "4", - "name" : "Pokemon", - "author" : "SQFMI", - "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/4_Pokemon.png", - "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/Pokemon", - "version" : "1.0.0" - }, - { - "id" : "5", - "name" : "StarryHorizon", - "author" : "dandelany", - "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/5_StarryHorizon.png", - "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/StarryHorizon", - "version" : "1.0.0" - }, - { - "id" : "6", - "name" : "Tetris", - "author" : "SQFMI", - "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/6_Tetris.png", - "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/Tetris", - "version" : "1.0.0" - }, - { - "id" : "7", - "name" : "MacPaint", - "author" : "SQFMI", - "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/7_MacPaint.png", - "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/MacPaint", - "version" : "1.0.0" - }, - { - "id" : "8", - "name" : "Bahn", - "author" : "BraininaBowl", - "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/8_Bahn.png", - "source" : "https://github.com/BraininaBowl/Bahn-for-Watchy", - "version" : "1.0.0" - } - ] -} +{ + "watchfaces" : [ + { + "id" : "1", + "name" : "Basic", + "author" : "SQFMI", + "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/1_Basic.png", + "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/Basic", + "version" : "1.0.0" + }, + { + "id" : "2", + "name" : "7_SEG", + "author" : "SQFMI", + "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/2_7_SEG.png", + "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/7_SEG", + "version" : "1.0.0" + }, + { + "id" : "2A", + "name" : "7_SEG_LIGHT", + "author" : "SQFMI", + "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/2_7_SEG_LIGHT.png", + "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/7_SEG", + "version" : "1.0.0" + }, + { + "id" : "3", + "name" : "DOS", + "author" : "SQFMI", + "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/3_DOS.png", + "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/DOS", + "version" : "1.0.0" + }, + { + "id" : "4", + "name" : "Pokemon", + "author" : "SQFMI", + "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/4_Pokemon.png", + "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/Pokemon", + "version" : "1.0.0" + }, + { + "id" : "5", + "name" : "StarryHorizon", + "author" : "dandelany", + "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/5_StarryHorizon.png", + "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/StarryHorizon", + "version" : "1.0.0" + }, + { + "id" : "6", + "name" : "Tetris", + "author" : "SQFMI", + "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/6_Tetris.png", + "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/Tetris", + "version" : "1.0.0" + }, + { + "id" : "7", + "name" : "MacPaint", + "author" : "SQFMI", + "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/7_MacPaint.png", + "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/MacPaint", + "version" : "1.0.0" + }, + { + "id" : "8", + "name" : "Bahn", + "author" : "BraininaBowl", + "screenshot" : "https://raw.githubusercontent.com/sqfmi/Watchy/master/extras/WatchFaces/8_Bahn.png", + "source" : "https://github.com/BraininaBowl/Bahn-for-Watchy", + "version" : "1.0.0" + } + ] +} diff --git a/library.json b/library.json index ea2804d..d512a9c 100644 --- a/library.json +++ b/library.json @@ -19,11 +19,11 @@ { "name": "Adafruit GFX Library" }, { "name": "Arduino_JSON" }, { "name": "DS3232RTC" }, - { + { "name": "Rtc_Pcf8563", "version": "https://github.com/orbitalair/Rtc_Pcf8563.git#master" }, - { + { "name": "GxEPD2" "version": "https://github.com/ZinggJM/GxEPD2.git#master" }, diff --git a/library.properties b/library.properties index c8a2fb0..65e68df 100644 --- a/library.properties +++ b/library.properties @@ -1,10 +1,10 @@ -name=Watchy -version=1.3.1 -author=SQFMI -maintainer=SQFMI -sentence=Watchy - An Open Source E-Paper Watch by SQFMI -paragraph=This library contains drivers and code samples for Watchy -category=Other -url=https://watchy.sqfmi.com -architectures=esp32 -depends=Adafruit GFX Library,Arduino_JSON,DS3232RTC,Rtc_Pcf8563,GxEPD2,WiFiManager +name=Watchy +version=1.3.1 +author=SQFMI +maintainer=SQFMI +sentence=Watchy - An Open Source E-Paper Watch by SQFMI +paragraph=This library contains drivers and code samples for Watchy +category=Other +url=https://watchy.sqfmi.com +architectures=esp32 +depends=Adafruit GFX Library,Arduino_JSON,DS3232RTC,Rtc_Pcf8563,GxEPD2,WiFiManager diff --git a/src/DSEG7_Classic_Bold_53.h b/src/DSEG7_Classic_Bold_53.h index ad43b8c..107aef2 100644 --- a/src/DSEG7_Classic_Bold_53.h +++ b/src/DSEG7_Classic_Bold_53.h @@ -1,199 +1,199 @@ -// Created by http://oleddisplay.squix.ch/ Consider a donation -// In case of problems make sure that you are using the font file with the correct version! -const uint8_t DSEG7_Classic_Bold_53Bitmaps[] PROGMEM = { - - // Bitmap Data: - 0x00, // ' ' - 0x00, // '!' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '"' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '#' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '$' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '%' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '&' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // ''' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '(' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // ')' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '*' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '+' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // ',' - 0x1F,0xFF,0xFC,0x0F,0xFF,0xFF,0x87,0xFF,0xFF,0xF3,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0x0F,0xFF,0xFF,0x81,0xFF,0xFF,0xC0, // '-' - 0x00,0xF3,0xF7,0xEF,0xDF,0x9E,0x00, // '.' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '/' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF0,0x00,0x00,0x7E,0xF8,0x00,0x00,0x0F,0xBC,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0xF8,0x00,0x00,0x0F,0xBF,0x00,0x00,0x07,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xDF,0xFF,0xFD,0xFB,0xEF,0xFF,0xFF,0xBE,0xF7,0xFF,0xFF,0xF7,0x9B,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // '0' - 0x00,0x0C,0x1E,0x3E,0x7E,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x7E,0x3E,0x1E,0x00,0x1E,0x3E,0x7E,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x7E,0x3E,0x1E,0x0C,0x00, // '1' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC0,0x3F,0xFF,0xFF,0xEC,0x07,0xFF,0xFF,0xF7,0x80,0xFF,0xFF,0xFB,0xE0,0x1F,0xFF,0xFD,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x07,0xFF,0xFF,0x7E,0x03,0xFF,0xFF,0xEF,0x81,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0x3F,0x7F,0xFF,0xF0,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xDF,0xFF,0xFC,0x03,0xEF,0xFF,0xFF,0x80,0xF7,0xFF,0xFF,0xF0,0x1B,0xFF,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // '2' - 0x7F,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF,0xC3,0xFF,0xFF,0xFF,0x83,0xFF,0xFF,0xFE,0xC3,0xFF,0xFF,0xFB,0xC3,0xFF,0xFF,0xEF,0x83,0xFF,0xFF,0xBF,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,0x03,0xF8,0x00,0x00,0x07,0xF0,0x00,0x00,0x0F,0xE0,0x00,0x00,0x1F,0xC0,0x00,0x00,0x3F,0x80,0x00,0x00,0x7F,0x07,0xFF,0xFF,0x7E,0x1F,0xFF,0xFF,0x7C,0x7F,0xFF,0xFF,0x79,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFD,0xE1,0xFF,0xFF,0xF7,0xC1,0xFF,0xFF,0xDF,0x80,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,0x03,0xF8,0x00,0x00,0x07,0xF0,0x00,0x00,0x0F,0xE0,0x00,0x00,0x1F,0xC0,0x00,0x00,0x3F,0x83,0xFF,0xFF,0xBF,0x0F,0xFF,0xFF,0xBE,0x3F,0xFF,0xFF,0xBC,0xFF,0xFF,0xFF,0xB3,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFC,0x00, // '3' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xFD,0xE0,0x3F,0xFF,0xFE,0xF8,0x07,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, // '4' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x3E,0xFF,0xFF,0xF8,0x0F,0xDF,0xFF,0xFC,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF7,0xFF,0xFF,0x00,0xFB,0xFF,0xFF,0xE0,0x3D,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0x80,0x1F,0xFF,0xFF,0xDE,0x03,0xFF,0xFF,0xEF,0x80,0x7F,0xFF,0xF7,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x1F,0xFF,0xFD,0xF8,0x0F,0xFF,0xFF,0xBE,0x07,0xFF,0xFF,0xF7,0x83,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // '5' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x3E,0xFF,0xFF,0xF8,0x0F,0xDF,0xFF,0xFC,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF7,0xFF,0xFF,0x00,0xFB,0xFF,0xFF,0xE0,0x3D,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xDE,0xFB,0xFF,0xFF,0xEF,0xBF,0x7F,0xFF,0xF7,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xDF,0xFF,0xFD,0xFB,0xEF,0xFF,0xFF,0xBE,0xF7,0xFF,0xFF,0xF7,0x9B,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // '6' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF0,0x00,0x00,0x7E,0xF8,0x00,0x00,0x0F,0xBC,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x07,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // '7' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xDE,0xFB,0xFF,0xFF,0xEF,0xBF,0x7F,0xFF,0xF7,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xDF,0xFF,0xFD,0xFB,0xEF,0xFF,0xFF,0xBE,0xF7,0xFF,0xFF,0xF7,0x9B,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // '8' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x80,0x1F,0xFF,0xFF,0xDE,0x03,0xFF,0xFF,0xEF,0x80,0x7F,0xFF,0xF7,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x1F,0xFF,0xFD,0xF8,0x0F,0xFF,0xFF,0xBE,0x07,0xFF,0xFF,0xF7,0x83,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // '9' - 0x38,0x7C,0xFC,0xFE,0xFC,0x7C,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xFC,0xFE,0xFE,0xFC,0x7C, // ':' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // ';' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '<' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '=' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '>' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '?' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '@' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xDE,0xFB,0xFF,0xFF,0xEF,0xBF,0x7F,0xFF,0xF7,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xC0,0x00,0x01,0xFB,0xE0,0x00,0x00,0x3E,0xF0,0x00,0x00,0x07,0x98,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'A' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x7F,0xFF,0xF0,0x0F,0xBF,0xFF,0xFE,0x03,0xDF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'B' - 0x01,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x7F,0xFF,0xF7,0xE0,0x3F,0xFF,0xFE,0xF8,0x1F,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'D' - 0x0F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x6F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'E' - 0x0F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x6F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 'F' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x3E,0xFF,0xFF,0xF8,0x0F,0xDF,0xFF,0xFC,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0xF8,0x00,0x00,0x0F,0xBF,0x00,0x00,0x07,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xDF,0xFF,0xFD,0xFB,0xEF,0xFF,0xFF,0xBE,0xF7,0xFF,0xFF,0xF7,0x9B,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // 'G' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x7F,0xFF,0xF0,0x0F,0xBF,0xFF,0xFE,0x03,0xDF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFC,0x00,0x00,0x1F,0xBE,0x00,0x00,0x03,0xEF,0x00,0x00,0x00,0x79,0x80,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, // 'H' - 0x1E,0x3E,0x7E,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x7E,0x3E,0x1E,0x0C,0x00, // 'I' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x07,0xE0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x01,0xEF,0x80,0x00,0x00,0xFB,0xF0,0x00,0x00,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'J' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x3E,0xFF,0xFF,0xF8,0x0F,0xDF,0xFF,0xFC,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF7,0xFF,0xFF,0x00,0xFB,0xFF,0xFF,0xE0,0x3D,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xDE,0xFB,0xFF,0xFF,0xEF,0xBF,0x7F,0xFF,0xF7,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xC0,0x00,0x01,0xFB,0xE0,0x00,0x00,0x3E,0xF0,0x00,0x00,0x07,0x98,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'K' - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'L' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF0,0x00,0x00,0x7E,0xF8,0x00,0x00,0x0F,0xBC,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0xF8,0x00,0x00,0x0F,0xBF,0x00,0x00,0x07,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xC0,0x00,0x01,0xFB,0xE0,0x00,0x00,0x3E,0xF0,0x00,0x00,0x07,0x98,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'M' - 0x01,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0xF8,0x00,0x7F,0xFF,0xFF,0x00,0x3F,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF0,0x00,0x00,0x7E,0xF8,0x00,0x00,0x0F,0xBC,0x00,0x00,0x01,0xE6,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00, // 'N' - 0x01,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0xF8,0x00,0x7F,0xFF,0xFF,0x00,0x3F,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE6,0xFF,0xFF,0xFF,0xB0,0x7F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFE,0x00, // 'O' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0x3F,0x7F,0xFF,0xF0,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 'P' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x80,0x1F,0xFF,0xFF,0xDE,0x03,0xFF,0xFF,0xEF,0x80,0x7F,0xFF,0xF7,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'Q' - 0x01,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0x80,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0xF7,0xFF,0xFF,0xF3,0xEF,0xFF,0xFF,0x8F,0xDF,0xFF,0xFC,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x00,0x00,0x00,0xF8,0x00,0x00,0x03,0xC0,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 'R' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x7F,0xFF,0xF0,0x0F,0xBF,0xFF,0xFE,0x03,0xDF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xFD,0xE0,0x3F,0xFF,0xFE,0xF8,0x07,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x01,0xFF,0xFF,0xDF,0x80,0xFF,0xFF,0xFB,0xE0,0x7F,0xFF,0xFF,0x78,0x3F,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'S' - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'T' - 0xF0,0x00,0x00,0x07,0xBE,0x00,0x00,0x03,0xEF,0xC0,0x00,0x01,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE6,0xFF,0xFF,0xFF,0xB0,0x7F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFE,0x00, // 'U' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x00,0x00,0x07,0xEF,0x80,0x00,0x00,0xFB,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x01,0xEF,0x80,0x00,0x00,0xFB,0xF0,0x00,0x00,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'V' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'W' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFC,0x00,0x00,0x1F,0xBE,0x00,0x00,0x03,0xEF,0x00,0x00,0x00,0x79,0x80,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, // 'X' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xFD,0xE0,0x3F,0xFF,0xFE,0xF8,0x07,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x01,0xFF,0xFF,0xDF,0x80,0xFF,0xFF,0xFB,0xE0,0x7F,0xFF,0xFF,0x78,0x3F,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'Y' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC0,0x3F,0xFF,0xFF,0xEC,0x07,0xFF,0xFF,0xF7,0x80,0xFF,0xFF,0xFB,0xE0,0x1F,0xFF,0xFD,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xDF,0xFF,0xFC,0x03,0xEF,0xFF,0xFF,0x80,0xF7,0xFF,0xFF,0xF0,0x1B,0xFF,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // 'Z' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '[' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '\' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // ']' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '^' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '_' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '`' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xDE,0xFB,0xFF,0xFF,0xEF,0xBF,0x7F,0xFF,0xF7,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xC0,0x00,0x01,0xFB,0xE0,0x00,0x00,0x3E,0xF0,0x00,0x00,0x07,0x98,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'a' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x7F,0xFF,0xF0,0x0F,0xBF,0xFF,0xFE,0x03,0xDF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'b' - 0x01,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x7F,0xFF,0xF7,0xE0,0x3F,0xFF,0xFE,0xF8,0x1F,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'd' - 0x0F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x6F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'e' - 0x0F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x6F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 'f' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x3E,0xFF,0xFF,0xF8,0x0F,0xDF,0xFF,0xFC,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0xF8,0x00,0x00,0x0F,0xBF,0x00,0x00,0x07,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xDF,0xFF,0xFD,0xFB,0xEF,0xFF,0xFF,0xBE,0xF7,0xFF,0xFF,0xF7,0x9B,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // 'g' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x7F,0xFF,0xF0,0x0F,0xBF,0xFF,0xFE,0x03,0xDF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFC,0x00,0x00,0x1F,0xBE,0x00,0x00,0x03,0xEF,0x00,0x00,0x00,0x79,0x80,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, // 'h' - 0x1E,0x3E,0x7E,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x7E,0x3E,0x1E,0x0C,0x00, // 'i' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x07,0xE0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x01,0xEF,0x80,0x00,0x00,0xFB,0xF0,0x00,0x00,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'j' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x3E,0xFF,0xFF,0xF8,0x0F,0xDF,0xFF,0xFC,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF7,0xFF,0xFF,0x00,0xFB,0xFF,0xFF,0xE0,0x3D,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xDE,0xFB,0xFF,0xFF,0xEF,0xBF,0x7F,0xFF,0xF7,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xC0,0x00,0x01,0xFB,0xE0,0x00,0x00,0x3E,0xF0,0x00,0x00,0x07,0x98,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'k' - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'l' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF0,0x00,0x00,0x7E,0xF8,0x00,0x00,0x0F,0xBC,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0xF8,0x00,0x00,0x0F,0xBF,0x00,0x00,0x07,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xC0,0x00,0x01,0xFB,0xE0,0x00,0x00,0x3E,0xF0,0x00,0x00,0x07,0x98,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'm' - 0x01,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0xF8,0x00,0x7F,0xFF,0xFF,0x00,0x3F,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF0,0x00,0x00,0x7E,0xF8,0x00,0x00,0x0F,0xBC,0x00,0x00,0x01,0xE6,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00, // 'n' - 0x01,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0xF8,0x00,0x7F,0xFF,0xFF,0x00,0x3F,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE6,0xFF,0xFF,0xFF,0xB0,0x7F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFE,0x00, // 'o' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0x3F,0x7F,0xFF,0xF0,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 'p' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x80,0x1F,0xFF,0xFF,0xDE,0x03,0xFF,0xFF,0xEF,0x80,0x7F,0xFF,0xF7,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'q' - 0x01,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0x80,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0xF7,0xFF,0xFF,0xF3,0xEF,0xFF,0xFF,0x8F,0xDF,0xFF,0xFC,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x00,0x00,0x00,0xF8,0x00,0x00,0x03,0xC0,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 'r' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x7F,0xFF,0xF0,0x0F,0xBF,0xFF,0xFE,0x03,0xDF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xFD,0xE0,0x3F,0xFF,0xFE,0xF8,0x07,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x01,0xFF,0xFF,0xDF,0x80,0xFF,0xFF,0xFB,0xE0,0x7F,0xFF,0xFF,0x78,0x3F,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 's' - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 't' - 0xF0,0x00,0x00,0x07,0xBE,0x00,0x00,0x03,0xEF,0xC0,0x00,0x01,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE6,0xFF,0xFF,0xFF,0xB0,0x7F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFE,0x00, // 'u' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x00,0x00,0x07,0xEF,0x80,0x00,0x00,0xFB,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x01,0xEF,0x80,0x00,0x00,0xFB,0xF0,0x00,0x00,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'v' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'w' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFC,0x00,0x00,0x1F,0xBE,0x00,0x00,0x03,0xEF,0x00,0x00,0x00,0x79,0x80,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, // 'x' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xFD,0xE0,0x3F,0xFF,0xFE,0xF8,0x07,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x01,0xFF,0xFF,0xDF,0x80,0xFF,0xFF,0xFB,0xE0,0x7F,0xFF,0xFF,0x78,0x3F,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'y' - 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC0,0x3F,0xFF,0xFF,0xEC,0x07,0xFF,0xFF,0xF7,0x80,0xFF,0xFF,0xFB,0xE0,0x1F,0xFF,0xFD,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xDF,0xFF,0xFC,0x03,0xEF,0xFF,0xFF,0x80,0xF7,0xFF,0xFF,0xF0,0x1B,0xFF,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // 'z' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '{' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '|' - 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0 // '}' -}; -const GFXglyph DSEG7_Classic_Bold_53Glyphs[] PROGMEM = { -// bitmapOffset, width, height, xAdvance, xOffset, yOffset - { 0, 1, 1, 12, 0, 0 }, // ' ' - { 1, 1, 1, 44, 0, 0 }, // '!' - { 2, 15, 36, 20, 2, -36 }, // '"' - { 70, 15, 36, 20, 2, -36 }, // '#' - { 138, 15, 36, 20, 2, -36 }, // '$' - { 206, 15, 36, 20, 2, -36 }, // '%' - { 274, 15, 36, 20, 2, -36 }, // '&' - { 342, 15, 36, 20, 2, -36 }, // ''' - { 410, 15, 36, 20, 2, -36 }, // '(' - { 478, 15, 36, 20, 2, -36 }, // ')' - { 546, 15, 36, 20, 2, -36 }, // '*' - { 614, 15, 36, 20, 2, -36 }, // '+' - { 682, 15, 36, 20, 2, -36 }, // ',' - { 750, 26, 7, 44, 9, -30 }, // '-' - { 773, 7, 7, 1, -3, -7 }, // '.' - { 780, 15, 36, 20, 2, -36 }, // '/' - { 848, 34, 53, 44, 5, -53 }, // '0' - { 1074, 8, 49, 44, 31, -51 }, // '1' - { 1123, 34, 53, 44, 5, -53 }, // '2' - { 1349, 31, 53, 44, 8, -53 }, // '3' - { 1555, 34, 49, 44, 5, -51 }, // '4' - { 1764, 34, 53, 44, 5, -53 }, // '5' - { 1990, 34, 53, 44, 5, -53 }, // '6' - { 2216, 34, 51, 44, 5, -53 }, // '7' - { 2433, 34, 53, 44, 5, -53 }, // '8' - { 2659, 34, 53, 44, 5, -53 }, // '9' - { 2885, 8, 28, 12, 2, -40 }, // ':' - { 2913, 15, 36, 20, 2, -36 }, // ';' - { 2981, 15, 36, 20, 2, -36 }, // '<' - { 3049, 15, 36, 20, 2, -36 }, // '=' - { 3117, 15, 36, 20, 2, -36 }, // '>' - { 3185, 15, 36, 20, 2, -36 }, // '?' - { 3253, 15, 36, 20, 2, -36 }, // '@' - { 3321, 34, 51, 44, 5, -53 }, // 'A' - { 3538, 34, 51, 44, 5, -51 }, // 'B' - { 3755, 32, 30, 44, 5, -30 }, // 'C' - { 3875, 34, 51, 44, 5, -51 }, // 'D' - { 4092, 32, 53, 44, 5, -53 }, // 'E' - { 4304, 32, 51, 44, 5, -53 }, // 'F' - { 4508, 34, 53, 44, 5, -53 }, // 'G' - { 4734, 34, 49, 44, 5, -51 }, // 'H' - { 4943, 8, 24, 44, 31, -26 }, // 'I' - { 4967, 34, 51, 44, 5, -51 }, // 'J' - { 5184, 34, 51, 44, 5, -53 }, // 'K' - { 5401, 32, 51, 44, 5, -51 }, // 'L' - { 5605, 34, 51, 44, 5, -53 }, // 'M' - { 5822, 34, 28, 44, 5, -30 }, // 'N' - { 5941, 34, 30, 44, 5, -30 }, // 'O' - { 6069, 34, 51, 44, 5, -53 }, // 'P' - { 6286, 34, 51, 44, 5, -53 }, // 'Q' - { 6503, 30, 28, 44, 5, -30 }, // 'R' - { 6608, 34, 51, 44, 5, -51 }, // 'S' - { 6825, 32, 51, 44, 5, -51 }, // 'T' - { 7029, 34, 26, 44, 5, -26 }, // 'U' - { 7140, 34, 51, 44, 5, -51 }, // 'V' - { 7357, 34, 51, 44, 5, -51 }, // 'W' - { 7574, 34, 49, 44, 5, -51 }, // 'X' - { 7783, 34, 51, 44, 5, -51 }, // 'Y' - { 8000, 34, 53, 44, 5, -53 }, // 'Z' - { 8226, 15, 36, 20, 2, -36 }, // '[' - { 8294, 15, 36, 20, 2, -36 }, // '\' - { 8362, 15, 36, 20, 2, -36 }, // ']' - { 8430, 15, 36, 20, 2, -36 }, // '^' - { 8498, 15, 36, 20, 2, -36 }, // '_' - { 8566, 15, 36, 20, 2, -36 }, // '`' - { 8634, 34, 51, 44, 5, -53 }, // 'a' - { 8851, 34, 51, 44, 5, -51 }, // 'b' - { 9068, 32, 30, 44, 5, -30 }, // 'c' - { 9188, 34, 51, 44, 5, -51 }, // 'd' - { 9405, 32, 53, 44, 5, -53 }, // 'e' - { 9617, 32, 51, 44, 5, -53 }, // 'f' - { 9821, 34, 53, 44, 5, -53 }, // 'g' - { 10047, 34, 49, 44, 5, -51 }, // 'h' - { 10256, 8, 24, 44, 31, -26 }, // 'i' - { 10280, 34, 51, 44, 5, -51 }, // 'j' - { 10497, 34, 51, 44, 5, -53 }, // 'k' - { 10714, 32, 51, 44, 5, -51 }, // 'l' - { 10918, 34, 51, 44, 5, -53 }, // 'm' - { 11135, 34, 28, 44, 5, -30 }, // 'n' - { 11254, 34, 30, 44, 5, -30 }, // 'o' - { 11382, 34, 51, 44, 5, -53 }, // 'p' - { 11599, 34, 51, 44, 5, -53 }, // 'q' - { 11816, 30, 28, 44, 5, -30 }, // 'r' - { 11921, 34, 51, 44, 5, -51 }, // 's' - { 12138, 32, 51, 44, 5, -51 }, // 't' - { 12342, 34, 26, 44, 5, -26 }, // 'u' - { 12453, 34, 51, 44, 5, -51 }, // 'v' - { 12670, 34, 51, 44, 5, -51 }, // 'w' - { 12887, 34, 49, 44, 5, -51 }, // 'x' - { 13096, 34, 51, 44, 5, -51 }, // 'y' - { 13313, 34, 53, 44, 5, -53 }, // 'z' - { 13539, 15, 36, 20, 2, -36 }, // '{' - { 13607, 15, 36, 20, 2, -36 }, // '|' - { 13675, 15, 36, 20, 2, -36 } // '}' -}; -const GFXfont DSEG7_Classic_Bold_53 PROGMEM = { +// Created by http://oleddisplay.squix.ch/ Consider a donation +// In case of problems make sure that you are using the font file with the correct version! +const uint8_t DSEG7_Classic_Bold_53Bitmaps[] PROGMEM = { + + // Bitmap Data: + 0x00, // ' ' + 0x00, // '!' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '"' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '#' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '$' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '%' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '&' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // ''' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '(' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // ')' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '*' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '+' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // ',' + 0x1F,0xFF,0xFC,0x0F,0xFF,0xFF,0x87,0xFF,0xFF,0xF3,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0x0F,0xFF,0xFF,0x81,0xFF,0xFF,0xC0, // '-' + 0x00,0xF3,0xF7,0xEF,0xDF,0x9E,0x00, // '.' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '/' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF0,0x00,0x00,0x7E,0xF8,0x00,0x00,0x0F,0xBC,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0xF8,0x00,0x00,0x0F,0xBF,0x00,0x00,0x07,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xDF,0xFF,0xFD,0xFB,0xEF,0xFF,0xFF,0xBE,0xF7,0xFF,0xFF,0xF7,0x9B,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // '0' + 0x00,0x0C,0x1E,0x3E,0x7E,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x7E,0x3E,0x1E,0x00,0x1E,0x3E,0x7E,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x7E,0x3E,0x1E,0x0C,0x00, // '1' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC0,0x3F,0xFF,0xFF,0xEC,0x07,0xFF,0xFF,0xF7,0x80,0xFF,0xFF,0xFB,0xE0,0x1F,0xFF,0xFD,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x07,0xFF,0xFF,0x7E,0x03,0xFF,0xFF,0xEF,0x81,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0x3F,0x7F,0xFF,0xF0,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xDF,0xFF,0xFC,0x03,0xEF,0xFF,0xFF,0x80,0xF7,0xFF,0xFF,0xF0,0x1B,0xFF,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // '2' + 0x7F,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF,0xC3,0xFF,0xFF,0xFF,0x83,0xFF,0xFF,0xFE,0xC3,0xFF,0xFF,0xFB,0xC3,0xFF,0xFF,0xEF,0x83,0xFF,0xFF,0xBF,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,0x03,0xF8,0x00,0x00,0x07,0xF0,0x00,0x00,0x0F,0xE0,0x00,0x00,0x1F,0xC0,0x00,0x00,0x3F,0x80,0x00,0x00,0x7F,0x07,0xFF,0xFF,0x7E,0x1F,0xFF,0xFF,0x7C,0x7F,0xFF,0xFF,0x79,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFD,0xE1,0xFF,0xFF,0xF7,0xC1,0xFF,0xFF,0xDF,0x80,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,0x03,0xF8,0x00,0x00,0x07,0xF0,0x00,0x00,0x0F,0xE0,0x00,0x00,0x1F,0xC0,0x00,0x00,0x3F,0x83,0xFF,0xFF,0xBF,0x0F,0xFF,0xFF,0xBE,0x3F,0xFF,0xFF,0xBC,0xFF,0xFF,0xFF,0xB3,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFC,0x00, // '3' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xFD,0xE0,0x3F,0xFF,0xFE,0xF8,0x07,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, // '4' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x3E,0xFF,0xFF,0xF8,0x0F,0xDF,0xFF,0xFC,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF7,0xFF,0xFF,0x00,0xFB,0xFF,0xFF,0xE0,0x3D,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0x80,0x1F,0xFF,0xFF,0xDE,0x03,0xFF,0xFF,0xEF,0x80,0x7F,0xFF,0xF7,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x1F,0xFF,0xFD,0xF8,0x0F,0xFF,0xFF,0xBE,0x07,0xFF,0xFF,0xF7,0x83,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // '5' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x3E,0xFF,0xFF,0xF8,0x0F,0xDF,0xFF,0xFC,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF7,0xFF,0xFF,0x00,0xFB,0xFF,0xFF,0xE0,0x3D,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xDE,0xFB,0xFF,0xFF,0xEF,0xBF,0x7F,0xFF,0xF7,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xDF,0xFF,0xFD,0xFB,0xEF,0xFF,0xFF,0xBE,0xF7,0xFF,0xFF,0xF7,0x9B,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // '6' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF0,0x00,0x00,0x7E,0xF8,0x00,0x00,0x0F,0xBC,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x07,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // '7' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xDE,0xFB,0xFF,0xFF,0xEF,0xBF,0x7F,0xFF,0xF7,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xDF,0xFF,0xFD,0xFB,0xEF,0xFF,0xFF,0xBE,0xF7,0xFF,0xFF,0xF7,0x9B,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // '8' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x80,0x1F,0xFF,0xFF,0xDE,0x03,0xFF,0xFF,0xEF,0x80,0x7F,0xFF,0xF7,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x1F,0xFF,0xFD,0xF8,0x0F,0xFF,0xFF,0xBE,0x07,0xFF,0xFF,0xF7,0x83,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // '9' + 0x38,0x7C,0xFC,0xFE,0xFC,0x7C,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xFC,0xFE,0xFE,0xFC,0x7C, // ':' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // ';' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '<' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '=' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '>' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '?' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '@' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xDE,0xFB,0xFF,0xFF,0xEF,0xBF,0x7F,0xFF,0xF7,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xC0,0x00,0x01,0xFB,0xE0,0x00,0x00,0x3E,0xF0,0x00,0x00,0x07,0x98,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'A' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x7F,0xFF,0xF0,0x0F,0xBF,0xFF,0xFE,0x03,0xDF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'B' + 0x01,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'C' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x7F,0xFF,0xF7,0xE0,0x3F,0xFF,0xFE,0xF8,0x1F,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'D' + 0x0F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x6F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'E' + 0x0F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x6F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 'F' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x3E,0xFF,0xFF,0xF8,0x0F,0xDF,0xFF,0xFC,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0xF8,0x00,0x00,0x0F,0xBF,0x00,0x00,0x07,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xDF,0xFF,0xFD,0xFB,0xEF,0xFF,0xFF,0xBE,0xF7,0xFF,0xFF,0xF7,0x9B,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // 'G' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x7F,0xFF,0xF0,0x0F,0xBF,0xFF,0xFE,0x03,0xDF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFC,0x00,0x00,0x1F,0xBE,0x00,0x00,0x03,0xEF,0x00,0x00,0x00,0x79,0x80,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, // 'H' + 0x1E,0x3E,0x7E,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x7E,0x3E,0x1E,0x0C,0x00, // 'I' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x07,0xE0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x01,0xEF,0x80,0x00,0x00,0xFB,0xF0,0x00,0x00,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'J' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x3E,0xFF,0xFF,0xF8,0x0F,0xDF,0xFF,0xFC,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF7,0xFF,0xFF,0x00,0xFB,0xFF,0xFF,0xE0,0x3D,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xDE,0xFB,0xFF,0xFF,0xEF,0xBF,0x7F,0xFF,0xF7,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xC0,0x00,0x01,0xFB,0xE0,0x00,0x00,0x3E,0xF0,0x00,0x00,0x07,0x98,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'K' + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'L' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF0,0x00,0x00,0x7E,0xF8,0x00,0x00,0x0F,0xBC,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0xF8,0x00,0x00,0x0F,0xBF,0x00,0x00,0x07,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xC0,0x00,0x01,0xFB,0xE0,0x00,0x00,0x3E,0xF0,0x00,0x00,0x07,0x98,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'M' + 0x01,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0xF8,0x00,0x7F,0xFF,0xFF,0x00,0x3F,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF0,0x00,0x00,0x7E,0xF8,0x00,0x00,0x0F,0xBC,0x00,0x00,0x01,0xE6,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00, // 'N' + 0x01,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0xF8,0x00,0x7F,0xFF,0xFF,0x00,0x3F,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE6,0xFF,0xFF,0xFF,0xB0,0x7F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFE,0x00, // 'O' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0x3F,0x7F,0xFF,0xF0,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 'P' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x80,0x1F,0xFF,0xFF,0xDE,0x03,0xFF,0xFF,0xEF,0x80,0x7F,0xFF,0xF7,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'Q' + 0x01,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0x80,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0xF7,0xFF,0xFF,0xF3,0xEF,0xFF,0xFF,0x8F,0xDF,0xFF,0xFC,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x00,0x00,0x00,0xF8,0x00,0x00,0x03,0xC0,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 'R' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x7F,0xFF,0xF0,0x0F,0xBF,0xFF,0xFE,0x03,0xDF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xFD,0xE0,0x3F,0xFF,0xFE,0xF8,0x07,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x01,0xFF,0xFF,0xDF,0x80,0xFF,0xFF,0xFB,0xE0,0x7F,0xFF,0xFF,0x78,0x3F,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'S' + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'T' + 0xF0,0x00,0x00,0x07,0xBE,0x00,0x00,0x03,0xEF,0xC0,0x00,0x01,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE6,0xFF,0xFF,0xFF,0xB0,0x7F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFE,0x00, // 'U' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x00,0x00,0x07,0xEF,0x80,0x00,0x00,0xFB,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x01,0xEF,0x80,0x00,0x00,0xFB,0xF0,0x00,0x00,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'V' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'W' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFC,0x00,0x00,0x1F,0xBE,0x00,0x00,0x03,0xEF,0x00,0x00,0x00,0x79,0x80,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, // 'X' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xFD,0xE0,0x3F,0xFF,0xFE,0xF8,0x07,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x01,0xFF,0xFF,0xDF,0x80,0xFF,0xFF,0xFB,0xE0,0x7F,0xFF,0xFF,0x78,0x3F,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'Y' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC0,0x3F,0xFF,0xFF,0xEC,0x07,0xFF,0xFF,0xF7,0x80,0xFF,0xFF,0xFB,0xE0,0x1F,0xFF,0xFD,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xDF,0xFF,0xFC,0x03,0xEF,0xFF,0xFF,0x80,0xF7,0xFF,0xFF,0xF0,0x1B,0xFF,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // 'Z' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '[' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '\' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // ']' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '^' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '_' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '`' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xDE,0xFB,0xFF,0xFF,0xEF,0xBF,0x7F,0xFF,0xF7,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xC0,0x00,0x01,0xFB,0xE0,0x00,0x00,0x3E,0xF0,0x00,0x00,0x07,0x98,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'a' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x7F,0xFF,0xF0,0x0F,0xBF,0xFF,0xFE,0x03,0xDF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'b' + 0x01,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'c' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x7F,0xFF,0xF7,0xE0,0x3F,0xFF,0xFE,0xF8,0x1F,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'd' + 0x0F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x6F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'e' + 0x0F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x6F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 'f' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x3E,0xFF,0xFF,0xF8,0x0F,0xDF,0xFF,0xFC,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0xF8,0x00,0x00,0x0F,0xBF,0x00,0x00,0x07,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xDF,0xFF,0xFD,0xFB,0xEF,0xFF,0xFF,0xBE,0xF7,0xFF,0xFF,0xF7,0x9B,0xFF,0xFF,0xFE,0xC1,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // 'g' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x7F,0xFF,0xF0,0x0F,0xBF,0xFF,0xFE,0x03,0xDF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFC,0x00,0x00,0x1F,0xBE,0x00,0x00,0x03,0xEF,0x00,0x00,0x00,0x79,0x80,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, // 'h' + 0x1E,0x3E,0x7E,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x7E,0x3E,0x1E,0x0C,0x00, // 'i' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x07,0xE0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x01,0xEF,0x80,0x00,0x00,0xFB,0xF0,0x00,0x00,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'j' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x3E,0xFF,0xFF,0xF8,0x0F,0xDF,0xFF,0xFC,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF7,0xFF,0xFF,0x00,0xFB,0xFF,0xFF,0xE0,0x3D,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xDE,0xFB,0xFF,0xFF,0xEF,0xBF,0x7F,0xFF,0xF7,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xC0,0x00,0x01,0xFB,0xE0,0x00,0x00,0x3E,0xF0,0x00,0x00,0x07,0x98,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'k' + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 'l' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF0,0x00,0x00,0x7E,0xF8,0x00,0x00,0x0F,0xBC,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0xF8,0x00,0x00,0x0F,0xBF,0x00,0x00,0x07,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xC0,0x00,0x01,0xFB,0xE0,0x00,0x00,0x3E,0xF0,0x00,0x00,0x07,0x98,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'm' + 0x01,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0xF8,0x00,0x7F,0xFF,0xFF,0x00,0x3F,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF0,0x00,0x00,0x7E,0xF8,0x00,0x00,0x0F,0xBC,0x00,0x00,0x01,0xE6,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00, // 'n' + 0x01,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0xF8,0x00,0x7F,0xFF,0xFF,0x00,0x3F,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE6,0xFF,0xFF,0xFF,0xB0,0x7F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFE,0x00, // 'o' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x83,0xDF,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0x3F,0x7F,0xFF,0xF0,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 'p' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC1,0xBF,0xFF,0xFF,0xEC,0xF7,0xFF,0xFF,0xF7,0xBE,0xFF,0xFF,0xFB,0xEF,0xDF,0xFF,0xFD,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE0,0xFF,0xFF,0xFF,0x80,0x1F,0xFF,0xFF,0xDE,0x03,0xFF,0xFF,0xEF,0x80,0x7F,0xFF,0xF7,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, // 'q' + 0x01,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0x80,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0xF7,0xFF,0xFF,0xF3,0xEF,0xFF,0xFF,0x8F,0xDF,0xFF,0xFC,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFE,0x00,0x00,0x03,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x3F,0x00,0x00,0x00,0xF8,0x00,0x00,0x03,0xC0,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 'r' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x7F,0xFF,0xF0,0x0F,0xBF,0xFF,0xFE,0x03,0xDF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xFD,0xE0,0x3F,0xFF,0xFE,0xF8,0x07,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x01,0xFF,0xFF,0xDF,0x80,0xFF,0xFF,0xFB,0xE0,0x7F,0xFF,0xFF,0x78,0x3F,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 's' + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0xF0,0xFB,0xFF,0xFF,0xE0,0xFD,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFD,0xFF,0xFF,0xC0,0xFB,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0xF0,0x6F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8, // 't' + 0xF0,0x00,0x00,0x07,0xBE,0x00,0x00,0x03,0xEF,0xC0,0x00,0x01,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF7,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,0xBD,0xFF,0xFF,0xFD,0xE6,0xFF,0xFF,0xFF,0xB0,0x7F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFE,0x00, // 'u' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x00,0x00,0x07,0xEF,0x80,0x00,0x00,0xFB,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x01,0xEF,0x80,0x00,0x00,0xFB,0xF0,0x00,0x00,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'v' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFD,0xFF,0xFF,0xDF,0xBE,0xFF,0xFF,0xFB,0xEF,0x7F,0xFF,0xFF,0x79,0xBF,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'w' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xFD,0xEF,0xBF,0xFF,0xFE,0xFB,0xF7,0xFF,0xFF,0x7E,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFC,0x00,0x00,0x1F,0xBE,0x00,0x00,0x03,0xEF,0x00,0x00,0x00,0x79,0x80,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, // 'x' + 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x7B,0xE0,0x00,0x00,0x3E,0xFC,0x00,0x00,0x1F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x80,0x00,0x0F,0xEF,0xE0,0x00,0x03,0xFB,0xF8,0x00,0x00,0xFE,0xFE,0x00,0x00,0x3F,0xBF,0x7F,0xFF,0xF7,0xEF,0xBF,0xFF,0xFE,0xFB,0xDF,0xFF,0xFF,0xDE,0x0F,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xFD,0xE0,0x3F,0xFF,0xFE,0xF8,0x07,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x01,0xFF,0xFF,0xDF,0x80,0xFF,0xFF,0xFB,0xE0,0x7F,0xFF,0xFF,0x78,0x3F,0xFF,0xFF,0xEC,0x1F,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x80, // 'y' + 0x0F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC0,0x3F,0xFF,0xFF,0xEC,0x07,0xFF,0xFF,0xF7,0x80,0xFF,0xFF,0xFB,0xE0,0x1F,0xFF,0xFD,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x0F,0xDF,0xFF,0xFC,0x03,0xEF,0xFF,0xFF,0x80,0xF7,0xFF,0xFF,0xF0,0x1B,0xFF,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x00, // 'z' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '{' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0, // '|' + 0xFF,0xFD,0xFF,0xFB,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0x00,0x36,0x00,0x6C,0x00,0xD8,0x01,0xB0,0x03,0x60,0x06,0xC0,0x0D,0x80,0x1B,0xFF,0xF7,0xFF,0xE0 // '}' +}; +const GFXglyph DSEG7_Classic_Bold_53Glyphs[] PROGMEM = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 12, 0, 0 }, // ' ' + { 1, 1, 1, 44, 0, 0 }, // '!' + { 2, 15, 36, 20, 2, -36 }, // '"' + { 70, 15, 36, 20, 2, -36 }, // '#' + { 138, 15, 36, 20, 2, -36 }, // '$' + { 206, 15, 36, 20, 2, -36 }, // '%' + { 274, 15, 36, 20, 2, -36 }, // '&' + { 342, 15, 36, 20, 2, -36 }, // ''' + { 410, 15, 36, 20, 2, -36 }, // '(' + { 478, 15, 36, 20, 2, -36 }, // ')' + { 546, 15, 36, 20, 2, -36 }, // '*' + { 614, 15, 36, 20, 2, -36 }, // '+' + { 682, 15, 36, 20, 2, -36 }, // ',' + { 750, 26, 7, 44, 9, -30 }, // '-' + { 773, 7, 7, 1, -3, -7 }, // '.' + { 780, 15, 36, 20, 2, -36 }, // '/' + { 848, 34, 53, 44, 5, -53 }, // '0' + { 1074, 8, 49, 44, 31, -51 }, // '1' + { 1123, 34, 53, 44, 5, -53 }, // '2' + { 1349, 31, 53, 44, 8, -53 }, // '3' + { 1555, 34, 49, 44, 5, -51 }, // '4' + { 1764, 34, 53, 44, 5, -53 }, // '5' + { 1990, 34, 53, 44, 5, -53 }, // '6' + { 2216, 34, 51, 44, 5, -53 }, // '7' + { 2433, 34, 53, 44, 5, -53 }, // '8' + { 2659, 34, 53, 44, 5, -53 }, // '9' + { 2885, 8, 28, 12, 2, -40 }, // ':' + { 2913, 15, 36, 20, 2, -36 }, // ';' + { 2981, 15, 36, 20, 2, -36 }, // '<' + { 3049, 15, 36, 20, 2, -36 }, // '=' + { 3117, 15, 36, 20, 2, -36 }, // '>' + { 3185, 15, 36, 20, 2, -36 }, // '?' + { 3253, 15, 36, 20, 2, -36 }, // '@' + { 3321, 34, 51, 44, 5, -53 }, // 'A' + { 3538, 34, 51, 44, 5, -51 }, // 'B' + { 3755, 32, 30, 44, 5, -30 }, // 'C' + { 3875, 34, 51, 44, 5, -51 }, // 'D' + { 4092, 32, 53, 44, 5, -53 }, // 'E' + { 4304, 32, 51, 44, 5, -53 }, // 'F' + { 4508, 34, 53, 44, 5, -53 }, // 'G' + { 4734, 34, 49, 44, 5, -51 }, // 'H' + { 4943, 8, 24, 44, 31, -26 }, // 'I' + { 4967, 34, 51, 44, 5, -51 }, // 'J' + { 5184, 34, 51, 44, 5, -53 }, // 'K' + { 5401, 32, 51, 44, 5, -51 }, // 'L' + { 5605, 34, 51, 44, 5, -53 }, // 'M' + { 5822, 34, 28, 44, 5, -30 }, // 'N' + { 5941, 34, 30, 44, 5, -30 }, // 'O' + { 6069, 34, 51, 44, 5, -53 }, // 'P' + { 6286, 34, 51, 44, 5, -53 }, // 'Q' + { 6503, 30, 28, 44, 5, -30 }, // 'R' + { 6608, 34, 51, 44, 5, -51 }, // 'S' + { 6825, 32, 51, 44, 5, -51 }, // 'T' + { 7029, 34, 26, 44, 5, -26 }, // 'U' + { 7140, 34, 51, 44, 5, -51 }, // 'V' + { 7357, 34, 51, 44, 5, -51 }, // 'W' + { 7574, 34, 49, 44, 5, -51 }, // 'X' + { 7783, 34, 51, 44, 5, -51 }, // 'Y' + { 8000, 34, 53, 44, 5, -53 }, // 'Z' + { 8226, 15, 36, 20, 2, -36 }, // '[' + { 8294, 15, 36, 20, 2, -36 }, // '\' + { 8362, 15, 36, 20, 2, -36 }, // ']' + { 8430, 15, 36, 20, 2, -36 }, // '^' + { 8498, 15, 36, 20, 2, -36 }, // '_' + { 8566, 15, 36, 20, 2, -36 }, // '`' + { 8634, 34, 51, 44, 5, -53 }, // 'a' + { 8851, 34, 51, 44, 5, -51 }, // 'b' + { 9068, 32, 30, 44, 5, -30 }, // 'c' + { 9188, 34, 51, 44, 5, -51 }, // 'd' + { 9405, 32, 53, 44, 5, -53 }, // 'e' + { 9617, 32, 51, 44, 5, -53 }, // 'f' + { 9821, 34, 53, 44, 5, -53 }, // 'g' + { 10047, 34, 49, 44, 5, -51 }, // 'h' + { 10256, 8, 24, 44, 31, -26 }, // 'i' + { 10280, 34, 51, 44, 5, -51 }, // 'j' + { 10497, 34, 51, 44, 5, -53 }, // 'k' + { 10714, 32, 51, 44, 5, -51 }, // 'l' + { 10918, 34, 51, 44, 5, -53 }, // 'm' + { 11135, 34, 28, 44, 5, -30 }, // 'n' + { 11254, 34, 30, 44, 5, -30 }, // 'o' + { 11382, 34, 51, 44, 5, -53 }, // 'p' + { 11599, 34, 51, 44, 5, -53 }, // 'q' + { 11816, 30, 28, 44, 5, -30 }, // 'r' + { 11921, 34, 51, 44, 5, -51 }, // 's' + { 12138, 32, 51, 44, 5, -51 }, // 't' + { 12342, 34, 26, 44, 5, -26 }, // 'u' + { 12453, 34, 51, 44, 5, -51 }, // 'v' + { 12670, 34, 51, 44, 5, -51 }, // 'w' + { 12887, 34, 49, 44, 5, -51 }, // 'x' + { 13096, 34, 51, 44, 5, -51 }, // 'y' + { 13313, 34, 53, 44, 5, -53 }, // 'z' + { 13539, 15, 36, 20, 2, -36 }, // '{' + { 13607, 15, 36, 20, 2, -36 }, // '|' + { 13675, 15, 36, 20, 2, -36 } // '}' +}; +const GFXfont DSEG7_Classic_Bold_53 PROGMEM = { (uint8_t *)DSEG7_Classic_Bold_53Bitmaps,(GFXglyph *)DSEG7_Classic_Bold_53Glyphs,0x20, 0x7E, 58}; \ No newline at end of file diff --git a/src/Watchy.cpp b/src/Watchy.cpp index 555f5d4..52a1d31 100644 --- a/src/Watchy.cpp +++ b/src/Watchy.cpp @@ -1,6 +1,6 @@ #include "Watchy.h" -WatchyRTC Watchy::RTC; +WatchyRTC Watchy::RTC; GxEPD2_BW Watchy::display(GxEPD2_154_D67(CS, DC, RESET, BUSY)); RTC_DATA_ATTR int guiState; @@ -51,12 +51,12 @@ void Watchy::displayBusyCallback(const void*){ void Watchy::deepSleep(){ display.hibernate(); - displayFullInit = false; // Notify not to init it again + displayFullInit = false; // Notify not to init it again RTC.clearAlarm(); //resets the alarm flag in the RTC // Set pins 0-39 to input to avoid power leaking out for(int i=0; i<40; i++) { pinMode(i, INPUT); - } + } esp_sleep_enable_ext0_wakeup(RTC_PIN, 0); //enable deep sleep wake on RTC interrupt esp_sleep_enable_ext1_wakeup(BTN_PIN_MASK, ESP_EXT1_WAKEUP_ANY_HIGH); //enable deep sleep wake on button press esp_deep_sleep_start(); @@ -76,7 +76,7 @@ void Watchy::handleButtonPress(){ break; case 1: showBuzz(); - break; + break; case 2: showAccelerometer(); break; @@ -85,15 +85,15 @@ void Watchy::handleButtonPress(){ break; case 4: setupWifi(); - break; + break; case 5: showUpdateFW(); break; case 6: showSyncNTP(); - break; + break; default: - break; + break; } }else if(guiState == FW_UPDATE_STATE){ updateFWBegin(); @@ -118,7 +118,7 @@ void Watchy::handleButtonPress(){ menuIndex--; if(menuIndex < 0){ menuIndex = MENU_LENGTH - 1; - } + } showMenu(menuIndex, true); }else if(guiState == WATCHFACE_STATE){ return; @@ -136,7 +136,7 @@ void Watchy::handleButtonPress(){ return; } } - + /***************** fast menu *****************/ bool timeout = false; long lastTimeout = millis(); @@ -149,7 +149,7 @@ void Watchy::handleButtonPress(){ timeout = true; }else{ if(digitalRead(MENU_BTN_PIN) == 1){ - lastTimeout = millis(); + lastTimeout = millis(); if(guiState == MAIN_MENU_STATE){//if already in menu, then select menu item switch(menuIndex) { @@ -158,7 +158,7 @@ void Watchy::handleButtonPress(){ break; case 1: showBuzz(); - break; + break; case 2: showAccelerometer(); break; @@ -167,15 +167,15 @@ void Watchy::handleButtonPress(){ break; case 4: setupWifi(); - break; + break; case 5: showUpdateFW(); break; case 6: showSyncNTP(); - break; + break; default: - break; + break; } }else if(guiState == FW_UPDATE_STATE){ updateFWBegin(); @@ -190,16 +190,16 @@ void Watchy::handleButtonPress(){ showMenu(menuIndex, false);//exit to menu if already in app }else if(guiState == FW_UPDATE_STATE){ showMenu(menuIndex, false);//exit to menu if already in app - } + } }else if(digitalRead(UP_BTN_PIN) == 1){ lastTimeout = millis(); if(guiState == MAIN_MENU_STATE){//increment menu index menuIndex--; if(menuIndex < 0){ menuIndex = MENU_LENGTH - 1; - } + } showFastMenu(menuIndex); - } + } }else if(digitalRead(DOWN_BTN_PIN) == 1){ lastTimeout = millis(); if(guiState == MAIN_MENU_STATE){//decrement menu index @@ -208,7 +208,7 @@ void Watchy::handleButtonPress(){ menuIndex = 0; } showFastMenu(menuIndex); - } + } } } } @@ -231,16 +231,16 @@ void Watchy::showMenu(byte menuIndex, bool partialRefresh){ display.getTextBounds(menuItems[i], 0, yPos, &x1, &y1, &w, &h); display.fillRect(x1-1, y1-10, 200, h+15, GxEPD_WHITE); display.setTextColor(GxEPD_BLACK); - display.println(menuItems[i]); + display.println(menuItems[i]); }else{ display.setTextColor(GxEPD_WHITE); display.println(menuItems[i]); - } + } } display.display(partialRefresh); - guiState = MAIN_MENU_STATE; + guiState = MAIN_MENU_STATE; } void Watchy::showFastMenu(byte menuIndex){ @@ -260,16 +260,16 @@ void Watchy::showFastMenu(byte menuIndex){ display.getTextBounds(menuItems[i], 0, yPos, &x1, &y1, &w, &h); display.fillRect(x1-1, y1-10, 200, h+15, GxEPD_WHITE); display.setTextColor(GxEPD_BLACK); - display.println(menuItems[i]); + display.println(menuItems[i]); }else{ display.setTextColor(GxEPD_WHITE); display.println(menuItems[i]); - } + } } display.display(true); - guiState = MAIN_MENU_STATE; + guiState = MAIN_MENU_STATE; } void Watchy::showBattery(){ @@ -285,7 +285,7 @@ void Watchy::showBattery(){ display.println("V"); display.display(false); //full refresh - guiState = APP_STATE; + guiState = APP_STATE; } void Watchy::showBuzz(){ @@ -297,7 +297,7 @@ void Watchy::showBuzz(){ display.println("Buzz!"); display.display(false); //full refresh vibMotor(); - showMenu(menuIndex, false); + showMenu(menuIndex, false); } void Watchy::vibMotor(uint8_t intervalMs, uint8_t length){ @@ -328,8 +328,8 @@ void Watchy::setTime(){ pinMode(DOWN_BTN_PIN, INPUT); pinMode(UP_BTN_PIN, INPUT); - pinMode(MENU_BTN_PIN, INPUT); - pinMode(BACK_BTN_PIN, INPUT); + pinMode(MENU_BTN_PIN, INPUT); + pinMode(BACK_BTN_PIN, INPUT); display.setFullWindow(); @@ -345,7 +345,7 @@ void Watchy::setTime(){ if(setIndex != SET_HOUR){ setIndex--; } - } + } blink = 1 - blink; @@ -366,10 +366,10 @@ void Watchy::setTime(){ break; case SET_DAY: day == 31 ? (day = 1) : day++; - break; + break; default: break; - } + } } if(digitalRead(UP_BTN_PIN) == 1){ @@ -389,11 +389,11 @@ void Watchy::setTime(){ break; case SET_DAY: day == 1 ? (day = 31) : day--; - break; + break; default: break; - } - } + } + } display.fillScreen(GxEPD_BLACK); display.setTextColor(GxEPD_WHITE); @@ -404,7 +404,7 @@ void Watchy::setTime(){ display.setTextColor(blink ? GxEPD_WHITE : GxEPD_BLACK); } if(hour < 10){ - display.print("0"); + display.print("0"); } display.print(hour); @@ -416,7 +416,7 @@ void Watchy::setTime(){ display.setTextColor(blink ? GxEPD_WHITE : GxEPD_BLACK); } if(minute < 10){ - display.print("0"); + display.print("0"); } display.print(minute); @@ -426,7 +426,7 @@ void Watchy::setTime(){ display.setCursor(45, 150); if(setIndex == SET_YEAR){//blink minute digits display.setTextColor(blink ? GxEPD_WHITE : GxEPD_BLACK); - } + } display.print(2000+year); display.setTextColor(GxEPD_WHITE); @@ -434,10 +434,10 @@ void Watchy::setTime(){ if(setIndex == SET_MONTH){//blink minute digits display.setTextColor(blink ? GxEPD_WHITE : GxEPD_BLACK); - } + } if(month < 10){ - display.print("0"); - } + display.print("0"); + } display.print(month); display.setTextColor(GxEPD_WHITE); @@ -445,11 +445,11 @@ void Watchy::setTime(){ if(setIndex == SET_DAY){//blink minute digits display.setTextColor(blink ? GxEPD_WHITE : GxEPD_BLACK); - } + } if(day < 10){ - display.print("0"); - } - display.print(day); + display.print("0"); + } + display.print(day); display.display(true); //partial refresh } @@ -476,7 +476,7 @@ void Watchy::showAccelerometer(){ Accel acc; long previousMillis = 0; - long interval = 200; + long interval = 200; guiState = APP_STATE; @@ -495,7 +495,7 @@ void Watchy::showAccelerometer(){ // Get acceleration data bool res = sensor.getAccel(acc); uint8_t direction = sensor.getDirection(); - display.fillScreen(GxEPD_BLACK); + display.fillScreen(GxEPD_BLACK); display.setCursor(0, 30); if(res == false) { display.println("getAccel FAIL"); @@ -554,8 +554,8 @@ void Watchy::drawWatchFace(){ display.print(":"); if(currentTime.Minute < 10){ display.print("0"); - } - display.println(currentTime.Minute); + } + display.println(currentTime.Minute); } weatherData Watchy::getWeatherData(){ @@ -632,7 +632,7 @@ uint16_t Watchy::_writeRegister(uint8_t address, uint8_t reg, uint8_t *data, uin } void Watchy::_bmaConfig(){ - + if (sensor.begin(_readRegister, _writeRegister, delay) == false) { //fail to init BMA return; @@ -724,7 +724,7 @@ void Watchy::_bmaConfig(){ sensor.enableStepCountInterrupt(); sensor.enableTiltInterrupt(); // It corresponds to isDoubleClick interrupt - sensor.enableWakeupInterrupt(); + sensor.enableWakeupInterrupt(); } void Watchy::setupWifi(){ @@ -749,7 +749,7 @@ void Watchy::setupWifi(){ WiFi.mode(WIFI_OFF); btStop(); display.epd2.setBusyCallback(displayBusyCallback); //enable lightsleep on busy - guiState = APP_STATE; + guiState = APP_STATE; } void Watchy::_configModeCallback (WiFiManager *myWiFiManager) { @@ -799,7 +799,7 @@ void Watchy::showUpdateFW(){ display.println("Keep USB powered"); display.display(false); //full refresh - guiState = FW_UPDATE_STATE; + guiState = FW_UPDATE_STATE; } void Watchy::updateFWBegin(){ @@ -847,7 +847,7 @@ void Watchy::updateFWBegin(){ display.println(" "); display.print(BT.howManyBytes()); display.println(" bytes"); - display.display(true); //partial refresh + display.display(true); //partial refresh } if(currentStatus == 2){ display.setFullWindow(); @@ -862,7 +862,7 @@ void Watchy::updateFWBegin(){ display.display(false); //full refresh delay(2000); - esp_restart(); + esp_restart(); } if(currentStatus == 4){ display.setFullWindow(); @@ -923,17 +923,17 @@ bool Watchy::syncNTP(long gmt, int dst, String ntpServer){ //NTP sync - call aft /**************************************************** struct tm { - int tm_sec; // Seconds [0,60]. - int tm_min; // Minutes [0,59]. - int tm_hour; // Hour [0,23]. - int tm_mday; // Day of month [1,31]. - int tm_mon; // Month of year [0,11]. - int tm_year; // Years since 1900. - int tm_wday; // Day of week [0,6] (Sunday =0). - int tm_yday; // Day of year [0,365]. - int tm_isdst; // Daylight Savings flag. + int tm_sec; // Seconds [0,60]. + int tm_min; // Minutes [0,59]. + int tm_hour; // Hour [0,23]. + int tm_mday; // Day of month [1,31]. + int tm_mon; // Month of year [0,11]. + int tm_year; // Years since 1900. + int tm_wday; // Day of week [0,6] (Sunday =0). + int tm_yday; // Day of year [0,365]. + int tm_isdst; // Daylight Savings flag. } - ****************************************************/ + ****************************************************/ tmElements_t tm; tm.Year = CalendarYrToTm(timeinfo.tm_year + 1900); tm.Month = timeinfo.tm_mon + 1; //tm.Month 1 - 12 @@ -946,7 +946,7 @@ bool Watchy::syncNTP(long gmt, int dst, String ntpServer){ //NTP sync - call aft } // time_t compileTime() -// { +// { // const time_t FUDGE(10); //fudge factor to allow for upload time, etc. (seconds, YMMV) // const char *compDate = __DATE__, *compTime = __TIME__, *months = "JanFebMarAprMayJunJulAugSepOctNovDec"; // char compMon[3], *m; diff --git a/src/Watchy.h b/src/Watchy.h index c15e57c..3cad570 100644 --- a/src/Watchy.h +++ b/src/Watchy.h @@ -1,85 +1,85 @@ -#ifndef WATCHY_H -#define WATCHY_H - -#include -#include -#include -#include -#include -#include -#include -#include "DSEG7_Classic_Bold_53.h" -#include "WatchyRTC.h" -#include "BLE.h" -#include "bma.h" -#include "config.h" - -typedef struct weatherData{ - int8_t temperature; - int16_t weatherConditionCode; - bool isMetric; - String weatherDescription; -}weatherData; - -typedef struct watchySettings{ - //Weather Settings - String cityID; - String weatherAPIKey; - String weatherURL; - String weatherUnit; - String weatherLang; - int8_t weatherUpdateInterval; - //NTP Settings - String ntpServer; - int gmtOffset; - int dstOffset; -}watchySettings; - -class Watchy { - public: - static WatchyRTC RTC; - static GxEPD2_BW display; - tmElements_t currentTime; - watchySettings settings; - public: - explicit Watchy(const watchySettings& s) : settings(s){} //constructor - void init(String datetime = ""); - void deepSleep(); - static void displayBusyCallback(const void*); - float getBatteryVoltage(); - void vibMotor(uint8_t intervalMs = 100, uint8_t length = 20); - - void handleButtonPress(); - void showMenu(byte menuIndex, bool partialRefresh); - void showFastMenu(byte menuIndex); - void showBattery(); - void showBuzz(); - void showAccelerometer(); - void showUpdateFW(); - void showSyncNTP(); - bool syncNTP(); - bool syncNTP(long gmt, int dst, String ntpServer); - void setTime(); - void setupWifi(); - bool connectWiFi(); - weatherData getWeatherData(); - weatherData getWeatherData(String cityID, String units, String lang, String url, String apiKey, uint8_t updateInterval); - void updateFWBegin(); - - void showWatchFace(bool partialRefresh); - virtual void drawWatchFace(); //override this method for different watch faces - - private: - void _bmaConfig(); - static void _configModeCallback(WiFiManager *myWiFiManager); - static uint16_t _readRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len); - static uint16_t _writeRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len); -}; - -extern RTC_DATA_ATTR int guiState; -extern RTC_DATA_ATTR int menuIndex; -extern RTC_DATA_ATTR BMA423 sensor; -extern RTC_DATA_ATTR bool WIFI_CONFIGURED; -extern RTC_DATA_ATTR bool BLE_CONFIGURED; - +#ifndef WATCHY_H +#define WATCHY_H + +#include +#include +#include +#include +#include +#include +#include +#include "DSEG7_Classic_Bold_53.h" +#include "WatchyRTC.h" +#include "BLE.h" +#include "bma.h" +#include "config.h" + +typedef struct weatherData{ + int8_t temperature; + int16_t weatherConditionCode; + bool isMetric; + String weatherDescription; +}weatherData; + +typedef struct watchySettings{ + //Weather Settings + String cityID; + String weatherAPIKey; + String weatherURL; + String weatherUnit; + String weatherLang; + int8_t weatherUpdateInterval; + //NTP Settings + String ntpServer; + int gmtOffset; + int dstOffset; +}watchySettings; + +class Watchy { + public: + static WatchyRTC RTC; + static GxEPD2_BW display; + tmElements_t currentTime; + watchySettings settings; + public: + explicit Watchy(const watchySettings& s) : settings(s){} //constructor + void init(String datetime = ""); + void deepSleep(); + static void displayBusyCallback(const void*); + float getBatteryVoltage(); + void vibMotor(uint8_t intervalMs = 100, uint8_t length = 20); + + void handleButtonPress(); + void showMenu(byte menuIndex, bool partialRefresh); + void showFastMenu(byte menuIndex); + void showBattery(); + void showBuzz(); + void showAccelerometer(); + void showUpdateFW(); + void showSyncNTP(); + bool syncNTP(); + bool syncNTP(long gmt, int dst, String ntpServer); + void setTime(); + void setupWifi(); + bool connectWiFi(); + weatherData getWeatherData(); + weatherData getWeatherData(String cityID, String units, String lang, String url, String apiKey, uint8_t updateInterval); + void updateFWBegin(); + + void showWatchFace(bool partialRefresh); + virtual void drawWatchFace(); //override this method for different watch faces + + private: + void _bmaConfig(); + static void _configModeCallback(WiFiManager *myWiFiManager); + static uint16_t _readRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len); + static uint16_t _writeRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len); +}; + +extern RTC_DATA_ATTR int guiState; +extern RTC_DATA_ATTR int menuIndex; +extern RTC_DATA_ATTR BMA423 sensor; +extern RTC_DATA_ATTR bool WIFI_CONFIGURED; +extern RTC_DATA_ATTR bool BLE_CONFIGURED; + #endif \ No newline at end of file diff --git a/src/WatchyRTC.cpp b/src/WatchyRTC.cpp index 721f7d8..5bd0b40 100644 --- a/src/WatchyRTC.cpp +++ b/src/WatchyRTC.cpp @@ -37,7 +37,7 @@ void WatchyRTC::clearAlarm(){ nextAlarmMinute = rtc_pcf.getMinute(); nextAlarmMinute = (nextAlarmMinute == 59) ? 0 : (nextAlarmMinute + 1); //set alarm to trigger 1 minute from now rtc_pcf.setAlarm(nextAlarmMinute, 99, 99, 99); - } + } } void WatchyRTC::read(tmElements_t &tm){ @@ -51,7 +51,7 @@ void WatchyRTC::read(tmElements_t &tm){ tm.Hour = rtc_pcf.getHour(); tm.Minute = rtc_pcf.getMinute(); tm.Second = rtc_pcf.getSecond(); - } + } } void WatchyRTC::set(tmElements_t tm){ @@ -65,7 +65,7 @@ void WatchyRTC::set(tmElements_t tm){ rtc_pcf.setDate(tm.Day, tm.Wday - 1, tm.Month, 0, tmYearToY2k(tm.Year)); //TimeLib & DS3231 has Wday range of 1-7, but PCF8563 stores day of week in 0-6 range //hr, min, sec rtc_pcf.setTime(tm.Hour, tm.Minute, tm.Second); - clearAlarm(); + clearAlarm(); } } @@ -92,7 +92,7 @@ void WatchyRTC::_DSConfig(String datetime){ //String datetime is YYYY:MM:DD:HH:M //https://github.com/JChristensen/DS3232RTC rtc_ds.squareWave(SQWAVE_NONE); //disable square wave output rtc_ds.setAlarm(ALM2_EVERY_MINUTE, 0, 0, 0, 0); //alarm wakes up Watchy every minute - rtc_ds.alarmInterrupt(ALARM_2, true); //enable alarm interrupt + rtc_ds.alarmInterrupt(ALARM_2, true); //enable alarm interrupt } void WatchyRTC::_PCFConfig(String datetime){ //String datetime is YYYY:MM:DD:HH:MM:SS @@ -109,7 +109,7 @@ void WatchyRTC::_PCFConfig(String datetime){ //String datetime is YYYY:MM:DD:HH: //day, weekday, month, century(1=1900, 0=2000), year(0-99) rtc_pcf.setDate(tm.Day, tm.Wday - 1, tm.Month, 0, tmYearToY2k(tm.Year)); //TimeLib & DS3231 has Wday range of 1-7, but PCF8563 stores day of week in 0-6 range //hr, min, sec - rtc_pcf.setTime(tm.Hour, tm.Minute, tm.Second); + rtc_pcf.setTime(tm.Hour, tm.Minute, tm.Second); } //on POR event, PCF8563 sets month to 0, which will give an error since months are 1-12 clearAlarm(); diff --git a/src/bma.cpp b/src/bma.cpp index fe0e6d1..230870e 100644 --- a/src/bma.cpp +++ b/src/bma.cpp @@ -1,329 +1,329 @@ -#include "bma.h" - -#define DEBUGPORT Serial -#ifdef DEBUGPORT -#define DEBUG(...) DEBUGPORT.printf(__VA_ARGS__) -#else -#define DEBUG(...) -#endif - -BMA423::BMA423() -{ - __readRegisterFptr = nullptr; - __writeRegisterFptr = nullptr; - __delayCallBlackFptr = nullptr; - __init = false; -} - -BMA423::~BMA423() -{ - -} - -bool BMA423::begin(bma4_com_fptr_t readCallBlack, - bma4_com_fptr_t writeCallBlack, - bma4_delay_fptr_t delayCallBlack, - uint8_t address) -{ - - if (__init || - readCallBlack == nullptr || - writeCallBlack == nullptr || - delayCallBlack == nullptr) { - return true; - } - - __readRegisterFptr = readCallBlack; - __writeRegisterFptr = writeCallBlack; - __delayCallBlackFptr = delayCallBlack; - - __devFptr.dev_addr = address; - __devFptr.interface = BMA4_I2C_INTERFACE; - __devFptr.bus_read = readCallBlack; - __devFptr.bus_write = writeCallBlack; - __devFptr.delay = delayCallBlack; - __devFptr.read_write_len = 8; - __devFptr.resolution = 12; - __devFptr.feature_len = BMA423_FEATURE_SIZE; - - softReset(); - - __delayCallBlackFptr(20); - - if (bma423_init(&__devFptr) != BMA4_OK) { - DEBUG("BMA423 FAIL\n"); - return false; - } - - if (bma423_write_config_file(&__devFptr) != BMA4_OK) { - DEBUG("BMA423 Write Config FAIL\n"); - return false; - } - - __init = true; - - struct bma4_int_pin_config config ; - config.edge_ctrl = BMA4_LEVEL_TRIGGER; - config.lvl = BMA4_ACTIVE_HIGH; - config.od = BMA4_PUSH_PULL; - config.output_en = BMA4_OUTPUT_ENABLE; - config.input_en = BMA4_INPUT_DISABLE; - - - if (bma4_set_int_pin_config(&config, BMA4_INTR1_MAP, &__devFptr) != BMA4_OK) { - DEBUG("BMA423 SET INT FAIL\n"); - return false; - } - return true; -} - -void BMA423::softReset() -{ - uint8_t reg = BMA4_RESET_ADDR; - __writeRegisterFptr(BMA4_I2C_ADDR_PRIMARY, BMA4_RESET_SET_MASK, ®, 1); -} - -void BMA423::shutDown() -{ - bma4_set_advance_power_save(BMA4_DISABLE, &__devFptr); -} - -void BMA423::wakeUp() -{ - bma4_set_advance_power_save(BMA4_ENABLE, &__devFptr); -} - -uint16_t BMA423::getErrorCode() -{ - struct bma4_err_reg err; - uint16_t rslt = bma4_get_error_status(&err, &__devFptr); - return rslt; -} - -uint16_t BMA423::getStatus() -{ - uint8_t status; - bma4_get_status(&status, &__devFptr); - return status; -} - -uint32_t BMA423::getSensorTime() -{ - uint32_t ms; - bma4_get_sensor_time(&ms, &__devFptr); - return ms; -} - -bool BMA423::selfTest() -{ - return (BMA4_OK == bma4_selftest_config(BMA4_ACCEL_SELFTEST_ENABLE_MSK, &__devFptr)); -} - -uint8_t BMA423::getDirection() -{ - Accel acc; - if (bma4_read_accel_xyz(&acc, &__devFptr) != BMA4_OK) { - return 0; - } - uint16_t absX = abs(acc.x); - uint16_t absY = abs(acc.y); - uint16_t absZ = abs(acc.z); - - if ((absZ > absX) && (absZ > absY)) { - if (acc.z > 0) { - return DIRECTION_DISP_DOWN; - } else { - return DIRECTION_DISP_UP; - } - } else if ((absY > absX) && (absY > absZ)) { - if (acc.y > 0) { - return DIRECTION_RIGHT_EDGE; - } else { - return DIRECTION_LEFT_EDGE; - } - } else { - if (acc.x < 0) { - return DIRECTION_BOTTOM_EDGE; - } else { - return DIRECTION_TOP_EDGE; - } - } -} - -float BMA423::readTemperature() -{ - int32_t data = 0; - bma4_get_temperature(&data, BMA4_DEG, &__devFptr); - float res = (float)data / (float)BMA4_SCALE_TEMP; - /* 0x80 - temp read from the register and 23 is the ambient temp added. - * If the temp read from register is 0x80, it means no valid - * information is available */ - if (((data - 23) / BMA4_SCALE_TEMP) == 0x80) { - res = 0; - } - return res; -} - - -float BMA423::readTemperatureF() -{ - float temp = readTemperature(); - if (temp != 0) { - temp = temp * 1.8 + 32.0; - } - return (temp); -} - -bool BMA423::getAccel(Accel &acc) -{ - memset(&acc, 0, sizeof(acc)); - if (bma4_read_accel_xyz(&acc, &__devFptr) != BMA4_OK) { - return false; - } - return true; -} - -bool BMA423::getAccelEnable() -{ - uint8_t en; - bma4_get_accel_enable(&en, &__devFptr); - return (en & BMA4_ACCEL_ENABLE_POS) == BMA4_ACCEL_ENABLE_POS; -} - -bool BMA423::disableAccel() -{ - return enableAccel(false); -} - -bool BMA423::enableAccel(bool en) -{ - return (BMA4_OK == bma4_set_accel_enable(en ? BMA4_ENABLE : BMA4_DISABLE, &__devFptr)); -} - -bool BMA423::setAccelConfig(Acfg &cfg) -{ - return (BMA4_OK == bma4_set_accel_config(&cfg, &__devFptr)); -} - -bool BMA423::getAccelConfig(Acfg &cfg) -{ - return (BMA4_OK == bma4_get_accel_config(&cfg, &__devFptr)); -} - -bool BMA423::setRemapAxes(struct bma423_axes_remap *remap_data) -{ - return (BMA4_OK == bma423_set_remap_axes(remap_data, &__devFptr)); -} - -bool BMA423::resetStepCounter() -{ - return BMA4_OK == bma423_reset_step_counter(&__devFptr) ; -} - -uint32_t BMA423::getCounter() -{ - uint32_t stepCount; - if (bma423_step_counter_output(&stepCount, &__devFptr) == BMA4_OK) { - return stepCount; - } - return 0; -} - -bool BMA423::setINTPinConfig(struct bma4_int_pin_config config, uint8_t pinMap) -{ - return BMA4_OK == bma4_set_int_pin_config(&config, pinMap, &__devFptr); -} - -bool BMA423::getINT() -{ - return bma423_read_int_status(&__IRQ_MASK, &__devFptr) == BMA4_OK; -} - -uint8_t BMA423::getIRQMASK() -{ - return __IRQ_MASK; -} - -bool BMA423::disableIRQ(uint16_t int_map) -{ - return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, int_map, BMA4_DISABLE, &__devFptr)); -} - -bool BMA423::enableIRQ(uint16_t int_map) -{ - return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, int_map, BMA4_ENABLE, &__devFptr)); -} - -bool BMA423::enableFeature(uint8_t feature, uint8_t enable) -{ - if ((feature & BMA423_STEP_CNTR) == BMA423_STEP_CNTR) { - bma423_step_detector_enable(enable ? BMA4_ENABLE : BMA4_DISABLE, &__devFptr); - } - return (BMA4_OK == bma423_feature_enable(feature, enable, &__devFptr)); -} - -bool BMA423::isStepCounter() -{ - return (bool)(BMA423_STEP_CNTR_INT & __IRQ_MASK); -} - -bool BMA423::isDoubleClick() -{ - return (bool)(BMA423_WAKEUP_INT & __IRQ_MASK); -} - -bool BMA423::isTilt() -{ - return (bool)(BMA423_TILT_INT & __IRQ_MASK); -} - -bool BMA423::isActivity() -{ - return (bool)(BMA423_ACTIVITY_INT & __IRQ_MASK); -} - -bool BMA423::isAnyNoMotion() -{ - return (bool)(BMA423_ANY_NO_MOTION_INT & __IRQ_MASK); -} - -bool BMA423::enableStepCountInterrupt(bool en) -{ - return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_STEP_CNTR_INT, en, &__devFptr)); -} - -bool BMA423::enableTiltInterrupt(bool en) -{ - return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_TILT_INT, en, &__devFptr)); -} - -bool BMA423::enableWakeupInterrupt(bool en) -{ - return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_WAKEUP_INT, en, &__devFptr)); -} - -bool BMA423::enableAnyNoMotionInterrupt(bool en) -{ - return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_ANY_NO_MOTION_INT, en, &__devFptr)); -} - -bool BMA423::enableActivityInterrupt(bool en) -{ - return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_ACTIVITY_INT, en, &__devFptr)); -} - -const char *BMA423::getActivity() -{ - uint8_t activity; - bma423_activity_output(&activity, &__devFptr); - if (activity & BMA423_USER_STATIONARY) { - return "BMA423_USER_STATIONARY"; - } else if (activity & BMA423_USER_WALKING) { - return "BMA423_USER_WALKING"; - } else if (activity & BMA423_USER_RUNNING) { - return "BMA423_USER_RUNNING"; - } else if (activity & BMA423_STATE_INVALID) { - return "BMA423_STATE_INVALID"; - } - return "None"; +#include "bma.h" + +#define DEBUGPORT Serial +#ifdef DEBUGPORT +#define DEBUG(...) DEBUGPORT.printf(__VA_ARGS__) +#else +#define DEBUG(...) +#endif + +BMA423::BMA423() +{ + __readRegisterFptr = nullptr; + __writeRegisterFptr = nullptr; + __delayCallBlackFptr = nullptr; + __init = false; +} + +BMA423::~BMA423() +{ + +} + +bool BMA423::begin(bma4_com_fptr_t readCallBlack, + bma4_com_fptr_t writeCallBlack, + bma4_delay_fptr_t delayCallBlack, + uint8_t address) +{ + + if (__init || + readCallBlack == nullptr || + writeCallBlack == nullptr || + delayCallBlack == nullptr) { + return true; + } + + __readRegisterFptr = readCallBlack; + __writeRegisterFptr = writeCallBlack; + __delayCallBlackFptr = delayCallBlack; + + __devFptr.dev_addr = address; + __devFptr.interface = BMA4_I2C_INTERFACE; + __devFptr.bus_read = readCallBlack; + __devFptr.bus_write = writeCallBlack; + __devFptr.delay = delayCallBlack; + __devFptr.read_write_len = 8; + __devFptr.resolution = 12; + __devFptr.feature_len = BMA423_FEATURE_SIZE; + + softReset(); + + __delayCallBlackFptr(20); + + if (bma423_init(&__devFptr) != BMA4_OK) { + DEBUG("BMA423 FAIL\n"); + return false; + } + + if (bma423_write_config_file(&__devFptr) != BMA4_OK) { + DEBUG("BMA423 Write Config FAIL\n"); + return false; + } + + __init = true; + + struct bma4_int_pin_config config ; + config.edge_ctrl = BMA4_LEVEL_TRIGGER; + config.lvl = BMA4_ACTIVE_HIGH; + config.od = BMA4_PUSH_PULL; + config.output_en = BMA4_OUTPUT_ENABLE; + config.input_en = BMA4_INPUT_DISABLE; + + + if (bma4_set_int_pin_config(&config, BMA4_INTR1_MAP, &__devFptr) != BMA4_OK) { + DEBUG("BMA423 SET INT FAIL\n"); + return false; + } + return true; +} + +void BMA423::softReset() +{ + uint8_t reg = BMA4_RESET_ADDR; + __writeRegisterFptr(BMA4_I2C_ADDR_PRIMARY, BMA4_RESET_SET_MASK, ®, 1); +} + +void BMA423::shutDown() +{ + bma4_set_advance_power_save(BMA4_DISABLE, &__devFptr); +} + +void BMA423::wakeUp() +{ + bma4_set_advance_power_save(BMA4_ENABLE, &__devFptr); +} + +uint16_t BMA423::getErrorCode() +{ + struct bma4_err_reg err; + uint16_t rslt = bma4_get_error_status(&err, &__devFptr); + return rslt; +} + +uint16_t BMA423::getStatus() +{ + uint8_t status; + bma4_get_status(&status, &__devFptr); + return status; +} + +uint32_t BMA423::getSensorTime() +{ + uint32_t ms; + bma4_get_sensor_time(&ms, &__devFptr); + return ms; +} + +bool BMA423::selfTest() +{ + return (BMA4_OK == bma4_selftest_config(BMA4_ACCEL_SELFTEST_ENABLE_MSK, &__devFptr)); +} + +uint8_t BMA423::getDirection() +{ + Accel acc; + if (bma4_read_accel_xyz(&acc, &__devFptr) != BMA4_OK) { + return 0; + } + uint16_t absX = abs(acc.x); + uint16_t absY = abs(acc.y); + uint16_t absZ = abs(acc.z); + + if ((absZ > absX) && (absZ > absY)) { + if (acc.z > 0) { + return DIRECTION_DISP_DOWN; + } else { + return DIRECTION_DISP_UP; + } + } else if ((absY > absX) && (absY > absZ)) { + if (acc.y > 0) { + return DIRECTION_RIGHT_EDGE; + } else { + return DIRECTION_LEFT_EDGE; + } + } else { + if (acc.x < 0) { + return DIRECTION_BOTTOM_EDGE; + } else { + return DIRECTION_TOP_EDGE; + } + } +} + +float BMA423::readTemperature() +{ + int32_t data = 0; + bma4_get_temperature(&data, BMA4_DEG, &__devFptr); + float res = (float)data / (float)BMA4_SCALE_TEMP; + /* 0x80 - temp read from the register and 23 is the ambient temp added. + * If the temp read from register is 0x80, it means no valid + * information is available */ + if (((data - 23) / BMA4_SCALE_TEMP) == 0x80) { + res = 0; + } + return res; +} + + +float BMA423::readTemperatureF() +{ + float temp = readTemperature(); + if (temp != 0) { + temp = temp * 1.8 + 32.0; + } + return (temp); +} + +bool BMA423::getAccel(Accel &acc) +{ + memset(&acc, 0, sizeof(acc)); + if (bma4_read_accel_xyz(&acc, &__devFptr) != BMA4_OK) { + return false; + } + return true; +} + +bool BMA423::getAccelEnable() +{ + uint8_t en; + bma4_get_accel_enable(&en, &__devFptr); + return (en & BMA4_ACCEL_ENABLE_POS) == BMA4_ACCEL_ENABLE_POS; +} + +bool BMA423::disableAccel() +{ + return enableAccel(false); +} + +bool BMA423::enableAccel(bool en) +{ + return (BMA4_OK == bma4_set_accel_enable(en ? BMA4_ENABLE : BMA4_DISABLE, &__devFptr)); +} + +bool BMA423::setAccelConfig(Acfg &cfg) +{ + return (BMA4_OK == bma4_set_accel_config(&cfg, &__devFptr)); +} + +bool BMA423::getAccelConfig(Acfg &cfg) +{ + return (BMA4_OK == bma4_get_accel_config(&cfg, &__devFptr)); +} + +bool BMA423::setRemapAxes(struct bma423_axes_remap *remap_data) +{ + return (BMA4_OK == bma423_set_remap_axes(remap_data, &__devFptr)); +} + +bool BMA423::resetStepCounter() +{ + return BMA4_OK == bma423_reset_step_counter(&__devFptr) ; +} + +uint32_t BMA423::getCounter() +{ + uint32_t stepCount; + if (bma423_step_counter_output(&stepCount, &__devFptr) == BMA4_OK) { + return stepCount; + } + return 0; +} + +bool BMA423::setINTPinConfig(struct bma4_int_pin_config config, uint8_t pinMap) +{ + return BMA4_OK == bma4_set_int_pin_config(&config, pinMap, &__devFptr); +} + +bool BMA423::getINT() +{ + return bma423_read_int_status(&__IRQ_MASK, &__devFptr) == BMA4_OK; +} + +uint8_t BMA423::getIRQMASK() +{ + return __IRQ_MASK; +} + +bool BMA423::disableIRQ(uint16_t int_map) +{ + return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, int_map, BMA4_DISABLE, &__devFptr)); +} + +bool BMA423::enableIRQ(uint16_t int_map) +{ + return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, int_map, BMA4_ENABLE, &__devFptr)); +} + +bool BMA423::enableFeature(uint8_t feature, uint8_t enable) +{ + if ((feature & BMA423_STEP_CNTR) == BMA423_STEP_CNTR) { + bma423_step_detector_enable(enable ? BMA4_ENABLE : BMA4_DISABLE, &__devFptr); + } + return (BMA4_OK == bma423_feature_enable(feature, enable, &__devFptr)); +} + +bool BMA423::isStepCounter() +{ + return (bool)(BMA423_STEP_CNTR_INT & __IRQ_MASK); +} + +bool BMA423::isDoubleClick() +{ + return (bool)(BMA423_WAKEUP_INT & __IRQ_MASK); +} + +bool BMA423::isTilt() +{ + return (bool)(BMA423_TILT_INT & __IRQ_MASK); +} + +bool BMA423::isActivity() +{ + return (bool)(BMA423_ACTIVITY_INT & __IRQ_MASK); +} + +bool BMA423::isAnyNoMotion() +{ + return (bool)(BMA423_ANY_NO_MOTION_INT & __IRQ_MASK); +} + +bool BMA423::enableStepCountInterrupt(bool en) +{ + return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_STEP_CNTR_INT, en, &__devFptr)); +} + +bool BMA423::enableTiltInterrupt(bool en) +{ + return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_TILT_INT, en, &__devFptr)); +} + +bool BMA423::enableWakeupInterrupt(bool en) +{ + return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_WAKEUP_INT, en, &__devFptr)); +} + +bool BMA423::enableAnyNoMotionInterrupt(bool en) +{ + return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_ANY_NO_MOTION_INT, en, &__devFptr)); +} + +bool BMA423::enableActivityInterrupt(bool en) +{ + return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_ACTIVITY_INT, en, &__devFptr)); +} + +const char *BMA423::getActivity() +{ + uint8_t activity; + bma423_activity_output(&activity, &__devFptr); + if (activity & BMA423_USER_STATIONARY) { + return "BMA423_USER_STATIONARY"; + } else if (activity & BMA423_USER_WALKING) { + return "BMA423_USER_WALKING"; + } else if (activity & BMA423_USER_RUNNING) { + return "BMA423_USER_RUNNING"; + } else if (activity & BMA423_STATE_INVALID) { + return "BMA423_STATE_INVALID"; + } + return "None"; } \ No newline at end of file diff --git a/src/bma.h b/src/bma.h index 8f2f3a7..6bae2aa 100644 --- a/src/bma.h +++ b/src/bma.h @@ -1,88 +1,88 @@ -#pragma once - -#ifdef ARDUINO -#include -#else -#include -#endif - -#include "bma423.h" - -enum { - DIRECTION_TOP_EDGE = 0, - DIRECTION_BOTTOM_EDGE = 1, - DIRECTION_LEFT_EDGE = 2, - DIRECTION_RIGHT_EDGE = 3, - DIRECTION_DISP_UP = 4, - DIRECTION_DISP_DOWN = 5 -} ; - -typedef struct bma4_accel Accel; -typedef struct bma4_accel_config Acfg; - -class BMA423 -{ - -public: - BMA423(); - ~BMA423(); - - bool begin(bma4_com_fptr_t readCallBlack, bma4_com_fptr_t writeCallBlack, bma4_delay_fptr_t delayCallBlack, - uint8_t address = BMA4_I2C_ADDR_PRIMARY); - - void softReset(); - void shutDown(); - void wakeUp(); - bool selfTest(); - - uint8_t getDirection(); - - bool setAccelConfig(Acfg &cfg); - bool getAccelConfig(Acfg &cfg); - bool getAccel(Accel &acc); - bool getAccelEnable(); - bool disableAccel(); - bool enableAccel(bool en = true); - - bool setINTPinConfig(struct bma4_int_pin_config config, uint8_t pinMap); - bool getINT(); - uint8_t getIRQMASK(); - bool disableIRQ(uint16_t int_map = BMA423_STEP_CNTR_INT); - bool enableIRQ(uint16_t int_map = BMA423_STEP_CNTR_INT); - bool isStepCounter(); - bool isDoubleClick(); - bool isTilt(); - bool isActivity(); - bool isAnyNoMotion(); - - bool resetStepCounter(); - uint32_t getCounter(); - - float readTemperature(); - float readTemperatureF(); - - uint16_t getErrorCode(); - uint16_t getStatus(); - uint32_t getSensorTime(); - - - const char *getActivity(); - bool setRemapAxes(struct bma423_axes_remap *remap_data); - - bool enableFeature(uint8_t feature, uint8_t enable ); - bool enableStepCountInterrupt(bool en = true); - bool enableTiltInterrupt(bool en = true); - bool enableWakeupInterrupt(bool en = true); - bool enableAnyNoMotionInterrupt(bool en = true); - bool enableActivityInterrupt(bool en = true); - -private: - bma4_com_fptr_t __readRegisterFptr; - bma4_com_fptr_t __writeRegisterFptr; - bma4_delay_fptr_t __delayCallBlackFptr; - - uint8_t __address; - uint16_t __IRQ_MASK; - bool __init; - struct bma4_dev __devFptr; -}; +#pragma once + +#ifdef ARDUINO +#include +#else +#include +#endif + +#include "bma423.h" + +enum { + DIRECTION_TOP_EDGE = 0, + DIRECTION_BOTTOM_EDGE = 1, + DIRECTION_LEFT_EDGE = 2, + DIRECTION_RIGHT_EDGE = 3, + DIRECTION_DISP_UP = 4, + DIRECTION_DISP_DOWN = 5 +} ; + +typedef struct bma4_accel Accel; +typedef struct bma4_accel_config Acfg; + +class BMA423 +{ + +public: + BMA423(); + ~BMA423(); + + bool begin(bma4_com_fptr_t readCallBlack, bma4_com_fptr_t writeCallBlack, bma4_delay_fptr_t delayCallBlack, + uint8_t address = BMA4_I2C_ADDR_PRIMARY); + + void softReset(); + void shutDown(); + void wakeUp(); + bool selfTest(); + + uint8_t getDirection(); + + bool setAccelConfig(Acfg &cfg); + bool getAccelConfig(Acfg &cfg); + bool getAccel(Accel &acc); + bool getAccelEnable(); + bool disableAccel(); + bool enableAccel(bool en = true); + + bool setINTPinConfig(struct bma4_int_pin_config config, uint8_t pinMap); + bool getINT(); + uint8_t getIRQMASK(); + bool disableIRQ(uint16_t int_map = BMA423_STEP_CNTR_INT); + bool enableIRQ(uint16_t int_map = BMA423_STEP_CNTR_INT); + bool isStepCounter(); + bool isDoubleClick(); + bool isTilt(); + bool isActivity(); + bool isAnyNoMotion(); + + bool resetStepCounter(); + uint32_t getCounter(); + + float readTemperature(); + float readTemperatureF(); + + uint16_t getErrorCode(); + uint16_t getStatus(); + uint32_t getSensorTime(); + + + const char *getActivity(); + bool setRemapAxes(struct bma423_axes_remap *remap_data); + + bool enableFeature(uint8_t feature, uint8_t enable ); + bool enableStepCountInterrupt(bool en = true); + bool enableTiltInterrupt(bool en = true); + bool enableWakeupInterrupt(bool en = true); + bool enableAnyNoMotionInterrupt(bool en = true); + bool enableActivityInterrupt(bool en = true); + +private: + bma4_com_fptr_t __readRegisterFptr; + bma4_com_fptr_t __writeRegisterFptr; + bma4_delay_fptr_t __delayCallBlackFptr; + + uint8_t __address; + uint16_t __IRQ_MASK; + bool __init; + struct bma4_dev __devFptr; +}; diff --git a/src/bma4.c b/src/bma4.c index 2b38fa1..cd0cbd6 100644 --- a/src/bma4.c +++ b/src/bma4.c @@ -1,4204 +1,4204 @@ -/* -**************************************************************************** -* Copyright (C) 2015 - 2016 Bosch Sensortec GmbH -* -* File :bma4.c -* -* Date: 12 Oct 2017 -* -* Revision: 2.1.9 $ -* -* Usage: Sensor Driver for BMA4 family of sensors -* -**************************************************************************** -* Disclaimer -* -* Common: -* Bosch Sensortec products are developed for the consumer goods industry. -* They may only be used within the parameters of the respective valid -* product data sheet. Bosch Sensortec products are provided with the -* express understanding that there is no warranty of fitness for a -* particular purpose.They are not fit for use in life-sustaining, -* safety or security sensitive systems or any system or device -* that may lead to bodily harm or property damage if the system -* or device malfunctions. In addition,Bosch Sensortec products are -* not fit for use in products which interact with motor vehicle systems. -* The resale and or use of products are at the purchasers own risk and -* his own responsibility. The examination of fitness for the intended use -* is the sole responsibility of the Purchaser. -* -* The purchaser shall indemnify Bosch Sensortec from all third party -* claims, including any claims for incidental, or consequential damages, -* arising from any product use not covered by the parameters of -* the respective valid product data sheet or not approved by -* Bosch Sensortec and reimburse Bosch Sensortec for all costs in -* connection with such claims. -* -* The purchaser must monitor the market for the purchased products, -* particularly with regard to product safety and inform Bosch Sensortec -* without delay of all security relevant incidents. -* -* Engineering Samples are marked with an asterisk (*) or (e). -* Samples may vary from the valid technical specifications of the product -* series. They are therefore not intended or fit for resale to third -* parties or for use in end products. Their sole purpose is internal -* client testing. The testing of an engineering sample may in no way -* replace the testing of a product series. Bosch Sensortec assumes -* no liability for the use of engineering samples. -* By accepting the engineering samples, the Purchaser agrees to indemnify -* Bosch Sensortec from all claims arising from the use of engineering -* samples. -* -* Special: -* This software module (hereinafter called "Software") and any information -* on application-sheets (hereinafter called "Information") is provided -* free of charge for the sole purpose to support your application work. -* The Software and Information is subject to the following -* terms and conditions: -* -* The Software is specifically designed for the exclusive use for -* Bosch Sensortec products by personnel who have special experience -* and training. Do not use this Software if you do not have the -* proper experience or training. -* -* This Software package is provided `` as is `` and without any expressed -* or implied warranties,including without limitation, the implied warranties -* of merchantability and fitness for a particular purpose. -* -* Bosch Sensortec and their representatives and agents deny any liability -* for the functional impairment -* of this Software in terms of fitness, performance and safety. -* Bosch Sensortec and their representatives and agents shall not be liable -* for any direct or indirect damages or injury, except as -* otherwise stipulated in mandatory applicable law. -* -* The Information provided is believed to be accurate and reliable. -* Bosch Sensortec assumes no responsibility for the consequences of use -* of such Information nor for any infringement of patents or -* other rights of third parties which may result from its use. -* No license is granted by implication or otherwise under any patent or -* patent rights of Bosch. Specifications mentioned in the Information are -* subject to change without notice. -**************************************************************************/ -/*! \file bma4.c - \brief Sensor Driver for BMA4 family of sensors */ -/***************************************************************************/ -/**\name Header files -****************************************************************************/ -#include "bma4.h" - -/***************************************************************************/ -/**\name Static Data Buffer -****************************************************************************/ -/* Local array to store the values read from the register - * using read_regs API */ -static uint8_t temp_buff[BMA4_MAX_BUFFER_SIZE] = {0}; - -/***************************************************************************/ -/**\name Local structures -****************************************************************************/ -/*! - * @brief Accel difference value of axis. - */ -struct data_with_sign { - /*! Difference value */ - int16_t val; - /*! Indicates negative value if set */ - uint8_t is_negative; -}; - -/*! - * @brief Accel data deviation from ideal value - */ -struct offset_delta { - /*! Accel x axis */ - struct data_with_sign x; - /*! Accel y axis */ - struct data_with_sign y; - /*! Accel z axis */ - struct data_with_sign z; -}; - -/*! - * @brief Accel offset xyz structure - */ -struct accel_offset { - /*! Accel offset X data */ - uint8_t x; - /*! Accel offset Y data */ - uint8_t y; - /*! Accel offset Z data */ - uint8_t z; -}; - -/*! - * @brief Accel self test diff xyz data structure - */ -struct selftest_delta_limit { - /*! Accel X data */ - int32_t x; - /*! Accel Y data */ - int32_t y; - /*! Accel Z data */ - int32_t z; -}; - -/*! - * @brief Structure to store temp data values - */ -struct accel_temp { - /*! Accel X temp data */ - int32_t x; - /*! Accel Y temp data */ - int32_t y; - /*! Accel Z temp data */ - int32_t z; -}; - -/***************************************************************************/ -/*! Static Function Declarations -****************************************************************************/ - -/*! - * @brief This API validates the bandwidth and perfmode - * value set by the user. - * - * param bandwidth[in] : bandwidth value set by the user. - * param perf_mode[in] : perf_mode value set by the user. - */ -static uint16_t validate_bandwidth_perfmode(uint8_t bandwidth, uint8_t perf_mode); - -/*! - * @brief @brief This API validates the ODR value set by the user. - * - * param bandwidth[in] : odr for accelerometer - */ -static uint16_t validate_odr(uint8_t odr); - -/*! - * @brief This API is used to reset the FIFO related configurations - * in the fifo_frame structure. - * - * @param dev[in,out] : Structure instance of bma4_dev - * - */ -static void reset_fifo_data_structure(const struct bma4_dev *dev); - -/*! - * @brief This API computes the number of bytes of accel FIFO data - * which is to be parsed in header-less mode - * - * @param[out] start_idx : The start index for parsing data - * @param[out] len : Number of bytes to be parsed - * @param[in] acc_count : Number of accelerometer frames to be read - * @param[in] dev : Structure instance of bma4_dev. - * - */ -static void get_accel_len_to_parse(uint16_t *start_idx, uint16_t *len, const uint16_t *acc_count, - const struct bma4_dev *dev); - -/*! - * @brief This API checks the fifo read data as empty frame, if it - * is empty frame then moves the index to last byte. - * - * @param[in,out] data_index : The index of the current data to - * be parsed from fifo data - * @param[in] dev : Structure instance of bma4_dev. - */ -static void check_empty_fifo(uint16_t *data_index, const struct bma4_dev *dev); - -/*! - * @brief This API is used to parse the accelerometer data from the - * FIFO data in header mode. - * - * @param[in,out] accel_data : Structure instance of bma4_accel where - * the accelerometer data in FIFO is stored. - * @param[in,out] accel_length : Number of accelerometer frames - * (x,y,z axes data) - * @param[in,out] dev : Structure instance of bma4_dev. - * - */ -static void extract_accel_header_mode(struct bma4_accel *accel_data, uint16_t *accel_length, - const struct bma4_dev *dev); - -/*! - * @brief This API is used to parse the accelerometer data from the - * FIFO data in both header mode and header-less mode. - * It update the idx value which is used to store the index of - * the current data byte which is parsed. - * - * @param[in,out] acc : Structure instance of bma4_accel. - * @param[in,out] idx : Index value of number of bytes parsed - * @param[in,out] acc_idx : Index value of accelerometer data - * (x,y,z axes) frame to be parsed - * @param[in] frm : It consists of either fifo_data_enable - * parameter (Accel and/or mag data enabled in FIFO) - * in header-less mode or frame header data - * in header mode - * @param[in] dev : Structure instance of bma4_dev. - * - */ -static void unpack_acc_frm(struct bma4_accel *acc, uint16_t *idx, uint16_t *acc_idx, uint8_t frm, - const struct bma4_dev *dev); - -/*! - * @brief This API is used to parse the accelerometer data from the - * FIFO data and store it in the instance of the structure bma4_accel. - * - * @param[out] accel_data : Structure instance of bma4_accel where - * the parsed accel data bytes are stored. - * @param[in] data_start_index : Index value of the accel data bytes - * which is to be parsed from the fifo data. - * @param[in] dev : Structure instance of bma4_dev. - * - */ -static void unpack_accel_data(struct bma4_accel *accel_data, uint16_t data_start_index, const struct bma4_dev *dev); -/*! - * @brief This API computes the number of bytes of Mag FIFO data which is - * to be parsed in header-less mode - * - * @param[out] start_idx : The start index for parsing data - * @param[out] len : Number of bytes to be parsed - * @param[in] mag_count : Number of magnetometer frames to be read - * @param[in] dev : Structure instance of bma4_dev. - * - */ -static void get_mag_len_to_parse(uint16_t *start_idx, uint16_t *len, const uint16_t *mag_count, - const struct bma4_dev *dev); -/*! - * @brief This API is used to parse the magnetometer data from the - * FIFO data in header mode. - * - * @param[in,out] data : Structure instance of bma4_mag_xyzr where - * the magnetometer data in FIFO is extracted - * and stored. - * @param[in,out] len : Number of magnetometer frames - * (x,y,z,r data) - * @param[in,out] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static uint16_t extract_mag_header_mode(struct bma4_mag *data, uint16_t *len, const struct bma4_dev *dev); - -/*! - * @brief This API is used to parse the magnetometer data from the - * FIFO data in both header mode and header-less mode and update the - * idx value which is used to store the index of the current - * data byte which is parsed. - * - * @param data : Structure instance of bma4_mag_xyzr. - * @param idx : Index value of number of bytes parsed - * @param mag_idx : Index value magnetometer data frame (x,y,z,r) - * to be parsed - * @param frm : It consists of either the fifo_data_enable parameter - * (Accel and/or mag data enabled in FIFO) in - * header-less mode and frame header data in header mode - * @param dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static uint16_t unpack_mag_frm(struct bma4_mag *data, uint16_t *idx, uint16_t *mag_idx, uint8_t frm, - const struct bma4_dev *dev); - -/*! - * @brief This API is used to parse the auxiliary magnetometer data from - * the FIFO data and store it in the instance of the structure mag_data. - * - * @param mag_data : Structure instance of bma4_mag_xyzr where the - * parsed magnetometer data bytes are stored. - * @param start_idx : Index value of the magnetometer data bytes - * which is to be parsed from the FIFO data - * @param dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static uint16_t unpack_mag_data(struct bma4_mag *mag_data, uint16_t start_idx, const struct bma4_dev *dev); - -/*! - * @brief This API is used to parse and store the sensor time from the - * FIFO data in the structure instance dev. - * - * @param[in,out] data_index : Index of the FIFO data which - * has the sensor time. - * @param[in,out] dev : Structure instance of bma4_dev. - * - */ -static void unpack_sensortime_frame(uint16_t *data_index, const struct bma4_dev *dev); - -/*! - * @brief This API is used to parse and store the skipped_frame_count from - * the FIFO data in the structure instance dev. - * - * @param[in,out] data_index : Index of the FIFO data which - * has the skipped frame count. - * @param[in,out] dev : Structure instance of bma4_dev. - * - */ -static void unpack_skipped_frame(uint16_t *data_index, const struct bma4_dev *dev); - -/*! - * @brief This API is used to parse and store the dropped_frame_count from - * the FIFO data in the structure instance dev. - * - * @param[in,out] data_index : Index of the FIFO data which - * has the dropped frame data. - * @param[in,out] dev : Structure instance of bma4_dev. - * - */ -static void unpack_dropped_frame(uint16_t *data_index, const struct bma4_dev *dev); - -/*! - * @brief This API is used to move the data index ahead of the - * current_frame_length parameter when unnecessary FIFO data appears while - * extracting the user specified data. - * - * @param[in,out] data_index : Index of the FIFO data which - * is to be moved ahead of the - * current_frame_length - * @param[in] current_frame_length : Number of bytes in a particular frame - * @param[in] dev : Structure instance of bma4_dev. - * - */ -static void move_next_frame(uint16_t *data_index, uint8_t current_frame_length, const struct bma4_dev *dev); - -/*! -* @brief This API writes the config stream data in memory using burst mode -* -* @param[in] stream_data : Pointer to store data of 32 bytes -* @param[in] index : Represents value in multiple of 32 bytes -* @param[in] dev : Structure instance of bma4_dev. -* -* @return Result of API execution status -* @retval 0 -> Success -* @retval Any non zero value -> Fail -*/ -static uint16_t stream_transfer_write(const uint8_t *stream_data, uint16_t index, struct bma4_dev *dev); - -/*! - * @brief This API enables or disables the Accel Self test feature in the - * sensor. - * - * @param[in] accel_selftest_enable : Variable used to enable or disable - * the Accel self test feature - * Value | Description - * --------|--------------- - * 0x00 | BMA4_DISABLE - * 0x01 | BMA4_ENABLE - * - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static uint16_t set_accel_selftest_enable(uint8_t accel_selftest_axis, struct bma4_dev *dev); - -/*! - * @brief This API selects the sign of Accel self-test excitation - * - * @param[in] accel_selftest_sign: Variable used to select the Accel - * self test sign - * Value | Description - * --------|-------------------------- - * 0x00 | BMA4_DISABLE (negative) - * 0x01 | BMA4_ENABLE (positive) - * - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static uint16_t set_accel_selftest_sign(uint8_t accel_selftest_sign, struct bma4_dev *dev); - -/*! - * @brief This API sets the Accel self test amplitude in the sensor. - * - * @param[in] accel_selftest_amp : Variable used to specify the Accel self - * test amplitude - * Value | Description - * --------|------------------------------------ - * 0x00 | BMA4_SELFTEST_AMP_LOW - * 0x01 | BMA4_SELFTEST_AMP_HIGH - * - * @param[in] dev : structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static uint16_t set_accel_selftest_amp(uint8_t accel_selftest_amp, struct bma4_dev *dev); - -/*! - * @brief This function enables and configures the Accel which is needed - * for Self test operation. - * - * @param[in] dev : Structure instance of bma4_dev - * - * @return results of self test - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static uint16_t set_accel_selftest_config(struct bma4_dev *dev); - -/*! - * @brief This API validates the Accel g value provided as input by the - * user for Accel offset compensation. - * - * @param[in] gvalue : Pointer variable used to specify the g value - * set by the user for Accel offset compensation. - * - * @note The g-values to be passed to the parameter should be - * multiples of 1000000. - * - * @return results of the status of user input validation - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static uint16_t validate_user_input(const int32_t *gvalue); -/*! - * @brief This API converts the range value into corresponding integer - * value. - * - * @param[in] range_in : input range value. - * @param[out] range_out : pointer to store the integer value of range. - * - * @return results of the status of user input validation - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static void map_range(uint8_t range_in, uint8_t *range_out); - -/*! - * @brief This API normalise the data with offset. - * - * @param[out] compensated_data : pointer to store the compensated data. - * @param[in] offset_data : pointer of offset. - * - * @return results of the status of user input validation - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static void normalise_offset(const struct offset_delta *compensated_data, struct accel_offset *offset_data); - -/*! - * @brief This API normalise the data with offset. - * - * @param[in] res : resolution of the sensor. - * @param[in] range : G-range of the accel. - * @param[in] delta : pointer of offset_delta. - * @param[out] data : pointer to store accel_offset data. - * - * @return results of the status of user input validation - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static void scale_offset(uint8_t res, uint8_t range, const struct offset_delta *delta, struct accel_offset *data); - -/*! - * @brief This API compensate the accel data against gravity. - * - * @param[in] lsb_per_g : lsb value pre 1g. - * @param[in] g_val : G reference value of all axis. - * @param[in] data : pointer of accel_offset data. - * @param[out] comp_data : pointer to store compensated data. - * - * @note The g-values to be passed to the parameter should be - * multiples of 1000000. - * - * @return results of the status of user input validation - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static void comp_for_grvty(uint16_t lsb_per_g, const int32_t g_val[3], const struct bma4_accel *data, - struct offset_delta *comp_data); -/*! - * @brief This function validates the Accel Self test data and decides the - * result of Self test operation. - * - * @param[in] accel_data_diff : Pointer to structure variable which holds - * the Accel data difference of Self test operation - * @param[in] dev : Structure instance of bma4_dev - * - * @return results of self test operation - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static uint16_t validate_selftest(const struct selftest_delta_limit *accel_data_diff, - const struct bma4_dev *dev); - -/*! - * @brief This function configure the Accel for FOC. - * - * @param[in] acc_conf : accel config structure instance - * @param[in] acc_en : enables the accel - * @param[in] pwr_mode : set the power mode - * @param[in] dev : Structure instance of bma4_dev - * - * @return results of self test operation - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -static uint16_t foc_config(struct bma4_accel_config *acc_conf, uint8_t *acc_en, uint8_t *pwr_mode, - struct bma4_dev *dev); - -/*! - * @brief This API converts lsb value of axes to mg for self-test - * - * @param[in] accel_data_diff : Pointer variable used to pass accel difference - * values in g - * @param[out] accel_data_diff_mg : Pointer variable used to store accel - * difference values in mg - * @param[out] dev : Structure instance of bma4_dev - * - * @return None * - */ -static void convert_lsb_g(const struct selftest_delta_limit *accel_data_diff, - struct selftest_delta_limit *accel_data_diff_mg, - const struct bma4_dev *dev); - -/*! - * @brief This API sets the feature config. data start address in the sensor. - * - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -static uint16_t set_feature_config_start_addr(struct bma4_dev *dev); - -/*! - * @brief This API increments the feature config. data address according to the user - * provided read/write length in the dev structure. - * - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -static uint16_t increment_feature_config_addr(const struct bma4_dev *dev); - -/*! - * @brief This API reads the 8-bit data from the given register - * in the sensor. - */ -static uint16_t read_regs(uint8_t addr, uint8_t *data, uint8_t len, const struct bma4_dev *dev); - -/*! - * @brief This API writes the 8-bit data to the given register - * in the sensor. - */ -static uint16_t write_regs(uint8_t addr, uint8_t *data, uint8_t len, const struct bma4_dev *dev); - -/*! - * @brief This API sets the feature config. data start address in the sensor. - */ -static uint16_t get_feature_config_start_addr(struct bma4_dev *dev); - -/*! - * @brief This API is used to calculate the power of given - * base value. - * - * @param[in] base : value of base - * @param[in] resolution : resolution of the sensor - * - * @return : return the value of base^resolution - */ - -static int32_t power(int16_t base, uint8_t resolution); - -/*! - * @brief This API performs roundoff on given value - * - * @param[in] value : Value which is need to be rounded off - * - * @return : None - */ -static int8_t roundoff(int32_t value); - -/*! - * @brief This API finds the bit position of 3.9mg according to given range - * and resolution. - * - * @param[in] range : range of the accel. - * @param[in] res : resolution of the accel. - * - * @return : bit position of 3.9mg - */ -static int8_t get_bit_pos_3_9mg(uint8_t range, uint8_t res); - -/*! - * @brief This API finds the the null error of the device pointer structure - * - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Null error - */ -static uint16_t bma4_null_pointer_check(const struct bma4_dev *dev); - -/*! - * @brief This internal API brings up the secondary interface to access - * auxiliary sensor - * - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * - * @retval 0 if success, else fail - */ -static uint16_t bma4_set_aux_interface_config(struct bma4_dev *dev); - -/*! - * @brief This internal API reads the data from the auxiliary sensor - * depending on burst length configured - * - * @param[in] dev : Structure instance of bma4_dev. - * @param[out] aux_data : Pointer variable to store data read - * @param[in] aux_reg_addr : Variable to pass address from where - * data is to be read - * - * @return Result of API execution status - * - * @retval 0 if success, else fail - */ -static uint16_t bma4_extract_aux_data(uint8_t aux_reg_addr, uint8_t *aux_data, uint16_t len, struct bma4_dev *dev); - -/*! - * @brief This internal API maps the actual burst read length with user length set. - * - * @param[in] dev : Structure instance of bma4_dev. - * @param[out] len : Pointer variable to store mapped length - * - * @return Result of API execution status - * - * @retval 0 if success, else fail - */ -static uint16_t bma4_map_read_len(uint8_t *len, const struct bma4_dev *dev); - -/***************************************************************************/ -/**\name Extern Declarations -****************************************************************************/ - -/***************************************************************************/ -/**\name Globals -****************************************************************************/ - - -/***************************************************************************/ -/**\name Function definitions -****************************************************************************/ -/*! - * @brief This API is the entry point. - * Call this API before using all other APIs. - * This API reads the chip-id of the sensor which is the first step to - * verify the sensor and also it configures the read mechanism of SPI and - * I2C interface. - */ -uint16_t bma4_init(struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - /* Check the bma4 structure as NULL */ - if ((dev == NULL) || (dev->bus_read == NULL) || (dev->bus_write == NULL)) { - rslt |= BMA4_E_NULL_PTR; - } else { - if (dev->interface == BMA4_SPI_INTERFACE) - dev->dummy_byte = 1; - else - dev->dummy_byte = 0; - - rslt |= bma4_read_regs(BMA4_CHIP_ID_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - /* Assign Chip Id */ - dev->chip_id = data; - } - } - - return rslt; -} - -/*! - * @brief This API is used to write the binary configuration in the sensor - */ -uint16_t bma4_write_config_file(struct bma4_dev *dev) -{ - uint16_t rslt; - /* Config loading disable*/ - uint8_t config_load = 0; - uint16_t index = 0; - uint8_t config_stream_status = 0; - - /* Disable advanced power save */ - rslt = bma4_set_advance_power_save(BMA4_DISABLE, dev); - /* Wait for sensor time synchronization. Refer the data-sheet for - more information*/ - dev->delay(1); - - if (rslt == BMA4_OK) { - /* Disable config loading*/ - rslt |= bma4_write_regs(BMA4_INIT_CTRL_ADDR, &config_load, 1, dev); - /* Write the config stream */ - for (index = 0; index < BMA4_CONFIG_STREAM_SIZE; index += dev->read_write_len) - rslt |= stream_transfer_write((dev->config_file_ptr + index), index, dev); - - /* Enable config loading and FIFO mode */ - config_load = 0x01; - rslt |= bma4_write_regs(BMA4_INIT_CTRL_ADDR, &config_load, 1, dev); - /* Wait till ASIC is initialized. Refer the data-sheet for - more information*/ - dev->delay(150); - /* Read the status of config stream operation */ - rslt |= bma4_read_regs(BMA4_INTERNAL_STAT, &config_stream_status, 1, dev); - - if (config_stream_status != BMA4_ASIC_INITIALIZED) { - rslt |= BMA4_E_CONFIG_STREAM_ERROR; - } else { - /* Enable advanced power save */ - rslt |= bma4_set_advance_power_save(BMA4_ENABLE, dev); - rslt |= get_feature_config_start_addr(dev); - } - } - return rslt; -} - -/*! - * @brief This API checks whether the write operation requested is for feature - * config or register write and accordingly writes the data in the sensor. - */ -uint16_t bma4_write_regs(uint8_t addr, uint8_t *data, uint8_t len, struct bma4_dev *dev) -{ - uint8_t i; - uint8_t loop_count; - uint8_t overflow; - uint8_t index; - uint16_t rslt = BMA4_OK; - uint8_t adv_pwr_save = 0; - - /* Check the dev structure as NULL*/ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - if (addr == BMA4_FEATURE_CONFIG_ADDR) { - /* Disable APS if enabled before writing the feature config register */ - rslt = bma4_get_advance_power_save(&adv_pwr_save, dev); - if (adv_pwr_save == BMA4_ENABLE) { - rslt |= bma4_set_advance_power_save(BMA4_DISABLE, dev); - /* Wait for sensor time synchronization. Refer the data-sheet for - more information*/ - dev->delay(1); - } - - if (((len % 2) == 0) && (len <= dev->feature_len) && (rslt == BMA4_OK)) { - if (dev->read_write_len < len) { - /* Calculate the no of writes to be performed according - to the read/write length */ - loop_count = len / dev->read_write_len; - overflow = len % dev->read_write_len; - index = 0; - rslt = set_feature_config_start_addr(dev); - for (i = 0; i < loop_count; i++) { - rslt |= write_regs(BMA4_FEATURE_CONFIG_ADDR, data + index, - dev->read_write_len, dev); - rslt |= increment_feature_config_addr(dev); - index = index + dev->read_write_len; - } - if (overflow) - rslt |= write_regs(BMA4_FEATURE_CONFIG_ADDR, data + index, - overflow, dev); - rslt |= set_feature_config_start_addr(dev); - } else { - rslt = write_regs(BMA4_FEATURE_CONFIG_ADDR, data, len, dev); - } - } else { - rslt = BMA4_E_RD_WR_LENGTH_INVALID; - } - - if (rslt == BMA4_OK) { - /* Enable APS once write feature config register is done */ - rslt = bma4_get_advance_power_save(&adv_pwr_save, dev); - if (adv_pwr_save == BMA4_DISABLE) { - rslt |= bma4_set_advance_power_save(BMA4_ENABLE, dev); - /* Wait for sensor time synchronization. Refer the data-sheet for - more information*/ - dev->delay(1); - } - } - - } else { - rslt = write_regs(addr, data, len, dev); - } - } - - return rslt; -} - -/*! - * @brief This API writes the 8-bit data to the given register - * in the sensor. - */ -static uint16_t write_regs(uint8_t addr, uint8_t *data, uint8_t len, const struct bma4_dev *dev) -{ - uint16_t rslt = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - if (dev->interface == BMA4_SPI_INTERFACE) - addr = addr & BMA4_SPI_WR_MASK; - /* write data in the register*/ - rslt |= dev->bus_write(dev->dev_addr, addr, data, len); - } - return rslt; -} - -/*! - * @brief This API sets the feature config. data start address in the sensor. - */ -static uint16_t get_feature_config_start_addr(struct bma4_dev *dev) -{ - uint16_t rslt; - uint8_t asic_lsb; - uint8_t asic_msb; - - rslt = read_regs(BMA4_RESERVED_REG_5B_ADDR, &asic_lsb, 1, dev); - rslt |= read_regs(BMA4_RESERVED_REG_5C_ADDR, &asic_msb, 1, dev); - - /* Store asic info in dev structure */ - dev->asic_data.asic_lsb = asic_lsb & 0x0F; - dev->asic_data.asic_msb = asic_msb; - - return rslt; -} - -/*! - * @brief This API sets the feature config. data start address in the sensor. - */ -static uint16_t set_feature_config_start_addr(struct bma4_dev *dev) -{ - uint16_t rslt; - - rslt = write_regs(BMA4_RESERVED_REG_5B_ADDR, &dev->asic_data.asic_lsb, 1, dev); - rslt |= write_regs(BMA4_RESERVED_REG_5C_ADDR, &dev->asic_data.asic_msb, 1, dev); - - return rslt; -} - -/*! - * @brief This API increments the feature config. data address according to the user - * provided read/write length in the dev structure. - */ -static uint16_t increment_feature_config_addr(const struct bma4_dev *dev) -{ - uint16_t rslt; - uint16_t asic_addr; - uint8_t asic_lsb; - uint8_t asic_msb; - - /* Read the asic address from the sensor */ - rslt = read_regs(BMA4_RESERVED_REG_5B_ADDR, &asic_lsb, 1, dev); - rslt |= read_regs(BMA4_RESERVED_REG_5C_ADDR, &asic_msb, 1, dev); - /* Get the asic address */ - asic_addr = (asic_msb << 4) | (asic_lsb & 0x0F); - /* Sum the asic address with read/write length after converting from - byte to word */ - asic_addr = asic_addr + (dev->read_write_len / 2); - /* Split the asic address */ - asic_lsb = asic_addr & 0x0F; - asic_msb = (uint8_t)(asic_addr >> 4); - /* Write the asic address in the sensor */ - rslt |= write_regs(BMA4_RESERVED_REG_5B_ADDR, &asic_lsb, 1, dev); - rslt |= write_regs(BMA4_RESERVED_REG_5C_ADDR, &asic_msb, 1, dev); - - return rslt; -} - -/*! - * @brief This API checks whether the read operation requested is for feature - * or register read and accordingly reads the data from the sensor. - */ -uint16_t bma4_read_regs(uint8_t addr, uint8_t *data, uint8_t len, struct bma4_dev *dev) -{ - uint8_t i; - uint8_t loop_count; - uint8_t overflow; - uint8_t index; - uint16_t rslt = BMA4_OK; - uint8_t adv_pwr_save = 0; - - /* Check the dev structure as NULL*/ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - if (addr == BMA4_FEATURE_CONFIG_ADDR) { - /* Disable APS if enabled before reading the feature config register */ - rslt = bma4_get_advance_power_save(&adv_pwr_save, dev); - if (adv_pwr_save == BMA4_ENABLE) { - rslt |= bma4_set_advance_power_save(BMA4_DISABLE, dev); - /* Wait for sensor time synchronization. Refer the data-sheet for - more information*/ - dev->delay(1); - } - - if (((len % 2) == 0) && (len <= dev->feature_len) && (rslt == BMA4_OK)) { - if (dev->read_write_len < len) { - /* Calculate the no of writes to be performed according - to the read/write length */ - loop_count = len / dev->read_write_len; - overflow = len % dev->read_write_len; - index = 0; - rslt = set_feature_config_start_addr(dev); - for (i = 0; i < loop_count; i++) { - rslt |= read_regs(BMA4_FEATURE_CONFIG_ADDR, data + index, - dev->read_write_len, dev); - rslt |= increment_feature_config_addr(dev); - index = index + dev->read_write_len; - } - if (overflow) - rslt |= read_regs(BMA4_FEATURE_CONFIG_ADDR, data + index, - overflow, dev); - rslt |= set_feature_config_start_addr(dev); - } else { - rslt = read_regs(BMA4_FEATURE_CONFIG_ADDR, data, len, dev); - } - } else { - rslt = BMA4_E_RD_WR_LENGTH_INVALID; - } - if (rslt == BMA4_OK) { - /* Enable APS once read feature config register is done */ - rslt = bma4_get_advance_power_save(&adv_pwr_save, dev); - if (adv_pwr_save == BMA4_DISABLE) { - rslt |= bma4_set_advance_power_save(BMA4_ENABLE, dev); - /* Wait for sensor time synchronization. Refer the data-sheet for - more information*/ - dev->delay(1); - } - } - } else { - rslt = read_regs(addr, data, len, dev); - } - } - - return rslt; -} - -/*! - * @brief This API reads the 8-bit data from the given register - * in the sensor. - */ -static uint16_t read_regs(uint8_t addr, uint8_t *data, uint8_t len, const struct bma4_dev *dev) -{ - /* variable used to return the status of communication result*/ - uint16_t rslt = 0; - uint16_t temp_len = len + dev->dummy_byte; - uint16_t i; - - if (dev->interface == BMA4_SPI_INTERFACE) { - /* SPI mask added */ - addr = addr | BMA4_SPI_RD_MASK; - } - - if (temp_len > BMA4_MAX_BUFFER_SIZE) { - /* Buffer size is not sufficient */ - rslt |= BMA4_E_OUT_OF_RANGE; - } - - if (rslt == BMA4_OK) { - /* Read the data from the register */ - rslt |= dev->bus_read(dev->dev_addr, addr, temp_buff, temp_len); - - for (i = 0; i < len; i++) { - /* Parsing and storing the valid data */ - data[i] = temp_buff[i + dev->dummy_byte]; - } - } - - return rslt; -} - -/*! - * @brief This API reads the error status from the sensor. - */ -uint16_t bma4_get_error_status(struct bma4_err_reg *err_reg, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Read the error codes*/ - rslt |= bma4_read_regs(BMA4_ERROR_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - /* Fatal error*/ - err_reg->fatal_err = BMA4_GET_BITS_POS_0(data, BMA4_FATAL_ERR); - /* Cmd error*/ - err_reg->cmd_err = BMA4_GET_BITSLICE(data, BMA4_CMD_ERR); - /* User error*/ - err_reg->err_code = BMA4_GET_BITSLICE(data, BMA4_ERR_CODE); - /* FIFO error*/ - err_reg->fifo_err = BMA4_GET_BITSLICE(data, BMA4_FIFO_ERR); - /* Mag data ready error*/ - err_reg->aux_err = BMA4_GET_BITSLICE(data, BMA4_AUX_ERR); - } - } - - return rslt; -} - -/*! - * @brief This API reads the sensor status from the sensor. - */ -uint16_t bma4_get_status(uint8_t *status, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Read the error codes*/ - rslt |= bma4_read_regs(BMA4_STATUS_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *status = data; - } - - return rslt; -} - -/*! - * @brief This API reads the Accel data for x,y and z axis from the sensor. - * The data units is in LSB format. - */ -uint16_t bma4_read_accel_xyz(struct bma4_accel *accel, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint16_t lsb = 0; - uint16_t msb = 0; - uint8_t data[BMA4_ACCEL_DATA_LENGTH] = {0}; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_DATA_8_ADDR, data, BMA4_ACCEL_DATA_LENGTH, dev); - - if (rslt == BMA4_OK) { - msb = data[1]; - lsb = data[0]; - /* Accel data x axis */ - accel->x = (int16_t)((msb << 8) | lsb); - - msb = data[3]; - lsb = data[2]; - /* Accel data y axis */ - accel->y = (int16_t)((msb << 8) | lsb); - - msb = data[5]; - lsb = data[4]; - /* Accel data z axis */ - accel->z = (int16_t)((msb << 8) | lsb); - - if (dev->resolution == BMA4_12_BIT_RESOLUTION) { - accel->x = (accel->x / 0x10); - accel->y = (accel->y / 0x10); - accel->z = (accel->z / 0x10); - } else if (dev->resolution == BMA4_14_BIT_RESOLUTION) { - accel->x = (accel->x / 0x04); - accel->y = (accel->y / 0x04); - accel->z = (accel->z / 0x04); - } - } - } - - return rslt; -} - -/*! - * @brief This API reads the sensor time of Sensor time gets updated - * with every update of data register or FIFO. - */ -uint16_t bma4_get_sensor_time(uint32_t *sensor_time, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data[BMA4_SENSOR_TIME_LENGTH] = {0}; - uint8_t msb = 0; - uint8_t xlsb = 0; - uint8_t lsb = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_SENSORTIME_0_ADDR, data, BMA4_SENSOR_TIME_LENGTH, dev); - - if (rslt == BMA4_OK) { - msb = data[BMA4_SENSOR_TIME_MSB_BYTE]; - xlsb = data[BMA4_SENSOR_TIME_XLSB_BYTE]; - lsb = data[BMA4_SENSOR_TIME_LSB_BYTE]; - *sensor_time = (uint32_t)((msb << 16) | (xlsb << 8) | lsb); - } - } - - return rslt; -} - -/*! - * @brief This API reads the chip temperature of sensor. - * - * @note Using a scaling factor of 1000, to obtain integer values, which - * at the user end, are used to get accurate temperature value . - * BMA4_FAHREN_SCALED = 1.8 * 1000, BMA4_KELVIN_SCALED = 273.15 * 1000 - */ -uint16_t bma4_get_temperature(int32_t *temp, uint8_t temp_unit, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data[BMA4_TEMP_DATA_SIZE] = {0}; - int32_t temp_raw_scaled = 0; - - /* Check for Null pointer error */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Read temperature value from the register */ - rslt |= bma4_read_regs(BMA4_TEMPERATURE_ADDR, data, BMA4_TEMP_DATA_SIZE, dev); - - if (rslt == BMA4_OK) - temp_raw_scaled = (int32_t)data[BMA4_TEMP_BYTE] * BMA4_SCALE_TEMP; - - /* '0' value read from the register corresponds to 23 degree C */ - (*temp) = temp_raw_scaled + (BMA4_OFFSET_TEMP * BMA4_SCALE_TEMP); - - switch (temp_unit) { - case BMA4_DEG: - break; - - case BMA4_FAHREN: - /* Temperature in degree Fahrenheit */ - (*temp) = (((*temp) / BMA4_SCALE_TEMP) * BMA4_FAHREN_SCALED) + (32 * BMA4_SCALE_TEMP); - break; - - case BMA4_KELVIN: - /* Temperature in degree Kelvin */ - (*temp) = (*temp) + BMA4_KELVIN_SCALED; - break; - - default: - break; - } - } - - return rslt; -} - -/*! - * @brief This API reads the Output data rate, Bandwidth, perf_mode - * and Range of accel. - */ -uint16_t bma4_get_accel_config(struct bma4_accel_config *accel, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data[2] = {0}; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_ACCEL_CONFIG_ADDR, data, BMA4_ACCEL_CONFIG_LENGTH, dev); - - if (rslt == BMA4_OK) { - /* To get the ODR */ - accel->odr = BMA4_GET_BITS_POS_0(data[0], BMA4_ACCEL_ODR); - /* To get the bandwidth */ - accel->bandwidth = BMA4_GET_BITSLICE(data[0], BMA4_ACCEL_BW); - /* To get the under sampling mode */ - accel->perf_mode = BMA4_GET_BITSLICE(data[0], BMA4_ACCEL_PERFMODE); - /* Read the Accel range */ - accel->range = BMA4_GET_BITS_POS_0(data[1], BMA4_ACCEL_RANGE); - } - } - - return rslt; -} - -/*! - * @brief This API sets the output_data_rate, bandwidth, perf_mode - * and range of Accel. - */ -uint16_t bma4_set_accel_config(const struct bma4_accel_config *accel, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t accel_config_data[2] = {0, 0}; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* check whether the bandwidth and perfmode - settings are valid */ - rslt = validate_bandwidth_perfmode(accel->bandwidth, accel->perf_mode); - - if (rslt == BMA4_OK) { - /* check ODR is valid */ - rslt |= validate_odr(accel->odr); - - if (rslt == BMA4_OK) { - accel_config_data[0] = accel->odr & BMA4_ACCEL_ODR_MSK; - accel_config_data[0] |= (uint8_t)(accel->bandwidth << BMA4_ACCEL_BW_POS); - accel_config_data[0] |= (uint8_t)(accel->perf_mode << BMA4_ACCEL_PERFMODE_POS); - accel_config_data[1] = accel->range & BMA4_ACCEL_RANGE_MSK; - - /* Burst write is not possible in - suspend mode hence individual write is - used with delay of 1 ms */ - rslt |= bma4_write_regs(BMA4_ACCEL_CONFIG_ADDR, &accel_config_data[0], 1, dev); - dev->delay(BMA4_GEN_READ_WRITE_DELAY); - rslt |= bma4_write_regs((BMA4_ACCEL_CONFIG_ADDR + 1), &accel_config_data[1], - 1, dev); - } - } - } - - return rslt; -} - -/*! - * @brief This API validates the bandwidth and perf_mode - * value set by the user. - */ -static uint16_t validate_bandwidth_perfmode(uint8_t bandwidth, uint8_t perf_mode) -{ - uint16_t rslt = BMA4_OK; - - if (perf_mode == BMA4_CONTINUOUS_MODE) { - if (bandwidth > BMA4_ACCEL_NORMAL_AVG4) { - /* Invalid bandwidth error for continuous mode */ - rslt = BMA4_E_OUT_OF_RANGE; - } - } else if (perf_mode == BMA4_CIC_AVG_MODE) { - if (bandwidth > BMA4_ACCEL_RES_AVG128) { - /* Invalid bandwidth error for CIC avg. mode */ - rslt = BMA4_E_OUT_OF_RANGE; - } - } else { - rslt = BMA4_E_OUT_OF_RANGE; - } - - return rslt; -} - -/*! - * @brief This API validates the ODR value set by the user. - */ -static uint16_t validate_odr(uint8_t odr) -{ - uint16_t rslt = BMA4_OK; - - if ((odr < BMA4_OUTPUT_DATA_RATE_0_78HZ) || (odr > BMA4_OUTPUT_DATA_RATE_1600HZ)) { - /* If odr is not valid return error */ - rslt = BMA4_E_OUT_OF_RANGE; - } - - return rslt; -} - -/*! - * @brief This API sets the advance power save mode in the sensor. - */ -uint16_t bma4_set_advance_power_save(uint8_t adv_pwr_save, struct bma4_dev *dev) -{ - uint16_t rslt = BMA4_OK; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_POWER_CONF_ADDR, &data, 1, dev); - if (rslt == BMA4_OK) { - data = BMA4_SET_BITS_POS_0(data, BMA4_ADVANCE_POWER_SAVE, adv_pwr_save); - rslt |= bma4_write_regs(BMA4_POWER_CONF_ADDR, &data, 1, dev); - } - } - - return rslt; -} - -/*! - * @brief This API reads the status of advance power save mode - * from the sensor. - */ -uint16_t bma4_get_advance_power_save(uint8_t *adv_pwr_save, struct bma4_dev *dev) -{ - uint16_t rslt = BMA4_OK; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_POWER_CONF_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *adv_pwr_save = BMA4_GET_BITS_POS_0(data, BMA4_ADVANCE_POWER_SAVE); - } - - return rslt; -} - -/*! - * @brief This API sets the FIFO self wake up functionality in the sensor. - */ -uint16_t bma4_set_fifo_self_wakeup(uint8_t fifo_self_wakeup, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_POWER_CONF_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - data = BMA4_SET_BITSLICE(data, BMA4_FIFO_SELF_WAKE_UP, fifo_self_wakeup); - rslt |= bma4_write_regs(BMA4_POWER_CONF_ADDR, &data, 1, dev); - } - } - - return rslt; -} - -/*! - * @brief This API gets the status of FIFO self wake up functionality from - * the sensor. - */ -uint16_t bma4_get_fifo_self_wakeup(uint8_t *fifo_self_wake_up, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_POWER_CONF_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *fifo_self_wake_up = BMA4_GET_BITSLICE(data, BMA4_FIFO_SELF_WAKE_UP); - } - - return rslt; -} - -/*! - * @brief This API enables or disables the Accel in the sensor. - */ -uint16_t bma4_set_accel_enable(uint8_t accel_en, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_POWER_CTRL_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - data = BMA4_SET_BITSLICE(data, BMA4_ACCEL_ENABLE, accel_en); - rslt |= bma4_write_regs(BMA4_POWER_CTRL_ADDR, &data, 1, dev); - } - } - - return rslt; -} - -/*! - * @brief This API checks whether Accel is enabled or not in the sensor. - */ -uint16_t bma4_get_accel_enable(uint8_t *accel_en, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_POWER_CTRL_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *accel_en = BMA4_GET_BITSLICE(data, BMA4_ACCEL_ENABLE); - } - - return rslt; -} - -/*! - * @brief This API is used to enable or disable auxiliary Mag - * in the sensor. - */ -uint16_t bma4_set_mag_enable(uint8_t mag_en, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_POWER_CTRL_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - data = BMA4_SET_BITS_POS_0(data, BMA4_MAG_ENABLE, mag_en); - rslt |= bma4_write_regs(BMA4_POWER_CTRL_ADDR, &data, 1, dev); - } - } - - return rslt; -} - -/*! - * @brief This API is used to check whether the auxiliary Mag is enabled - * or not in the sensor. - */ -uint16_t bma4_get_mag_enable(uint8_t *mag_en, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_POWER_CTRL_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *mag_en = BMA4_GET_BITS_POS_0(data, BMA4_MAG_ENABLE); - } - - return rslt; -} - -/*! - * @brief This API reads the SPI interface mode which is set for primary - * interface. - */ -uint16_t bma4_get_spi_interface(uint8_t *spi, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Read SPI mode */ - rslt |= bma4_read_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *spi = BMA4_GET_BITS_POS_0(data, BMA4_CONFIG_SPI3); - } - - return rslt; -} - -/*! - * @brief This API configures the SPI interface Mode for primary interface - */ -uint16_t bma4_set_spi_interface(uint8_t spi, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - if (spi <= BMA4_MAX_VALUE_SPI3) { - /* Write SPI mode */ - rslt |= bma4_read_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - data = BMA4_SET_BITS_POS_0(data, BMA4_CONFIG_SPI3, spi); - rslt |= bma4_write_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); - } - } else { - rslt |= BMA4_E_OUT_OF_RANGE; - } - } - - return rslt; -} - -/*! -* @brief This API writes the available sensor specific commands -* to the sensor. -*/ -uint16_t bma4_set_command_register(uint8_t command_reg, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Write command register */ - rslt |= bma4_write_regs(BMA4_CMD_ADDR, &command_reg, 1, dev); - } - - return rslt; -} - -/*! - * @brief This API sets the I2C device address of auxiliary sensor - */ -uint16_t bma4_set_i2c_device_addr(struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0, dev_id = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Write the auxiliary I2C device address */ - rslt |= bma4_read_regs(BMA4_AUX_DEV_ID_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - dev_id = BMA4_SET_BITSLICE(data, BMA4_I2C_DEVICE_ADDR, dev->aux_config.aux_dev_addr); - rslt |= bma4_write_regs(BMA4_AUX_DEV_ID_ADDR, &dev_id, 1, dev); - } - } - - return rslt; -} - -/*! - * @brief This API sets the register access on MAG_IF[2], MAG_IF[3], - * MAG_IF[4] in the sensor. This implies that the DATA registers are - * not updated with Mag values automatically. - */ -uint16_t bma4_set_mag_manual_enable(uint8_t mag_manual, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Write the Mag manual*/ - rslt |= bma4_read_regs(BMA4_AUX_IF_CONF_ADDR, &data, 1, dev); - dev->delay(BMA4_GEN_READ_WRITE_DELAY); - - if (rslt == BMA4_OK) { - /* Set the bit of Mag manual enable */ - data = BMA4_SET_BITSLICE(data, BMA4_MAG_MANUAL_ENABLE, mag_manual); - rslt |= bma4_write_regs(BMA4_AUX_IF_CONF_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - dev->aux_config.manual_enable = (uint8_t)mag_manual; - } else { - /*dev->mag_manual_enable = 0;*/ - dev->aux_config.manual_enable = 0; - } - } - - return rslt; -} - -/*! - * @brief This API checks whether the Mag access is done manually or - * automatically in the sensor. - * If the Mag access is done through manual mode then Mag data registers - * in sensor are not updated automatically. - */ -uint16_t bma4_get_mag_manual_enable(uint8_t *mag_manual, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Read Mag manual */ - rslt |= bma4_read_regs(BMA4_AUX_IF_CONF_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *mag_manual = BMA4_GET_BITSLICE(data, BMA4_MAG_MANUAL_ENABLE); - } - - return rslt; -} - -/*! - * @brief This API sets the I2C interface configuration(if) mode - * for auxiliary Mag. - */ -uint16_t bma4_set_aux_if_mode(uint8_t if_mode, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - data = BMA4_SET_BITSLICE(data, BMA4_IF_CONFIG_IF_MODE, if_mode); - rslt |= bma4_write_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); - } - } - - return rslt; -} - -/*! - * @brief This API gets the address of the register of Aux Mag sensor - * where the data to be read. - */ -uint16_t bma4_get_mag_read_addr(uint8_t *mag_read_addr, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_AUX_RD_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *mag_read_addr = BMA4_GET_BITS_POS_0(data, BMA4_READ_ADDR); - } - - return rslt; -} - -/*! - * @brief This API sets the address of the register of Aux Mag sensor - * where the data to be read. - */ -uint16_t bma4_set_mag_read_addr(uint8_t mag_read_addr, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Write the Mag read address*/ - rslt |= bma4_write_regs(BMA4_AUX_RD_ADDR, &mag_read_addr, 1, dev); - } - - return rslt; -} - -/*! - * @brief This API gets the Aux Mag write address from the sensor. - * Mag write address is where the Mag data will be written. - */ -uint16_t bma4_get_mag_write_addr(uint8_t *mag_write_addr, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_AUX_WR_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *mag_write_addr = BMA4_GET_BITS_POS_0(data, BMA4_WRITE_ADDR); - } - - return rslt; -} - -/*! - * @brief This API sets the Aux Mag write address in the sensor. - * Mag write address is where the Mag data will be written. - */ -uint16_t bma4_set_mag_write_addr(uint8_t mag_write_addr, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) - rslt |= BMA4_E_NULL_PTR; - else - rslt |= bma4_write_regs(BMA4_AUX_WR_ADDR, &mag_write_addr, 1, dev); - - return rslt; -} - -/*! - * @brief This API reads the data from the sensor which is written to the - * Mag. - */ -uint16_t bma4_get_mag_write_data(uint8_t *mag_write_data, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_AUX_WR_DATA_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *mag_write_data = BMA4_GET_BITS_POS_0(data, BMA4_WRITE_DATA); - } - - return rslt; -} - -/*! - * @brief This API sets the data in the sensor which in turn will - * be written to Mag. - */ -uint16_t bma4_set_mag_write_data(uint8_t mag_write_data, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) - rslt |= BMA4_E_NULL_PTR; - else - rslt |= bma4_write_regs(BMA4_AUX_WR_DATA_ADDR, &mag_write_data, 1, dev); - - return rslt; -} - -/*! - * @brief This API reads the x,y,z and r axis data from the auxiliary - * Mag BMM150/AKM9916 sensor. - */ -uint16_t bma4_read_mag_xyzr(struct bma4_mag_xyzr *mag, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint16_t msb = 0; - uint16_t lsb = 0; - uint8_t data[BMA4_MAG_XYZR_DATA_LENGTH] = {0}; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_DATA_0_ADDR, data, BMA4_MAG_XYZR_DATA_LENGTH, dev); - - if (rslt == BMA4_OK) { - /* Data X */ - /* X-axis LSB value shifting */ - lsb = BMA4_GET_BITSLICE(data[BMA4_MAG_X_LSB_BYTE], BMA4_DATA_MAG_X_LSB); - msb = data[BMA4_MAG_X_MSB_BYTE]; - mag->x = (int16_t)((msb << 8) | lsb); - mag->x = (mag->x / 0x08); - - /* Data Y */ - /* Y-axis LSB value shifting */ - lsb = BMA4_GET_BITSLICE(data[BMA4_MAG_Y_LSB_BYTE], BMA4_DATA_MAG_Y_LSB); - msb = data[BMA4_MAG_Y_MSB_BYTE]; - mag->y = (int16_t)((msb << 8) | lsb); - mag->y = (mag->y / 0x08); - - /* Data Z */ - /* Z-axis LSB value shifting */ - lsb = BMA4_GET_BITSLICE(data[BMA4_MAG_Z_LSB_BYTE], BMA4_DATA_MAG_Z_LSB); - msb = data[BMA4_MAG_Z_MSB_BYTE]; - mag->z = (int16_t)((msb << 8) | lsb); - mag->z = (mag->z / 0x02); - - /* RHall */ - /* R-axis LSB value shifting */ - lsb = BMA4_GET_BITSLICE(data[BMA4_MAG_R_LSB_BYTE], BMA4_DATA_MAG_R_LSB); - msb = data[BMA4_MAG_R_MSB_BYTE]; - mag->r = (int16_t)((msb << 8) | lsb); - mag->r = (mag->r / 0x04); - } - } - - return rslt; -} - -/*! - * @brief This API sets the burst data length (1,2,6,8 byte) of auxiliary - * Mag sensor. - */ -uint16_t bma4_set_mag_burst(uint8_t mag_burst, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Write auxiliary burst mode length*/ - rslt |= bma4_read_regs(BMA4_AUX_IF_CONF_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - data = BMA4_SET_BITS_POS_0(data, BMA4_MAG_BURST, mag_burst); - rslt |= bma4_write_regs(BMA4_AUX_IF_CONF_ADDR, &data, 1, dev); - } - } - - return rslt; -} - -/*! - * @brief This API reads the burst data length of Mag set in the sensor. - */ -uint16_t bma4_get_mag_burst(uint8_t *mag_burst, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Write Mag burst mode length*/ - rslt |= bma4_read_regs(BMA4_AUX_IF_CONF_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *mag_burst = BMA4_GET_BITS_POS_0(data, BMA4_MAG_BURST); - } - - return rslt; -} - -/*! - * @brief This API reads the FIFO data of Accel and/or Mag sensor - */ -uint16_t bma4_read_fifo_data(struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - uint8_t addr = BMA4_FIFO_DATA_ADDR; - /* check the bma4 structure as NULL*/ - if (dev == NULL || dev->fifo == NULL || dev->fifo->data == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - reset_fifo_data_structure(dev); - /* read FIFO data*/ - if (dev->interface == BMA4_SPI_INTERFACE) - addr = addr | BMA4_SPI_RD_MASK; - - rslt |= dev->bus_read(dev->dev_addr, addr, dev->fifo->data, dev->fifo->length); - /* read fifo frame content configuration*/ - rslt |= bma4_read_regs(BMA4_FIFO_CONFIG_1_ADDR, &data, 1, dev); - /* filter fifo header enabled status */ - dev->fifo->fifo_header_enable = data & BMA4_FIFO_HEADER; - /* filter accel/mag data enabled status */ - dev->fifo->fifo_data_enable = data & BMA4_FIFO_M_A_ENABLE; - } - - return rslt; -} - -/*! - * @brief This API parses and extracts the accelerometer frames from - * FIFO data read by the "bma4_read_fifo_data" API and stores it in the - * "accel_data" structure instance. - */ -uint16_t bma4_extract_accel(struct bma4_accel *accel_data, uint16_t *accel_length, const struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint16_t data_index = 0; - uint16_t accel_index = 0; - uint16_t data_read_length = 0; - - if (dev == NULL || dev->fifo == NULL || dev->fifo->data == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Parsing the FIFO data in header-less mode */ - if (dev->fifo->fifo_header_enable == 0) { - get_accel_len_to_parse(&data_index, &data_read_length, accel_length, dev); - - for (; data_index < data_read_length;) { - unpack_acc_frm(accel_data, &data_index, &accel_index, dev->fifo->fifo_data_enable, dev); - /*Check for the availability of next - two bytes of FIFO data */ - check_empty_fifo(&data_index, dev); - } - /* update number of accel data read*/ - *accel_length = accel_index; - /*update the accel byte index*/ - dev->fifo->accel_byte_start_idx = data_index; - } else { - /* Parsing the FIFO data in header mode */ - extract_accel_header_mode(accel_data, accel_length, dev); - } - } - - return rslt; -} - -/*! - * @brief This API parses and extracts the magnetometer frames from - * FIFO data read by the "bma4_read_fifo_data" API and stores it in the - * "mag_data" structure instance parameter of this API - */ -uint16_t bma4_extract_mag(struct bma4_mag *mag_data, uint16_t *mag_length, const struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint16_t data_index = 0; - uint16_t mag_index = 0; - uint16_t data_read_length = 0; - - if (dev == NULL || dev->fifo == NULL || dev->fifo->data == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Parsing the FIFO data in header-less mode */ - if (dev->fifo->fifo_header_enable == 0) { - get_mag_len_to_parse(&data_index, &data_read_length, mag_length, dev); - for (; data_index < data_read_length;) { - rslt |= unpack_mag_frm(mag_data, &data_index, &mag_index, - dev->fifo->fifo_data_enable, dev); - /*Check for the availability of next - two bytes of FIFO data */ - check_empty_fifo(&data_index, dev); - } - /* update number of Aux. sensor data read*/ - *mag_length = mag_index; - /*update the Aux. sensor frame index*/ - dev->fifo->mag_byte_start_idx = data_index; - } else { - /* Parsing the FIFO data in header mode */ - rslt |= extract_mag_header_mode(mag_data, mag_length, dev); - } - } - - return rslt; -} - -/*! - * @brief This API reads the FIFO water mark level which is set - * in the sensor. - */ -uint16_t bma4_get_fifo_wm(uint16_t *fifo_wm, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data[2] = {0, 0}; - - /* Check the bma4 structure as NULL*/ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Read the FIFO water mark level*/ - rslt |= bma4_read_regs(BMA4_FIFO_WTM_0_ADDR, data, BMA4_FIFO_WM_LENGTH, dev); - - if (BMA4_OK == rslt) - *fifo_wm = (data[1] << 8) | (data[0]); - } - - return rslt; -} - -/*! - * @brief This API sets the FIFO watermark level in the sensor. - */ -uint16_t bma4_set_fifo_wm(uint16_t fifo_wm, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data[2] = {0, 0}; - - /* Check the bma4 structure as NULL*/ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - - data[0] = BMA4_GET_LSB(fifo_wm); - data[1] = BMA4_GET_MSB(fifo_wm); - /* consecutive write is not possible in suspend mode hence - separate write is used with delay of 1 ms*/ - /* Write the fifo watermark level*/ - rslt |= bma4_write_regs(BMA4_FIFO_WTM_0_ADDR, &data[0], 1, dev); - dev->delay(BMA4_GEN_READ_WRITE_DELAY); - rslt |= bma4_write_regs((BMA4_FIFO_WTM_0_ADDR + 1), &data[1], 1, dev); - } - - return rslt; -} - -/*! - * @brief This API checks whether the Accel FIFO data is set for filtered - * or unfiltered mode. - */ -uint16_t bma4_get_accel_fifo_filter_data(uint8_t *accel_fifo_filter, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Read the Accel FIFO filter data */ - rslt |= bma4_read_regs(BMA4_FIFO_DOWN_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *accel_fifo_filter = BMA4_GET_BITSLICE(data, BMA4_FIFO_FILTER_ACCEL); - } - - return rslt; -} - -/*! - * @brief This API sets the condition of Accel FIFO data either to - * filtered or unfiltered mode. - */ -uint16_t bma4_set_accel_fifo_filter_data(uint8_t accel_fifo_filter, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - if (accel_fifo_filter <= BMA4_MAX_VALUE_FIFO_FILTER) { - rslt |= bma4_read_regs(BMA4_FIFO_DOWN_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - /* Write Accel FIFO filter data */ - data = BMA4_SET_BITSLICE(data, BMA4_FIFO_FILTER_ACCEL, accel_fifo_filter); - rslt |= bma4_write_regs(BMA4_FIFO_DOWN_ADDR, &data, 1, dev); - } - } else { - rslt |= BMA4_E_OUT_OF_RANGE; - } - } - return rslt; -} - -/*! - * @brief This API reads the down sampling rates which is configured - * for Accel FIFO data. - */ -uint16_t bma4_get_fifo_down_accel(uint8_t *fifo_down, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Read the Accel FIFO down data */ - rslt |= bma4_read_regs(BMA4_FIFO_DOWN_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *fifo_down = BMA4_GET_BITSLICE(data, BMA4_FIFO_DOWN_ACCEL); - } - - return rslt; -} - -/*! - * @brief This API sets the down-sampling rates for Accel FIFO. - */ -uint16_t bma4_set_fifo_down_accel(uint8_t fifo_down, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Write the Accel FIFO down data */ - rslt |= bma4_read_regs(BMA4_FIFO_DOWN_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - data = BMA4_SET_BITSLICE(data, BMA4_FIFO_DOWN_ACCEL, fifo_down); - rslt |= bma4_write_regs(BMA4_FIFO_DOWN_ADDR, &data, 1, dev); - } - } - return rslt; -} - -/*! - * @brief This API reads the length of FIFO data available in the sensor - * in the units of bytes. - */ -uint16_t bma4_get_fifo_length(uint16_t *fifo_length, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t index = 0; - uint8_t data[BMA4_FIFO_DATA_LENGTH] = {0, 0}; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Read FIFO length*/ - rslt |= bma4_read_regs(BMA4_FIFO_LENGTH_0_ADDR, data, BMA4_FIFO_DATA_LENGTH, dev); - - if (rslt == BMA4_OK) { - index = BMA4_FIFO_LENGTH_MSB_BYTE; - data[index] = BMA4_GET_BITS_POS_0(data[index], BMA4_FIFO_BYTE_COUNTER_MSB); - *fifo_length = ((data[index] << 8) | data[index - 1]); - } - } - - return rslt; -} - -/*! - * @brief This API aligns and compensates the Mag data of BMM150/AKM9916 - * sensor. - */ -uint16_t bma4_second_if_mag_compensate_xyz(struct bma4_mag_fifo_data mag_fifo_data, - uint8_t mag_second_if, struct bma4_mag *compensated_mag_data) -{ - uint16_t rslt = 0; -#ifdef BMM150 - int16_t mag_x = 0; - int16_t mag_y = 0; - int16_t mag_z = 0; - uint16_t mag_r = 0; -#endif - - switch (mag_second_if) { -#ifdef BMM150 - case BMA4_SEC_IF_BMM150: - /* X data*/ - mag_x = (int16_t)((mag_fifo_data.mag_x_msb << 8) | (mag_fifo_data.mag_x_lsb)); - mag_x = (int16_t) (mag_x / 0x08); - - /* Y data*/ - mag_y = (int16_t)((mag_fifo_data.mag_y_msb << 8) | (mag_fifo_data.mag_y_lsb)); - mag_y = (int16_t) (mag_y / 0x08); - - /* Z data*/ - mag_z = (int16_t)((mag_fifo_data.mag_z_msb << 8) | (mag_fifo_data.mag_z_lsb)); - mag_z = (int16_t) (mag_z / 0x02); - - /* R data*/ - mag_r = (uint16_t)((mag_fifo_data.mag_r_y2_msb << 8) | (mag_fifo_data.mag_r_y2_lsb)); - mag_r = (uint16_t) (mag_r >> 2); - - /* Compensated Mag x data */ - compensated_mag_data->x = bma4_bmm150_mag_compensate_X(mag_x, mag_r); - - /* Compensated Mag y data */ - compensated_mag_data->y = bma4_bmm150_mag_compensate_Y(mag_y, mag_r); - - /* Compensated Mag z data */ - compensated_mag_data->z = bma4_bmm150_mag_compensate_Z(mag_z, mag_r); - break; -#endif - -#ifdef AKM9916 - - case BMA4_SEC_IF_AKM09916: - /* Compensated X data */ - compensated_mag_data->x = (int16_t)((mag_fifo_data.mag_x_msb << 8) | (mag_fifo_data.mag_x_lsb)); - /* Compensated Y data*/ - compensated_mag_data->y = (int16_t)((mag_fifo_data.mag_y_msb << 8) | (mag_fifo_data.mag_y_lsb)); - /* Compensated Z data*/ - compensated_mag_data->z = (int16_t)((mag_fifo_data.mag_z_msb << 8) | (mag_fifo_data.mag_z_lsb)); - break; - -#endif - default: - rslt |= BMA4_E_OUT_OF_RANGE; - break; - } - return rslt; -} - -/*! - * @brief This API reads Mag. x,y and z axis data from either BMM150 or - * AKM9916 sensor - */ -uint16_t bma4_read_mag_xyz(struct bma4_mag *mag, uint8_t sensor_select, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - -#if defined(AKM9916) || defined(BMM150) - uint8_t index; - uint16_t msb = 0; - uint16_t lsb = 0; - uint8_t data[BMA4_MAG_XYZ_DATA_LENGTH] = {0}; -#endif - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - switch (sensor_select) { - -#if defined(BMM150) - - case BMA4_SEC_IF_BMM150: - rslt |= bma4_read_regs(BMA4_DATA_0_ADDR, data, BMA4_MAG_XYZ_DATA_LENGTH, dev); - - if (rslt == BMA4_OK) { - index = BMA4_MAG_X_LSB_BYTE; - /*X-axis LSB value shifting*/ - data[index] = BMA4_GET_BITSLICE(data[index], BMA4_DATA_MAG_X_LSB); - /* Data X */ - msb = data[index + 1]; - lsb = data[index]; - mag->x = (int16_t)((msb << 8) | lsb); - mag->x = (mag->x / 0x08); - - /* Data Y */ - /*Y-axis LSB value shifting*/ - data[index + 2] = BMA4_GET_BITSLICE(data[index + 2], BMA4_DATA_MAG_Y_LSB); - msb = data[index + 3]; - lsb = data[index + 2]; - mag->y = (int16_t)((msb << 8) | lsb); - mag->y = (mag->y / 0x08); - - /* Data Z */ - /*Z-axis LSB value shifting*/ - data[index + 4] = BMA4_GET_BITSLICE(data[index + 4], BMA4_DATA_MAG_Z_LSB); - msb = data[index + 5]; - lsb = data[index + 4]; - mag->z = (int16_t)((msb << 8) | lsb); - mag->z = (mag->z / 0x02); - } - break; -#endif - -#if defined(AKM9916) - case BMA4_SEC_IF_AKM09916: - - if (AKM9916_SENSOR == dev->aux_sensor) { - rslt |= bma4_read_regs(BMA4_DATA_0_ADDR, data, BMA4_MAG_XYZ_DATA_LENGTH, dev); - - if (rslt == BMA4_OK) { - index = BMA4_MAG_X_LSB_BYTE; - /* Data X */ - msb = data[index + 1]; - lsb = data[index]; - mag->x = (int16_t)((msb << 8) | lsb); - - /* Data Y */ - msb = data[index + 3]; - lsb = data[index + 2]; - mag->y = (int32_t)((msb << 8) | lsb); - - /* Data Z */ - msb = data[index + 5]; - lsb = data[index + 4]; - mag->z = (int16_t)((msb << 8) | lsb); - } - } - break; -#endif - - default: - rslt |= BMA4_E_OUT_OF_RANGE; - break; - } - } - - return rslt; -} - -/*! - * @brief This API reads the auxiliary I2C interface configuration which - * is set in the sensor. - */ -uint16_t bma4_get_if_mode(uint8_t *if_mode, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Read auxiliary interface configuration */ - rslt |= bma4_read_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *if_mode = BMA4_GET_BITSLICE(data, BMA4_IF_CONFIG_IF_MODE); - } - - return rslt; -} - -/*! - * @brief This API sets the auxiliary interface configuration in the - * sensor. - */ -uint16_t bma4_set_if_mode(uint8_t if_mode, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - if (if_mode <= BMA4_MAX_IF_MODE) { - /* Write the interface configuration mode */ - rslt |= bma4_read_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); - if (rslt == BMA4_OK) { - data = BMA4_SET_BITSLICE(data, BMA4_IF_CONFIG_IF_MODE, if_mode); - rslt |= bma4_write_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); - } - } else { - rslt |= BMA4_E_OUT_OF_RANGE; - } - } - - return rslt; -} - -/*! - * @brief This API reads the data ready status of Accel from the sensor. - */ -uint16_t bma4_get_accel_data_rdy(uint8_t *data_rdy, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /*Reads the status of Accel data ready*/ - rslt |= bma4_read_regs(BMA4_STATUS_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *data_rdy = BMA4_GET_BITSLICE(data, BMA4_STAT_DATA_RDY_ACCEL); - } - - return rslt; -} - -/*! - * @brief This API reads the data ready status of Mag from the sensor. - * The status get reset when Mag data register is read. - */ -uint16_t bma4_get_mag_data_rdy(uint8_t *data_rdy, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /*Reads the status of Accel data ready*/ - rslt |= bma4_read_regs(BMA4_STATUS_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) - *data_rdy = BMA4_GET_BITSLICE(data, BMA4_STAT_DATA_RDY_MAG); - } - - return rslt; -} - -/*! - * @brief This API reads the ASIC status from the sensor. - * The status information is mentioned in the below table. - */ -uint16_t bma4_get_asic_status(struct bma4_asic_status *asic_status, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Read the Mag I2C device address*/ - rslt |= bma4_read_regs(BMA4_INTERNAL_ERROR, &data, 1, dev); - - if (rslt == BMA4_OK) { - asic_status->sleep = (data & 0x01); - asic_status->irq_ovrn = ((data & 0x02) >> 0x01); - asic_status->wc_event = ((data & 0x04) >> 0x02); - asic_status->stream_transfer_active = ((data & 0x08) >> 0x03); - } - } - - return rslt; -} - -/*! - * @brief This API enables the offset compensation for filtered and - * unfiltered Accel data. - */ -uint16_t bma4_set_offset_comp(uint8_t offset_en, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_NV_CONFIG_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - /* Write Accel FIFO filter data */ - data = BMA4_SET_BITSLICE(data, BMA4_NV_ACCEL_OFFSET, offset_en); - rslt |= bma4_write_regs(BMA4_NV_CONFIG_ADDR, &data, 1, dev); - } - } - - return rslt; -} - -/*! - * @brief This API gets the status of Accel offset compensation - */ -uint16_t bma4_get_offset_comp(uint8_t *offset_en, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_NV_CONFIG_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - /* Write Accel FIFO filter data */ - *offset_en = BMA4_GET_BITSLICE(data, BMA4_NV_ACCEL_OFFSET); - } - } - - return rslt; -} - -/*! - * @brief This API performs Fast Offset Compensation for Accel. - * - * @note The g-values to be passed to the parameter should be - * multiples of 1000000. - */ -uint16_t bma4_perform_accel_foc(const int32_t accel_g_value[3], struct bma4_dev *dev) -{ - uint16_t rslt = 0; - struct bma4_accel accel_value[10] = { {0} }; - struct accel_offset offset = {0}; - struct offset_delta delta = { {0,0},{0,0},{0,0} }; - struct bma4_accel_config acc_conf = {0}; - uint8_t accel_en = 0; - uint8_t adv_pwr_save = 0; - uint8_t range = 0; - uint16_t lsb_per_g = 0; - struct accel_temp temp = {0}; - struct bma4_accel avg = {0}; - struct bma4_accel accel_data = {0}; - uint8_t i = 0; - - /* used to validate user input */ - rslt |= validate_user_input(accel_g_value); - - if (BMA4_OK == rslt) { - /* Configure accel config, accel enable and - advance power save for FOC */ - rslt |= foc_config(&acc_conf, &accel_en, &adv_pwr_save, dev); - - /*TO DO: Check for data ready status before - reading accel values*/ - - if (BMA4_OK == rslt) { - /* Giving a delay of 20ms before reading accel data - since odr is configured as 50Hz */ - for (i = 0; i < 10; i++) { - dev->delay(20); - rslt |= bma4_read_accel_xyz(&accel_value[i], dev); - temp.x = temp.x + (int32_t)accel_value[i].x; - temp.y = temp.y + (int32_t)accel_value[i].y; - temp.z = temp.z + (int32_t)accel_value[i].z; - } - - /* Take average of x, y and z data for lesser noise */ - avg.x = (int16_t)(temp.x / 10); - avg.y = (int16_t)(temp.y / 10); - avg.z = (int16_t)(temp.z / 10); - - /* Copy average value in another structure */ - accel_data = avg; - - if (BMA4_OK == rslt) { - /* Get the exact range value */ - map_range(acc_conf.range, &range); - /* Get LSB per bit given the range and resolution */ - lsb_per_g = (uint16_t)(power(2, dev->resolution) / (2 * range)); - /* Compensate accel data against gravity */ - comp_for_grvty(lsb_per_g, accel_g_value, &accel_data, &delta); - /* scale according to offset register resolution*/ - scale_offset(dev->resolution, range, &delta, &offset); - /* normalise the data with offset*/ - normalise_offset(&delta, &offset); - - /* offset values are written in the offset register */ - rslt |= bma4_write_regs(BMA4_OFFSET_0_ADDR, (uint8_t *)&offset.x, 1, dev); - rslt |= bma4_write_regs(BMA4_OFFSET_1_ADDR, (uint8_t *)&offset.y, 1, dev); - rslt |= bma4_write_regs(BMA4_OFFSET_2_ADDR, (uint8_t *)&offset.z, 1, dev); - - /* Enable offset compensation */ - rslt |= bma4_set_offset_comp(BMA4_ENABLE, dev); - - /* Set accel config, accel enable and advance power save */ - rslt |= bma4_set_accel_config(&acc_conf, dev); - rslt |= bma4_set_accel_enable(accel_en, dev); - rslt |= bma4_set_advance_power_save(adv_pwr_save, dev); - } else { - rslt |= BMA4_E_FOC_FAIL; - } - } - } - return rslt; -} - -/*! - * @brief This API checks whether the self test functionality of the sensor - * is working or not. - * The following parameter of struct bma4_dev, should have the valid value before - * performing the Self test, - * 1. Variant and 2. Resolution - */ -uint16_t bma4_perform_accel_selftest(uint8_t *result, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - struct bma4_accel positive = {0}; - struct bma4_accel negative = {0}; - /*! Structure for difference of accel values in g*/ - struct selftest_delta_limit accel_data_diff = {0}; - /*! Structure for difference of accel values in mg*/ - struct selftest_delta_limit accel_data_diff_mg = {0}; - - *result = BMA4_SELFTEST_FAIL; - - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - - rslt = set_accel_selftest_config(dev); - dev->delay(20); - rslt |= bma4_selftest_config(BMA4_ENABLE, dev); - - if (rslt == BMA4_OK) { - dev->delay(100); - rslt = bma4_read_accel_xyz(&positive, dev); - rslt |= bma4_selftest_config(BMA4_DISABLE, dev); - - if (rslt == BMA4_OK) { - dev->delay(100); - rslt = bma4_read_accel_xyz(&negative, dev); - - accel_data_diff.x = ABS(positive.x) + ABS(negative.x); - accel_data_diff.y = ABS(positive.y) + ABS(negative.y); - accel_data_diff.z = ABS(positive.z) + ABS(negative.z); - - /*! Converting LSB of the differences of accel values to mg*/ - convert_lsb_g(&accel_data_diff, &accel_data_diff_mg, dev); - /*! Validating self test for accel values in mg*/ - rslt |= validate_selftest(&accel_data_diff_mg, dev); - - if (rslt == BMA4_OK) - *result = BMA4_SELFTEST_PASS; - - /* Triggers a soft reset */ - rslt |= bma4_set_command_register(0xB6, dev); - dev->delay(200); - } - } - } - - return rslt; -} - -/*! - * @brief This API performs the steps needed for Self test operation - * before reading the Accel Self test data. - */ -uint16_t bma4_selftest_config(uint8_t sign, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - - rslt |= set_accel_selftest_enable(BMA4_ENABLE, dev); - rslt |= set_accel_selftest_sign(sign, dev); - - /* Set self test amplitude based on variant */ - switch (dev->variant) { - case BMA42X_VARIANT: - /* Set self test amplitude to high for BMA42x */ - rslt |= set_accel_selftest_amp(BMA4_ENABLE, dev); - break; - - case BMA45X_VARIANT: - /* Set self test amplitude to low for BMA45x */ - rslt |= set_accel_selftest_amp(BMA4_DISABLE, dev); - break; - - default: - rslt = BMA4_E_INVALID_SENSOR; - break; - } - - return rslt; -} - -/*! - * @brief API sets the interrupt to either interrupt1 or - * interrupt2 pin in the sensor. - */ -uint16_t bma4_map_interrupt(uint8_t int_line, uint16_t int_map, uint8_t enable, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data[3] = {0, 0, 0}; - uint8_t index[2] = {BMA4_INT_MAP_1_ADDR, BMA4_INT_MAP_2_ADDR}; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - - rslt |= bma4_read_regs(BMA4_INT_MAP_1_ADDR, data, 3, dev); - - if (enable == TRUE) { - /* Feature interrupt mapping */ - data[int_line] |= (uint8_t)(int_map & (0x00FF)); - /* Hardware interrupt mapping */ - if (int_line == BMA4_INTR2_MAP) - data[2] |= (uint8_t)((int_map & (0xFF00)) >> 4); - else - data[2] |= (uint8_t)((int_map & (0xFF00)) >> 8); - - rslt |= bma4_write_regs(index[int_line], &data[int_line], 1, dev); - rslt |= bma4_write_regs(BMA4_INT_MAP_DATA_ADDR, &data[2], 1, dev); - - } else { - /* Feature interrupt un-mapping */ - data[int_line] &= (~(uint8_t)(int_map & (0x00FF))); - /* Hardware interrupt un-mapping */ - if (int_line == BMA4_INTR2_MAP) - data[2] &= (~(uint8_t)((int_map & (0xFF00)) >> 4)); - else - data[2] &= (~(uint8_t)((int_map & (0xFF00)) >> 8)); - - rslt |= bma4_write_regs(index[int_line], &data[int_line], 1, dev); - rslt |= bma4_write_regs(BMA4_INT_MAP_DATA_ADDR, &data[2], 1, dev); - - } - } - - return rslt; -} - -/*! - * @brief This API sets the interrupt mode in the sensor. - */ -uint16_t bma4_set_interrupt_mode(uint8_t mode, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - - if (mode == BMA4_NON_LATCH_MODE || mode == BMA4_LATCH_MODE) - rslt |= bma4_write_regs(BMA4_INTR_LATCH_ADDR, &mode, 1, dev); - else - rslt |= BMA4_E_OUT_OF_RANGE; - } - - return rslt; -} - -/*! - * @brief This API gets the interrupt mode which is set in the sensor. - */ -uint16_t bma4_get_interrupt_mode(uint8_t *mode, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_INTR_LATCH_ADDR, &data, 1, dev); - *mode = data; - } - - return rslt; - -} - -/*! - * @brief This API sets the auxiliary Mag(BMM150 or AKM9916) output data - * rate and offset. - */ -uint16_t bma4_set_aux_mag_config(const struct bma4_aux_mag_config *aux_mag, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - if ((aux_mag->odr >= BMA4_OUTPUT_DATA_RATE_0_78HZ) && - (aux_mag->odr <= BMA4_OUTPUT_DATA_RATE_1600HZ) - && ((aux_mag->offset & BMA4_MAG_CONFIG_OFFSET_MSK) == 0x00)) { - data = (uint8_t)(aux_mag->odr | - ((aux_mag->offset << - BMA4_MAG_CONFIG_OFFSET_POS))); - rslt |= bma4_write_regs(BMA4_AUX_CONFIG_ADDR, &data, 1, dev); - } else { - rslt |= BMA4_E_OUT_OF_RANGE; - } - } - - return rslt; -} - -/*! - * @brief This API reads the auxiliary Mag(BMM150 or AKM9916) output data - * rate and offset. - */ -uint16_t bma4_get_aux_mag_config(struct bma4_aux_mag_config *aux_mag, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_AUX_CONFIG_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - aux_mag->odr = (data & 0x0F); - aux_mag->offset = (data & BMA4_MAG_CONFIG_OFFSET_MSK) >> 4; - } - } - - return rslt; -} - -/*! @brief This API sets the FIFO configuration in the sensor. - */ -uint16_t bma4_set_fifo_config(uint8_t config, uint8_t enable, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data[2] = {0, 0}; - uint8_t fifo_config_0 = config & BMA4_FIFO_CONFIG_0_MASK; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_FIFO_CONFIG_0_ADDR, data, BMA4_FIFO_CONFIG_LENGTH, dev); - - if (rslt == BMA4_OK) { - - if (fifo_config_0 > 0) { - - if (enable == TRUE) - data[0] = data[0] | fifo_config_0; - else - data[0] = data[0] & (~fifo_config_0); - } - - if (enable == TRUE) - data[1] = data[1] | (config & BMA4_FIFO_CONFIG_1_MASK); - else - data[1] = data[1] & (~(config & BMA4_FIFO_CONFIG_1_MASK)); - - /* Burst write is not possible in suspend mode hence - separate write is used with delay of 1 ms*/ - rslt |= bma4_write_regs(BMA4_FIFO_CONFIG_0_ADDR, &data[0], 1, dev); - dev->delay(BMA4_GEN_READ_WRITE_DELAY); - rslt |= bma4_write_regs((BMA4_FIFO_CONFIG_0_ADDR + 1), &data[1], 1, dev); - } - } - - return rslt; -} - -/*! @brief This API reads the FIFO configuration from the sensor. - */ -uint16_t bma4_get_fifo_config(uint8_t *fifo_config, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data[2] = {0, 0}; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_FIFO_CONFIG_0_ADDR, data, BMA4_FIFO_CONFIG_LENGTH, dev); - - if (rslt == BMA4_OK) - *fifo_config = ((uint8_t)((data[0] & BMA4_FIFO_CONFIG_0_MASK) | (data[1]))); - - } - - return rslt; -} - -/*! @brief This function sets the electrical behaviour of interrupt pin1 or - * pin2 in the sensor. - */ -uint16_t bma4_set_int_pin_config(const struct bma4_int_pin_config *int_pin_config, uint8_t int_line, - struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t interrupt_address_array[2] = {BMA4_INT1_IO_CTRL_ADDR, BMA4_INT2_IO_CTRL_ADDR}; - uint8_t data = 0; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - if (int_line <= 1) { - data = ((uint8_t)((int_pin_config->edge_ctrl & BMA4_INT_EDGE_CTRL_MASK) | - ((int_pin_config->lvl << 1) & BMA4_INT_LEVEL_MASK) | - ((int_pin_config->od << 2) & BMA4_INT_OPEN_DRAIN_MASK) | - ((int_pin_config->output_en << 3) & BMA4_INT_OUTPUT_EN_MASK) | - ((int_pin_config->input_en << 4) & BMA4_INT_INPUT_EN_MASK))); - - rslt |= bma4_write_regs(interrupt_address_array[int_line], &data, 1, dev); - } else { - rslt |= BMA4_E_INT_LINE_INVALID; - } - } - - return rslt; -} - -/*! @brief This API reads the electrical behavior of interrupt pin1 or pin2 - * from the sensor. - */ -uint16_t bma4_get_int_pin_config(struct bma4_int_pin_config *int_pin_config, uint8_t int_line, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t interrupt_address_array[2] = {BMA4_INT1_IO_CTRL_ADDR, BMA4_INT2_IO_CTRL_ADDR}; - uint8_t data = 0; - - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - if (int_line <= 1) { - rslt |= bma4_read_regs(interrupt_address_array[int_line], &data, 1, dev); - /* Assign interrupt configurations to the - structure members*/ - if (rslt == BMA4_OK) { - int_pin_config->edge_ctrl = data & BMA4_INT_EDGE_CTRL_MASK; - int_pin_config->lvl = ((data & BMA4_INT_LEVEL_MASK) >> BMA4_INT_LEVEL_POS); - int_pin_config->od = ((data & BMA4_INT_OPEN_DRAIN_MASK) >> BMA4_INT_OPEN_DRAIN_POS); - int_pin_config->output_en = ((data & BMA4_INT_OUTPUT_EN_MASK) - >> BMA4_INT_OUTPUT_EN_POS); - int_pin_config->input_en = ((data & BMA4_INT_INPUT_EN_MASK) >> BMA4_INT_INPUT_EN_POS); - } - } else { - rslt |= BMA4_E_INT_LINE_INVALID; - } - } - - return rslt; -} - -/*! - * @brief This API reads the Feature and Hardware interrupt status from the sensor. - */ -uint16_t bma4_read_int_status(uint16_t *int_status, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data[2] = {0}; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - rslt |= bma4_read_regs(BMA4_INT_STAT_0_ADDR, data, 2, dev); - - if (rslt == BMA4_OK) { - *int_status = data[0]; - *((uint8_t *)int_status + 1) = data[1]; - } - } - - return rslt; -} - -/*! - * @brief This API reads the Feature interrupt status from the sensor. - */ -uint16_t bma4_read_int_status_0(uint8_t *int_status_0, struct bma4_dev *dev) -{ - uint16_t rslt = BMA4_OK; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - /* Null pointer check */ - rslt = BMA4_E_NULL_PTR; - } else { - rslt = bma4_read_regs(BMA4_INT_STAT_0_ADDR, int_status_0, 1, dev); - } - - return rslt; -} - -/*! - * @brief This API reads the Hardware interrupt status from the sensor. - */ -uint16_t bma4_read_int_status_1(uint8_t *int_status_1, struct bma4_dev *dev) -{ - uint16_t rslt = BMA4_OK; - - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - /* Null pointer check */ - rslt = BMA4_E_NULL_PTR; - } else { - rslt = bma4_read_regs(BMA4_INT_STAT_1_ADDR, int_status_1, 1, dev); - } - - return rslt; -} - -/*! - * @brief This API initializes the auxiliary interface to access - * auxiliary sensor - */ -uint16_t bma4_aux_interface_init(struct bma4_dev *dev) -{ - /* Variable to return error codes */ - uint16_t rslt = BMA4_OK; - - /* Check for Null pointer error */ - rslt |= bma4_null_pointer_check(dev); - if (rslt == BMA4_OK) { - /* Set the auxiliary sensor configuration */ - rslt = bma4_set_aux_interface_config(dev); - if (rslt != BMA4_OK) - rslt = BMA4_E_AUX_CONFIG_FAIL; - } - - return rslt; -} - -/*! - * @brief This API reads the data from the auxiliary sensor -*/ -uint16_t bma4_aux_read(uint8_t aux_reg_addr, uint8_t *aux_data, uint16_t len, struct bma4_dev *dev) -{ - /* Variable to return error codes */ - uint16_t rslt = BMA4_OK; - - /* Check for Null pointer error */ - rslt |= bma4_null_pointer_check(dev); - if (rslt == BMA4_OK) { - /* Read the data from the data register in terms of - user defined length */ - rslt = bma4_extract_aux_data(aux_reg_addr, aux_data, len, dev); - } - - return rslt; -} - -/*! - * @brief This API writes the data into the auxiliary sensor -*/ -uint16_t bma4_aux_write(uint8_t aux_reg_addr, uint8_t *aux_data, uint16_t len, struct bma4_dev *dev) -{ - - uint16_t rslt = BMA4_OK; - - /* Check for Null pointer error */ - rslt |= bma4_null_pointer_check(dev); - if (rslt == BMA4_OK) { - /* Write data in terms of user defined length */ - if (len > 0) { - while (len--) { - /* First set data to write */ - rslt = bma4_write_regs(BMA4_AUX_WR_DATA_ADDR, aux_data, 1, dev); - dev->delay(BMA4_AUX_COM_DELAY); - if (rslt == BMA4_OK) { - /* Then set address to write */ - rslt = bma4_write_regs(BMA4_AUX_WR_ADDR, &aux_reg_addr, 1, dev); - dev->delay(BMA4_AUX_COM_DELAY); - - /* Increment data array and register address until - * user-defined length is greater than 0 */ - if ((rslt == BMA4_OK) && (len > 0)) { - aux_data++; - aux_reg_addr++; - } - } else { - rslt = BMA4_E_FAIL; - } - } - } else { - rslt = BMA4_E_RD_WR_LENGTH_INVALID; - } - } - - return rslt; -} - -/*****************************************************************************/ -/* Static function definition */ -/*! - * @brief This API converts lsb value of axes to mg for self-test * - */ -static void convert_lsb_g(const struct selftest_delta_limit *accel_data_diff, - struct selftest_delta_limit *accel_data_diff_mg, - const struct bma4_dev *dev) -{ - uint32_t lsb_per_g; - /*! Range considered for self-test is 8g */ - uint8_t range = 8; - - /*! lsb_per_g for the respective resolution and 8g range*/ - lsb_per_g = (uint32_t)(power(2, dev->resolution) / (2 * range)); - /*! accel x value in mg */ - accel_data_diff_mg->x = (accel_data_diff->x / (int32_t)lsb_per_g) * 1000; - /*! accel y value in mg */ - accel_data_diff_mg->y = (accel_data_diff->y / (int32_t)lsb_per_g) * 1000; - /*! accel z value in mg */ - accel_data_diff_mg->z = (accel_data_diff->z / (int32_t)lsb_per_g) * 1000; -} - -/*! - * @brief This API writes the config stream data in memory using burst mode - * @note index value should be even number. - */ -static uint16_t stream_transfer_write(const uint8_t *stream_data, uint16_t index, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t asic_msb = (uint8_t)((index / 2) >> 4); - uint8_t asic_lsb = ((index / 2) & 0x0F); - - rslt |= bma4_write_regs(BMA4_RESERVED_REG_5B_ADDR, &asic_lsb, 1, dev); - - if (rslt == BMA4_OK) { - rslt |= bma4_write_regs(BMA4_RESERVED_REG_5C_ADDR, &asic_msb, 1, dev); - - if (rslt == BMA4_OK) - rslt |= write_regs(BMA4_FEATURE_CONFIG_ADDR, (uint8_t *)stream_data, dev->read_write_len, dev); - } - - return rslt; -} - -/*! - * @brief This API enables or disables the Accel Self test feature in the - * sensor. - */ -static uint16_t set_accel_selftest_enable(uint8_t accel_selftest_enable, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - /* Read the self test register */ - rslt |= bma4_read_regs(BMA4_ACC_SELF_TEST_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - data = BMA4_SET_BITS_POS_0(data, BMA4_ACCEL_SELFTEST_ENABLE, accel_selftest_enable); - rslt |= bma4_write_regs(BMA4_ACC_SELF_TEST_ADDR, &data, 1, dev); - } - } - - return rslt; -} - -/*! - * @brief This API selects the sign of Accel self-test excitation. - */ -static uint16_t set_accel_selftest_sign(uint8_t accel_selftest_sign, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - - if (accel_selftest_sign <= BMA4_MAX_VALUE_SELFTEST_SIGN) { - /* Read the Accel self test sign*/ - rslt |= bma4_read_regs(BMA4_ACC_SELF_TEST_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - data = BMA4_SET_BITSLICE(data, BMA4_ACCEL_SELFTEST_SIGN, accel_selftest_sign); - rslt |= bma4_write_regs(BMA4_ACC_SELF_TEST_ADDR, &data, 1, dev); - } - } else { - rslt = BMA4_E_OUT_OF_RANGE; - } - } - - return rslt; -} - -/*! - * @brief This API sets the Accel self test amplitude in the sensor. - */ -static uint16_t set_accel_selftest_amp(uint8_t accel_selftest_amp, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t data = 0; - /* Check the bma4 structure as NULL */ - if (dev == NULL) { - rslt |= BMA4_E_NULL_PTR; - } else { - - if (accel_selftest_amp <= BMA4_MAX_VALUE_SELFTEST_AMP) { - /* Write self test amplitude*/ - rslt |= bma4_read_regs(BMA4_ACC_SELF_TEST_ADDR, &data, 1, dev); - - if (rslt == BMA4_OK) { - data = BMA4_SET_BITSLICE(data, BMA4_SELFTEST_AMP, accel_selftest_amp); - - rslt |= bma4_write_regs(BMA4_ACC_SELF_TEST_ADDR, &data, 1, dev); - } - } else { - rslt |= BMA4_E_OUT_OF_RANGE; - } - } - - return rslt; -} - -/*! - * @brief This function enables and configures the Accel which is needed - * for Self test operation. - */ -static uint16_t set_accel_selftest_config(struct bma4_dev *dev) -{ - uint16_t rslt = 0; - struct bma4_accel_config accel = {0}; - - accel.odr = BMA4_OUTPUT_DATA_RATE_1600HZ; - accel.bandwidth = BMA4_ACCEL_NORMAL_AVG4; - accel.perf_mode = BMA4_ENABLE; - accel.range = BMA4_ACCEL_RANGE_8G; - - rslt |= bma4_set_accel_enable(BMA4_ENABLE, dev); - dev->delay(1); - rslt |= bma4_set_accel_config(&accel, dev); - - return rslt; -} - -/*! - * @brief This API validates the Accel g value provided as input by the - * user for Accel offset compensation. - * - * @note The g-values to be passed to the parameter should be - * multiples of 1000000. - */ -static uint16_t validate_user_input(const int32_t *gvalue) - -{ - uint8_t index = 0; - int32_t min_gval = (int32_t)(-1.0 * BMA4XY_MULTIPLIER); - int32_t max_gval = (int32_t)(1.0 * BMA4XY_MULTIPLIER); - - while (index < 3) { - if (gvalue[index] >= min_gval && gvalue[index] <= max_gval) - index++; - else - return BMA4_E_OUT_OF_RANGE; - } - - return BMA4_OK; -} - -/*! - * @brief This API normalise the data with offset - */ -static void normalise_offset(const struct offset_delta *compensated_data, struct accel_offset *offset_data) -{ - /* for handling negative offset */ - /* employing twos's Complement method*/ - if (compensated_data->x.is_negative == TRUE) { - offset_data->x = ~offset_data->x; - offset_data->x += 1; - } - - if (compensated_data->y.is_negative == TRUE) { - offset_data->y = ~offset_data->y; - offset_data->y += 1; - } - - if (compensated_data->z.is_negative == TRUE) { - offset_data->z = ~offset_data->z; - offset_data->z += 1; - } - - offset_data->x = (uint8_t)((offset_data->x) * (-1)); - offset_data->y = (uint8_t)((offset_data->y) * (-1)); - offset_data->z = (uint8_t)((offset_data->z) * (-1)); -} - -/*! - * @brief This API normalize the data with offset. - */ -static void scale_offset(uint8_t res, uint8_t range, const struct offset_delta *delta, struct accel_offset *data) -{ - int8_t bit_pos_3_9mg, bit_pos_3_9mg_nextbit; - uint8_t round_off = 0; - - /* Find the bit position of 3.9mg */ - bit_pos_3_9mg = get_bit_pos_3_9mg(range, res); - - /* Data register resolution less than or equal to 3.9 mg */ - if (bit_pos_3_9mg > 0) { - /* Round off, consider if the next bit is high */ - bit_pos_3_9mg_nextbit = bit_pos_3_9mg - 1; - round_off = (uint8_t)(1 * power(2, ((uint8_t) bit_pos_3_9mg_nextbit))); - /* scale according to offset register resolution*/ - data->x = (uint8_t)((delta->x.val + round_off) / power(2, ((uint8_t)bit_pos_3_9mg))); - data->y = (uint8_t)((delta->y.val + round_off) / power(2, ((uint8_t)bit_pos_3_9mg))); - data->z = (uint8_t)((delta->z.val + round_off) / power(2, ((uint8_t)bit_pos_3_9mg))); - } else if (bit_pos_3_9mg < 0) { - bit_pos_3_9mg = (int8_t)(bit_pos_3_9mg * -1); - data->x = (uint8_t)(delta->x.val * power(2, ((uint8_t)bit_pos_3_9mg))); - data->y = (uint8_t)(delta->y.val * power(2, ((uint8_t)bit_pos_3_9mg))); - data->z = (uint8_t)(delta->z.val * power(2, ((uint8_t)bit_pos_3_9mg))); - } else { - /* Scale according to offset register resolution */ - data->x = (uint8_t)(delta->x.val); - data->y = (uint8_t)(delta->y.val); - data->z = (uint8_t)(delta->z.val); - } -} - -/*! - * @brief This API compensate the accel data against gravity. - * - * @note The g-values to be passed to the parameter should be - * multiples of 1000000. - */ -static void comp_for_grvty(uint16_t lsb_per_g, const int32_t g_val[3], const struct bma4_accel *data, - struct offset_delta *comp_data) -{ - int64_t accel_value_lsb[3] = {0}; - uint8_t index; - - for (index = 0; index < 3; index++) { - /* convert g to lsb */ - accel_value_lsb[index] = ((int64_t)(lsb_per_g) * (int64_t)(g_val[index])); - } - - /* Dividing the accel value in LSB by 1000000 to get - compensated data back in g-value */ - comp_data->x.val = (int16_t)(data->x - (int16_t)((accel_value_lsb[BMA4_X_AXIS] / (int64_t)BMA4XY_MULTIPLIER))); - comp_data->y.val = (int16_t)(data->y - (int16_t)((accel_value_lsb[BMA4_Y_AXIS] / (int64_t)BMA4XY_MULTIPLIER))); - comp_data->z.val = (int16_t)(data->z - (int16_t)((accel_value_lsb[BMA4_Z_AXIS] / (int64_t)BMA4XY_MULTIPLIER))); - - if (comp_data->x.val < 0) { - comp_data->x.val = ABS(comp_data->x.val); - comp_data->x.is_negative = 1; - } - - if (comp_data->y.val < 0) { - comp_data->y.val = ABS(comp_data->y.val); - comp_data->y.is_negative = 1; - } - - if (comp_data->z.val < 0) { - comp_data->z.val = ABS(comp_data->z.val); - comp_data->z.is_negative = 1; - } -} - -/*! - * @brief This API converts the range value into corresponding - * integer value. - */ -static void map_range(uint8_t range_in, uint8_t *range_out) -{ - switch (range_in) { - case BMA4_ACCEL_RANGE_2G: - *range_out = 2; - break; - case BMA4_ACCEL_RANGE_4G: - *range_out = 4; - break; - case BMA4_ACCEL_RANGE_8G: - *range_out = 8; - break; - case BMA4_ACCEL_RANGE_16G: - *range_out = 16; - break; - default: - break; - } -} - -/*! - * @brief This API is used to reset the FIFO related configurations - * in the fifo_frame structure. - * - */ -static void reset_fifo_data_structure(const struct bma4_dev *dev) -{ - /*Prepare for next FIFO read by resetting FIFO's - internal data structures*/ - dev->fifo->accel_byte_start_idx = 0; - dev->fifo->mag_byte_start_idx = 0; - dev->fifo->sc_frame_byte_start_idx = 0; - dev->fifo->sensor_time = 0; - dev->fifo->skipped_frame_count = 0; - dev->fifo->accel_dropped_frame_count = 0; - dev->fifo->mag_dropped_frame_count = 0; -} - -/*! - * @brief This API computes the number of bytes of accel FIFO data - * which is to be parsed in header-less mode - */ -static void get_accel_len_to_parse(uint16_t *start_idx, uint16_t *len, const uint16_t *acc_count, - const struct bma4_dev *dev) -{ - uint8_t dummy_byte_spi = 0; - - /*Check if this is the first iteration of data unpacking - if yes, then consider dummy byte on SPI*/ - if (dev->fifo->accel_byte_start_idx == 0) - dummy_byte_spi = dev->dummy_byte; - - /*Data start index*/ - *start_idx = dev->fifo->accel_byte_start_idx + dummy_byte_spi; - - if (dev->fifo->fifo_data_enable == BMA4_FIFO_A_ENABLE) { - /*Len has the number of bytes to loop for */ - *len = (uint16_t)(((*acc_count) * BMA4_FIFO_A_LENGTH) + dummy_byte_spi); - } else if (dev->fifo->fifo_data_enable == BMA4_FIFO_M_A_ENABLE) { - /*Len has the number of bytes to loop for */ - *len = (uint16_t)(((*acc_count) * BMA4_FIFO_MA_LENGTH) + dummy_byte_spi); - } else { - /*Only aux. sensor or no sensor is enabled in FIFO, - so there will be no accel data. - Update the data index as complete*/ - *start_idx = dev->fifo->length; - } - if ((*len) > dev->fifo->length) { - /*Handling the case where more data is requested - than available*/ - *len = dev->fifo->length; - } -} - -/*! - * @brief This API checks the fifo read data as empty frame, if it - * is empty frame then moves the index to last byte. - */ -static void check_empty_fifo(uint16_t *data_index, const struct bma4_dev *dev) -{ - if ((*data_index + 2) < dev->fifo->length) { - /* Check if FIFO is empty */ - if ((dev->fifo->data[*data_index] == FIFO_MSB_CONFIG_CHECK) - && (dev->fifo->data[*data_index + 1] == FIFO_LSB_CONFIG_CHECK)) { - /*Update the data index as complete*/ - *data_index = dev->fifo->length; - } - } -} - -/*! - * @brief This API is used to parse the accelerometer data from the - * FIFO data in header mode. - * - */ -static void extract_accel_header_mode(struct bma4_accel *accel_data, uint16_t *accel_length, const struct bma4_dev *dev) -{ - uint8_t frame_header = 0; - uint16_t data_index; - uint16_t accel_index = 0; - uint16_t frame_to_read = *accel_length; - /*Check if this is the first iteration of data unpacking - if yes, then consider dummy byte on SPI*/ - if (dev->fifo->accel_byte_start_idx == 0) - dev->fifo->accel_byte_start_idx = dev->dummy_byte; - - for (data_index = dev->fifo->accel_byte_start_idx; data_index < dev->fifo->length;) { - /*Header byte is stored in the variable frame_header*/ - frame_header = dev->fifo->data[data_index]; - /*Get the frame details from header*/ - frame_header = frame_header & BMA4_FIFO_TAG_INTR_MASK; - /*Index is moved to next byte where the data is starting*/ - data_index++; - - switch (frame_header) { - /* Accel frame */ - case FIFO_HEAD_A: - case FIFO_HEAD_M_A: - unpack_acc_frm(accel_data, &data_index, &accel_index, frame_header, dev); - break; - /* Aux. sensor frame */ - case FIFO_HEAD_M: - move_next_frame(&data_index, BMA4_FIFO_M_LENGTH, dev); - break; - /* Sensor time frame */ - case FIFO_HEAD_SENSOR_TIME: - unpack_sensortime_frame(&data_index, dev); - break; - /* Skip frame */ - case FIFO_HEAD_SKIP_FRAME: - unpack_skipped_frame(&data_index, dev); - break; - /* Input config frame */ - case FIFO_HEAD_INPUT_CONFIG: - move_next_frame(&data_index, 1, dev); - break; - /* Sample drop frame */ - case FIFO_HEAD_SAMPLE_DROP: - unpack_dropped_frame(&data_index, dev); - break; - /* Over read FIFO data */ - case FIFO_HEAD_OVER_READ_MSB: - /* Update the data index as complete*/ - data_index = dev->fifo->length; - break; - default: - break; - } - if (frame_to_read == accel_index) { - /*Number of frames to read completed*/ - break; - } - } - - /*Update number of accel data read*/ - *accel_length = accel_index; - /*Update the accel frame index*/ - dev->fifo->accel_byte_start_idx = data_index; -} - -/*! - * @brief This API is used to parse the accelerometer data from the - * FIFO data in both header mode and header-less mode. - * It update the idx value which is used to store the index of - * the current data byte which is parsed. - */ -static void unpack_acc_frm(struct bma4_accel *acc, uint16_t *idx, uint16_t *acc_idx, uint8_t frm, - const struct bma4_dev *dev) -{ - switch (frm) { - case FIFO_HEAD_A: - case BMA4_FIFO_A_ENABLE: - /*Partial read, then skip the data*/ - if ((*idx + BMA4_FIFO_A_LENGTH) > dev->fifo->length) { - /*Update the data index as complete*/ - *idx = dev->fifo->length; - break; - } - /*Unpack the data array into the structure instance "acc" */ - unpack_accel_data(&acc[*acc_idx], *idx, dev); - /*Move the data index*/ - *idx = *idx + BMA4_FIFO_A_LENGTH; - (*acc_idx)++; - break; - case FIFO_HEAD_M_A: - case BMA4_FIFO_M_A_ENABLE: - /*Partial read, then skip the data*/ - if ((*idx + BMA4_FIFO_MA_LENGTH) > dev->fifo->length) { - /*Update the data index as complete*/ - *idx = dev->fifo->length; - break; - } - /*Unpack the data array into structure instance "acc"*/ - unpack_accel_data(&acc[*acc_idx], *idx + BMA4_MA_FIFO_A_X_LSB, dev); - /*Move the data index*/ - *idx = *idx + BMA4_FIFO_MA_LENGTH; - (*acc_idx)++; - break; - /* Aux. sensor frame */ - case FIFO_HEAD_M: - case BMA4_FIFO_M_ENABLE: - (*idx) = (*idx) + BMA4_FIFO_M_LENGTH; - break; - default: - break; - } -} - -/*! - * @brief This API is used to parse the accelerometer data from the - * FIFO data and store it in the instance of the structure bma4_accel. - */ -static void unpack_accel_data(struct bma4_accel *accel_data, uint16_t data_start_index, const struct bma4_dev *dev) -{ - uint16_t data_lsb; - uint16_t data_msb; - - /* Accel raw x data */ - data_lsb = dev->fifo->data[data_start_index++]; - data_msb = dev->fifo->data[data_start_index++]; - accel_data->x = (int16_t)((data_msb << 8) | data_lsb); - - /* Accel raw y data */ - data_lsb = dev->fifo->data[data_start_index++]; - data_msb = dev->fifo->data[data_start_index++]; - accel_data->y = (int16_t)((data_msb << 8) | data_lsb); - - /* Accel raw z data */ - data_lsb = dev->fifo->data[data_start_index++]; - data_msb = dev->fifo->data[data_start_index++]; - accel_data->z = (int16_t)((data_msb << 8) | data_lsb); - - if (dev->resolution == BMA4_12_BIT_RESOLUTION) { - accel_data->x = (accel_data->x / 0x10); - accel_data->y = (accel_data->y / 0x10); - accel_data->z = (accel_data->z / 0x10); - } else if (dev->resolution == BMA4_14_BIT_RESOLUTION) { - accel_data->x = (accel_data->x / 0x04); - accel_data->y = (accel_data->y / 0x04); - accel_data->z = (accel_data->z / 0x04); - } -} - -/*! - * @brief This API computes the number of bytes of Mag FIFO data which is - * to be parsed in header-less mode - * - */ -static void get_mag_len_to_parse(uint16_t *start_idx, uint16_t *len, const uint16_t *mag_count, - const struct bma4_dev *dev) -{ - uint8_t dummy_byte_spi = 0; - - /*Check if this is the first iteration of data unpacking - if yes, then consider dummy byte on SPI*/ - if (dev->fifo->mag_byte_start_idx == 0) - dummy_byte_spi = dev->dummy_byte; - - /*Data start index*/ - *start_idx = dev->fifo->mag_byte_start_idx + dummy_byte_spi; - - if (dev->fifo->fifo_data_enable == BMA4_FIFO_M_ENABLE) { - /*Len has the number of bytes to loop for */ - *len = (uint16_t)(((*mag_count) * BMA4_FIFO_M_LENGTH) + dummy_byte_spi); - } else if (dev->fifo->fifo_data_enable == BMA4_FIFO_M_A_ENABLE) { - /*Len has the number of bytes to loop for */ - *len = (uint16_t)(((*mag_count) * BMA4_FIFO_MA_LENGTH) + dummy_byte_spi); - } else { - /*Only accel sensor or no sensor is enabled in FIFO, - so there will be no mag data. - Update the data index as complete*/ - *start_idx = dev->fifo->length; - } - - /*Handling the case where more data is requested than available*/ - if ((*len) > dev->fifo->length) { - /*Len is equal to the FIFO length*/ - *len = dev->fifo->length; - } -} - -/*! - * @brief This API is used to parse the magnetometer data from the - * FIFO data in header mode. - * - */ -static uint16_t extract_mag_header_mode(struct bma4_mag *data, uint16_t *len, const struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t frame_header = 0; - uint16_t data_index; - uint16_t mag_index = 0; - uint16_t frame_to_read = *len; - - /*Check if this is the first iteration of data unpacking - if yes, then consider dummy byte on SPI*/ - if (dev->fifo->mag_byte_start_idx == 0) - dev->fifo->mag_byte_start_idx = dev->dummy_byte; - - for (data_index = dev->fifo->mag_byte_start_idx; data_index < dev->fifo->length;) { - /*Header byte is stored in the variable frame_header*/ - frame_header = dev->fifo->data[data_index]; - /*Get the frame details from header*/ - frame_header = frame_header & BMA4_FIFO_TAG_INTR_MASK; - /*Index is moved to next byte where the data is starting*/ - data_index++; - - switch (frame_header) { - /* Aux. sensor frame */ - case FIFO_HEAD_M: - case FIFO_HEAD_M_A: - rslt |= unpack_mag_frm(data, &data_index, &mag_index, frame_header, dev); - break; - /* Aux. sensor frame */ - case FIFO_HEAD_A: - move_next_frame(&data_index, BMA4_FIFO_A_LENGTH, dev); - break; - /* Sensor time frame */ - case FIFO_HEAD_SENSOR_TIME: - unpack_sensortime_frame(&data_index, dev); - break; - /* Skip frame */ - case FIFO_HEAD_SKIP_FRAME: - unpack_skipped_frame(&data_index, dev); - break; - /* Input config frame */ - case FIFO_HEAD_INPUT_CONFIG: - move_next_frame(&data_index, 1, dev); - break; - /* Sample drop frame */ - case FIFO_HEAD_SAMPLE_DROP: - unpack_dropped_frame(&data_index, dev); - break; - case FIFO_HEAD_OVER_READ_MSB: - /*Update the data index as complete*/ - data_index = dev->fifo->length; - break; - default: - break; - } - if (frame_to_read == mag_index) { - /*Number of frames to read completed*/ - break; - } - } - /*update number of Aux. sensor data read*/ - *len = mag_index; - /*update the Aux. sensor frame index*/ - dev->fifo->mag_byte_start_idx = data_index; - return rslt; -} - -/*! - * @brief This API is used to parse the magnetometer data from the - * FIFO data in both header mode and header-less mode and update the - * data_index value which is used to store the index of the current - * data byte which is parsed. - * - */ -static uint16_t unpack_mag_frm(struct bma4_mag *data, uint16_t *idx, uint16_t *mag_idx, uint8_t frm, - const struct bma4_dev *dev) -{ - uint16_t rslt = 0; - - switch (frm) { - case FIFO_HEAD_M: - case BMA4_FIFO_M_ENABLE: - /*partial read, then skip the data*/ - if ((*idx + BMA4_FIFO_M_LENGTH) > dev->fifo->length) { - /*update the data index as complete*/ - *idx = dev->fifo->length; - break; - } - - /*unpack the data array into Aux. sensor data structure*/ - rslt |= unpack_mag_data(&data[*mag_idx], *idx, dev); - /*move the data index*/ - *idx = *idx + BMA4_FIFO_M_LENGTH; - (*mag_idx)++; - break; - case FIFO_HEAD_M_A: - case BMA4_FIFO_M_A_ENABLE: - /*partial read, then skip the data*/ - if ((*idx + BMA4_FIFO_MA_LENGTH) > dev->fifo->length) { - /*update the data index as complete*/ - *idx = dev->fifo->length; - break; - } - - /*unpack the data array into Aux. sensor data structure*/ - rslt |= unpack_mag_data(&data[*mag_idx], *idx, dev); - /*move the data index to next frame*/ - *idx = *idx + BMA4_FIFO_MA_LENGTH; - (*mag_idx)++; - break; - /* aux. sensor frame */ - case FIFO_HEAD_A: - case BMA4_FIFO_A_ENABLE: - (*idx) = (*idx) + BMA4_FIFO_A_LENGTH; - break; - default: - break; - } - - return rslt; -} - -/*! - * @brief This API is used to parse the auxiliary magnetometer data from - * the FIFO data and store it in the instance of the structure mag_data. - * - */ -static uint16_t unpack_mag_data(struct bma4_mag *mag_data, uint16_t start_idx, const struct bma4_dev *dev) -{ - uint16_t rslt = 0; - struct bma4_mag_fifo_data mag_fifo_data; - - /* Aux. mag sensor raw x data */ - mag_fifo_data.mag_x_lsb = dev->fifo->data[start_idx++]; - mag_fifo_data.mag_x_msb = dev->fifo->data[start_idx++]; - - /* Aux. mag sensor raw y data */ - mag_fifo_data.mag_y_lsb = dev->fifo->data[start_idx++]; - mag_fifo_data.mag_y_msb = dev->fifo->data[start_idx++]; - - /* Aux. mag sensor raw z data */ - mag_fifo_data.mag_z_lsb = dev->fifo->data[start_idx++]; - mag_fifo_data.mag_z_msb = dev->fifo->data[start_idx++]; - - /* Aux. mag sensor raw r data */ - mag_fifo_data.mag_r_y2_lsb = dev->fifo->data[start_idx++]; - mag_fifo_data.mag_r_y2_msb = dev->fifo->data[start_idx++]; - - /*Compensated FIFO data output*/ - rslt |= bma4_second_if_mag_compensate_xyz(mag_fifo_data, dev->aux_sensor, mag_data); - - return rslt; -} - -/*! - * @brief This API is used to parse and store the sensor time from the - * FIFO data in the structure instance dev. - * - */ -static void unpack_sensortime_frame(uint16_t *data_index, const struct bma4_dev *dev) -{ - uint32_t sensor_time_byte3 = 0; - uint16_t sensor_time_byte2 = 0; - uint8_t sensor_time_byte1 = 0; - - /*Partial read, then move the data index to last data*/ - if ((*data_index + BMA4_SENSOR_TIME_LENGTH) > dev->fifo->length) { - /*Update the data index as complete*/ - *data_index = dev->fifo->length; - } else { - sensor_time_byte3 = dev->fifo->data[(*data_index) + BMA4_SENSOR_TIME_MSB_BYTE] << 16; - sensor_time_byte2 = dev->fifo->data[(*data_index) + BMA4_SENSOR_TIME_XLSB_BYTE] << 8; - sensor_time_byte1 = dev->fifo->data[(*data_index)]; - /* Sensor time */ - dev->fifo->sensor_time = (uint32_t)(sensor_time_byte3 | sensor_time_byte2 | sensor_time_byte1); - *data_index = (*data_index) + BMA4_SENSOR_TIME_LENGTH; - } -} - -/*! - * @brief This API is used to parse and store the skipped_frame_count from - * the FIFO data in the structure instance dev. - */ -static void unpack_skipped_frame(uint16_t *data_index, const struct bma4_dev *dev) -{ - /*Partial read, then move the data index to last data*/ - if (*data_index >= dev->fifo->length) { - /*Update the data index as complete*/ - *data_index = dev->fifo->length; - } else { - dev->fifo->skipped_frame_count = dev->fifo->data[*data_index]; - /*Move the data index*/ - *data_index = (*data_index) + 1; - } -} - -/*! - * @brief This API is used to parse and store the dropped_frame_count from - * the FIFO data in the structure instance dev. - */ -static void unpack_dropped_frame(uint16_t *data_index, const struct bma4_dev *dev) -{ - uint8_t dropped_frame = 0; - /*Partial read, then move the data index to last data*/ - if (*data_index >= dev->fifo->length) { - /*Update the data index as complete*/ - *data_index = dev->fifo->length; - } else { - /*Extract accel and mag dropped frame count*/ - dropped_frame = dev->fifo->data[*data_index] & ACCEL_AUX_FIFO_DROP; - /*Move the data index and update the dropped frame count*/ - switch (dropped_frame) { - case ACCEL_FIFO_DROP: - *data_index = (*data_index) + BMA4_FIFO_A_LENGTH; - dev->fifo->accel_dropped_frame_count = dev->fifo->accel_dropped_frame_count + 1; - break; - case AUX_FIFO_DROP: - *data_index = (*data_index) + BMA4_FIFO_M_LENGTH; - dev->fifo->mag_dropped_frame_count = dev->fifo->mag_dropped_frame_count + 1; - break; - case ACCEL_AUX_FIFO_DROP: - *data_index = (*data_index) + BMA4_FIFO_MA_LENGTH; - dev->fifo->accel_dropped_frame_count = dev->fifo->accel_dropped_frame_count + 1; - dev->fifo->mag_dropped_frame_count = dev->fifo->mag_dropped_frame_count + 1; - break; - default: - break; - } - } -} - -/*! - * @brief This API is used to move the data index ahead of the - * current_frame_length parameter when unnecessary FIFO data appears while - * extracting the user specified data. - */ -static void move_next_frame(uint16_t *data_index, uint8_t current_frame_length, const struct bma4_dev *dev) -{ - /*Partial read, then move the data index to last data*/ - if ((*data_index + current_frame_length) > dev->fifo->length) { - /*Update the data index as complete*/ - *data_index = dev->fifo->length; - } else { - /*Move the data index to next frame*/ - *data_index = *data_index + current_frame_length; - } -} - -/*! - * @brief This function validates the Accel Self test data and decides the - * result of Self test operation. - */ -static uint16_t validate_selftest(const struct selftest_delta_limit *accel_data_diff, - const struct bma4_dev *dev) -{ - uint16_t rslt = 0; - - /* Set self test amplitude based on variant */ - switch (dev->variant) { - case BMA42X_VARIANT: - /* Validating accel data by comparing with minimum value of the axes in mg */ - /* For BMA42x - > x axis limit 400mg, y axis limit 800mg and z axis limit 400mg */ - if ((accel_data_diff->x > BMA42X_ST_ACC_X_AXIS_SIGNAL_DIFF) && - (accel_data_diff->y > BMA42X_ST_ACC_Y_AXIS_SIGNAL_DIFF) && - (accel_data_diff->z > BMA42X_ST_ACC_Z_AXIS_SIGNAL_DIFF)) { - rslt = BMA4_OK; - } else { - rslt = BMA4_E_SELF_TEST_FAIL; - } - break; - - case BMA45X_VARIANT: - /* Validating accel data by comparing with minimum value of the axes in mg */ - /* For BMA45x - > x axis limit 1800mg, y axis limit 1800mg and z axis limit 1800mg */ - if ((accel_data_diff->x > BMA45X_ST_ACC_X_AXIS_SIGNAL_DIFF) && - (accel_data_diff->y > BMA45X_ST_ACC_Y_AXIS_SIGNAL_DIFF) && - (accel_data_diff->z > BMA45X_ST_ACC_Z_AXIS_SIGNAL_DIFF)) { - rslt = BMA4_OK; - } else { - rslt = BMA4_E_SELF_TEST_FAIL; - } - break; - - default: - rslt = BMA4_E_INVALID_SENSOR; - break; - } - - return rslt; -} - -/*! - * @brief This function configure the Accel for FOC. - */ -static uint16_t foc_config(struct bma4_accel_config *acc_conf, uint8_t *acc_en, uint8_t *pwr_mode, struct bma4_dev *dev) -{ - uint16_t rslt = 0; - uint8_t accel_cnf = BMA4_ACCEL_CONFIG_FOC; - - /* for saving Accel configuration, - Accel enable status, advance power save*/ - rslt |= bma4_get_accel_config(acc_conf, dev); - rslt |= bma4_get_accel_enable(acc_en, dev); - rslt |= bma4_get_advance_power_save(pwr_mode, dev); - - /* Disabling offset compensation that is in place*/ - rslt |= bma4_set_offset_comp(BMA4_DISABLE, dev); - - if (rslt == BMA4_OK) { - /* Set Accel config to 50Hz, continuous filter mode, - no under sampling */ - rslt |= bma4_write_regs(BMA4_ACCEL_CONFIG_ADDR, &accel_cnf, 1, dev); - - if (rslt == BMA4_OK) { - /* Switch Accel to normal mode and - advance power save to zero*/ - rslt |= bma4_set_accel_enable(BMA4_ENABLE, dev); - rslt |= bma4_set_advance_power_save(BMA4_DISABLE, dev); - } - } - - return rslt; -} - -/*! - * @brief This API is used to calculate the power of 2 - */ -static int32_t power(int16_t base, uint8_t resolution) -{ - uint8_t i = 1; - /* Initialize variable to store the power of 2 value */ - int32_t value = 1; - - for (; i <= resolution; i++) - value = (int32_t)(value * base); - - return value; -} - -/*! - * @brief This API performs the roundoff on given value - */ -static int8_t roundoff(int32_t value) -{ - /* Variable to return the round off value */ - int8_t ret = 0; - - /* Since the value passed is scaled in multiples of 100, - the return value is divided by 100 to get the round off value */ - if (value < 0) - ret = (int8_t)(((value) - 50) / 100); - else - ret = (int8_t)(((value) + 50) / 100); - - - return ret; -} - -/*! - * @brief This API finds the bit position of 3.9mg according to given range - * and resolution. - */ -static int8_t get_bit_pos_3_9mg(uint8_t range, uint8_t res) -{ - /* Variable to store the bit position of 3.9mg */ - int8_t bit_pos_3_9mg = 0; - /* Variable to store the value to be rounded off */ - int32_t value = 0; - /* Variable to store the LSB per bit in micros */ - int32_t ug_per_bit; - /* Variable to store the rounded off value */ - int8_t round_off_int; - /* Variable to store the bit count */ - uint8_t bit_count = 0; - /* Variable to store the signed range value */ - int32_t range_value; - - /* Scaling range with a multiplier to get integer value of ug_per_bit */ - range_value = (int32_t)(2 * range * BMA4XY_MULTIPLIER); - - /* Get the G-per bit resolution*/ - ug_per_bit = (int32_t)(range_value / power(2, res)); - - /* Compare for -ve & +ve bit position w.r.t 3900micro-g or as reference - * Note: Value scaled in 100s to get accurate integer value */ - if (ug_per_bit > 3900) - value = (int32_t)(ug_per_bit * 100 / 3900); - else - value = (int32_t)(3900 * 100 / ug_per_bit); - - /* Round off the value */ - round_off_int = (int8_t)(roundoff(value)); - - /* Find the bit position of 3.9mg*/ - while (round_off_int != 1) { - round_off_int = (round_off_int / 0x02); - bit_count++; - } - - /* Check for +ve and -ve bit position of 3.9 mg */ - if (ug_per_bit > 3900) - bit_pos_3_9mg = (int8_t)(bit_count * (-1)); - else - bit_pos_3_9mg = (int8_t)bit_count; - - return bit_pos_3_9mg; -} -/*! - * @brief This internal API brings up the secondary interface to access - * auxiliary sensor * - */ -static uint16_t bma4_set_aux_interface_config(struct bma4_dev *dev) -{ - /* Variable to return error codes */ - uint16_t rslt = BMA4_OK; - - /* Check for null pointer error */ - rslt |= bma4_null_pointer_check(dev); - - if (rslt == BMA4_OK) { - /* Enable the auxiliary sensor */ - rslt |= bma4_set_mag_enable(0x01, dev); - dev->delay(BMA4_AUX_COM_DELAY); - - /* Disable advance power save */ - rslt |= bma4_set_advance_power_save(0x00, dev); - dev->delay(BMA4_AUX_COM_DELAY); - - /* Set the I2C device address of auxiliary device */ - rslt |= bma4_set_i2c_device_addr(dev); - dev->delay(BMA4_AUX_COM_DELAY); - - /* Set auxiliary interface to manual mode */ - rslt |= bma4_set_mag_manual_enable(dev->aux_config.manual_enable, dev); - dev->delay(BMA4_AUX_COM_DELAY); - - /* Set the number of bytes for burst read */ - rslt |= bma4_set_mag_burst(dev->aux_config.burst_read_length, dev); - dev->delay(BMA4_AUX_COM_DELAY); - - /* Switch on the the auxiliary interface mode */ - rslt |= bma4_set_if_mode(dev->aux_config.if_mode, dev); - dev->delay(BMA4_AUX_COM_DELAY); - - } - - return rslt; -} - -/*! -* @brief This internal API reads the data from the auxiliary sensor -* depending on burst length configured -*/ -static uint16_t bma4_extract_aux_data(uint8_t aux_reg_addr, uint8_t *aux_data, uint16_t len, struct bma4_dev *dev) -{ - /* Variable to return error codes */ - uint16_t rslt = BMA4_OK; - /* Pointer variable to read data from the register */ - uint8_t data[15] = {0}; - /* Variable to define length counts */ - uint8_t len_count = 0; - /* Variable to define burst read length */ - uint8_t burst_len = 0; - /* Variable to define read length */ - uint8_t read_length = 0; - /* Variable to define the number of burst reads */ - uint8_t burst_count; - /* Variable to define address of the data register*/ - uint8_t aux_read_addr = BMA4_DATA_0_ADDR; - - /* Extract burst read length in a variable */ - rslt |= bma4_map_read_len(&burst_len, dev); - - for (burst_count = 0; burst_count < len; burst_count += burst_len) { - /* Set the address whose data is to be read */ - rslt |= bma4_set_mag_read_addr(aux_reg_addr, dev); - dev->delay(BMA4_AUX_COM_DELAY); - - if (rslt == BMA4_OK) { - /* If user defined length is valid */ - if (len > 0) { - /* Read the data from the data register */ - rslt |= bma4_read_regs(aux_read_addr, data, (uint8_t)burst_len, dev); - dev->delay(BMA4_AUX_COM_DELAY); - - if (rslt == BMA4_OK) { - /* If defined user length or remaining length after a burst - read is less than burst length */ - if ((len - burst_count) < burst_len) { - /* Read length is equal to burst_length or - remaining length*/ - read_length = (uint8_t)(len - burst_count); - } else { - /* Read length is equal to burst_length */ - read_length = burst_len; - } - - /* Copy the read data in terms of given read length */ - for (len_count = 0; len_count < read_length; len_count++) - aux_data[burst_count + len_count] = data[len_count]; - - /* Increment the register address by burst read length */ - aux_reg_addr += burst_len; - } else { - rslt = BMA4_E_RD_WR_LENGTH_INVALID; - } - } else { - rslt = BMA4_E_FAIL; - } - } else { - rslt = BMA4_E_FAIL; - } - } - - return rslt; -} - -/*! - * @brief This internal API maps the actual burst read length with user - length set. - */ -static uint16_t bma4_map_read_len(uint8_t *len, const struct bma4_dev *dev) -{ - /* Variable to return error codes */ - uint16_t rslt = BMA4_OK; - - switch (dev->aux_config.burst_read_length) { - - case BMA4_AUX_READ_LEN_0: - *len = 1; - break; - case BMA4_AUX_READ_LEN_1: - *len = 2; - break; - case BMA4_AUX_READ_LEN_2: - *len = 6; - break; - case BMA4_AUX_READ_LEN_3: - *len = 8; - break; - default: - rslt = BMA4_E_OUT_OF_RANGE; - break; - } - - return rslt; -} - -/*! -* @brief This internal API checks null pointer error -*/ -static uint16_t bma4_null_pointer_check(const struct bma4_dev *dev) -{ - uint16_t rslt = BMA4_OK; - - if ((dev == NULL) || (dev->bus_read == NULL) || (dev->bus_write == NULL)) - rslt |= BMA4_E_NULL_PTR; - else - rslt = BMA4_OK; - - return rslt; -} +/* +**************************************************************************** +* Copyright (C) 2015 - 2016 Bosch Sensortec GmbH +* +* File :bma4.c +* +* Date: 12 Oct 2017 +* +* Revision: 2.1.9 $ +* +* Usage: Sensor Driver for BMA4 family of sensors +* +**************************************************************************** +* Disclaimer +* +* Common: +* Bosch Sensortec products are developed for the consumer goods industry. +* They may only be used within the parameters of the respective valid +* product data sheet. Bosch Sensortec products are provided with the +* express understanding that there is no warranty of fitness for a +* particular purpose.They are not fit for use in life-sustaining, +* safety or security sensitive systems or any system or device +* that may lead to bodily harm or property damage if the system +* or device malfunctions. In addition,Bosch Sensortec products are +* not fit for use in products which interact with motor vehicle systems. +* The resale and or use of products are at the purchasers own risk and +* his own responsibility. The examination of fitness for the intended use +* is the sole responsibility of the Purchaser. +* +* The purchaser shall indemnify Bosch Sensortec from all third party +* claims, including any claims for incidental, or consequential damages, +* arising from any product use not covered by the parameters of +* the respective valid product data sheet or not approved by +* Bosch Sensortec and reimburse Bosch Sensortec for all costs in +* connection with such claims. +* +* The purchaser must monitor the market for the purchased products, +* particularly with regard to product safety and inform Bosch Sensortec +* without delay of all security relevant incidents. +* +* Engineering Samples are marked with an asterisk (*) or (e). +* Samples may vary from the valid technical specifications of the product +* series. They are therefore not intended or fit for resale to third +* parties or for use in end products. Their sole purpose is internal +* client testing. The testing of an engineering sample may in no way +* replace the testing of a product series. Bosch Sensortec assumes +* no liability for the use of engineering samples. +* By accepting the engineering samples, the Purchaser agrees to indemnify +* Bosch Sensortec from all claims arising from the use of engineering +* samples. +* +* Special: +* This software module (hereinafter called "Software") and any information +* on application-sheets (hereinafter called "Information") is provided +* free of charge for the sole purpose to support your application work. +* The Software and Information is subject to the following +* terms and conditions: +* +* The Software is specifically designed for the exclusive use for +* Bosch Sensortec products by personnel who have special experience +* and training. Do not use this Software if you do not have the +* proper experience or training. +* +* This Software package is provided `` as is `` and without any expressed +* or implied warranties,including without limitation, the implied warranties +* of merchantability and fitness for a particular purpose. +* +* Bosch Sensortec and their representatives and agents deny any liability +* for the functional impairment +* of this Software in terms of fitness, performance and safety. +* Bosch Sensortec and their representatives and agents shall not be liable +* for any direct or indirect damages or injury, except as +* otherwise stipulated in mandatory applicable law. +* +* The Information provided is believed to be accurate and reliable. +* Bosch Sensortec assumes no responsibility for the consequences of use +* of such Information nor for any infringement of patents or +* other rights of third parties which may result from its use. +* No license is granted by implication or otherwise under any patent or +* patent rights of Bosch. Specifications mentioned in the Information are +* subject to change without notice. +**************************************************************************/ +/*! \file bma4.c + \brief Sensor Driver for BMA4 family of sensors */ +/***************************************************************************/ +/**\name Header files +****************************************************************************/ +#include "bma4.h" + +/***************************************************************************/ +/**\name Static Data Buffer +****************************************************************************/ +/* Local array to store the values read from the register + * using read_regs API */ +static uint8_t temp_buff[BMA4_MAX_BUFFER_SIZE] = {0}; + +/***************************************************************************/ +/**\name Local structures +****************************************************************************/ +/*! + * @brief Accel difference value of axis. + */ +struct data_with_sign { + /*! Difference value */ + int16_t val; + /*! Indicates negative value if set */ + uint8_t is_negative; +}; + +/*! + * @brief Accel data deviation from ideal value + */ +struct offset_delta { + /*! Accel x axis */ + struct data_with_sign x; + /*! Accel y axis */ + struct data_with_sign y; + /*! Accel z axis */ + struct data_with_sign z; +}; + +/*! + * @brief Accel offset xyz structure + */ +struct accel_offset { + /*! Accel offset X data */ + uint8_t x; + /*! Accel offset Y data */ + uint8_t y; + /*! Accel offset Z data */ + uint8_t z; +}; + +/*! + * @brief Accel self test diff xyz data structure + */ +struct selftest_delta_limit { + /*! Accel X data */ + int32_t x; + /*! Accel Y data */ + int32_t y; + /*! Accel Z data */ + int32_t z; +}; + +/*! + * @brief Structure to store temp data values + */ +struct accel_temp { + /*! Accel X temp data */ + int32_t x; + /*! Accel Y temp data */ + int32_t y; + /*! Accel Z temp data */ + int32_t z; +}; + +/***************************************************************************/ +/*! Static Function Declarations +****************************************************************************/ + +/*! + * @brief This API validates the bandwidth and perfmode + * value set by the user. + * + * param bandwidth[in] : bandwidth value set by the user. + * param perf_mode[in] : perf_mode value set by the user. + */ +static uint16_t validate_bandwidth_perfmode(uint8_t bandwidth, uint8_t perf_mode); + +/*! + * @brief @brief This API validates the ODR value set by the user. + * + * param bandwidth[in] : odr for accelerometer + */ +static uint16_t validate_odr(uint8_t odr); + +/*! + * @brief This API is used to reset the FIFO related configurations + * in the fifo_frame structure. + * + * @param dev[in,out] : Structure instance of bma4_dev + * + */ +static void reset_fifo_data_structure(const struct bma4_dev *dev); + +/*! + * @brief This API computes the number of bytes of accel FIFO data + * which is to be parsed in header-less mode + * + * @param[out] start_idx : The start index for parsing data + * @param[out] len : Number of bytes to be parsed + * @param[in] acc_count : Number of accelerometer frames to be read + * @param[in] dev : Structure instance of bma4_dev. + * + */ +static void get_accel_len_to_parse(uint16_t *start_idx, uint16_t *len, const uint16_t *acc_count, + const struct bma4_dev *dev); + +/*! + * @brief This API checks the fifo read data as empty frame, if it + * is empty frame then moves the index to last byte. + * + * @param[in,out] data_index : The index of the current data to + * be parsed from fifo data + * @param[in] dev : Structure instance of bma4_dev. + */ +static void check_empty_fifo(uint16_t *data_index, const struct bma4_dev *dev); + +/*! + * @brief This API is used to parse the accelerometer data from the + * FIFO data in header mode. + * + * @param[in,out] accel_data : Structure instance of bma4_accel where + * the accelerometer data in FIFO is stored. + * @param[in,out] accel_length : Number of accelerometer frames + * (x,y,z axes data) + * @param[in,out] dev : Structure instance of bma4_dev. + * + */ +static void extract_accel_header_mode(struct bma4_accel *accel_data, uint16_t *accel_length, + const struct bma4_dev *dev); + +/*! + * @brief This API is used to parse the accelerometer data from the + * FIFO data in both header mode and header-less mode. + * It update the idx value which is used to store the index of + * the current data byte which is parsed. + * + * @param[in,out] acc : Structure instance of bma4_accel. + * @param[in,out] idx : Index value of number of bytes parsed + * @param[in,out] acc_idx : Index value of accelerometer data + * (x,y,z axes) frame to be parsed + * @param[in] frm : It consists of either fifo_data_enable + * parameter (Accel and/or mag data enabled in FIFO) + * in header-less mode or frame header data + * in header mode + * @param[in] dev : Structure instance of bma4_dev. + * + */ +static void unpack_acc_frm(struct bma4_accel *acc, uint16_t *idx, uint16_t *acc_idx, uint8_t frm, + const struct bma4_dev *dev); + +/*! + * @brief This API is used to parse the accelerometer data from the + * FIFO data and store it in the instance of the structure bma4_accel. + * + * @param[out] accel_data : Structure instance of bma4_accel where + * the parsed accel data bytes are stored. + * @param[in] data_start_index : Index value of the accel data bytes + * which is to be parsed from the fifo data. + * @param[in] dev : Structure instance of bma4_dev. + * + */ +static void unpack_accel_data(struct bma4_accel *accel_data, uint16_t data_start_index, const struct bma4_dev *dev); +/*! + * @brief This API computes the number of bytes of Mag FIFO data which is + * to be parsed in header-less mode + * + * @param[out] start_idx : The start index for parsing data + * @param[out] len : Number of bytes to be parsed + * @param[in] mag_count : Number of magnetometer frames to be read + * @param[in] dev : Structure instance of bma4_dev. + * + */ +static void get_mag_len_to_parse(uint16_t *start_idx, uint16_t *len, const uint16_t *mag_count, + const struct bma4_dev *dev); +/*! + * @brief This API is used to parse the magnetometer data from the + * FIFO data in header mode. + * + * @param[in,out] data : Structure instance of bma4_mag_xyzr where + * the magnetometer data in FIFO is extracted + * and stored. + * @param[in,out] len : Number of magnetometer frames + * (x,y,z,r data) + * @param[in,out] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static uint16_t extract_mag_header_mode(struct bma4_mag *data, uint16_t *len, const struct bma4_dev *dev); + +/*! + * @brief This API is used to parse the magnetometer data from the + * FIFO data in both header mode and header-less mode and update the + * idx value which is used to store the index of the current + * data byte which is parsed. + * + * @param data : Structure instance of bma4_mag_xyzr. + * @param idx : Index value of number of bytes parsed + * @param mag_idx : Index value magnetometer data frame (x,y,z,r) + * to be parsed + * @param frm : It consists of either the fifo_data_enable parameter + * (Accel and/or mag data enabled in FIFO) in + * header-less mode and frame header data in header mode + * @param dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static uint16_t unpack_mag_frm(struct bma4_mag *data, uint16_t *idx, uint16_t *mag_idx, uint8_t frm, + const struct bma4_dev *dev); + +/*! + * @brief This API is used to parse the auxiliary magnetometer data from + * the FIFO data and store it in the instance of the structure mag_data. + * + * @param mag_data : Structure instance of bma4_mag_xyzr where the + * parsed magnetometer data bytes are stored. + * @param start_idx : Index value of the magnetometer data bytes + * which is to be parsed from the FIFO data + * @param dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static uint16_t unpack_mag_data(struct bma4_mag *mag_data, uint16_t start_idx, const struct bma4_dev *dev); + +/*! + * @brief This API is used to parse and store the sensor time from the + * FIFO data in the structure instance dev. + * + * @param[in,out] data_index : Index of the FIFO data which + * has the sensor time. + * @param[in,out] dev : Structure instance of bma4_dev. + * + */ +static void unpack_sensortime_frame(uint16_t *data_index, const struct bma4_dev *dev); + +/*! + * @brief This API is used to parse and store the skipped_frame_count from + * the FIFO data in the structure instance dev. + * + * @param[in,out] data_index : Index of the FIFO data which + * has the skipped frame count. + * @param[in,out] dev : Structure instance of bma4_dev. + * + */ +static void unpack_skipped_frame(uint16_t *data_index, const struct bma4_dev *dev); + +/*! + * @brief This API is used to parse and store the dropped_frame_count from + * the FIFO data in the structure instance dev. + * + * @param[in,out] data_index : Index of the FIFO data which + * has the dropped frame data. + * @param[in,out] dev : Structure instance of bma4_dev. + * + */ +static void unpack_dropped_frame(uint16_t *data_index, const struct bma4_dev *dev); + +/*! + * @brief This API is used to move the data index ahead of the + * current_frame_length parameter when unnecessary FIFO data appears while + * extracting the user specified data. + * + * @param[in,out] data_index : Index of the FIFO data which + * is to be moved ahead of the + * current_frame_length + * @param[in] current_frame_length : Number of bytes in a particular frame + * @param[in] dev : Structure instance of bma4_dev. + * + */ +static void move_next_frame(uint16_t *data_index, uint8_t current_frame_length, const struct bma4_dev *dev); + +/*! +* @brief This API writes the config stream data in memory using burst mode +* +* @param[in] stream_data : Pointer to store data of 32 bytes +* @param[in] index : Represents value in multiple of 32 bytes +* @param[in] dev : Structure instance of bma4_dev. +* +* @return Result of API execution status +* @retval 0 -> Success +* @retval Any non zero value -> Fail +*/ +static uint16_t stream_transfer_write(const uint8_t *stream_data, uint16_t index, struct bma4_dev *dev); + +/*! + * @brief This API enables or disables the Accel Self test feature in the + * sensor. + * + * @param[in] accel_selftest_enable : Variable used to enable or disable + * the Accel self test feature + * Value | Description + * --------|--------------- + * 0x00 | BMA4_DISABLE + * 0x01 | BMA4_ENABLE + * + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static uint16_t set_accel_selftest_enable(uint8_t accel_selftest_axis, struct bma4_dev *dev); + +/*! + * @brief This API selects the sign of Accel self-test excitation + * + * @param[in] accel_selftest_sign: Variable used to select the Accel + * self test sign + * Value | Description + * --------|-------------------------- + * 0x00 | BMA4_DISABLE (negative) + * 0x01 | BMA4_ENABLE (positive) + * + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static uint16_t set_accel_selftest_sign(uint8_t accel_selftest_sign, struct bma4_dev *dev); + +/*! + * @brief This API sets the Accel self test amplitude in the sensor. + * + * @param[in] accel_selftest_amp : Variable used to specify the Accel self + * test amplitude + * Value | Description + * --------|------------------------------------ + * 0x00 | BMA4_SELFTEST_AMP_LOW + * 0x01 | BMA4_SELFTEST_AMP_HIGH + * + * @param[in] dev : structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static uint16_t set_accel_selftest_amp(uint8_t accel_selftest_amp, struct bma4_dev *dev); + +/*! + * @brief This function enables and configures the Accel which is needed + * for Self test operation. + * + * @param[in] dev : Structure instance of bma4_dev + * + * @return results of self test + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static uint16_t set_accel_selftest_config(struct bma4_dev *dev); + +/*! + * @brief This API validates the Accel g value provided as input by the + * user for Accel offset compensation. + * + * @param[in] gvalue : Pointer variable used to specify the g value + * set by the user for Accel offset compensation. + * + * @note The g-values to be passed to the parameter should be + * multiples of 1000000. + * + * @return results of the status of user input validation + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static uint16_t validate_user_input(const int32_t *gvalue); +/*! + * @brief This API converts the range value into corresponding integer + * value. + * + * @param[in] range_in : input range value. + * @param[out] range_out : pointer to store the integer value of range. + * + * @return results of the status of user input validation + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static void map_range(uint8_t range_in, uint8_t *range_out); + +/*! + * @brief This API normalise the data with offset. + * + * @param[out] compensated_data : pointer to store the compensated data. + * @param[in] offset_data : pointer of offset. + * + * @return results of the status of user input validation + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static void normalise_offset(const struct offset_delta *compensated_data, struct accel_offset *offset_data); + +/*! + * @brief This API normalise the data with offset. + * + * @param[in] res : resolution of the sensor. + * @param[in] range : G-range of the accel. + * @param[in] delta : pointer of offset_delta. + * @param[out] data : pointer to store accel_offset data. + * + * @return results of the status of user input validation + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static void scale_offset(uint8_t res, uint8_t range, const struct offset_delta *delta, struct accel_offset *data); + +/*! + * @brief This API compensate the accel data against gravity. + * + * @param[in] lsb_per_g : lsb value pre 1g. + * @param[in] g_val : G reference value of all axis. + * @param[in] data : pointer of accel_offset data. + * @param[out] comp_data : pointer to store compensated data. + * + * @note The g-values to be passed to the parameter should be + * multiples of 1000000. + * + * @return results of the status of user input validation + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static void comp_for_grvty(uint16_t lsb_per_g, const int32_t g_val[3], const struct bma4_accel *data, + struct offset_delta *comp_data); +/*! + * @brief This function validates the Accel Self test data and decides the + * result of Self test operation. + * + * @param[in] accel_data_diff : Pointer to structure variable which holds + * the Accel data difference of Self test operation + * @param[in] dev : Structure instance of bma4_dev + * + * @return results of self test operation + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static uint16_t validate_selftest(const struct selftest_delta_limit *accel_data_diff, + const struct bma4_dev *dev); + +/*! + * @brief This function configure the Accel for FOC. + * + * @param[in] acc_conf : accel config structure instance + * @param[in] acc_en : enables the accel + * @param[in] pwr_mode : set the power mode + * @param[in] dev : Structure instance of bma4_dev + * + * @return results of self test operation + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +static uint16_t foc_config(struct bma4_accel_config *acc_conf, uint8_t *acc_en, uint8_t *pwr_mode, + struct bma4_dev *dev); + +/*! + * @brief This API converts lsb value of axes to mg for self-test + * + * @param[in] accel_data_diff : Pointer variable used to pass accel difference + * values in g + * @param[out] accel_data_diff_mg : Pointer variable used to store accel + * difference values in mg + * @param[out] dev : Structure instance of bma4_dev + * + * @return None * + */ +static void convert_lsb_g(const struct selftest_delta_limit *accel_data_diff, + struct selftest_delta_limit *accel_data_diff_mg, + const struct bma4_dev *dev); + +/*! + * @brief This API sets the feature config. data start address in the sensor. + * + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +static uint16_t set_feature_config_start_addr(struct bma4_dev *dev); + +/*! + * @brief This API increments the feature config. data address according to the user + * provided read/write length in the dev structure. + * + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +static uint16_t increment_feature_config_addr(const struct bma4_dev *dev); + +/*! + * @brief This API reads the 8-bit data from the given register + * in the sensor. + */ +static uint16_t read_regs(uint8_t addr, uint8_t *data, uint8_t len, const struct bma4_dev *dev); + +/*! + * @brief This API writes the 8-bit data to the given register + * in the sensor. + */ +static uint16_t write_regs(uint8_t addr, uint8_t *data, uint8_t len, const struct bma4_dev *dev); + +/*! + * @brief This API sets the feature config. data start address in the sensor. + */ +static uint16_t get_feature_config_start_addr(struct bma4_dev *dev); + +/*! + * @brief This API is used to calculate the power of given + * base value. + * + * @param[in] base : value of base + * @param[in] resolution : resolution of the sensor + * + * @return : return the value of base^resolution + */ + +static int32_t power(int16_t base, uint8_t resolution); + +/*! + * @brief This API performs roundoff on given value + * + * @param[in] value : Value which is need to be rounded off + * + * @return : None + */ +static int8_t roundoff(int32_t value); + +/*! + * @brief This API finds the bit position of 3.9mg according to given range + * and resolution. + * + * @param[in] range : range of the accel. + * @param[in] res : resolution of the accel. + * + * @return : bit position of 3.9mg + */ +static int8_t get_bit_pos_3_9mg(uint8_t range, uint8_t res); + +/*! + * @brief This API finds the the null error of the device pointer structure + * + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Null error + */ +static uint16_t bma4_null_pointer_check(const struct bma4_dev *dev); + +/*! + * @brief This internal API brings up the secondary interface to access + * auxiliary sensor + * + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * + * @retval 0 if success, else fail + */ +static uint16_t bma4_set_aux_interface_config(struct bma4_dev *dev); + +/*! + * @brief This internal API reads the data from the auxiliary sensor + * depending on burst length configured + * + * @param[in] dev : Structure instance of bma4_dev. + * @param[out] aux_data : Pointer variable to store data read + * @param[in] aux_reg_addr : Variable to pass address from where + * data is to be read + * + * @return Result of API execution status + * + * @retval 0 if success, else fail + */ +static uint16_t bma4_extract_aux_data(uint8_t aux_reg_addr, uint8_t *aux_data, uint16_t len, struct bma4_dev *dev); + +/*! + * @brief This internal API maps the actual burst read length with user length set. + * + * @param[in] dev : Structure instance of bma4_dev. + * @param[out] len : Pointer variable to store mapped length + * + * @return Result of API execution status + * + * @retval 0 if success, else fail + */ +static uint16_t bma4_map_read_len(uint8_t *len, const struct bma4_dev *dev); + +/***************************************************************************/ +/**\name Extern Declarations +****************************************************************************/ + +/***************************************************************************/ +/**\name Globals +****************************************************************************/ + + +/***************************************************************************/ +/**\name Function definitions +****************************************************************************/ +/*! + * @brief This API is the entry point. + * Call this API before using all other APIs. + * This API reads the chip-id of the sensor which is the first step to + * verify the sensor and also it configures the read mechanism of SPI and + * I2C interface. + */ +uint16_t bma4_init(struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + /* Check the bma4 structure as NULL */ + if ((dev == NULL) || (dev->bus_read == NULL) || (dev->bus_write == NULL)) { + rslt |= BMA4_E_NULL_PTR; + } else { + if (dev->interface == BMA4_SPI_INTERFACE) + dev->dummy_byte = 1; + else + dev->dummy_byte = 0; + + rslt |= bma4_read_regs(BMA4_CHIP_ID_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + /* Assign Chip Id */ + dev->chip_id = data; + } + } + + return rslt; +} + +/*! + * @brief This API is used to write the binary configuration in the sensor + */ +uint16_t bma4_write_config_file(struct bma4_dev *dev) +{ + uint16_t rslt; + /* Config loading disable*/ + uint8_t config_load = 0; + uint16_t index = 0; + uint8_t config_stream_status = 0; + + /* Disable advanced power save */ + rslt = bma4_set_advance_power_save(BMA4_DISABLE, dev); + /* Wait for sensor time synchronization. Refer the data-sheet for + more information*/ + dev->delay(1); + + if (rslt == BMA4_OK) { + /* Disable config loading*/ + rslt |= bma4_write_regs(BMA4_INIT_CTRL_ADDR, &config_load, 1, dev); + /* Write the config stream */ + for (index = 0; index < BMA4_CONFIG_STREAM_SIZE; index += dev->read_write_len) + rslt |= stream_transfer_write((dev->config_file_ptr + index), index, dev); + + /* Enable config loading and FIFO mode */ + config_load = 0x01; + rslt |= bma4_write_regs(BMA4_INIT_CTRL_ADDR, &config_load, 1, dev); + /* Wait till ASIC is initialized. Refer the data-sheet for + more information*/ + dev->delay(150); + /* Read the status of config stream operation */ + rslt |= bma4_read_regs(BMA4_INTERNAL_STAT, &config_stream_status, 1, dev); + + if (config_stream_status != BMA4_ASIC_INITIALIZED) { + rslt |= BMA4_E_CONFIG_STREAM_ERROR; + } else { + /* Enable advanced power save */ + rslt |= bma4_set_advance_power_save(BMA4_ENABLE, dev); + rslt |= get_feature_config_start_addr(dev); + } + } + return rslt; +} + +/*! + * @brief This API checks whether the write operation requested is for feature + * config or register write and accordingly writes the data in the sensor. + */ +uint16_t bma4_write_regs(uint8_t addr, uint8_t *data, uint8_t len, struct bma4_dev *dev) +{ + uint8_t i; + uint8_t loop_count; + uint8_t overflow; + uint8_t index; + uint16_t rslt = BMA4_OK; + uint8_t adv_pwr_save = 0; + + /* Check the dev structure as NULL*/ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + if (addr == BMA4_FEATURE_CONFIG_ADDR) { + /* Disable APS if enabled before writing the feature config register */ + rslt = bma4_get_advance_power_save(&adv_pwr_save, dev); + if (adv_pwr_save == BMA4_ENABLE) { + rslt |= bma4_set_advance_power_save(BMA4_DISABLE, dev); + /* Wait for sensor time synchronization. Refer the data-sheet for + more information*/ + dev->delay(1); + } + + if (((len % 2) == 0) && (len <= dev->feature_len) && (rslt == BMA4_OK)) { + if (dev->read_write_len < len) { + /* Calculate the no of writes to be performed according + to the read/write length */ + loop_count = len / dev->read_write_len; + overflow = len % dev->read_write_len; + index = 0; + rslt = set_feature_config_start_addr(dev); + for (i = 0; i < loop_count; i++) { + rslt |= write_regs(BMA4_FEATURE_CONFIG_ADDR, data + index, + dev->read_write_len, dev); + rslt |= increment_feature_config_addr(dev); + index = index + dev->read_write_len; + } + if (overflow) + rslt |= write_regs(BMA4_FEATURE_CONFIG_ADDR, data + index, + overflow, dev); + rslt |= set_feature_config_start_addr(dev); + } else { + rslt = write_regs(BMA4_FEATURE_CONFIG_ADDR, data, len, dev); + } + } else { + rslt = BMA4_E_RD_WR_LENGTH_INVALID; + } + + if (rslt == BMA4_OK) { + /* Enable APS once write feature config register is done */ + rslt = bma4_get_advance_power_save(&adv_pwr_save, dev); + if (adv_pwr_save == BMA4_DISABLE) { + rslt |= bma4_set_advance_power_save(BMA4_ENABLE, dev); + /* Wait for sensor time synchronization. Refer the data-sheet for + more information*/ + dev->delay(1); + } + } + + } else { + rslt = write_regs(addr, data, len, dev); + } + } + + return rslt; +} + +/*! + * @brief This API writes the 8-bit data to the given register + * in the sensor. + */ +static uint16_t write_regs(uint8_t addr, uint8_t *data, uint8_t len, const struct bma4_dev *dev) +{ + uint16_t rslt = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + if (dev->interface == BMA4_SPI_INTERFACE) + addr = addr & BMA4_SPI_WR_MASK; + /* write data in the register*/ + rslt |= dev->bus_write(dev->dev_addr, addr, data, len); + } + return rslt; +} + +/*! + * @brief This API sets the feature config. data start address in the sensor. + */ +static uint16_t get_feature_config_start_addr(struct bma4_dev *dev) +{ + uint16_t rslt; + uint8_t asic_lsb; + uint8_t asic_msb; + + rslt = read_regs(BMA4_RESERVED_REG_5B_ADDR, &asic_lsb, 1, dev); + rslt |= read_regs(BMA4_RESERVED_REG_5C_ADDR, &asic_msb, 1, dev); + + /* Store asic info in dev structure */ + dev->asic_data.asic_lsb = asic_lsb & 0x0F; + dev->asic_data.asic_msb = asic_msb; + + return rslt; +} + +/*! + * @brief This API sets the feature config. data start address in the sensor. + */ +static uint16_t set_feature_config_start_addr(struct bma4_dev *dev) +{ + uint16_t rslt; + + rslt = write_regs(BMA4_RESERVED_REG_5B_ADDR, &dev->asic_data.asic_lsb, 1, dev); + rslt |= write_regs(BMA4_RESERVED_REG_5C_ADDR, &dev->asic_data.asic_msb, 1, dev); + + return rslt; +} + +/*! + * @brief This API increments the feature config. data address according to the user + * provided read/write length in the dev structure. + */ +static uint16_t increment_feature_config_addr(const struct bma4_dev *dev) +{ + uint16_t rslt; + uint16_t asic_addr; + uint8_t asic_lsb; + uint8_t asic_msb; + + /* Read the asic address from the sensor */ + rslt = read_regs(BMA4_RESERVED_REG_5B_ADDR, &asic_lsb, 1, dev); + rslt |= read_regs(BMA4_RESERVED_REG_5C_ADDR, &asic_msb, 1, dev); + /* Get the asic address */ + asic_addr = (asic_msb << 4) | (asic_lsb & 0x0F); + /* Sum the asic address with read/write length after converting from + byte to word */ + asic_addr = asic_addr + (dev->read_write_len / 2); + /* Split the asic address */ + asic_lsb = asic_addr & 0x0F; + asic_msb = (uint8_t)(asic_addr >> 4); + /* Write the asic address in the sensor */ + rslt |= write_regs(BMA4_RESERVED_REG_5B_ADDR, &asic_lsb, 1, dev); + rslt |= write_regs(BMA4_RESERVED_REG_5C_ADDR, &asic_msb, 1, dev); + + return rslt; +} + +/*! + * @brief This API checks whether the read operation requested is for feature + * or register read and accordingly reads the data from the sensor. + */ +uint16_t bma4_read_regs(uint8_t addr, uint8_t *data, uint8_t len, struct bma4_dev *dev) +{ + uint8_t i; + uint8_t loop_count; + uint8_t overflow; + uint8_t index; + uint16_t rslt = BMA4_OK; + uint8_t adv_pwr_save = 0; + + /* Check the dev structure as NULL*/ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + if (addr == BMA4_FEATURE_CONFIG_ADDR) { + /* Disable APS if enabled before reading the feature config register */ + rslt = bma4_get_advance_power_save(&adv_pwr_save, dev); + if (adv_pwr_save == BMA4_ENABLE) { + rslt |= bma4_set_advance_power_save(BMA4_DISABLE, dev); + /* Wait for sensor time synchronization. Refer the data-sheet for + more information*/ + dev->delay(1); + } + + if (((len % 2) == 0) && (len <= dev->feature_len) && (rslt == BMA4_OK)) { + if (dev->read_write_len < len) { + /* Calculate the no of writes to be performed according + to the read/write length */ + loop_count = len / dev->read_write_len; + overflow = len % dev->read_write_len; + index = 0; + rslt = set_feature_config_start_addr(dev); + for (i = 0; i < loop_count; i++) { + rslt |= read_regs(BMA4_FEATURE_CONFIG_ADDR, data + index, + dev->read_write_len, dev); + rslt |= increment_feature_config_addr(dev); + index = index + dev->read_write_len; + } + if (overflow) + rslt |= read_regs(BMA4_FEATURE_CONFIG_ADDR, data + index, + overflow, dev); + rslt |= set_feature_config_start_addr(dev); + } else { + rslt = read_regs(BMA4_FEATURE_CONFIG_ADDR, data, len, dev); + } + } else { + rslt = BMA4_E_RD_WR_LENGTH_INVALID; + } + if (rslt == BMA4_OK) { + /* Enable APS once read feature config register is done */ + rslt = bma4_get_advance_power_save(&adv_pwr_save, dev); + if (adv_pwr_save == BMA4_DISABLE) { + rslt |= bma4_set_advance_power_save(BMA4_ENABLE, dev); + /* Wait for sensor time synchronization. Refer the data-sheet for + more information*/ + dev->delay(1); + } + } + } else { + rslt = read_regs(addr, data, len, dev); + } + } + + return rslt; +} + +/*! + * @brief This API reads the 8-bit data from the given register + * in the sensor. + */ +static uint16_t read_regs(uint8_t addr, uint8_t *data, uint8_t len, const struct bma4_dev *dev) +{ + /* variable used to return the status of communication result*/ + uint16_t rslt = 0; + uint16_t temp_len = len + dev->dummy_byte; + uint16_t i; + + if (dev->interface == BMA4_SPI_INTERFACE) { + /* SPI mask added */ + addr = addr | BMA4_SPI_RD_MASK; + } + + if (temp_len > BMA4_MAX_BUFFER_SIZE) { + /* Buffer size is not sufficient */ + rslt |= BMA4_E_OUT_OF_RANGE; + } + + if (rslt == BMA4_OK) { + /* Read the data from the register */ + rslt |= dev->bus_read(dev->dev_addr, addr, temp_buff, temp_len); + + for (i = 0; i < len; i++) { + /* Parsing and storing the valid data */ + data[i] = temp_buff[i + dev->dummy_byte]; + } + } + + return rslt; +} + +/*! + * @brief This API reads the error status from the sensor. + */ +uint16_t bma4_get_error_status(struct bma4_err_reg *err_reg, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Read the error codes*/ + rslt |= bma4_read_regs(BMA4_ERROR_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + /* Fatal error*/ + err_reg->fatal_err = BMA4_GET_BITS_POS_0(data, BMA4_FATAL_ERR); + /* Cmd error*/ + err_reg->cmd_err = BMA4_GET_BITSLICE(data, BMA4_CMD_ERR); + /* User error*/ + err_reg->err_code = BMA4_GET_BITSLICE(data, BMA4_ERR_CODE); + /* FIFO error*/ + err_reg->fifo_err = BMA4_GET_BITSLICE(data, BMA4_FIFO_ERR); + /* Mag data ready error*/ + err_reg->aux_err = BMA4_GET_BITSLICE(data, BMA4_AUX_ERR); + } + } + + return rslt; +} + +/*! + * @brief This API reads the sensor status from the sensor. + */ +uint16_t bma4_get_status(uint8_t *status, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Read the error codes*/ + rslt |= bma4_read_regs(BMA4_STATUS_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *status = data; + } + + return rslt; +} + +/*! + * @brief This API reads the Accel data for x,y and z axis from the sensor. + * The data units is in LSB format. + */ +uint16_t bma4_read_accel_xyz(struct bma4_accel *accel, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint16_t lsb = 0; + uint16_t msb = 0; + uint8_t data[BMA4_ACCEL_DATA_LENGTH] = {0}; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_DATA_8_ADDR, data, BMA4_ACCEL_DATA_LENGTH, dev); + + if (rslt == BMA4_OK) { + msb = data[1]; + lsb = data[0]; + /* Accel data x axis */ + accel->x = (int16_t)((msb << 8) | lsb); + + msb = data[3]; + lsb = data[2]; + /* Accel data y axis */ + accel->y = (int16_t)((msb << 8) | lsb); + + msb = data[5]; + lsb = data[4]; + /* Accel data z axis */ + accel->z = (int16_t)((msb << 8) | lsb); + + if (dev->resolution == BMA4_12_BIT_RESOLUTION) { + accel->x = (accel->x / 0x10); + accel->y = (accel->y / 0x10); + accel->z = (accel->z / 0x10); + } else if (dev->resolution == BMA4_14_BIT_RESOLUTION) { + accel->x = (accel->x / 0x04); + accel->y = (accel->y / 0x04); + accel->z = (accel->z / 0x04); + } + } + } + + return rslt; +} + +/*! + * @brief This API reads the sensor time of Sensor time gets updated + * with every update of data register or FIFO. + */ +uint16_t bma4_get_sensor_time(uint32_t *sensor_time, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data[BMA4_SENSOR_TIME_LENGTH] = {0}; + uint8_t msb = 0; + uint8_t xlsb = 0; + uint8_t lsb = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_SENSORTIME_0_ADDR, data, BMA4_SENSOR_TIME_LENGTH, dev); + + if (rslt == BMA4_OK) { + msb = data[BMA4_SENSOR_TIME_MSB_BYTE]; + xlsb = data[BMA4_SENSOR_TIME_XLSB_BYTE]; + lsb = data[BMA4_SENSOR_TIME_LSB_BYTE]; + *sensor_time = (uint32_t)((msb << 16) | (xlsb << 8) | lsb); + } + } + + return rslt; +} + +/*! + * @brief This API reads the chip temperature of sensor. + * + * @note Using a scaling factor of 1000, to obtain integer values, which + * at the user end, are used to get accurate temperature value . + * BMA4_FAHREN_SCALED = 1.8 * 1000, BMA4_KELVIN_SCALED = 273.15 * 1000 + */ +uint16_t bma4_get_temperature(int32_t *temp, uint8_t temp_unit, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data[BMA4_TEMP_DATA_SIZE] = {0}; + int32_t temp_raw_scaled = 0; + + /* Check for Null pointer error */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Read temperature value from the register */ + rslt |= bma4_read_regs(BMA4_TEMPERATURE_ADDR, data, BMA4_TEMP_DATA_SIZE, dev); + + if (rslt == BMA4_OK) + temp_raw_scaled = (int32_t)data[BMA4_TEMP_BYTE] * BMA4_SCALE_TEMP; + + /* '0' value read from the register corresponds to 23 degree C */ + (*temp) = temp_raw_scaled + (BMA4_OFFSET_TEMP * BMA4_SCALE_TEMP); + + switch (temp_unit) { + case BMA4_DEG: + break; + + case BMA4_FAHREN: + /* Temperature in degree Fahrenheit */ + (*temp) = (((*temp) / BMA4_SCALE_TEMP) * BMA4_FAHREN_SCALED) + (32 * BMA4_SCALE_TEMP); + break; + + case BMA4_KELVIN: + /* Temperature in degree Kelvin */ + (*temp) = (*temp) + BMA4_KELVIN_SCALED; + break; + + default: + break; + } + } + + return rslt; +} + +/*! + * @brief This API reads the Output data rate, Bandwidth, perf_mode + * and Range of accel. + */ +uint16_t bma4_get_accel_config(struct bma4_accel_config *accel, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data[2] = {0}; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_ACCEL_CONFIG_ADDR, data, BMA4_ACCEL_CONFIG_LENGTH, dev); + + if (rslt == BMA4_OK) { + /* To get the ODR */ + accel->odr = BMA4_GET_BITS_POS_0(data[0], BMA4_ACCEL_ODR); + /* To get the bandwidth */ + accel->bandwidth = BMA4_GET_BITSLICE(data[0], BMA4_ACCEL_BW); + /* To get the under sampling mode */ + accel->perf_mode = BMA4_GET_BITSLICE(data[0], BMA4_ACCEL_PERFMODE); + /* Read the Accel range */ + accel->range = BMA4_GET_BITS_POS_0(data[1], BMA4_ACCEL_RANGE); + } + } + + return rslt; +} + +/*! + * @brief This API sets the output_data_rate, bandwidth, perf_mode + * and range of Accel. + */ +uint16_t bma4_set_accel_config(const struct bma4_accel_config *accel, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t accel_config_data[2] = {0, 0}; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* check whether the bandwidth and perfmode + settings are valid */ + rslt = validate_bandwidth_perfmode(accel->bandwidth, accel->perf_mode); + + if (rslt == BMA4_OK) { + /* check ODR is valid */ + rslt |= validate_odr(accel->odr); + + if (rslt == BMA4_OK) { + accel_config_data[0] = accel->odr & BMA4_ACCEL_ODR_MSK; + accel_config_data[0] |= (uint8_t)(accel->bandwidth << BMA4_ACCEL_BW_POS); + accel_config_data[0] |= (uint8_t)(accel->perf_mode << BMA4_ACCEL_PERFMODE_POS); + accel_config_data[1] = accel->range & BMA4_ACCEL_RANGE_MSK; + + /* Burst write is not possible in + suspend mode hence individual write is + used with delay of 1 ms */ + rslt |= bma4_write_regs(BMA4_ACCEL_CONFIG_ADDR, &accel_config_data[0], 1, dev); + dev->delay(BMA4_GEN_READ_WRITE_DELAY); + rslt |= bma4_write_regs((BMA4_ACCEL_CONFIG_ADDR + 1), &accel_config_data[1], + 1, dev); + } + } + } + + return rslt; +} + +/*! + * @brief This API validates the bandwidth and perf_mode + * value set by the user. + */ +static uint16_t validate_bandwidth_perfmode(uint8_t bandwidth, uint8_t perf_mode) +{ + uint16_t rslt = BMA4_OK; + + if (perf_mode == BMA4_CONTINUOUS_MODE) { + if (bandwidth > BMA4_ACCEL_NORMAL_AVG4) { + /* Invalid bandwidth error for continuous mode */ + rslt = BMA4_E_OUT_OF_RANGE; + } + } else if (perf_mode == BMA4_CIC_AVG_MODE) { + if (bandwidth > BMA4_ACCEL_RES_AVG128) { + /* Invalid bandwidth error for CIC avg. mode */ + rslt = BMA4_E_OUT_OF_RANGE; + } + } else { + rslt = BMA4_E_OUT_OF_RANGE; + } + + return rslt; +} + +/*! + * @brief This API validates the ODR value set by the user. + */ +static uint16_t validate_odr(uint8_t odr) +{ + uint16_t rslt = BMA4_OK; + + if ((odr < BMA4_OUTPUT_DATA_RATE_0_78HZ) || (odr > BMA4_OUTPUT_DATA_RATE_1600HZ)) { + /* If odr is not valid return error */ + rslt = BMA4_E_OUT_OF_RANGE; + } + + return rslt; +} + +/*! + * @brief This API sets the advance power save mode in the sensor. + */ +uint16_t bma4_set_advance_power_save(uint8_t adv_pwr_save, struct bma4_dev *dev) +{ + uint16_t rslt = BMA4_OK; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_POWER_CONF_ADDR, &data, 1, dev); + if (rslt == BMA4_OK) { + data = BMA4_SET_BITS_POS_0(data, BMA4_ADVANCE_POWER_SAVE, adv_pwr_save); + rslt |= bma4_write_regs(BMA4_POWER_CONF_ADDR, &data, 1, dev); + } + } + + return rslt; +} + +/*! + * @brief This API reads the status of advance power save mode + * from the sensor. + */ +uint16_t bma4_get_advance_power_save(uint8_t *adv_pwr_save, struct bma4_dev *dev) +{ + uint16_t rslt = BMA4_OK; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_POWER_CONF_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *adv_pwr_save = BMA4_GET_BITS_POS_0(data, BMA4_ADVANCE_POWER_SAVE); + } + + return rslt; +} + +/*! + * @brief This API sets the FIFO self wake up functionality in the sensor. + */ +uint16_t bma4_set_fifo_self_wakeup(uint8_t fifo_self_wakeup, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_POWER_CONF_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + data = BMA4_SET_BITSLICE(data, BMA4_FIFO_SELF_WAKE_UP, fifo_self_wakeup); + rslt |= bma4_write_regs(BMA4_POWER_CONF_ADDR, &data, 1, dev); + } + } + + return rslt; +} + +/*! + * @brief This API gets the status of FIFO self wake up functionality from + * the sensor. + */ +uint16_t bma4_get_fifo_self_wakeup(uint8_t *fifo_self_wake_up, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_POWER_CONF_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *fifo_self_wake_up = BMA4_GET_BITSLICE(data, BMA4_FIFO_SELF_WAKE_UP); + } + + return rslt; +} + +/*! + * @brief This API enables or disables the Accel in the sensor. + */ +uint16_t bma4_set_accel_enable(uint8_t accel_en, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_POWER_CTRL_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + data = BMA4_SET_BITSLICE(data, BMA4_ACCEL_ENABLE, accel_en); + rslt |= bma4_write_regs(BMA4_POWER_CTRL_ADDR, &data, 1, dev); + } + } + + return rslt; +} + +/*! + * @brief This API checks whether Accel is enabled or not in the sensor. + */ +uint16_t bma4_get_accel_enable(uint8_t *accel_en, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_POWER_CTRL_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *accel_en = BMA4_GET_BITSLICE(data, BMA4_ACCEL_ENABLE); + } + + return rslt; +} + +/*! + * @brief This API is used to enable or disable auxiliary Mag + * in the sensor. + */ +uint16_t bma4_set_mag_enable(uint8_t mag_en, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_POWER_CTRL_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + data = BMA4_SET_BITS_POS_0(data, BMA4_MAG_ENABLE, mag_en); + rslt |= bma4_write_regs(BMA4_POWER_CTRL_ADDR, &data, 1, dev); + } + } + + return rslt; +} + +/*! + * @brief This API is used to check whether the auxiliary Mag is enabled + * or not in the sensor. + */ +uint16_t bma4_get_mag_enable(uint8_t *mag_en, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_POWER_CTRL_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *mag_en = BMA4_GET_BITS_POS_0(data, BMA4_MAG_ENABLE); + } + + return rslt; +} + +/*! + * @brief This API reads the SPI interface mode which is set for primary + * interface. + */ +uint16_t bma4_get_spi_interface(uint8_t *spi, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Read SPI mode */ + rslt |= bma4_read_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *spi = BMA4_GET_BITS_POS_0(data, BMA4_CONFIG_SPI3); + } + + return rslt; +} + +/*! + * @brief This API configures the SPI interface Mode for primary interface + */ +uint16_t bma4_set_spi_interface(uint8_t spi, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + if (spi <= BMA4_MAX_VALUE_SPI3) { + /* Write SPI mode */ + rslt |= bma4_read_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + data = BMA4_SET_BITS_POS_0(data, BMA4_CONFIG_SPI3, spi); + rslt |= bma4_write_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); + } + } else { + rslt |= BMA4_E_OUT_OF_RANGE; + } + } + + return rslt; +} + +/*! +* @brief This API writes the available sensor specific commands +* to the sensor. +*/ +uint16_t bma4_set_command_register(uint8_t command_reg, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Write command register */ + rslt |= bma4_write_regs(BMA4_CMD_ADDR, &command_reg, 1, dev); + } + + return rslt; +} + +/*! + * @brief This API sets the I2C device address of auxiliary sensor + */ +uint16_t bma4_set_i2c_device_addr(struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0, dev_id = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Write the auxiliary I2C device address */ + rslt |= bma4_read_regs(BMA4_AUX_DEV_ID_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + dev_id = BMA4_SET_BITSLICE(data, BMA4_I2C_DEVICE_ADDR, dev->aux_config.aux_dev_addr); + rslt |= bma4_write_regs(BMA4_AUX_DEV_ID_ADDR, &dev_id, 1, dev); + } + } + + return rslt; +} + +/*! + * @brief This API sets the register access on MAG_IF[2], MAG_IF[3], + * MAG_IF[4] in the sensor. This implies that the DATA registers are + * not updated with Mag values automatically. + */ +uint16_t bma4_set_mag_manual_enable(uint8_t mag_manual, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Write the Mag manual*/ + rslt |= bma4_read_regs(BMA4_AUX_IF_CONF_ADDR, &data, 1, dev); + dev->delay(BMA4_GEN_READ_WRITE_DELAY); + + if (rslt == BMA4_OK) { + /* Set the bit of Mag manual enable */ + data = BMA4_SET_BITSLICE(data, BMA4_MAG_MANUAL_ENABLE, mag_manual); + rslt |= bma4_write_regs(BMA4_AUX_IF_CONF_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + dev->aux_config.manual_enable = (uint8_t)mag_manual; + } else { + /*dev->mag_manual_enable = 0;*/ + dev->aux_config.manual_enable = 0; + } + } + + return rslt; +} + +/*! + * @brief This API checks whether the Mag access is done manually or + * automatically in the sensor. + * If the Mag access is done through manual mode then Mag data registers + * in sensor are not updated automatically. + */ +uint16_t bma4_get_mag_manual_enable(uint8_t *mag_manual, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Read Mag manual */ + rslt |= bma4_read_regs(BMA4_AUX_IF_CONF_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *mag_manual = BMA4_GET_BITSLICE(data, BMA4_MAG_MANUAL_ENABLE); + } + + return rslt; +} + +/*! + * @brief This API sets the I2C interface configuration(if) mode + * for auxiliary Mag. + */ +uint16_t bma4_set_aux_if_mode(uint8_t if_mode, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + data = BMA4_SET_BITSLICE(data, BMA4_IF_CONFIG_IF_MODE, if_mode); + rslt |= bma4_write_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); + } + } + + return rslt; +} + +/*! + * @brief This API gets the address of the register of Aux Mag sensor + * where the data to be read. + */ +uint16_t bma4_get_mag_read_addr(uint8_t *mag_read_addr, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_AUX_RD_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *mag_read_addr = BMA4_GET_BITS_POS_0(data, BMA4_READ_ADDR); + } + + return rslt; +} + +/*! + * @brief This API sets the address of the register of Aux Mag sensor + * where the data to be read. + */ +uint16_t bma4_set_mag_read_addr(uint8_t mag_read_addr, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Write the Mag read address*/ + rslt |= bma4_write_regs(BMA4_AUX_RD_ADDR, &mag_read_addr, 1, dev); + } + + return rslt; +} + +/*! + * @brief This API gets the Aux Mag write address from the sensor. + * Mag write address is where the Mag data will be written. + */ +uint16_t bma4_get_mag_write_addr(uint8_t *mag_write_addr, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_AUX_WR_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *mag_write_addr = BMA4_GET_BITS_POS_0(data, BMA4_WRITE_ADDR); + } + + return rslt; +} + +/*! + * @brief This API sets the Aux Mag write address in the sensor. + * Mag write address is where the Mag data will be written. + */ +uint16_t bma4_set_mag_write_addr(uint8_t mag_write_addr, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) + rslt |= BMA4_E_NULL_PTR; + else + rslt |= bma4_write_regs(BMA4_AUX_WR_ADDR, &mag_write_addr, 1, dev); + + return rslt; +} + +/*! + * @brief This API reads the data from the sensor which is written to the + * Mag. + */ +uint16_t bma4_get_mag_write_data(uint8_t *mag_write_data, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_AUX_WR_DATA_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *mag_write_data = BMA4_GET_BITS_POS_0(data, BMA4_WRITE_DATA); + } + + return rslt; +} + +/*! + * @brief This API sets the data in the sensor which in turn will + * be written to Mag. + */ +uint16_t bma4_set_mag_write_data(uint8_t mag_write_data, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) + rslt |= BMA4_E_NULL_PTR; + else + rslt |= bma4_write_regs(BMA4_AUX_WR_DATA_ADDR, &mag_write_data, 1, dev); + + return rslt; +} + +/*! + * @brief This API reads the x,y,z and r axis data from the auxiliary + * Mag BMM150/AKM9916 sensor. + */ +uint16_t bma4_read_mag_xyzr(struct bma4_mag_xyzr *mag, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint16_t msb = 0; + uint16_t lsb = 0; + uint8_t data[BMA4_MAG_XYZR_DATA_LENGTH] = {0}; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_DATA_0_ADDR, data, BMA4_MAG_XYZR_DATA_LENGTH, dev); + + if (rslt == BMA4_OK) { + /* Data X */ + /* X-axis LSB value shifting */ + lsb = BMA4_GET_BITSLICE(data[BMA4_MAG_X_LSB_BYTE], BMA4_DATA_MAG_X_LSB); + msb = data[BMA4_MAG_X_MSB_BYTE]; + mag->x = (int16_t)((msb << 8) | lsb); + mag->x = (mag->x / 0x08); + + /* Data Y */ + /* Y-axis LSB value shifting */ + lsb = BMA4_GET_BITSLICE(data[BMA4_MAG_Y_LSB_BYTE], BMA4_DATA_MAG_Y_LSB); + msb = data[BMA4_MAG_Y_MSB_BYTE]; + mag->y = (int16_t)((msb << 8) | lsb); + mag->y = (mag->y / 0x08); + + /* Data Z */ + /* Z-axis LSB value shifting */ + lsb = BMA4_GET_BITSLICE(data[BMA4_MAG_Z_LSB_BYTE], BMA4_DATA_MAG_Z_LSB); + msb = data[BMA4_MAG_Z_MSB_BYTE]; + mag->z = (int16_t)((msb << 8) | lsb); + mag->z = (mag->z / 0x02); + + /* RHall */ + /* R-axis LSB value shifting */ + lsb = BMA4_GET_BITSLICE(data[BMA4_MAG_R_LSB_BYTE], BMA4_DATA_MAG_R_LSB); + msb = data[BMA4_MAG_R_MSB_BYTE]; + mag->r = (int16_t)((msb << 8) | lsb); + mag->r = (mag->r / 0x04); + } + } + + return rslt; +} + +/*! + * @brief This API sets the burst data length (1,2,6,8 byte) of auxiliary + * Mag sensor. + */ +uint16_t bma4_set_mag_burst(uint8_t mag_burst, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Write auxiliary burst mode length*/ + rslt |= bma4_read_regs(BMA4_AUX_IF_CONF_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + data = BMA4_SET_BITS_POS_0(data, BMA4_MAG_BURST, mag_burst); + rslt |= bma4_write_regs(BMA4_AUX_IF_CONF_ADDR, &data, 1, dev); + } + } + + return rslt; +} + +/*! + * @brief This API reads the burst data length of Mag set in the sensor. + */ +uint16_t bma4_get_mag_burst(uint8_t *mag_burst, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Write Mag burst mode length*/ + rslt |= bma4_read_regs(BMA4_AUX_IF_CONF_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *mag_burst = BMA4_GET_BITS_POS_0(data, BMA4_MAG_BURST); + } + + return rslt; +} + +/*! + * @brief This API reads the FIFO data of Accel and/or Mag sensor + */ +uint16_t bma4_read_fifo_data(struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + uint8_t addr = BMA4_FIFO_DATA_ADDR; + /* check the bma4 structure as NULL*/ + if (dev == NULL || dev->fifo == NULL || dev->fifo->data == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + reset_fifo_data_structure(dev); + /* read FIFO data*/ + if (dev->interface == BMA4_SPI_INTERFACE) + addr = addr | BMA4_SPI_RD_MASK; + + rslt |= dev->bus_read(dev->dev_addr, addr, dev->fifo->data, dev->fifo->length); + /* read fifo frame content configuration*/ + rslt |= bma4_read_regs(BMA4_FIFO_CONFIG_1_ADDR, &data, 1, dev); + /* filter fifo header enabled status */ + dev->fifo->fifo_header_enable = data & BMA4_FIFO_HEADER; + /* filter accel/mag data enabled status */ + dev->fifo->fifo_data_enable = data & BMA4_FIFO_M_A_ENABLE; + } + + return rslt; +} + +/*! + * @brief This API parses and extracts the accelerometer frames from + * FIFO data read by the "bma4_read_fifo_data" API and stores it in the + * "accel_data" structure instance. + */ +uint16_t bma4_extract_accel(struct bma4_accel *accel_data, uint16_t *accel_length, const struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint16_t data_index = 0; + uint16_t accel_index = 0; + uint16_t data_read_length = 0; + + if (dev == NULL || dev->fifo == NULL || dev->fifo->data == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Parsing the FIFO data in header-less mode */ + if (dev->fifo->fifo_header_enable == 0) { + get_accel_len_to_parse(&data_index, &data_read_length, accel_length, dev); + + for (; data_index < data_read_length;) { + unpack_acc_frm(accel_data, &data_index, &accel_index, dev->fifo->fifo_data_enable, dev); + /*Check for the availability of next + two bytes of FIFO data */ + check_empty_fifo(&data_index, dev); + } + /* update number of accel data read*/ + *accel_length = accel_index; + /*update the accel byte index*/ + dev->fifo->accel_byte_start_idx = data_index; + } else { + /* Parsing the FIFO data in header mode */ + extract_accel_header_mode(accel_data, accel_length, dev); + } + } + + return rslt; +} + +/*! + * @brief This API parses and extracts the magnetometer frames from + * FIFO data read by the "bma4_read_fifo_data" API and stores it in the + * "mag_data" structure instance parameter of this API + */ +uint16_t bma4_extract_mag(struct bma4_mag *mag_data, uint16_t *mag_length, const struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint16_t data_index = 0; + uint16_t mag_index = 0; + uint16_t data_read_length = 0; + + if (dev == NULL || dev->fifo == NULL || dev->fifo->data == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Parsing the FIFO data in header-less mode */ + if (dev->fifo->fifo_header_enable == 0) { + get_mag_len_to_parse(&data_index, &data_read_length, mag_length, dev); + for (; data_index < data_read_length;) { + rslt |= unpack_mag_frm(mag_data, &data_index, &mag_index, + dev->fifo->fifo_data_enable, dev); + /*Check for the availability of next + two bytes of FIFO data */ + check_empty_fifo(&data_index, dev); + } + /* update number of Aux. sensor data read*/ + *mag_length = mag_index; + /*update the Aux. sensor frame index*/ + dev->fifo->mag_byte_start_idx = data_index; + } else { + /* Parsing the FIFO data in header mode */ + rslt |= extract_mag_header_mode(mag_data, mag_length, dev); + } + } + + return rslt; +} + +/*! + * @brief This API reads the FIFO water mark level which is set + * in the sensor. + */ +uint16_t bma4_get_fifo_wm(uint16_t *fifo_wm, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data[2] = {0, 0}; + + /* Check the bma4 structure as NULL*/ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Read the FIFO water mark level*/ + rslt |= bma4_read_regs(BMA4_FIFO_WTM_0_ADDR, data, BMA4_FIFO_WM_LENGTH, dev); + + if (BMA4_OK == rslt) + *fifo_wm = (data[1] << 8) | (data[0]); + } + + return rslt; +} + +/*! + * @brief This API sets the FIFO watermark level in the sensor. + */ +uint16_t bma4_set_fifo_wm(uint16_t fifo_wm, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data[2] = {0, 0}; + + /* Check the bma4 structure as NULL*/ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + + data[0] = BMA4_GET_LSB(fifo_wm); + data[1] = BMA4_GET_MSB(fifo_wm); + /* consecutive write is not possible in suspend mode hence + separate write is used with delay of 1 ms*/ + /* Write the fifo watermark level*/ + rslt |= bma4_write_regs(BMA4_FIFO_WTM_0_ADDR, &data[0], 1, dev); + dev->delay(BMA4_GEN_READ_WRITE_DELAY); + rslt |= bma4_write_regs((BMA4_FIFO_WTM_0_ADDR + 1), &data[1], 1, dev); + } + + return rslt; +} + +/*! + * @brief This API checks whether the Accel FIFO data is set for filtered + * or unfiltered mode. + */ +uint16_t bma4_get_accel_fifo_filter_data(uint8_t *accel_fifo_filter, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Read the Accel FIFO filter data */ + rslt |= bma4_read_regs(BMA4_FIFO_DOWN_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *accel_fifo_filter = BMA4_GET_BITSLICE(data, BMA4_FIFO_FILTER_ACCEL); + } + + return rslt; +} + +/*! + * @brief This API sets the condition of Accel FIFO data either to + * filtered or unfiltered mode. + */ +uint16_t bma4_set_accel_fifo_filter_data(uint8_t accel_fifo_filter, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + if (accel_fifo_filter <= BMA4_MAX_VALUE_FIFO_FILTER) { + rslt |= bma4_read_regs(BMA4_FIFO_DOWN_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + /* Write Accel FIFO filter data */ + data = BMA4_SET_BITSLICE(data, BMA4_FIFO_FILTER_ACCEL, accel_fifo_filter); + rslt |= bma4_write_regs(BMA4_FIFO_DOWN_ADDR, &data, 1, dev); + } + } else { + rslt |= BMA4_E_OUT_OF_RANGE; + } + } + return rslt; +} + +/*! + * @brief This API reads the down sampling rates which is configured + * for Accel FIFO data. + */ +uint16_t bma4_get_fifo_down_accel(uint8_t *fifo_down, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Read the Accel FIFO down data */ + rslt |= bma4_read_regs(BMA4_FIFO_DOWN_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *fifo_down = BMA4_GET_BITSLICE(data, BMA4_FIFO_DOWN_ACCEL); + } + + return rslt; +} + +/*! + * @brief This API sets the down-sampling rates for Accel FIFO. + */ +uint16_t bma4_set_fifo_down_accel(uint8_t fifo_down, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Write the Accel FIFO down data */ + rslt |= bma4_read_regs(BMA4_FIFO_DOWN_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + data = BMA4_SET_BITSLICE(data, BMA4_FIFO_DOWN_ACCEL, fifo_down); + rslt |= bma4_write_regs(BMA4_FIFO_DOWN_ADDR, &data, 1, dev); + } + } + return rslt; +} + +/*! + * @brief This API reads the length of FIFO data available in the sensor + * in the units of bytes. + */ +uint16_t bma4_get_fifo_length(uint16_t *fifo_length, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t index = 0; + uint8_t data[BMA4_FIFO_DATA_LENGTH] = {0, 0}; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Read FIFO length*/ + rslt |= bma4_read_regs(BMA4_FIFO_LENGTH_0_ADDR, data, BMA4_FIFO_DATA_LENGTH, dev); + + if (rslt == BMA4_OK) { + index = BMA4_FIFO_LENGTH_MSB_BYTE; + data[index] = BMA4_GET_BITS_POS_0(data[index], BMA4_FIFO_BYTE_COUNTER_MSB); + *fifo_length = ((data[index] << 8) | data[index - 1]); + } + } + + return rslt; +} + +/*! + * @brief This API aligns and compensates the Mag data of BMM150/AKM9916 + * sensor. + */ +uint16_t bma4_second_if_mag_compensate_xyz(struct bma4_mag_fifo_data mag_fifo_data, + uint8_t mag_second_if, struct bma4_mag *compensated_mag_data) +{ + uint16_t rslt = 0; +#ifdef BMM150 + int16_t mag_x = 0; + int16_t mag_y = 0; + int16_t mag_z = 0; + uint16_t mag_r = 0; +#endif + + switch (mag_second_if) { +#ifdef BMM150 + case BMA4_SEC_IF_BMM150: + /* X data*/ + mag_x = (int16_t)((mag_fifo_data.mag_x_msb << 8) | (mag_fifo_data.mag_x_lsb)); + mag_x = (int16_t) (mag_x / 0x08); + + /* Y data*/ + mag_y = (int16_t)((mag_fifo_data.mag_y_msb << 8) | (mag_fifo_data.mag_y_lsb)); + mag_y = (int16_t) (mag_y / 0x08); + + /* Z data*/ + mag_z = (int16_t)((mag_fifo_data.mag_z_msb << 8) | (mag_fifo_data.mag_z_lsb)); + mag_z = (int16_t) (mag_z / 0x02); + + /* R data*/ + mag_r = (uint16_t)((mag_fifo_data.mag_r_y2_msb << 8) | (mag_fifo_data.mag_r_y2_lsb)); + mag_r = (uint16_t) (mag_r >> 2); + + /* Compensated Mag x data */ + compensated_mag_data->x = bma4_bmm150_mag_compensate_X(mag_x, mag_r); + + /* Compensated Mag y data */ + compensated_mag_data->y = bma4_bmm150_mag_compensate_Y(mag_y, mag_r); + + /* Compensated Mag z data */ + compensated_mag_data->z = bma4_bmm150_mag_compensate_Z(mag_z, mag_r); + break; +#endif + +#ifdef AKM9916 + + case BMA4_SEC_IF_AKM09916: + /* Compensated X data */ + compensated_mag_data->x = (int16_t)((mag_fifo_data.mag_x_msb << 8) | (mag_fifo_data.mag_x_lsb)); + /* Compensated Y data*/ + compensated_mag_data->y = (int16_t)((mag_fifo_data.mag_y_msb << 8) | (mag_fifo_data.mag_y_lsb)); + /* Compensated Z data*/ + compensated_mag_data->z = (int16_t)((mag_fifo_data.mag_z_msb << 8) | (mag_fifo_data.mag_z_lsb)); + break; + +#endif + default: + rslt |= BMA4_E_OUT_OF_RANGE; + break; + } + return rslt; +} + +/*! + * @brief This API reads Mag. x,y and z axis data from either BMM150 or + * AKM9916 sensor + */ +uint16_t bma4_read_mag_xyz(struct bma4_mag *mag, uint8_t sensor_select, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + +#if defined(AKM9916) || defined(BMM150) + uint8_t index; + uint16_t msb = 0; + uint16_t lsb = 0; + uint8_t data[BMA4_MAG_XYZ_DATA_LENGTH] = {0}; +#endif + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + switch (sensor_select) { + +#if defined(BMM150) + + case BMA4_SEC_IF_BMM150: + rslt |= bma4_read_regs(BMA4_DATA_0_ADDR, data, BMA4_MAG_XYZ_DATA_LENGTH, dev); + + if (rslt == BMA4_OK) { + index = BMA4_MAG_X_LSB_BYTE; + /*X-axis LSB value shifting*/ + data[index] = BMA4_GET_BITSLICE(data[index], BMA4_DATA_MAG_X_LSB); + /* Data X */ + msb = data[index + 1]; + lsb = data[index]; + mag->x = (int16_t)((msb << 8) | lsb); + mag->x = (mag->x / 0x08); + + /* Data Y */ + /*Y-axis LSB value shifting*/ + data[index + 2] = BMA4_GET_BITSLICE(data[index + 2], BMA4_DATA_MAG_Y_LSB); + msb = data[index + 3]; + lsb = data[index + 2]; + mag->y = (int16_t)((msb << 8) | lsb); + mag->y = (mag->y / 0x08); + + /* Data Z */ + /*Z-axis LSB value shifting*/ + data[index + 4] = BMA4_GET_BITSLICE(data[index + 4], BMA4_DATA_MAG_Z_LSB); + msb = data[index + 5]; + lsb = data[index + 4]; + mag->z = (int16_t)((msb << 8) | lsb); + mag->z = (mag->z / 0x02); + } + break; +#endif + +#if defined(AKM9916) + case BMA4_SEC_IF_AKM09916: + + if (AKM9916_SENSOR == dev->aux_sensor) { + rslt |= bma4_read_regs(BMA4_DATA_0_ADDR, data, BMA4_MAG_XYZ_DATA_LENGTH, dev); + + if (rslt == BMA4_OK) { + index = BMA4_MAG_X_LSB_BYTE; + /* Data X */ + msb = data[index + 1]; + lsb = data[index]; + mag->x = (int16_t)((msb << 8) | lsb); + + /* Data Y */ + msb = data[index + 3]; + lsb = data[index + 2]; + mag->y = (int32_t)((msb << 8) | lsb); + + /* Data Z */ + msb = data[index + 5]; + lsb = data[index + 4]; + mag->z = (int16_t)((msb << 8) | lsb); + } + } + break; +#endif + + default: + rslt |= BMA4_E_OUT_OF_RANGE; + break; + } + } + + return rslt; +} + +/*! + * @brief This API reads the auxiliary I2C interface configuration which + * is set in the sensor. + */ +uint16_t bma4_get_if_mode(uint8_t *if_mode, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Read auxiliary interface configuration */ + rslt |= bma4_read_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *if_mode = BMA4_GET_BITSLICE(data, BMA4_IF_CONFIG_IF_MODE); + } + + return rslt; +} + +/*! + * @brief This API sets the auxiliary interface configuration in the + * sensor. + */ +uint16_t bma4_set_if_mode(uint8_t if_mode, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + if (if_mode <= BMA4_MAX_IF_MODE) { + /* Write the interface configuration mode */ + rslt |= bma4_read_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); + if (rslt == BMA4_OK) { + data = BMA4_SET_BITSLICE(data, BMA4_IF_CONFIG_IF_MODE, if_mode); + rslt |= bma4_write_regs(BMA4_IF_CONFIG_ADDR, &data, 1, dev); + } + } else { + rslt |= BMA4_E_OUT_OF_RANGE; + } + } + + return rslt; +} + +/*! + * @brief This API reads the data ready status of Accel from the sensor. + */ +uint16_t bma4_get_accel_data_rdy(uint8_t *data_rdy, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /*Reads the status of Accel data ready*/ + rslt |= bma4_read_regs(BMA4_STATUS_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *data_rdy = BMA4_GET_BITSLICE(data, BMA4_STAT_DATA_RDY_ACCEL); + } + + return rslt; +} + +/*! + * @brief This API reads the data ready status of Mag from the sensor. + * The status get reset when Mag data register is read. + */ +uint16_t bma4_get_mag_data_rdy(uint8_t *data_rdy, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /*Reads the status of Accel data ready*/ + rslt |= bma4_read_regs(BMA4_STATUS_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) + *data_rdy = BMA4_GET_BITSLICE(data, BMA4_STAT_DATA_RDY_MAG); + } + + return rslt; +} + +/*! + * @brief This API reads the ASIC status from the sensor. + * The status information is mentioned in the below table. + */ +uint16_t bma4_get_asic_status(struct bma4_asic_status *asic_status, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Read the Mag I2C device address*/ + rslt |= bma4_read_regs(BMA4_INTERNAL_ERROR, &data, 1, dev); + + if (rslt == BMA4_OK) { + asic_status->sleep = (data & 0x01); + asic_status->irq_ovrn = ((data & 0x02) >> 0x01); + asic_status->wc_event = ((data & 0x04) >> 0x02); + asic_status->stream_transfer_active = ((data & 0x08) >> 0x03); + } + } + + return rslt; +} + +/*! + * @brief This API enables the offset compensation for filtered and + * unfiltered Accel data. + */ +uint16_t bma4_set_offset_comp(uint8_t offset_en, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_NV_CONFIG_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + /* Write Accel FIFO filter data */ + data = BMA4_SET_BITSLICE(data, BMA4_NV_ACCEL_OFFSET, offset_en); + rslt |= bma4_write_regs(BMA4_NV_CONFIG_ADDR, &data, 1, dev); + } + } + + return rslt; +} + +/*! + * @brief This API gets the status of Accel offset compensation + */ +uint16_t bma4_get_offset_comp(uint8_t *offset_en, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_NV_CONFIG_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + /* Write Accel FIFO filter data */ + *offset_en = BMA4_GET_BITSLICE(data, BMA4_NV_ACCEL_OFFSET); + } + } + + return rslt; +} + +/*! + * @brief This API performs Fast Offset Compensation for Accel. + * + * @note The g-values to be passed to the parameter should be + * multiples of 1000000. + */ +uint16_t bma4_perform_accel_foc(const int32_t accel_g_value[3], struct bma4_dev *dev) +{ + uint16_t rslt = 0; + struct bma4_accel accel_value[10] = { {0} }; + struct accel_offset offset = {0}; + struct offset_delta delta = { {0,0},{0,0},{0,0} }; + struct bma4_accel_config acc_conf = {0}; + uint8_t accel_en = 0; + uint8_t adv_pwr_save = 0; + uint8_t range = 0; + uint16_t lsb_per_g = 0; + struct accel_temp temp = {0}; + struct bma4_accel avg = {0}; + struct bma4_accel accel_data = {0}; + uint8_t i = 0; + + /* used to validate user input */ + rslt |= validate_user_input(accel_g_value); + + if (BMA4_OK == rslt) { + /* Configure accel config, accel enable and + advance power save for FOC */ + rslt |= foc_config(&acc_conf, &accel_en, &adv_pwr_save, dev); + + /*TO DO: Check for data ready status before + reading accel values*/ + + if (BMA4_OK == rslt) { + /* Giving a delay of 20ms before reading accel data + since odr is configured as 50Hz */ + for (i = 0; i < 10; i++) { + dev->delay(20); + rslt |= bma4_read_accel_xyz(&accel_value[i], dev); + temp.x = temp.x + (int32_t)accel_value[i].x; + temp.y = temp.y + (int32_t)accel_value[i].y; + temp.z = temp.z + (int32_t)accel_value[i].z; + } + + /* Take average of x, y and z data for lesser noise */ + avg.x = (int16_t)(temp.x / 10); + avg.y = (int16_t)(temp.y / 10); + avg.z = (int16_t)(temp.z / 10); + + /* Copy average value in another structure */ + accel_data = avg; + + if (BMA4_OK == rslt) { + /* Get the exact range value */ + map_range(acc_conf.range, &range); + /* Get LSB per bit given the range and resolution */ + lsb_per_g = (uint16_t)(power(2, dev->resolution) / (2 * range)); + /* Compensate accel data against gravity */ + comp_for_grvty(lsb_per_g, accel_g_value, &accel_data, &delta); + /* scale according to offset register resolution*/ + scale_offset(dev->resolution, range, &delta, &offset); + /* normalise the data with offset*/ + normalise_offset(&delta, &offset); + + /* offset values are written in the offset register */ + rslt |= bma4_write_regs(BMA4_OFFSET_0_ADDR, (uint8_t *)&offset.x, 1, dev); + rslt |= bma4_write_regs(BMA4_OFFSET_1_ADDR, (uint8_t *)&offset.y, 1, dev); + rslt |= bma4_write_regs(BMA4_OFFSET_2_ADDR, (uint8_t *)&offset.z, 1, dev); + + /* Enable offset compensation */ + rslt |= bma4_set_offset_comp(BMA4_ENABLE, dev); + + /* Set accel config, accel enable and advance power save */ + rslt |= bma4_set_accel_config(&acc_conf, dev); + rslt |= bma4_set_accel_enable(accel_en, dev); + rslt |= bma4_set_advance_power_save(adv_pwr_save, dev); + } else { + rslt |= BMA4_E_FOC_FAIL; + } + } + } + return rslt; +} + +/*! + * @brief This API checks whether the self test functionality of the sensor + * is working or not. + * The following parameter of struct bma4_dev, should have the valid value before + * performing the Self test, + * 1. Variant and 2. Resolution + */ +uint16_t bma4_perform_accel_selftest(uint8_t *result, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + struct bma4_accel positive = {0}; + struct bma4_accel negative = {0}; + /*! Structure for difference of accel values in g*/ + struct selftest_delta_limit accel_data_diff = {0}; + /*! Structure for difference of accel values in mg*/ + struct selftest_delta_limit accel_data_diff_mg = {0}; + + *result = BMA4_SELFTEST_FAIL; + + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + + rslt = set_accel_selftest_config(dev); + dev->delay(20); + rslt |= bma4_selftest_config(BMA4_ENABLE, dev); + + if (rslt == BMA4_OK) { + dev->delay(100); + rslt = bma4_read_accel_xyz(&positive, dev); + rslt |= bma4_selftest_config(BMA4_DISABLE, dev); + + if (rslt == BMA4_OK) { + dev->delay(100); + rslt = bma4_read_accel_xyz(&negative, dev); + + accel_data_diff.x = ABS(positive.x) + ABS(negative.x); + accel_data_diff.y = ABS(positive.y) + ABS(negative.y); + accel_data_diff.z = ABS(positive.z) + ABS(negative.z); + + /*! Converting LSB of the differences of accel values to mg*/ + convert_lsb_g(&accel_data_diff, &accel_data_diff_mg, dev); + /*! Validating self test for accel values in mg*/ + rslt |= validate_selftest(&accel_data_diff_mg, dev); + + if (rslt == BMA4_OK) + *result = BMA4_SELFTEST_PASS; + + /* Triggers a soft reset */ + rslt |= bma4_set_command_register(0xB6, dev); + dev->delay(200); + } + } + } + + return rslt; +} + +/*! + * @brief This API performs the steps needed for Self test operation + * before reading the Accel Self test data. + */ +uint16_t bma4_selftest_config(uint8_t sign, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + + rslt |= set_accel_selftest_enable(BMA4_ENABLE, dev); + rslt |= set_accel_selftest_sign(sign, dev); + + /* Set self test amplitude based on variant */ + switch (dev->variant) { + case BMA42X_VARIANT: + /* Set self test amplitude to high for BMA42x */ + rslt |= set_accel_selftest_amp(BMA4_ENABLE, dev); + break; + + case BMA45X_VARIANT: + /* Set self test amplitude to low for BMA45x */ + rslt |= set_accel_selftest_amp(BMA4_DISABLE, dev); + break; + + default: + rslt = BMA4_E_INVALID_SENSOR; + break; + } + + return rslt; +} + +/*! + * @brief API sets the interrupt to either interrupt1 or + * interrupt2 pin in the sensor. + */ +uint16_t bma4_map_interrupt(uint8_t int_line, uint16_t int_map, uint8_t enable, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data[3] = {0, 0, 0}; + uint8_t index[2] = {BMA4_INT_MAP_1_ADDR, BMA4_INT_MAP_2_ADDR}; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + + rslt |= bma4_read_regs(BMA4_INT_MAP_1_ADDR, data, 3, dev); + + if (enable == TRUE) { + /* Feature interrupt mapping */ + data[int_line] |= (uint8_t)(int_map & (0x00FF)); + /* Hardware interrupt mapping */ + if (int_line == BMA4_INTR2_MAP) + data[2] |= (uint8_t)((int_map & (0xFF00)) >> 4); + else + data[2] |= (uint8_t)((int_map & (0xFF00)) >> 8); + + rslt |= bma4_write_regs(index[int_line], &data[int_line], 1, dev); + rslt |= bma4_write_regs(BMA4_INT_MAP_DATA_ADDR, &data[2], 1, dev); + + } else { + /* Feature interrupt un-mapping */ + data[int_line] &= (~(uint8_t)(int_map & (0x00FF))); + /* Hardware interrupt un-mapping */ + if (int_line == BMA4_INTR2_MAP) + data[2] &= (~(uint8_t)((int_map & (0xFF00)) >> 4)); + else + data[2] &= (~(uint8_t)((int_map & (0xFF00)) >> 8)); + + rslt |= bma4_write_regs(index[int_line], &data[int_line], 1, dev); + rslt |= bma4_write_regs(BMA4_INT_MAP_DATA_ADDR, &data[2], 1, dev); + + } + } + + return rslt; +} + +/*! + * @brief This API sets the interrupt mode in the sensor. + */ +uint16_t bma4_set_interrupt_mode(uint8_t mode, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + + if (mode == BMA4_NON_LATCH_MODE || mode == BMA4_LATCH_MODE) + rslt |= bma4_write_regs(BMA4_INTR_LATCH_ADDR, &mode, 1, dev); + else + rslt |= BMA4_E_OUT_OF_RANGE; + } + + return rslt; +} + +/*! + * @brief This API gets the interrupt mode which is set in the sensor. + */ +uint16_t bma4_get_interrupt_mode(uint8_t *mode, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_INTR_LATCH_ADDR, &data, 1, dev); + *mode = data; + } + + return rslt; + +} + +/*! + * @brief This API sets the auxiliary Mag(BMM150 or AKM9916) output data + * rate and offset. + */ +uint16_t bma4_set_aux_mag_config(const struct bma4_aux_mag_config *aux_mag, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + if ((aux_mag->odr >= BMA4_OUTPUT_DATA_RATE_0_78HZ) && + (aux_mag->odr <= BMA4_OUTPUT_DATA_RATE_1600HZ) + && ((aux_mag->offset & BMA4_MAG_CONFIG_OFFSET_MSK) == 0x00)) { + data = (uint8_t)(aux_mag->odr | + ((aux_mag->offset << + BMA4_MAG_CONFIG_OFFSET_POS))); + rslt |= bma4_write_regs(BMA4_AUX_CONFIG_ADDR, &data, 1, dev); + } else { + rslt |= BMA4_E_OUT_OF_RANGE; + } + } + + return rslt; +} + +/*! + * @brief This API reads the auxiliary Mag(BMM150 or AKM9916) output data + * rate and offset. + */ +uint16_t bma4_get_aux_mag_config(struct bma4_aux_mag_config *aux_mag, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_AUX_CONFIG_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + aux_mag->odr = (data & 0x0F); + aux_mag->offset = (data & BMA4_MAG_CONFIG_OFFSET_MSK) >> 4; + } + } + + return rslt; +} + +/*! @brief This API sets the FIFO configuration in the sensor. + */ +uint16_t bma4_set_fifo_config(uint8_t config, uint8_t enable, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data[2] = {0, 0}; + uint8_t fifo_config_0 = config & BMA4_FIFO_CONFIG_0_MASK; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_FIFO_CONFIG_0_ADDR, data, BMA4_FIFO_CONFIG_LENGTH, dev); + + if (rslt == BMA4_OK) { + + if (fifo_config_0 > 0) { + + if (enable == TRUE) + data[0] = data[0] | fifo_config_0; + else + data[0] = data[0] & (~fifo_config_0); + } + + if (enable == TRUE) + data[1] = data[1] | (config & BMA4_FIFO_CONFIG_1_MASK); + else + data[1] = data[1] & (~(config & BMA4_FIFO_CONFIG_1_MASK)); + + /* Burst write is not possible in suspend mode hence + separate write is used with delay of 1 ms*/ + rslt |= bma4_write_regs(BMA4_FIFO_CONFIG_0_ADDR, &data[0], 1, dev); + dev->delay(BMA4_GEN_READ_WRITE_DELAY); + rslt |= bma4_write_regs((BMA4_FIFO_CONFIG_0_ADDR + 1), &data[1], 1, dev); + } + } + + return rslt; +} + +/*! @brief This API reads the FIFO configuration from the sensor. + */ +uint16_t bma4_get_fifo_config(uint8_t *fifo_config, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data[2] = {0, 0}; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_FIFO_CONFIG_0_ADDR, data, BMA4_FIFO_CONFIG_LENGTH, dev); + + if (rslt == BMA4_OK) + *fifo_config = ((uint8_t)((data[0] & BMA4_FIFO_CONFIG_0_MASK) | (data[1]))); + + } + + return rslt; +} + +/*! @brief This function sets the electrical behaviour of interrupt pin1 or + * pin2 in the sensor. + */ +uint16_t bma4_set_int_pin_config(const struct bma4_int_pin_config *int_pin_config, uint8_t int_line, + struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t interrupt_address_array[2] = {BMA4_INT1_IO_CTRL_ADDR, BMA4_INT2_IO_CTRL_ADDR}; + uint8_t data = 0; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + if (int_line <= 1) { + data = ((uint8_t)((int_pin_config->edge_ctrl & BMA4_INT_EDGE_CTRL_MASK) | + ((int_pin_config->lvl << 1) & BMA4_INT_LEVEL_MASK) | + ((int_pin_config->od << 2) & BMA4_INT_OPEN_DRAIN_MASK) | + ((int_pin_config->output_en << 3) & BMA4_INT_OUTPUT_EN_MASK) | + ((int_pin_config->input_en << 4) & BMA4_INT_INPUT_EN_MASK))); + + rslt |= bma4_write_regs(interrupt_address_array[int_line], &data, 1, dev); + } else { + rslt |= BMA4_E_INT_LINE_INVALID; + } + } + + return rslt; +} + +/*! @brief This API reads the electrical behavior of interrupt pin1 or pin2 + * from the sensor. + */ +uint16_t bma4_get_int_pin_config(struct bma4_int_pin_config *int_pin_config, uint8_t int_line, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t interrupt_address_array[2] = {BMA4_INT1_IO_CTRL_ADDR, BMA4_INT2_IO_CTRL_ADDR}; + uint8_t data = 0; + + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + if (int_line <= 1) { + rslt |= bma4_read_regs(interrupt_address_array[int_line], &data, 1, dev); + /* Assign interrupt configurations to the + structure members*/ + if (rslt == BMA4_OK) { + int_pin_config->edge_ctrl = data & BMA4_INT_EDGE_CTRL_MASK; + int_pin_config->lvl = ((data & BMA4_INT_LEVEL_MASK) >> BMA4_INT_LEVEL_POS); + int_pin_config->od = ((data & BMA4_INT_OPEN_DRAIN_MASK) >> BMA4_INT_OPEN_DRAIN_POS); + int_pin_config->output_en = ((data & BMA4_INT_OUTPUT_EN_MASK) + >> BMA4_INT_OUTPUT_EN_POS); + int_pin_config->input_en = ((data & BMA4_INT_INPUT_EN_MASK) >> BMA4_INT_INPUT_EN_POS); + } + } else { + rslt |= BMA4_E_INT_LINE_INVALID; + } + } + + return rslt; +} + +/*! + * @brief This API reads the Feature and Hardware interrupt status from the sensor. + */ +uint16_t bma4_read_int_status(uint16_t *int_status, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data[2] = {0}; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + rslt |= bma4_read_regs(BMA4_INT_STAT_0_ADDR, data, 2, dev); + + if (rslt == BMA4_OK) { + *int_status = data[0]; + *((uint8_t *)int_status + 1) = data[1]; + } + } + + return rslt; +} + +/*! + * @brief This API reads the Feature interrupt status from the sensor. + */ +uint16_t bma4_read_int_status_0(uint8_t *int_status_0, struct bma4_dev *dev) +{ + uint16_t rslt = BMA4_OK; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + /* Null pointer check */ + rslt = BMA4_E_NULL_PTR; + } else { + rslt = bma4_read_regs(BMA4_INT_STAT_0_ADDR, int_status_0, 1, dev); + } + + return rslt; +} + +/*! + * @brief This API reads the Hardware interrupt status from the sensor. + */ +uint16_t bma4_read_int_status_1(uint8_t *int_status_1, struct bma4_dev *dev) +{ + uint16_t rslt = BMA4_OK; + + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + /* Null pointer check */ + rslt = BMA4_E_NULL_PTR; + } else { + rslt = bma4_read_regs(BMA4_INT_STAT_1_ADDR, int_status_1, 1, dev); + } + + return rslt; +} + +/*! + * @brief This API initializes the auxiliary interface to access + * auxiliary sensor + */ +uint16_t bma4_aux_interface_init(struct bma4_dev *dev) +{ + /* Variable to return error codes */ + uint16_t rslt = BMA4_OK; + + /* Check for Null pointer error */ + rslt |= bma4_null_pointer_check(dev); + if (rslt == BMA4_OK) { + /* Set the auxiliary sensor configuration */ + rslt = bma4_set_aux_interface_config(dev); + if (rslt != BMA4_OK) + rslt = BMA4_E_AUX_CONFIG_FAIL; + } + + return rslt; +} + +/*! + * @brief This API reads the data from the auxiliary sensor +*/ +uint16_t bma4_aux_read(uint8_t aux_reg_addr, uint8_t *aux_data, uint16_t len, struct bma4_dev *dev) +{ + /* Variable to return error codes */ + uint16_t rslt = BMA4_OK; + + /* Check for Null pointer error */ + rslt |= bma4_null_pointer_check(dev); + if (rslt == BMA4_OK) { + /* Read the data from the data register in terms of + user defined length */ + rslt = bma4_extract_aux_data(aux_reg_addr, aux_data, len, dev); + } + + return rslt; +} + +/*! + * @brief This API writes the data into the auxiliary sensor +*/ +uint16_t bma4_aux_write(uint8_t aux_reg_addr, uint8_t *aux_data, uint16_t len, struct bma4_dev *dev) +{ + + uint16_t rslt = BMA4_OK; + + /* Check for Null pointer error */ + rslt |= bma4_null_pointer_check(dev); + if (rslt == BMA4_OK) { + /* Write data in terms of user defined length */ + if (len > 0) { + while (len--) { + /* First set data to write */ + rslt = bma4_write_regs(BMA4_AUX_WR_DATA_ADDR, aux_data, 1, dev); + dev->delay(BMA4_AUX_COM_DELAY); + if (rslt == BMA4_OK) { + /* Then set address to write */ + rslt = bma4_write_regs(BMA4_AUX_WR_ADDR, &aux_reg_addr, 1, dev); + dev->delay(BMA4_AUX_COM_DELAY); + + /* Increment data array and register address until + * user-defined length is greater than 0 */ + if ((rslt == BMA4_OK) && (len > 0)) { + aux_data++; + aux_reg_addr++; + } + } else { + rslt = BMA4_E_FAIL; + } + } + } else { + rslt = BMA4_E_RD_WR_LENGTH_INVALID; + } + } + + return rslt; +} + +/*****************************************************************************/ +/* Static function definition */ +/*! + * @brief This API converts lsb value of axes to mg for self-test * + */ +static void convert_lsb_g(const struct selftest_delta_limit *accel_data_diff, + struct selftest_delta_limit *accel_data_diff_mg, + const struct bma4_dev *dev) +{ + uint32_t lsb_per_g; + /*! Range considered for self-test is 8g */ + uint8_t range = 8; + + /*! lsb_per_g for the respective resolution and 8g range*/ + lsb_per_g = (uint32_t)(power(2, dev->resolution) / (2 * range)); + /*! accel x value in mg */ + accel_data_diff_mg->x = (accel_data_diff->x / (int32_t)lsb_per_g) * 1000; + /*! accel y value in mg */ + accel_data_diff_mg->y = (accel_data_diff->y / (int32_t)lsb_per_g) * 1000; + /*! accel z value in mg */ + accel_data_diff_mg->z = (accel_data_diff->z / (int32_t)lsb_per_g) * 1000; +} + +/*! + * @brief This API writes the config stream data in memory using burst mode + * @note index value should be even number. + */ +static uint16_t stream_transfer_write(const uint8_t *stream_data, uint16_t index, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t asic_msb = (uint8_t)((index / 2) >> 4); + uint8_t asic_lsb = ((index / 2) & 0x0F); + + rslt |= bma4_write_regs(BMA4_RESERVED_REG_5B_ADDR, &asic_lsb, 1, dev); + + if (rslt == BMA4_OK) { + rslt |= bma4_write_regs(BMA4_RESERVED_REG_5C_ADDR, &asic_msb, 1, dev); + + if (rslt == BMA4_OK) + rslt |= write_regs(BMA4_FEATURE_CONFIG_ADDR, (uint8_t *)stream_data, dev->read_write_len, dev); + } + + return rslt; +} + +/*! + * @brief This API enables or disables the Accel Self test feature in the + * sensor. + */ +static uint16_t set_accel_selftest_enable(uint8_t accel_selftest_enable, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + /* Read the self test register */ + rslt |= bma4_read_regs(BMA4_ACC_SELF_TEST_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + data = BMA4_SET_BITS_POS_0(data, BMA4_ACCEL_SELFTEST_ENABLE, accel_selftest_enable); + rslt |= bma4_write_regs(BMA4_ACC_SELF_TEST_ADDR, &data, 1, dev); + } + } + + return rslt; +} + +/*! + * @brief This API selects the sign of Accel self-test excitation. + */ +static uint16_t set_accel_selftest_sign(uint8_t accel_selftest_sign, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + + if (accel_selftest_sign <= BMA4_MAX_VALUE_SELFTEST_SIGN) { + /* Read the Accel self test sign*/ + rslt |= bma4_read_regs(BMA4_ACC_SELF_TEST_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + data = BMA4_SET_BITSLICE(data, BMA4_ACCEL_SELFTEST_SIGN, accel_selftest_sign); + rslt |= bma4_write_regs(BMA4_ACC_SELF_TEST_ADDR, &data, 1, dev); + } + } else { + rslt = BMA4_E_OUT_OF_RANGE; + } + } + + return rslt; +} + +/*! + * @brief This API sets the Accel self test amplitude in the sensor. + */ +static uint16_t set_accel_selftest_amp(uint8_t accel_selftest_amp, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t data = 0; + /* Check the bma4 structure as NULL */ + if (dev == NULL) { + rslt |= BMA4_E_NULL_PTR; + } else { + + if (accel_selftest_amp <= BMA4_MAX_VALUE_SELFTEST_AMP) { + /* Write self test amplitude*/ + rslt |= bma4_read_regs(BMA4_ACC_SELF_TEST_ADDR, &data, 1, dev); + + if (rslt == BMA4_OK) { + data = BMA4_SET_BITSLICE(data, BMA4_SELFTEST_AMP, accel_selftest_amp); + + rslt |= bma4_write_regs(BMA4_ACC_SELF_TEST_ADDR, &data, 1, dev); + } + } else { + rslt |= BMA4_E_OUT_OF_RANGE; + } + } + + return rslt; +} + +/*! + * @brief This function enables and configures the Accel which is needed + * for Self test operation. + */ +static uint16_t set_accel_selftest_config(struct bma4_dev *dev) +{ + uint16_t rslt = 0; + struct bma4_accel_config accel = {0}; + + accel.odr = BMA4_OUTPUT_DATA_RATE_1600HZ; + accel.bandwidth = BMA4_ACCEL_NORMAL_AVG4; + accel.perf_mode = BMA4_ENABLE; + accel.range = BMA4_ACCEL_RANGE_8G; + + rslt |= bma4_set_accel_enable(BMA4_ENABLE, dev); + dev->delay(1); + rslt |= bma4_set_accel_config(&accel, dev); + + return rslt; +} + +/*! + * @brief This API validates the Accel g value provided as input by the + * user for Accel offset compensation. + * + * @note The g-values to be passed to the parameter should be + * multiples of 1000000. + */ +static uint16_t validate_user_input(const int32_t *gvalue) + +{ + uint8_t index = 0; + int32_t min_gval = (int32_t)(-1.0 * BMA4XY_MULTIPLIER); + int32_t max_gval = (int32_t)(1.0 * BMA4XY_MULTIPLIER); + + while (index < 3) { + if (gvalue[index] >= min_gval && gvalue[index] <= max_gval) + index++; + else + return BMA4_E_OUT_OF_RANGE; + } + + return BMA4_OK; +} + +/*! + * @brief This API normalise the data with offset + */ +static void normalise_offset(const struct offset_delta *compensated_data, struct accel_offset *offset_data) +{ + /* for handling negative offset */ + /* employing twos's Complement method*/ + if (compensated_data->x.is_negative == TRUE) { + offset_data->x = ~offset_data->x; + offset_data->x += 1; + } + + if (compensated_data->y.is_negative == TRUE) { + offset_data->y = ~offset_data->y; + offset_data->y += 1; + } + + if (compensated_data->z.is_negative == TRUE) { + offset_data->z = ~offset_data->z; + offset_data->z += 1; + } + + offset_data->x = (uint8_t)((offset_data->x) * (-1)); + offset_data->y = (uint8_t)((offset_data->y) * (-1)); + offset_data->z = (uint8_t)((offset_data->z) * (-1)); +} + +/*! + * @brief This API normalize the data with offset. + */ +static void scale_offset(uint8_t res, uint8_t range, const struct offset_delta *delta, struct accel_offset *data) +{ + int8_t bit_pos_3_9mg, bit_pos_3_9mg_nextbit; + uint8_t round_off = 0; + + /* Find the bit position of 3.9mg */ + bit_pos_3_9mg = get_bit_pos_3_9mg(range, res); + + /* Data register resolution less than or equal to 3.9 mg */ + if (bit_pos_3_9mg > 0) { + /* Round off, consider if the next bit is high */ + bit_pos_3_9mg_nextbit = bit_pos_3_9mg - 1; + round_off = (uint8_t)(1 * power(2, ((uint8_t) bit_pos_3_9mg_nextbit))); + /* scale according to offset register resolution*/ + data->x = (uint8_t)((delta->x.val + round_off) / power(2, ((uint8_t)bit_pos_3_9mg))); + data->y = (uint8_t)((delta->y.val + round_off) / power(2, ((uint8_t)bit_pos_3_9mg))); + data->z = (uint8_t)((delta->z.val + round_off) / power(2, ((uint8_t)bit_pos_3_9mg))); + } else if (bit_pos_3_9mg < 0) { + bit_pos_3_9mg = (int8_t)(bit_pos_3_9mg * -1); + data->x = (uint8_t)(delta->x.val * power(2, ((uint8_t)bit_pos_3_9mg))); + data->y = (uint8_t)(delta->y.val * power(2, ((uint8_t)bit_pos_3_9mg))); + data->z = (uint8_t)(delta->z.val * power(2, ((uint8_t)bit_pos_3_9mg))); + } else { + /* Scale according to offset register resolution */ + data->x = (uint8_t)(delta->x.val); + data->y = (uint8_t)(delta->y.val); + data->z = (uint8_t)(delta->z.val); + } +} + +/*! + * @brief This API compensate the accel data against gravity. + * + * @note The g-values to be passed to the parameter should be + * multiples of 1000000. + */ +static void comp_for_grvty(uint16_t lsb_per_g, const int32_t g_val[3], const struct bma4_accel *data, + struct offset_delta *comp_data) +{ + int64_t accel_value_lsb[3] = {0}; + uint8_t index; + + for (index = 0; index < 3; index++) { + /* convert g to lsb */ + accel_value_lsb[index] = ((int64_t)(lsb_per_g) * (int64_t)(g_val[index])); + } + + /* Dividing the accel value in LSB by 1000000 to get + compensated data back in g-value */ + comp_data->x.val = (int16_t)(data->x - (int16_t)((accel_value_lsb[BMA4_X_AXIS] / (int64_t)BMA4XY_MULTIPLIER))); + comp_data->y.val = (int16_t)(data->y - (int16_t)((accel_value_lsb[BMA4_Y_AXIS] / (int64_t)BMA4XY_MULTIPLIER))); + comp_data->z.val = (int16_t)(data->z - (int16_t)((accel_value_lsb[BMA4_Z_AXIS] / (int64_t)BMA4XY_MULTIPLIER))); + + if (comp_data->x.val < 0) { + comp_data->x.val = ABS(comp_data->x.val); + comp_data->x.is_negative = 1; + } + + if (comp_data->y.val < 0) { + comp_data->y.val = ABS(comp_data->y.val); + comp_data->y.is_negative = 1; + } + + if (comp_data->z.val < 0) { + comp_data->z.val = ABS(comp_data->z.val); + comp_data->z.is_negative = 1; + } +} + +/*! + * @brief This API converts the range value into corresponding + * integer value. + */ +static void map_range(uint8_t range_in, uint8_t *range_out) +{ + switch (range_in) { + case BMA4_ACCEL_RANGE_2G: + *range_out = 2; + break; + case BMA4_ACCEL_RANGE_4G: + *range_out = 4; + break; + case BMA4_ACCEL_RANGE_8G: + *range_out = 8; + break; + case BMA4_ACCEL_RANGE_16G: + *range_out = 16; + break; + default: + break; + } +} + +/*! + * @brief This API is used to reset the FIFO related configurations + * in the fifo_frame structure. + * + */ +static void reset_fifo_data_structure(const struct bma4_dev *dev) +{ + /*Prepare for next FIFO read by resetting FIFO's + internal data structures*/ + dev->fifo->accel_byte_start_idx = 0; + dev->fifo->mag_byte_start_idx = 0; + dev->fifo->sc_frame_byte_start_idx = 0; + dev->fifo->sensor_time = 0; + dev->fifo->skipped_frame_count = 0; + dev->fifo->accel_dropped_frame_count = 0; + dev->fifo->mag_dropped_frame_count = 0; +} + +/*! + * @brief This API computes the number of bytes of accel FIFO data + * which is to be parsed in header-less mode + */ +static void get_accel_len_to_parse(uint16_t *start_idx, uint16_t *len, const uint16_t *acc_count, + const struct bma4_dev *dev) +{ + uint8_t dummy_byte_spi = 0; + + /*Check if this is the first iteration of data unpacking + if yes, then consider dummy byte on SPI*/ + if (dev->fifo->accel_byte_start_idx == 0) + dummy_byte_spi = dev->dummy_byte; + + /*Data start index*/ + *start_idx = dev->fifo->accel_byte_start_idx + dummy_byte_spi; + + if (dev->fifo->fifo_data_enable == BMA4_FIFO_A_ENABLE) { + /*Len has the number of bytes to loop for */ + *len = (uint16_t)(((*acc_count) * BMA4_FIFO_A_LENGTH) + dummy_byte_spi); + } else if (dev->fifo->fifo_data_enable == BMA4_FIFO_M_A_ENABLE) { + /*Len has the number of bytes to loop for */ + *len = (uint16_t)(((*acc_count) * BMA4_FIFO_MA_LENGTH) + dummy_byte_spi); + } else { + /*Only aux. sensor or no sensor is enabled in FIFO, + so there will be no accel data. + Update the data index as complete*/ + *start_idx = dev->fifo->length; + } + if ((*len) > dev->fifo->length) { + /*Handling the case where more data is requested + than available*/ + *len = dev->fifo->length; + } +} + +/*! + * @brief This API checks the fifo read data as empty frame, if it + * is empty frame then moves the index to last byte. + */ +static void check_empty_fifo(uint16_t *data_index, const struct bma4_dev *dev) +{ + if ((*data_index + 2) < dev->fifo->length) { + /* Check if FIFO is empty */ + if ((dev->fifo->data[*data_index] == FIFO_MSB_CONFIG_CHECK) + && (dev->fifo->data[*data_index + 1] == FIFO_LSB_CONFIG_CHECK)) { + /*Update the data index as complete*/ + *data_index = dev->fifo->length; + } + } +} + +/*! + * @brief This API is used to parse the accelerometer data from the + * FIFO data in header mode. + * + */ +static void extract_accel_header_mode(struct bma4_accel *accel_data, uint16_t *accel_length, const struct bma4_dev *dev) +{ + uint8_t frame_header = 0; + uint16_t data_index; + uint16_t accel_index = 0; + uint16_t frame_to_read = *accel_length; + /*Check if this is the first iteration of data unpacking + if yes, then consider dummy byte on SPI*/ + if (dev->fifo->accel_byte_start_idx == 0) + dev->fifo->accel_byte_start_idx = dev->dummy_byte; + + for (data_index = dev->fifo->accel_byte_start_idx; data_index < dev->fifo->length;) { + /*Header byte is stored in the variable frame_header*/ + frame_header = dev->fifo->data[data_index]; + /*Get the frame details from header*/ + frame_header = frame_header & BMA4_FIFO_TAG_INTR_MASK; + /*Index is moved to next byte where the data is starting*/ + data_index++; + + switch (frame_header) { + /* Accel frame */ + case FIFO_HEAD_A: + case FIFO_HEAD_M_A: + unpack_acc_frm(accel_data, &data_index, &accel_index, frame_header, dev); + break; + /* Aux. sensor frame */ + case FIFO_HEAD_M: + move_next_frame(&data_index, BMA4_FIFO_M_LENGTH, dev); + break; + /* Sensor time frame */ + case FIFO_HEAD_SENSOR_TIME: + unpack_sensortime_frame(&data_index, dev); + break; + /* Skip frame */ + case FIFO_HEAD_SKIP_FRAME: + unpack_skipped_frame(&data_index, dev); + break; + /* Input config frame */ + case FIFO_HEAD_INPUT_CONFIG: + move_next_frame(&data_index, 1, dev); + break; + /* Sample drop frame */ + case FIFO_HEAD_SAMPLE_DROP: + unpack_dropped_frame(&data_index, dev); + break; + /* Over read FIFO data */ + case FIFO_HEAD_OVER_READ_MSB: + /* Update the data index as complete*/ + data_index = dev->fifo->length; + break; + default: + break; + } + if (frame_to_read == accel_index) { + /*Number of frames to read completed*/ + break; + } + } + + /*Update number of accel data read*/ + *accel_length = accel_index; + /*Update the accel frame index*/ + dev->fifo->accel_byte_start_idx = data_index; +} + +/*! + * @brief This API is used to parse the accelerometer data from the + * FIFO data in both header mode and header-less mode. + * It update the idx value which is used to store the index of + * the current data byte which is parsed. + */ +static void unpack_acc_frm(struct bma4_accel *acc, uint16_t *idx, uint16_t *acc_idx, uint8_t frm, + const struct bma4_dev *dev) +{ + switch (frm) { + case FIFO_HEAD_A: + case BMA4_FIFO_A_ENABLE: + /*Partial read, then skip the data*/ + if ((*idx + BMA4_FIFO_A_LENGTH) > dev->fifo->length) { + /*Update the data index as complete*/ + *idx = dev->fifo->length; + break; + } + /*Unpack the data array into the structure instance "acc" */ + unpack_accel_data(&acc[*acc_idx], *idx, dev); + /*Move the data index*/ + *idx = *idx + BMA4_FIFO_A_LENGTH; + (*acc_idx)++; + break; + case FIFO_HEAD_M_A: + case BMA4_FIFO_M_A_ENABLE: + /*Partial read, then skip the data*/ + if ((*idx + BMA4_FIFO_MA_LENGTH) > dev->fifo->length) { + /*Update the data index as complete*/ + *idx = dev->fifo->length; + break; + } + /*Unpack the data array into structure instance "acc"*/ + unpack_accel_data(&acc[*acc_idx], *idx + BMA4_MA_FIFO_A_X_LSB, dev); + /*Move the data index*/ + *idx = *idx + BMA4_FIFO_MA_LENGTH; + (*acc_idx)++; + break; + /* Aux. sensor frame */ + case FIFO_HEAD_M: + case BMA4_FIFO_M_ENABLE: + (*idx) = (*idx) + BMA4_FIFO_M_LENGTH; + break; + default: + break; + } +} + +/*! + * @brief This API is used to parse the accelerometer data from the + * FIFO data and store it in the instance of the structure bma4_accel. + */ +static void unpack_accel_data(struct bma4_accel *accel_data, uint16_t data_start_index, const struct bma4_dev *dev) +{ + uint16_t data_lsb; + uint16_t data_msb; + + /* Accel raw x data */ + data_lsb = dev->fifo->data[data_start_index++]; + data_msb = dev->fifo->data[data_start_index++]; + accel_data->x = (int16_t)((data_msb << 8) | data_lsb); + + /* Accel raw y data */ + data_lsb = dev->fifo->data[data_start_index++]; + data_msb = dev->fifo->data[data_start_index++]; + accel_data->y = (int16_t)((data_msb << 8) | data_lsb); + + /* Accel raw z data */ + data_lsb = dev->fifo->data[data_start_index++]; + data_msb = dev->fifo->data[data_start_index++]; + accel_data->z = (int16_t)((data_msb << 8) | data_lsb); + + if (dev->resolution == BMA4_12_BIT_RESOLUTION) { + accel_data->x = (accel_data->x / 0x10); + accel_data->y = (accel_data->y / 0x10); + accel_data->z = (accel_data->z / 0x10); + } else if (dev->resolution == BMA4_14_BIT_RESOLUTION) { + accel_data->x = (accel_data->x / 0x04); + accel_data->y = (accel_data->y / 0x04); + accel_data->z = (accel_data->z / 0x04); + } +} + +/*! + * @brief This API computes the number of bytes of Mag FIFO data which is + * to be parsed in header-less mode + * + */ +static void get_mag_len_to_parse(uint16_t *start_idx, uint16_t *len, const uint16_t *mag_count, + const struct bma4_dev *dev) +{ + uint8_t dummy_byte_spi = 0; + + /*Check if this is the first iteration of data unpacking + if yes, then consider dummy byte on SPI*/ + if (dev->fifo->mag_byte_start_idx == 0) + dummy_byte_spi = dev->dummy_byte; + + /*Data start index*/ + *start_idx = dev->fifo->mag_byte_start_idx + dummy_byte_spi; + + if (dev->fifo->fifo_data_enable == BMA4_FIFO_M_ENABLE) { + /*Len has the number of bytes to loop for */ + *len = (uint16_t)(((*mag_count) * BMA4_FIFO_M_LENGTH) + dummy_byte_spi); + } else if (dev->fifo->fifo_data_enable == BMA4_FIFO_M_A_ENABLE) { + /*Len has the number of bytes to loop for */ + *len = (uint16_t)(((*mag_count) * BMA4_FIFO_MA_LENGTH) + dummy_byte_spi); + } else { + /*Only accel sensor or no sensor is enabled in FIFO, + so there will be no mag data. + Update the data index as complete*/ + *start_idx = dev->fifo->length; + } + + /*Handling the case where more data is requested than available*/ + if ((*len) > dev->fifo->length) { + /*Len is equal to the FIFO length*/ + *len = dev->fifo->length; + } +} + +/*! + * @brief This API is used to parse the magnetometer data from the + * FIFO data in header mode. + * + */ +static uint16_t extract_mag_header_mode(struct bma4_mag *data, uint16_t *len, const struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t frame_header = 0; + uint16_t data_index; + uint16_t mag_index = 0; + uint16_t frame_to_read = *len; + + /*Check if this is the first iteration of data unpacking + if yes, then consider dummy byte on SPI*/ + if (dev->fifo->mag_byte_start_idx == 0) + dev->fifo->mag_byte_start_idx = dev->dummy_byte; + + for (data_index = dev->fifo->mag_byte_start_idx; data_index < dev->fifo->length;) { + /*Header byte is stored in the variable frame_header*/ + frame_header = dev->fifo->data[data_index]; + /*Get the frame details from header*/ + frame_header = frame_header & BMA4_FIFO_TAG_INTR_MASK; + /*Index is moved to next byte where the data is starting*/ + data_index++; + + switch (frame_header) { + /* Aux. sensor frame */ + case FIFO_HEAD_M: + case FIFO_HEAD_M_A: + rslt |= unpack_mag_frm(data, &data_index, &mag_index, frame_header, dev); + break; + /* Aux. sensor frame */ + case FIFO_HEAD_A: + move_next_frame(&data_index, BMA4_FIFO_A_LENGTH, dev); + break; + /* Sensor time frame */ + case FIFO_HEAD_SENSOR_TIME: + unpack_sensortime_frame(&data_index, dev); + break; + /* Skip frame */ + case FIFO_HEAD_SKIP_FRAME: + unpack_skipped_frame(&data_index, dev); + break; + /* Input config frame */ + case FIFO_HEAD_INPUT_CONFIG: + move_next_frame(&data_index, 1, dev); + break; + /* Sample drop frame */ + case FIFO_HEAD_SAMPLE_DROP: + unpack_dropped_frame(&data_index, dev); + break; + case FIFO_HEAD_OVER_READ_MSB: + /*Update the data index as complete*/ + data_index = dev->fifo->length; + break; + default: + break; + } + if (frame_to_read == mag_index) { + /*Number of frames to read completed*/ + break; + } + } + /*update number of Aux. sensor data read*/ + *len = mag_index; + /*update the Aux. sensor frame index*/ + dev->fifo->mag_byte_start_idx = data_index; + return rslt; +} + +/*! + * @brief This API is used to parse the magnetometer data from the + * FIFO data in both header mode and header-less mode and update the + * data_index value which is used to store the index of the current + * data byte which is parsed. + * + */ +static uint16_t unpack_mag_frm(struct bma4_mag *data, uint16_t *idx, uint16_t *mag_idx, uint8_t frm, + const struct bma4_dev *dev) +{ + uint16_t rslt = 0; + + switch (frm) { + case FIFO_HEAD_M: + case BMA4_FIFO_M_ENABLE: + /*partial read, then skip the data*/ + if ((*idx + BMA4_FIFO_M_LENGTH) > dev->fifo->length) { + /*update the data index as complete*/ + *idx = dev->fifo->length; + break; + } + + /*unpack the data array into Aux. sensor data structure*/ + rslt |= unpack_mag_data(&data[*mag_idx], *idx, dev); + /*move the data index*/ + *idx = *idx + BMA4_FIFO_M_LENGTH; + (*mag_idx)++; + break; + case FIFO_HEAD_M_A: + case BMA4_FIFO_M_A_ENABLE: + /*partial read, then skip the data*/ + if ((*idx + BMA4_FIFO_MA_LENGTH) > dev->fifo->length) { + /*update the data index as complete*/ + *idx = dev->fifo->length; + break; + } + + /*unpack the data array into Aux. sensor data structure*/ + rslt |= unpack_mag_data(&data[*mag_idx], *idx, dev); + /*move the data index to next frame*/ + *idx = *idx + BMA4_FIFO_MA_LENGTH; + (*mag_idx)++; + break; + /* aux. sensor frame */ + case FIFO_HEAD_A: + case BMA4_FIFO_A_ENABLE: + (*idx) = (*idx) + BMA4_FIFO_A_LENGTH; + break; + default: + break; + } + + return rslt; +} + +/*! + * @brief This API is used to parse the auxiliary magnetometer data from + * the FIFO data and store it in the instance of the structure mag_data. + * + */ +static uint16_t unpack_mag_data(struct bma4_mag *mag_data, uint16_t start_idx, const struct bma4_dev *dev) +{ + uint16_t rslt = 0; + struct bma4_mag_fifo_data mag_fifo_data; + + /* Aux. mag sensor raw x data */ + mag_fifo_data.mag_x_lsb = dev->fifo->data[start_idx++]; + mag_fifo_data.mag_x_msb = dev->fifo->data[start_idx++]; + + /* Aux. mag sensor raw y data */ + mag_fifo_data.mag_y_lsb = dev->fifo->data[start_idx++]; + mag_fifo_data.mag_y_msb = dev->fifo->data[start_idx++]; + + /* Aux. mag sensor raw z data */ + mag_fifo_data.mag_z_lsb = dev->fifo->data[start_idx++]; + mag_fifo_data.mag_z_msb = dev->fifo->data[start_idx++]; + + /* Aux. mag sensor raw r data */ + mag_fifo_data.mag_r_y2_lsb = dev->fifo->data[start_idx++]; + mag_fifo_data.mag_r_y2_msb = dev->fifo->data[start_idx++]; + + /*Compensated FIFO data output*/ + rslt |= bma4_second_if_mag_compensate_xyz(mag_fifo_data, dev->aux_sensor, mag_data); + + return rslt; +} + +/*! + * @brief This API is used to parse and store the sensor time from the + * FIFO data in the structure instance dev. + * + */ +static void unpack_sensortime_frame(uint16_t *data_index, const struct bma4_dev *dev) +{ + uint32_t sensor_time_byte3 = 0; + uint16_t sensor_time_byte2 = 0; + uint8_t sensor_time_byte1 = 0; + + /*Partial read, then move the data index to last data*/ + if ((*data_index + BMA4_SENSOR_TIME_LENGTH) > dev->fifo->length) { + /*Update the data index as complete*/ + *data_index = dev->fifo->length; + } else { + sensor_time_byte3 = dev->fifo->data[(*data_index) + BMA4_SENSOR_TIME_MSB_BYTE] << 16; + sensor_time_byte2 = dev->fifo->data[(*data_index) + BMA4_SENSOR_TIME_XLSB_BYTE] << 8; + sensor_time_byte1 = dev->fifo->data[(*data_index)]; + /* Sensor time */ + dev->fifo->sensor_time = (uint32_t)(sensor_time_byte3 | sensor_time_byte2 | sensor_time_byte1); + *data_index = (*data_index) + BMA4_SENSOR_TIME_LENGTH; + } +} + +/*! + * @brief This API is used to parse and store the skipped_frame_count from + * the FIFO data in the structure instance dev. + */ +static void unpack_skipped_frame(uint16_t *data_index, const struct bma4_dev *dev) +{ + /*Partial read, then move the data index to last data*/ + if (*data_index >= dev->fifo->length) { + /*Update the data index as complete*/ + *data_index = dev->fifo->length; + } else { + dev->fifo->skipped_frame_count = dev->fifo->data[*data_index]; + /*Move the data index*/ + *data_index = (*data_index) + 1; + } +} + +/*! + * @brief This API is used to parse and store the dropped_frame_count from + * the FIFO data in the structure instance dev. + */ +static void unpack_dropped_frame(uint16_t *data_index, const struct bma4_dev *dev) +{ + uint8_t dropped_frame = 0; + /*Partial read, then move the data index to last data*/ + if (*data_index >= dev->fifo->length) { + /*Update the data index as complete*/ + *data_index = dev->fifo->length; + } else { + /*Extract accel and mag dropped frame count*/ + dropped_frame = dev->fifo->data[*data_index] & ACCEL_AUX_FIFO_DROP; + /*Move the data index and update the dropped frame count*/ + switch (dropped_frame) { + case ACCEL_FIFO_DROP: + *data_index = (*data_index) + BMA4_FIFO_A_LENGTH; + dev->fifo->accel_dropped_frame_count = dev->fifo->accel_dropped_frame_count + 1; + break; + case AUX_FIFO_DROP: + *data_index = (*data_index) + BMA4_FIFO_M_LENGTH; + dev->fifo->mag_dropped_frame_count = dev->fifo->mag_dropped_frame_count + 1; + break; + case ACCEL_AUX_FIFO_DROP: + *data_index = (*data_index) + BMA4_FIFO_MA_LENGTH; + dev->fifo->accel_dropped_frame_count = dev->fifo->accel_dropped_frame_count + 1; + dev->fifo->mag_dropped_frame_count = dev->fifo->mag_dropped_frame_count + 1; + break; + default: + break; + } + } +} + +/*! + * @brief This API is used to move the data index ahead of the + * current_frame_length parameter when unnecessary FIFO data appears while + * extracting the user specified data. + */ +static void move_next_frame(uint16_t *data_index, uint8_t current_frame_length, const struct bma4_dev *dev) +{ + /*Partial read, then move the data index to last data*/ + if ((*data_index + current_frame_length) > dev->fifo->length) { + /*Update the data index as complete*/ + *data_index = dev->fifo->length; + } else { + /*Move the data index to next frame*/ + *data_index = *data_index + current_frame_length; + } +} + +/*! + * @brief This function validates the Accel Self test data and decides the + * result of Self test operation. + */ +static uint16_t validate_selftest(const struct selftest_delta_limit *accel_data_diff, + const struct bma4_dev *dev) +{ + uint16_t rslt = 0; + + /* Set self test amplitude based on variant */ + switch (dev->variant) { + case BMA42X_VARIANT: + /* Validating accel data by comparing with minimum value of the axes in mg */ + /* For BMA42x - > x axis limit 400mg, y axis limit 800mg and z axis limit 400mg */ + if ((accel_data_diff->x > BMA42X_ST_ACC_X_AXIS_SIGNAL_DIFF) && + (accel_data_diff->y > BMA42X_ST_ACC_Y_AXIS_SIGNAL_DIFF) && + (accel_data_diff->z > BMA42X_ST_ACC_Z_AXIS_SIGNAL_DIFF)) { + rslt = BMA4_OK; + } else { + rslt = BMA4_E_SELF_TEST_FAIL; + } + break; + + case BMA45X_VARIANT: + /* Validating accel data by comparing with minimum value of the axes in mg */ + /* For BMA45x - > x axis limit 1800mg, y axis limit 1800mg and z axis limit 1800mg */ + if ((accel_data_diff->x > BMA45X_ST_ACC_X_AXIS_SIGNAL_DIFF) && + (accel_data_diff->y > BMA45X_ST_ACC_Y_AXIS_SIGNAL_DIFF) && + (accel_data_diff->z > BMA45X_ST_ACC_Z_AXIS_SIGNAL_DIFF)) { + rslt = BMA4_OK; + } else { + rslt = BMA4_E_SELF_TEST_FAIL; + } + break; + + default: + rslt = BMA4_E_INVALID_SENSOR; + break; + } + + return rslt; +} + +/*! + * @brief This function configure the Accel for FOC. + */ +static uint16_t foc_config(struct bma4_accel_config *acc_conf, uint8_t *acc_en, uint8_t *pwr_mode, struct bma4_dev *dev) +{ + uint16_t rslt = 0; + uint8_t accel_cnf = BMA4_ACCEL_CONFIG_FOC; + + /* for saving Accel configuration, + Accel enable status, advance power save*/ + rslt |= bma4_get_accel_config(acc_conf, dev); + rslt |= bma4_get_accel_enable(acc_en, dev); + rslt |= bma4_get_advance_power_save(pwr_mode, dev); + + /* Disabling offset compensation that is in place*/ + rslt |= bma4_set_offset_comp(BMA4_DISABLE, dev); + + if (rslt == BMA4_OK) { + /* Set Accel config to 50Hz, continuous filter mode, + no under sampling */ + rslt |= bma4_write_regs(BMA4_ACCEL_CONFIG_ADDR, &accel_cnf, 1, dev); + + if (rslt == BMA4_OK) { + /* Switch Accel to normal mode and + advance power save to zero*/ + rslt |= bma4_set_accel_enable(BMA4_ENABLE, dev); + rslt |= bma4_set_advance_power_save(BMA4_DISABLE, dev); + } + } + + return rslt; +} + +/*! + * @brief This API is used to calculate the power of 2 + */ +static int32_t power(int16_t base, uint8_t resolution) +{ + uint8_t i = 1; + /* Initialize variable to store the power of 2 value */ + int32_t value = 1; + + for (; i <= resolution; i++) + value = (int32_t)(value * base); + + return value; +} + +/*! + * @brief This API performs the roundoff on given value + */ +static int8_t roundoff(int32_t value) +{ + /* Variable to return the round off value */ + int8_t ret = 0; + + /* Since the value passed is scaled in multiples of 100, + the return value is divided by 100 to get the round off value */ + if (value < 0) + ret = (int8_t)(((value) - 50) / 100); + else + ret = (int8_t)(((value) + 50) / 100); + + + return ret; +} + +/*! + * @brief This API finds the bit position of 3.9mg according to given range + * and resolution. + */ +static int8_t get_bit_pos_3_9mg(uint8_t range, uint8_t res) +{ + /* Variable to store the bit position of 3.9mg */ + int8_t bit_pos_3_9mg = 0; + /* Variable to store the value to be rounded off */ + int32_t value = 0; + /* Variable to store the LSB per bit in micros */ + int32_t ug_per_bit; + /* Variable to store the rounded off value */ + int8_t round_off_int; + /* Variable to store the bit count */ + uint8_t bit_count = 0; + /* Variable to store the signed range value */ + int32_t range_value; + + /* Scaling range with a multiplier to get integer value of ug_per_bit */ + range_value = (int32_t)(2 * range * BMA4XY_MULTIPLIER); + + /* Get the G-per bit resolution*/ + ug_per_bit = (int32_t)(range_value / power(2, res)); + + /* Compare for -ve & +ve bit position w.r.t 3900micro-g or as reference + * Note: Value scaled in 100s to get accurate integer value */ + if (ug_per_bit > 3900) + value = (int32_t)(ug_per_bit * 100 / 3900); + else + value = (int32_t)(3900 * 100 / ug_per_bit); + + /* Round off the value */ + round_off_int = (int8_t)(roundoff(value)); + + /* Find the bit position of 3.9mg*/ + while (round_off_int != 1) { + round_off_int = (round_off_int / 0x02); + bit_count++; + } + + /* Check for +ve and -ve bit position of 3.9 mg */ + if (ug_per_bit > 3900) + bit_pos_3_9mg = (int8_t)(bit_count * (-1)); + else + bit_pos_3_9mg = (int8_t)bit_count; + + return bit_pos_3_9mg; +} +/*! + * @brief This internal API brings up the secondary interface to access + * auxiliary sensor * + */ +static uint16_t bma4_set_aux_interface_config(struct bma4_dev *dev) +{ + /* Variable to return error codes */ + uint16_t rslt = BMA4_OK; + + /* Check for null pointer error */ + rslt |= bma4_null_pointer_check(dev); + + if (rslt == BMA4_OK) { + /* Enable the auxiliary sensor */ + rslt |= bma4_set_mag_enable(0x01, dev); + dev->delay(BMA4_AUX_COM_DELAY); + + /* Disable advance power save */ + rslt |= bma4_set_advance_power_save(0x00, dev); + dev->delay(BMA4_AUX_COM_DELAY); + + /* Set the I2C device address of auxiliary device */ + rslt |= bma4_set_i2c_device_addr(dev); + dev->delay(BMA4_AUX_COM_DELAY); + + /* Set auxiliary interface to manual mode */ + rslt |= bma4_set_mag_manual_enable(dev->aux_config.manual_enable, dev); + dev->delay(BMA4_AUX_COM_DELAY); + + /* Set the number of bytes for burst read */ + rslt |= bma4_set_mag_burst(dev->aux_config.burst_read_length, dev); + dev->delay(BMA4_AUX_COM_DELAY); + + /* Switch on the the auxiliary interface mode */ + rslt |= bma4_set_if_mode(dev->aux_config.if_mode, dev); + dev->delay(BMA4_AUX_COM_DELAY); + + } + + return rslt; +} + +/*! +* @brief This internal API reads the data from the auxiliary sensor +* depending on burst length configured +*/ +static uint16_t bma4_extract_aux_data(uint8_t aux_reg_addr, uint8_t *aux_data, uint16_t len, struct bma4_dev *dev) +{ + /* Variable to return error codes */ + uint16_t rslt = BMA4_OK; + /* Pointer variable to read data from the register */ + uint8_t data[15] = {0}; + /* Variable to define length counts */ + uint8_t len_count = 0; + /* Variable to define burst read length */ + uint8_t burst_len = 0; + /* Variable to define read length */ + uint8_t read_length = 0; + /* Variable to define the number of burst reads */ + uint8_t burst_count; + /* Variable to define address of the data register*/ + uint8_t aux_read_addr = BMA4_DATA_0_ADDR; + + /* Extract burst read length in a variable */ + rslt |= bma4_map_read_len(&burst_len, dev); + + for (burst_count = 0; burst_count < len; burst_count += burst_len) { + /* Set the address whose data is to be read */ + rslt |= bma4_set_mag_read_addr(aux_reg_addr, dev); + dev->delay(BMA4_AUX_COM_DELAY); + + if (rslt == BMA4_OK) { + /* If user defined length is valid */ + if (len > 0) { + /* Read the data from the data register */ + rslt |= bma4_read_regs(aux_read_addr, data, (uint8_t)burst_len, dev); + dev->delay(BMA4_AUX_COM_DELAY); + + if (rslt == BMA4_OK) { + /* If defined user length or remaining length after a burst + read is less than burst length */ + if ((len - burst_count) < burst_len) { + /* Read length is equal to burst_length or + remaining length*/ + read_length = (uint8_t)(len - burst_count); + } else { + /* Read length is equal to burst_length */ + read_length = burst_len; + } + + /* Copy the read data in terms of given read length */ + for (len_count = 0; len_count < read_length; len_count++) + aux_data[burst_count + len_count] = data[len_count]; + + /* Increment the register address by burst read length */ + aux_reg_addr += burst_len; + } else { + rslt = BMA4_E_RD_WR_LENGTH_INVALID; + } + } else { + rslt = BMA4_E_FAIL; + } + } else { + rslt = BMA4_E_FAIL; + } + } + + return rslt; +} + +/*! + * @brief This internal API maps the actual burst read length with user + length set. + */ +static uint16_t bma4_map_read_len(uint8_t *len, const struct bma4_dev *dev) +{ + /* Variable to return error codes */ + uint16_t rslt = BMA4_OK; + + switch (dev->aux_config.burst_read_length) { + + case BMA4_AUX_READ_LEN_0: + *len = 1; + break; + case BMA4_AUX_READ_LEN_1: + *len = 2; + break; + case BMA4_AUX_READ_LEN_2: + *len = 6; + break; + case BMA4_AUX_READ_LEN_3: + *len = 8; + break; + default: + rslt = BMA4_E_OUT_OF_RANGE; + break; + } + + return rslt; +} + +/*! +* @brief This internal API checks null pointer error +*/ +static uint16_t bma4_null_pointer_check(const struct bma4_dev *dev) +{ + uint16_t rslt = BMA4_OK; + + if ((dev == NULL) || (dev->bus_read == NULL) || (dev->bus_write == NULL)) + rslt |= BMA4_E_NULL_PTR; + else + rslt = BMA4_OK; + + return rslt; +} diff --git a/src/bma4.h b/src/bma4.h index eba44b2..b99d9e1 100644 --- a/src/bma4.h +++ b/src/bma4.h @@ -1,1574 +1,1574 @@ -/* -* -**************************************************************************** -* Copyright (C) 2015 - 2016 Bosch Sensortec GmbH -* -* File : bma4.h -* -* Date: 12 Oct 2017 -* -* Revision: 2.1.9 $ -* -* Usage: Sensor Driver for BMA4 family of sensors -* -**************************************************************************** -* -* Disclaimer -* -* Common: -* Bosch Sensortec products are developed for the consumer goods industry. -* They may only be used within the parameters of the respective valid -* product data sheet. Bosch Sensortec products are provided with the -* express understanding that there is no warranty of fitness for a -* particular purpose.They are not fit for use in life-sustaining, -* safety or security sensitive systems or any system or device -* that may lead to bodily harm or property damage if the system -* or device malfunctions. In addition,Bosch Sensortec products are -* not fit for use in products which interact with motor vehicle systems. -* The resale and or use of products are at the purchasers own risk and -* his own responsibility. The examination of fitness for the intended use -* is the sole responsibility of the Purchaser. -* -* The purchaser shall indemnify Bosch Sensortec from all third party -* claims, including any claims for incidental, or consequential damages, -* arising from any product use not covered by the parameters of -* the respective valid product data sheet or not approved by -* Bosch Sensortec and reimburse Bosch Sensortec for all costs in -* connection with such claims. -* -* The purchaser must monitor the market for the purchased products, -* particularly with regard to product safety and inform Bosch Sensortec -* without delay of all security relevant incidents. -* -* Engineering Samples are marked with an asterisk (*) or (e). -* Samples may vary from the valid technical specifications of the product -* series. They are therefore not intended or fit for resale to third -* parties or for use in end products. Their sole purpose is internal -* client testing. The testing of an engineering sample may in no way -* replace the testing of a product series. Bosch Sensortec assumes -* no liability for the use of engineering samples. -* By accepting the engineering samples, the Purchaser agrees to indemnify -* Bosch Sensortec from all claims arising from the use of engineering -* samples. -* -* Special: -* This software module (hereinafter called "Software") and any information -* on application-sheets (hereinafter called "Information") is provided -* free of charge for the sole purpose to support your application work. -* The Software and Information is subject to the following -* terms and conditions: -* -* The Software is specifically designed for the exclusive use for -* Bosch Sensortec products by personnel who have special experience -* and training. Do not use this Software if you do not have the -* proper experience or training. -* -* This Software package is provided `` as is `` and without any expressed -* or implied warranties,including without limitation, the implied warranties -* of merchantability and fitness for a particular purpose. -* -* Bosch Sensortec and their representatives and agents deny any liability -* for the functional impairment -* of this Software in terms of fitness, performance and safety. -* Bosch Sensortec and their representatives and agents shall not be liable -* for any direct or indirect damages or injury, except as -* otherwise stipulated in mandatory applicable law. -* -* The Information provided is believed to be accurate and reliable. -* Bosch Sensortec assumes no responsibility for the consequences of use -* of such Information nor for any infringement of patents or -* other rights of third parties which may result from its use. -* No license is granted by implication or otherwise under any patent or -* patent rights of Bosch. Specifications mentioned in the Information are -* subject to change without notice. -**************************************************************************/ -/*! \file bma4.h - \brief Sensor Driver for BMA4 family of sensors */ -#ifndef BMA4_H__ -#define BMA4_H__ - -/*********************************************************************/ -/* header files */ - -#include "bma4_defs.h" -#ifdef AKM9916 -#include "aux_akm9916.h" -#endif - -#ifdef BMM150 -#include "aux_bmm150.h" -#endif -/*********************************************************************/ -/* (extern) variable declarations */ - -/*********************************************************************/ -/* function prototype declarations */ -/*! - * @brief This API is the entry point. - * Call this API before using all other APIs. - * This API reads the chip-id of the sensor which is the first step to - * verify the sensor and also it configures the read mechanism of SPI and - * I2C interface. - * - * @param[in,out] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - * @note - * While changing the parameter of the bma4 - * consider the following point: - * Changing the reference value of the parameter - * will changes the local copy or local reference - * make sure your changes will not - * affect the reference value of the parameter - * (Better case don't change the reference value of the parameter) - */ -uint16_t bma4_init(struct bma4_dev *dev); - -/*! - * @brief This API is used to write the binary configuration in the sensor - * - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_write_config_file(struct bma4_dev *dev); - -/*! - * @brief This API checks whether the write operation requested is for - * feature config or register write and accordingly writes the data in the - * sensor. - * - * @note user has to disable the advance power save mode in the sensor when - * using this API in burst write mode. - * bma4_set_advance_power_save(BMA4_DISABLE, dev); - * - * @param[in] addr : Register address. - * @param[in] data : Write data buffer - * @param[in] len : No of bytes to write - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma4_write_regs(uint8_t addr, uint8_t *data, uint8_t len, struct bma4_dev *dev); - -/*! - * @brief This API checks whether the read operation requested is for - * feature or register read and accordingly reads the data from the sensor. - * - * @param[in] addr : Register address. - * @param[in] data : Read data buffer. - * @param[in] len : No of bytes to read. - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma4_read_regs(uint8_t addr, uint8_t *data, uint8_t len, struct bma4_dev *dev); - -/*! - * @brief This API reads the error status from the sensor. - * - * Below table mention the types of error which can occur in the sensor - *@verbatim - ************************************************************************* - * Error | Description - *************************|*********************************************** - * | Fatal Error, chip is not in operational - * fatal | state (Boot-, power-system). - * | This flag will be reset only by - * | power-on-reset or soft reset. - *************************|*********************************************** - * cmd | Command execution failed. - *************************|*********************************************** - * | Value Name Description - * error_code | 000 no_error no error - * | 001 acc_err error in - * | ACC_CONF - *************************|*********************************************** - * | Error in FIFO detected: Input data was - * fifo | discarded in stream mode. This flag - * | will be reset when read. - *************************|*********************************************** - * mag | Error in I2C-Master detected. - * | This flag will be reset when read. - ************************************************************************* - *@endverbatim - * - * @param[in,out] err_reg : Pointer to structure variable which stores the - * error status read from the sensor. - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma4_get_error_status(struct bma4_err_reg *err_reg, struct bma4_dev *dev); - -/*! - * @brief This API reads the sensor status from the dev sensor. - * - * Below table lists the sensor status flags - * Status | Description - * ----------------------------|---------------------------------------- - * BMA4_MAG_MAN_OP_ONGOING | Manual Mag. interface operation ongoing - * BMA4_CMD_RDY | Command decoder is ready. - * BMA4_MAG_DATA_RDY | Data ready for Mag. - * BMA4_ACC_DATA_RDY | Data ready for Accel. - * - * @param[in] status : Variable used to store the sensor status flags - * which is read from the sensor. - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_status(uint8_t *status, struct bma4_dev *dev); - -/*! - * @brief This API reads the Accel data for x,y and z axis from the sensor. - * The data units is in LSB format. - * - * @param[in] accel : Variable used to store the Accel data which is read - * from the sensor. - * @param[in] dev : Structure instance of bma4_dev. - * - * @note For setting the Accel configuration use the below function - * bma4_set_accel_config - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_read_accel_xyz(struct bma4_accel *accel, struct bma4_dev *dev); - -/*! - * @brief This API reads the sensor time of Sensor time gets updated - * with every update of data register or FIFO. - * - * @param[in] sensor_time : Pointer variable which stores sensor time - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_sensor_time(uint32_t *sensor_time, struct bma4_dev *dev); - -/*! - * @brief This API reads the chip temperature of sensor. - * @note If Accel and Mag are disabled, the temperature value will be set - * to invalid. - * - * @param[out] temp : Pointer variable which stores the temperature value. - * @param[in] temp_unit : indicates the unit of temperature - * temp_unit | description - * ------------|------------------- - * BMA4_DEG | degrees Celsius - * BMA4_FAHREN | degrees fahrenheit - * BMA4_KELVIN | degrees kelvin - * - * @param[in] dev : Structure instance of bma4_dev. - * - * @note Using a scaling factor of 1000, to obtain integer values, which - * at the user end, are used to get accurate temperature value. - * BMA4_SCALE_FARHAN = 1.8 * 1000, BMA4_SCALE_KELVIN = 273.15 * 1000 - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_temperature(int32_t *temp, uint8_t temp_unit, struct bma4_dev *dev); - -/*! - * @brief This API reads the Output data rate, Bandwidth, perf_mode - * and Range of accel. - * - * @param[in,out] accel : Address of user passed structure which is used - * to store the Accel configurations read from the sensor. - * - * @note Enums and corresponding values for structure parameters like - * Odr, Bandwidth and Range are mentioned in the below tables. - * - * Value | Odr - * -----------|------------------------------------ - * 1 | BMA4_OUTPUT_DATA_RATE_0_78HZ - * 2 | BMA4_OUTPUT_DATA_RATE_1_56HZ - * 3 | BMA4_OUTPUT_DATA_RATE_3_12HZ - * 4 | BMA4_OUTPUT_DATA_RATE_6_25HZ - * 5 | BMA4_OUTPUT_DATA_RATE_12_5HZ - * 6 | BMA4_OUTPUT_DATA_RATE_25HZ - * 7 | BMA4_OUTPUT_DATA_RATE_50HZ - * 8 | BMA4_OUTPUT_DATA_RATE_100HZ - * 9 | BMA4_OUTPUT_DATA_RATE_200HZ - * 10 | BMA4_OUTPUT_DATA_RATE_400HZ - * 11 | BMA4_OUTPUT_DATA_RATE_800HZ - * 12 | BMA4_OUTPUT_DATA_RATE_1600HZ - * - * Value | accel_bw - * ------|-------------------------- - * 0 | BMA4_ACCEL_OSR4_AVG1 - * 1 | BMA4_ACCEL_OSR2_AVG2 - * 2 | BMA4_ACCEL_NORMAL_AVG4 - * 3 | BMA4_ACCEL_CIC_AVG8 - * 4 | BMA4_ACCEL_RES_AVG16 - * 5 | BMA4_ACCEL_RES_AVG32 - * 6 | BMA4_ACCEL_RES_AVG64 - * 7 | BMA4_ACCEL_RES_AVG128 - * - * Value | g_range - * --------|--------------------- - * 0x00 | BMA4_ACCEL_RANGE_2G - * 0x01 | BMA4_ACCEL_RANGE_4G - * 0x02 | BMA4_ACCEL_RANGE_8G - * 0x03 | BMA4_ACCEL_RANGE_16G - * - * @param[in] dev : Structure instance of bma4_dev - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_accel_config(struct bma4_accel_config *accel, struct bma4_dev *dev); - -/*! - * @brief This API sets the output_data_rate, bandwidth, perf_mode - * and range of Accel. - * - * @param[in] accel : Pointer to structure variable which specifies the - * Accel configurations. - * - * @note Enums and corresponding values for structure parameters like - * Odr, Bandwidth and Range are mentioned in the below tables. - * Value | ODR - * --------|----------------------------------------- - * 1 | BMA4_OUTPUT_DATA_RATE_0_78HZ - * 2 | BMA4_OUTPUT_DATA_RATE_1_56HZ - * 3 | BMA4_OUTPUT_DATA_RATE_3_12HZ - * 4 | BMA4_OUTPUT_DATA_RATE_6_25HZ - * 5 | BMA4_OUTPUT_DATA_RATE_12_5HZ - * 6 | BMA4_OUTPUT_DATA_RATE_25HZ - * 7 | BMA4_OUTPUT_DATA_RATE_50HZ - * 8 | BMA4_OUTPUT_DATA_RATE_100HZ - * 9 | BMA4_OUTPUT_DATA_RATE_200HZ - * 10 | BMA4_OUTPUT_DATA_RATE_400HZ - * 11 | BMA4_OUTPUT_DATA_RATE_800HZ - * 12 | BMA4_OUTPUT_DATA_RATE_1600HZ - * - * Value | accel_bw - * ------|-------------------------- - * 0 | BMA4_ACCEL_OSR4_AVG1 - * 1 | BMA4_ACCEL_OSR2_AVG2 - * 2 | BMA4_ACCEL_NORMAL_AVG4 - * 3 | BMA4_ACCEL_CIC_AVG8 - * 4 | BMA4_ACCEL_RES_AVG16 - * 5 | BMA4_ACCEL_RES_AVG32 - * 6 | BMA4_ACCEL_RES_AVG64 - * 7 | BMA4_ACCEL_RES_AVG128 - * - * Value | g_range - * --------|--------------------- - * 0x00 | BMA4_ACCEL_RANGE_2G - * 0x01 | BMA4_ACCEL_RANGE_4G - * 0x02 | BMA4_ACCEL_RANGE_8G - * 0x03 | BMA4_ACCEL_RANGE_16G - * - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_accel_config(const struct bma4_accel_config *accel, struct bma4_dev *dev); - -/*! - * @brief This API sets the advance power save mode in the sensor. - * - * @note If advanced power save is enabled and the Accel and/or - * magnetometer operate in duty cycling mode, the length of the unlatched - * DRDY interrupt pulse is longer than 1/3.2 kHz (312.5 us). - * - * @param[in] adv_pwr_save : The value of advance power save mode - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_advance_power_save(uint8_t adv_pwr_save, - struct bma4_dev *dev); - -/*! - * @brief This API reads the status of advance power save mode - * from the sensor. - * - * @note If the advanced power save is enabled and the Accel and/or - * magnetometer operate in duty cycling mode, the length of the unlatched - * DRDY interrupt pulse is longer than 1/3.2 kHz (312.5 us). - * - * @param[out] adv_pwr_save : The value of advance power save mode - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_advance_power_save(uint8_t *adv_pwr_save, struct bma4_dev *dev); - -/*! - * @brief This API sets the FIFO self wake up functionality in the sensor. - * - * @note Functionality related to FIFO self wake up depends upon the - * advance power save mode. for more info. refer data sheet. - * - * @param[in] fifo_self_wakeup : Variable used to enable or disable - * FIFO self wake up functionality. - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_fifo_self_wakeup(uint8_t fifo_self_wakeup, struct bma4_dev *dev); - -/*! - * @brief This API gets the status of FIFO self wake up functionality from - * the sensor. - * - * @note Functionality related to FIFO self wake up depends upon the - * advance power save mode. for more info. refer data sheet. - * - * @param[out] fifo_self_wake_up : Pointer variable used to store the - * fifo self wake up status. - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_fifo_self_wakeup(uint8_t *fifo_self_wake_up, struct bma4_dev *dev); - -/*! - * @brief This API enables or disables the Accel in the sensor. - * - * @note Before reading Accel data, user should call this API. - * - * @param[in] accel_en : Variable used to enable or disable the Accel. - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_accel_enable(uint8_t accel_en, struct bma4_dev *dev); - -/*! - * @brief This API checks whether Accel is enabled or not in the sensor. - * - * @param[out] accel_en : Pointer variable used to store the Accel enable - * status - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_accel_enable(uint8_t *accel_en, struct bma4_dev *dev); - -/*! - * @brief This API is used to enable or disable auxiliary Mag - * in the sensor. - * - * @note Before reading Mag data, user should call this API. - * - * @param[in] mag_en : Variable used to enable or disable the Mag. - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_mag_enable(uint8_t mag_en, struct bma4_dev *dev); - -/*! - * @brief This API is used to check whether the auxiliary Mag is enabled - * or not in the sensor. - * - * @param[out] mag_en : Pointer variable used to store the enable status of - * Mag in the sensor. - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_mag_enable(uint8_t *mag_en, struct bma4_dev *dev); - -/*! - * @brief This API reads the SPI interface mode which is set for primary - * interface. - * - * @param[out] spi : Pointer variable which stores the SPI mode selection - * Value | Description - * --------|------------------ - * 0 | SPI 4-wire mode - * 1 | SPI 3-wire mode - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_spi_interface(uint8_t *spi, struct bma4_dev *dev); - -/*! - * @brief This API configures the SPI interface Mode for primary interface - * - * @param[in] spi : The value of SPI mode selection - * Value | Description - * --------|------------------ - * 0 | SPI 4-wire mode - * 1 | SPI 3-wire mode - * - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_spi_interface(uint8_t spi, struct bma4_dev *dev); - - /*! - * @brief This API writes the available sensor specific commands - * to the sensor. - * - * @param[in] command_reg : The command to write to the command register. - *@verbatim - * value | Description - * --------|------------------------------------------------------ - * 0xB6 | Triggers a soft reset - * 0xB0 | Clears all data in the FIFO, does not change - * | FIFO_CONFIG and FIFO_DOWNS registers - * 0xF0 | Reset acceleration data path - *@endverbatim - * @param[in] dev : Structure instance of bma4_dev. - * - * @note Register will always read as 0x00 - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_command_register(uint8_t command_reg, struct bma4_dev *dev); - -/*! - * @brief This API sets the I2C device address of auxiliary sensor - * - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_i2c_device_addr(struct bma4_dev *dev); - -/*! - * @brief This API sets the register access on MAG_IF[2], MAG_IF[3], - * MAG_IF[4] in the sensor. This implies that the DATA registers are - * not updated with Mag values automatically. - * - * @param[in] mag_manual : Variable used to specify the Mag manual - * enable status. - * value | mag manual - * ---------|-------------------- - * 0x01 | BMA4_ENABLE - * 0x00 | BMA4_DISABLE - * - * @param[out] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_mag_manual_enable(uint8_t mag_manual, struct bma4_dev *dev); - -/*! - * @brief This API checks whether the Mag access is done manually or - * automatically in the sensor. - * If the Mag access is done through manual mode then Mag data registers - * in sensor are not updated automatically. - * - * @param[out] mag_manual : Mag manual enable value - * value | mag_manual - * --------|------------------- - * 0x01 | BMA4_ENABLE - * 0x00 | BMA4_DISABLE - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_mag_manual_enable(uint8_t *mag_manual, struct bma4_dev *dev); - -/*! - * @brief This API sets the I2C interface configuration(if) mode - * for auxiliary Mag. - * - * @param[in] if_mode : The value of interface configuration mode - * Value | Description - * ------------|------------------------------------------- - * 0 | p_auto_s_off Auxiliary interface:off - * 1 | p_auto_s_mag Auxiliary interface:on - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_aux_if_mode(uint8_t if_mode, struct bma4_dev *dev); - -/*! - * @brief This API gets the address of the register of Aux Mag sensor - * where the data to be read. - * - * @param[out] mag_read_addr : Pointer variable used to store the - * mag read address. - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_mag_read_addr(uint8_t *mag_read_addr, struct bma4_dev *dev); - -/*! - * @brief This API sets the address of the register of Aux Mag sensor - * where the data to be read. - * - * @param[in] mag_read_addr: Value of Mag. read address in order to read - * the data from the auxiliary Mag. - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_mag_read_addr(uint8_t mag_read_addr, struct bma4_dev *dev); - -/*! - * @brief This API gets the Aux Mag write address from the sensor. - * Mag write address is where the Mag data will be written. - * - * @param[out] mag_write_addr: Pointer used to store the Mag write address - * which is read from the sensor. - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_mag_write_addr(uint8_t *mag_write_addr, struct bma4_dev *dev); - -/*! - * @brief This API sets the Aux Mag write address in the sensor. - * Mag write address is where the Mag data will be written. - * - * @param[in] mag_write_addr: Write address of Mag where the data will - * be written. - * @param[out] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_mag_write_addr(uint8_t mag_write_addr, struct bma4_dev *dev); - -/*! - * @brief This API reads the data from the sensor which is written to the - * Mag. - * - * @param[out] mag_write_data: Pointer variable which stores the - * data which is written in Mag through sensor. - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_mag_write_data(uint8_t *mag_write_data, struct bma4_dev *dev); - -/*! - * @brief This API sets the data in the sensor which in turn will - * be written to Mag. - * - * @param[in] mag_write_data: variable which specify the data which is to - * be written in Mag. - * @param[out] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_mag_write_data(uint8_t mag_write_data, struct bma4_dev *dev); - -/*! - * @brief This API reads the x,y,z and r axis data from the auxiliary - * Mag BMM150/AKM9916 sensor. - * - * @param[out] mag : Pointer variable to store the auxiliary Mag x,y,z - * and r axis data read from the sensor. - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_read_mag_xyzr(struct bma4_mag_xyzr *mag, struct bma4_dev *dev); - -/*! - * @brief This API sets the burst data length (1,2,6,8 byte) of auxiliary - * Mag sensor. - * - * @param[in] mag_burst : Variable used to specify the Mag burst read length - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_mag_burst(uint8_t mag_burst, struct bma4_dev *dev); - -/*! - * @brief This API reads the burst data length of Mag set in the sensor. - * - * @param[out] mag_burst : Pointer variable used to store the burst length - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_mag_burst(uint8_t *mag_burst, struct bma4_dev *dev); - -/*! - * @brief This API reads the FIFO data of Accel and/or Mag sensor - * - * @param dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_read_fifo_data(struct bma4_dev *dev); - -/*! - * @brief This API reads the FIFO water mark level which is set - * in the sensor. - * - * @note The FIFO watermark is issued when the FIFO fill level is - * equal or above the watermark level. - * - * @param[out] fifo_wm : Pointer variable to store FIFO water mark level - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_fifo_wm(uint16_t *fifo_wm, struct bma4_dev *dev); - -/*! - * @brief This API sets the FIFO watermark level in the sensor. - * - * @note The FIFO watermark is issued when the FIFO fill level is - * equal or above the watermark level. - * - * @param[in] fifo_wm : Variable used to set the FIFO water mark level - * @param[out] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_fifo_wm(uint16_t fifo_wm, struct bma4_dev *dev); - -/*! - * @brief This API checks whether the Accel FIFO data is set for filtered - * or unfiltered mode. - * - * @param[out] accel_fifo_filter : Variable used to check whether the Accel - * data is filtered or unfiltered. - * Value | accel_fifo_filter - * ---------|------------------------- - * 0x00 | Unfiltered data - * 0x01 | Filtered data - * @param[in] dev : structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_accel_fifo_filter_data(uint8_t *accel_fifo_filter, struct bma4_dev *dev); - -/*! - * @brief This API sets the condition of Accel FIFO data either to - * filtered or unfiltered mode. - * - * @param[in] accel_fifo_filter : Variable used to set the filtered or - * unfiltered condition of Accel FIFO data. - * value | accel_fifo_filter_data - * -----------|------------------------- - * 0x00 | Unfiltered data - * 0x01 | Filtered data - * @param[out] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_accel_fifo_filter_data(uint8_t accel_fifo_filter, struct bma4_dev *dev); - -/*! - * @brief This API reads the down sampling rates which is configured - * for Accel FIFO data. - * - * @param[out] fifo_down : Variable used to specify the Accel FIFO - * down-sampling rates - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_fifo_down_accel(uint8_t *fifo_down, struct bma4_dev *dev); - -/*! - * @brief This API sets the down-sampling rates for Accel FIFO. - * - * @param[in] fifo_down : Variable used to specify the Accel FIFO - * down-sampling rates. - * @param[in] dev : structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_fifo_down_accel(uint8_t fifo_down, struct bma4_dev *dev); - -/*! - * @brief This API reads the length of FIFO data available in the sensor - * in the units of bytes. - * - * @note This byte counter is updated each time a complete frame was read - * or written - * - * @param[in] fifo_length : Pointer variable used to store the value of - * fifo byte counter - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_fifo_length(uint16_t *fifo_length, struct bma4_dev *dev); - -/*! - * @brief This API aligns and compensates the Mag data of BMM150/AKM9916 - * sensor. - * - * @param[in] mag_fifo_data: Structure object which stores the Mag x,yand z - * axis FIFO data which is to be aligned and/or compensated. - * @param[in] mag_second_if: Variable used to select the Mag sensor. - * Value | mag_second_if - * --------|---------------------- - * 1 | BMA4_SEC_IF_BMM150 - * 2 | BMA4_SEC_IF_AKM09916 - * - * @param[out] compensated_mag_data: Pointer variable used to store the - * compensated Mag xyz axis data - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_second_if_mag_compensate_xyz(struct bma4_mag_fifo_data mag_fifo_data, - uint8_t mag_second_if, - struct bma4_mag *compensated_mag_data); - -/*! - * @brief This API reads Mag. x,y and z axis data from either BMM150 or - * AKM9916 sensor - * - * @param[out] mag : Structure pointer used to store the Mag x,y, and z axis - * data read from the sensor. - * - * @param[in] sensor_select : Variable used to select the Mag sensor - * Value | Sensor - * ---------|---------------------- - * 0 | BMA4_SEC_IF_NULL - * 1 | BMA4_SEC_IF_BMM150 - * 2 | BMA4_SEC_IF_AKM09916 - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_read_mag_xyz(struct bma4_mag *mag, uint8_t sensor_select, struct bma4_dev *dev); - -/*! - * @brief This API reads the auxiliary I2C interface configuration which - * is set in the sensor. - * - * @param[out] if_mode : Pointer variable used to store the auxiliary - * interface configuration. - * Value | Description - * ----- |---------------------------------- - * 0x00 | auxiliary interface:off - * 0x01 | auxiliary interface:on - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_if_mode(uint8_t *if_mode, struct bma4_dev *dev); - -/*! - * @brief This API sets the auxiliary interface configuration in the sensor. - * - * @param[in] if_mode : Variable used to select the auxiliary interface - * configuration. - * Value | Description - * ----- |-------------------------- - * 0x00 | auxiliary interface:off - * 0x01 | auxiliary interface:on - * - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_if_mode(uint8_t if_mode, struct bma4_dev *dev); - -/*! - * @brief This API reads the data ready status of Accel from the sensor. - * @note The status get reset when Accel data register is read. - * - * @param[out] data_rdy : Pointer variable to store the data ready status - * @param[in] dev : structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_accel_data_rdy(uint8_t *data_rdy, struct bma4_dev *dev); - -/*! - * @brief This API reads the data ready status of Mag from the sensor. - * The status get reset when Mag data register is read. - * - * @param[out] data_rdy : Pointer variable to store the data ready status - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_mag_data_rdy(uint8_t *data_rdy, struct bma4_dev *dev); - -/*! - * @brief This API reads the ASIC status from the sensor. - * The status information is mentioned in the below table. - * - *@verbatim - ******************************************************************************* - * Status | Description - **************************|**************************************************** - * sleep | ASIC is in sleep/halt state. - * irq_ovrn | Dedicated interrupt is set again before previous - * | interrupt was acknowledged. - * wc_event | Watchcell event detected (ASIC stopped). - * stream_transfer_active | stream transfer has started. - ******************************************************************************* - *@endverbatim - * - * @param[out] asic_status : Structure pointer used to store the ASIC - * status read from the sensor. - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_asic_status(struct bma4_asic_status *asic_status, struct bma4_dev *dev); - -/*! - * @brief This API enables the offset compensation for filtered and - * unfiltered Accel data. - * - * @param[in] offset_en : Variable used to enable or disable offset - * compensation - * offset_en | Description - * ------------|---------------------- - * 0 | BMA4_DISABLE - * 1 | BMA4_ENABLE - * - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_offset_comp(uint8_t offset_en, struct bma4_dev *dev); - -/*! - * @brief This API gets the status of Accel offset compensation - * - * @param[out] offset_en : Pointer variable used to store the Accel offset - * enable or disable status. - * offset_en | Description - * ----------|-------------- - * 0 | BMA4_DISABLE - * 1 | BMA4_ENABLE - * - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_offset_comp(uint8_t *offset_en, struct bma4_dev *dev); - -/*! - * @brief This API parses and extracts the accelerometer frames from - * FIFO data read by the "bma4_read_fifo_data" API and stores it in the - * "accel_data" structure instance. - * - * @note The bma4_extract_accel API should be called only after reading - * the FIFO data by calling the bma4_read_fifo_data() API - * - * @param[in,out] accel_data : Structure instance of bma4_accel where - * the accelerometer data in FIFO is stored. - * @param[in,out] accel_length : Number of accelerometer frames - * (x,y,z axes data) - * @param[in,out] dev : Structure instance of bma4_dev. - * - * @note accel_length has the number of accelerometer frames - * (1 accel frame = 6 bytes) which the user needs to extract and store is - * provided as input parameter by the user and the Number of valid - * accelerometer frames extracted and stored is updated in - * "accel_length" at the end of execution of this API. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_extract_accel(struct bma4_accel *accel_data, uint16_t *accel_length, const struct bma4_dev *dev); - -/*! - * @brief This API parses and extracts the magnetometer frames from - * FIFO data read by the "bma4_read_fifo_data" API and stores it in the - * "mag_data" structure instance parameter of this API - * - * @note The bma4_extract_mag API should be called only after reading - * the FIFO data by calling the bma4_read_fifo_data() API - * - * @param[in,out] mag_data : Structure instance of bma4_mag_xyzr where - * the magnetometer data in FIFO is stored. - * @param[in,out] mag_length : Number of magnetometer frames (x,y,z,r data) - * @param[in,out] dev : Structure instance of bma4_dev. - * - * @note mag_length has the number of magnetometer frames(x,y,z,r data) - * (1 mag frame = 8 bytes) which the user needs to extract and store,It is - * provided as input parameter by the user and the number of valid - * magnetometer frames extracted and stored is updated in - * "mag_length" at the end of execution of this API. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_extract_mag(struct bma4_mag *mag_data, uint16_t *mag_length, const struct bma4_dev *dev); - -/*! - * @brief This API performs Fast Offset Compensation for Accel. - * @param[in] accel_g_value : Array which stores the Accel g units - * for x,y and z axis. - * accel_g_value | Description - * --------------------------|--------------------------------------- - * accel_g_value[0] | x axis g units - * accel_g_value[1] | y axis g units - * accel_g_value[2] | z axis g units - * - * @param[in] dev : structure instance of dev - * - * @note The g-values to be passed to the parameter should be - * multiples of 1000000. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_perform_accel_foc(const int32_t accel_g_value[3], struct bma4_dev *dev); -/*! - * @brief This API checks whether the self test functionality of the sensor - * is working or not - * - * @param[in] result : Pointer variable used to store the result of self test - * operation - * result | Description - * ---------|-------------------- - * 0x00 | BMA4_SELFTEST_PASS - * 0x01 | BMA4_SELFTEST_FAIL - * @param[in] dev : Structure instance of bma4_dev - * - * @return results of self test - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_perform_accel_selftest(uint8_t *result, struct bma4_dev *dev); - -/*! - * @brief This API performs the steps needed for Self test operation - * before reading the Accel Self test data. - * - * @param[in] sign: Variable used to specify the self test sign - * @param[in] dev : Structure instance of bma4_dev - * - * @return results of self test - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_selftest_config(uint8_t sign, struct bma4_dev *dev); - -/*! - * @brief API sets the interrupt to either interrupt1 or - * interrupt2 pin in the sensor. - * - * @param[in] int_line: Variable used to select interrupt pin1 or pin2 - * int_line | interrupt selection - * ---------|------------------- - * 0 | BMA4_INTR1_MAP - * 1 | BMA4_INTR2_MAP - * - * @param[in] int_map: Variable used to select a particular interrupt - * in the sensor - * - * @param[in] enable : Variable used to enable or disable the interrupt - * Value | Behaviour - * ---------|------------------- - * 0x01 | BMA4_ENABLE - * 0x00 | BMA4_DISABLE - * - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_map_interrupt(uint8_t int_line, uint16_t int_map, uint8_t enable, struct bma4_dev *dev); - -/*! - * @brief This API sets the interrupt mode in the sensor. - * - * @param[in] mode: Variable used to specify the interrupt mode which - * is to be set in the sensor. - * Mode | Value - * ----------------------- |--------- - * BMA4_NON_LATCH_MODE | 0 - * BMA4_LATCH_MODE | 1 - * - * @param[in] dev : Structure instance of bma4_dev - * - * @return status of bus communication function - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_interrupt_mode(uint8_t mode, struct bma4_dev *dev); - -/*! - * @brief This API gets the interrupt mode which is set in the sensor. - * - * @param[out] mode: Pointer variable used to store the interrupt mode set in - * in the sensor. - * Mode | Value - * ---------------------|--------------- - * BMA4_NON_LATCH_MODE | 0 - * BMA4_LATCH_MODE | 1 - * - * @param[in] dev : Structure instance of bma4_dev - * - * @return status of bus communication function - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_interrupt_mode(uint8_t *mode, struct bma4_dev *dev); - -/*! - * @brief This API sets the auxiliary Mag(BMM150 or AKM9916) output data - * rate and offset. - * - * @param[in] aux_mag : Pointer to structure variable used to specify - * the auxiliary Mag configuration. - *@verbatim - *------------------------------------------------------------------------------ - * Odr | Value - *----------------------------------------|--------------------------------- - * BMA4_OUTPUT_DATA_RATE_0_78HZ | 0x01 - * BMA4_OUTPUT_DATA_RATE_1_56HZ | 0x02 - * BMA4_OUTPUT_DATA_RATE_3_12HZ | 0x03 - * BMA4_OUTPUT_DATA_RATE_6_25HZ | 0x04 - * BMA4_OUTPUT_DATA_RATE_12_5HZ | 0x05 - * BMA4_OUTPUT_DATA_RATE_25HZ | 0x06 - * BMA4_OUTPUT_DATA_RATE_50HZ | 0x07 - * BMA4_OUTPUT_DATA_RATE_100HZ | 0x08 - * BMA4_OUTPUT_DATA_RATE_200HZ | 0x09 - * BMA4_OUTPUT_DATA_RATE_400HZ | 0x0A - * BMA4_OUTPUT_DATA_RATE_800HZ | 0x0B - * BMA4_OUTPUT_DATA_RATE_1600HZ | 0x0C - *------------------------------------------------------------------------------ - * Offset | Value - *--------------------------------------------|--------------------------------- - * BMA4_MAG_OFFSET_MAX | 0x00 - *--------------------------------------------|--------------------------------- - @endverbatim - * @param[in] dev : Structure instance of bma4_dev - * - * @return status of bus communication function - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_aux_mag_config(const struct bma4_aux_mag_config *aux_mag, struct bma4_dev *dev); - -/*! - * @brief This API reads the auxiliary Mag(BMM150 or AKM9916) output data - * rate and offset. - * @note : Valid output data rates are mentioned in the below table - * - * @param[out] aux_mag : Pointer to structure variable used to store the - * auxiliary Mag configuration read from the sensor - *@verbatim - *------------------------------------------------------------------------ - * Odr | Value - *----------------------------------------|------------------------------- - * BMA4_OUTPUT_DATA_RATE_0_78HZ | 0x01 - * BMA4_OUTPUT_DATA_RATE_1_56HZ | 0x02 - * BMA4_OUTPUT_DATA_RATE_3_12HZ | 0x03 - * BMA4_OUTPUT_DATA_RATE_6_25HZ | 0x04 - * BMA4_OUTPUT_DATA_RATE_12_5HZ | 0x05 - * BMA4_OUTPUT_DATA_RATE_25HZ | 0x06 - * BMA4_OUTPUT_DATA_RATE_50HZ | 0x07 - * BMA4_OUTPUT_DATA_RATE_100HZ | 0x08 - * BMA4_OUTPUT_DATA_RATE_200HZ | 0x09 - * BMA4_OUTPUT_DATA_RATE_400HZ | 0x0A - * BMA4_OUTPUT_DATA_RATE_800HZ | 0x0B - * BMA4_OUTPUT_DATA_RATE_1600HZ | 0x0C - *------------------------------------------------------------------------- - * Offset | Value - *----------------------------------------|-------------------------------- - * BMA4_MAG_OFFSET_MAX | 0x00 - *------------------------------------------------------------------------- - @endverbatim - * @param[in] dev : Structure instance of bma4_dev - * - * @return status of bus communication function - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_aux_mag_config(struct bma4_aux_mag_config *aux_mag, struct bma4_dev *dev); - -/*! @brief This API sets the FIFO configuration in the sensor. - * - * @param[in] config : Enum variable used to specify the FIFO - * configurations which are to be enabled or disabled in the sensor. - * - * @note : User can set either one or more or all FIFO configurations - * by ORing the below mentioned enums. - * config | Value - * ------------------------|--------------------------- - * BMA4_FIFO_STOP_ON_FULL | 0x01 - * BMA4_FIFO_TIME | 0x02 - * BMA4_FIFO_TAG_INTR2 | 0x04 - * BMA4_FIFO_TAG_INTR1 | 0x08 - * BMA4_FIFO_HEADER | 0x10 - * BMA4_FIFO_MAG | 0x20 - * BMA4_FIFO_ACCEL | 0x40 - * BMA4_FIFO_ALL | 0x7F - * - * @param[in] enable : Parameter used to enable or disable the above - * FIFO configuration - * @param[in] dev : Structure instance of bma4_dev. - * - * @return status of bus communication result - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_set_fifo_config(uint8_t config, uint8_t enable, struct bma4_dev *dev); - -/*! @brief This API reads the FIFO configuration from the sensor. - * - * @param[in] fifo_config : Enum variable used to get the below fifo - * configuration from the sensor. - * - * @note After calling this function user should do the AND operation with - * the enum value populated by this function to know which FIFO - * configuration is enabled. - * fifo_config | Value - * -------------------------|-------------------------- - * BMA4_FIFO_STOP_ON_FULL | 0x01 - * BMA4_FIFO_TIME | 0x02 - * BMA4_FIFO_TAG_INTR2 | 0x04 - * BMA4_FIFO_TAG_INTR1 | 0x08 - * BMA4_FIFO_HEADER | 0x10 - * BMA4_FIFO_MAG | 0x20 - * BMA4_FIFO_ACCEL | 0x40 - * BMA4_FIFO_ALL | 0x7F - * - * - * @param[in] dev : Structure instance of bma4_dev - * - * @return status of bus communication function - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_fifo_config(uint8_t *fifo_config, struct bma4_dev *dev); - -/*! @brief This function sets the electrical behaviour of interrupt pin1 or - * pin2 in the sensor. - * - * @param[in] int_pin_config : Pointer to structure variable which specifies - * the configuration data of either interrupt pin1 or 2. - *@verbatim - * ************************************************************************ - * Structure field members | Macros - * ********************************|*************************************** - * edge_ctrl | BMA4_LEVEL_TRIGGER(0) - * | BMA4_EDGE_TRIGGER(1) - * ********************************|*************************************** - * lvl | BMA4_ACTIVE_LOW(0) - * | BMA4_ACTIVE_HIGH(1) - * ********************************|*************************************** - * od | BMA4_PUSH_PULL(0) - * | BMA4_OPEN_DRAIN(1) - * ********************************|*************************************** - * output_en | BMA4_OUTPUT_DISABLE(0) - * | BMA4_OUTPUT_ENABLE(1) - * ********************************|*************************************** - * input_en | BMA4_INPUT_DISABLE(0) - * | BMA4_INPUT_ENABLE(1) - * ************************************************************************ - *@endverbatim - * @param[in] int_line : Variable used to select the interrupt pin1 or - * pin2 for interrupt configuration. - * int_line | Value - * ----------------|---------------------- - * BMA4_INTR1_MAP | 0 - * BMA4_INTR2_MAP | 1 - * - * @param[in] dev : Structure instance of bma4_dev - * - * @return status of bus communication function - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma4_set_int_pin_config(const struct bma4_int_pin_config *int_pin_config, uint8_t int_line, - struct bma4_dev *dev); - -/*! @brief This API reads the electrical behavior of interrupt pin1 or pin2 - * from the sensor. - * - * @param[out] int_pin_config : Pointer to structure variable which stores the - * configuration data of either interrupt pin1 or pin2 read from the sensor - *@verbatim - * ************************************************************************ - * Structure field members | Macros - * ************************|*********************************************** - * edge_ctrl | BMA4_LEVEL_TRIGGER(0) - * | BMA4_EDGE_TRIGGER(1) - * ************************|*********************************************** - * lvl | BMA4_ACTIVE_LOW(0) - * | BMA4_ACTIVE_HIGH(1) - * ************************|*********************************************** - * od | BMA4_PUSH_PULL(0) - * | BMA4_OPEN_DRAIN(1) - * ************************|*********************************************** - * output_en | BMA4_OUTPUT_DISABLE(0) - * | BMA4_OUTPUT_ENABLE(1) - * ************************|*********************************************** - * input_en | BMA4_INPUT_DISABLE(0) - * | BMA4_INPUT_ENABLE(1) - * ************************************************************************ - *@endverbatim - * @param[in] int_line : Variable used to select the interrupt pin1 or - * pin2 for interrupt configuration. - * int_line | Value - * -------------------|--------------- - * BMA4_INTR1_MAP | 0 - * BMA4_INTR2_MAP | 1 - * - * @param[in] dev : Structure instance of bma4_dev - * - * @return status of bus communication function - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_get_int_pin_config(struct bma4_int_pin_config *int_pin_config, uint8_t int_line, struct bma4_dev *dev); - -/*! - * @brief This API reads the Feature and Hardware interrupt status from the sensor. - * - * @param[out] int_status : Variable used to get the interrupt status. - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_read_int_status(uint16_t *int_status, struct bma4_dev *dev); - -/*! - * @brief This API reads the Feature interrupt status from the sensor. - * - * @param[out] int_status_0 : Variable used to get the interrupt status. - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_read_int_status_0(uint8_t *int_status_0, struct bma4_dev *dev); - -/*! - * @brief This API reads the Hardware interrupt status from the sensor. - * - * @param[out] int_status_1 : Variable used to get the interrupt status. - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_read_int_status_1(uint8_t *int_status_1, struct bma4_dev *dev); - -/*! - * @brief This API initializes the auxiliary interface to access - * auxiliary sensor - * - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_aux_interface_init(struct bma4_dev *dev); - -/*! - * @brief This API reads the data from the auxiliary sensor - * - * @param[in] dev : Structure instance of bma4_dev. - * @param[in] len : User specified data length - * @param[out] aux_data : Pointer variable to store data read - * @param[in] aux_reg_addr : Variable to pass address from where - * data is to be read - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_aux_read(uint8_t aux_reg_addr, uint8_t *aux_data, uint16_t len, struct bma4_dev *dev); - -/*! - * @brief This API writes the data into the auxiliary sensor - * - * @param[in] dev : Structure instance of bma4_dev. - * @param[in] len : User specified data length - * @param[out] aux_data : Pointer variable to store data read - * @param[in] aux_reg_addr : Variable to pass address from where - * data is to be written - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - * - */ -uint16_t bma4_aux_write(uint8_t aux_reg_addr, uint8_t *aux_data, uint16_t len, struct bma4_dev *dev); - - -#endif -/* End of __BMA4_H__ */ +/* +* +**************************************************************************** +* Copyright (C) 2015 - 2016 Bosch Sensortec GmbH +* +* File : bma4.h +* +* Date: 12 Oct 2017 +* +* Revision: 2.1.9 $ +* +* Usage: Sensor Driver for BMA4 family of sensors +* +**************************************************************************** +* +* Disclaimer +* +* Common: +* Bosch Sensortec products are developed for the consumer goods industry. +* They may only be used within the parameters of the respective valid +* product data sheet. Bosch Sensortec products are provided with the +* express understanding that there is no warranty of fitness for a +* particular purpose.They are not fit for use in life-sustaining, +* safety or security sensitive systems or any system or device +* that may lead to bodily harm or property damage if the system +* or device malfunctions. In addition,Bosch Sensortec products are +* not fit for use in products which interact with motor vehicle systems. +* The resale and or use of products are at the purchasers own risk and +* his own responsibility. The examination of fitness for the intended use +* is the sole responsibility of the Purchaser. +* +* The purchaser shall indemnify Bosch Sensortec from all third party +* claims, including any claims for incidental, or consequential damages, +* arising from any product use not covered by the parameters of +* the respective valid product data sheet or not approved by +* Bosch Sensortec and reimburse Bosch Sensortec for all costs in +* connection with such claims. +* +* The purchaser must monitor the market for the purchased products, +* particularly with regard to product safety and inform Bosch Sensortec +* without delay of all security relevant incidents. +* +* Engineering Samples are marked with an asterisk (*) or (e). +* Samples may vary from the valid technical specifications of the product +* series. They are therefore not intended or fit for resale to third +* parties or for use in end products. Their sole purpose is internal +* client testing. The testing of an engineering sample may in no way +* replace the testing of a product series. Bosch Sensortec assumes +* no liability for the use of engineering samples. +* By accepting the engineering samples, the Purchaser agrees to indemnify +* Bosch Sensortec from all claims arising from the use of engineering +* samples. +* +* Special: +* This software module (hereinafter called "Software") and any information +* on application-sheets (hereinafter called "Information") is provided +* free of charge for the sole purpose to support your application work. +* The Software and Information is subject to the following +* terms and conditions: +* +* The Software is specifically designed for the exclusive use for +* Bosch Sensortec products by personnel who have special experience +* and training. Do not use this Software if you do not have the +* proper experience or training. +* +* This Software package is provided `` as is `` and without any expressed +* or implied warranties,including without limitation, the implied warranties +* of merchantability and fitness for a particular purpose. +* +* Bosch Sensortec and their representatives and agents deny any liability +* for the functional impairment +* of this Software in terms of fitness, performance and safety. +* Bosch Sensortec and their representatives and agents shall not be liable +* for any direct or indirect damages or injury, except as +* otherwise stipulated in mandatory applicable law. +* +* The Information provided is believed to be accurate and reliable. +* Bosch Sensortec assumes no responsibility for the consequences of use +* of such Information nor for any infringement of patents or +* other rights of third parties which may result from its use. +* No license is granted by implication or otherwise under any patent or +* patent rights of Bosch. Specifications mentioned in the Information are +* subject to change without notice. +**************************************************************************/ +/*! \file bma4.h + \brief Sensor Driver for BMA4 family of sensors */ +#ifndef BMA4_H__ +#define BMA4_H__ + +/*********************************************************************/ +/* header files */ + +#include "bma4_defs.h" +#ifdef AKM9916 +#include "aux_akm9916.h" +#endif + +#ifdef BMM150 +#include "aux_bmm150.h" +#endif +/*********************************************************************/ +/* (extern) variable declarations */ + +/*********************************************************************/ +/* function prototype declarations */ +/*! + * @brief This API is the entry point. + * Call this API before using all other APIs. + * This API reads the chip-id of the sensor which is the first step to + * verify the sensor and also it configures the read mechanism of SPI and + * I2C interface. + * + * @param[in,out] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + * @note + * While changing the parameter of the bma4 + * consider the following point: + * Changing the reference value of the parameter + * will changes the local copy or local reference + * make sure your changes will not + * affect the reference value of the parameter + * (Better case don't change the reference value of the parameter) + */ +uint16_t bma4_init(struct bma4_dev *dev); + +/*! + * @brief This API is used to write the binary configuration in the sensor + * + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_write_config_file(struct bma4_dev *dev); + +/*! + * @brief This API checks whether the write operation requested is for + * feature config or register write and accordingly writes the data in the + * sensor. + * + * @note user has to disable the advance power save mode in the sensor when + * using this API in burst write mode. + * bma4_set_advance_power_save(BMA4_DISABLE, dev); + * + * @param[in] addr : Register address. + * @param[in] data : Write data buffer + * @param[in] len : No of bytes to write + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma4_write_regs(uint8_t addr, uint8_t *data, uint8_t len, struct bma4_dev *dev); + +/*! + * @brief This API checks whether the read operation requested is for + * feature or register read and accordingly reads the data from the sensor. + * + * @param[in] addr : Register address. + * @param[in] data : Read data buffer. + * @param[in] len : No of bytes to read. + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma4_read_regs(uint8_t addr, uint8_t *data, uint8_t len, struct bma4_dev *dev); + +/*! + * @brief This API reads the error status from the sensor. + * + * Below table mention the types of error which can occur in the sensor + *@verbatim + ************************************************************************* + * Error | Description + *************************|*********************************************** + * | Fatal Error, chip is not in operational + * fatal | state (Boot-, power-system). + * | This flag will be reset only by + * | power-on-reset or soft reset. + *************************|*********************************************** + * cmd | Command execution failed. + *************************|*********************************************** + * | Value Name Description + * error_code | 000 no_error no error + * | 001 acc_err error in + * | ACC_CONF + *************************|*********************************************** + * | Error in FIFO detected: Input data was + * fifo | discarded in stream mode. This flag + * | will be reset when read. + *************************|*********************************************** + * mag | Error in I2C-Master detected. + * | This flag will be reset when read. + ************************************************************************* + *@endverbatim + * + * @param[in,out] err_reg : Pointer to structure variable which stores the + * error status read from the sensor. + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma4_get_error_status(struct bma4_err_reg *err_reg, struct bma4_dev *dev); + +/*! + * @brief This API reads the sensor status from the dev sensor. + * + * Below table lists the sensor status flags + * Status | Description + * ----------------------------|---------------------------------------- + * BMA4_MAG_MAN_OP_ONGOING | Manual Mag. interface operation ongoing + * BMA4_CMD_RDY | Command decoder is ready. + * BMA4_MAG_DATA_RDY | Data ready for Mag. + * BMA4_ACC_DATA_RDY | Data ready for Accel. + * + * @param[in] status : Variable used to store the sensor status flags + * which is read from the sensor. + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_status(uint8_t *status, struct bma4_dev *dev); + +/*! + * @brief This API reads the Accel data for x,y and z axis from the sensor. + * The data units is in LSB format. + * + * @param[in] accel : Variable used to store the Accel data which is read + * from the sensor. + * @param[in] dev : Structure instance of bma4_dev. + * + * @note For setting the Accel configuration use the below function + * bma4_set_accel_config + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_read_accel_xyz(struct bma4_accel *accel, struct bma4_dev *dev); + +/*! + * @brief This API reads the sensor time of Sensor time gets updated + * with every update of data register or FIFO. + * + * @param[in] sensor_time : Pointer variable which stores sensor time + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_sensor_time(uint32_t *sensor_time, struct bma4_dev *dev); + +/*! + * @brief This API reads the chip temperature of sensor. + * @note If Accel and Mag are disabled, the temperature value will be set + * to invalid. + * + * @param[out] temp : Pointer variable which stores the temperature value. + * @param[in] temp_unit : indicates the unit of temperature + * temp_unit | description + * ------------|------------------- + * BMA4_DEG | degrees Celsius + * BMA4_FAHREN | degrees fahrenheit + * BMA4_KELVIN | degrees kelvin + * + * @param[in] dev : Structure instance of bma4_dev. + * + * @note Using a scaling factor of 1000, to obtain integer values, which + * at the user end, are used to get accurate temperature value. + * BMA4_SCALE_FARHAN = 1.8 * 1000, BMA4_SCALE_KELVIN = 273.15 * 1000 + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_temperature(int32_t *temp, uint8_t temp_unit, struct bma4_dev *dev); + +/*! + * @brief This API reads the Output data rate, Bandwidth, perf_mode + * and Range of accel. + * + * @param[in,out] accel : Address of user passed structure which is used + * to store the Accel configurations read from the sensor. + * + * @note Enums and corresponding values for structure parameters like + * Odr, Bandwidth and Range are mentioned in the below tables. + * + * Value | Odr + * -----------|------------------------------------ + * 1 | BMA4_OUTPUT_DATA_RATE_0_78HZ + * 2 | BMA4_OUTPUT_DATA_RATE_1_56HZ + * 3 | BMA4_OUTPUT_DATA_RATE_3_12HZ + * 4 | BMA4_OUTPUT_DATA_RATE_6_25HZ + * 5 | BMA4_OUTPUT_DATA_RATE_12_5HZ + * 6 | BMA4_OUTPUT_DATA_RATE_25HZ + * 7 | BMA4_OUTPUT_DATA_RATE_50HZ + * 8 | BMA4_OUTPUT_DATA_RATE_100HZ + * 9 | BMA4_OUTPUT_DATA_RATE_200HZ + * 10 | BMA4_OUTPUT_DATA_RATE_400HZ + * 11 | BMA4_OUTPUT_DATA_RATE_800HZ + * 12 | BMA4_OUTPUT_DATA_RATE_1600HZ + * + * Value | accel_bw + * ------|-------------------------- + * 0 | BMA4_ACCEL_OSR4_AVG1 + * 1 | BMA4_ACCEL_OSR2_AVG2 + * 2 | BMA4_ACCEL_NORMAL_AVG4 + * 3 | BMA4_ACCEL_CIC_AVG8 + * 4 | BMA4_ACCEL_RES_AVG16 + * 5 | BMA4_ACCEL_RES_AVG32 + * 6 | BMA4_ACCEL_RES_AVG64 + * 7 | BMA4_ACCEL_RES_AVG128 + * + * Value | g_range + * --------|--------------------- + * 0x00 | BMA4_ACCEL_RANGE_2G + * 0x01 | BMA4_ACCEL_RANGE_4G + * 0x02 | BMA4_ACCEL_RANGE_8G + * 0x03 | BMA4_ACCEL_RANGE_16G + * + * @param[in] dev : Structure instance of bma4_dev + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_accel_config(struct bma4_accel_config *accel, struct bma4_dev *dev); + +/*! + * @brief This API sets the output_data_rate, bandwidth, perf_mode + * and range of Accel. + * + * @param[in] accel : Pointer to structure variable which specifies the + * Accel configurations. + * + * @note Enums and corresponding values for structure parameters like + * Odr, Bandwidth and Range are mentioned in the below tables. + * Value | ODR + * --------|----------------------------------------- + * 1 | BMA4_OUTPUT_DATA_RATE_0_78HZ + * 2 | BMA4_OUTPUT_DATA_RATE_1_56HZ + * 3 | BMA4_OUTPUT_DATA_RATE_3_12HZ + * 4 | BMA4_OUTPUT_DATA_RATE_6_25HZ + * 5 | BMA4_OUTPUT_DATA_RATE_12_5HZ + * 6 | BMA4_OUTPUT_DATA_RATE_25HZ + * 7 | BMA4_OUTPUT_DATA_RATE_50HZ + * 8 | BMA4_OUTPUT_DATA_RATE_100HZ + * 9 | BMA4_OUTPUT_DATA_RATE_200HZ + * 10 | BMA4_OUTPUT_DATA_RATE_400HZ + * 11 | BMA4_OUTPUT_DATA_RATE_800HZ + * 12 | BMA4_OUTPUT_DATA_RATE_1600HZ + * + * Value | accel_bw + * ------|-------------------------- + * 0 | BMA4_ACCEL_OSR4_AVG1 + * 1 | BMA4_ACCEL_OSR2_AVG2 + * 2 | BMA4_ACCEL_NORMAL_AVG4 + * 3 | BMA4_ACCEL_CIC_AVG8 + * 4 | BMA4_ACCEL_RES_AVG16 + * 5 | BMA4_ACCEL_RES_AVG32 + * 6 | BMA4_ACCEL_RES_AVG64 + * 7 | BMA4_ACCEL_RES_AVG128 + * + * Value | g_range + * --------|--------------------- + * 0x00 | BMA4_ACCEL_RANGE_2G + * 0x01 | BMA4_ACCEL_RANGE_4G + * 0x02 | BMA4_ACCEL_RANGE_8G + * 0x03 | BMA4_ACCEL_RANGE_16G + * + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_accel_config(const struct bma4_accel_config *accel, struct bma4_dev *dev); + +/*! + * @brief This API sets the advance power save mode in the sensor. + * + * @note If advanced power save is enabled and the Accel and/or + * magnetometer operate in duty cycling mode, the length of the unlatched + * DRDY interrupt pulse is longer than 1/3.2 kHz (312.5 us). + * + * @param[in] adv_pwr_save : The value of advance power save mode + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_advance_power_save(uint8_t adv_pwr_save, + struct bma4_dev *dev); + +/*! + * @brief This API reads the status of advance power save mode + * from the sensor. + * + * @note If the advanced power save is enabled and the Accel and/or + * magnetometer operate in duty cycling mode, the length of the unlatched + * DRDY interrupt pulse is longer than 1/3.2 kHz (312.5 us). + * + * @param[out] adv_pwr_save : The value of advance power save mode + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_advance_power_save(uint8_t *adv_pwr_save, struct bma4_dev *dev); + +/*! + * @brief This API sets the FIFO self wake up functionality in the sensor. + * + * @note Functionality related to FIFO self wake up depends upon the + * advance power save mode. for more info. refer data sheet. + * + * @param[in] fifo_self_wakeup : Variable used to enable or disable + * FIFO self wake up functionality. + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_fifo_self_wakeup(uint8_t fifo_self_wakeup, struct bma4_dev *dev); + +/*! + * @brief This API gets the status of FIFO self wake up functionality from + * the sensor. + * + * @note Functionality related to FIFO self wake up depends upon the + * advance power save mode. for more info. refer data sheet. + * + * @param[out] fifo_self_wake_up : Pointer variable used to store the + * fifo self wake up status. + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_fifo_self_wakeup(uint8_t *fifo_self_wake_up, struct bma4_dev *dev); + +/*! + * @brief This API enables or disables the Accel in the sensor. + * + * @note Before reading Accel data, user should call this API. + * + * @param[in] accel_en : Variable used to enable or disable the Accel. + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_accel_enable(uint8_t accel_en, struct bma4_dev *dev); + +/*! + * @brief This API checks whether Accel is enabled or not in the sensor. + * + * @param[out] accel_en : Pointer variable used to store the Accel enable + * status + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_accel_enable(uint8_t *accel_en, struct bma4_dev *dev); + +/*! + * @brief This API is used to enable or disable auxiliary Mag + * in the sensor. + * + * @note Before reading Mag data, user should call this API. + * + * @param[in] mag_en : Variable used to enable or disable the Mag. + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_mag_enable(uint8_t mag_en, struct bma4_dev *dev); + +/*! + * @brief This API is used to check whether the auxiliary Mag is enabled + * or not in the sensor. + * + * @param[out] mag_en : Pointer variable used to store the enable status of + * Mag in the sensor. + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_mag_enable(uint8_t *mag_en, struct bma4_dev *dev); + +/*! + * @brief This API reads the SPI interface mode which is set for primary + * interface. + * + * @param[out] spi : Pointer variable which stores the SPI mode selection + * Value | Description + * --------|------------------ + * 0 | SPI 4-wire mode + * 1 | SPI 3-wire mode + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_spi_interface(uint8_t *spi, struct bma4_dev *dev); + +/*! + * @brief This API configures the SPI interface Mode for primary interface + * + * @param[in] spi : The value of SPI mode selection + * Value | Description + * --------|------------------ + * 0 | SPI 4-wire mode + * 1 | SPI 3-wire mode + * + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_spi_interface(uint8_t spi, struct bma4_dev *dev); + + /*! + * @brief This API writes the available sensor specific commands + * to the sensor. + * + * @param[in] command_reg : The command to write to the command register. + *@verbatim + * value | Description + * --------|------------------------------------------------------ + * 0xB6 | Triggers a soft reset + * 0xB0 | Clears all data in the FIFO, does not change + * | FIFO_CONFIG and FIFO_DOWNS registers + * 0xF0 | Reset acceleration data path + *@endverbatim + * @param[in] dev : Structure instance of bma4_dev. + * + * @note Register will always read as 0x00 + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_command_register(uint8_t command_reg, struct bma4_dev *dev); + +/*! + * @brief This API sets the I2C device address of auxiliary sensor + * + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_i2c_device_addr(struct bma4_dev *dev); + +/*! + * @brief This API sets the register access on MAG_IF[2], MAG_IF[3], + * MAG_IF[4] in the sensor. This implies that the DATA registers are + * not updated with Mag values automatically. + * + * @param[in] mag_manual : Variable used to specify the Mag manual + * enable status. + * value | mag manual + * ---------|-------------------- + * 0x01 | BMA4_ENABLE + * 0x00 | BMA4_DISABLE + * + * @param[out] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_mag_manual_enable(uint8_t mag_manual, struct bma4_dev *dev); + +/*! + * @brief This API checks whether the Mag access is done manually or + * automatically in the sensor. + * If the Mag access is done through manual mode then Mag data registers + * in sensor are not updated automatically. + * + * @param[out] mag_manual : Mag manual enable value + * value | mag_manual + * --------|------------------- + * 0x01 | BMA4_ENABLE + * 0x00 | BMA4_DISABLE + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_mag_manual_enable(uint8_t *mag_manual, struct bma4_dev *dev); + +/*! + * @brief This API sets the I2C interface configuration(if) mode + * for auxiliary Mag. + * + * @param[in] if_mode : The value of interface configuration mode + * Value | Description + * ------------|------------------------------------------- + * 0 | p_auto_s_off Auxiliary interface:off + * 1 | p_auto_s_mag Auxiliary interface:on + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_aux_if_mode(uint8_t if_mode, struct bma4_dev *dev); + +/*! + * @brief This API gets the address of the register of Aux Mag sensor + * where the data to be read. + * + * @param[out] mag_read_addr : Pointer variable used to store the + * mag read address. + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_mag_read_addr(uint8_t *mag_read_addr, struct bma4_dev *dev); + +/*! + * @brief This API sets the address of the register of Aux Mag sensor + * where the data to be read. + * + * @param[in] mag_read_addr: Value of Mag. read address in order to read + * the data from the auxiliary Mag. + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_mag_read_addr(uint8_t mag_read_addr, struct bma4_dev *dev); + +/*! + * @brief This API gets the Aux Mag write address from the sensor. + * Mag write address is where the Mag data will be written. + * + * @param[out] mag_write_addr: Pointer used to store the Mag write address + * which is read from the sensor. + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_mag_write_addr(uint8_t *mag_write_addr, struct bma4_dev *dev); + +/*! + * @brief This API sets the Aux Mag write address in the sensor. + * Mag write address is where the Mag data will be written. + * + * @param[in] mag_write_addr: Write address of Mag where the data will + * be written. + * @param[out] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_mag_write_addr(uint8_t mag_write_addr, struct bma4_dev *dev); + +/*! + * @brief This API reads the data from the sensor which is written to the + * Mag. + * + * @param[out] mag_write_data: Pointer variable which stores the + * data which is written in Mag through sensor. + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_mag_write_data(uint8_t *mag_write_data, struct bma4_dev *dev); + +/*! + * @brief This API sets the data in the sensor which in turn will + * be written to Mag. + * + * @param[in] mag_write_data: variable which specify the data which is to + * be written in Mag. + * @param[out] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_mag_write_data(uint8_t mag_write_data, struct bma4_dev *dev); + +/*! + * @brief This API reads the x,y,z and r axis data from the auxiliary + * Mag BMM150/AKM9916 sensor. + * + * @param[out] mag : Pointer variable to store the auxiliary Mag x,y,z + * and r axis data read from the sensor. + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_read_mag_xyzr(struct bma4_mag_xyzr *mag, struct bma4_dev *dev); + +/*! + * @brief This API sets the burst data length (1,2,6,8 byte) of auxiliary + * Mag sensor. + * + * @param[in] mag_burst : Variable used to specify the Mag burst read length + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_mag_burst(uint8_t mag_burst, struct bma4_dev *dev); + +/*! + * @brief This API reads the burst data length of Mag set in the sensor. + * + * @param[out] mag_burst : Pointer variable used to store the burst length + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_mag_burst(uint8_t *mag_burst, struct bma4_dev *dev); + +/*! + * @brief This API reads the FIFO data of Accel and/or Mag sensor + * + * @param dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_read_fifo_data(struct bma4_dev *dev); + +/*! + * @brief This API reads the FIFO water mark level which is set + * in the sensor. + * + * @note The FIFO watermark is issued when the FIFO fill level is + * equal or above the watermark level. + * + * @param[out] fifo_wm : Pointer variable to store FIFO water mark level + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_fifo_wm(uint16_t *fifo_wm, struct bma4_dev *dev); + +/*! + * @brief This API sets the FIFO watermark level in the sensor. + * + * @note The FIFO watermark is issued when the FIFO fill level is + * equal or above the watermark level. + * + * @param[in] fifo_wm : Variable used to set the FIFO water mark level + * @param[out] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_fifo_wm(uint16_t fifo_wm, struct bma4_dev *dev); + +/*! + * @brief This API checks whether the Accel FIFO data is set for filtered + * or unfiltered mode. + * + * @param[out] accel_fifo_filter : Variable used to check whether the Accel + * data is filtered or unfiltered. + * Value | accel_fifo_filter + * ---------|------------------------- + * 0x00 | Unfiltered data + * 0x01 | Filtered data + * @param[in] dev : structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_accel_fifo_filter_data(uint8_t *accel_fifo_filter, struct bma4_dev *dev); + +/*! + * @brief This API sets the condition of Accel FIFO data either to + * filtered or unfiltered mode. + * + * @param[in] accel_fifo_filter : Variable used to set the filtered or + * unfiltered condition of Accel FIFO data. + * value | accel_fifo_filter_data + * -----------|------------------------- + * 0x00 | Unfiltered data + * 0x01 | Filtered data + * @param[out] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_accel_fifo_filter_data(uint8_t accel_fifo_filter, struct bma4_dev *dev); + +/*! + * @brief This API reads the down sampling rates which is configured + * for Accel FIFO data. + * + * @param[out] fifo_down : Variable used to specify the Accel FIFO + * down-sampling rates + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_fifo_down_accel(uint8_t *fifo_down, struct bma4_dev *dev); + +/*! + * @brief This API sets the down-sampling rates for Accel FIFO. + * + * @param[in] fifo_down : Variable used to specify the Accel FIFO + * down-sampling rates. + * @param[in] dev : structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_fifo_down_accel(uint8_t fifo_down, struct bma4_dev *dev); + +/*! + * @brief This API reads the length of FIFO data available in the sensor + * in the units of bytes. + * + * @note This byte counter is updated each time a complete frame was read + * or written + * + * @param[in] fifo_length : Pointer variable used to store the value of + * fifo byte counter + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_fifo_length(uint16_t *fifo_length, struct bma4_dev *dev); + +/*! + * @brief This API aligns and compensates the Mag data of BMM150/AKM9916 + * sensor. + * + * @param[in] mag_fifo_data: Structure object which stores the Mag x,yand z + * axis FIFO data which is to be aligned and/or compensated. + * @param[in] mag_second_if: Variable used to select the Mag sensor. + * Value | mag_second_if + * --------|---------------------- + * 1 | BMA4_SEC_IF_BMM150 + * 2 | BMA4_SEC_IF_AKM09916 + * + * @param[out] compensated_mag_data: Pointer variable used to store the + * compensated Mag xyz axis data + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_second_if_mag_compensate_xyz(struct bma4_mag_fifo_data mag_fifo_data, + uint8_t mag_second_if, + struct bma4_mag *compensated_mag_data); + +/*! + * @brief This API reads Mag. x,y and z axis data from either BMM150 or + * AKM9916 sensor + * + * @param[out] mag : Structure pointer used to store the Mag x,y, and z axis + * data read from the sensor. + * + * @param[in] sensor_select : Variable used to select the Mag sensor + * Value | Sensor + * ---------|---------------------- + * 0 | BMA4_SEC_IF_NULL + * 1 | BMA4_SEC_IF_BMM150 + * 2 | BMA4_SEC_IF_AKM09916 + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_read_mag_xyz(struct bma4_mag *mag, uint8_t sensor_select, struct bma4_dev *dev); + +/*! + * @brief This API reads the auxiliary I2C interface configuration which + * is set in the sensor. + * + * @param[out] if_mode : Pointer variable used to store the auxiliary + * interface configuration. + * Value | Description + * ----- |---------------------------------- + * 0x00 | auxiliary interface:off + * 0x01 | auxiliary interface:on + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_if_mode(uint8_t *if_mode, struct bma4_dev *dev); + +/*! + * @brief This API sets the auxiliary interface configuration in the sensor. + * + * @param[in] if_mode : Variable used to select the auxiliary interface + * configuration. + * Value | Description + * ----- |-------------------------- + * 0x00 | auxiliary interface:off + * 0x01 | auxiliary interface:on + * + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_if_mode(uint8_t if_mode, struct bma4_dev *dev); + +/*! + * @brief This API reads the data ready status of Accel from the sensor. + * @note The status get reset when Accel data register is read. + * + * @param[out] data_rdy : Pointer variable to store the data ready status + * @param[in] dev : structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_accel_data_rdy(uint8_t *data_rdy, struct bma4_dev *dev); + +/*! + * @brief This API reads the data ready status of Mag from the sensor. + * The status get reset when Mag data register is read. + * + * @param[out] data_rdy : Pointer variable to store the data ready status + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_mag_data_rdy(uint8_t *data_rdy, struct bma4_dev *dev); + +/*! + * @brief This API reads the ASIC status from the sensor. + * The status information is mentioned in the below table. + * + *@verbatim + ******************************************************************************* + * Status | Description + **************************|**************************************************** + * sleep | ASIC is in sleep/halt state. + * irq_ovrn | Dedicated interrupt is set again before previous + * | interrupt was acknowledged. + * wc_event | Watchcell event detected (ASIC stopped). + * stream_transfer_active | stream transfer has started. + ******************************************************************************* + *@endverbatim + * + * @param[out] asic_status : Structure pointer used to store the ASIC + * status read from the sensor. + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_asic_status(struct bma4_asic_status *asic_status, struct bma4_dev *dev); + +/*! + * @brief This API enables the offset compensation for filtered and + * unfiltered Accel data. + * + * @param[in] offset_en : Variable used to enable or disable offset + * compensation + * offset_en | Description + * ------------|---------------------- + * 0 | BMA4_DISABLE + * 1 | BMA4_ENABLE + * + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_offset_comp(uint8_t offset_en, struct bma4_dev *dev); + +/*! + * @brief This API gets the status of Accel offset compensation + * + * @param[out] offset_en : Pointer variable used to store the Accel offset + * enable or disable status. + * offset_en | Description + * ----------|-------------- + * 0 | BMA4_DISABLE + * 1 | BMA4_ENABLE + * + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_offset_comp(uint8_t *offset_en, struct bma4_dev *dev); + +/*! + * @brief This API parses and extracts the accelerometer frames from + * FIFO data read by the "bma4_read_fifo_data" API and stores it in the + * "accel_data" structure instance. + * + * @note The bma4_extract_accel API should be called only after reading + * the FIFO data by calling the bma4_read_fifo_data() API + * + * @param[in,out] accel_data : Structure instance of bma4_accel where + * the accelerometer data in FIFO is stored. + * @param[in,out] accel_length : Number of accelerometer frames + * (x,y,z axes data) + * @param[in,out] dev : Structure instance of bma4_dev. + * + * @note accel_length has the number of accelerometer frames + * (1 accel frame = 6 bytes) which the user needs to extract and store is + * provided as input parameter by the user and the Number of valid + * accelerometer frames extracted and stored is updated in + * "accel_length" at the end of execution of this API. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_extract_accel(struct bma4_accel *accel_data, uint16_t *accel_length, const struct bma4_dev *dev); + +/*! + * @brief This API parses and extracts the magnetometer frames from + * FIFO data read by the "bma4_read_fifo_data" API and stores it in the + * "mag_data" structure instance parameter of this API + * + * @note The bma4_extract_mag API should be called only after reading + * the FIFO data by calling the bma4_read_fifo_data() API + * + * @param[in,out] mag_data : Structure instance of bma4_mag_xyzr where + * the magnetometer data in FIFO is stored. + * @param[in,out] mag_length : Number of magnetometer frames (x,y,z,r data) + * @param[in,out] dev : Structure instance of bma4_dev. + * + * @note mag_length has the number of magnetometer frames(x,y,z,r data) + * (1 mag frame = 8 bytes) which the user needs to extract and store,It is + * provided as input parameter by the user and the number of valid + * magnetometer frames extracted and stored is updated in + * "mag_length" at the end of execution of this API. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_extract_mag(struct bma4_mag *mag_data, uint16_t *mag_length, const struct bma4_dev *dev); + +/*! + * @brief This API performs Fast Offset Compensation for Accel. + * @param[in] accel_g_value : Array which stores the Accel g units + * for x,y and z axis. + * accel_g_value | Description + * --------------------------|--------------------------------------- + * accel_g_value[0] | x axis g units + * accel_g_value[1] | y axis g units + * accel_g_value[2] | z axis g units + * + * @param[in] dev : structure instance of dev + * + * @note The g-values to be passed to the parameter should be + * multiples of 1000000. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_perform_accel_foc(const int32_t accel_g_value[3], struct bma4_dev *dev); +/*! + * @brief This API checks whether the self test functionality of the sensor + * is working or not + * + * @param[in] result : Pointer variable used to store the result of self test + * operation + * result | Description + * ---------|-------------------- + * 0x00 | BMA4_SELFTEST_PASS + * 0x01 | BMA4_SELFTEST_FAIL + * @param[in] dev : Structure instance of bma4_dev + * + * @return results of self test + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_perform_accel_selftest(uint8_t *result, struct bma4_dev *dev); + +/*! + * @brief This API performs the steps needed for Self test operation + * before reading the Accel Self test data. + * + * @param[in] sign: Variable used to specify the self test sign + * @param[in] dev : Structure instance of bma4_dev + * + * @return results of self test + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_selftest_config(uint8_t sign, struct bma4_dev *dev); + +/*! + * @brief API sets the interrupt to either interrupt1 or + * interrupt2 pin in the sensor. + * + * @param[in] int_line: Variable used to select interrupt pin1 or pin2 + * int_line | interrupt selection + * ---------|------------------- + * 0 | BMA4_INTR1_MAP + * 1 | BMA4_INTR2_MAP + * + * @param[in] int_map: Variable used to select a particular interrupt + * in the sensor + * + * @param[in] enable : Variable used to enable or disable the interrupt + * Value | Behaviour + * ---------|------------------- + * 0x01 | BMA4_ENABLE + * 0x00 | BMA4_DISABLE + * + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_map_interrupt(uint8_t int_line, uint16_t int_map, uint8_t enable, struct bma4_dev *dev); + +/*! + * @brief This API sets the interrupt mode in the sensor. + * + * @param[in] mode: Variable used to specify the interrupt mode which + * is to be set in the sensor. + * Mode | Value + * ----------------------- |--------- + * BMA4_NON_LATCH_MODE | 0 + * BMA4_LATCH_MODE | 1 + * + * @param[in] dev : Structure instance of bma4_dev + * + * @return status of bus communication function + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_interrupt_mode(uint8_t mode, struct bma4_dev *dev); + +/*! + * @brief This API gets the interrupt mode which is set in the sensor. + * + * @param[out] mode: Pointer variable used to store the interrupt mode set in + * in the sensor. + * Mode | Value + * ---------------------|--------------- + * BMA4_NON_LATCH_MODE | 0 + * BMA4_LATCH_MODE | 1 + * + * @param[in] dev : Structure instance of bma4_dev + * + * @return status of bus communication function + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_interrupt_mode(uint8_t *mode, struct bma4_dev *dev); + +/*! + * @brief This API sets the auxiliary Mag(BMM150 or AKM9916) output data + * rate and offset. + * + * @param[in] aux_mag : Pointer to structure variable used to specify + * the auxiliary Mag configuration. + *@verbatim + *------------------------------------------------------------------------------ + * Odr | Value + *----------------------------------------|--------------------------------- + * BMA4_OUTPUT_DATA_RATE_0_78HZ | 0x01 + * BMA4_OUTPUT_DATA_RATE_1_56HZ | 0x02 + * BMA4_OUTPUT_DATA_RATE_3_12HZ | 0x03 + * BMA4_OUTPUT_DATA_RATE_6_25HZ | 0x04 + * BMA4_OUTPUT_DATA_RATE_12_5HZ | 0x05 + * BMA4_OUTPUT_DATA_RATE_25HZ | 0x06 + * BMA4_OUTPUT_DATA_RATE_50HZ | 0x07 + * BMA4_OUTPUT_DATA_RATE_100HZ | 0x08 + * BMA4_OUTPUT_DATA_RATE_200HZ | 0x09 + * BMA4_OUTPUT_DATA_RATE_400HZ | 0x0A + * BMA4_OUTPUT_DATA_RATE_800HZ | 0x0B + * BMA4_OUTPUT_DATA_RATE_1600HZ | 0x0C + *------------------------------------------------------------------------------ + * Offset | Value + *--------------------------------------------|--------------------------------- + * BMA4_MAG_OFFSET_MAX | 0x00 + *--------------------------------------------|--------------------------------- + @endverbatim + * @param[in] dev : Structure instance of bma4_dev + * + * @return status of bus communication function + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_aux_mag_config(const struct bma4_aux_mag_config *aux_mag, struct bma4_dev *dev); + +/*! + * @brief This API reads the auxiliary Mag(BMM150 or AKM9916) output data + * rate and offset. + * @note : Valid output data rates are mentioned in the below table + * + * @param[out] aux_mag : Pointer to structure variable used to store the + * auxiliary Mag configuration read from the sensor + *@verbatim + *------------------------------------------------------------------------ + * Odr | Value + *----------------------------------------|------------------------------- + * BMA4_OUTPUT_DATA_RATE_0_78HZ | 0x01 + * BMA4_OUTPUT_DATA_RATE_1_56HZ | 0x02 + * BMA4_OUTPUT_DATA_RATE_3_12HZ | 0x03 + * BMA4_OUTPUT_DATA_RATE_6_25HZ | 0x04 + * BMA4_OUTPUT_DATA_RATE_12_5HZ | 0x05 + * BMA4_OUTPUT_DATA_RATE_25HZ | 0x06 + * BMA4_OUTPUT_DATA_RATE_50HZ | 0x07 + * BMA4_OUTPUT_DATA_RATE_100HZ | 0x08 + * BMA4_OUTPUT_DATA_RATE_200HZ | 0x09 + * BMA4_OUTPUT_DATA_RATE_400HZ | 0x0A + * BMA4_OUTPUT_DATA_RATE_800HZ | 0x0B + * BMA4_OUTPUT_DATA_RATE_1600HZ | 0x0C + *------------------------------------------------------------------------- + * Offset | Value + *----------------------------------------|-------------------------------- + * BMA4_MAG_OFFSET_MAX | 0x00 + *------------------------------------------------------------------------- + @endverbatim + * @param[in] dev : Structure instance of bma4_dev + * + * @return status of bus communication function + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_aux_mag_config(struct bma4_aux_mag_config *aux_mag, struct bma4_dev *dev); + +/*! @brief This API sets the FIFO configuration in the sensor. + * + * @param[in] config : Enum variable used to specify the FIFO + * configurations which are to be enabled or disabled in the sensor. + * + * @note : User can set either one or more or all FIFO configurations + * by ORing the below mentioned enums. + * config | Value + * ------------------------|--------------------------- + * BMA4_FIFO_STOP_ON_FULL | 0x01 + * BMA4_FIFO_TIME | 0x02 + * BMA4_FIFO_TAG_INTR2 | 0x04 + * BMA4_FIFO_TAG_INTR1 | 0x08 + * BMA4_FIFO_HEADER | 0x10 + * BMA4_FIFO_MAG | 0x20 + * BMA4_FIFO_ACCEL | 0x40 + * BMA4_FIFO_ALL | 0x7F + * + * @param[in] enable : Parameter used to enable or disable the above + * FIFO configuration + * @param[in] dev : Structure instance of bma4_dev. + * + * @return status of bus communication result + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_set_fifo_config(uint8_t config, uint8_t enable, struct bma4_dev *dev); + +/*! @brief This API reads the FIFO configuration from the sensor. + * + * @param[in] fifo_config : Enum variable used to get the below fifo + * configuration from the sensor. + * + * @note After calling this function user should do the AND operation with + * the enum value populated by this function to know which FIFO + * configuration is enabled. + * fifo_config | Value + * -------------------------|-------------------------- + * BMA4_FIFO_STOP_ON_FULL | 0x01 + * BMA4_FIFO_TIME | 0x02 + * BMA4_FIFO_TAG_INTR2 | 0x04 + * BMA4_FIFO_TAG_INTR1 | 0x08 + * BMA4_FIFO_HEADER | 0x10 + * BMA4_FIFO_MAG | 0x20 + * BMA4_FIFO_ACCEL | 0x40 + * BMA4_FIFO_ALL | 0x7F + * + * + * @param[in] dev : Structure instance of bma4_dev + * + * @return status of bus communication function + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_fifo_config(uint8_t *fifo_config, struct bma4_dev *dev); + +/*! @brief This function sets the electrical behaviour of interrupt pin1 or + * pin2 in the sensor. + * + * @param[in] int_pin_config : Pointer to structure variable which specifies + * the configuration data of either interrupt pin1 or 2. + *@verbatim + * ************************************************************************ + * Structure field members | Macros + * ********************************|*************************************** + * edge_ctrl | BMA4_LEVEL_TRIGGER(0) + * | BMA4_EDGE_TRIGGER(1) + * ********************************|*************************************** + * lvl | BMA4_ACTIVE_LOW(0) + * | BMA4_ACTIVE_HIGH(1) + * ********************************|*************************************** + * od | BMA4_PUSH_PULL(0) + * | BMA4_OPEN_DRAIN(1) + * ********************************|*************************************** + * output_en | BMA4_OUTPUT_DISABLE(0) + * | BMA4_OUTPUT_ENABLE(1) + * ********************************|*************************************** + * input_en | BMA4_INPUT_DISABLE(0) + * | BMA4_INPUT_ENABLE(1) + * ************************************************************************ + *@endverbatim + * @param[in] int_line : Variable used to select the interrupt pin1 or + * pin2 for interrupt configuration. + * int_line | Value + * ----------------|---------------------- + * BMA4_INTR1_MAP | 0 + * BMA4_INTR2_MAP | 1 + * + * @param[in] dev : Structure instance of bma4_dev + * + * @return status of bus communication function + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma4_set_int_pin_config(const struct bma4_int_pin_config *int_pin_config, uint8_t int_line, + struct bma4_dev *dev); + +/*! @brief This API reads the electrical behavior of interrupt pin1 or pin2 + * from the sensor. + * + * @param[out] int_pin_config : Pointer to structure variable which stores the + * configuration data of either interrupt pin1 or pin2 read from the sensor + *@verbatim + * ************************************************************************ + * Structure field members | Macros + * ************************|*********************************************** + * edge_ctrl | BMA4_LEVEL_TRIGGER(0) + * | BMA4_EDGE_TRIGGER(1) + * ************************|*********************************************** + * lvl | BMA4_ACTIVE_LOW(0) + * | BMA4_ACTIVE_HIGH(1) + * ************************|*********************************************** + * od | BMA4_PUSH_PULL(0) + * | BMA4_OPEN_DRAIN(1) + * ************************|*********************************************** + * output_en | BMA4_OUTPUT_DISABLE(0) + * | BMA4_OUTPUT_ENABLE(1) + * ************************|*********************************************** + * input_en | BMA4_INPUT_DISABLE(0) + * | BMA4_INPUT_ENABLE(1) + * ************************************************************************ + *@endverbatim + * @param[in] int_line : Variable used to select the interrupt pin1 or + * pin2 for interrupt configuration. + * int_line | Value + * -------------------|--------------- + * BMA4_INTR1_MAP | 0 + * BMA4_INTR2_MAP | 1 + * + * @param[in] dev : Structure instance of bma4_dev + * + * @return status of bus communication function + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_get_int_pin_config(struct bma4_int_pin_config *int_pin_config, uint8_t int_line, struct bma4_dev *dev); + +/*! + * @brief This API reads the Feature and Hardware interrupt status from the sensor. + * + * @param[out] int_status : Variable used to get the interrupt status. + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_read_int_status(uint16_t *int_status, struct bma4_dev *dev); + +/*! + * @brief This API reads the Feature interrupt status from the sensor. + * + * @param[out] int_status_0 : Variable used to get the interrupt status. + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_read_int_status_0(uint8_t *int_status_0, struct bma4_dev *dev); + +/*! + * @brief This API reads the Hardware interrupt status from the sensor. + * + * @param[out] int_status_1 : Variable used to get the interrupt status. + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_read_int_status_1(uint8_t *int_status_1, struct bma4_dev *dev); + +/*! + * @brief This API initializes the auxiliary interface to access + * auxiliary sensor + * + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_aux_interface_init(struct bma4_dev *dev); + +/*! + * @brief This API reads the data from the auxiliary sensor + * + * @param[in] dev : Structure instance of bma4_dev. + * @param[in] len : User specified data length + * @param[out] aux_data : Pointer variable to store data read + * @param[in] aux_reg_addr : Variable to pass address from where + * data is to be read + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_aux_read(uint8_t aux_reg_addr, uint8_t *aux_data, uint16_t len, struct bma4_dev *dev); + +/*! + * @brief This API writes the data into the auxiliary sensor + * + * @param[in] dev : Structure instance of bma4_dev. + * @param[in] len : User specified data length + * @param[out] aux_data : Pointer variable to store data read + * @param[in] aux_reg_addr : Variable to pass address from where + * data is to be written + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + * + */ +uint16_t bma4_aux_write(uint8_t aux_reg_addr, uint8_t *aux_data, uint16_t len, struct bma4_dev *dev); + + +#endif +/* End of __BMA4_H__ */ diff --git a/src/bma423.c b/src/bma423.c index 3d5d9c6..2f80240 100644 --- a/src/bma423.c +++ b/src/bma423.c @@ -1,1695 +1,1695 @@ -/**\mainpage -* -**************************************************************************** -* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH -* -* File : bma423.c -* -* Date: 12 Oct 2017 -* -* Revision : 1.1.4 $ -* -* Usage: Sensor Driver for BMA423 sensor -* -**************************************************************************** -* -* \section Disclaimer -* -* Common: -* Bosch Sensortec products are developed for the consumer goods industry. -* They may only be used within the parameters of the respective valid -* product data sheet. Bosch Sensortec products are provided with the -* express understanding that there is no warranty of fitness for a -* particular purpose.They are not fit for use in life-sustaining, -* safety or security sensitive systems or any system or device -* that may lead to bodily harm or property damage if the system -* or device malfunctions. In addition,Bosch Sensortec products are -* not fit for use in products which interact with motor vehicle systems. -* The resale and or use of products are at the purchasers own risk and -* his own responsibility. The examination of fitness for the intended use -* is the sole responsibility of the Purchaser. -* -* The purchaser shall indemnify Bosch Sensortec from all third party -* claims, including any claims for incidental, or consequential damages, -* arising from any product use not covered by the parameters of -* the respective valid product data sheet or not approved by -* Bosch Sensortec and reimburse Bosch Sensortec for all costs in -* connection with such claims. -* -* The purchaser must monitor the market for the purchased products, -* particularly with regard to product safety and inform Bosch Sensortec -* without delay of all security relevant incidents. -* -* Engineering Samples are marked with an asterisk (*) or (e). -* Samples may vary from the valid technical specifications of the product -* series. They are therefore not intended or fit for resale to third -* parties or for use in end products. Their sole purpose is internal -* client testing. The testing of an engineering sample may in no way -* replace the testing of a product series. Bosch Sensortec assumes -* no liability for the use of engineering samples. -* By accepting the engineering samples, the Purchaser agrees to indemnify -* Bosch Sensortec from all claims arising from the use of engineering -* samples. -* -* Special: -* This software module (hereinafter called "Software") and any information -* on application-sheets (hereinafter called "Information") is provided -* free of charge for the sole purpose to support your application work. -* The Software and Information is subject to the following -* terms and conditions: -* -* The Software is specifically designed for the exclusive use for -* Bosch Sensortec products by personnel who have special experience -* and training. Do not use this Software if you do not have the -* proper experience or training. -* -* This Software package is provided `` as is `` and without any expressed -* or implied warranties,including without limitation, the implied warranties -* of merchantability and fitness for a particular purpose. -* -* Bosch Sensortec and their representatives and agents deny any liability -* for the functional impairment -* of this Software in terms of fitness, performance and safety. -* Bosch Sensortec and their representatives and agents shall not be liable -* for any direct or indirect damages or injury, except as -* otherwise stipulated in mandatory applicable law. -* -* The Information provided is believed to be accurate and reliable. -* Bosch Sensortec assumes no responsibility for the consequences of use -* of such Information nor for any infringement of patents or -* other rights of third parties which may result from its use. -* No license is granted by implication or otherwise under any patent or -* patent rights of Bosch. Specifications mentioned in the Information are -* subject to change without notice. -**************************************************************************/ -/*! \file bma423.c - \brief Sensor Driver for BMA423 sensor */ - -#include "bma423.h" - -/**\name Feature configuration file */ -const uint8_t bma423_config_file[] = { - 0x80, 0x2e, 0xfc, 0x00, 0x80, 0x2e, 0xfe, 0x00, 0xc8, 0x2e, 0x00, 0x2e, - 0x80, 0x2e, 0xfa, 0x00, 0x80, 0x2e, 0x23, 0xb1, 0x80, 0x2e, 0xfd, 0x00, - 0x80, 0x2e, 0xfb, 0x00, 0x80, 0x2e, 0x5a, 0xb1, 0x50, 0x39, 0x21, 0x2e, - 0xb0, 0xf0, 0x10, 0x30, 0x21, 0x2e, 0x16, 0xf0, 0x80, 0x2e, 0xfc, 0x01, - 0x5d, 0x50, 0x45, 0x52, 0x01, 0x42, 0x3b, 0x80, 0x41, 0x30, 0x01, 0x42, - 0x3c, 0x80, 0x00, 0x2e, 0x01, 0x40, 0x01, 0x42, 0x21, 0x2e, 0xff, 0xaf, - 0xb8, 0x2e, 0xb6, 0xd6, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0xfd, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x24, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x2e, - 0x99, 0x01, 0x20, 0x26, 0x98, 0x2e, 0xf6, 0x00, 0x98, 0x2e, 0xe9, 0x01, - 0x10, 0x30, 0x21, 0x2e, 0x59, 0xf0, 0x98, 0x2e, 0xd8, 0x00, 0x00, 0x2e, - 0x00, 0x2e, 0xd0, 0x2e, 0x98, 0x2e, 0xdd, 0x00, 0x01, 0x2e, 0x56, 0x00, - 0x00, 0xb2, 0x11, 0x2f, 0x00, 0x30, 0x21, 0x2e, 0x56, 0x00, 0x41, 0x50, - 0x98, 0x2e, 0xcc, 0xb0, 0x41, 0x50, 0x98, 0x2e, 0x8f, 0xb4, 0x01, 0x2e, - 0x03, 0xf0, 0x0d, 0xbc, 0x0f, 0xb8, 0x00, 0x90, 0x02, 0x2f, 0x45, 0x50, - 0x21, 0x2e, 0xbc, 0xf0, 0x01, 0x2e, 0x55, 0x00, 0x00, 0xb2, 0x1a, 0x2f, - 0x00, 0x30, 0x21, 0x2e, 0x55, 0x00, 0x43, 0x50, 0x98, 0x2e, 0xcc, 0xb0, - 0x43, 0x50, 0x98, 0x2e, 0xdc, 0xb1, 0x43, 0x50, 0x98, 0x2e, 0x92, 0xb5, - 0x43, 0x50, 0x98, 0x2e, 0x00, 0xb0, 0x01, 0x2e, 0x1c, 0x01, 0x0f, 0xbc, - 0x0f, 0xb8, 0x00, 0x90, 0x45, 0x50, 0x02, 0x2f, 0x21, 0x2e, 0xbc, 0xf0, - 0x02, 0x2d, 0x21, 0x2e, 0xba, 0xf0, 0x98, 0x2e, 0xd8, 0x00, 0xc3, 0x2d, - 0x01, 0x2e, 0x55, 0xf0, 0xc0, 0x2e, 0x21, 0x2e, 0x55, 0xf0, 0x03, 0x2e, - 0x00, 0xf0, 0x45, 0x54, 0x01, 0x2e, 0x59, 0xf0, 0x4a, 0x0e, 0x02, 0x2f, - 0xf1, 0x33, 0x0d, 0x2c, 0x01, 0x08, 0xf2, 0x30, 0x4a, 0x08, 0x79, 0x84, - 0x82, 0xa2, 0x04, 0x2f, 0x02, 0x34, 0x82, 0x0a, 0x47, 0xa2, 0x03, 0x2c, - 0x10, 0x22, 0x45, 0x52, 0x01, 0x0a, 0xc0, 0x2e, 0x21, 0x2e, 0x59, 0xf0, - 0x00, 0x31, 0xc0, 0x2e, 0x21, 0x2e, 0xba, 0xf0, 0xc8, 0x2e, 0xc8, 0x2e, - 0xc8, 0x2e, 0xc8, 0x2e, 0xc8, 0x2e, 0x44, 0x47, 0xaa, 0x00, 0x05, 0x00, - 0x2d, 0x01, 0xd4, 0x7b, 0x3b, 0x01, 0xdb, 0x7a, 0x04, 0x00, 0x3f, 0x7b, - 0xcd, 0x6c, 0xc3, 0x04, 0x85, 0x09, 0xc3, 0x04, 0xec, 0xe6, 0x0c, 0x46, - 0x01, 0x00, 0x27, 0x00, 0x19, 0x00, 0x96, 0x00, 0xa0, 0x00, 0x01, 0x00, - 0x0c, 0x00, 0xf0, 0x3c, 0x00, 0x01, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x43, 0x28, 0x88, 0x00, - 0x52, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x5b, 0x00, 0x00, 0x40, 0xaf, 0x00, - 0xff, 0x00, 0xff, 0xb7, 0x00, 0x02, 0x00, 0xb0, 0x05, 0x80, 0xb1, 0xf0, - 0xc0, 0x00, 0x00, 0x01, 0x5e, 0xf0, 0x39, 0xf0, 0x89, 0xf0, 0x00, 0x20, - 0xff, 0x7f, 0x7d, 0x00, 0x5e, 0x00, 0x62, 0x00, 0x7c, 0x00, 0xff, 0xfb, - 0x52, 0xf0, 0x56, 0xf0, 0x33, 0x09, 0x33, 0x07, 0x00, 0x08, 0x90, 0x01, - 0x00, 0xf8, 0x67, 0x00, 0x4c, 0x04, 0xa0, 0x00, 0xe8, 0x03, 0x81, 0x00, - 0x82, 0x00, 0x6a, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0xeb, 0x07, 0xae, 0x07, - 0x72, 0x00, 0x6f, 0x00, 0xa1, 0x01, 0x1e, 0x05, 0x47, 0xfd, 0x73, 0x00, - 0x77, 0x00, 0x79, 0x00, 0x76, 0x00, 0xcc, 0x00, 0x30, 0x50, 0x50, 0x40, - 0x00, 0x18, 0x50, 0x40, 0x56, 0x25, 0x47, 0x25, 0x00, 0x18, 0x2e, 0x00, - 0x41, 0x40, 0xa7, 0x02, 0x09, 0x18, 0xc6, 0x00, 0xfb, 0x7f, 0x00, 0x30, - 0x49, 0x52, 0x05, 0x30, 0x05, 0x2c, 0x17, 0x03, 0x1e, 0xbd, 0xd2, 0xba, - 0x92, 0xb8, 0x6a, 0x0b, 0x61, 0x0e, 0xf9, 0x2f, 0x61, 0x1a, 0x01, 0x2f, - 0x5d, 0x0e, 0xf5, 0x2f, 0xd4, 0x7f, 0x02, 0x30, 0x1f, 0x2c, 0xe3, 0x7f, - 0x85, 0x01, 0xd1, 0x03, 0x7c, 0x0e, 0x03, 0x2f, 0x7c, 0x1a, 0x0f, 0x2f, - 0x73, 0x0f, 0x0d, 0x2f, 0xe3, 0x6f, 0xde, 0x04, 0x5f, 0xba, 0x11, 0xbf, - 0xb4, 0x0b, 0xd4, 0x6f, 0x27, 0x07, 0xb3, 0x25, 0xd1, 0xbf, 0xeb, 0x7f, - 0x07, 0x00, 0xb4, 0x25, 0x96, 0x02, 0xdb, 0x7f, 0x2f, 0xbf, 0x9e, 0xbf, - 0x01, 0xb8, 0xd2, 0xba, 0x21, 0xb9, 0x92, 0xb8, 0x06, 0x0a, 0x6f, 0x0b, - 0x40, 0x90, 0xdf, 0x2f, 0x40, 0x91, 0xdd, 0x2f, 0xfb, 0x6f, 0xd0, 0x5f, - 0xb8, 0x2e, 0x57, 0x50, 0x41, 0x30, 0x02, 0x40, 0x51, 0x0a, 0x01, 0x42, - 0x18, 0x82, 0x4b, 0x50, 0x60, 0x42, 0x70, 0x3c, 0x4d, 0x54, 0x42, 0x42, - 0x69, 0x82, 0x82, 0x32, 0x43, 0x40, 0x18, 0x08, 0x02, 0x0a, 0x40, 0x42, - 0x42, 0x80, 0x02, 0x3f, 0x01, 0x40, 0x10, 0x50, 0x4a, 0x08, 0xfb, 0x7f, - 0x11, 0x42, 0x0b, 0x31, 0x0b, 0x42, 0x3e, 0x80, 0x01, 0x32, 0x01, 0x42, - 0x00, 0x2e, 0x01, 0x2e, 0x40, 0xf0, 0x13, 0x90, 0x20, 0x2f, 0x03, 0x30, - 0x51, 0x50, 0x4f, 0x54, 0xf4, 0x34, 0x06, 0x30, 0x55, 0x52, 0x55, 0x32, - 0x1d, 0x1a, 0xe3, 0x22, 0x18, 0x1a, 0x53, 0x58, 0xe3, 0x22, 0x04, 0x30, - 0xd5, 0x40, 0xb5, 0x0d, 0xe1, 0xbe, 0x6f, 0xbb, 0x80, 0x91, 0xa9, 0x0d, - 0x01, 0x89, 0xb5, 0x23, 0x10, 0xa1, 0xf7, 0x2f, 0xda, 0x0e, 0xf4, 0x34, - 0xeb, 0x2f, 0x01, 0x2e, 0x25, 0x00, 0x70, 0x1a, 0x00, 0x30, 0x21, 0x30, - 0x02, 0x2c, 0x08, 0x22, 0x30, 0x30, 0x00, 0xb2, 0x06, 0x2f, 0x21, 0x2e, - 0x59, 0xf0, 0x98, 0x2e, 0xd8, 0x00, 0x00, 0x2e, 0x00, 0x2e, 0xd0, 0x2e, - 0xfb, 0x6f, 0xf0, 0x5f, 0xb8, 0x2e, 0x01, 0x2e, 0xb1, 0xf0, 0x59, 0x52, - 0x01, 0x0a, 0x21, 0x2e, 0xb1, 0xf0, 0x01, 0x2e, 0x1c, 0x01, 0x0f, 0xbc, - 0x0f, 0xb8, 0x00, 0x90, 0x45, 0x50, 0x02, 0x2f, 0xc0, 0x2e, 0x21, 0x2e, - 0xbc, 0xf0, 0xc0, 0x2e, 0x21, 0x2e, 0xba, 0xf0, 0x1a, 0x24, 0x26, 0x00, - 0x80, 0x2e, 0x8f, 0x00, 0x03, 0x2e, 0x01, 0x01, 0x05, 0x2e, 0x01, 0x01, - 0x92, 0xbd, 0x20, 0x50, 0x03, 0x2e, 0x01, 0x01, 0xbf, 0xba, 0x21, 0xbd, - 0x2f, 0xbb, 0x1f, 0xba, 0x40, 0x91, 0xf0, 0x7f, 0x04, 0x2f, 0x80, 0x91, - 0x02, 0x2f, 0x00, 0xb3, 0x90, 0x2e, 0xc7, 0xb0, 0x03, 0x2e, 0x7b, 0x00, - 0x01, 0x80, 0x40, 0x90, 0x14, 0x2f, 0x41, 0x84, 0xf1, 0x6f, 0x25, 0x2e, - 0x7b, 0x00, 0x41, 0x40, 0x23, 0x2e, 0x5a, 0x00, 0x47, 0x52, 0x12, 0x40, - 0x52, 0x42, 0x02, 0x30, 0x00, 0x40, 0x40, 0x42, 0xe0, 0x5f, 0x25, 0x2e, - 0x57, 0x00, 0x25, 0x2e, 0x58, 0x00, 0x25, 0x2e, 0x5d, 0x00, 0xb8, 0x2e, - 0x07, 0x2e, 0x00, 0x01, 0x03, 0x2e, 0x01, 0x01, 0x05, 0x2e, 0x00, 0x01, - 0x24, 0xbd, 0x0f, 0x2e, 0x59, 0x00, 0xb5, 0xbd, 0x93, 0xbc, 0x2f, 0xb9, - 0xb5, 0xb9, 0x93, 0xb8, 0x3a, 0x1a, 0x06, 0x2f, 0x07, 0x30, 0x25, 0x2e, - 0x59, 0x00, 0x2f, 0x2e, 0x57, 0x00, 0x2f, 0x2e, 0x58, 0x00, 0x40, 0xb3, - 0x05, 0x30, 0x07, 0x30, 0x0a, 0x2f, 0xf7, 0x6f, 0xe6, 0x7f, 0x00, 0x2e, - 0xc6, 0x41, 0x0f, 0x2e, 0x5a, 0x00, 0xb7, 0x05, 0x80, 0xa9, 0xee, 0x05, - 0xf7, 0x23, 0xe6, 0x6f, 0x80, 0xb3, 0x06, 0x30, 0x09, 0x2f, 0xe7, 0x7f, - 0x00, 0x2e, 0x06, 0x40, 0x0f, 0x2e, 0x5b, 0x00, 0xb7, 0x05, 0x80, 0xa9, - 0xee, 0x05, 0xb7, 0x23, 0xe7, 0x6f, 0x00, 0xb3, 0x04, 0x30, 0x0b, 0x2f, - 0xf4, 0x6f, 0x02, 0x89, 0xe7, 0x7f, 0x00, 0x2e, 0x04, 0x41, 0x0f, 0x2e, - 0x5c, 0x00, 0x27, 0x05, 0x00, 0xa9, 0xec, 0x05, 0x27, 0x23, 0xe7, 0x6f, - 0x7b, 0x0f, 0x17, 0x30, 0x0b, 0x2f, 0x73, 0x0f, 0x05, 0x30, 0x17, 0x30, - 0x07, 0x2f, 0x63, 0x0f, 0x15, 0x30, 0x17, 0x30, 0x00, 0x2f, 0x07, 0x30, - 0xe3, 0x0e, 0x00, 0x2f, 0x05, 0x30, 0x80, 0x90, 0x05, 0x2e, 0x57, 0x00, - 0x13, 0x30, 0x13, 0x29, 0xf2, 0x6f, 0x47, 0x5c, 0x17, 0x2f, 0xc0, 0x91, - 0x05, 0x30, 0x0b, 0x2f, 0x07, 0x2e, 0x58, 0x00, 0xc1, 0x86, 0x2b, 0x2e, - 0x57, 0x00, 0x59, 0x0e, 0x27, 0x2e, 0x58, 0x00, 0x24, 0x2f, 0x2b, 0x2e, - 0x5d, 0x00, 0x22, 0x2d, 0x61, 0x0e, 0x29, 0x2e, 0x57, 0x00, 0x2b, 0x2e, - 0x58, 0x00, 0x1b, 0x2f, 0x27, 0x2e, 0x5d, 0x00, 0x19, 0x2d, 0x40, 0x91, - 0x05, 0x2f, 0x01, 0x30, 0x23, 0x2e, 0x57, 0x00, 0x23, 0x2e, 0x5d, 0x00, - 0x06, 0x2d, 0x29, 0x2e, 0x57, 0x00, 0x61, 0x0e, 0x01, 0x2f, 0x27, 0x2e, - 0x5d, 0x00, 0x81, 0x40, 0x23, 0x2e, 0x5a, 0x00, 0x30, 0x25, 0x47, 0x52, - 0xd4, 0x40, 0x54, 0x42, 0x00, 0x2e, 0xc3, 0x40, 0x43, 0x42, 0x00, 0x2e, - 0x03, 0x2e, 0x5d, 0x00, 0x40, 0xb2, 0x0d, 0x2f, 0x81, 0x40, 0x23, 0x2e, - 0x5a, 0x00, 0x11, 0x40, 0x91, 0x43, 0x01, 0x34, 0x00, 0x40, 0x80, 0x43, - 0x23, 0x2e, 0x5e, 0xf0, 0x03, 0x2d, 0x00, 0x30, 0x21, 0x2e, 0x7b, 0x00, - 0xe0, 0x5f, 0xb8, 0x2e, 0x50, 0x50, 0xf0, 0x7f, 0x1a, 0x25, 0x13, 0x40, - 0x7b, 0x84, 0xe0, 0x7f, 0x83, 0x42, 0x35, 0x30, 0x11, 0x40, 0x04, 0x40, - 0xc1, 0x7f, 0xd4, 0x7f, 0x86, 0x31, 0x07, 0x2e, 0x59, 0xf0, 0x03, 0x2e, - 0x1f, 0x01, 0x0d, 0x09, 0x02, 0xab, 0x05, 0x30, 0x8e, 0x09, 0x2c, 0x23, - 0xe3, 0xba, 0x42, 0xab, 0x16, 0x30, 0x75, 0x23, 0x59, 0x5c, 0x8e, 0x09, - 0x66, 0xbb, 0x82, 0xab, 0x27, 0x30, 0xbe, 0x23, 0x3e, 0x80, 0x25, 0x1a, - 0x06, 0x2f, 0x2e, 0x1a, 0x04, 0x2f, 0x26, 0x1a, 0x02, 0x2f, 0xf7, 0x3d, - 0x03, 0x2c, 0xdf, 0x08, 0x07, 0x32, 0xdf, 0x0a, 0x14, 0x01, 0x55, 0x01, - 0x04, 0x41, 0x14, 0x42, 0x16, 0x01, 0x42, 0x41, 0x45, 0x30, 0x4d, 0x09, - 0x04, 0x41, 0x12, 0x42, 0x04, 0x42, 0x40, 0xb3, 0x04, 0x2f, 0xf0, 0x6f, - 0x02, 0x30, 0x04, 0x40, 0x94, 0x04, 0x02, 0x42, 0x00, 0x32, 0x08, 0x08, - 0x00, 0xb2, 0x00, 0x30, 0x05, 0x2f, 0xe2, 0x6f, 0x00, 0x2e, 0x84, 0x40, - 0x04, 0x05, 0x84, 0x42, 0x00, 0x2e, 0x5b, 0x54, 0x4a, 0x08, 0x40, 0xb2, - 0xf1, 0x6f, 0x04, 0x2f, 0x42, 0x82, 0x00, 0x2e, 0x42, 0x40, 0x02, 0x04, - 0x40, 0x42, 0xb0, 0x5f, 0x27, 0x2e, 0x59, 0xf0, 0xb8, 0x2e, 0x50, 0x50, - 0xf7, 0x7f, 0x00, 0x2e, 0x0f, 0x2e, 0xb8, 0xf0, 0xf8, 0xbf, 0xff, 0xbb, - 0xc0, 0xb3, 0x2a, 0x2f, 0x0f, 0x2e, 0x01, 0xf0, 0xfe, 0xbf, 0xe6, 0x7f, - 0x7e, 0xbb, 0xd5, 0x7f, 0x37, 0x30, 0x5f, 0x5a, 0xbe, 0x05, 0x67, 0x41, - 0xc4, 0x7f, 0x78, 0xbe, 0x47, 0x41, 0x27, 0x0b, 0xb3, 0x7f, 0xe6, 0x11, - 0x41, 0x56, 0x43, 0x89, 0xd7, 0x42, 0x00, 0x2e, 0x27, 0x41, 0x05, 0x41, - 0xf8, 0xbf, 0x7d, 0x0b, 0x6e, 0x11, 0x03, 0x8f, 0xd5, 0x42, 0x14, 0x30, - 0xe5, 0x41, 0xc7, 0x41, 0xd8, 0xbe, 0x6f, 0x0b, 0x6e, 0x11, 0xc5, 0x42, - 0x29, 0x2e, 0x56, 0x00, 0x45, 0x56, 0x27, 0x2e, 0xb8, 0xf0, 0xe6, 0x6f, - 0xd5, 0x6f, 0xc4, 0x6f, 0xb3, 0x6f, 0xf7, 0x6f, 0xb0, 0x5f, 0xc8, 0x2e, - 0x50, 0x50, 0xe5, 0x7f, 0xd7, 0x7f, 0xf6, 0x7f, 0x36, 0x30, 0x0b, 0x2e, - 0x01, 0xf0, 0xde, 0xbe, 0xde, 0xbb, 0x61, 0x5a, 0xb7, 0x05, 0x67, 0x41, - 0xc4, 0x7f, 0x78, 0xbe, 0x47, 0x41, 0x27, 0x0b, 0xb3, 0x7f, 0xe6, 0x11, - 0x43, 0x56, 0x43, 0x89, 0xd7, 0x42, 0x00, 0x2e, 0x27, 0x41, 0x05, 0x41, - 0xf8, 0xbf, 0x7d, 0x0b, 0x6e, 0x11, 0x03, 0x8f, 0xd5, 0x42, 0x14, 0x30, - 0xe5, 0x41, 0xc7, 0x41, 0xd8, 0xbe, 0x6f, 0x0b, 0x6e, 0x11, 0xc5, 0x42, - 0x29, 0x2e, 0x55, 0x00, 0x03, 0x31, 0x27, 0x2e, 0xb8, 0xf0, 0xf6, 0x6f, - 0xe5, 0x6f, 0xd7, 0x6f, 0xc4, 0x6f, 0xb3, 0x6f, 0xb0, 0x5f, 0xc8, 0x2e, - 0x40, 0x50, 0xf6, 0x7f, 0x1a, 0x18, 0x63, 0x56, 0x33, 0x00, 0x06, 0x30, - 0xfe, 0x03, 0x0e, 0xb8, 0xf2, 0xbf, 0x07, 0x0a, 0x2a, 0x18, 0x63, 0x5a, - 0xb5, 0x01, 0x03, 0x30, 0xfb, 0x03, 0x6e, 0xbb, 0xf2, 0xbf, 0xe1, 0x7f, - 0xf7, 0x0b, 0x56, 0x40, 0x36, 0x25, 0x46, 0x40, 0x06, 0x28, 0xc7, 0x7f, - 0x22, 0x18, 0xd1, 0x7f, 0xb5, 0x00, 0x01, 0x30, 0x39, 0x03, 0x2e, 0xb9, - 0x42, 0xbe, 0x14, 0x0b, 0xf2, 0x6f, 0x10, 0x18, 0xb5, 0x00, 0xb9, 0x03, - 0x2e, 0xb9, 0x62, 0xbf, 0x96, 0x0a, 0xb6, 0x6f, 0x30, 0x18, 0x75, 0x01, - 0xb9, 0x03, 0x5c, 0x28, 0xe2, 0xbf, 0xde, 0xb9, 0xd6, 0x6f, 0xdf, 0x0a, - 0x8a, 0x28, 0xc4, 0x6f, 0x82, 0x43, 0x23, 0x29, 0xe5, 0x6f, 0xc0, 0x2e, - 0x44, 0x43, 0xc0, 0x5f, 0x40, 0x50, 0xd0, 0x7f, 0x4a, 0x17, 0x00, 0x40, - 0x01, 0x18, 0x46, 0x25, 0x07, 0x25, 0x65, 0x56, 0xd9, 0x04, 0x53, 0x18, - 0xeb, 0x18, 0x05, 0x30, 0x49, 0x16, 0x69, 0x06, 0xca, 0x18, 0xa6, 0x00, - 0xc7, 0x02, 0x65, 0x58, 0xcb, 0x7f, 0x98, 0x2e, 0x7f, 0xb6, 0xcb, 0x6f, - 0xd2, 0x6f, 0xc0, 0x2e, 0x80, 0x42, 0xc0, 0x5f, 0x09, 0x2e, 0x1b, 0x01, - 0x05, 0x2e, 0x1b, 0x01, 0xa3, 0xbc, 0x44, 0xbe, 0x90, 0x50, 0x4f, 0xb9, - 0x07, 0x2e, 0x1b, 0x01, 0x4a, 0x25, 0x9f, 0xb8, 0x39, 0x8f, 0xb2, 0xbd, - 0xf2, 0x7f, 0xbf, 0xb9, 0xeb, 0x7f, 0x8a, 0x0a, 0x37, 0x89, 0x0b, 0x30, - 0x93, 0x0a, 0x8b, 0x7f, 0xcb, 0x43, 0x0b, 0x43, 0x80, 0xb2, 0xd3, 0x7f, - 0xc1, 0x7f, 0x90, 0x2e, 0x87, 0xb2, 0x20, 0x25, 0x01, 0x2e, 0x64, 0x00, - 0x01, 0x90, 0x0e, 0x2f, 0x67, 0x52, 0x01, 0x2e, 0x61, 0x00, 0xb4, 0x7f, - 0xa2, 0x7f, 0x98, 0x2e, 0x8d, 0xb2, 0x00, 0x30, 0x21, 0x2e, 0x64, 0x00, - 0xc1, 0x6f, 0xd3, 0x6f, 0xa2, 0x6f, 0xb4, 0x6f, 0x0b, 0x30, 0x01, 0x2e, - 0x1b, 0x01, 0x06, 0xbc, 0x06, 0xbb, 0x57, 0x25, 0x01, 0x2e, 0x1b, 0x01, - 0x94, 0xb1, 0x05, 0xbc, 0xb6, 0x7f, 0x0f, 0xbb, 0x6b, 0x50, 0x80, 0xb3, - 0x0f, 0x2f, 0x0d, 0x2e, 0x1b, 0x01, 0x6f, 0x5e, 0xb7, 0x09, 0x2d, 0x2e, - 0x1b, 0x01, 0x71, 0x5c, 0x69, 0x5e, 0x9b, 0x43, 0x9b, 0x43, 0xdb, 0x43, - 0x9b, 0x43, 0x1b, 0x42, 0xcb, 0x43, 0x0b, 0x42, 0x8b, 0x43, 0x40, 0xb2, - 0x05, 0x2f, 0x69, 0x50, 0x00, 0x2e, 0x16, 0x40, 0x0b, 0x40, 0x76, 0x7f, - 0x8b, 0x7f, 0xcb, 0x0a, 0x01, 0x2e, 0x61, 0x00, 0x67, 0x52, 0x6d, 0x5c, - 0x98, 0x2e, 0xd3, 0xb2, 0x90, 0x6f, 0x00, 0xb2, 0x0b, 0x2f, 0xf0, 0x6f, - 0x00, 0xb2, 0x08, 0x2f, 0x69, 0x58, 0x6b, 0x50, 0x12, 0x41, 0x12, 0x42, - 0x21, 0x30, 0x04, 0x41, 0x04, 0x42, 0x23, 0x2e, 0x5e, 0xf0, 0xc0, 0x6f, - 0x00, 0xb2, 0x26, 0x2f, 0x74, 0x6f, 0x80, 0x6f, 0x71, 0x54, 0x88, 0xbd, - 0xc8, 0xb8, 0x4b, 0x0a, 0x94, 0x42, 0x91, 0x42, 0x90, 0x42, 0x88, 0xba, - 0x69, 0x52, 0xf3, 0x6f, 0x54, 0x42, 0x85, 0x42, 0xc0, 0x90, 0x40, 0x42, - 0x15, 0x2f, 0x6b, 0x52, 0x00, 0x2e, 0x52, 0x40, 0x41, 0x40, 0xa2, 0x04, - 0x41, 0x06, 0x40, 0xaa, 0x04, 0x2f, 0x40, 0x90, 0x0b, 0x2f, 0xb1, 0x6f, - 0x4a, 0x0f, 0x08, 0x2f, 0xb2, 0x6f, 0x80, 0xb2, 0x05, 0x2f, 0x6b, 0x54, - 0x21, 0x30, 0x94, 0x42, 0x80, 0x42, 0x23, 0x2e, 0x5e, 0xf0, 0xd0, 0x6f, - 0x00, 0xb2, 0x13, 0x2f, 0x01, 0x2e, 0x60, 0x00, 0x09, 0x2e, 0x7c, 0x00, - 0x04, 0x1a, 0x0d, 0x2f, 0x73, 0x50, 0x29, 0x2e, 0x60, 0x00, 0x24, 0x42, - 0x44, 0x30, 0x02, 0x40, 0x02, 0x42, 0x09, 0x80, 0x00, 0x2e, 0x04, 0x42, - 0x03, 0x2d, 0x10, 0x30, 0x21, 0x2e, 0x64, 0x00, 0xeb, 0x6f, 0x70, 0x5f, - 0xb8, 0x2e, 0x09, 0x86, 0x49, 0x54, 0xe4, 0x40, 0xc3, 0x80, 0x94, 0x04, - 0xc3, 0x40, 0x13, 0x05, 0x05, 0x40, 0x25, 0x05, 0x8a, 0x17, 0x73, 0x30, - 0x73, 0x09, 0x8c, 0x17, 0xf3, 0x08, 0xe3, 0x00, 0x4c, 0x82, 0x95, 0x00, - 0xb3, 0xb5, 0x23, 0xb5, 0x53, 0x42, 0x52, 0x42, 0x53, 0x42, 0x42, 0x42, - 0x71, 0x82, 0x75, 0x54, 0x52, 0x42, 0x10, 0x50, 0x77, 0x54, 0x52, 0x42, - 0xfb, 0x7f, 0x22, 0x30, 0x79, 0x56, 0x43, 0x42, 0x44, 0x82, 0x0b, 0x30, - 0x52, 0x42, 0x5b, 0x42, 0x7c, 0x84, 0x4b, 0x42, 0x35, 0x82, 0x8c, 0x80, - 0x8b, 0x42, 0x0b, 0x42, 0x39, 0x80, 0x04, 0x30, 0x0b, 0x42, 0x37, 0x80, - 0x15, 0x30, 0x60, 0x25, 0x98, 0x2e, 0xc6, 0xb2, 0x8b, 0x83, 0xfb, 0x6f, - 0x65, 0x42, 0xc0, 0x2e, 0x44, 0x42, 0xf0, 0x5f, 0x05, 0x80, 0x02, 0x30, - 0x51, 0x82, 0x02, 0x42, 0x13, 0x30, 0x41, 0x40, 0x4b, 0x08, 0x7b, 0x54, - 0x3e, 0x80, 0x51, 0x14, 0xc0, 0x2e, 0x01, 0x42, 0x00, 0x2e, 0x40, 0x51, - 0xd1, 0x7f, 0x12, 0x25, 0x02, 0x30, 0x42, 0x43, 0x32, 0x30, 0x82, 0x43, - 0xc6, 0x7f, 0xe5, 0x7f, 0xb4, 0x7f, 0xa3, 0x7f, 0x90, 0x7f, 0x8b, 0x7f, - 0x98, 0x2e, 0x54, 0x01, 0xc0, 0x7e, 0x00, 0xac, 0x01, 0x2f, 0x65, 0x50, - 0xc0, 0x7e, 0x00, 0x2e, 0x90, 0x6f, 0x09, 0x8a, 0xd1, 0x6f, 0x75, 0x7f, - 0x4c, 0x82, 0x63, 0x41, 0x65, 0x7f, 0x11, 0x7f, 0x00, 0x2e, 0x64, 0x41, - 0x44, 0x85, 0x52, 0x7f, 0x45, 0x7f, 0x00, 0x2e, 0xa6, 0x40, 0x80, 0x40, - 0x32, 0x7f, 0x82, 0x8e, 0xc2, 0x6e, 0x45, 0x41, 0xf0, 0x7f, 0x27, 0x7f, - 0x02, 0x7f, 0x98, 0x2e, 0x8a, 0xb1, 0x23, 0x6f, 0xd1, 0x6f, 0xc2, 0x40, - 0xf9, 0x86, 0x23, 0x7f, 0x80, 0xb2, 0xe0, 0x7e, 0x0f, 0x2f, 0x32, 0x6f, - 0x64, 0x6f, 0x82, 0x40, 0xf2, 0x7f, 0x4e, 0x82, 0x42, 0x6f, 0x50, 0x6f, - 0x73, 0x6f, 0x85, 0x40, 0xc3, 0x40, 0x04, 0x41, 0x06, 0x40, 0xe2, 0x6e, - 0x98, 0x2e, 0x8a, 0xb1, 0xe0, 0x7e, 0xf3, 0x31, 0x10, 0x6f, 0x36, 0x80, - 0xe1, 0x6e, 0x02, 0x40, 0x71, 0x7f, 0x51, 0x04, 0x02, 0x30, 0x40, 0xa8, - 0x91, 0x04, 0x4a, 0x22, 0x89, 0x16, 0x93, 0x08, 0x4a, 0x00, 0x95, 0xb4, - 0x09, 0x18, 0x8e, 0x16, 0x13, 0x30, 0x93, 0x08, 0x21, 0x6f, 0x60, 0x7f, - 0x4d, 0x86, 0x02, 0x80, 0xb2, 0x00, 0x41, 0x40, 0x21, 0xb5, 0x50, 0x7f, - 0x43, 0x7f, 0x98, 0x2e, 0xc2, 0xb1, 0x40, 0x6f, 0x62, 0x6f, 0x55, 0x6f, - 0x13, 0x40, 0x84, 0x40, 0x01, 0x40, 0x45, 0x41, 0x42, 0xbe, 0x1d, 0x18, - 0x4c, 0x04, 0x31, 0x0f, 0x04, 0x8a, 0xc0, 0x6f, 0x11, 0x30, 0x02, 0x2f, - 0x00, 0x2e, 0x03, 0x2c, 0x01, 0x42, 0x23, 0x30, 0x03, 0x42, 0x00, 0x2e, - 0xd6, 0x6f, 0x44, 0x41, 0x8a, 0x87, 0x76, 0x8b, 0x00, 0xb3, 0x53, 0x7f, - 0x15, 0x2f, 0x04, 0x6f, 0x7d, 0x5e, 0x8b, 0x8d, 0xe7, 0x01, 0xc0, 0xa5, - 0x84, 0x41, 0x01, 0x2f, 0x00, 0xa1, 0x03, 0x2f, 0xc0, 0xad, 0x08, 0x2f, - 0x00, 0xa5, 0x06, 0x2f, 0xc6, 0x40, 0x81, 0x8d, 0x07, 0x30, 0x3c, 0x05, - 0xd6, 0x42, 0x04, 0x2c, 0xc4, 0x42, 0x02, 0x2c, 0x07, 0x30, 0x07, 0x30, - 0x86, 0x86, 0x94, 0x6f, 0xd7, 0x7e, 0x0e, 0x8d, 0x00, 0x40, 0x74, 0x89, - 0xc7, 0x40, 0x02, 0xb2, 0xf9, 0x29, 0x45, 0x41, 0x86, 0x41, 0xbe, 0x80, - 0x21, 0x41, 0x75, 0x23, 0x82, 0x40, 0xc7, 0x42, 0x45, 0x7f, 0x34, 0x7f, - 0x20, 0x7f, 0x98, 0x2e, 0xc2, 0xb1, 0x31, 0x6f, 0x60, 0x6f, 0x24, 0x6f, - 0x22, 0x40, 0x05, 0x41, 0x43, 0x40, 0x13, 0x01, 0x43, 0x86, 0xac, 0x0f, - 0xd1, 0x6f, 0x30, 0x7f, 0x00, 0x2f, 0x44, 0x42, 0x48, 0x8a, 0x41, 0x88, - 0xe1, 0x40, 0x13, 0x7f, 0x04, 0x7f, 0xf5, 0x7e, 0x98, 0x2e, 0xc2, 0xb1, - 0x11, 0x6f, 0x60, 0x6f, 0x34, 0x6f, 0x42, 0x40, 0x03, 0x40, 0x9a, 0x04, - 0x04, 0x41, 0x43, 0x82, 0xa2, 0x0e, 0x03, 0x6f, 0x00, 0x2f, 0xc2, 0x42, - 0x00, 0x2e, 0x41, 0x40, 0x72, 0x6f, 0x98, 0x2e, 0xc2, 0xb1, 0x25, 0x6f, - 0x72, 0x6f, 0x53, 0x41, 0x93, 0x0e, 0xd1, 0x6f, 0x46, 0x80, 0x1b, 0x30, - 0x03, 0x30, 0x0c, 0x2f, 0x04, 0x40, 0x00, 0x91, 0x42, 0x42, 0x08, 0x2f, - 0xf6, 0x6e, 0x44, 0x6f, 0x86, 0x41, 0xb4, 0x0e, 0x03, 0x2f, 0x02, 0x88, - 0xdb, 0x7e, 0x03, 0x43, 0x0b, 0x42, 0x46, 0x8d, 0x44, 0x41, 0x47, 0x80, - 0x05, 0x6f, 0x94, 0x0f, 0x76, 0x7f, 0x60, 0x7f, 0x02, 0x2f, 0x45, 0x89, - 0x42, 0x43, 0x03, 0x43, 0x49, 0x88, 0xa5, 0x6f, 0x40, 0x91, 0xa4, 0x7f, - 0x15, 0x30, 0xe2, 0x6f, 0xd3, 0x6e, 0x03, 0x2f, 0x04, 0x30, 0x83, 0x42, - 0x80, 0x2e, 0x77, 0xb4, 0x04, 0x40, 0x25, 0x29, 0x04, 0x42, 0x83, 0x42, - 0x45, 0x82, 0x94, 0x6f, 0x04, 0x85, 0xc0, 0xb2, 0x90, 0x2e, 0x63, 0xb4, - 0x15, 0x87, 0x3c, 0x8c, 0xc4, 0x40, 0x46, 0x7f, 0xc2, 0x86, 0x07, 0x40, - 0x86, 0x41, 0xf4, 0xbf, 0x00, 0xb3, 0x0c, 0x2f, 0x90, 0x6f, 0x16, 0x80, - 0x46, 0x25, 0x00, 0x40, 0x57, 0x25, 0x04, 0x18, 0xae, 0x0e, 0x10, 0x30, - 0x06, 0x30, 0x75, 0x25, 0x46, 0x23, 0x60, 0x6f, 0x64, 0x25, 0xc4, 0x40, - 0xfa, 0x86, 0x00, 0xb3, 0x33, 0x7f, 0x09, 0x2f, 0x93, 0x6f, 0xd8, 0x88, - 0x53, 0x6f, 0x04, 0x41, 0xc3, 0x40, 0xdc, 0x0e, 0x13, 0x30, 0x04, 0x30, - 0xdc, 0x22, 0xb3, 0x25, 0x40, 0xb3, 0x02, 0x2f, 0x3b, 0x25, 0xc0, 0x90, - 0x05, 0x2f, 0x91, 0x6f, 0xd0, 0x6f, 0x98, 0x2e, 0xc6, 0xb2, 0x4d, 0x2c, - 0x04, 0x30, 0x8d, 0x88, 0x43, 0x40, 0x82, 0x40, 0x54, 0x7f, 0xda, 0x0f, - 0x04, 0x30, 0x08, 0x2f, 0xc1, 0x80, 0x40, 0x42, 0xc2, 0x0f, 0x02, 0x2f, - 0x00, 0x30, 0xc0, 0x7e, 0x1b, 0x2d, 0xc0, 0x7e, 0x19, 0x2d, 0xe1, 0xbc, - 0x92, 0x6f, 0x4f, 0x04, 0x90, 0x84, 0x40, 0xa8, 0x21, 0x05, 0x83, 0x40, - 0x4c, 0x22, 0x4b, 0x0e, 0xb6, 0x84, 0x21, 0x30, 0x02, 0x2f, 0x11, 0x30, - 0x04, 0x2c, 0xc1, 0x7e, 0xe3, 0x6f, 0xc1, 0x7e, 0xc1, 0x42, 0x00, 0x2e, - 0x00, 0x40, 0x81, 0x40, 0x04, 0xbd, 0x40, 0x6f, 0x98, 0x2e, 0xc2, 0xb1, - 0x50, 0x6f, 0x11, 0x30, 0x02, 0x40, 0x51, 0x08, 0xc3, 0x6e, 0x03, 0x80, - 0x99, 0x15, 0x0b, 0x40, 0xb1, 0x6f, 0xd0, 0x6f, 0xb6, 0x7f, 0x5b, 0x7f, - 0x04, 0x30, 0x4d, 0x54, 0x03, 0x30, 0x11, 0x2c, 0x10, 0x80, 0x55, 0x6f, - 0x06, 0x40, 0x75, 0x01, 0x58, 0xbb, 0x6a, 0x09, 0x05, 0x42, 0xc1, 0x86, - 0x47, 0x40, 0x51, 0x25, 0xbe, 0x01, 0x56, 0x43, 0x00, 0x2e, 0x46, 0x41, - 0xf4, 0x03, 0xb6, 0x6f, 0x47, 0x43, 0x5e, 0x0e, 0xed, 0x2f, 0x31, 0x6f, - 0x60, 0x6f, 0x42, 0x40, 0x15, 0x30, 0x02, 0x82, 0x95, 0x08, 0x04, 0x42, - 0x52, 0x42, 0x02, 0x2c, 0x44, 0x42, 0x04, 0x30, 0x3e, 0x8e, 0x91, 0x6f, - 0x4f, 0x8c, 0x02, 0x40, 0x83, 0x41, 0xb5, 0x8d, 0x93, 0x0e, 0xd0, 0x6f, - 0x01, 0x2f, 0x98, 0x2e, 0xc6, 0xb2, 0x00, 0x2e, 0xc0, 0x41, 0x81, 0x41, - 0xc1, 0x0f, 0xc0, 0x6f, 0x01, 0x2f, 0x04, 0x42, 0x00, 0x2e, 0x70, 0x6f, - 0x3c, 0x82, 0x00, 0x40, 0x41, 0x40, 0x89, 0x16, 0x95, 0x08, 0x4a, 0x00, - 0x04, 0xbc, 0x91, 0xb4, 0x01, 0x0e, 0xe0, 0x6f, 0x07, 0x2f, 0xa1, 0x6f, - 0x00, 0x2e, 0x41, 0x40, 0x40, 0xb2, 0x02, 0x2f, 0xa1, 0x6f, 0x05, 0x42, - 0x44, 0x42, 0x00, 0x2e, 0x8b, 0x6f, 0xc0, 0x5e, 0xb8, 0x2e, 0x03, 0x2e, - 0x1c, 0x01, 0x9c, 0xbc, 0x1d, 0xb9, 0x02, 0x82, 0x25, 0x2e, 0x8e, 0x00, - 0x83, 0x56, 0x13, 0x18, 0x01, 0x2e, 0x66, 0x00, 0x43, 0x40, 0xd8, 0x04, - 0x05, 0x2e, 0x65, 0x00, 0x40, 0x50, 0x27, 0x2e, 0x65, 0x00, 0xfb, 0x7f, - 0xda, 0x05, 0x8b, 0x50, 0x4b, 0x40, 0x02, 0x40, 0x81, 0x82, 0x01, 0x42, - 0x03, 0x80, 0x81, 0x52, 0xb1, 0x00, 0x03, 0x40, 0x3b, 0x82, 0x85, 0x58, - 0x14, 0x01, 0xc0, 0xb2, 0x37, 0x2e, 0x66, 0x00, 0xd1, 0x7f, 0xe2, 0x7f, - 0x04, 0x2f, 0x05, 0x2e, 0x6b, 0x00, 0x81, 0x84, 0x25, 0x2e, 0x6b, 0x00, - 0x62, 0x40, 0x3a, 0x0f, 0x45, 0x40, 0xc1, 0x7f, 0x21, 0x30, 0x12, 0x30, - 0x42, 0x2f, 0x0d, 0x2e, 0x69, 0x00, 0x3e, 0x0e, 0x33, 0x2f, 0x05, 0x2e, - 0x6a, 0x00, 0x01, 0x35, 0x91, 0x0e, 0x01, 0x30, 0x03, 0x2f, 0x09, 0x2e, - 0x6e, 0x00, 0x00, 0xb3, 0x24, 0x2f, 0xc0, 0x35, 0x90, 0x0e, 0x39, 0x2f, - 0x8f, 0x50, 0x02, 0x30, 0x01, 0x40, 0x7f, 0x82, 0x43, 0xa2, 0x02, 0x2f, - 0x00, 0x2e, 0x0c, 0x2c, 0x01, 0x30, 0xc0, 0xb2, 0x11, 0x30, 0x02, 0x2f, - 0x25, 0x2e, 0x6d, 0x00, 0x03, 0x2d, 0x23, 0x2e, 0x6d, 0x00, 0x21, 0x30, - 0x25, 0x2e, 0x6b, 0x00, 0x42, 0xb2, 0x04, 0x2f, 0x41, 0xb2, 0x02, 0x2f, - 0x25, 0x2e, 0x6d, 0x00, 0x31, 0x30, 0x3e, 0x80, 0x04, 0x86, 0x25, 0x2e, - 0x6c, 0x00, 0x02, 0x42, 0xc2, 0x42, 0x18, 0x2d, 0x02, 0x35, 0x01, 0x42, - 0x25, 0x2e, 0x6a, 0x00, 0x13, 0x2d, 0x2c, 0x04, 0x38, 0x1e, 0x21, 0x2e, - 0x69, 0x00, 0x7f, 0x50, 0x11, 0x30, 0x22, 0x30, 0x98, 0x2e, 0x66, 0xb5, - 0x09, 0x2c, 0x01, 0x30, 0x2c, 0x00, 0x38, 0x1c, 0x21, 0x2e, 0x68, 0x00, - 0x7f, 0x50, 0x98, 0x2e, 0x66, 0xb5, 0x01, 0x30, 0xc0, 0x6f, 0xd4, 0xb1, - 0xf5, 0xbd, 0x6b, 0xba, 0x91, 0x5a, 0x02, 0x40, 0x15, 0x18, 0xf5, 0xbe, - 0xeb, 0xbb, 0xe3, 0x0a, 0x3d, 0x0b, 0xd2, 0x6f, 0xe3, 0x00, 0x84, 0x40, - 0x63, 0x05, 0x93, 0x58, 0x2c, 0x18, 0xf5, 0xbe, 0x03, 0x42, 0xeb, 0xbb, - 0xfd, 0x0b, 0xe0, 0x6f, 0x58, 0x01, 0xdf, 0x01, 0x7d, 0x1f, 0x95, 0x42, - 0x18, 0x04, 0x85, 0x40, 0x5d, 0x05, 0x2c, 0x18, 0x75, 0xbe, 0xeb, 0xba, - 0x2c, 0x0b, 0xdc, 0x04, 0x18, 0x1c, 0x80, 0x42, 0x84, 0x80, 0x02, 0x30, - 0x00, 0x40, 0x00, 0xb2, 0x0c, 0x2f, 0x01, 0x2e, 0x6b, 0x00, 0x03, 0x35, - 0x83, 0x0e, 0x07, 0x2f, 0x8d, 0x50, 0x3e, 0x80, 0x25, 0x2e, 0x6d, 0x00, - 0x02, 0x42, 0x03, 0x80, 0x00, 0x2e, 0x02, 0x42, 0x40, 0xb2, 0x04, 0x2f, - 0x8b, 0x50, 0x04, 0x80, 0x25, 0x2e, 0x6a, 0x00, 0x02, 0x42, 0x42, 0xb2, - 0x89, 0x56, 0x9a, 0x22, 0x41, 0xb2, 0x01, 0x2e, 0x1c, 0x01, 0x87, 0x52, - 0x0b, 0xbc, 0x8a, 0x22, 0x0f, 0xb8, 0x00, 0x90, 0x01, 0x32, 0x06, 0x2f, - 0x10, 0x30, 0x90, 0x08, 0x80, 0xb2, 0x08, 0x2f, 0x23, 0x2e, 0x5e, 0xf0, - 0x06, 0x2d, 0x20, 0x30, 0x90, 0x08, 0x80, 0xb2, 0x01, 0x2f, 0x23, 0x2e, - 0x5e, 0xf0, 0xfb, 0x6f, 0xc0, 0x5f, 0xb8, 0x2e, 0x07, 0x86, 0xfc, 0x88, - 0xc6, 0x40, 0x05, 0x41, 0x31, 0x1a, 0x12, 0x2f, 0x80, 0x91, 0x22, 0x2f, - 0x01, 0x35, 0x29, 0x0f, 0x0a, 0x2f, 0x06, 0x80, 0x00, 0x2e, 0x00, 0x40, - 0x00, 0xb2, 0x01, 0x2f, 0x44, 0xa9, 0x03, 0x2f, 0x00, 0x30, 0xc0, 0x42, - 0x00, 0x43, 0xb8, 0x2e, 0xc2, 0x42, 0x01, 0x43, 0xb8, 0x2e, 0x01, 0x35, - 0xa9, 0x0e, 0x0e, 0x2f, 0x03, 0x3b, 0xeb, 0x00, 0xcc, 0xa8, 0x0a, 0x2f, - 0x05, 0x86, 0xc2, 0x80, 0xc3, 0x40, 0x02, 0x42, 0x3c, 0x84, 0xc1, 0x80, - 0x81, 0x42, 0x82, 0x84, 0xc0, 0x2e, 0x80, 0x42, 0x00, 0x2e, 0xb8, 0x2e, - 0x03, 0x2e, 0x1d, 0x01, 0x9f, 0xbc, 0x9f, 0xb8, 0x90, 0x50, 0x40, 0xb2, - 0x90, 0x2e, 0x71, 0xb6, 0x12, 0x40, 0x03, 0x30, 0x11, 0x40, 0x80, 0xa8, - 0x5a, 0x05, 0x9f, 0x58, 0x55, 0x23, 0x00, 0x40, 0x75, 0x7f, 0x40, 0xa8, - 0x16, 0x41, 0xd9, 0x05, 0xcf, 0x23, 0x56, 0x05, 0x40, 0xa9, 0x9d, 0x05, - 0x87, 0x7f, 0x6e, 0x23, 0x17, 0x41, 0xa5, 0x7f, 0x3e, 0x8b, 0x04, 0x41, - 0x52, 0x43, 0x00, 0xa8, 0x98, 0x05, 0xf2, 0x7f, 0x86, 0x22, 0xcf, 0x05, - 0xc0, 0xa9, 0x9f, 0x05, 0xbe, 0x23, 0x04, 0x05, 0x92, 0x7f, 0x00, 0xa9, - 0xdc, 0x05, 0x51, 0x43, 0xb6, 0x7f, 0x27, 0x23, 0xa7, 0x54, 0xe1, 0x7f, - 0x02, 0x18, 0x7d, 0x83, 0x40, 0x43, 0xeb, 0xba, 0x75, 0xbd, 0xaa, 0x0a, - 0x0b, 0x2e, 0x71, 0x00, 0x77, 0x5c, 0x2e, 0x18, 0xf5, 0xbe, 0x6b, 0xbb, - 0x75, 0x0b, 0xaa, 0x00, 0xc4, 0x7f, 0x25, 0x2e, 0x71, 0x00, 0xb2, 0x6f, - 0xa5, 0x6f, 0xaa, 0x00, 0x54, 0x01, 0x84, 0x6f, 0x72, 0x6f, 0x94, 0x05, - 0x80, 0xa9, 0xde, 0x05, 0xb7, 0x23, 0x99, 0x5e, 0x77, 0x0e, 0x41, 0x40, - 0x97, 0x5c, 0xb1, 0x01, 0xd5, 0x7f, 0x00, 0x2e, 0x85, 0x41, 0x0e, 0x2f, - 0x00, 0xa0, 0x0c, 0x2f, 0x14, 0x0f, 0x04, 0x2f, 0xe0, 0x6f, 0x00, 0xac, - 0x10, 0x30, 0x08, 0x2c, 0x18, 0x22, 0xf0, 0x6f, 0x00, 0xac, 0x30, 0x30, - 0x24, 0x30, 0x02, 0x2c, 0x20, 0x22, 0x40, 0x30, 0x0d, 0x2e, 0x71, 0x00, - 0x80, 0xa1, 0x1e, 0x23, 0x79, 0x5e, 0x37, 0x0f, 0xbc, 0x23, 0x00, 0x90, - 0x14, 0x30, 0x10, 0x30, 0x18, 0x2f, 0x9d, 0x50, 0x30, 0x00, 0x9b, 0x56, - 0x43, 0x0e, 0x02, 0x2f, 0x10, 0x30, 0x0a, 0x2c, 0x03, 0x30, 0x99, 0x50, - 0x10, 0x0e, 0x13, 0x30, 0x00, 0x2f, 0x03, 0x30, 0x90, 0x0f, 0x10, 0x30, - 0x00, 0x2f, 0x00, 0x30, 0x00, 0x90, 0x10, 0x30, 0x00, 0x2f, 0x00, 0x30, - 0xc0, 0x90, 0x13, 0x30, 0x00, 0x2f, 0x03, 0x30, 0x40, 0xb2, 0x87, 0x5c, - 0x22, 0x2f, 0x41, 0x90, 0x4a, 0x2f, 0xa5, 0x50, 0x00, 0x2e, 0x01, 0x40, - 0x41, 0x82, 0x01, 0x42, 0x02, 0x80, 0x4a, 0xa8, 0x01, 0x40, 0x06, 0x2f, - 0xd0, 0x6f, 0x85, 0x0e, 0x3e, 0x2f, 0x41, 0x80, 0x21, 0x2e, 0x78, 0x00, - 0x3b, 0x2d, 0x95, 0x50, 0xfb, 0x7f, 0x4a, 0xa8, 0x06, 0x2f, 0x98, 0x2e, - 0x73, 0xb6, 0xc0, 0x90, 0xfb, 0x6f, 0x32, 0x2f, 0x00, 0x2e, 0x30, 0x2d, - 0x98, 0x2e, 0x73, 0xb6, 0x29, 0x2e, 0x7a, 0x00, 0x2b, 0x2c, 0xfb, 0x6f, - 0xa1, 0x52, 0xd2, 0x6f, 0x95, 0x0e, 0x41, 0x40, 0x05, 0x2f, 0x00, 0x90, - 0x17, 0x2f, 0x05, 0x2e, 0x7a, 0x00, 0x80, 0x90, 0x13, 0x2f, 0x7f, 0x82, - 0x40, 0xac, 0x23, 0x2e, 0x77, 0x00, 0x01, 0x30, 0x18, 0x2f, 0xa1, 0x54, - 0x82, 0x84, 0x23, 0x2e, 0x77, 0x00, 0x82, 0x40, 0x80, 0xb2, 0x11, 0x2f, - 0x00, 0x90, 0x23, 0x2e, 0x79, 0x00, 0x0d, 0x2f, 0x29, 0x2e, 0x72, 0x00, - 0x0b, 0x2d, 0x41, 0x80, 0x21, 0x2e, 0x77, 0x00, 0x0f, 0xa4, 0x05, 0x2f, - 0xa3, 0x50, 0x3e, 0x80, 0xf1, 0x30, 0x29, 0x2e, 0x79, 0x00, 0x01, 0x42, - 0x06, 0x30, 0x34, 0x08, 0x00, 0xb2, 0x02, 0x2f, 0x80, 0x30, 0x21, 0x2e, - 0x5e, 0xf0, 0x70, 0x5f, 0xb8, 0x2e, 0x04, 0x84, 0x01, 0x30, 0x81, 0x42, - 0x82, 0x84, 0x01, 0x42, 0xa1, 0x42, 0x81, 0x42, 0x82, 0x84, 0x00, 0x2e, - 0x91, 0x42, 0x81, 0x42, 0xb8, 0x2e, 0x30, 0x50, 0xf3, 0x7f, 0xc0, 0xac, - 0xe4, 0x7f, 0xd5, 0x7f, 0x03, 0x2f, 0x00, 0x30, 0x82, 0x04, 0xf3, 0x6f, - 0xc3, 0x06, 0x40, 0xad, 0x05, 0x2f, 0xe0, 0x6f, 0x05, 0x30, 0x28, 0x04, - 0xd1, 0x6f, 0x69, 0x07, 0xe0, 0x7f, 0x40, 0xa1, 0x01, 0x30, 0x20, 0x2f, - 0x13, 0x25, 0x02, 0x25, 0x04, 0x32, 0x06, 0x30, 0x02, 0x30, 0x03, 0x30, - 0xaf, 0xbb, 0xb1, 0xbd, 0xdf, 0x0a, 0x9f, 0xbb, 0x21, 0xbd, 0x97, 0x0a, - 0x8f, 0xbb, 0x91, 0xbc, 0x01, 0xbc, 0x4f, 0x0a, 0x6b, 0x0e, 0x04, 0x2f, - 0x6b, 0x1a, 0x07, 0x2f, 0xe7, 0x6f, 0x7a, 0x0f, 0x04, 0x2f, 0xe7, 0x6f, - 0x97, 0x04, 0x17, 0x30, 0x07, 0x0a, 0xdd, 0x06, 0x81, 0x8d, 0x34, 0x0e, - 0xe6, 0x2f, 0x00, 0x2e, 0x0d, 0x2d, 0x6b, 0x0e, 0x00, 0x30, 0x05, 0x2f, - 0x6b, 0x1a, 0x07, 0x2f, 0xe0, 0x6f, 0x42, 0x0f, 0x00, 0x30, 0x03, 0x2f, - 0xe0, 0x6f, 0x90, 0x04, 0xdd, 0x06, 0x10, 0x30, 0xf5, 0x6f, 0xc3, 0x7f, - 0xb2, 0x7f, 0x40, 0xad, 0x06, 0x2f, 0x03, 0x30, 0xb2, 0x6f, 0x9a, 0x04, - 0xc4, 0x6f, 0xdc, 0x06, 0xb2, 0x7f, 0xc3, 0x7f, 0x00, 0x2e, 0xd2, 0x6f, - 0xaa, 0x0c, 0x80, 0xac, 0x02, 0x30, 0x01, 0x2f, 0x10, 0x04, 0x51, 0x06, - 0xd0, 0x5f, 0xb8, 0x2e, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, - 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00 -}; - -/***************************************************************************/ -/*! Static Function Declarations -****************************************************************************/ -/*! - * @brief This API update the length for read and write. - * - * @param[in] len : Length for read and write - * @param[in] feature : Variable to specify the features - * which are to be set in the sensor. - * @param[in] enable : Variable which specifies whether to enable or - * disable the features in the bma455 sensor. - * enable | Macros - * ----------------|------------------- - * 0x01 | BMA4_EN - * 0x00 | BMA4_DIS - * @param[in] dev : Structure instance of bma4_dev. - * - * @return none - */ -static void update_len(uint8_t *len, uint8_t feature, uint8_t enable); - -/*! - * @brief This API enables the features of sensor. - * - * @param[in] feature : Variable to specify the features - * which are to be set in the sensor. - * @param[in] len : length to read and write - * @param[in] feature_config : Array address which stores the feature - * configuration data - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any positive value mentioned in ERROR CODES -> Fail - */ -static uint16_t feature_enable(uint8_t feature, uint8_t len, uint8_t *feature_config, struct bma4_dev *dev); - -/*! - * @brief This API disables the features of sensor. - * - * @param[in] feature : Variable to specify the features - * which are to be unset in the sensor. - * @param[in] len : length to read and write - * @param[in] feature_config : Array address which stores the feature - * configuration data - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any positive value mentioned in ERROR CODES -> Fail - */ -static uint16_t feature_disable(uint8_t feature, uint8_t len, uint8_t *feature_config, struct bma4_dev *dev); - -/*! - * @brief This API update the settings of step counter into write array. - * - * @param[in] setting : Pointer to structure variable which stores the - * settings parameter1 to parameter25. - * @param[in] index : value for array traversing. - * @param[out] feature_config : Pointer to store the settings - * - * @return none - */ -static void update_stepcounter_parameter(const struct bma423_stepcounter_settings *setting, - uint8_t index, uint8_t *feature_config); -/*! - * @brief This API copy the settings of step counter into the - * structure of bma423_stepcounter_settings, which is read from sensor. - * - * @param[out] setting : Pointer to structure variable which stores the - * settings parameter1 to parameter25 read from sensor. - * @param[in] data_p : Pointer of array which stores the parameters. - * - * @return none - */ -static void extract_stepcounter_parameter(struct bma423_stepcounter_settings *setting, const uint16_t *data_p); - -/***************************************************************************/ -/**\name Function definitions -****************************************************************************/ - -/*! - * @brief This API is the entry point. - * Call this API before using all other APIs. - * This API reads the chip-id of the sensor and sets the resolution. - */ -#include -uint16_t bma423_init(struct bma4_dev *dev) -{ - uint16_t rslt; - - rslt = bma4_init(dev); - - if (rslt == BMA4_OK) { - if (dev->chip_id == BMA423_CHIP_ID) { - /* Resolution of BMA423 sensor is 12 bit */ - dev->resolution = 12; - dev->feature_len = BMA423_FEATURE_SIZE; - dev->variant = BMA42X_VARIANT; - } else { - rslt |= BMA4_E_INVALID_SENSOR; - } - } - - return rslt; -} - -/*! - * @brief This API is used to upload the config file to enable - * the features of the sensor. - */ -uint16_t bma423_write_config_file(struct bma4_dev *dev) -{ - uint16_t rslt = BMA4_OK; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - /* Config. stream read/write length boundary check */ - if ((dev->read_write_len >= BMA423_RD_WR_MIN_LEN) && - (dev->read_write_len <= BMA423_FEATURE_SIZE)) { - /* Even or odd check */ - if ((dev->read_write_len % 2) != 0) - dev->read_write_len = dev->read_write_len - 1; - /*Assign stream data */ - dev->config_file_ptr = bma423_config_file; - rslt = bma4_write_config_file(dev); - } else { - rslt = BMA4_E_RD_WR_LENGTH_INVALID; - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - return rslt; -} - -/*! - * @brief This API is used to get the configuration id of the sensor. - */ -uint16_t bma423_get_config_id(uint16_t *config_id, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; - uint8_t index = BMA423_CONFIG_ID_OFFSET; - uint16_t rslt = BMA4_OK; - uint16_t config_id_lsb = 0; - uint16_t config_id_msb = 0; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); - if (rslt == BMA4_OK) { - config_id_lsb = (uint16_t)feature_config[index]; - config_id_msb = ((uint16_t)feature_config[index + 1]) << 8; - *config_id = config_id_lsb | config_id_msb; - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API sets/unsets the user provided interrupt to either - * interrupt pin1 or pin2 in the sensor. - */ -uint16_t bma423_map_interrupt(uint8_t int_line, uint16_t int_map, uint8_t enable, struct bma4_dev *dev) -{ - uint16_t rslt = BMA4_OK; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - if (int_line <= 1) { - /* Map/Unmap the interrupt */ - rslt = bma4_map_interrupt(int_line, int_map, enable, dev); - } else { - rslt = BMA4_E_INT_LINE_INVALID; - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API reads the bma423 interrupt status from the sensor. - */ -uint16_t bma423_read_int_status(uint16_t *int_status, struct bma4_dev *dev) -{ - uint16_t rslt = BMA4_OK; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - /* Read the interrupt status */ - rslt = bma4_read_int_status(int_status, dev); - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API enables/disables the features of the sensor. - */ -uint16_t bma423_feature_enable(uint8_t feature, uint8_t enable, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; - uint16_t rslt = BMA4_OK; - uint8_t len; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - /* Update the length for read and write */ - update_len(&len, feature, enable); - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, len, dev); - if (rslt == BMA4_OK) { - if (enable == TRUE) { - /* Enables the feature */ - rslt |= feature_enable(feature, len, feature_config, dev); - } else { - /* Disables the feature */ - rslt |= feature_disable(feature, len, feature_config, dev); - } - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API performs x, y and z axis remapping in the sensor. - */ -uint16_t bma423_set_remap_axes(const struct bma423_axes_remap *remap_data, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; - uint8_t index = BMA423_AXES_REMAP_OFFSET; - uint16_t rslt = BMA4_OK; - uint8_t x_axis = 0; - uint8_t x_axis_sign = 0; - uint8_t y_axis = 0; - uint8_t y_axis_sign = 0; - uint8_t z_axis = 0; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); - if (rslt == BMA4_OK) { - x_axis = remap_data->x_axis & BMA423_X_AXIS_MASK; - x_axis_sign = (remap_data->x_axis_sign << 2) & BMA423_X_AXIS_SIGN_MASK; - y_axis = (remap_data->y_axis << 3) & BMA423_Y_AXIS_MASK; - y_axis_sign = (remap_data->y_axis_sign << 5) & BMA423_Y_AXIS_SIGN_MASK; - z_axis = (remap_data->z_axis << 6) & BMA423_Z_AXIS_MASK; - feature_config[index] = x_axis | x_axis_sign | y_axis | y_axis_sign | z_axis; - feature_config[index + 1] = remap_data->z_axis_sign & BMA423_Z_AXIS_SIGN_MASK; - rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_FEATURE_SIZE, dev); - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API reads the x, y and z axis remap data from the sensor. - */ -uint16_t bma423_get_remap_axes(struct bma423_axes_remap *remap_data, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; - uint8_t index = BMA423_AXES_REMAP_OFFSET; - uint16_t rslt = BMA4_OK; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); - if (rslt == BMA4_OK) { - remap_data->x_axis = feature_config[index] & BMA423_X_AXIS_MASK; - remap_data->x_axis_sign = (feature_config[index] & BMA423_X_AXIS_SIGN_MASK) >> 2; - remap_data->y_axis = (feature_config[index] & BMA423_Y_AXIS_MASK) >> 3; - remap_data->y_axis_sign = (feature_config[index] & BMA423_Y_AXIS_SIGN_MASK) >> 5; - remap_data->z_axis = (feature_config[index] & BMA423_Z_AXIS_MASK) >> 6; - remap_data->z_axis_sign = (feature_config[index + 1] & BMA423_Z_AXIS_SIGN_MASK); - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API enables the any motion feature according to the axis - * set by the user in the sensor. - */ -uint16_t bma423_anymotion_enable_axis(uint8_t axis, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_ANYMOTION_EN_LEN + 2] = {0}; - /* Anymotion axis enable bit pos. is 3 byte ahead of the - anymotion base address(0x00) */ - uint8_t index = 3; - uint16_t rslt = BMA4_OK; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_ANYMOTION_EN_LEN + 2, dev); - if (rslt == BMA4_OK) { - feature_config[index] = BMA4_SET_BITSLICE(feature_config[index], - BMA423_ANY_NO_MOTION_AXIS_EN, axis); - rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_ANYMOTION_EN_LEN + 2, dev); - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! @brief This API sets the configuration of Any motion feature in - * the sensor. - */ -uint16_t bma423_set_any_motion_config(const struct bma423_anymotion_config *any_motion, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_ANYMOTION_EN_LEN + 2] = {0}; - uint8_t index = BMA423_ANY_NO_MOTION_OFFSET; - uint16_t duration_lsb = 0; - uint16_t duration_msb = 0; - uint16_t duration = 0; - uint16_t rslt = BMA4_OK; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_ANYMOTION_EN_LEN + 2, dev); - if (rslt == BMA4_OK) { - /* Assign threshold value in feature config array */ - feature_config[index++] = BMA4_GET_LSB(any_motion->threshold); - feature_config[index] = BMA4_GET_MSB(any_motion->threshold); - /* Assign no motion selection value in feature config array*/ - feature_config[index++] |= (uint8_t) - (any_motion->nomotion_sel << BMA423_ANY_NO_MOTION_SEL_POS); - - /* Extract duration */ - duration_lsb = feature_config[index]; - duration_msb = feature_config[index + 1] << 8; - duration = duration_lsb | duration_msb; - duration = BMA4_SET_BITS_POS_0(duration, - BMA423_ANY_NO_MOTION_DUR, any_motion->duration); - /* Assign duration value in feature config array*/ - feature_config[index++] = BMA4_GET_LSB(duration); - feature_config[index] = BMA4_GET_MSB(duration); - - /* Write any motion settings to the sensor*/ - rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_ANYMOTION_EN_LEN + 2, dev); - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! @brief This API gets the configuration of any motion feature from - * the sensor. - */ -uint16_t bma423_get_any_motion_config(struct bma423_anymotion_config *any_motion, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_ANYMOTION_EN_LEN + 2] = {0}; - uint8_t anymotion = 0; - uint16_t rslt = BMA4_OK; - uint16_t *data_p = (uint16_t *)feature_config; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_ANYMOTION_EN_LEN + 2, dev); - if (rslt == BMA4_OK) { - /* Extract threshold value */ - any_motion->threshold = (*data_p) & BMA423_ANY_NO_MOTION_THRES_MSK; - /* Extract threshold & nomotion selection - * data */ - anymotion = ((uint8_t)(*(data_p++) >> 8)) & BMA423_ANY_NO_MOTION_SEL_MSK; - /* Extract no motion field */ - any_motion->nomotion_sel = anymotion >> - BMA423_ANY_NO_MOTION_SEL_POS; - /* Extract duration value */ - any_motion->duration = (*(data_p)) & BMA423_ANY_NO_MOTION_DUR_MSK; - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API enables or disables the step detector feature in the - * sensor. - */ -uint16_t bma423_step_detector_enable(uint8_t enable, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; - uint16_t rslt = BMA4_OK; - /* Step detector enable bit pos. is 1 byte ahead of the base address */ - uint8_t index = BMA423_STEP_CNTR_OFFSET + 1; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_FEATURE_SIZE, dev); - if (rslt == BMA4_OK) { - feature_config[index] = BMA4_SET_BITSLICE(feature_config[index], - BMA423_STEP_DETECTOR_EN, enable); - rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_FEATURE_SIZE, dev); - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API sets the watermark level for step counter - * interrupt in the sensor. - */ -uint16_t bma423_step_counter_set_watermark(uint16_t step_counter_wm, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; - uint8_t index = BMA423_STEP_CNTR_OFFSET; - uint16_t wm_lsb = 0; - uint16_t wm_msb = 0; - uint16_t rslt = BMA4_OK; - uint16_t data = 0; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_FEATURE_SIZE, dev); - if (rslt == BMA4_OK) { - wm_lsb = feature_config[index]; - wm_msb = feature_config[index + 1] << 8; - data = wm_lsb | wm_msb; - /* Sets only watermark bits in the complete - 16 bits of data */ - data = BMA4_SET_BITS_POS_0(data, BMA423_STEP_CNTR_WM, step_counter_wm); - /* Splits 16 bits of data to individual - 8 bits data */ - feature_config[index] = BMA4_GET_LSB(data); - feature_config[index + 1] = BMA4_GET_MSB(data); - /* Writes stepcounter watermark settings - in the sensor */ - rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_FEATURE_SIZE, dev); - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API gets the water mark level set for step counter interrupt - * in the sensor - */ -uint16_t bma423_step_counter_get_watermark(uint16_t *step_counter_wm, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; - uint8_t index = BMA423_STEP_CNTR_OFFSET; - uint16_t wm_lsb = 0; - uint16_t wm_msb = 0; - uint16_t rslt = BMA4_OK; - uint16_t data = 0; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_FEATURE_SIZE, dev); - if (rslt == BMA4_OK) { - wm_lsb = feature_config[index]; - wm_msb = feature_config[index + 1] << 8; - data = wm_lsb | wm_msb; - *step_counter_wm = BMA4_GET_BITS_POS_0(data, BMA423_STEP_CNTR_WM); - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API resets the counted steps of step counter. - */ -uint16_t bma423_reset_step_counter(struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; - /* Reset bit is 1 byte ahead of base address */ - uint8_t index = BMA423_STEP_CNTR_OFFSET + 1; - uint16_t rslt = BMA4_OK; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_FEATURE_SIZE, dev); - - if (rslt == BMA4_OK) { - feature_config[index] = BMA4_SET_BITSLICE(feature_config[index], - BMA423_STEP_CNTR_RST, 1); - rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_FEATURE_SIZE, dev); - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - return rslt; -} - -/*! - * @brief This API gets the number of counted steps of the step counter - * feature from the sensor. - */ -uint16_t bma423_step_counter_output(uint32_t *step_count, struct bma4_dev *dev) -{ - uint8_t data[BMA423_STEP_CNTR_DATA_SIZE] = {0}; - uint16_t rslt = BMA4_OK; - uint32_t step_count_0 = 0; - uint32_t step_count_1 = 0; - uint32_t step_count_2 = 0; - uint32_t step_count_3 = 0; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - /* Reads the step counter output data from the - gpio register */ - rslt = bma4_read_regs(BMA4_STEP_CNT_OUT_0_ADDR, data, - BMA423_STEP_CNTR_DATA_SIZE, dev); - - if (rslt == BMA4_OK) { - step_count_0 = (uint32_t)data[0]; - step_count_1 = (uint32_t)data[1] << 8; - step_count_2 = (uint32_t)data[2] << 16; - step_count_3 = (uint32_t)data[3] << 24; - *step_count = step_count_0 | step_count_1 | step_count_2 | step_count_3; - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API gets the output for activity feature. - */ -uint16_t bma423_activity_output(uint8_t *activity, struct bma4_dev *dev) -{ - uint8_t data = 0; - uint16_t rslt = BMA4_OK; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - /* Reads the activity output from the gpio register */ - rslt = bma4_read_regs(BMA4_ACTIVITY_OUT_ADDR, &data, 1, dev); - if (rslt == BMA4_OK) - *activity = data; - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API select the platform configuration wrist(Default) or phone. - */ -uint16_t bma423_select_platform(uint8_t platform, struct bma4_dev *dev) -{ - uint16_t rslt = BMA4_OK; - struct bma423_stepcounter_settings sc_settings = {0}; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - switch (platform) { - case BMA423_PHONE_CONFIG: - sc_settings.param1 = BMA423_PHONE_SC_PARAM_1; - sc_settings.param2 = BMA423_PHONE_SC_PARAM_2; - sc_settings.param3 = BMA423_PHONE_SC_PARAM_3; - sc_settings.param4 = BMA423_PHONE_SC_PARAM_4; - sc_settings.param5 = BMA423_PHONE_SC_PARAM_5; - sc_settings.param6 = BMA423_PHONE_SC_PARAM_6; - sc_settings.param7 = BMA423_PHONE_SC_PARAM_7; - sc_settings.param8 = BMA423_PHONE_SC_PARAM_8; - sc_settings.param9 = BMA423_PHONE_SC_PARAM_9; - sc_settings.param10 = BMA423_PHONE_SC_PARAM_10; - sc_settings.param11 = BMA423_PHONE_SC_PARAM_11; - sc_settings.param12 = BMA423_PHONE_SC_PARAM_12; - sc_settings.param13 = BMA423_PHONE_SC_PARAM_13; - sc_settings.param14 = BMA423_PHONE_SC_PARAM_14; - sc_settings.param15 = BMA423_PHONE_SC_PARAM_15; - sc_settings.param16 = BMA423_PHONE_SC_PARAM_16; - sc_settings.param17 = BMA423_PHONE_SC_PARAM_17; - sc_settings.param18 = BMA423_PHONE_SC_PARAM_18; - sc_settings.param19 = BMA423_PHONE_SC_PARAM_19; - sc_settings.param20 = BMA423_PHONE_SC_PARAM_20; - sc_settings.param21 = BMA423_PHONE_SC_PARAM_21; - sc_settings.param22 = BMA423_PHONE_SC_PARAM_22; - sc_settings.param23 = BMA423_PHONE_SC_PARAM_23; - sc_settings.param24 = BMA423_PHONE_SC_PARAM_24; - sc_settings.param25 = BMA423_PHONE_SC_PARAM_25; - break; - - case BMA423_WRIST_CONFIG: - sc_settings.param1 = BMA423_WRIST_SC_PARAM_1; - sc_settings.param2 = BMA423_WRIST_SC_PARAM_2; - sc_settings.param3 = BMA423_WRIST_SC_PARAM_3; - sc_settings.param4 = BMA423_WRIST_SC_PARAM_4; - sc_settings.param5 = BMA423_WRIST_SC_PARAM_5; - sc_settings.param6 = BMA423_WRIST_SC_PARAM_6; - sc_settings.param7 = BMA423_WRIST_SC_PARAM_7; - sc_settings.param8 = BMA423_WRIST_SC_PARAM_8; - sc_settings.param9 = BMA423_WRIST_SC_PARAM_9; - sc_settings.param10 = BMA423_WRIST_SC_PARAM_10; - sc_settings.param11 = BMA423_WRIST_SC_PARAM_11; - sc_settings.param12 = BMA423_WRIST_SC_PARAM_12; - sc_settings.param13 = BMA423_WRIST_SC_PARAM_13; - sc_settings.param14 = BMA423_WRIST_SC_PARAM_14; - sc_settings.param15 = BMA423_WRIST_SC_PARAM_15; - sc_settings.param16 = BMA423_WRIST_SC_PARAM_16; - sc_settings.param17 = BMA423_WRIST_SC_PARAM_17; - sc_settings.param18 = BMA423_WRIST_SC_PARAM_18; - sc_settings.param19 = BMA423_WRIST_SC_PARAM_19; - sc_settings.param20 = BMA423_WRIST_SC_PARAM_20; - sc_settings.param21 = BMA423_WRIST_SC_PARAM_21; - sc_settings.param22 = BMA423_WRIST_SC_PARAM_22; - sc_settings.param23 = BMA423_WRIST_SC_PARAM_23; - sc_settings.param24 = BMA423_WRIST_SC_PARAM_24; - sc_settings.param25 = BMA423_WRIST_SC_PARAM_25; - break; - - default: - rslt = BMA4_E_OUT_OF_RANGE; - break; - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - if (rslt == BMA4_OK) { - /* Set the step counter parameter */ - rslt = bma423_stepcounter_set_parameter(&sc_settings, dev); - } - - return rslt; -} - -/*! - * @brief This API gets the parameter1 to parameter7 settings of the - * step counter feature. - */ -uint16_t bma423_stepcounter_get_parameter(struct bma423_stepcounter_settings *setting, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; - uint16_t *data_p = (uint16_t *)feature_config; - uint16_t rslt = BMA4_OK; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); - - if (rslt == BMA4_OK) { - /* To convert 8bit to 16 bit address */ - data_p = data_p + BMA423_STEP_CNTR_PARAM_OFFSET/2; - extract_stepcounter_parameter(setting, data_p); - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API sets the parameter1 to parameter7 settings of the - * step counter feature in the sensor. - */ -uint16_t bma423_stepcounter_set_parameter(const struct bma423_stepcounter_settings *setting, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; - uint8_t index = BMA423_STEP_CNTR_PARAM_OFFSET; - uint16_t rslt = BMA4_OK; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); - if (rslt == BMA4_OK) { - update_stepcounter_parameter(setting, index, feature_config); - /* Writes stepcounter parameter settings - in the sensor */ - rslt = bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_FEATURE_SIZE, dev); - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API sets the sensitivity of wake up feature in the sensor - */ -uint16_t bma423_wakeup_set_sensitivity(uint8_t sensitivity, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; - uint8_t index = BMA423_WAKEUP_OFFSET; - uint16_t rslt = BMA4_OK; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); - if (rslt == BMA4_OK) { - feature_config[index] = BMA4_SET_BITSLICE(feature_config[index], - BMA423_WAKEUP_SENS, sensitivity); - /* Writes sensitivity settings in the sensor */ - rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_FEATURE_SIZE, dev); - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API gets the sensitivity of wake up feature in the sensor - */ -uint16_t bma423_wakeup_get_sensitivity(uint8_t *sensitivity, struct bma4_dev *dev) -{ - uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; - uint8_t index = BMA423_WAKEUP_OFFSET; - uint16_t rslt = BMA4_OK; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); - if (rslt == BMA4_OK) { - /* Extracts sensitivity data */ - *sensitivity = BMA4_GET_BITSLICE(feature_config[index], BMA423_WAKEUP_SENS); - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} - -/*! - * @brief This API is used to select single/double tap - * feature in the sensor - */ -uint16_t bma423_tap_selection(const uint8_t tap_select, struct bma4_dev *dev) -{ - uint16_t rslt = BMA4_OK; - uint8_t feature_config[BMA423_FEATURE_SIZE] = {0,}; - uint8_t index = BMA423_WAKEUP_OFFSET; - - if (dev != NULL) { - if (dev->chip_id == BMA423_CHIP_ID) { - rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); - if (rslt == BMA4_OK) { - feature_config[index] = BMA4_SET_BITSLICE(feature_config[index], - BMA423_TAP_SEL, tap_select); - rslt = bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, - BMA423_FEATURE_SIZE, dev); - } - } else { - rslt = BMA4_E_INVALID_SENSOR; - } - } else { - rslt = BMA4_E_NULL_PTR; - } - - return rslt; -} -/*! - * @brief This API update the length for read and write. - */ -static void update_len(uint8_t *len, uint8_t feature, uint8_t enable) -{ - uint8_t length = BMA423_FEATURE_SIZE; - - if ((feature == BMA423_ANY_MOTION) || (feature == BMA423_NO_MOTION)) { - /* Change the feature length to 2 for reading and writing of 2 bytes for - any/no-motion enable */ - length = BMA423_ANYMOTION_EN_LEN; - - /* Read and write 4 byte to disable the any/no motion completely along with - all axis */ - if (enable == BMA4_DISABLE) { - /*Change the feature length to 4 for reading and writing - of 4 bytes for any/no-motion enable */ - length = length + 2; - } - } - - *len = length; -} - -/*! - * @brief This API enables the features of the sensor. - */ -static uint16_t feature_enable(uint8_t feature, uint8_t len, uint8_t *feature_config, struct bma4_dev *dev) -{ - uint8_t index = 0; - uint16_t rslt; - - /* Enable step counter */ - if ((feature & BMA423_STEP_CNTR) > 0) { - /* Step counter enable bit pos. is 1 byte ahead of the - base address */ - index = BMA423_STEP_CNTR_OFFSET + 1; - feature_config[index] = feature_config[index] | BMA423_STEP_CNTR_EN_MSK; - } - - /* Enable activity */ - if ((feature & BMA423_ACTIVITY) > 0) { - /* Activity enable bit pos. is 1 byte ahead of the - base address */ - index = BMA423_STEP_CNTR_OFFSET + 1; - feature_config[index] = feature_config[index] | BMA423_ACTIVITY_EN_MSK; - } - /* Enable tilt */ - if ((feature & BMA423_TILT) > 0) { - /* Tilt enable bit pos. is the base address(0x3A) of tilt */ - index = BMA423_TILT_OFFSET; - feature_config[index] = feature_config[index] | BMA423_TILT_EN_MSK; - } - - /* Enable wakeup */ - if ((feature & BMA423_WAKEUP) > 0) { - /* Wakeup enable bit pos. is the base address(0x38) of wakeup */ - index = BMA423_WAKEUP_OFFSET; - feature_config[index] = feature_config[index] | BMA423_WAKEUP_EN_MSK; - } - - /* Enable anymotion/nomotion */ - if ((feature & BMA423_ANY_MOTION) > 0 || (feature & BMA423_NO_MOTION) > 0) { - /* Any/Nomotion enable bit pos. is 1 bytes ahead of the - any/nomotion base address(0x00) */ - index = 1; - - if ((feature & BMA423_ANY_MOTION) > 0) { - /* Enable anymotion */ - feature_config[index] = feature_config[index] & (~BMA423_ANY_NO_MOTION_SEL_MSK); - } else { - /* Enable nomotion */ - feature_config[index] = feature_config[index] | BMA423_ANY_NO_MOTION_SEL_MSK; - } - } - - /* Write the feature enable settings in the sensor */ - rslt = bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, len, dev); - - return rslt; -} - -/*! - * @brief This API disables the features of the sensor. - */ -static uint16_t feature_disable(uint8_t feature, uint8_t len, uint8_t *feature_config, struct bma4_dev *dev) -{ - uint8_t index = 0; - uint16_t rslt; - - /* Disable step counter */ - if ((feature & BMA423_STEP_CNTR) > 0) { - /* Step counter enable bit pos. is 1 byte ahead of the - base address */ - index = BMA423_STEP_CNTR_OFFSET + 1; - feature_config[index] = feature_config[index] & (~BMA423_STEP_CNTR_EN_MSK); - } - - /* Disable activity */ - if ((feature & BMA423_ACTIVITY) > 0) { - /* Activity enable bit pos. is 1 byte ahead of the - base address */ - index = BMA423_STEP_CNTR_OFFSET + 1; - feature_config[index] = feature_config[index] & (~BMA423_ACTIVITY_EN_MSK); - } - /* Disable tilt */ - if ((feature & BMA423_TILT) > 0) { - /* Tilt enable bit pos. is the base address(0x3A) of tilt */ - index = BMA423_TILT_OFFSET; - feature_config[index] = feature_config[index] & (~BMA423_TILT_EN_MSK); - } - - /* Disable wakeup */ - if ((feature & BMA423_WAKEUP) > 0) { - /* Tilt enable bit pos. is the base address(0x38) of wakeup */ - index = BMA423_WAKEUP_OFFSET; - feature_config[index] = feature_config[index] & (~BMA423_WAKEUP_EN_MSK); - } - - /* Disable anymotion/nomotion */ - if ((feature & BMA423_ANY_MOTION) > 0 || (feature & BMA423_NO_MOTION) > 0) { - /* Any/Nomotion enable bit pos. is 1 bytes ahead of the - any/nomotion base address(0x00) */ - index = 1; - - if ((feature & BMA423_ANY_MOTION) > 0) { - /* Disable anymotion */ - feature_config[index] = feature_config[index] | BMA423_ANY_NO_MOTION_SEL_MSK; - } else { - /* Disable nomotion */ - feature_config[index] = feature_config[index] & (~BMA423_ANY_NO_MOTION_SEL_MSK); - } - /* Any/Nomotion axis enable bit pos. is 3 byte ahead of the - any/nomotion base address(0x00) */ - index = 3; - feature_config[index] = feature_config[index] & (~BMA423_ANY_NO_MOTION_AXIS_EN_MSK); - } - /* Write the configured settings in the sensor */ - rslt = bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, len, dev); - - return rslt; -} - -/*! - * @brief This API update the settings of step counter. - */ -static void update_stepcounter_parameter(const struct bma423_stepcounter_settings *setting, - uint8_t index, uint8_t *feature_config) -{ - feature_config[index++] = BMA4_GET_LSB(setting->param1); - feature_config[index++] = BMA4_GET_MSB(setting->param1); - feature_config[index++] = BMA4_GET_LSB(setting->param2); - feature_config[index++] = BMA4_GET_MSB(setting->param2); - feature_config[index++] = BMA4_GET_LSB(setting->param3); - feature_config[index++] = BMA4_GET_MSB(setting->param3); - feature_config[index++] = BMA4_GET_LSB(setting->param4); - feature_config[index++] = BMA4_GET_MSB(setting->param4); - feature_config[index++] = BMA4_GET_LSB(setting->param5); - feature_config[index++] = BMA4_GET_MSB(setting->param5); - feature_config[index++] = BMA4_GET_LSB(setting->param6); - feature_config[index++] = BMA4_GET_MSB(setting->param6); - feature_config[index++] = BMA4_GET_LSB(setting->param7); - feature_config[index++] = BMA4_GET_MSB(setting->param7); - feature_config[index++] = BMA4_GET_LSB(setting->param8); - feature_config[index++] = BMA4_GET_MSB(setting->param8); - feature_config[index++] = BMA4_GET_LSB(setting->param9); - feature_config[index++] = BMA4_GET_MSB(setting->param9); - feature_config[index++] = BMA4_GET_LSB(setting->param10); - feature_config[index++] = BMA4_GET_MSB(setting->param10); - feature_config[index++] = BMA4_GET_LSB(setting->param11); - feature_config[index++] = BMA4_GET_MSB(setting->param11); - feature_config[index++] = BMA4_GET_LSB(setting->param12); - feature_config[index++] = BMA4_GET_MSB(setting->param12); - feature_config[index++] = BMA4_GET_LSB(setting->param13); - feature_config[index++] = BMA4_GET_MSB(setting->param13); - feature_config[index++] = BMA4_GET_LSB(setting->param14); - feature_config[index++] = BMA4_GET_MSB(setting->param14); - feature_config[index++] = BMA4_GET_LSB(setting->param15); - feature_config[index++] = BMA4_GET_MSB(setting->param15); - feature_config[index++] = BMA4_GET_LSB(setting->param16); - feature_config[index++] = BMA4_GET_MSB(setting->param16); - feature_config[index++] = BMA4_GET_LSB(setting->param17); - feature_config[index++] = BMA4_GET_MSB(setting->param17); - feature_config[index++] = BMA4_GET_LSB(setting->param18); - feature_config[index++] = BMA4_GET_MSB(setting->param18); - feature_config[index++] = BMA4_GET_LSB(setting->param19); - feature_config[index++] = BMA4_GET_MSB(setting->param19); - feature_config[index++] = BMA4_GET_LSB(setting->param20); - feature_config[index++] = BMA4_GET_MSB(setting->param20); - feature_config[index++] = BMA4_GET_LSB(setting->param21); - feature_config[index++] = BMA4_GET_MSB(setting->param21); - feature_config[index++] = BMA4_GET_LSB(setting->param22); - feature_config[index++] = BMA4_GET_MSB(setting->param22); - feature_config[index++] = BMA4_GET_LSB(setting->param23); - feature_config[index++] = BMA4_GET_MSB(setting->param23); - feature_config[index++] = BMA4_GET_LSB(setting->param24); - feature_config[index++] = BMA4_GET_MSB(setting->param24); - feature_config[index++] = BMA4_GET_LSB(setting->param25); - feature_config[index] = BMA4_GET_MSB(setting->param25); -} - -/*! - * @brief This API copy the settings of step counter into the - * structure of bma423_stepcounter_settings, which is read from sensor. - */ -static void extract_stepcounter_parameter(struct bma423_stepcounter_settings *setting, const uint16_t *data_p) -{ - setting->param1 = *(data_p++); - setting->param2 = *(data_p++); - setting->param3 = *(data_p++); - setting->param4 = *(data_p++); - setting->param5 = *(data_p++); - setting->param6 = *(data_p++); - setting->param7 = *(data_p++); - setting->param8 = *(data_p++); - setting->param9 = *(data_p++); - setting->param10 = *(data_p++); - setting->param11 = *(data_p++); - setting->param12 = *(data_p++); - setting->param13 = *(data_p++); - setting->param14 = *(data_p++); - setting->param15 = *(data_p++); - setting->param16 = *(data_p++); - setting->param17 = *(data_p++); - setting->param18 = *(data_p++); - setting->param19 = *(data_p++); - setting->param20 = *(data_p++); - setting->param21 = *(data_p++); - setting->param22 = *(data_p++); - setting->param23 = *(data_p++); - setting->param24 = *(data_p++); - setting->param25 = *data_p; -} +/**\mainpage +* +**************************************************************************** +* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH +* +* File : bma423.c +* +* Date: 12 Oct 2017 +* +* Revision : 1.1.4 $ +* +* Usage: Sensor Driver for BMA423 sensor +* +**************************************************************************** +* +* \section Disclaimer +* +* Common: +* Bosch Sensortec products are developed for the consumer goods industry. +* They may only be used within the parameters of the respective valid +* product data sheet. Bosch Sensortec products are provided with the +* express understanding that there is no warranty of fitness for a +* particular purpose.They are not fit for use in life-sustaining, +* safety or security sensitive systems or any system or device +* that may lead to bodily harm or property damage if the system +* or device malfunctions. In addition,Bosch Sensortec products are +* not fit for use in products which interact with motor vehicle systems. +* The resale and or use of products are at the purchasers own risk and +* his own responsibility. The examination of fitness for the intended use +* is the sole responsibility of the Purchaser. +* +* The purchaser shall indemnify Bosch Sensortec from all third party +* claims, including any claims for incidental, or consequential damages, +* arising from any product use not covered by the parameters of +* the respective valid product data sheet or not approved by +* Bosch Sensortec and reimburse Bosch Sensortec for all costs in +* connection with such claims. +* +* The purchaser must monitor the market for the purchased products, +* particularly with regard to product safety and inform Bosch Sensortec +* without delay of all security relevant incidents. +* +* Engineering Samples are marked with an asterisk (*) or (e). +* Samples may vary from the valid technical specifications of the product +* series. They are therefore not intended or fit for resale to third +* parties or for use in end products. Their sole purpose is internal +* client testing. The testing of an engineering sample may in no way +* replace the testing of a product series. Bosch Sensortec assumes +* no liability for the use of engineering samples. +* By accepting the engineering samples, the Purchaser agrees to indemnify +* Bosch Sensortec from all claims arising from the use of engineering +* samples. +* +* Special: +* This software module (hereinafter called "Software") and any information +* on application-sheets (hereinafter called "Information") is provided +* free of charge for the sole purpose to support your application work. +* The Software and Information is subject to the following +* terms and conditions: +* +* The Software is specifically designed for the exclusive use for +* Bosch Sensortec products by personnel who have special experience +* and training. Do not use this Software if you do not have the +* proper experience or training. +* +* This Software package is provided `` as is `` and without any expressed +* or implied warranties,including without limitation, the implied warranties +* of merchantability and fitness for a particular purpose. +* +* Bosch Sensortec and their representatives and agents deny any liability +* for the functional impairment +* of this Software in terms of fitness, performance and safety. +* Bosch Sensortec and their representatives and agents shall not be liable +* for any direct or indirect damages or injury, except as +* otherwise stipulated in mandatory applicable law. +* +* The Information provided is believed to be accurate and reliable. +* Bosch Sensortec assumes no responsibility for the consequences of use +* of such Information nor for any infringement of patents or +* other rights of third parties which may result from its use. +* No license is granted by implication or otherwise under any patent or +* patent rights of Bosch. Specifications mentioned in the Information are +* subject to change without notice. +**************************************************************************/ +/*! \file bma423.c + \brief Sensor Driver for BMA423 sensor */ + +#include "bma423.h" + +/**\name Feature configuration file */ +const uint8_t bma423_config_file[] = { + 0x80, 0x2e, 0xfc, 0x00, 0x80, 0x2e, 0xfe, 0x00, 0xc8, 0x2e, 0x00, 0x2e, + 0x80, 0x2e, 0xfa, 0x00, 0x80, 0x2e, 0x23, 0xb1, 0x80, 0x2e, 0xfd, 0x00, + 0x80, 0x2e, 0xfb, 0x00, 0x80, 0x2e, 0x5a, 0xb1, 0x50, 0x39, 0x21, 0x2e, + 0xb0, 0xf0, 0x10, 0x30, 0x21, 0x2e, 0x16, 0xf0, 0x80, 0x2e, 0xfc, 0x01, + 0x5d, 0x50, 0x45, 0x52, 0x01, 0x42, 0x3b, 0x80, 0x41, 0x30, 0x01, 0x42, + 0x3c, 0x80, 0x00, 0x2e, 0x01, 0x40, 0x01, 0x42, 0x21, 0x2e, 0xff, 0xaf, + 0xb8, 0x2e, 0xb6, 0xd6, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0xfd, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x24, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x2e, + 0x99, 0x01, 0x20, 0x26, 0x98, 0x2e, 0xf6, 0x00, 0x98, 0x2e, 0xe9, 0x01, + 0x10, 0x30, 0x21, 0x2e, 0x59, 0xf0, 0x98, 0x2e, 0xd8, 0x00, 0x00, 0x2e, + 0x00, 0x2e, 0xd0, 0x2e, 0x98, 0x2e, 0xdd, 0x00, 0x01, 0x2e, 0x56, 0x00, + 0x00, 0xb2, 0x11, 0x2f, 0x00, 0x30, 0x21, 0x2e, 0x56, 0x00, 0x41, 0x50, + 0x98, 0x2e, 0xcc, 0xb0, 0x41, 0x50, 0x98, 0x2e, 0x8f, 0xb4, 0x01, 0x2e, + 0x03, 0xf0, 0x0d, 0xbc, 0x0f, 0xb8, 0x00, 0x90, 0x02, 0x2f, 0x45, 0x50, + 0x21, 0x2e, 0xbc, 0xf0, 0x01, 0x2e, 0x55, 0x00, 0x00, 0xb2, 0x1a, 0x2f, + 0x00, 0x30, 0x21, 0x2e, 0x55, 0x00, 0x43, 0x50, 0x98, 0x2e, 0xcc, 0xb0, + 0x43, 0x50, 0x98, 0x2e, 0xdc, 0xb1, 0x43, 0x50, 0x98, 0x2e, 0x92, 0xb5, + 0x43, 0x50, 0x98, 0x2e, 0x00, 0xb0, 0x01, 0x2e, 0x1c, 0x01, 0x0f, 0xbc, + 0x0f, 0xb8, 0x00, 0x90, 0x45, 0x50, 0x02, 0x2f, 0x21, 0x2e, 0xbc, 0xf0, + 0x02, 0x2d, 0x21, 0x2e, 0xba, 0xf0, 0x98, 0x2e, 0xd8, 0x00, 0xc3, 0x2d, + 0x01, 0x2e, 0x55, 0xf0, 0xc0, 0x2e, 0x21, 0x2e, 0x55, 0xf0, 0x03, 0x2e, + 0x00, 0xf0, 0x45, 0x54, 0x01, 0x2e, 0x59, 0xf0, 0x4a, 0x0e, 0x02, 0x2f, + 0xf1, 0x33, 0x0d, 0x2c, 0x01, 0x08, 0xf2, 0x30, 0x4a, 0x08, 0x79, 0x84, + 0x82, 0xa2, 0x04, 0x2f, 0x02, 0x34, 0x82, 0x0a, 0x47, 0xa2, 0x03, 0x2c, + 0x10, 0x22, 0x45, 0x52, 0x01, 0x0a, 0xc0, 0x2e, 0x21, 0x2e, 0x59, 0xf0, + 0x00, 0x31, 0xc0, 0x2e, 0x21, 0x2e, 0xba, 0xf0, 0xc8, 0x2e, 0xc8, 0x2e, + 0xc8, 0x2e, 0xc8, 0x2e, 0xc8, 0x2e, 0x44, 0x47, 0xaa, 0x00, 0x05, 0x00, + 0x2d, 0x01, 0xd4, 0x7b, 0x3b, 0x01, 0xdb, 0x7a, 0x04, 0x00, 0x3f, 0x7b, + 0xcd, 0x6c, 0xc3, 0x04, 0x85, 0x09, 0xc3, 0x04, 0xec, 0xe6, 0x0c, 0x46, + 0x01, 0x00, 0x27, 0x00, 0x19, 0x00, 0x96, 0x00, 0xa0, 0x00, 0x01, 0x00, + 0x0c, 0x00, 0xf0, 0x3c, 0x00, 0x01, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x43, 0x28, 0x88, 0x00, + 0x52, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x5b, 0x00, 0x00, 0x40, 0xaf, 0x00, + 0xff, 0x00, 0xff, 0xb7, 0x00, 0x02, 0x00, 0xb0, 0x05, 0x80, 0xb1, 0xf0, + 0xc0, 0x00, 0x00, 0x01, 0x5e, 0xf0, 0x39, 0xf0, 0x89, 0xf0, 0x00, 0x20, + 0xff, 0x7f, 0x7d, 0x00, 0x5e, 0x00, 0x62, 0x00, 0x7c, 0x00, 0xff, 0xfb, + 0x52, 0xf0, 0x56, 0xf0, 0x33, 0x09, 0x33, 0x07, 0x00, 0x08, 0x90, 0x01, + 0x00, 0xf8, 0x67, 0x00, 0x4c, 0x04, 0xa0, 0x00, 0xe8, 0x03, 0x81, 0x00, + 0x82, 0x00, 0x6a, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0xeb, 0x07, 0xae, 0x07, + 0x72, 0x00, 0x6f, 0x00, 0xa1, 0x01, 0x1e, 0x05, 0x47, 0xfd, 0x73, 0x00, + 0x77, 0x00, 0x79, 0x00, 0x76, 0x00, 0xcc, 0x00, 0x30, 0x50, 0x50, 0x40, + 0x00, 0x18, 0x50, 0x40, 0x56, 0x25, 0x47, 0x25, 0x00, 0x18, 0x2e, 0x00, + 0x41, 0x40, 0xa7, 0x02, 0x09, 0x18, 0xc6, 0x00, 0xfb, 0x7f, 0x00, 0x30, + 0x49, 0x52, 0x05, 0x30, 0x05, 0x2c, 0x17, 0x03, 0x1e, 0xbd, 0xd2, 0xba, + 0x92, 0xb8, 0x6a, 0x0b, 0x61, 0x0e, 0xf9, 0x2f, 0x61, 0x1a, 0x01, 0x2f, + 0x5d, 0x0e, 0xf5, 0x2f, 0xd4, 0x7f, 0x02, 0x30, 0x1f, 0x2c, 0xe3, 0x7f, + 0x85, 0x01, 0xd1, 0x03, 0x7c, 0x0e, 0x03, 0x2f, 0x7c, 0x1a, 0x0f, 0x2f, + 0x73, 0x0f, 0x0d, 0x2f, 0xe3, 0x6f, 0xde, 0x04, 0x5f, 0xba, 0x11, 0xbf, + 0xb4, 0x0b, 0xd4, 0x6f, 0x27, 0x07, 0xb3, 0x25, 0xd1, 0xbf, 0xeb, 0x7f, + 0x07, 0x00, 0xb4, 0x25, 0x96, 0x02, 0xdb, 0x7f, 0x2f, 0xbf, 0x9e, 0xbf, + 0x01, 0xb8, 0xd2, 0xba, 0x21, 0xb9, 0x92, 0xb8, 0x06, 0x0a, 0x6f, 0x0b, + 0x40, 0x90, 0xdf, 0x2f, 0x40, 0x91, 0xdd, 0x2f, 0xfb, 0x6f, 0xd0, 0x5f, + 0xb8, 0x2e, 0x57, 0x50, 0x41, 0x30, 0x02, 0x40, 0x51, 0x0a, 0x01, 0x42, + 0x18, 0x82, 0x4b, 0x50, 0x60, 0x42, 0x70, 0x3c, 0x4d, 0x54, 0x42, 0x42, + 0x69, 0x82, 0x82, 0x32, 0x43, 0x40, 0x18, 0x08, 0x02, 0x0a, 0x40, 0x42, + 0x42, 0x80, 0x02, 0x3f, 0x01, 0x40, 0x10, 0x50, 0x4a, 0x08, 0xfb, 0x7f, + 0x11, 0x42, 0x0b, 0x31, 0x0b, 0x42, 0x3e, 0x80, 0x01, 0x32, 0x01, 0x42, + 0x00, 0x2e, 0x01, 0x2e, 0x40, 0xf0, 0x13, 0x90, 0x20, 0x2f, 0x03, 0x30, + 0x51, 0x50, 0x4f, 0x54, 0xf4, 0x34, 0x06, 0x30, 0x55, 0x52, 0x55, 0x32, + 0x1d, 0x1a, 0xe3, 0x22, 0x18, 0x1a, 0x53, 0x58, 0xe3, 0x22, 0x04, 0x30, + 0xd5, 0x40, 0xb5, 0x0d, 0xe1, 0xbe, 0x6f, 0xbb, 0x80, 0x91, 0xa9, 0x0d, + 0x01, 0x89, 0xb5, 0x23, 0x10, 0xa1, 0xf7, 0x2f, 0xda, 0x0e, 0xf4, 0x34, + 0xeb, 0x2f, 0x01, 0x2e, 0x25, 0x00, 0x70, 0x1a, 0x00, 0x30, 0x21, 0x30, + 0x02, 0x2c, 0x08, 0x22, 0x30, 0x30, 0x00, 0xb2, 0x06, 0x2f, 0x21, 0x2e, + 0x59, 0xf0, 0x98, 0x2e, 0xd8, 0x00, 0x00, 0x2e, 0x00, 0x2e, 0xd0, 0x2e, + 0xfb, 0x6f, 0xf0, 0x5f, 0xb8, 0x2e, 0x01, 0x2e, 0xb1, 0xf0, 0x59, 0x52, + 0x01, 0x0a, 0x21, 0x2e, 0xb1, 0xf0, 0x01, 0x2e, 0x1c, 0x01, 0x0f, 0xbc, + 0x0f, 0xb8, 0x00, 0x90, 0x45, 0x50, 0x02, 0x2f, 0xc0, 0x2e, 0x21, 0x2e, + 0xbc, 0xf0, 0xc0, 0x2e, 0x21, 0x2e, 0xba, 0xf0, 0x1a, 0x24, 0x26, 0x00, + 0x80, 0x2e, 0x8f, 0x00, 0x03, 0x2e, 0x01, 0x01, 0x05, 0x2e, 0x01, 0x01, + 0x92, 0xbd, 0x20, 0x50, 0x03, 0x2e, 0x01, 0x01, 0xbf, 0xba, 0x21, 0xbd, + 0x2f, 0xbb, 0x1f, 0xba, 0x40, 0x91, 0xf0, 0x7f, 0x04, 0x2f, 0x80, 0x91, + 0x02, 0x2f, 0x00, 0xb3, 0x90, 0x2e, 0xc7, 0xb0, 0x03, 0x2e, 0x7b, 0x00, + 0x01, 0x80, 0x40, 0x90, 0x14, 0x2f, 0x41, 0x84, 0xf1, 0x6f, 0x25, 0x2e, + 0x7b, 0x00, 0x41, 0x40, 0x23, 0x2e, 0x5a, 0x00, 0x47, 0x52, 0x12, 0x40, + 0x52, 0x42, 0x02, 0x30, 0x00, 0x40, 0x40, 0x42, 0xe0, 0x5f, 0x25, 0x2e, + 0x57, 0x00, 0x25, 0x2e, 0x58, 0x00, 0x25, 0x2e, 0x5d, 0x00, 0xb8, 0x2e, + 0x07, 0x2e, 0x00, 0x01, 0x03, 0x2e, 0x01, 0x01, 0x05, 0x2e, 0x00, 0x01, + 0x24, 0xbd, 0x0f, 0x2e, 0x59, 0x00, 0xb5, 0xbd, 0x93, 0xbc, 0x2f, 0xb9, + 0xb5, 0xb9, 0x93, 0xb8, 0x3a, 0x1a, 0x06, 0x2f, 0x07, 0x30, 0x25, 0x2e, + 0x59, 0x00, 0x2f, 0x2e, 0x57, 0x00, 0x2f, 0x2e, 0x58, 0x00, 0x40, 0xb3, + 0x05, 0x30, 0x07, 0x30, 0x0a, 0x2f, 0xf7, 0x6f, 0xe6, 0x7f, 0x00, 0x2e, + 0xc6, 0x41, 0x0f, 0x2e, 0x5a, 0x00, 0xb7, 0x05, 0x80, 0xa9, 0xee, 0x05, + 0xf7, 0x23, 0xe6, 0x6f, 0x80, 0xb3, 0x06, 0x30, 0x09, 0x2f, 0xe7, 0x7f, + 0x00, 0x2e, 0x06, 0x40, 0x0f, 0x2e, 0x5b, 0x00, 0xb7, 0x05, 0x80, 0xa9, + 0xee, 0x05, 0xb7, 0x23, 0xe7, 0x6f, 0x00, 0xb3, 0x04, 0x30, 0x0b, 0x2f, + 0xf4, 0x6f, 0x02, 0x89, 0xe7, 0x7f, 0x00, 0x2e, 0x04, 0x41, 0x0f, 0x2e, + 0x5c, 0x00, 0x27, 0x05, 0x00, 0xa9, 0xec, 0x05, 0x27, 0x23, 0xe7, 0x6f, + 0x7b, 0x0f, 0x17, 0x30, 0x0b, 0x2f, 0x73, 0x0f, 0x05, 0x30, 0x17, 0x30, + 0x07, 0x2f, 0x63, 0x0f, 0x15, 0x30, 0x17, 0x30, 0x00, 0x2f, 0x07, 0x30, + 0xe3, 0x0e, 0x00, 0x2f, 0x05, 0x30, 0x80, 0x90, 0x05, 0x2e, 0x57, 0x00, + 0x13, 0x30, 0x13, 0x29, 0xf2, 0x6f, 0x47, 0x5c, 0x17, 0x2f, 0xc0, 0x91, + 0x05, 0x30, 0x0b, 0x2f, 0x07, 0x2e, 0x58, 0x00, 0xc1, 0x86, 0x2b, 0x2e, + 0x57, 0x00, 0x59, 0x0e, 0x27, 0x2e, 0x58, 0x00, 0x24, 0x2f, 0x2b, 0x2e, + 0x5d, 0x00, 0x22, 0x2d, 0x61, 0x0e, 0x29, 0x2e, 0x57, 0x00, 0x2b, 0x2e, + 0x58, 0x00, 0x1b, 0x2f, 0x27, 0x2e, 0x5d, 0x00, 0x19, 0x2d, 0x40, 0x91, + 0x05, 0x2f, 0x01, 0x30, 0x23, 0x2e, 0x57, 0x00, 0x23, 0x2e, 0x5d, 0x00, + 0x06, 0x2d, 0x29, 0x2e, 0x57, 0x00, 0x61, 0x0e, 0x01, 0x2f, 0x27, 0x2e, + 0x5d, 0x00, 0x81, 0x40, 0x23, 0x2e, 0x5a, 0x00, 0x30, 0x25, 0x47, 0x52, + 0xd4, 0x40, 0x54, 0x42, 0x00, 0x2e, 0xc3, 0x40, 0x43, 0x42, 0x00, 0x2e, + 0x03, 0x2e, 0x5d, 0x00, 0x40, 0xb2, 0x0d, 0x2f, 0x81, 0x40, 0x23, 0x2e, + 0x5a, 0x00, 0x11, 0x40, 0x91, 0x43, 0x01, 0x34, 0x00, 0x40, 0x80, 0x43, + 0x23, 0x2e, 0x5e, 0xf0, 0x03, 0x2d, 0x00, 0x30, 0x21, 0x2e, 0x7b, 0x00, + 0xe0, 0x5f, 0xb8, 0x2e, 0x50, 0x50, 0xf0, 0x7f, 0x1a, 0x25, 0x13, 0x40, + 0x7b, 0x84, 0xe0, 0x7f, 0x83, 0x42, 0x35, 0x30, 0x11, 0x40, 0x04, 0x40, + 0xc1, 0x7f, 0xd4, 0x7f, 0x86, 0x31, 0x07, 0x2e, 0x59, 0xf0, 0x03, 0x2e, + 0x1f, 0x01, 0x0d, 0x09, 0x02, 0xab, 0x05, 0x30, 0x8e, 0x09, 0x2c, 0x23, + 0xe3, 0xba, 0x42, 0xab, 0x16, 0x30, 0x75, 0x23, 0x59, 0x5c, 0x8e, 0x09, + 0x66, 0xbb, 0x82, 0xab, 0x27, 0x30, 0xbe, 0x23, 0x3e, 0x80, 0x25, 0x1a, + 0x06, 0x2f, 0x2e, 0x1a, 0x04, 0x2f, 0x26, 0x1a, 0x02, 0x2f, 0xf7, 0x3d, + 0x03, 0x2c, 0xdf, 0x08, 0x07, 0x32, 0xdf, 0x0a, 0x14, 0x01, 0x55, 0x01, + 0x04, 0x41, 0x14, 0x42, 0x16, 0x01, 0x42, 0x41, 0x45, 0x30, 0x4d, 0x09, + 0x04, 0x41, 0x12, 0x42, 0x04, 0x42, 0x40, 0xb3, 0x04, 0x2f, 0xf0, 0x6f, + 0x02, 0x30, 0x04, 0x40, 0x94, 0x04, 0x02, 0x42, 0x00, 0x32, 0x08, 0x08, + 0x00, 0xb2, 0x00, 0x30, 0x05, 0x2f, 0xe2, 0x6f, 0x00, 0x2e, 0x84, 0x40, + 0x04, 0x05, 0x84, 0x42, 0x00, 0x2e, 0x5b, 0x54, 0x4a, 0x08, 0x40, 0xb2, + 0xf1, 0x6f, 0x04, 0x2f, 0x42, 0x82, 0x00, 0x2e, 0x42, 0x40, 0x02, 0x04, + 0x40, 0x42, 0xb0, 0x5f, 0x27, 0x2e, 0x59, 0xf0, 0xb8, 0x2e, 0x50, 0x50, + 0xf7, 0x7f, 0x00, 0x2e, 0x0f, 0x2e, 0xb8, 0xf0, 0xf8, 0xbf, 0xff, 0xbb, + 0xc0, 0xb3, 0x2a, 0x2f, 0x0f, 0x2e, 0x01, 0xf0, 0xfe, 0xbf, 0xe6, 0x7f, + 0x7e, 0xbb, 0xd5, 0x7f, 0x37, 0x30, 0x5f, 0x5a, 0xbe, 0x05, 0x67, 0x41, + 0xc4, 0x7f, 0x78, 0xbe, 0x47, 0x41, 0x27, 0x0b, 0xb3, 0x7f, 0xe6, 0x11, + 0x41, 0x56, 0x43, 0x89, 0xd7, 0x42, 0x00, 0x2e, 0x27, 0x41, 0x05, 0x41, + 0xf8, 0xbf, 0x7d, 0x0b, 0x6e, 0x11, 0x03, 0x8f, 0xd5, 0x42, 0x14, 0x30, + 0xe5, 0x41, 0xc7, 0x41, 0xd8, 0xbe, 0x6f, 0x0b, 0x6e, 0x11, 0xc5, 0x42, + 0x29, 0x2e, 0x56, 0x00, 0x45, 0x56, 0x27, 0x2e, 0xb8, 0xf0, 0xe6, 0x6f, + 0xd5, 0x6f, 0xc4, 0x6f, 0xb3, 0x6f, 0xf7, 0x6f, 0xb0, 0x5f, 0xc8, 0x2e, + 0x50, 0x50, 0xe5, 0x7f, 0xd7, 0x7f, 0xf6, 0x7f, 0x36, 0x30, 0x0b, 0x2e, + 0x01, 0xf0, 0xde, 0xbe, 0xde, 0xbb, 0x61, 0x5a, 0xb7, 0x05, 0x67, 0x41, + 0xc4, 0x7f, 0x78, 0xbe, 0x47, 0x41, 0x27, 0x0b, 0xb3, 0x7f, 0xe6, 0x11, + 0x43, 0x56, 0x43, 0x89, 0xd7, 0x42, 0x00, 0x2e, 0x27, 0x41, 0x05, 0x41, + 0xf8, 0xbf, 0x7d, 0x0b, 0x6e, 0x11, 0x03, 0x8f, 0xd5, 0x42, 0x14, 0x30, + 0xe5, 0x41, 0xc7, 0x41, 0xd8, 0xbe, 0x6f, 0x0b, 0x6e, 0x11, 0xc5, 0x42, + 0x29, 0x2e, 0x55, 0x00, 0x03, 0x31, 0x27, 0x2e, 0xb8, 0xf0, 0xf6, 0x6f, + 0xe5, 0x6f, 0xd7, 0x6f, 0xc4, 0x6f, 0xb3, 0x6f, 0xb0, 0x5f, 0xc8, 0x2e, + 0x40, 0x50, 0xf6, 0x7f, 0x1a, 0x18, 0x63, 0x56, 0x33, 0x00, 0x06, 0x30, + 0xfe, 0x03, 0x0e, 0xb8, 0xf2, 0xbf, 0x07, 0x0a, 0x2a, 0x18, 0x63, 0x5a, + 0xb5, 0x01, 0x03, 0x30, 0xfb, 0x03, 0x6e, 0xbb, 0xf2, 0xbf, 0xe1, 0x7f, + 0xf7, 0x0b, 0x56, 0x40, 0x36, 0x25, 0x46, 0x40, 0x06, 0x28, 0xc7, 0x7f, + 0x22, 0x18, 0xd1, 0x7f, 0xb5, 0x00, 0x01, 0x30, 0x39, 0x03, 0x2e, 0xb9, + 0x42, 0xbe, 0x14, 0x0b, 0xf2, 0x6f, 0x10, 0x18, 0xb5, 0x00, 0xb9, 0x03, + 0x2e, 0xb9, 0x62, 0xbf, 0x96, 0x0a, 0xb6, 0x6f, 0x30, 0x18, 0x75, 0x01, + 0xb9, 0x03, 0x5c, 0x28, 0xe2, 0xbf, 0xde, 0xb9, 0xd6, 0x6f, 0xdf, 0x0a, + 0x8a, 0x28, 0xc4, 0x6f, 0x82, 0x43, 0x23, 0x29, 0xe5, 0x6f, 0xc0, 0x2e, + 0x44, 0x43, 0xc0, 0x5f, 0x40, 0x50, 0xd0, 0x7f, 0x4a, 0x17, 0x00, 0x40, + 0x01, 0x18, 0x46, 0x25, 0x07, 0x25, 0x65, 0x56, 0xd9, 0x04, 0x53, 0x18, + 0xeb, 0x18, 0x05, 0x30, 0x49, 0x16, 0x69, 0x06, 0xca, 0x18, 0xa6, 0x00, + 0xc7, 0x02, 0x65, 0x58, 0xcb, 0x7f, 0x98, 0x2e, 0x7f, 0xb6, 0xcb, 0x6f, + 0xd2, 0x6f, 0xc0, 0x2e, 0x80, 0x42, 0xc0, 0x5f, 0x09, 0x2e, 0x1b, 0x01, + 0x05, 0x2e, 0x1b, 0x01, 0xa3, 0xbc, 0x44, 0xbe, 0x90, 0x50, 0x4f, 0xb9, + 0x07, 0x2e, 0x1b, 0x01, 0x4a, 0x25, 0x9f, 0xb8, 0x39, 0x8f, 0xb2, 0xbd, + 0xf2, 0x7f, 0xbf, 0xb9, 0xeb, 0x7f, 0x8a, 0x0a, 0x37, 0x89, 0x0b, 0x30, + 0x93, 0x0a, 0x8b, 0x7f, 0xcb, 0x43, 0x0b, 0x43, 0x80, 0xb2, 0xd3, 0x7f, + 0xc1, 0x7f, 0x90, 0x2e, 0x87, 0xb2, 0x20, 0x25, 0x01, 0x2e, 0x64, 0x00, + 0x01, 0x90, 0x0e, 0x2f, 0x67, 0x52, 0x01, 0x2e, 0x61, 0x00, 0xb4, 0x7f, + 0xa2, 0x7f, 0x98, 0x2e, 0x8d, 0xb2, 0x00, 0x30, 0x21, 0x2e, 0x64, 0x00, + 0xc1, 0x6f, 0xd3, 0x6f, 0xa2, 0x6f, 0xb4, 0x6f, 0x0b, 0x30, 0x01, 0x2e, + 0x1b, 0x01, 0x06, 0xbc, 0x06, 0xbb, 0x57, 0x25, 0x01, 0x2e, 0x1b, 0x01, + 0x94, 0xb1, 0x05, 0xbc, 0xb6, 0x7f, 0x0f, 0xbb, 0x6b, 0x50, 0x80, 0xb3, + 0x0f, 0x2f, 0x0d, 0x2e, 0x1b, 0x01, 0x6f, 0x5e, 0xb7, 0x09, 0x2d, 0x2e, + 0x1b, 0x01, 0x71, 0x5c, 0x69, 0x5e, 0x9b, 0x43, 0x9b, 0x43, 0xdb, 0x43, + 0x9b, 0x43, 0x1b, 0x42, 0xcb, 0x43, 0x0b, 0x42, 0x8b, 0x43, 0x40, 0xb2, + 0x05, 0x2f, 0x69, 0x50, 0x00, 0x2e, 0x16, 0x40, 0x0b, 0x40, 0x76, 0x7f, + 0x8b, 0x7f, 0xcb, 0x0a, 0x01, 0x2e, 0x61, 0x00, 0x67, 0x52, 0x6d, 0x5c, + 0x98, 0x2e, 0xd3, 0xb2, 0x90, 0x6f, 0x00, 0xb2, 0x0b, 0x2f, 0xf0, 0x6f, + 0x00, 0xb2, 0x08, 0x2f, 0x69, 0x58, 0x6b, 0x50, 0x12, 0x41, 0x12, 0x42, + 0x21, 0x30, 0x04, 0x41, 0x04, 0x42, 0x23, 0x2e, 0x5e, 0xf0, 0xc0, 0x6f, + 0x00, 0xb2, 0x26, 0x2f, 0x74, 0x6f, 0x80, 0x6f, 0x71, 0x54, 0x88, 0xbd, + 0xc8, 0xb8, 0x4b, 0x0a, 0x94, 0x42, 0x91, 0x42, 0x90, 0x42, 0x88, 0xba, + 0x69, 0x52, 0xf3, 0x6f, 0x54, 0x42, 0x85, 0x42, 0xc0, 0x90, 0x40, 0x42, + 0x15, 0x2f, 0x6b, 0x52, 0x00, 0x2e, 0x52, 0x40, 0x41, 0x40, 0xa2, 0x04, + 0x41, 0x06, 0x40, 0xaa, 0x04, 0x2f, 0x40, 0x90, 0x0b, 0x2f, 0xb1, 0x6f, + 0x4a, 0x0f, 0x08, 0x2f, 0xb2, 0x6f, 0x80, 0xb2, 0x05, 0x2f, 0x6b, 0x54, + 0x21, 0x30, 0x94, 0x42, 0x80, 0x42, 0x23, 0x2e, 0x5e, 0xf0, 0xd0, 0x6f, + 0x00, 0xb2, 0x13, 0x2f, 0x01, 0x2e, 0x60, 0x00, 0x09, 0x2e, 0x7c, 0x00, + 0x04, 0x1a, 0x0d, 0x2f, 0x73, 0x50, 0x29, 0x2e, 0x60, 0x00, 0x24, 0x42, + 0x44, 0x30, 0x02, 0x40, 0x02, 0x42, 0x09, 0x80, 0x00, 0x2e, 0x04, 0x42, + 0x03, 0x2d, 0x10, 0x30, 0x21, 0x2e, 0x64, 0x00, 0xeb, 0x6f, 0x70, 0x5f, + 0xb8, 0x2e, 0x09, 0x86, 0x49, 0x54, 0xe4, 0x40, 0xc3, 0x80, 0x94, 0x04, + 0xc3, 0x40, 0x13, 0x05, 0x05, 0x40, 0x25, 0x05, 0x8a, 0x17, 0x73, 0x30, + 0x73, 0x09, 0x8c, 0x17, 0xf3, 0x08, 0xe3, 0x00, 0x4c, 0x82, 0x95, 0x00, + 0xb3, 0xb5, 0x23, 0xb5, 0x53, 0x42, 0x52, 0x42, 0x53, 0x42, 0x42, 0x42, + 0x71, 0x82, 0x75, 0x54, 0x52, 0x42, 0x10, 0x50, 0x77, 0x54, 0x52, 0x42, + 0xfb, 0x7f, 0x22, 0x30, 0x79, 0x56, 0x43, 0x42, 0x44, 0x82, 0x0b, 0x30, + 0x52, 0x42, 0x5b, 0x42, 0x7c, 0x84, 0x4b, 0x42, 0x35, 0x82, 0x8c, 0x80, + 0x8b, 0x42, 0x0b, 0x42, 0x39, 0x80, 0x04, 0x30, 0x0b, 0x42, 0x37, 0x80, + 0x15, 0x30, 0x60, 0x25, 0x98, 0x2e, 0xc6, 0xb2, 0x8b, 0x83, 0xfb, 0x6f, + 0x65, 0x42, 0xc0, 0x2e, 0x44, 0x42, 0xf0, 0x5f, 0x05, 0x80, 0x02, 0x30, + 0x51, 0x82, 0x02, 0x42, 0x13, 0x30, 0x41, 0x40, 0x4b, 0x08, 0x7b, 0x54, + 0x3e, 0x80, 0x51, 0x14, 0xc0, 0x2e, 0x01, 0x42, 0x00, 0x2e, 0x40, 0x51, + 0xd1, 0x7f, 0x12, 0x25, 0x02, 0x30, 0x42, 0x43, 0x32, 0x30, 0x82, 0x43, + 0xc6, 0x7f, 0xe5, 0x7f, 0xb4, 0x7f, 0xa3, 0x7f, 0x90, 0x7f, 0x8b, 0x7f, + 0x98, 0x2e, 0x54, 0x01, 0xc0, 0x7e, 0x00, 0xac, 0x01, 0x2f, 0x65, 0x50, + 0xc0, 0x7e, 0x00, 0x2e, 0x90, 0x6f, 0x09, 0x8a, 0xd1, 0x6f, 0x75, 0x7f, + 0x4c, 0x82, 0x63, 0x41, 0x65, 0x7f, 0x11, 0x7f, 0x00, 0x2e, 0x64, 0x41, + 0x44, 0x85, 0x52, 0x7f, 0x45, 0x7f, 0x00, 0x2e, 0xa6, 0x40, 0x80, 0x40, + 0x32, 0x7f, 0x82, 0x8e, 0xc2, 0x6e, 0x45, 0x41, 0xf0, 0x7f, 0x27, 0x7f, + 0x02, 0x7f, 0x98, 0x2e, 0x8a, 0xb1, 0x23, 0x6f, 0xd1, 0x6f, 0xc2, 0x40, + 0xf9, 0x86, 0x23, 0x7f, 0x80, 0xb2, 0xe0, 0x7e, 0x0f, 0x2f, 0x32, 0x6f, + 0x64, 0x6f, 0x82, 0x40, 0xf2, 0x7f, 0x4e, 0x82, 0x42, 0x6f, 0x50, 0x6f, + 0x73, 0x6f, 0x85, 0x40, 0xc3, 0x40, 0x04, 0x41, 0x06, 0x40, 0xe2, 0x6e, + 0x98, 0x2e, 0x8a, 0xb1, 0xe0, 0x7e, 0xf3, 0x31, 0x10, 0x6f, 0x36, 0x80, + 0xe1, 0x6e, 0x02, 0x40, 0x71, 0x7f, 0x51, 0x04, 0x02, 0x30, 0x40, 0xa8, + 0x91, 0x04, 0x4a, 0x22, 0x89, 0x16, 0x93, 0x08, 0x4a, 0x00, 0x95, 0xb4, + 0x09, 0x18, 0x8e, 0x16, 0x13, 0x30, 0x93, 0x08, 0x21, 0x6f, 0x60, 0x7f, + 0x4d, 0x86, 0x02, 0x80, 0xb2, 0x00, 0x41, 0x40, 0x21, 0xb5, 0x50, 0x7f, + 0x43, 0x7f, 0x98, 0x2e, 0xc2, 0xb1, 0x40, 0x6f, 0x62, 0x6f, 0x55, 0x6f, + 0x13, 0x40, 0x84, 0x40, 0x01, 0x40, 0x45, 0x41, 0x42, 0xbe, 0x1d, 0x18, + 0x4c, 0x04, 0x31, 0x0f, 0x04, 0x8a, 0xc0, 0x6f, 0x11, 0x30, 0x02, 0x2f, + 0x00, 0x2e, 0x03, 0x2c, 0x01, 0x42, 0x23, 0x30, 0x03, 0x42, 0x00, 0x2e, + 0xd6, 0x6f, 0x44, 0x41, 0x8a, 0x87, 0x76, 0x8b, 0x00, 0xb3, 0x53, 0x7f, + 0x15, 0x2f, 0x04, 0x6f, 0x7d, 0x5e, 0x8b, 0x8d, 0xe7, 0x01, 0xc0, 0xa5, + 0x84, 0x41, 0x01, 0x2f, 0x00, 0xa1, 0x03, 0x2f, 0xc0, 0xad, 0x08, 0x2f, + 0x00, 0xa5, 0x06, 0x2f, 0xc6, 0x40, 0x81, 0x8d, 0x07, 0x30, 0x3c, 0x05, + 0xd6, 0x42, 0x04, 0x2c, 0xc4, 0x42, 0x02, 0x2c, 0x07, 0x30, 0x07, 0x30, + 0x86, 0x86, 0x94, 0x6f, 0xd7, 0x7e, 0x0e, 0x8d, 0x00, 0x40, 0x74, 0x89, + 0xc7, 0x40, 0x02, 0xb2, 0xf9, 0x29, 0x45, 0x41, 0x86, 0x41, 0xbe, 0x80, + 0x21, 0x41, 0x75, 0x23, 0x82, 0x40, 0xc7, 0x42, 0x45, 0x7f, 0x34, 0x7f, + 0x20, 0x7f, 0x98, 0x2e, 0xc2, 0xb1, 0x31, 0x6f, 0x60, 0x6f, 0x24, 0x6f, + 0x22, 0x40, 0x05, 0x41, 0x43, 0x40, 0x13, 0x01, 0x43, 0x86, 0xac, 0x0f, + 0xd1, 0x6f, 0x30, 0x7f, 0x00, 0x2f, 0x44, 0x42, 0x48, 0x8a, 0x41, 0x88, + 0xe1, 0x40, 0x13, 0x7f, 0x04, 0x7f, 0xf5, 0x7e, 0x98, 0x2e, 0xc2, 0xb1, + 0x11, 0x6f, 0x60, 0x6f, 0x34, 0x6f, 0x42, 0x40, 0x03, 0x40, 0x9a, 0x04, + 0x04, 0x41, 0x43, 0x82, 0xa2, 0x0e, 0x03, 0x6f, 0x00, 0x2f, 0xc2, 0x42, + 0x00, 0x2e, 0x41, 0x40, 0x72, 0x6f, 0x98, 0x2e, 0xc2, 0xb1, 0x25, 0x6f, + 0x72, 0x6f, 0x53, 0x41, 0x93, 0x0e, 0xd1, 0x6f, 0x46, 0x80, 0x1b, 0x30, + 0x03, 0x30, 0x0c, 0x2f, 0x04, 0x40, 0x00, 0x91, 0x42, 0x42, 0x08, 0x2f, + 0xf6, 0x6e, 0x44, 0x6f, 0x86, 0x41, 0xb4, 0x0e, 0x03, 0x2f, 0x02, 0x88, + 0xdb, 0x7e, 0x03, 0x43, 0x0b, 0x42, 0x46, 0x8d, 0x44, 0x41, 0x47, 0x80, + 0x05, 0x6f, 0x94, 0x0f, 0x76, 0x7f, 0x60, 0x7f, 0x02, 0x2f, 0x45, 0x89, + 0x42, 0x43, 0x03, 0x43, 0x49, 0x88, 0xa5, 0x6f, 0x40, 0x91, 0xa4, 0x7f, + 0x15, 0x30, 0xe2, 0x6f, 0xd3, 0x6e, 0x03, 0x2f, 0x04, 0x30, 0x83, 0x42, + 0x80, 0x2e, 0x77, 0xb4, 0x04, 0x40, 0x25, 0x29, 0x04, 0x42, 0x83, 0x42, + 0x45, 0x82, 0x94, 0x6f, 0x04, 0x85, 0xc0, 0xb2, 0x90, 0x2e, 0x63, 0xb4, + 0x15, 0x87, 0x3c, 0x8c, 0xc4, 0x40, 0x46, 0x7f, 0xc2, 0x86, 0x07, 0x40, + 0x86, 0x41, 0xf4, 0xbf, 0x00, 0xb3, 0x0c, 0x2f, 0x90, 0x6f, 0x16, 0x80, + 0x46, 0x25, 0x00, 0x40, 0x57, 0x25, 0x04, 0x18, 0xae, 0x0e, 0x10, 0x30, + 0x06, 0x30, 0x75, 0x25, 0x46, 0x23, 0x60, 0x6f, 0x64, 0x25, 0xc4, 0x40, + 0xfa, 0x86, 0x00, 0xb3, 0x33, 0x7f, 0x09, 0x2f, 0x93, 0x6f, 0xd8, 0x88, + 0x53, 0x6f, 0x04, 0x41, 0xc3, 0x40, 0xdc, 0x0e, 0x13, 0x30, 0x04, 0x30, + 0xdc, 0x22, 0xb3, 0x25, 0x40, 0xb3, 0x02, 0x2f, 0x3b, 0x25, 0xc0, 0x90, + 0x05, 0x2f, 0x91, 0x6f, 0xd0, 0x6f, 0x98, 0x2e, 0xc6, 0xb2, 0x4d, 0x2c, + 0x04, 0x30, 0x8d, 0x88, 0x43, 0x40, 0x82, 0x40, 0x54, 0x7f, 0xda, 0x0f, + 0x04, 0x30, 0x08, 0x2f, 0xc1, 0x80, 0x40, 0x42, 0xc2, 0x0f, 0x02, 0x2f, + 0x00, 0x30, 0xc0, 0x7e, 0x1b, 0x2d, 0xc0, 0x7e, 0x19, 0x2d, 0xe1, 0xbc, + 0x92, 0x6f, 0x4f, 0x04, 0x90, 0x84, 0x40, 0xa8, 0x21, 0x05, 0x83, 0x40, + 0x4c, 0x22, 0x4b, 0x0e, 0xb6, 0x84, 0x21, 0x30, 0x02, 0x2f, 0x11, 0x30, + 0x04, 0x2c, 0xc1, 0x7e, 0xe3, 0x6f, 0xc1, 0x7e, 0xc1, 0x42, 0x00, 0x2e, + 0x00, 0x40, 0x81, 0x40, 0x04, 0xbd, 0x40, 0x6f, 0x98, 0x2e, 0xc2, 0xb1, + 0x50, 0x6f, 0x11, 0x30, 0x02, 0x40, 0x51, 0x08, 0xc3, 0x6e, 0x03, 0x80, + 0x99, 0x15, 0x0b, 0x40, 0xb1, 0x6f, 0xd0, 0x6f, 0xb6, 0x7f, 0x5b, 0x7f, + 0x04, 0x30, 0x4d, 0x54, 0x03, 0x30, 0x11, 0x2c, 0x10, 0x80, 0x55, 0x6f, + 0x06, 0x40, 0x75, 0x01, 0x58, 0xbb, 0x6a, 0x09, 0x05, 0x42, 0xc1, 0x86, + 0x47, 0x40, 0x51, 0x25, 0xbe, 0x01, 0x56, 0x43, 0x00, 0x2e, 0x46, 0x41, + 0xf4, 0x03, 0xb6, 0x6f, 0x47, 0x43, 0x5e, 0x0e, 0xed, 0x2f, 0x31, 0x6f, + 0x60, 0x6f, 0x42, 0x40, 0x15, 0x30, 0x02, 0x82, 0x95, 0x08, 0x04, 0x42, + 0x52, 0x42, 0x02, 0x2c, 0x44, 0x42, 0x04, 0x30, 0x3e, 0x8e, 0x91, 0x6f, + 0x4f, 0x8c, 0x02, 0x40, 0x83, 0x41, 0xb5, 0x8d, 0x93, 0x0e, 0xd0, 0x6f, + 0x01, 0x2f, 0x98, 0x2e, 0xc6, 0xb2, 0x00, 0x2e, 0xc0, 0x41, 0x81, 0x41, + 0xc1, 0x0f, 0xc0, 0x6f, 0x01, 0x2f, 0x04, 0x42, 0x00, 0x2e, 0x70, 0x6f, + 0x3c, 0x82, 0x00, 0x40, 0x41, 0x40, 0x89, 0x16, 0x95, 0x08, 0x4a, 0x00, + 0x04, 0xbc, 0x91, 0xb4, 0x01, 0x0e, 0xe0, 0x6f, 0x07, 0x2f, 0xa1, 0x6f, + 0x00, 0x2e, 0x41, 0x40, 0x40, 0xb2, 0x02, 0x2f, 0xa1, 0x6f, 0x05, 0x42, + 0x44, 0x42, 0x00, 0x2e, 0x8b, 0x6f, 0xc0, 0x5e, 0xb8, 0x2e, 0x03, 0x2e, + 0x1c, 0x01, 0x9c, 0xbc, 0x1d, 0xb9, 0x02, 0x82, 0x25, 0x2e, 0x8e, 0x00, + 0x83, 0x56, 0x13, 0x18, 0x01, 0x2e, 0x66, 0x00, 0x43, 0x40, 0xd8, 0x04, + 0x05, 0x2e, 0x65, 0x00, 0x40, 0x50, 0x27, 0x2e, 0x65, 0x00, 0xfb, 0x7f, + 0xda, 0x05, 0x8b, 0x50, 0x4b, 0x40, 0x02, 0x40, 0x81, 0x82, 0x01, 0x42, + 0x03, 0x80, 0x81, 0x52, 0xb1, 0x00, 0x03, 0x40, 0x3b, 0x82, 0x85, 0x58, + 0x14, 0x01, 0xc0, 0xb2, 0x37, 0x2e, 0x66, 0x00, 0xd1, 0x7f, 0xe2, 0x7f, + 0x04, 0x2f, 0x05, 0x2e, 0x6b, 0x00, 0x81, 0x84, 0x25, 0x2e, 0x6b, 0x00, + 0x62, 0x40, 0x3a, 0x0f, 0x45, 0x40, 0xc1, 0x7f, 0x21, 0x30, 0x12, 0x30, + 0x42, 0x2f, 0x0d, 0x2e, 0x69, 0x00, 0x3e, 0x0e, 0x33, 0x2f, 0x05, 0x2e, + 0x6a, 0x00, 0x01, 0x35, 0x91, 0x0e, 0x01, 0x30, 0x03, 0x2f, 0x09, 0x2e, + 0x6e, 0x00, 0x00, 0xb3, 0x24, 0x2f, 0xc0, 0x35, 0x90, 0x0e, 0x39, 0x2f, + 0x8f, 0x50, 0x02, 0x30, 0x01, 0x40, 0x7f, 0x82, 0x43, 0xa2, 0x02, 0x2f, + 0x00, 0x2e, 0x0c, 0x2c, 0x01, 0x30, 0xc0, 0xb2, 0x11, 0x30, 0x02, 0x2f, + 0x25, 0x2e, 0x6d, 0x00, 0x03, 0x2d, 0x23, 0x2e, 0x6d, 0x00, 0x21, 0x30, + 0x25, 0x2e, 0x6b, 0x00, 0x42, 0xb2, 0x04, 0x2f, 0x41, 0xb2, 0x02, 0x2f, + 0x25, 0x2e, 0x6d, 0x00, 0x31, 0x30, 0x3e, 0x80, 0x04, 0x86, 0x25, 0x2e, + 0x6c, 0x00, 0x02, 0x42, 0xc2, 0x42, 0x18, 0x2d, 0x02, 0x35, 0x01, 0x42, + 0x25, 0x2e, 0x6a, 0x00, 0x13, 0x2d, 0x2c, 0x04, 0x38, 0x1e, 0x21, 0x2e, + 0x69, 0x00, 0x7f, 0x50, 0x11, 0x30, 0x22, 0x30, 0x98, 0x2e, 0x66, 0xb5, + 0x09, 0x2c, 0x01, 0x30, 0x2c, 0x00, 0x38, 0x1c, 0x21, 0x2e, 0x68, 0x00, + 0x7f, 0x50, 0x98, 0x2e, 0x66, 0xb5, 0x01, 0x30, 0xc0, 0x6f, 0xd4, 0xb1, + 0xf5, 0xbd, 0x6b, 0xba, 0x91, 0x5a, 0x02, 0x40, 0x15, 0x18, 0xf5, 0xbe, + 0xeb, 0xbb, 0xe3, 0x0a, 0x3d, 0x0b, 0xd2, 0x6f, 0xe3, 0x00, 0x84, 0x40, + 0x63, 0x05, 0x93, 0x58, 0x2c, 0x18, 0xf5, 0xbe, 0x03, 0x42, 0xeb, 0xbb, + 0xfd, 0x0b, 0xe0, 0x6f, 0x58, 0x01, 0xdf, 0x01, 0x7d, 0x1f, 0x95, 0x42, + 0x18, 0x04, 0x85, 0x40, 0x5d, 0x05, 0x2c, 0x18, 0x75, 0xbe, 0xeb, 0xba, + 0x2c, 0x0b, 0xdc, 0x04, 0x18, 0x1c, 0x80, 0x42, 0x84, 0x80, 0x02, 0x30, + 0x00, 0x40, 0x00, 0xb2, 0x0c, 0x2f, 0x01, 0x2e, 0x6b, 0x00, 0x03, 0x35, + 0x83, 0x0e, 0x07, 0x2f, 0x8d, 0x50, 0x3e, 0x80, 0x25, 0x2e, 0x6d, 0x00, + 0x02, 0x42, 0x03, 0x80, 0x00, 0x2e, 0x02, 0x42, 0x40, 0xb2, 0x04, 0x2f, + 0x8b, 0x50, 0x04, 0x80, 0x25, 0x2e, 0x6a, 0x00, 0x02, 0x42, 0x42, 0xb2, + 0x89, 0x56, 0x9a, 0x22, 0x41, 0xb2, 0x01, 0x2e, 0x1c, 0x01, 0x87, 0x52, + 0x0b, 0xbc, 0x8a, 0x22, 0x0f, 0xb8, 0x00, 0x90, 0x01, 0x32, 0x06, 0x2f, + 0x10, 0x30, 0x90, 0x08, 0x80, 0xb2, 0x08, 0x2f, 0x23, 0x2e, 0x5e, 0xf0, + 0x06, 0x2d, 0x20, 0x30, 0x90, 0x08, 0x80, 0xb2, 0x01, 0x2f, 0x23, 0x2e, + 0x5e, 0xf0, 0xfb, 0x6f, 0xc0, 0x5f, 0xb8, 0x2e, 0x07, 0x86, 0xfc, 0x88, + 0xc6, 0x40, 0x05, 0x41, 0x31, 0x1a, 0x12, 0x2f, 0x80, 0x91, 0x22, 0x2f, + 0x01, 0x35, 0x29, 0x0f, 0x0a, 0x2f, 0x06, 0x80, 0x00, 0x2e, 0x00, 0x40, + 0x00, 0xb2, 0x01, 0x2f, 0x44, 0xa9, 0x03, 0x2f, 0x00, 0x30, 0xc0, 0x42, + 0x00, 0x43, 0xb8, 0x2e, 0xc2, 0x42, 0x01, 0x43, 0xb8, 0x2e, 0x01, 0x35, + 0xa9, 0x0e, 0x0e, 0x2f, 0x03, 0x3b, 0xeb, 0x00, 0xcc, 0xa8, 0x0a, 0x2f, + 0x05, 0x86, 0xc2, 0x80, 0xc3, 0x40, 0x02, 0x42, 0x3c, 0x84, 0xc1, 0x80, + 0x81, 0x42, 0x82, 0x84, 0xc0, 0x2e, 0x80, 0x42, 0x00, 0x2e, 0xb8, 0x2e, + 0x03, 0x2e, 0x1d, 0x01, 0x9f, 0xbc, 0x9f, 0xb8, 0x90, 0x50, 0x40, 0xb2, + 0x90, 0x2e, 0x71, 0xb6, 0x12, 0x40, 0x03, 0x30, 0x11, 0x40, 0x80, 0xa8, + 0x5a, 0x05, 0x9f, 0x58, 0x55, 0x23, 0x00, 0x40, 0x75, 0x7f, 0x40, 0xa8, + 0x16, 0x41, 0xd9, 0x05, 0xcf, 0x23, 0x56, 0x05, 0x40, 0xa9, 0x9d, 0x05, + 0x87, 0x7f, 0x6e, 0x23, 0x17, 0x41, 0xa5, 0x7f, 0x3e, 0x8b, 0x04, 0x41, + 0x52, 0x43, 0x00, 0xa8, 0x98, 0x05, 0xf2, 0x7f, 0x86, 0x22, 0xcf, 0x05, + 0xc0, 0xa9, 0x9f, 0x05, 0xbe, 0x23, 0x04, 0x05, 0x92, 0x7f, 0x00, 0xa9, + 0xdc, 0x05, 0x51, 0x43, 0xb6, 0x7f, 0x27, 0x23, 0xa7, 0x54, 0xe1, 0x7f, + 0x02, 0x18, 0x7d, 0x83, 0x40, 0x43, 0xeb, 0xba, 0x75, 0xbd, 0xaa, 0x0a, + 0x0b, 0x2e, 0x71, 0x00, 0x77, 0x5c, 0x2e, 0x18, 0xf5, 0xbe, 0x6b, 0xbb, + 0x75, 0x0b, 0xaa, 0x00, 0xc4, 0x7f, 0x25, 0x2e, 0x71, 0x00, 0xb2, 0x6f, + 0xa5, 0x6f, 0xaa, 0x00, 0x54, 0x01, 0x84, 0x6f, 0x72, 0x6f, 0x94, 0x05, + 0x80, 0xa9, 0xde, 0x05, 0xb7, 0x23, 0x99, 0x5e, 0x77, 0x0e, 0x41, 0x40, + 0x97, 0x5c, 0xb1, 0x01, 0xd5, 0x7f, 0x00, 0x2e, 0x85, 0x41, 0x0e, 0x2f, + 0x00, 0xa0, 0x0c, 0x2f, 0x14, 0x0f, 0x04, 0x2f, 0xe0, 0x6f, 0x00, 0xac, + 0x10, 0x30, 0x08, 0x2c, 0x18, 0x22, 0xf0, 0x6f, 0x00, 0xac, 0x30, 0x30, + 0x24, 0x30, 0x02, 0x2c, 0x20, 0x22, 0x40, 0x30, 0x0d, 0x2e, 0x71, 0x00, + 0x80, 0xa1, 0x1e, 0x23, 0x79, 0x5e, 0x37, 0x0f, 0xbc, 0x23, 0x00, 0x90, + 0x14, 0x30, 0x10, 0x30, 0x18, 0x2f, 0x9d, 0x50, 0x30, 0x00, 0x9b, 0x56, + 0x43, 0x0e, 0x02, 0x2f, 0x10, 0x30, 0x0a, 0x2c, 0x03, 0x30, 0x99, 0x50, + 0x10, 0x0e, 0x13, 0x30, 0x00, 0x2f, 0x03, 0x30, 0x90, 0x0f, 0x10, 0x30, + 0x00, 0x2f, 0x00, 0x30, 0x00, 0x90, 0x10, 0x30, 0x00, 0x2f, 0x00, 0x30, + 0xc0, 0x90, 0x13, 0x30, 0x00, 0x2f, 0x03, 0x30, 0x40, 0xb2, 0x87, 0x5c, + 0x22, 0x2f, 0x41, 0x90, 0x4a, 0x2f, 0xa5, 0x50, 0x00, 0x2e, 0x01, 0x40, + 0x41, 0x82, 0x01, 0x42, 0x02, 0x80, 0x4a, 0xa8, 0x01, 0x40, 0x06, 0x2f, + 0xd0, 0x6f, 0x85, 0x0e, 0x3e, 0x2f, 0x41, 0x80, 0x21, 0x2e, 0x78, 0x00, + 0x3b, 0x2d, 0x95, 0x50, 0xfb, 0x7f, 0x4a, 0xa8, 0x06, 0x2f, 0x98, 0x2e, + 0x73, 0xb6, 0xc0, 0x90, 0xfb, 0x6f, 0x32, 0x2f, 0x00, 0x2e, 0x30, 0x2d, + 0x98, 0x2e, 0x73, 0xb6, 0x29, 0x2e, 0x7a, 0x00, 0x2b, 0x2c, 0xfb, 0x6f, + 0xa1, 0x52, 0xd2, 0x6f, 0x95, 0x0e, 0x41, 0x40, 0x05, 0x2f, 0x00, 0x90, + 0x17, 0x2f, 0x05, 0x2e, 0x7a, 0x00, 0x80, 0x90, 0x13, 0x2f, 0x7f, 0x82, + 0x40, 0xac, 0x23, 0x2e, 0x77, 0x00, 0x01, 0x30, 0x18, 0x2f, 0xa1, 0x54, + 0x82, 0x84, 0x23, 0x2e, 0x77, 0x00, 0x82, 0x40, 0x80, 0xb2, 0x11, 0x2f, + 0x00, 0x90, 0x23, 0x2e, 0x79, 0x00, 0x0d, 0x2f, 0x29, 0x2e, 0x72, 0x00, + 0x0b, 0x2d, 0x41, 0x80, 0x21, 0x2e, 0x77, 0x00, 0x0f, 0xa4, 0x05, 0x2f, + 0xa3, 0x50, 0x3e, 0x80, 0xf1, 0x30, 0x29, 0x2e, 0x79, 0x00, 0x01, 0x42, + 0x06, 0x30, 0x34, 0x08, 0x00, 0xb2, 0x02, 0x2f, 0x80, 0x30, 0x21, 0x2e, + 0x5e, 0xf0, 0x70, 0x5f, 0xb8, 0x2e, 0x04, 0x84, 0x01, 0x30, 0x81, 0x42, + 0x82, 0x84, 0x01, 0x42, 0xa1, 0x42, 0x81, 0x42, 0x82, 0x84, 0x00, 0x2e, + 0x91, 0x42, 0x81, 0x42, 0xb8, 0x2e, 0x30, 0x50, 0xf3, 0x7f, 0xc0, 0xac, + 0xe4, 0x7f, 0xd5, 0x7f, 0x03, 0x2f, 0x00, 0x30, 0x82, 0x04, 0xf3, 0x6f, + 0xc3, 0x06, 0x40, 0xad, 0x05, 0x2f, 0xe0, 0x6f, 0x05, 0x30, 0x28, 0x04, + 0xd1, 0x6f, 0x69, 0x07, 0xe0, 0x7f, 0x40, 0xa1, 0x01, 0x30, 0x20, 0x2f, + 0x13, 0x25, 0x02, 0x25, 0x04, 0x32, 0x06, 0x30, 0x02, 0x30, 0x03, 0x30, + 0xaf, 0xbb, 0xb1, 0xbd, 0xdf, 0x0a, 0x9f, 0xbb, 0x21, 0xbd, 0x97, 0x0a, + 0x8f, 0xbb, 0x91, 0xbc, 0x01, 0xbc, 0x4f, 0x0a, 0x6b, 0x0e, 0x04, 0x2f, + 0x6b, 0x1a, 0x07, 0x2f, 0xe7, 0x6f, 0x7a, 0x0f, 0x04, 0x2f, 0xe7, 0x6f, + 0x97, 0x04, 0x17, 0x30, 0x07, 0x0a, 0xdd, 0x06, 0x81, 0x8d, 0x34, 0x0e, + 0xe6, 0x2f, 0x00, 0x2e, 0x0d, 0x2d, 0x6b, 0x0e, 0x00, 0x30, 0x05, 0x2f, + 0x6b, 0x1a, 0x07, 0x2f, 0xe0, 0x6f, 0x42, 0x0f, 0x00, 0x30, 0x03, 0x2f, + 0xe0, 0x6f, 0x90, 0x04, 0xdd, 0x06, 0x10, 0x30, 0xf5, 0x6f, 0xc3, 0x7f, + 0xb2, 0x7f, 0x40, 0xad, 0x06, 0x2f, 0x03, 0x30, 0xb2, 0x6f, 0x9a, 0x04, + 0xc4, 0x6f, 0xdc, 0x06, 0xb2, 0x7f, 0xc3, 0x7f, 0x00, 0x2e, 0xd2, 0x6f, + 0xaa, 0x0c, 0x80, 0xac, 0x02, 0x30, 0x01, 0x2f, 0x10, 0x04, 0x51, 0x06, + 0xd0, 0x5f, 0xb8, 0x2e, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, + 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00, 0x80, 0x2e, 0x18, 0x00 +}; + +/***************************************************************************/ +/*! Static Function Declarations +****************************************************************************/ +/*! + * @brief This API update the length for read and write. + * + * @param[in] len : Length for read and write + * @param[in] feature : Variable to specify the features + * which are to be set in the sensor. + * @param[in] enable : Variable which specifies whether to enable or + * disable the features in the bma455 sensor. + * enable | Macros + * ----------------|------------------- + * 0x01 | BMA4_EN + * 0x00 | BMA4_DIS + * @param[in] dev : Structure instance of bma4_dev. + * + * @return none + */ +static void update_len(uint8_t *len, uint8_t feature, uint8_t enable); + +/*! + * @brief This API enables the features of sensor. + * + * @param[in] feature : Variable to specify the features + * which are to be set in the sensor. + * @param[in] len : length to read and write + * @param[in] feature_config : Array address which stores the feature + * configuration data + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any positive value mentioned in ERROR CODES -> Fail + */ +static uint16_t feature_enable(uint8_t feature, uint8_t len, uint8_t *feature_config, struct bma4_dev *dev); + +/*! + * @brief This API disables the features of sensor. + * + * @param[in] feature : Variable to specify the features + * which are to be unset in the sensor. + * @param[in] len : length to read and write + * @param[in] feature_config : Array address which stores the feature + * configuration data + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any positive value mentioned in ERROR CODES -> Fail + */ +static uint16_t feature_disable(uint8_t feature, uint8_t len, uint8_t *feature_config, struct bma4_dev *dev); + +/*! + * @brief This API update the settings of step counter into write array. + * + * @param[in] setting : Pointer to structure variable which stores the + * settings parameter1 to parameter25. + * @param[in] index : value for array traversing. + * @param[out] feature_config : Pointer to store the settings + * + * @return none + */ +static void update_stepcounter_parameter(const struct bma423_stepcounter_settings *setting, + uint8_t index, uint8_t *feature_config); +/*! + * @brief This API copy the settings of step counter into the + * structure of bma423_stepcounter_settings, which is read from sensor. + * + * @param[out] setting : Pointer to structure variable which stores the + * settings parameter1 to parameter25 read from sensor. + * @param[in] data_p : Pointer of array which stores the parameters. + * + * @return none + */ +static void extract_stepcounter_parameter(struct bma423_stepcounter_settings *setting, const uint16_t *data_p); + +/***************************************************************************/ +/**\name Function definitions +****************************************************************************/ + +/*! + * @brief This API is the entry point. + * Call this API before using all other APIs. + * This API reads the chip-id of the sensor and sets the resolution. + */ +#include +uint16_t bma423_init(struct bma4_dev *dev) +{ + uint16_t rslt; + + rslt = bma4_init(dev); + + if (rslt == BMA4_OK) { + if (dev->chip_id == BMA423_CHIP_ID) { + /* Resolution of BMA423 sensor is 12 bit */ + dev->resolution = 12; + dev->feature_len = BMA423_FEATURE_SIZE; + dev->variant = BMA42X_VARIANT; + } else { + rslt |= BMA4_E_INVALID_SENSOR; + } + } + + return rslt; +} + +/*! + * @brief This API is used to upload the config file to enable + * the features of the sensor. + */ +uint16_t bma423_write_config_file(struct bma4_dev *dev) +{ + uint16_t rslt = BMA4_OK; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + /* Config. stream read/write length boundary check */ + if ((dev->read_write_len >= BMA423_RD_WR_MIN_LEN) && + (dev->read_write_len <= BMA423_FEATURE_SIZE)) { + /* Even or odd check */ + if ((dev->read_write_len % 2) != 0) + dev->read_write_len = dev->read_write_len - 1; + /*Assign stream data */ + dev->config_file_ptr = bma423_config_file; + rslt = bma4_write_config_file(dev); + } else { + rslt = BMA4_E_RD_WR_LENGTH_INVALID; + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + return rslt; +} + +/*! + * @brief This API is used to get the configuration id of the sensor. + */ +uint16_t bma423_get_config_id(uint16_t *config_id, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; + uint8_t index = BMA423_CONFIG_ID_OFFSET; + uint16_t rslt = BMA4_OK; + uint16_t config_id_lsb = 0; + uint16_t config_id_msb = 0; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); + if (rslt == BMA4_OK) { + config_id_lsb = (uint16_t)feature_config[index]; + config_id_msb = ((uint16_t)feature_config[index + 1]) << 8; + *config_id = config_id_lsb | config_id_msb; + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API sets/unsets the user provided interrupt to either + * interrupt pin1 or pin2 in the sensor. + */ +uint16_t bma423_map_interrupt(uint8_t int_line, uint16_t int_map, uint8_t enable, struct bma4_dev *dev) +{ + uint16_t rslt = BMA4_OK; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + if (int_line <= 1) { + /* Map/Unmap the interrupt */ + rslt = bma4_map_interrupt(int_line, int_map, enable, dev); + } else { + rslt = BMA4_E_INT_LINE_INVALID; + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API reads the bma423 interrupt status from the sensor. + */ +uint16_t bma423_read_int_status(uint16_t *int_status, struct bma4_dev *dev) +{ + uint16_t rslt = BMA4_OK; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + /* Read the interrupt status */ + rslt = bma4_read_int_status(int_status, dev); + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API enables/disables the features of the sensor. + */ +uint16_t bma423_feature_enable(uint8_t feature, uint8_t enable, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; + uint16_t rslt = BMA4_OK; + uint8_t len; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + /* Update the length for read and write */ + update_len(&len, feature, enable); + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, len, dev); + if (rslt == BMA4_OK) { + if (enable == TRUE) { + /* Enables the feature */ + rslt |= feature_enable(feature, len, feature_config, dev); + } else { + /* Disables the feature */ + rslt |= feature_disable(feature, len, feature_config, dev); + } + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API performs x, y and z axis remapping in the sensor. + */ +uint16_t bma423_set_remap_axes(const struct bma423_axes_remap *remap_data, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; + uint8_t index = BMA423_AXES_REMAP_OFFSET; + uint16_t rslt = BMA4_OK; + uint8_t x_axis = 0; + uint8_t x_axis_sign = 0; + uint8_t y_axis = 0; + uint8_t y_axis_sign = 0; + uint8_t z_axis = 0; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); + if (rslt == BMA4_OK) { + x_axis = remap_data->x_axis & BMA423_X_AXIS_MASK; + x_axis_sign = (remap_data->x_axis_sign << 2) & BMA423_X_AXIS_SIGN_MASK; + y_axis = (remap_data->y_axis << 3) & BMA423_Y_AXIS_MASK; + y_axis_sign = (remap_data->y_axis_sign << 5) & BMA423_Y_AXIS_SIGN_MASK; + z_axis = (remap_data->z_axis << 6) & BMA423_Z_AXIS_MASK; + feature_config[index] = x_axis | x_axis_sign | y_axis | y_axis_sign | z_axis; + feature_config[index + 1] = remap_data->z_axis_sign & BMA423_Z_AXIS_SIGN_MASK; + rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_FEATURE_SIZE, dev); + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API reads the x, y and z axis remap data from the sensor. + */ +uint16_t bma423_get_remap_axes(struct bma423_axes_remap *remap_data, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; + uint8_t index = BMA423_AXES_REMAP_OFFSET; + uint16_t rslt = BMA4_OK; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); + if (rslt == BMA4_OK) { + remap_data->x_axis = feature_config[index] & BMA423_X_AXIS_MASK; + remap_data->x_axis_sign = (feature_config[index] & BMA423_X_AXIS_SIGN_MASK) >> 2; + remap_data->y_axis = (feature_config[index] & BMA423_Y_AXIS_MASK) >> 3; + remap_data->y_axis_sign = (feature_config[index] & BMA423_Y_AXIS_SIGN_MASK) >> 5; + remap_data->z_axis = (feature_config[index] & BMA423_Z_AXIS_MASK) >> 6; + remap_data->z_axis_sign = (feature_config[index + 1] & BMA423_Z_AXIS_SIGN_MASK); + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API enables the any motion feature according to the axis + * set by the user in the sensor. + */ +uint16_t bma423_anymotion_enable_axis(uint8_t axis, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_ANYMOTION_EN_LEN + 2] = {0}; + /* Anymotion axis enable bit pos. is 3 byte ahead of the + anymotion base address(0x00) */ + uint8_t index = 3; + uint16_t rslt = BMA4_OK; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_ANYMOTION_EN_LEN + 2, dev); + if (rslt == BMA4_OK) { + feature_config[index] = BMA4_SET_BITSLICE(feature_config[index], + BMA423_ANY_NO_MOTION_AXIS_EN, axis); + rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_ANYMOTION_EN_LEN + 2, dev); + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! @brief This API sets the configuration of Any motion feature in + * the sensor. + */ +uint16_t bma423_set_any_motion_config(const struct bma423_anymotion_config *any_motion, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_ANYMOTION_EN_LEN + 2] = {0}; + uint8_t index = BMA423_ANY_NO_MOTION_OFFSET; + uint16_t duration_lsb = 0; + uint16_t duration_msb = 0; + uint16_t duration = 0; + uint16_t rslt = BMA4_OK; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_ANYMOTION_EN_LEN + 2, dev); + if (rslt == BMA4_OK) { + /* Assign threshold value in feature config array */ + feature_config[index++] = BMA4_GET_LSB(any_motion->threshold); + feature_config[index] = BMA4_GET_MSB(any_motion->threshold); + /* Assign no motion selection value in feature config array*/ + feature_config[index++] |= (uint8_t) + (any_motion->nomotion_sel << BMA423_ANY_NO_MOTION_SEL_POS); + + /* Extract duration */ + duration_lsb = feature_config[index]; + duration_msb = feature_config[index + 1] << 8; + duration = duration_lsb | duration_msb; + duration = BMA4_SET_BITS_POS_0(duration, + BMA423_ANY_NO_MOTION_DUR, any_motion->duration); + /* Assign duration value in feature config array*/ + feature_config[index++] = BMA4_GET_LSB(duration); + feature_config[index] = BMA4_GET_MSB(duration); + + /* Write any motion settings to the sensor*/ + rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_ANYMOTION_EN_LEN + 2, dev); + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! @brief This API gets the configuration of any motion feature from + * the sensor. + */ +uint16_t bma423_get_any_motion_config(struct bma423_anymotion_config *any_motion, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_ANYMOTION_EN_LEN + 2] = {0}; + uint8_t anymotion = 0; + uint16_t rslt = BMA4_OK; + uint16_t *data_p = (uint16_t *)feature_config; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_ANYMOTION_EN_LEN + 2, dev); + if (rslt == BMA4_OK) { + /* Extract threshold value */ + any_motion->threshold = (*data_p) & BMA423_ANY_NO_MOTION_THRES_MSK; + /* Extract threshold & nomotion selection + * data */ + anymotion = ((uint8_t)(*(data_p++) >> 8)) & BMA423_ANY_NO_MOTION_SEL_MSK; + /* Extract no motion field */ + any_motion->nomotion_sel = anymotion >> + BMA423_ANY_NO_MOTION_SEL_POS; + /* Extract duration value */ + any_motion->duration = (*(data_p)) & BMA423_ANY_NO_MOTION_DUR_MSK; + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API enables or disables the step detector feature in the + * sensor. + */ +uint16_t bma423_step_detector_enable(uint8_t enable, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; + uint16_t rslt = BMA4_OK; + /* Step detector enable bit pos. is 1 byte ahead of the base address */ + uint8_t index = BMA423_STEP_CNTR_OFFSET + 1; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_FEATURE_SIZE, dev); + if (rslt == BMA4_OK) { + feature_config[index] = BMA4_SET_BITSLICE(feature_config[index], + BMA423_STEP_DETECTOR_EN, enable); + rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_FEATURE_SIZE, dev); + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API sets the watermark level for step counter + * interrupt in the sensor. + */ +uint16_t bma423_step_counter_set_watermark(uint16_t step_counter_wm, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; + uint8_t index = BMA423_STEP_CNTR_OFFSET; + uint16_t wm_lsb = 0; + uint16_t wm_msb = 0; + uint16_t rslt = BMA4_OK; + uint16_t data = 0; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_FEATURE_SIZE, dev); + if (rslt == BMA4_OK) { + wm_lsb = feature_config[index]; + wm_msb = feature_config[index + 1] << 8; + data = wm_lsb | wm_msb; + /* Sets only watermark bits in the complete + 16 bits of data */ + data = BMA4_SET_BITS_POS_0(data, BMA423_STEP_CNTR_WM, step_counter_wm); + /* Splits 16 bits of data to individual + 8 bits data */ + feature_config[index] = BMA4_GET_LSB(data); + feature_config[index + 1] = BMA4_GET_MSB(data); + /* Writes stepcounter watermark settings + in the sensor */ + rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_FEATURE_SIZE, dev); + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API gets the water mark level set for step counter interrupt + * in the sensor + */ +uint16_t bma423_step_counter_get_watermark(uint16_t *step_counter_wm, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; + uint8_t index = BMA423_STEP_CNTR_OFFSET; + uint16_t wm_lsb = 0; + uint16_t wm_msb = 0; + uint16_t rslt = BMA4_OK; + uint16_t data = 0; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_FEATURE_SIZE, dev); + if (rslt == BMA4_OK) { + wm_lsb = feature_config[index]; + wm_msb = feature_config[index + 1] << 8; + data = wm_lsb | wm_msb; + *step_counter_wm = BMA4_GET_BITS_POS_0(data, BMA423_STEP_CNTR_WM); + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API resets the counted steps of step counter. + */ +uint16_t bma423_reset_step_counter(struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; + /* Reset bit is 1 byte ahead of base address */ + uint8_t index = BMA423_STEP_CNTR_OFFSET + 1; + uint16_t rslt = BMA4_OK; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_FEATURE_SIZE, dev); + + if (rslt == BMA4_OK) { + feature_config[index] = BMA4_SET_BITSLICE(feature_config[index], + BMA423_STEP_CNTR_RST, 1); + rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_FEATURE_SIZE, dev); + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + return rslt; +} + +/*! + * @brief This API gets the number of counted steps of the step counter + * feature from the sensor. + */ +uint16_t bma423_step_counter_output(uint32_t *step_count, struct bma4_dev *dev) +{ + uint8_t data[BMA423_STEP_CNTR_DATA_SIZE] = {0}; + uint16_t rslt = BMA4_OK; + uint32_t step_count_0 = 0; + uint32_t step_count_1 = 0; + uint32_t step_count_2 = 0; + uint32_t step_count_3 = 0; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + /* Reads the step counter output data from the + gpio register */ + rslt = bma4_read_regs(BMA4_STEP_CNT_OUT_0_ADDR, data, + BMA423_STEP_CNTR_DATA_SIZE, dev); + + if (rslt == BMA4_OK) { + step_count_0 = (uint32_t)data[0]; + step_count_1 = (uint32_t)data[1] << 8; + step_count_2 = (uint32_t)data[2] << 16; + step_count_3 = (uint32_t)data[3] << 24; + *step_count = step_count_0 | step_count_1 | step_count_2 | step_count_3; + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API gets the output for activity feature. + */ +uint16_t bma423_activity_output(uint8_t *activity, struct bma4_dev *dev) +{ + uint8_t data = 0; + uint16_t rslt = BMA4_OK; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + /* Reads the activity output from the gpio register */ + rslt = bma4_read_regs(BMA4_ACTIVITY_OUT_ADDR, &data, 1, dev); + if (rslt == BMA4_OK) + *activity = data; + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API select the platform configuration wrist(Default) or phone. + */ +uint16_t bma423_select_platform(uint8_t platform, struct bma4_dev *dev) +{ + uint16_t rslt = BMA4_OK; + struct bma423_stepcounter_settings sc_settings = {0}; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + switch (platform) { + case BMA423_PHONE_CONFIG: + sc_settings.param1 = BMA423_PHONE_SC_PARAM_1; + sc_settings.param2 = BMA423_PHONE_SC_PARAM_2; + sc_settings.param3 = BMA423_PHONE_SC_PARAM_3; + sc_settings.param4 = BMA423_PHONE_SC_PARAM_4; + sc_settings.param5 = BMA423_PHONE_SC_PARAM_5; + sc_settings.param6 = BMA423_PHONE_SC_PARAM_6; + sc_settings.param7 = BMA423_PHONE_SC_PARAM_7; + sc_settings.param8 = BMA423_PHONE_SC_PARAM_8; + sc_settings.param9 = BMA423_PHONE_SC_PARAM_9; + sc_settings.param10 = BMA423_PHONE_SC_PARAM_10; + sc_settings.param11 = BMA423_PHONE_SC_PARAM_11; + sc_settings.param12 = BMA423_PHONE_SC_PARAM_12; + sc_settings.param13 = BMA423_PHONE_SC_PARAM_13; + sc_settings.param14 = BMA423_PHONE_SC_PARAM_14; + sc_settings.param15 = BMA423_PHONE_SC_PARAM_15; + sc_settings.param16 = BMA423_PHONE_SC_PARAM_16; + sc_settings.param17 = BMA423_PHONE_SC_PARAM_17; + sc_settings.param18 = BMA423_PHONE_SC_PARAM_18; + sc_settings.param19 = BMA423_PHONE_SC_PARAM_19; + sc_settings.param20 = BMA423_PHONE_SC_PARAM_20; + sc_settings.param21 = BMA423_PHONE_SC_PARAM_21; + sc_settings.param22 = BMA423_PHONE_SC_PARAM_22; + sc_settings.param23 = BMA423_PHONE_SC_PARAM_23; + sc_settings.param24 = BMA423_PHONE_SC_PARAM_24; + sc_settings.param25 = BMA423_PHONE_SC_PARAM_25; + break; + + case BMA423_WRIST_CONFIG: + sc_settings.param1 = BMA423_WRIST_SC_PARAM_1; + sc_settings.param2 = BMA423_WRIST_SC_PARAM_2; + sc_settings.param3 = BMA423_WRIST_SC_PARAM_3; + sc_settings.param4 = BMA423_WRIST_SC_PARAM_4; + sc_settings.param5 = BMA423_WRIST_SC_PARAM_5; + sc_settings.param6 = BMA423_WRIST_SC_PARAM_6; + sc_settings.param7 = BMA423_WRIST_SC_PARAM_7; + sc_settings.param8 = BMA423_WRIST_SC_PARAM_8; + sc_settings.param9 = BMA423_WRIST_SC_PARAM_9; + sc_settings.param10 = BMA423_WRIST_SC_PARAM_10; + sc_settings.param11 = BMA423_WRIST_SC_PARAM_11; + sc_settings.param12 = BMA423_WRIST_SC_PARAM_12; + sc_settings.param13 = BMA423_WRIST_SC_PARAM_13; + sc_settings.param14 = BMA423_WRIST_SC_PARAM_14; + sc_settings.param15 = BMA423_WRIST_SC_PARAM_15; + sc_settings.param16 = BMA423_WRIST_SC_PARAM_16; + sc_settings.param17 = BMA423_WRIST_SC_PARAM_17; + sc_settings.param18 = BMA423_WRIST_SC_PARAM_18; + sc_settings.param19 = BMA423_WRIST_SC_PARAM_19; + sc_settings.param20 = BMA423_WRIST_SC_PARAM_20; + sc_settings.param21 = BMA423_WRIST_SC_PARAM_21; + sc_settings.param22 = BMA423_WRIST_SC_PARAM_22; + sc_settings.param23 = BMA423_WRIST_SC_PARAM_23; + sc_settings.param24 = BMA423_WRIST_SC_PARAM_24; + sc_settings.param25 = BMA423_WRIST_SC_PARAM_25; + break; + + default: + rslt = BMA4_E_OUT_OF_RANGE; + break; + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + if (rslt == BMA4_OK) { + /* Set the step counter parameter */ + rslt = bma423_stepcounter_set_parameter(&sc_settings, dev); + } + + return rslt; +} + +/*! + * @brief This API gets the parameter1 to parameter7 settings of the + * step counter feature. + */ +uint16_t bma423_stepcounter_get_parameter(struct bma423_stepcounter_settings *setting, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; + uint16_t *data_p = (uint16_t *)feature_config; + uint16_t rslt = BMA4_OK; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); + + if (rslt == BMA4_OK) { + /* To convert 8bit to 16 bit address */ + data_p = data_p + BMA423_STEP_CNTR_PARAM_OFFSET/2; + extract_stepcounter_parameter(setting, data_p); + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API sets the parameter1 to parameter7 settings of the + * step counter feature in the sensor. + */ +uint16_t bma423_stepcounter_set_parameter(const struct bma423_stepcounter_settings *setting, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; + uint8_t index = BMA423_STEP_CNTR_PARAM_OFFSET; + uint16_t rslt = BMA4_OK; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); + if (rslt == BMA4_OK) { + update_stepcounter_parameter(setting, index, feature_config); + /* Writes stepcounter parameter settings + in the sensor */ + rslt = bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_FEATURE_SIZE, dev); + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API sets the sensitivity of wake up feature in the sensor + */ +uint16_t bma423_wakeup_set_sensitivity(uint8_t sensitivity, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; + uint8_t index = BMA423_WAKEUP_OFFSET; + uint16_t rslt = BMA4_OK; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); + if (rslt == BMA4_OK) { + feature_config[index] = BMA4_SET_BITSLICE(feature_config[index], + BMA423_WAKEUP_SENS, sensitivity); + /* Writes sensitivity settings in the sensor */ + rslt |= bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_FEATURE_SIZE, dev); + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API gets the sensitivity of wake up feature in the sensor + */ +uint16_t bma423_wakeup_get_sensitivity(uint8_t *sensitivity, struct bma4_dev *dev) +{ + uint8_t feature_config[BMA423_FEATURE_SIZE] = {0}; + uint8_t index = BMA423_WAKEUP_OFFSET; + uint16_t rslt = BMA4_OK; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); + if (rslt == BMA4_OK) { + /* Extracts sensitivity data */ + *sensitivity = BMA4_GET_BITSLICE(feature_config[index], BMA423_WAKEUP_SENS); + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API is used to select single/double tap + * feature in the sensor + */ +uint16_t bma423_tap_selection(const uint8_t tap_select, struct bma4_dev *dev) +{ + uint16_t rslt = BMA4_OK; + uint8_t feature_config[BMA423_FEATURE_SIZE] = {0,}; + uint8_t index = BMA423_WAKEUP_OFFSET; + + if (dev != NULL) { + if (dev->chip_id == BMA423_CHIP_ID) { + rslt = bma4_read_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, BMA423_FEATURE_SIZE, dev); + if (rslt == BMA4_OK) { + feature_config[index] = BMA4_SET_BITSLICE(feature_config[index], + BMA423_TAP_SEL, tap_select); + rslt = bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, + BMA423_FEATURE_SIZE, dev); + } + } else { + rslt = BMA4_E_INVALID_SENSOR; + } + } else { + rslt = BMA4_E_NULL_PTR; + } + + return rslt; +} +/*! + * @brief This API update the length for read and write. + */ +static void update_len(uint8_t *len, uint8_t feature, uint8_t enable) +{ + uint8_t length = BMA423_FEATURE_SIZE; + + if ((feature == BMA423_ANY_MOTION) || (feature == BMA423_NO_MOTION)) { + /* Change the feature length to 2 for reading and writing of 2 bytes for + any/no-motion enable */ + length = BMA423_ANYMOTION_EN_LEN; + + /* Read and write 4 byte to disable the any/no motion completely along with + all axis */ + if (enable == BMA4_DISABLE) { + /*Change the feature length to 4 for reading and writing + of 4 bytes for any/no-motion enable */ + length = length + 2; + } + } + + *len = length; +} + +/*! + * @brief This API enables the features of the sensor. + */ +static uint16_t feature_enable(uint8_t feature, uint8_t len, uint8_t *feature_config, struct bma4_dev *dev) +{ + uint8_t index = 0; + uint16_t rslt; + + /* Enable step counter */ + if ((feature & BMA423_STEP_CNTR) > 0) { + /* Step counter enable bit pos. is 1 byte ahead of the + base address */ + index = BMA423_STEP_CNTR_OFFSET + 1; + feature_config[index] = feature_config[index] | BMA423_STEP_CNTR_EN_MSK; + } + + /* Enable activity */ + if ((feature & BMA423_ACTIVITY) > 0) { + /* Activity enable bit pos. is 1 byte ahead of the + base address */ + index = BMA423_STEP_CNTR_OFFSET + 1; + feature_config[index] = feature_config[index] | BMA423_ACTIVITY_EN_MSK; + } + /* Enable tilt */ + if ((feature & BMA423_TILT) > 0) { + /* Tilt enable bit pos. is the base address(0x3A) of tilt */ + index = BMA423_TILT_OFFSET; + feature_config[index] = feature_config[index] | BMA423_TILT_EN_MSK; + } + + /* Enable wakeup */ + if ((feature & BMA423_WAKEUP) > 0) { + /* Wakeup enable bit pos. is the base address(0x38) of wakeup */ + index = BMA423_WAKEUP_OFFSET; + feature_config[index] = feature_config[index] | BMA423_WAKEUP_EN_MSK; + } + + /* Enable anymotion/nomotion */ + if ((feature & BMA423_ANY_MOTION) > 0 || (feature & BMA423_NO_MOTION) > 0) { + /* Any/Nomotion enable bit pos. is 1 bytes ahead of the + any/nomotion base address(0x00) */ + index = 1; + + if ((feature & BMA423_ANY_MOTION) > 0) { + /* Enable anymotion */ + feature_config[index] = feature_config[index] & (~BMA423_ANY_NO_MOTION_SEL_MSK); + } else { + /* Enable nomotion */ + feature_config[index] = feature_config[index] | BMA423_ANY_NO_MOTION_SEL_MSK; + } + } + + /* Write the feature enable settings in the sensor */ + rslt = bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, len, dev); + + return rslt; +} + +/*! + * @brief This API disables the features of the sensor. + */ +static uint16_t feature_disable(uint8_t feature, uint8_t len, uint8_t *feature_config, struct bma4_dev *dev) +{ + uint8_t index = 0; + uint16_t rslt; + + /* Disable step counter */ + if ((feature & BMA423_STEP_CNTR) > 0) { + /* Step counter enable bit pos. is 1 byte ahead of the + base address */ + index = BMA423_STEP_CNTR_OFFSET + 1; + feature_config[index] = feature_config[index] & (~BMA423_STEP_CNTR_EN_MSK); + } + + /* Disable activity */ + if ((feature & BMA423_ACTIVITY) > 0) { + /* Activity enable bit pos. is 1 byte ahead of the + base address */ + index = BMA423_STEP_CNTR_OFFSET + 1; + feature_config[index] = feature_config[index] & (~BMA423_ACTIVITY_EN_MSK); + } + /* Disable tilt */ + if ((feature & BMA423_TILT) > 0) { + /* Tilt enable bit pos. is the base address(0x3A) of tilt */ + index = BMA423_TILT_OFFSET; + feature_config[index] = feature_config[index] & (~BMA423_TILT_EN_MSK); + } + + /* Disable wakeup */ + if ((feature & BMA423_WAKEUP) > 0) { + /* Tilt enable bit pos. is the base address(0x38) of wakeup */ + index = BMA423_WAKEUP_OFFSET; + feature_config[index] = feature_config[index] & (~BMA423_WAKEUP_EN_MSK); + } + + /* Disable anymotion/nomotion */ + if ((feature & BMA423_ANY_MOTION) > 0 || (feature & BMA423_NO_MOTION) > 0) { + /* Any/Nomotion enable bit pos. is 1 bytes ahead of the + any/nomotion base address(0x00) */ + index = 1; + + if ((feature & BMA423_ANY_MOTION) > 0) { + /* Disable anymotion */ + feature_config[index] = feature_config[index] | BMA423_ANY_NO_MOTION_SEL_MSK; + } else { + /* Disable nomotion */ + feature_config[index] = feature_config[index] & (~BMA423_ANY_NO_MOTION_SEL_MSK); + } + /* Any/Nomotion axis enable bit pos. is 3 byte ahead of the + any/nomotion base address(0x00) */ + index = 3; + feature_config[index] = feature_config[index] & (~BMA423_ANY_NO_MOTION_AXIS_EN_MSK); + } + /* Write the configured settings in the sensor */ + rslt = bma4_write_regs(BMA4_FEATURE_CONFIG_ADDR, feature_config, len, dev); + + return rslt; +} + +/*! + * @brief This API update the settings of step counter. + */ +static void update_stepcounter_parameter(const struct bma423_stepcounter_settings *setting, + uint8_t index, uint8_t *feature_config) +{ + feature_config[index++] = BMA4_GET_LSB(setting->param1); + feature_config[index++] = BMA4_GET_MSB(setting->param1); + feature_config[index++] = BMA4_GET_LSB(setting->param2); + feature_config[index++] = BMA4_GET_MSB(setting->param2); + feature_config[index++] = BMA4_GET_LSB(setting->param3); + feature_config[index++] = BMA4_GET_MSB(setting->param3); + feature_config[index++] = BMA4_GET_LSB(setting->param4); + feature_config[index++] = BMA4_GET_MSB(setting->param4); + feature_config[index++] = BMA4_GET_LSB(setting->param5); + feature_config[index++] = BMA4_GET_MSB(setting->param5); + feature_config[index++] = BMA4_GET_LSB(setting->param6); + feature_config[index++] = BMA4_GET_MSB(setting->param6); + feature_config[index++] = BMA4_GET_LSB(setting->param7); + feature_config[index++] = BMA4_GET_MSB(setting->param7); + feature_config[index++] = BMA4_GET_LSB(setting->param8); + feature_config[index++] = BMA4_GET_MSB(setting->param8); + feature_config[index++] = BMA4_GET_LSB(setting->param9); + feature_config[index++] = BMA4_GET_MSB(setting->param9); + feature_config[index++] = BMA4_GET_LSB(setting->param10); + feature_config[index++] = BMA4_GET_MSB(setting->param10); + feature_config[index++] = BMA4_GET_LSB(setting->param11); + feature_config[index++] = BMA4_GET_MSB(setting->param11); + feature_config[index++] = BMA4_GET_LSB(setting->param12); + feature_config[index++] = BMA4_GET_MSB(setting->param12); + feature_config[index++] = BMA4_GET_LSB(setting->param13); + feature_config[index++] = BMA4_GET_MSB(setting->param13); + feature_config[index++] = BMA4_GET_LSB(setting->param14); + feature_config[index++] = BMA4_GET_MSB(setting->param14); + feature_config[index++] = BMA4_GET_LSB(setting->param15); + feature_config[index++] = BMA4_GET_MSB(setting->param15); + feature_config[index++] = BMA4_GET_LSB(setting->param16); + feature_config[index++] = BMA4_GET_MSB(setting->param16); + feature_config[index++] = BMA4_GET_LSB(setting->param17); + feature_config[index++] = BMA4_GET_MSB(setting->param17); + feature_config[index++] = BMA4_GET_LSB(setting->param18); + feature_config[index++] = BMA4_GET_MSB(setting->param18); + feature_config[index++] = BMA4_GET_LSB(setting->param19); + feature_config[index++] = BMA4_GET_MSB(setting->param19); + feature_config[index++] = BMA4_GET_LSB(setting->param20); + feature_config[index++] = BMA4_GET_MSB(setting->param20); + feature_config[index++] = BMA4_GET_LSB(setting->param21); + feature_config[index++] = BMA4_GET_MSB(setting->param21); + feature_config[index++] = BMA4_GET_LSB(setting->param22); + feature_config[index++] = BMA4_GET_MSB(setting->param22); + feature_config[index++] = BMA4_GET_LSB(setting->param23); + feature_config[index++] = BMA4_GET_MSB(setting->param23); + feature_config[index++] = BMA4_GET_LSB(setting->param24); + feature_config[index++] = BMA4_GET_MSB(setting->param24); + feature_config[index++] = BMA4_GET_LSB(setting->param25); + feature_config[index] = BMA4_GET_MSB(setting->param25); +} + +/*! + * @brief This API copy the settings of step counter into the + * structure of bma423_stepcounter_settings, which is read from sensor. + */ +static void extract_stepcounter_parameter(struct bma423_stepcounter_settings *setting, const uint16_t *data_p) +{ + setting->param1 = *(data_p++); + setting->param2 = *(data_p++); + setting->param3 = *(data_p++); + setting->param4 = *(data_p++); + setting->param5 = *(data_p++); + setting->param6 = *(data_p++); + setting->param7 = *(data_p++); + setting->param8 = *(data_p++); + setting->param9 = *(data_p++); + setting->param10 = *(data_p++); + setting->param11 = *(data_p++); + setting->param12 = *(data_p++); + setting->param13 = *(data_p++); + setting->param14 = *(data_p++); + setting->param15 = *(data_p++); + setting->param16 = *(data_p++); + setting->param17 = *(data_p++); + setting->param18 = *(data_p++); + setting->param19 = *(data_p++); + setting->param20 = *(data_p++); + setting->param21 = *(data_p++); + setting->param22 = *(data_p++); + setting->param23 = *(data_p++); + setting->param24 = *(data_p++); + setting->param25 = *data_p; +} diff --git a/src/bma423.h b/src/bma423.h index 2137f36..f9f1f08 100644 --- a/src/bma423.h +++ b/src/bma423.h @@ -1,804 +1,804 @@ -/* -* -**************************************************************************** -* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH -* -* File : bma423.h -* -* Date: 12 Oct 2017 -* -* Revision : 1.1.4 $ -* -* Usage: Sensor Driver for BMA423 sensor -* -**************************************************************************** -* -* Disclaimer -* -* Common: -* Bosch Sensortec products are developed for the consumer goods industry. -* They may only be used within the parameters of the respective valid -* product data sheet. Bosch Sensortec products are provided with the -* express understanding that there is no warranty of fitness for a -* particular purpose.They are not fit for use in life-sustaining, -* safety or security sensitive systems or any system or device -* that may lead to bodily harm or property damage if the system -* or device malfunctions. In addition,Bosch Sensortec products are -* not fit for use in products which interact with motor vehicle systems. -* The resale and or use of products are at the purchasers own risk and -* his own responsibility. The examination of fitness for the intended use -* is the sole responsibility of the Purchaser. -* -* The purchaser shall indemnify Bosch Sensortec from all third party -* claims, including any claims for incidental, or consequential damages, -* arising from any product use not covered by the parameters of -* the respective valid product data sheet or not approved by -* Bosch Sensortec and reimburse Bosch Sensortec for all costs in -* connection with such claims. -* -* The purchaser must monitor the market for the purchased products, -* particularly with regard to product safety and inform Bosch Sensortec -* without delay of all security relevant incidents. -* -* Engineering Samples are marked with an asterisk (*) or (e). -* Samples may vary from the valid technical specifications of the product -* series. They are therefore not intended or fit for resale to third -* parties or for use in end products. Their sole purpose is internal -* client testing. The testing of an engineering sample may in no way -* replace the testing of a product series. Bosch Sensortec assumes -* no liability for the use of engineering samples. -* By accepting the engineering samples, the Purchaser agrees to indemnify -* Bosch Sensortec from all claims arising from the use of engineering -* samples. -* -* Special: -* This software module (hereinafter called "Software") and any information -* on application-sheets (hereinafter called "Information") is provided -* free of charge for the sole purpose to support your application work. -* The Software and Information is subject to the following -* terms and conditions: -* -* The Software is specifically designed for the exclusive use for -* Bosch Sensortec products by personnel who have special experience -* and training. Do not use this Software if you do not have the -* proper experience or training. -* -* This Software package is provided `` as is `` and without any expressed -* or implied warranties,including without limitation, the implied warranties -* of merchantability and fitness for a particular purpose. -* -* Bosch Sensortec and their representatives and agents deny any liability -* for the functional impairment -* of this Software in terms of fitness, performance and safety. -* Bosch Sensortec and their representatives and agents shall not be liable -* for any direct or indirect damages or injury, except as -* otherwise stipulated in mandatory applicable law. -* -* The Information provided is believed to be accurate and reliable. -* Bosch Sensortec assumes no responsibility for the consequences of use -* of such Information nor for any infringement of patents or -* other rights of third parties which may result from its use. -* No license is granted by implication or otherwise under any patent or -* patent rights of Bosch. Specifications mentioned in the Information are -* subject to change without notice. -**************************************************************************/ -/*! \file bma423.h - \brief Sensor Driver for BMA423 sensor */ -#ifndef BMA423_H -#define BMA423_H - -#ifdef __cplusplus -extern "C" { -#endif -#include "bma4.h" - -/**\name Chip ID of BMA423 sensor */ -#define BMA423_CHIP_ID UINT8_C(0x13) - -/**\name Sensor feature size */ -#define BMA423_FEATURE_SIZE UINT8_C(64) -#define BMA423_ANYMOTION_EN_LEN UINT8_C(2) -#define BMA423_RD_WR_MIN_LEN UINT8_C(2) - -/**\name Feature offset address */ -#define BMA423_ANY_NO_MOTION_OFFSET UINT8_C(0x00) -#define BMA423_STEP_CNTR_OFFSET UINT8_C(0x36) -#define BMA423_STEP_CNTR_PARAM_OFFSET UINT8_C(0x04) -#define BMA423_WAKEUP_OFFSET UINT8_C(0x38) -#define BMA423_TILT_OFFSET UINT8_C(0x3A) -#define BMA423_CONFIG_ID_OFFSET UINT8_C(0x3C) -#define BMA423_AXES_REMAP_OFFSET UINT8_C(0x3E) - - -/**************************************************************/ -/**\name Remap Axes */ -/**************************************************************/ -#define BMA423_X_AXIS_MASK UINT8_C(0x03) -#define BMA423_X_AXIS_SIGN_MASK UINT8_C(0x04) -#define BMA423_Y_AXIS_MASK UINT8_C(0x18) -#define BMA423_Y_AXIS_SIGN_MASK UINT8_C(0x20) -#define BMA423_Z_AXIS_MASK UINT8_C(0xC0) -#define BMA423_Z_AXIS_SIGN_MASK UINT8_C(0x01) - -/**************************************************************/ -/**\name Step Counter & Detector */ -/**************************************************************/ -/**\name Step counter enable macros */ -#define BMA423_STEP_CNTR_EN_POS UINT8_C(4) -#define BMA423_STEP_CNTR_EN_MSK UINT8_C(0x10) -#define BMA423_ACTIVITY_EN_MSK UINT8_C(0x20) - -/**\name Step counter watermark macros */ -#define BMA423_STEP_CNTR_WM_MSK UINT16_C(0x03FF) - -/**\name Step counter reset macros */ -#define BMA423_STEP_CNTR_RST_POS UINT8_C(2) -#define BMA423_STEP_CNTR_RST_MSK UINT8_C(0x04) - -/**\name Step detector enable macros */ -#define BMA423_STEP_DETECTOR_EN_POS UINT8_C(3) -#define BMA423_STEP_DETECTOR_EN_MSK UINT8_C(0x08) - -/**\name Tilt enable macros */ -#define BMA423_TILT_EN_MSK UINT8_C(0x01) - -/**\name Step count output length*/ -#define BMA423_STEP_CNTR_DATA_SIZE UINT16_C(4) - -/**\name Wakeup enable macros */ -#define BMA423_WAKEUP_EN_MSK UINT8_C(0x01) - -/**\name Wake up sensitivity macros */ -#define BMA423_WAKEUP_SENS_POS UINT8_C(1) -#define BMA423_WAKEUP_SENS_MSK UINT8_C(0x0E) - -/**\name Tap selection macro */ -#define BMA423_TAP_SEL_POS UINT8_C(4) -#define BMA423_TAP_SEL_MSK UINT8_C(0x10) - -/**************************************************************/ -/**\name Any Motion */ -/**************************************************************/ -/**\name Any motion threshold macros */ -#define BMA423_ANY_NO_MOTION_THRES_POS UINT8_C(0) -#define BMA423_ANY_NO_MOTION_THRES_MSK UINT16_C(0x07FF) - -/**\name Any motion selection macros */ -#define BMA423_ANY_NO_MOTION_SEL_POS UINT8_C(3) -#define BMA423_ANY_NO_MOTION_SEL_MSK UINT8_C(0x08) - -/**\name Any motion enable macros */ -#define BMA423_ANY_NO_MOTION_AXIS_EN_POS UINT8_C(5) -#define BMA423_ANY_NO_MOTION_AXIS_EN_MSK UINT8_C(0xE0) - -/**\name Any motion duration macros */ -#define BMA423_ANY_NO_MOTION_DUR_MSK UINT16_C(0x1FFF) - -/**************************************************************/ -/**\name User macros */ -/**************************************************************/ - -/**\name Anymotion/Nomotion axis enable macros */ -#define BMA423_X_AXIS_EN UINT8_C(0x01) -#define BMA423_Y_AXIS_EN UINT8_C(0x02) -#define BMA423_Z_AXIS_EN UINT8_C(0x04) -#define BMA423_ALL_AXIS_EN UINT8_C(0x07) -#define BMA423_ALL_AXIS_DIS UINT8_C(0x00) - -/**\name Feature enable macros for the sensor */ -#define BMA423_STEP_CNTR UINT8_C(0x01) -/**\name Below macros are mutually exclusive */ -#define BMA423_ANY_MOTION UINT8_C(0x02) -#define BMA423_NO_MOTION UINT8_C(0x04) -#define BMA423_ACTIVITY UINT8_C(0x08) -#define BMA423_TILT UINT8_C(0x10) -#define BMA423_WAKEUP UINT8_C(0x20) - -/**\name Interrupt status macros */ -#define BMA423_STEP_CNTR_INT UINT8_C(0x02) -#define BMA423_ACTIVITY_INT UINT8_C(0x04) -#define BMA423_TILT_INT UINT8_C(0x08) -#define BMA423_WAKEUP_INT UINT8_C(0x20) -#define BMA423_ANY_NO_MOTION_INT UINT8_C(0x40) -#define BMA423_ERROR_INT UINT8_C(0x80) - -/**\name Activity recognition macros */ -#define BMA423_USER_STATIONARY UINT8_C(0x00) -#define BMA423_USER_WALKING UINT8_C(0x01) -#define BMA423_USER_RUNNING UINT8_C(0x02) -#define BMA423_STATE_INVALID UINT8_C(0x03) - -/**\name Configuration selection macros */ -#define BMA423_PHONE_CONFIG UINT8_C(0x00) -#define BMA423_WRIST_CONFIG UINT8_C(0x01) - -/**\name Step counter parameter setting(1-25) for phone */ -#define BMA423_PHONE_SC_PARAM_1 UINT16_C(0x132) -#define BMA423_PHONE_SC_PARAM_2 UINT16_C(0x78E6) -#define BMA423_PHONE_SC_PARAM_3 UINT16_C(0x84) -#define BMA423_PHONE_SC_PARAM_4 UINT16_C(0x6C9C) -#define BMA423_PHONE_SC_PARAM_5 UINT8_C(0x07) -#define BMA423_PHONE_SC_PARAM_6 UINT16_C(0x7564) -#define BMA423_PHONE_SC_PARAM_7 UINT16_C(0x7EAA) -#define BMA423_PHONE_SC_PARAM_8 UINT16_C(0x55F) -#define BMA423_PHONE_SC_PARAM_9 UINT16_C(0xABE) -#define BMA423_PHONE_SC_PARAM_10 UINT16_C(0x55F) -#define BMA423_PHONE_SC_PARAM_11 UINT16_C(0xE896) -#define BMA423_PHONE_SC_PARAM_12 UINT16_C(0x41EF) -#define BMA423_PHONE_SC_PARAM_13 UINT8_C(0x01) -#define BMA423_PHONE_SC_PARAM_14 UINT8_C(0x0C) -#define BMA423_PHONE_SC_PARAM_15 UINT8_C(0x0C) -#define BMA423_PHONE_SC_PARAM_16 UINT8_C(0x4A) -#define BMA423_PHONE_SC_PARAM_17 UINT8_C(0xA0) -#define BMA423_PHONE_SC_PARAM_18 UINT8_C(0x00) -#define BMA423_PHONE_SC_PARAM_19 UINT8_C(0x0C) -#define BMA423_PHONE_SC_PARAM_20 UINT16_C(0x3CF0) -#define BMA423_PHONE_SC_PARAM_21 UINT16_C(0x100) -#define BMA423_PHONE_SC_PARAM_22 UINT8_C(0x00) -#define BMA423_PHONE_SC_PARAM_23 UINT8_C(0x00) -#define BMA423_PHONE_SC_PARAM_24 UINT8_C(0x00) -#define BMA423_PHONE_SC_PARAM_25 UINT8_C(0x00) - -/**\name Step counter parameter setting(1-25) for wrist (Default) */ -#define BMA423_WRIST_SC_PARAM_1 UINT16_C(0x12D) -#define BMA423_WRIST_SC_PARAM_2 UINT16_C(0x7BD4) -#define BMA423_WRIST_SC_PARAM_3 UINT16_C(0x13B) -#define BMA423_WRIST_SC_PARAM_4 UINT16_C(0x7ADB) -#define BMA423_WRIST_SC_PARAM_5 UINT8_C(0x04) -#define BMA423_WRIST_SC_PARAM_6 UINT16_C(0x7B3F) -#define BMA423_WRIST_SC_PARAM_7 UINT16_C(0x6CCD) -#define BMA423_WRIST_SC_PARAM_8 UINT16_C(0x4C3) -#define BMA423_WRIST_SC_PARAM_9 UINT16_C(0x985) -#define BMA423_WRIST_SC_PARAM_10 UINT16_C(0x4C3) -#define BMA423_WRIST_SC_PARAM_11 UINT16_C(0xE6EC) -#define BMA423_WRIST_SC_PARAM_12 UINT16_C(0x460C) -#define BMA423_WRIST_SC_PARAM_13 UINT8_C(0x01) -#define BMA423_WRIST_SC_PARAM_14 UINT8_C(0x27) -#define BMA423_WRIST_SC_PARAM_15 UINT8_C(0x19) -#define BMA423_WRIST_SC_PARAM_16 UINT8_C(0x96) -#define BMA423_WRIST_SC_PARAM_17 UINT8_C(0xA0) -#define BMA423_WRIST_SC_PARAM_18 UINT8_C(0x01) -#define BMA423_WRIST_SC_PARAM_19 UINT8_C(0x0C) -#define BMA423_WRIST_SC_PARAM_20 UINT16_C(0x3CF0) -#define BMA423_WRIST_SC_PARAM_21 UINT16_C(0x100) -#define BMA423_WRIST_SC_PARAM_22 UINT8_C(0x01) -#define BMA423_WRIST_SC_PARAM_23 UINT8_C(0x03) -#define BMA423_WRIST_SC_PARAM_24 UINT8_C(0x01) -#define BMA423_WRIST_SC_PARAM_25 UINT8_C(0x0E) - -/*! - * @brief Any motion configuration - */ -struct bma423_anymotion_config { - /*! Expressed in 50 Hz samples (20 ms) */ - uint16_t duration; - /*! Threshold value for Any-motion / No-motion detection in - 5.11g format */ - uint16_t threshold; - /*! Indicates if No-motion or Any-motion is selected */ - uint8_t nomotion_sel; -}; - -/*! - * @brief Axes remapping configuration - */ -struct bma423_axes_remap { - uint8_t x_axis; - uint8_t x_axis_sign; - uint8_t y_axis; - uint8_t y_axis_sign; - uint8_t z_axis; - uint8_t z_axis_sign; -}; - -/*! - * @brief Step counter param settings - */ -struct bma423_stepcounter_settings { - /*! Step Counter param 1 */ - uint16_t param1; - /*! Step Counter param 2 */ - uint16_t param2; - /*! Step Counter param 3 */ - uint16_t param3; - /*! Step Counter param 4 */ - uint16_t param4; - /*! Step Counter param 5 */ - uint16_t param5; - /*! Step Counter param 6 */ - uint16_t param6; - /*! Step Counter param 7 */ - uint16_t param7; - /*! Step Counter param 8 */ - uint16_t param8; - /*! Step Counter param 9 */ - uint16_t param9; - /*! Step Counter param 10 */ - uint16_t param10; - /*! Step Counter param 11 */ - uint16_t param11; - /*! Step Counter param 12 */ - uint16_t param12; - /*! Step Counter param 13 */ - uint16_t param13; - /*! Step Counter param 14 */ - uint16_t param14; - /*! Step Counter param 15 */ - uint16_t param15; - /*! Step Counter param 16 */ - uint16_t param16; - /*! Step Counter param 17 */ - uint16_t param17; - /*! Step Counter param 18 */ - uint16_t param18; - /*! Step Counter param 19 */ - uint16_t param19; - /*! Step Counter param 20 */ - uint16_t param20; - /*! Step Counter param 21 */ - uint16_t param21; - /*! Step Counter param 22 */ - uint16_t param22; - /*! Step Counter param 23 */ - uint16_t param23; - /*! Step Counter param 24 */ - uint16_t param24; - /*! Step Counter param 25 */ - uint16_t param25; -}; - -/*! - * @brief This API is the entry point. - * Call this API before using all other APIs. - * This API reads the chip-id of the sensor and sets the resolution. - * - * @param[in,out] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_init(struct bma4_dev *dev); - -/*! - * @brief This API is used to upload the config file to enable - * the features of the sensor. - * - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_write_config_file(struct bma4_dev *dev); - -/*! - * @brief This API is used to get the configuration id of the sensor. - * - * @param[out] config_id : Pointer variable used to store - * the configuration id. - * @param[in] dev : Structure instance of bma4_dev. - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_get_config_id(uint16_t *config_id, struct bma4_dev *dev); - - -/*! - * @brief This API sets/unsets the user provided interrupt to either - * interrupt pin1 or pin2 in the sensor. - * - * @param[in] int_line: Variable to select either interrupt pin1 or pin2. - * int_line | Macros - * ------------|------------------- - * 0 | BMA4_INTR1_MAP - * 1 | BMA4_INTR2_MAP - * @param[in] int_map : Variable to specify the interrupts. - * @param[in] enable : Variable to specify mapping or unmapping of - * interrupts. - * enable | Macros - * --------------------|------------------- - * 0x00 | BMA4_DISABLE - * 0x01 | BMA4_ENABLE - * @param[in] dev : Structure instance of bma4_dev. - * - * @note Below macros specify the interrupts. - * Feature Interrupts - * - BMA423_STEP_CNTR_INT - * - BMA423_ACTIVITY_INT - * - BMA423_TILT_INT - * - BMA423_WAKEUP_INT - * - BMA423_ANY_NO_MOTION_INT - * - BMA423_ERROR_INT - * - * Hardware Interrupts - * - BMA4_FIFO_FULL_INT - * - BMA4_FIFO_WM_INT - * - BMA4_DATA_RDY_INT - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_map_interrupt(uint8_t int_line, uint16_t int_map, uint8_t enable, struct bma4_dev *dev); - -/*! - * @brief This API reads the bma423 interrupt status from the sensor. - * - * @param[out] int_status : Variable to store the interrupt status - * read from the sensor. - * @param[in] dev : Structure instance of bma4_dev. - * - * @note Below macros are used to check the interrupt status. - * Feature Interrupts - * - * - BMA423_STEP_CNTR_INT - * - BMA423_ACTIVITY_INT - * - BMA423_TILT_INT - * - BMA423_WAKEUP_INT - * - BMA423_ANY_NO_MOTION_INT - * - BMA423_ERROR_INT - * - * - * Hardware Interrupts - * - BMA4_FIFO_FULL_INT - * - BMA4_FIFO_WM_INT - * - BMA4_MAG_DATA_RDY_INT - * - BMA4_ACCEL_DATA_RDY_INT - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_read_int_status(uint16_t *int_status, struct bma4_dev *dev); - -/*! - * @brief This API enables/disables the features of the sensor. - * - * @param[in] feature : Variable to specify the features - * which are to be set in bma423 sensor. - * @param[in] enable : Variable which specifies whether to enable or - * disable the features in the bma423 sensor - * enable | Macros - * --------------------|------------------- - * 0x00 | BMA4_DISABLE - * 0x01 | BMA4_ENABLE - * @param[in] dev : Structure instance of bma4_dev. - * - * @note User should use the below macros to enable or disable the - * features of bma423 sensor - * - BMA423_STEP_CNTR - * - BMA423_ANY_MOTION (or) BMA423_NO_MOTION - * - BMA423_ACTIVITY - * - BMA423_WAKEUP - * - BMA423_TILT - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_feature_enable(uint8_t feature, uint8_t enable, struct bma4_dev *dev); - - -/*! - * @brief This API performs x, y and z axis remapping in the sensor. - * - * @param[in] remap_data : Pointer to store axes remapping data. - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_set_remap_axes(const struct bma423_axes_remap *remap_data, struct bma4_dev *dev); - -/*! - * @brief This API reads the x, y and z axis remap data from the sensor. - * - * @param[out] remap_data : Pointer to store axis remap data which is read - * from the bma423 sensor. - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_get_remap_axes(struct bma423_axes_remap *remap_data, struct bma4_dev *dev); - - -/*! - * @brief This API sets the watermark level for step counter - * interrupt in the sensor. - * - * @param[in] step_counter_wm : Variable which specifies watermark level - * count - * @note Valid values are from 1 to 1023 - * @note Value 0 is used for step detector interrupt - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_step_counter_set_watermark(uint16_t step_counter_wm, struct bma4_dev *dev); - -/*! - * @brief This API gets the water mark level set for step counter interrupt - * in the sensor - * - * @param[out] step_counter_wm : Pointer variable which stores - * the water mark level read from the sensor. - * @note valid values are from 1 to 1023 - * @note value 0 is used for step detector interrupt - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_step_counter_get_watermark(uint16_t *step_counter_wm, struct bma4_dev *dev); - -/*! - * @brief This API resets the counted steps of step counter. - * - * @param[in] dev : structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_reset_step_counter(struct bma4_dev *dev); - -/*! - * @brief This API gets the number of counted steps of the step counter - * feature from the sensor. - * - * @param[out] step_count : Pointer variable which stores counted steps - * read from the sensor. - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_step_counter_output(uint32_t *step_count, struct bma4_dev *dev); - -/*! - * @brief This API gets the output for activity feature. - * - * @param[out] activity : Pointer variable which stores activity output - * read from the sensor. - * activity | State - * --------------|------------------------ - * 0x00 | BMA423_USER_STATIONARY - * 0x01 | BMA423_USER_WALKING - * 0x02 | BMA423_USER_RUNNING - * 0x03 | BMA423_STATE_INVALID - * - * @param[in] dev : Structure instance of bma4_dev - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_activity_output(uint8_t *activity, struct bma4_dev *dev); - -/*! - * @brief This API select the platform configuration wrist(default) or phone. - * - * @param[in] platform : Variable to select wrist/phone - * - * platform | Macros - * -------------|------------------------ - * 0x00 | BMA423_PHONE_CONFIG - * 0x01 | BMA423_WRIST_CONFIG - * - * @param[in] dev : Structure instance of bma4_dev - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_select_platform(uint8_t platform, struct bma4_dev *dev); - -/*! - * @brief This API gets the parameter1 to parameter7 settings of the - * step counter feature. - * - * @param[out] setting : Pointer to structure variable which stores the - * parameter1 to parameter7 read from the sensor. - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_stepcounter_get_parameter(struct bma423_stepcounter_settings *setting, struct bma4_dev *dev); - -/*! - * @brief This API sets the parameter1 to parameter7 settings of the - * step counter feature in the sensor. - * - * @param[in] setting : Pointer to structure variable which stores the - * parameter1 to parameter7 settings read from the sensor. - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_stepcounter_set_parameter(const struct bma423_stepcounter_settings *setting, struct bma4_dev *dev); - -/*! - * @brief This API enables or disables the step detector feature in the - * sensor. - * - * @param[in] enable : Variable used to enable or disable step detector - * enable | Macros - * --------------------|------------------- - * 0x00 | BMA4_DISABLE - * 0x01 | BMA4_ENABLE - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_step_detector_enable(uint8_t enable, struct bma4_dev *dev); - -/*! - * @brief This API enables the any motion feature according to the axis - * set by the user in the sensor. - * - * @param[in] axis : Variable to specify the axis of the any motion feature - * to be enabled in the sensor. - * Value | Axis - * ---------|------------------------- - * 0x00 | BMA423_ALL_AXIS_DIS - * 0x01 | BMA423_X_AXIS_EN - * 0x02 | BMA423_Y_AXIS_EN - * 0x04 | BMA423_Z_AXIS_EN - * 0x07 | BMA423_ALL_AXIS_EN - * @param[in] dev : Structure instance of bma4_dev - * - * @return result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_anymotion_enable_axis(uint8_t axis, struct bma4_dev *dev); - -/*! @brief This API sets the configuration of Any motion feature in - * the sensor. - * - * @param[in] any_motion : Pointer to structure variable to specify - * the any motion feature settings. - * Structure members are provided in the table below - *@verbatim - * ------------------------------------------------------------------------- - * Structure parameters | Description - * --------------------------------|---------------------------------------- - * | Defines the number of - * | consecutive data points for - * | which the threshold condition - * duration | must be respected, for interrupt - * | assertion. It is expressed in - * | 50 Hz samples (20 ms). - * | Range is 0 to 163sec. - * | Default value is 5 = 100ms. - * --------------------------------|---------------------------------------- - * | Slope threshold value for - * | Any-motion / No-motion detection - * threshold | in 5.11g format. - * | Range is 0 to 1g. - * | Default value is 0xAA = 83mg. - * --------------------------------|---------------------------------------- - * | Indicates if No motion (1) or - * nomotion_sel | Any-motion (0) is selected; - * | default value is 0 Any-motion. - * ------------------------------------------------------------------------- - *@endverbatim - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_set_any_motion_config(const struct bma423_anymotion_config *any_motion, struct bma4_dev *dev); - -/*! @brief This API gets the configuration of any motion feature from - * the sensor. - * - * @param[out] any_motion : Pointer to structure variable used to store - * the any motion feature settings read from the sensor. - * Structure members are provided in the table below - *@verbatim - * ------------------------------------------------------------------------- - * Structure parameters | Description - * --------------------------------|---------------------------------------- - * | Defines the number of - * | consecutive data points for - * | which the threshold condition - * duration | must be respected, for interrupt - * | assertion. It is expressed in - * | 50 Hz samples (20 ms). - * | Range is 0 to 163sec. - * | Default value is 5 = 100ms. - * --------------------------------|---------------------------------------- - * | Slope threshold value for - * | Any-motion / No-motion detection - * threshold | in 5.11g format. - * | Range is 0 to 1g. - * | Default value is 0xAA = 83mg. - * --------------------------------|---------------------------------------- - * | Indicates if No motion (1) or - * nomotion_sel | Any-motion (0) is selected; - * | default value is 0 Any-motion. - * ------------------------------------------------------------------------- - *@endverbatim - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_get_any_motion_config(struct bma423_anymotion_config *any_motion, struct bma4_dev *dev); - -/*! - * @brief This API sets the sensitivity of wake up feature in the sensor - * - * @param[in] sensitivity : Variable used to specify the sensitivity of the - * Wake up feature. - * Value | Sensitivity - * --------|------------------------- - * 0x00 | MOST SENSITIVE - * 0x07 | LEAST SENSITIVE - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_wakeup_set_sensitivity(uint8_t sensitivity, struct bma4_dev *dev); - -/*! - * @brief This API gets the sensitivity of wake up feature in the sensor - * - * @param[out] sensitivity : Pointer variable which stores the sensitivity - * value read from the sensor. - * Value | Sensitivity - * --------|------------------------- - * 0x00 | MOST SENSITIVE - * 0x07 | LEAST SENSITIVE - * @param[in] dev : Structure instance of bma4_dev - * - * @return Result of API execution status - * @retval 0 -> Success - * @retval Any non zero value -> Fail - */ -uint16_t bma423_wakeup_get_sensitivity(uint8_t *sensitivity, struct bma4_dev *dev); - -/*! - * @brief This API is used to select single/double tap - * feature in the sensor - * - * @param tap_select : Variable used to specify the single or - * double tap selection in the sensor - * tap_select | description - * ------------|------------------------ - * 0x00 | Double tap selected - * 0x01 | single tap selected - * - * @param dev : Structure instance of bma4_dev - * - * @return results of stream_transfer operation - * @retval 0 -> Success - * @retval Any positive value mentioned in ERROR CODES -> Fail - * - */ -uint16_t bma423_tap_selection(const uint8_t tap_select, struct bma4_dev *dev); - -#ifdef __cplusplus -} -#endif /*End of CPP guard */ - -#endif /*End of header guard macro */ +/* +* +**************************************************************************** +* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH +* +* File : bma423.h +* +* Date: 12 Oct 2017 +* +* Revision : 1.1.4 $ +* +* Usage: Sensor Driver for BMA423 sensor +* +**************************************************************************** +* +* Disclaimer +* +* Common: +* Bosch Sensortec products are developed for the consumer goods industry. +* They may only be used within the parameters of the respective valid +* product data sheet. Bosch Sensortec products are provided with the +* express understanding that there is no warranty of fitness for a +* particular purpose.They are not fit for use in life-sustaining, +* safety or security sensitive systems or any system or device +* that may lead to bodily harm or property damage if the system +* or device malfunctions. In addition,Bosch Sensortec products are +* not fit for use in products which interact with motor vehicle systems. +* The resale and or use of products are at the purchasers own risk and +* his own responsibility. The examination of fitness for the intended use +* is the sole responsibility of the Purchaser. +* +* The purchaser shall indemnify Bosch Sensortec from all third party +* claims, including any claims for incidental, or consequential damages, +* arising from any product use not covered by the parameters of +* the respective valid product data sheet or not approved by +* Bosch Sensortec and reimburse Bosch Sensortec for all costs in +* connection with such claims. +* +* The purchaser must monitor the market for the purchased products, +* particularly with regard to product safety and inform Bosch Sensortec +* without delay of all security relevant incidents. +* +* Engineering Samples are marked with an asterisk (*) or (e). +* Samples may vary from the valid technical specifications of the product +* series. They are therefore not intended or fit for resale to third +* parties or for use in end products. Their sole purpose is internal +* client testing. The testing of an engineering sample may in no way +* replace the testing of a product series. Bosch Sensortec assumes +* no liability for the use of engineering samples. +* By accepting the engineering samples, the Purchaser agrees to indemnify +* Bosch Sensortec from all claims arising from the use of engineering +* samples. +* +* Special: +* This software module (hereinafter called "Software") and any information +* on application-sheets (hereinafter called "Information") is provided +* free of charge for the sole purpose to support your application work. +* The Software and Information is subject to the following +* terms and conditions: +* +* The Software is specifically designed for the exclusive use for +* Bosch Sensortec products by personnel who have special experience +* and training. Do not use this Software if you do not have the +* proper experience or training. +* +* This Software package is provided `` as is `` and without any expressed +* or implied warranties,including without limitation, the implied warranties +* of merchantability and fitness for a particular purpose. +* +* Bosch Sensortec and their representatives and agents deny any liability +* for the functional impairment +* of this Software in terms of fitness, performance and safety. +* Bosch Sensortec and their representatives and agents shall not be liable +* for any direct or indirect damages or injury, except as +* otherwise stipulated in mandatory applicable law. +* +* The Information provided is believed to be accurate and reliable. +* Bosch Sensortec assumes no responsibility for the consequences of use +* of such Information nor for any infringement of patents or +* other rights of third parties which may result from its use. +* No license is granted by implication or otherwise under any patent or +* patent rights of Bosch. Specifications mentioned in the Information are +* subject to change without notice. +**************************************************************************/ +/*! \file bma423.h + \brief Sensor Driver for BMA423 sensor */ +#ifndef BMA423_H +#define BMA423_H + +#ifdef __cplusplus +extern "C" { +#endif +#include "bma4.h" + +/**\name Chip ID of BMA423 sensor */ +#define BMA423_CHIP_ID UINT8_C(0x13) + +/**\name Sensor feature size */ +#define BMA423_FEATURE_SIZE UINT8_C(64) +#define BMA423_ANYMOTION_EN_LEN UINT8_C(2) +#define BMA423_RD_WR_MIN_LEN UINT8_C(2) + +/**\name Feature offset address */ +#define BMA423_ANY_NO_MOTION_OFFSET UINT8_C(0x00) +#define BMA423_STEP_CNTR_OFFSET UINT8_C(0x36) +#define BMA423_STEP_CNTR_PARAM_OFFSET UINT8_C(0x04) +#define BMA423_WAKEUP_OFFSET UINT8_C(0x38) +#define BMA423_TILT_OFFSET UINT8_C(0x3A) +#define BMA423_CONFIG_ID_OFFSET UINT8_C(0x3C) +#define BMA423_AXES_REMAP_OFFSET UINT8_C(0x3E) + + +/**************************************************************/ +/**\name Remap Axes */ +/**************************************************************/ +#define BMA423_X_AXIS_MASK UINT8_C(0x03) +#define BMA423_X_AXIS_SIGN_MASK UINT8_C(0x04) +#define BMA423_Y_AXIS_MASK UINT8_C(0x18) +#define BMA423_Y_AXIS_SIGN_MASK UINT8_C(0x20) +#define BMA423_Z_AXIS_MASK UINT8_C(0xC0) +#define BMA423_Z_AXIS_SIGN_MASK UINT8_C(0x01) + +/**************************************************************/ +/**\name Step Counter & Detector */ +/**************************************************************/ +/**\name Step counter enable macros */ +#define BMA423_STEP_CNTR_EN_POS UINT8_C(4) +#define BMA423_STEP_CNTR_EN_MSK UINT8_C(0x10) +#define BMA423_ACTIVITY_EN_MSK UINT8_C(0x20) + +/**\name Step counter watermark macros */ +#define BMA423_STEP_CNTR_WM_MSK UINT16_C(0x03FF) + +/**\name Step counter reset macros */ +#define BMA423_STEP_CNTR_RST_POS UINT8_C(2) +#define BMA423_STEP_CNTR_RST_MSK UINT8_C(0x04) + +/**\name Step detector enable macros */ +#define BMA423_STEP_DETECTOR_EN_POS UINT8_C(3) +#define BMA423_STEP_DETECTOR_EN_MSK UINT8_C(0x08) + +/**\name Tilt enable macros */ +#define BMA423_TILT_EN_MSK UINT8_C(0x01) + +/**\name Step count output length*/ +#define BMA423_STEP_CNTR_DATA_SIZE UINT16_C(4) + +/**\name Wakeup enable macros */ +#define BMA423_WAKEUP_EN_MSK UINT8_C(0x01) + +/**\name Wake up sensitivity macros */ +#define BMA423_WAKEUP_SENS_POS UINT8_C(1) +#define BMA423_WAKEUP_SENS_MSK UINT8_C(0x0E) + +/**\name Tap selection macro */ +#define BMA423_TAP_SEL_POS UINT8_C(4) +#define BMA423_TAP_SEL_MSK UINT8_C(0x10) + +/**************************************************************/ +/**\name Any Motion */ +/**************************************************************/ +/**\name Any motion threshold macros */ +#define BMA423_ANY_NO_MOTION_THRES_POS UINT8_C(0) +#define BMA423_ANY_NO_MOTION_THRES_MSK UINT16_C(0x07FF) + +/**\name Any motion selection macros */ +#define BMA423_ANY_NO_MOTION_SEL_POS UINT8_C(3) +#define BMA423_ANY_NO_MOTION_SEL_MSK UINT8_C(0x08) + +/**\name Any motion enable macros */ +#define BMA423_ANY_NO_MOTION_AXIS_EN_POS UINT8_C(5) +#define BMA423_ANY_NO_MOTION_AXIS_EN_MSK UINT8_C(0xE0) + +/**\name Any motion duration macros */ +#define BMA423_ANY_NO_MOTION_DUR_MSK UINT16_C(0x1FFF) + +/**************************************************************/ +/**\name User macros */ +/**************************************************************/ + +/**\name Anymotion/Nomotion axis enable macros */ +#define BMA423_X_AXIS_EN UINT8_C(0x01) +#define BMA423_Y_AXIS_EN UINT8_C(0x02) +#define BMA423_Z_AXIS_EN UINT8_C(0x04) +#define BMA423_ALL_AXIS_EN UINT8_C(0x07) +#define BMA423_ALL_AXIS_DIS UINT8_C(0x00) + +/**\name Feature enable macros for the sensor */ +#define BMA423_STEP_CNTR UINT8_C(0x01) +/**\name Below macros are mutually exclusive */ +#define BMA423_ANY_MOTION UINT8_C(0x02) +#define BMA423_NO_MOTION UINT8_C(0x04) +#define BMA423_ACTIVITY UINT8_C(0x08) +#define BMA423_TILT UINT8_C(0x10) +#define BMA423_WAKEUP UINT8_C(0x20) + +/**\name Interrupt status macros */ +#define BMA423_STEP_CNTR_INT UINT8_C(0x02) +#define BMA423_ACTIVITY_INT UINT8_C(0x04) +#define BMA423_TILT_INT UINT8_C(0x08) +#define BMA423_WAKEUP_INT UINT8_C(0x20) +#define BMA423_ANY_NO_MOTION_INT UINT8_C(0x40) +#define BMA423_ERROR_INT UINT8_C(0x80) + +/**\name Activity recognition macros */ +#define BMA423_USER_STATIONARY UINT8_C(0x00) +#define BMA423_USER_WALKING UINT8_C(0x01) +#define BMA423_USER_RUNNING UINT8_C(0x02) +#define BMA423_STATE_INVALID UINT8_C(0x03) + +/**\name Configuration selection macros */ +#define BMA423_PHONE_CONFIG UINT8_C(0x00) +#define BMA423_WRIST_CONFIG UINT8_C(0x01) + +/**\name Step counter parameter setting(1-25) for phone */ +#define BMA423_PHONE_SC_PARAM_1 UINT16_C(0x132) +#define BMA423_PHONE_SC_PARAM_2 UINT16_C(0x78E6) +#define BMA423_PHONE_SC_PARAM_3 UINT16_C(0x84) +#define BMA423_PHONE_SC_PARAM_4 UINT16_C(0x6C9C) +#define BMA423_PHONE_SC_PARAM_5 UINT8_C(0x07) +#define BMA423_PHONE_SC_PARAM_6 UINT16_C(0x7564) +#define BMA423_PHONE_SC_PARAM_7 UINT16_C(0x7EAA) +#define BMA423_PHONE_SC_PARAM_8 UINT16_C(0x55F) +#define BMA423_PHONE_SC_PARAM_9 UINT16_C(0xABE) +#define BMA423_PHONE_SC_PARAM_10 UINT16_C(0x55F) +#define BMA423_PHONE_SC_PARAM_11 UINT16_C(0xE896) +#define BMA423_PHONE_SC_PARAM_12 UINT16_C(0x41EF) +#define BMA423_PHONE_SC_PARAM_13 UINT8_C(0x01) +#define BMA423_PHONE_SC_PARAM_14 UINT8_C(0x0C) +#define BMA423_PHONE_SC_PARAM_15 UINT8_C(0x0C) +#define BMA423_PHONE_SC_PARAM_16 UINT8_C(0x4A) +#define BMA423_PHONE_SC_PARAM_17 UINT8_C(0xA0) +#define BMA423_PHONE_SC_PARAM_18 UINT8_C(0x00) +#define BMA423_PHONE_SC_PARAM_19 UINT8_C(0x0C) +#define BMA423_PHONE_SC_PARAM_20 UINT16_C(0x3CF0) +#define BMA423_PHONE_SC_PARAM_21 UINT16_C(0x100) +#define BMA423_PHONE_SC_PARAM_22 UINT8_C(0x00) +#define BMA423_PHONE_SC_PARAM_23 UINT8_C(0x00) +#define BMA423_PHONE_SC_PARAM_24 UINT8_C(0x00) +#define BMA423_PHONE_SC_PARAM_25 UINT8_C(0x00) + +/**\name Step counter parameter setting(1-25) for wrist (Default) */ +#define BMA423_WRIST_SC_PARAM_1 UINT16_C(0x12D) +#define BMA423_WRIST_SC_PARAM_2 UINT16_C(0x7BD4) +#define BMA423_WRIST_SC_PARAM_3 UINT16_C(0x13B) +#define BMA423_WRIST_SC_PARAM_4 UINT16_C(0x7ADB) +#define BMA423_WRIST_SC_PARAM_5 UINT8_C(0x04) +#define BMA423_WRIST_SC_PARAM_6 UINT16_C(0x7B3F) +#define BMA423_WRIST_SC_PARAM_7 UINT16_C(0x6CCD) +#define BMA423_WRIST_SC_PARAM_8 UINT16_C(0x4C3) +#define BMA423_WRIST_SC_PARAM_9 UINT16_C(0x985) +#define BMA423_WRIST_SC_PARAM_10 UINT16_C(0x4C3) +#define BMA423_WRIST_SC_PARAM_11 UINT16_C(0xE6EC) +#define BMA423_WRIST_SC_PARAM_12 UINT16_C(0x460C) +#define BMA423_WRIST_SC_PARAM_13 UINT8_C(0x01) +#define BMA423_WRIST_SC_PARAM_14 UINT8_C(0x27) +#define BMA423_WRIST_SC_PARAM_15 UINT8_C(0x19) +#define BMA423_WRIST_SC_PARAM_16 UINT8_C(0x96) +#define BMA423_WRIST_SC_PARAM_17 UINT8_C(0xA0) +#define BMA423_WRIST_SC_PARAM_18 UINT8_C(0x01) +#define BMA423_WRIST_SC_PARAM_19 UINT8_C(0x0C) +#define BMA423_WRIST_SC_PARAM_20 UINT16_C(0x3CF0) +#define BMA423_WRIST_SC_PARAM_21 UINT16_C(0x100) +#define BMA423_WRIST_SC_PARAM_22 UINT8_C(0x01) +#define BMA423_WRIST_SC_PARAM_23 UINT8_C(0x03) +#define BMA423_WRIST_SC_PARAM_24 UINT8_C(0x01) +#define BMA423_WRIST_SC_PARAM_25 UINT8_C(0x0E) + +/*! + * @brief Any motion configuration + */ +struct bma423_anymotion_config { + /*! Expressed in 50 Hz samples (20 ms) */ + uint16_t duration; + /*! Threshold value for Any-motion / No-motion detection in + 5.11g format */ + uint16_t threshold; + /*! Indicates if No-motion or Any-motion is selected */ + uint8_t nomotion_sel; +}; + +/*! + * @brief Axes remapping configuration + */ +struct bma423_axes_remap { + uint8_t x_axis; + uint8_t x_axis_sign; + uint8_t y_axis; + uint8_t y_axis_sign; + uint8_t z_axis; + uint8_t z_axis_sign; +}; + +/*! + * @brief Step counter param settings + */ +struct bma423_stepcounter_settings { + /*! Step Counter param 1 */ + uint16_t param1; + /*! Step Counter param 2 */ + uint16_t param2; + /*! Step Counter param 3 */ + uint16_t param3; + /*! Step Counter param 4 */ + uint16_t param4; + /*! Step Counter param 5 */ + uint16_t param5; + /*! Step Counter param 6 */ + uint16_t param6; + /*! Step Counter param 7 */ + uint16_t param7; + /*! Step Counter param 8 */ + uint16_t param8; + /*! Step Counter param 9 */ + uint16_t param9; + /*! Step Counter param 10 */ + uint16_t param10; + /*! Step Counter param 11 */ + uint16_t param11; + /*! Step Counter param 12 */ + uint16_t param12; + /*! Step Counter param 13 */ + uint16_t param13; + /*! Step Counter param 14 */ + uint16_t param14; + /*! Step Counter param 15 */ + uint16_t param15; + /*! Step Counter param 16 */ + uint16_t param16; + /*! Step Counter param 17 */ + uint16_t param17; + /*! Step Counter param 18 */ + uint16_t param18; + /*! Step Counter param 19 */ + uint16_t param19; + /*! Step Counter param 20 */ + uint16_t param20; + /*! Step Counter param 21 */ + uint16_t param21; + /*! Step Counter param 22 */ + uint16_t param22; + /*! Step Counter param 23 */ + uint16_t param23; + /*! Step Counter param 24 */ + uint16_t param24; + /*! Step Counter param 25 */ + uint16_t param25; +}; + +/*! + * @brief This API is the entry point. + * Call this API before using all other APIs. + * This API reads the chip-id of the sensor and sets the resolution. + * + * @param[in,out] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_init(struct bma4_dev *dev); + +/*! + * @brief This API is used to upload the config file to enable + * the features of the sensor. + * + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_write_config_file(struct bma4_dev *dev); + +/*! + * @brief This API is used to get the configuration id of the sensor. + * + * @param[out] config_id : Pointer variable used to store + * the configuration id. + * @param[in] dev : Structure instance of bma4_dev. + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_get_config_id(uint16_t *config_id, struct bma4_dev *dev); + + +/*! + * @brief This API sets/unsets the user provided interrupt to either + * interrupt pin1 or pin2 in the sensor. + * + * @param[in] int_line: Variable to select either interrupt pin1 or pin2. + * int_line | Macros + * ------------|------------------- + * 0 | BMA4_INTR1_MAP + * 1 | BMA4_INTR2_MAP + * @param[in] int_map : Variable to specify the interrupts. + * @param[in] enable : Variable to specify mapping or unmapping of + * interrupts. + * enable | Macros + * --------------------|------------------- + * 0x00 | BMA4_DISABLE + * 0x01 | BMA4_ENABLE + * @param[in] dev : Structure instance of bma4_dev. + * + * @note Below macros specify the interrupts. + * Feature Interrupts + * - BMA423_STEP_CNTR_INT + * - BMA423_ACTIVITY_INT + * - BMA423_TILT_INT + * - BMA423_WAKEUP_INT + * - BMA423_ANY_NO_MOTION_INT + * - BMA423_ERROR_INT + * + * Hardware Interrupts + * - BMA4_FIFO_FULL_INT + * - BMA4_FIFO_WM_INT + * - BMA4_DATA_RDY_INT + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_map_interrupt(uint8_t int_line, uint16_t int_map, uint8_t enable, struct bma4_dev *dev); + +/*! + * @brief This API reads the bma423 interrupt status from the sensor. + * + * @param[out] int_status : Variable to store the interrupt status + * read from the sensor. + * @param[in] dev : Structure instance of bma4_dev. + * + * @note Below macros are used to check the interrupt status. + * Feature Interrupts + * + * - BMA423_STEP_CNTR_INT + * - BMA423_ACTIVITY_INT + * - BMA423_TILT_INT + * - BMA423_WAKEUP_INT + * - BMA423_ANY_NO_MOTION_INT + * - BMA423_ERROR_INT + * + * + * Hardware Interrupts + * - BMA4_FIFO_FULL_INT + * - BMA4_FIFO_WM_INT + * - BMA4_MAG_DATA_RDY_INT + * - BMA4_ACCEL_DATA_RDY_INT + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_read_int_status(uint16_t *int_status, struct bma4_dev *dev); + +/*! + * @brief This API enables/disables the features of the sensor. + * + * @param[in] feature : Variable to specify the features + * which are to be set in bma423 sensor. + * @param[in] enable : Variable which specifies whether to enable or + * disable the features in the bma423 sensor + * enable | Macros + * --------------------|------------------- + * 0x00 | BMA4_DISABLE + * 0x01 | BMA4_ENABLE + * @param[in] dev : Structure instance of bma4_dev. + * + * @note User should use the below macros to enable or disable the + * features of bma423 sensor + * - BMA423_STEP_CNTR + * - BMA423_ANY_MOTION (or) BMA423_NO_MOTION + * - BMA423_ACTIVITY + * - BMA423_WAKEUP + * - BMA423_TILT + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_feature_enable(uint8_t feature, uint8_t enable, struct bma4_dev *dev); + + +/*! + * @brief This API performs x, y and z axis remapping in the sensor. + * + * @param[in] remap_data : Pointer to store axes remapping data. + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_set_remap_axes(const struct bma423_axes_remap *remap_data, struct bma4_dev *dev); + +/*! + * @brief This API reads the x, y and z axis remap data from the sensor. + * + * @param[out] remap_data : Pointer to store axis remap data which is read + * from the bma423 sensor. + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_get_remap_axes(struct bma423_axes_remap *remap_data, struct bma4_dev *dev); + + +/*! + * @brief This API sets the watermark level for step counter + * interrupt in the sensor. + * + * @param[in] step_counter_wm : Variable which specifies watermark level + * count + * @note Valid values are from 1 to 1023 + * @note Value 0 is used for step detector interrupt + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_step_counter_set_watermark(uint16_t step_counter_wm, struct bma4_dev *dev); + +/*! + * @brief This API gets the water mark level set for step counter interrupt + * in the sensor + * + * @param[out] step_counter_wm : Pointer variable which stores + * the water mark level read from the sensor. + * @note valid values are from 1 to 1023 + * @note value 0 is used for step detector interrupt + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_step_counter_get_watermark(uint16_t *step_counter_wm, struct bma4_dev *dev); + +/*! + * @brief This API resets the counted steps of step counter. + * + * @param[in] dev : structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_reset_step_counter(struct bma4_dev *dev); + +/*! + * @brief This API gets the number of counted steps of the step counter + * feature from the sensor. + * + * @param[out] step_count : Pointer variable which stores counted steps + * read from the sensor. + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_step_counter_output(uint32_t *step_count, struct bma4_dev *dev); + +/*! + * @brief This API gets the output for activity feature. + * + * @param[out] activity : Pointer variable which stores activity output + * read from the sensor. + * activity | State + * --------------|------------------------ + * 0x00 | BMA423_USER_STATIONARY + * 0x01 | BMA423_USER_WALKING + * 0x02 | BMA423_USER_RUNNING + * 0x03 | BMA423_STATE_INVALID + * + * @param[in] dev : Structure instance of bma4_dev + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_activity_output(uint8_t *activity, struct bma4_dev *dev); + +/*! + * @brief This API select the platform configuration wrist(default) or phone. + * + * @param[in] platform : Variable to select wrist/phone + * + * platform | Macros + * -------------|------------------------ + * 0x00 | BMA423_PHONE_CONFIG + * 0x01 | BMA423_WRIST_CONFIG + * + * @param[in] dev : Structure instance of bma4_dev + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_select_platform(uint8_t platform, struct bma4_dev *dev); + +/*! + * @brief This API gets the parameter1 to parameter7 settings of the + * step counter feature. + * + * @param[out] setting : Pointer to structure variable which stores the + * parameter1 to parameter7 read from the sensor. + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_stepcounter_get_parameter(struct bma423_stepcounter_settings *setting, struct bma4_dev *dev); + +/*! + * @brief This API sets the parameter1 to parameter7 settings of the + * step counter feature in the sensor. + * + * @param[in] setting : Pointer to structure variable which stores the + * parameter1 to parameter7 settings read from the sensor. + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_stepcounter_set_parameter(const struct bma423_stepcounter_settings *setting, struct bma4_dev *dev); + +/*! + * @brief This API enables or disables the step detector feature in the + * sensor. + * + * @param[in] enable : Variable used to enable or disable step detector + * enable | Macros + * --------------------|------------------- + * 0x00 | BMA4_DISABLE + * 0x01 | BMA4_ENABLE + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_step_detector_enable(uint8_t enable, struct bma4_dev *dev); + +/*! + * @brief This API enables the any motion feature according to the axis + * set by the user in the sensor. + * + * @param[in] axis : Variable to specify the axis of the any motion feature + * to be enabled in the sensor. + * Value | Axis + * ---------|------------------------- + * 0x00 | BMA423_ALL_AXIS_DIS + * 0x01 | BMA423_X_AXIS_EN + * 0x02 | BMA423_Y_AXIS_EN + * 0x04 | BMA423_Z_AXIS_EN + * 0x07 | BMA423_ALL_AXIS_EN + * @param[in] dev : Structure instance of bma4_dev + * + * @return result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_anymotion_enable_axis(uint8_t axis, struct bma4_dev *dev); + +/*! @brief This API sets the configuration of Any motion feature in + * the sensor. + * + * @param[in] any_motion : Pointer to structure variable to specify + * the any motion feature settings. + * Structure members are provided in the table below + *@verbatim + * ------------------------------------------------------------------------- + * Structure parameters | Description + * --------------------------------|---------------------------------------- + * | Defines the number of + * | consecutive data points for + * | which the threshold condition + * duration | must be respected, for interrupt + * | assertion. It is expressed in + * | 50 Hz samples (20 ms). + * | Range is 0 to 163sec. + * | Default value is 5 = 100ms. + * --------------------------------|---------------------------------------- + * | Slope threshold value for + * | Any-motion / No-motion detection + * threshold | in 5.11g format. + * | Range is 0 to 1g. + * | Default value is 0xAA = 83mg. + * --------------------------------|---------------------------------------- + * | Indicates if No motion (1) or + * nomotion_sel | Any-motion (0) is selected; + * | default value is 0 Any-motion. + * ------------------------------------------------------------------------- + *@endverbatim + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_set_any_motion_config(const struct bma423_anymotion_config *any_motion, struct bma4_dev *dev); + +/*! @brief This API gets the configuration of any motion feature from + * the sensor. + * + * @param[out] any_motion : Pointer to structure variable used to store + * the any motion feature settings read from the sensor. + * Structure members are provided in the table below + *@verbatim + * ------------------------------------------------------------------------- + * Structure parameters | Description + * --------------------------------|---------------------------------------- + * | Defines the number of + * | consecutive data points for + * | which the threshold condition + * duration | must be respected, for interrupt + * | assertion. It is expressed in + * | 50 Hz samples (20 ms). + * | Range is 0 to 163sec. + * | Default value is 5 = 100ms. + * --------------------------------|---------------------------------------- + * | Slope threshold value for + * | Any-motion / No-motion detection + * threshold | in 5.11g format. + * | Range is 0 to 1g. + * | Default value is 0xAA = 83mg. + * --------------------------------|---------------------------------------- + * | Indicates if No motion (1) or + * nomotion_sel | Any-motion (0) is selected; + * | default value is 0 Any-motion. + * ------------------------------------------------------------------------- + *@endverbatim + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_get_any_motion_config(struct bma423_anymotion_config *any_motion, struct bma4_dev *dev); + +/*! + * @brief This API sets the sensitivity of wake up feature in the sensor + * + * @param[in] sensitivity : Variable used to specify the sensitivity of the + * Wake up feature. + * Value | Sensitivity + * --------|------------------------- + * 0x00 | MOST SENSITIVE + * 0x07 | LEAST SENSITIVE + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_wakeup_set_sensitivity(uint8_t sensitivity, struct bma4_dev *dev); + +/*! + * @brief This API gets the sensitivity of wake up feature in the sensor + * + * @param[out] sensitivity : Pointer variable which stores the sensitivity + * value read from the sensor. + * Value | Sensitivity + * --------|------------------------- + * 0x00 | MOST SENSITIVE + * 0x07 | LEAST SENSITIVE + * @param[in] dev : Structure instance of bma4_dev + * + * @return Result of API execution status + * @retval 0 -> Success + * @retval Any non zero value -> Fail + */ +uint16_t bma423_wakeup_get_sensitivity(uint8_t *sensitivity, struct bma4_dev *dev); + +/*! + * @brief This API is used to select single/double tap + * feature in the sensor + * + * @param tap_select : Variable used to specify the single or + * double tap selection in the sensor + * tap_select | description + * ------------|------------------------ + * 0x00 | Double tap selected + * 0x01 | single tap selected + * + * @param dev : Structure instance of bma4_dev + * + * @return results of stream_transfer operation + * @retval 0 -> Success + * @retval Any positive value mentioned in ERROR CODES -> Fail + * + */ +uint16_t bma423_tap_selection(const uint8_t tap_select, struct bma4_dev *dev); + +#ifdef __cplusplus +} +#endif /*End of CPP guard */ + +#endif /*End of header guard macro */ diff --git a/src/bma4_defs.h b/src/bma4_defs.h index 2c4295b..0b4e499 100644 --- a/src/bma4_defs.h +++ b/src/bma4_defs.h @@ -1,963 +1,963 @@ -/* -* -**************************************************************************** -* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH -* -* File : bma4_defs.h -* -* Date: 12 Oct 2017 -* -* Revision: 2.1.9 $ -* -* Usage: Sensor Driver for BMA4 family of sensors -* -**************************************************************************** -* -* Disclaimer -* -* Common: -* Bosch Sensortec products are developed for the consumer goods industry. -* They may only be used within the parameters of the respective valid -* product data sheet. Bosch Sensortec products are provided with the -* express understanding that there is no warranty of fitness for a -* particular purpose.They are not fit for use in life-sustaining, -* safety or security sensitive systems or any system or device -* that may lead to bodily harm or property damage if the system -* or device malfunctions. In addition,Bosch Sensortec products are -* not fit for use in products which interact with motor vehicle systems. -* The resale and or use of products are at the purchasers own risk and -* his own responsibility. The examination of fitness for the intended use -* is the sole responsibility of the Purchaser. -* -* The purchaser shall indemnify Bosch Sensortec from all third party -* claims, including any claims for incidental, or consequential damages, -* arising from any product use not covered by the parameters of -* the respective valid product data sheet or not approved by -* Bosch Sensortec and reimburse Bosch Sensortec for all costs in -* connection with such claims. -* -* The purchaser must monitor the market for the purchased products, -* particularly with regard to product safety and inform Bosch Sensortec -* without delay of all security relevant incidents. -* -* Engineering Samples are marked with an asterisk (*) or (e). -* Samples may vary from the valid technical specifications of the product -* series. They are therefore not intended or fit for resale to third -* parties or for use in end products. Their sole purpose is internal -* client testing. The testing of an engineering sample may in no way -* replace the testing of a product series. Bosch Sensortec assumes -* no liability for the use of engineering samples. -* By accepting the engineering samples, the Purchaser agrees to indemnify -* Bosch Sensortec from all claims arising from the use of engineering -* samples. -* -* Special: -* This software module (hereinafter called "Software") and any information -* on application-sheets (hereinafter called "Information") is provided -* free of charge for the sole purpose to support your application work. -* The Software and Information is subject to the following -* terms and conditions: -* -* The Software is specifically designed for the exclusive use for -* Bosch Sensortec products by personnel who have special experience -* and training. Do not use this Software if you do not have the -* proper experience or training. -* -* This Software package is provided `` as is `` and without any expressed -* or implied warranties,including without limitation, the implied warranties -* of merchantability and fitness for a particular purpose. -* -* Bosch Sensortec and their representatives and agents deny any liability -* for the functional impairment -* of this Software in terms of fitness, performance and safety. -* Bosch Sensortec and their representatives and agents shall not be liable -* for any direct or indirect damages or injury, except as -* otherwise stipulated in mandatory applicable law. -* -* The Information provided is believed to be accurate and reliable. -* Bosch Sensortec assumes no responsibility for the consequences of use -* of such Information nor for any infringement of patents or -* other rights of third parties which may result from its use. -* No license is granted by implication or otherwise under any patent or -* patent rights of Bosch. Specifications mentioned in the Information are -* subject to change without notice. -**************************************************************************/ -/*! \file bma4_defs.h - \brief Sensor Driver for BMA4 family of sensors */ -#ifndef BMA4_DEFS_H__ -#define BMA4_DEFS_H__ -/*********************************************************************/ -/**\ header files */ -#ifdef __KERNEL__ -#include -#else -#include -#include -#include -#endif - -/*********************************************************************/ -/* macro definitions */ - -/* -#if (LONG_MAX) > 0x7fffffff -#define __have_long64 1 -#elif (LONG_MAX) == 0x7fffffff -#define __have_long32 1 -#endif -*/ - -#if !defined(UINT8_C) -#define INT8_C(x) x -#if (INT_MAX) > 0x7f -#define UINT8_C(x) x -#else -#define UINT8_C(x) x##U -#endif -#endif - -#if !defined(UINT16_C) -#define INT16_C(x) x -#if (INT_MAX) > 0x7fff -#define UINT16_C(x) x -#else -#define UINT16_C(x) x##U -#endif -#endif - -#if !defined(INT32_C) && !defined(UINT32_C) -#if __have_long32 -#define INT32_C(x) x##L -#define UINT32_C(x) x##UL -#else -#define INT32_C(x) x -#define UINT32_C(x) x##U -#endif -#endif - -#if !defined(INT64_C) && !defined(UINT64_C) -#if __have_long64 -#define INT64_C(x) x##L -#define UINT64_C(x) x##UL -#else -#define INT64_C(x) x##LL -#define UINT64_C(x) x##ULL -#endif -#endif - -/**\name CHIP ID ADDRESS*/ -#define BMA4_CHIP_ID_ADDR UINT8_C(0x00) - -/**\name RESET REGISTER */ -#define BMA4_RESET_ADDR UINT8_C(0xB6) -#define BMA4_RESET_SET_MASK UINT8_C(0x7E) -/**\name ERROR STATUS*/ -#define BMA4_ERROR_ADDR UINT8_C(0X02) - -/**\name STATUS REGISTER FOR SENSOR STATUS FLAG*/ -#define BMA4_STATUS_ADDR UINT8_C(0X03) - -/**\name AUX/ACCEL DATA BASE ADDRESS REGISTERS*/ -#define BMA4_DATA_0_ADDR UINT8_C(0X0A) -#define BMA4_DATA_8_ADDR UINT8_C(0X12) - -/**\name SENSOR TIME REGISTERS*/ -#define BMA4_SENSORTIME_0_ADDR UINT8_C(0X18) - -/**\name INTERRUPT/FEATURE STATUS REGISTERS*/ -#define BMA4_INT_STAT_0_ADDR UINT8_C(0X1C) - -/**\name INTERRUPT/FEATURE STATUS REGISTERS*/ -#define BMA4_INT_STAT_1_ADDR UINT8_C(0X1D) - -/**\name TEMPERATURE REGISTERS*/ -#define BMA4_TEMPERATURE_ADDR UINT8_C(0X22) - -/**\name FIFO REGISTERS*/ -#define BMA4_FIFO_LENGTH_0_ADDR UINT8_C(0X24) -#define BMA4_FIFO_DATA_ADDR UINT8_C(0X26) - -/**\name ACCEL CONFIG REGISTERS*/ -#define BMA4_ACCEL_CONFIG_ADDR UINT8_C(0X40) - -/**\name ACCEL RANGE ADDRESS*/ -#define BMA4_ACCEL_RANGE_ADDR UINT8_C(0X41) - -/**\name AUX CONFIG REGISTERS*/ -#define BMA4_AUX_CONFIG_ADDR UINT8_C(0X44) - -/**\name FIFO DOWN SAMPLING REGISTER ADDRESS FOR ACCEL*/ -#define BMA4_FIFO_DOWN_ADDR UINT8_C(0X45) - -/**\name FIFO WATERMARK REGISTER ADDRESS*/ -#define BMA4_FIFO_WTM_0_ADDR UINT8_C(0X46) - -/**\name FIFO CONFIG REGISTERS*/ -#define BMA4_FIFO_CONFIG_0_ADDR UINT8_C(0X48) -#define BMA4_FIFO_CONFIG_1_ADDR UINT8_C(0X49) - -/**\name MAG INTERFACE REGISTERS*/ -#define BMA4_AUX_DEV_ID_ADDR UINT8_C(0X4B) -#define BMA4_AUX_IF_CONF_ADDR UINT8_C(0X4C) -#define BMA4_AUX_RD_ADDR UINT8_C(0X4D) -#define BMA4_AUX_WR_ADDR UINT8_C(0X4E) -#define BMA4_AUX_WR_DATA_ADDR UINT8_C(0X4F) - -/**\name INTERRUPT ENABLE REGISTERS*/ -#define BMA4_INT1_IO_CTRL_ADDR UINT8_C(0X53) -#define BMA4_INT2_IO_CTRL_ADDR UINT8_C(0X54) - -/**\name LATCH DURATION REGISTERS*/ -#define BMA4_INTR_LATCH_ADDR UINT8_C(0X55) - -/**\name MAP INTERRUPT 1 and 2 REGISTERS*/ -#define BMA4_INT_MAP_1_ADDR UINT8_C(0X56) -#define BMA4_INT_MAP_2_ADDR UINT8_C(0X57) -#define BMA4_INT_MAP_DATA_ADDR UINT8_C(0x58) -#define BMA4_INIT_CTRL_ADDR UINT8_C(0x59) - -/**\name FEATURE CONFIG RELATED */ -#define BMA4_RESERVED_REG_5B_ADDR UINT8_C(0x5B) -#define BMA4_RESERVED_REG_5C_ADDR UINT8_C(0x5C) -#define BMA4_FEATURE_CONFIG_ADDR UINT8_C(0x5E) -#define BMA4_INTERNAL_ERROR UINT8_C(0x5F) - -/**\name SERIAL INTERFACE SETTINGS REGISTER*/ -#define BMA4_IF_CONFIG_ADDR UINT8_C(0X6B) - -/**\name SELF_TEST REGISTER*/ -#define BMA4_ACC_SELF_TEST_ADDR UINT8_C(0X6D) - -/**\name SPI,I2C SELECTION REGISTER*/ -#define BMA4_NV_CONFIG_ADDR UINT8_C(0x70) - -/**\name ACCEL OFFSET REGISTERS*/ -#define BMA4_OFFSET_0_ADDR UINT8_C(0X71) -#define BMA4_OFFSET_1_ADDR UINT8_C(0X72) -#define BMA4_OFFSET_2_ADDR UINT8_C(0X73) - -/**\name POWER_CTRL REGISTER*/ -#define BMA4_POWER_CONF_ADDR UINT8_C(0x7C) -#define BMA4_POWER_CTRL_ADDR UINT8_C(0x7D) - -/**\name COMMAND REGISTER*/ -#define BMA4_CMD_ADDR UINT8_C(0X7E) - -/**\name GPIO REGISTERS*/ -#define BMA4_STEP_CNT_OUT_0_ADDR UINT8_C(0x1E) -#define BMA4_HIGH_G_OUT_ADDR UINT8_C(0x1F) -#define BMA4_ACTIVITY_OUT_ADDR UINT8_C(0x27) -#define BMA4_ORIENTATION_OUT_ADDR UINT8_C(0x28) -#define BMA4_INTERNAL_STAT UINT8_C(0x2A) - -/*! - * @brief Block size for config write */ -#define BMA4_BLOCK_SIZE UINT8_C(32) - -/**\name I2C slave address */ -#define BMA4_I2C_ADDR_PRIMARY UINT8_C(0x18) -#define BMA4_I2C_ADDR_SECONDARY UINT8_C(0x19) -#define BMA4_I2C_BMM150_ADDR UINT8_C(0x10) - -/**\name Interface selection macro */ -#define BMA4_SPI_INTERFACE UINT8_C(1) -#define BMA4_I2C_INTERFACE UINT8_C(2) - -/**\name Interface selection macro */ -#define BMA4_SPI_WR_MASK UINT8_C(0x7F) -#define BMA4_SPI_RD_MASK UINT8_C(0x80) - -/**\name Chip ID macros */ -#define BMA4_CHIP_ID_MIN UINT8_C(0x10) -#define BMA4_CHIP_ID_MAX UINT8_C(0x15) - -/**\name Auxiliary sensor selection macro */ -#define BMM150_SENSOR UINT8_C(1) -#define AKM9916_SENSOR UINT8_C(2) -#define BMA4_ASIC_INITIALIZED UINT8_C(0x01) - -/**\name Auxiliary sensor chip id macros */ -#define BMM150_CHIP_ID UINT8_C(0x32) - -/**\name Auxiliary sensor other macros */ -#define BMM150_POWER_CONTROL_REG UINT8_C(0x4B) -#define BMM150_POWER_MODE_REG UINT8_C(0x4C) - -/**\name CONSTANTS */ -#define BMA4_FIFO_CONFIG_LENGTH UINT8_C(2) -#define BMA4_ACCEL_CONFIG_LENGTH UINT8_C(2) -#define BMA4_FIFO_WM_LENGTH UINT8_C(2) -#define BMA4_CONFIG_STREAM_SIZE UINT16_C(6144) -#define BMA4_NON_LATCH_MODE UINT8_C(0) -#define BMA4_LATCH_MODE UINT8_C(1) -#define BMA4_OPEN_DRAIN UINT8_C(1) -#define BMA4_PUSH_PULL UINT8_C(0) -#define BMA4_ACTIVE_HIGH UINT8_C(1) -#define BMA4_ACTIVE_LOW UINT8_C(0) -#define BMA4_EDGE_TRIGGER UINT8_C(1) -#define BMA4_LEVEL_TRIGGER UINT8_C(0) -#define BMA4_OUTPUT_ENABLE UINT8_C(1) -#define BMA4_OUTPUT_DISABLE UINT8_C(0) -#define BMA4_INPUT_ENABLE UINT8_C(1) -#define BMA4_INPUT_DISABLE UINT8_C(0) - -/**\name ACCEL RANGE CHECK*/ -#define BMA4_ACCEL_RANGE_2G UINT8_C(0) -#define BMA4_ACCEL_RANGE_4G UINT8_C(1) -#define BMA4_ACCEL_RANGE_8G UINT8_C(2) -#define BMA4_ACCEL_RANGE_16G UINT8_C(3) - -/**\name CONDITION CHECK FOR READING AND WRTING DATA*/ -#define BMA4_MAX_VALUE_FIFO_FILTER UINT8_C(1) -#define BMA4_MAX_VALUE_SPI3 UINT8_C(1) -#define BMA4_MAX_VALUE_SELFTEST_AMP UINT8_C(1) -#define BMA4_MAX_IF_MODE UINT8_C(3) -#define BMA4_MAX_VALUE_SELFTEST_SIGN UINT8_C(1) - -/**\name BUS READ AND WRITE LENGTH FOR MAG & ACCEL*/ -#define BMA4_MAG_TRIM_DATA_SIZE UINT8_C(16) -#define BMA4_MAG_XYZ_DATA_LENGTH UINT8_C(6) -#define BMA4_MAG_XYZR_DATA_LENGTH UINT8_C(8) -#define BMA4_ACCEL_DATA_LENGTH UINT8_C(6) -#define BMA4_FIFO_DATA_LENGTH UINT8_C(2) -#define BMA4_TEMP_DATA_SIZE UINT8_C(1) - -/**\name TEMPERATURE CONSTANT */ -#define BMA4_OFFSET_TEMP UINT8_C(23) -#define BMA4_DEG UINT8_C(1) -#define BMA4_FAHREN UINT8_C(2) -#define BMA4_KELVIN UINT8_C(3) - -/**\name DELAY DEFINITION IN MSEC*/ -#define BMA4_AUX_IF_DELAY UINT8_C(5) -#define BMA4_BMM150_WAKEUP_DELAY1 UINT8_C(2) -#define BMA4_BMM150_WAKEUP_DELAY2 UINT8_C(3) -#define BMA4_BMM150_WAKEUP_DELAY3 UINT8_C(1) -#define BMA4_GEN_READ_WRITE_DELAY UINT8_C(1) -#define BMA4_AUX_COM_DELAY UINT8_C(10) - -/**\name ARRAY PARAMETER DEFINITIONS*/ -#define BMA4_SENSOR_TIME_MSB_BYTE UINT8_C(2) -#define BMA4_SENSOR_TIME_XLSB_BYTE UINT8_C(1) -#define BMA4_SENSOR_TIME_LSB_BYTE UINT8_C(0) -#define BMA4_MAG_X_LSB_BYTE UINT8_C(0) -#define BMA4_MAG_X_MSB_BYTE UINT8_C(1) -#define BMA4_MAG_Y_LSB_BYTE UINT8_C(2) -#define BMA4_MAG_Y_MSB_BYTE UINT8_C(3) -#define BMA4_MAG_Z_LSB_BYTE UINT8_C(4) -#define BMA4_MAG_Z_MSB_BYTE UINT8_C(5) -#define BMA4_MAG_R_LSB_BYTE UINT8_C(6) -#define BMA4_MAG_R_MSB_BYTE UINT8_C(7) -#define BMA4_TEMP_BYTE UINT8_C(0) -#define BMA4_FIFO_LENGTH_MSB_BYTE UINT8_C(1) - -/**\name ERROR CODES */ -#define BMA4_OK UINT16_C(0) -#define BMA4_E_NULL_PTR UINT16_C(1) -#define BMA4_E_OUT_OF_RANGE UINT16_C(1 << 1) -#define BMA4_E_INVALID_SENSOR UINT16_C(1 << 2) -#define BMA4_E_CONFIG_STREAM_ERROR UINT16_C(1 << 3) -#define BMA4_E_SELF_TEST_FAIL UINT16_C(1 << 4) -#define BMA4_E_FOC_FAIL UINT16_C(1 << 5) -#define BMA4_E_FAIL UINT16_C(1 << 6) -#define BMA4_E_INT_LINE_INVALID UINT16_C(1 << 7) -#define BMA4_E_RD_WR_LENGTH_INVALID UINT16_C(1 << 8) -#define BMA4_E_AUX_CONFIG_FAIL UINT16_C(1 << 9) -#define BMA4_E_SC_FIFO_HEADER_ERR UINT16_C(1 << 10) -#define BMA4_E_SC_FIFO_CONFIG_ERR UINT16_C(1 << 11) - -/**\name UTILITY MACROS */ -#define BMA4_SET_LOW_BYTE UINT16_C(0x00FF) -#define BMA4_SET_HIGH_BYTE UINT16_C(0xFF00) -#define BMA4_SET_LOW_NIBBLE UINT8_C(0x0F) - -/**\name FOC RELATED MACROS */ -#define BMA4_ACCEL_CONFIG_FOC UINT8_C(0xB7) - -/* Macros used for Self test */ -/* Self-test: Resulting minimum difference signal in mg for BMA42x */ -#define BMA42X_ST_ACC_X_AXIS_SIGNAL_DIFF UINT16_C(400) -#define BMA42X_ST_ACC_Y_AXIS_SIGNAL_DIFF UINT16_C(800) -#define BMA42X_ST_ACC_Z_AXIS_SIGNAL_DIFF UINT16_C(400) - -/* Self-test: Resulting minimum difference signal in mg for BMA45x */ -#define BMA45X_ST_ACC_X_AXIS_SIGNAL_DIFF UINT16_C(1800) -#define BMA45X_ST_ACC_Y_AXIS_SIGNAL_DIFF UINT16_C(1800) -#define BMA45X_ST_ACC_Z_AXIS_SIGNAL_DIFF UINT16_C(1800) - -/**\name BOOLEAN TYPES*/ -#ifndef TRUE -#define TRUE UINT8_C(0x01) -#endif - -#ifndef FALSE -#define FALSE UINT8_C(0x00) -#endif - -#ifndef NULL -#define NULL UINT8_C(0x00) -#endif - -/**\name ERROR STATUS POSITION AND MASK*/ -#define BMA4_FATAL_ERR_MSK UINT8_C(0x01) -#define BMA4_CMD_ERR_POS UINT8_C(1) -#define BMA4_CMD_ERR_MSK UINT8_C(0x02) -#define BMA4_ERR_CODE_POS UINT8_C(2) -#define BMA4_ERR_CODE_MSK UINT8_C(0x1C) -#define BMA4_FIFO_ERR_POS UINT8_C(6) -#define BMA4_FIFO_ERR_MSK UINT8_C(0x40) -#define BMA4_AUX_ERR_POS UINT8_C(7) -#define BMA4_AUX_ERR_MSK UINT8_C(0x80) - -/**\name Maximum number of bytes to be read from the sensor */ -#define BMA4_MAX_BUFFER_SIZE UINT8_C(81) - -/**\name NV_CONFIG POSITION AND MASK*/ -/* NV_CONF Description - Reg Addr --> (0x70), Bit --> 3 */ -#define BMA4_NV_ACCEL_OFFSET_POS UINT8_C(3) -#define BMA4_NV_ACCEL_OFFSET_MSK UINT8_C(0x08) - -/**\name MAG DATA XYZ POSITION AND MASK*/ -#define BMA4_DATA_MAG_X_LSB_POS UINT8_C(3) -#define BMA4_DATA_MAG_X_LSB_MSK UINT8_C(0xF8) -#define BMA4_DATA_MAG_Y_LSB_POS UINT8_C(3) -#define BMA4_DATA_MAG_Y_LSB_MSK UINT8_C(0xF8) -#define BMA4_DATA_MAG_Z_LSB_POS UINT8_C(1) -#define BMA4_DATA_MAG_Z_LSB_MSK UINT8_C(0xFE) -#define BMA4_DATA_MAG_R_LSB_POS UINT8_C(2) -#define BMA4_DATA_MAG_R_LSB_MSK UINT8_C(0xFC) - -/**\name ACCEL DATA READY POSITION AND MASK*/ -#define BMA4_STAT_DATA_RDY_ACCEL_POS UINT8_C(7) -#define BMA4_STAT_DATA_RDY_ACCEL_MSK UINT8_C(0x80) - -/**\name MAG DATA READY POSITION AND MASK*/ -#define BMA4_STAT_DATA_RDY_MAG_POS UINT8_C(5) -#define BMA4_STAT_DATA_RDY_MAG_MSK UINT8_C(0x20) - -/**\name ADVANCE POWER SAVE POSITION AND MASK*/ -#define BMA4_ADVANCE_POWER_SAVE_MSK UINT8_C(0x01) - -/**\name ACCELEROMETER ENABLE POSITION AND MASK*/ -#define BMA4_ACCEL_ENABLE_POS UINT8_C(2) -#define BMA4_ACCEL_ENABLE_MSK UINT8_C(0x04) - -/**\name MAGNETOMETER ENABLE POSITION AND MASK*/ -#define BMA4_MAG_ENABLE_MSK UINT8_C(0x01) - -/**\name ACCEL CONFIGURATION POSITION AND MASK*/ -#define BMA4_ACCEL_ODR_MSK UINT8_C(0x0F) -#define BMA4_ACCEL_BW_POS UINT8_C(4) -#define BMA4_ACCEL_BW_MSK UINT8_C(0x70) -#define BMA4_ACCEL_RANGE_MSK UINT8_C(0x03) -#define BMA4_ACCEL_PERFMODE_POS UINT8_C(7) -#define BMA4_ACCEL_PERFMODE_MSK UINT8_C(0x80) - -/**\name MAG CONFIGURATION POSITION AND MASK*/ -#define BMA4_MAG_CONFIG_OFFSET_POS UINT8_C(4) -#define BMA4_MAG_CONFIG_OFFSET_LEN UINT8_C(4) -#define BMA4_MAG_CONFIG_OFFSET_MSK UINT8_C(0xF0) -#define BMA4_MAG_CONFIG_OFFSET_REG (BMA4_AUX_CONFIG_ADDR) - -/**\name FIFO SELF WAKE UP POSITION AND MASK*/ -#define BMA4_FIFO_SELF_WAKE_UP_POS UINT8_C(1) -#define BMA4_FIFO_SELF_WAKE_UP_MSK UINT8_C(0x02) - -/**\name FIFO BYTE COUNTER POSITION AND MASK*/ -#define BMA4_FIFO_BYTE_COUNTER_MSB_MSK UINT8_C(0x3F) - -/**\name FIFO DATA POSITION AND MASK*/ -#define BMA4_FIFO_DATA_POS UINT8_C(0) -#define BMA4_FIFO_DATA_MSK UINT8_C(0xFF) - -/**\name FIFO FILTER FOR ACCEL POSITION AND MASK*/ -#define BMA4_FIFO_DOWN_ACCEL_POS UINT8_C(4) -#define BMA4_FIFO_DOWN_ACCEL_MSK UINT8_C(0x70) -#define BMA4_FIFO_FILTER_ACCEL_POS UINT8_C(7) -#define BMA4_FIFO_FILTER_ACCEL_MSK UINT8_C(0x80) - -/**\name FIFO HEADER DATA DEFINITIONS */ -#define FIFO_HEAD_A UINT8_C(0x84) -#define FIFO_HEAD_M UINT8_C(0x90) -#define FIFO_HEAD_M_A UINT8_C(0x94) -#define FIFO_HEAD_SENSOR_TIME UINT8_C(0x44) -#define FIFO_HEAD_INPUT_CONFIG UINT8_C(0x48) -#define FIFO_HEAD_SKIP_FRAME UINT8_C(0x40) -#define FIFO_HEAD_OVER_READ_MSB UINT8_C(0x80) -#define FIFO_HEAD_SAMPLE_DROP UINT8_C(0x50) - -/**\name FIFO HEADERLESS MODE DATA ENABLE DEFINITIONS */ -#define BMA4_FIFO_M_A_ENABLE UINT8_C(0x60) -#define BMA4_FIFO_A_ENABLE UINT8_C(0x40) -#define BMA4_FIFO_M_ENABLE UINT8_C(0x20) - -/**\name FIFO CONFIGURATION SELECTION */ -#define BMA4_FIFO_STOP_ON_FULL UINT8_C(0x01) -#define BMA4_FIFO_TIME UINT8_C(0x02) -#define BMA4_FIFO_TAG_INTR2 UINT8_C(0x04) -#define BMA4_FIFO_TAG_INTR1 UINT8_C(0x08) -#define BMA4_FIFO_HEADER UINT8_C(0x10) -#define BMA4_FIFO_MAG UINT8_C(0x20) -#define BMA4_FIFO_ACCEL UINT8_C(0x40) -#define BMA4_FIFO_ALL UINT8_C(0x7F) -#define BMA4_FIFO_CONFIG_0_MASK UINT8_C(0x03) -#define BMA4_FIFO_CONFIG_1_MASK UINT8_C(0xFC) - -/**\name FIFO FRAME COUNT DEFINITION */ -#define FIFO_LSB_CONFIG_CHECK UINT8_C(0x00) -#define FIFO_MSB_CONFIG_CHECK UINT8_C(0x80) -#define BMA4_FIFO_TAG_INTR_MASK UINT8_C(0xFC) - -/**\name FIFO DROPPED FRAME DEFINITION */ -#define AUX_FIFO_DROP UINT8_C(0x04) -#define ACCEL_AUX_FIFO_DROP UINT8_C(0x05) -#define ACCEL_FIFO_DROP UINT8_C(0x01) - -/**\name FIFO MAG DEFINITION*/ -#define BMA4_MA_FIFO_A_X_LSB UINT8_C(8) - -/**\name FIFO sensor time length definitions*/ -#define BMA4_SENSOR_TIME_LENGTH UINT8_C(3) - -/**\name FIFO LENGTH DEFINITION*/ -#define BMA4_FIFO_A_LENGTH UINT8_C(6) -#define BMA4_FIFO_M_LENGTH UINT8_C(8) -#define BMA4_FIFO_MA_LENGTH UINT8_C(14) - -/**\name MAG I2C ADDRESS SELECTION POSITION AND MASK*/ -#define BMA4_I2C_DEVICE_ADDR_POS UINT8_C(1) -#define BMA4_I2C_DEVICE_ADDR_MSK UINT8_C(0xFE) - -/**\name MAG CONFIGURATION FOR SECONDARY INTERFACE POSITION AND MASK*/ -#define BMA4_MAG_BURST_MSK UINT8_C(0x03) -#define BMA4_MAG_MANUAL_ENABLE_POS UINT8_C(7) -#define BMA4_MAG_MANUAL_ENABLE_MSK UINT8_C(0x80) -#define BMA4_READ_ADDR_MSK UINT8_C(0xFF) -#define BMA4_WRITE_ADDR_MSK UINT8_C(0xFF) -#define BMA4_WRITE_DATA_MSK UINT8_C(0xFF) - -/**\name OUTPUT TYPE ENABLE POSITION AND MASK*/ -#define BMA4_INT_EDGE_CTRL_MASK UINT8_C(0x01) -#define BMA4_INT_EDGE_CTRL_POS UINT8_C(0x00) -#define BMA4_INT_LEVEL_MASK UINT8_C(0x02) -#define BMA4_INT_LEVEL_POS UINT8_C(0x01) -#define BMA4_INT_OPEN_DRAIN_MASK UINT8_C(0x04) -#define BMA4_INT_OPEN_DRAIN_POS UINT8_C(0x02) -#define BMA4_INT_OUTPUT_EN_MASK UINT8_C(0x08) -#define BMA4_INT_OUTPUT_EN_POS UINT8_C(0x03) -#define BMA4_INT_INPUT_EN_MASK UINT8_C(0x10) -#define BMA4_INT_INPUT_EN_POS UINT8_C(0x04) - -/**\name IF CONFIG POSITION AND MASK*/ -#define BMA4_CONFIG_SPI3_MSK UINT8_C(0x01) -#define BMA4_IF_CONFIG_IF_MODE_POS UINT8_C(4) -#define BMA4_IF_CONFIG_IF_MODE_MSK UINT8_C(0x10) - -/**\name ACCEL SELF TEST POSITION AND MASK*/ -#define BMA4_ACCEL_SELFTEST_ENABLE_MSK UINT8_C(0x01) -#define BMA4_ACCEL_SELFTEST_SIGN_POS UINT8_C(2) -#define BMA4_ACCEL_SELFTEST_SIGN_MSK UINT8_C(0x04) -#define BMA4_SELFTEST_AMP_POS UINT8_C(3) -#define BMA4_SELFTEST_AMP_MSK UINT8_C(0x08) - -/**\name ACCEL ODR */ -#define BMA4_OUTPUT_DATA_RATE_0_78HZ UINT8_C(0x01) -#define BMA4_OUTPUT_DATA_RATE_1_56HZ UINT8_C(0x02) -#define BMA4_OUTPUT_DATA_RATE_3_12HZ UINT8_C(0x03) -#define BMA4_OUTPUT_DATA_RATE_6_25HZ UINT8_C(0x04) -#define BMA4_OUTPUT_DATA_RATE_12_5HZ UINT8_C(0x05) -#define BMA4_OUTPUT_DATA_RATE_25HZ UINT8_C(0x06) -#define BMA4_OUTPUT_DATA_RATE_50HZ UINT8_C(0x07) -#define BMA4_OUTPUT_DATA_RATE_100HZ UINT8_C(0x08) -#define BMA4_OUTPUT_DATA_RATE_200HZ UINT8_C(0x09) -#define BMA4_OUTPUT_DATA_RATE_400HZ UINT8_C(0x0A) -#define BMA4_OUTPUT_DATA_RATE_800HZ UINT8_C(0x0B) -#define BMA4_OUTPUT_DATA_RATE_1600HZ UINT8_C(0x0C) - -/**\name ACCEL BANDWIDTH PARAMETER */ -#define BMA4_ACCEL_OSR4_AVG1 UINT8_C(0) -#define BMA4_ACCEL_OSR2_AVG2 UINT8_C(1) -#define BMA4_ACCEL_NORMAL_AVG4 UINT8_C(2) -#define BMA4_ACCEL_CIC_AVG8 UINT8_C(3) -#define BMA4_ACCEL_RES_AVG16 UINT8_C(4) -#define BMA4_ACCEL_RES_AVG32 UINT8_C(5) -#define BMA4_ACCEL_RES_AVG64 UINT8_C(6) -#define BMA4_ACCEL_RES_AVG128 UINT8_C(7) - -/**\name ACCEL PERFMODE PARAMETER */ -#define BMA4_CIC_AVG_MODE UINT8_C(0) -#define BMA4_CONTINUOUS_MODE UINT8_C(1) - -/**\name MAG OFFSET */ -#define BMA4_MAG_OFFSET_MAX UINT8_C(0x00) - -/**\name ENABLE/DISABLE SELECTIONS */ -#define BMA4_X_AXIS UINT8_C(0) -#define BMA4_Y_AXIS UINT8_C(1) -#define BMA4_Z_AXIS UINT8_C(2) - -/**\name SELF TEST*/ -#define BMA4_SELFTEST_PASS UINT8_C(0) -#define BMA4_SELFTEST_FAIL UINT8_C(1) - -/**\name INTERRUPT MAPS */ -#define BMA4_INTR1_MAP UINT8_C(0) -#define BMA4_INTR2_MAP UINT8_C(1) - -/**\name INTERRUPT MASKS */ -#define BMA4_FIFO_FULL_INT UINT16_C(0x0100) -#define BMA4_FIFO_WM_INT UINT16_C(0x0200) -#define BMA4_DATA_RDY_INT UINT16_C(0x0400) -#define BMA4_MAG_DATA_RDY_INT UINT16_C(0x2000) -#define BMA4_ACCEL_DATA_RDY_INT UINT16_C(0x8000) - - -/**\name AKM POWER MODE SELECTION */ -#define AKM_POWER_DOWN_MODE UINT8_C(0) -#define AKM_SINGLE_MEAS_MODE UINT8_C(1) - -/**\name SECONDARY_MAG POWER MODE SELECTION */ -#define BMA4_MAG_FORCE_MODE UINT8_C(0) -#define BMA4_MAG_SUSPEND_MODE UINT8_C(1) - -/**\name MAG POWER MODE SELECTION */ -#define FORCE_MODE UINT8_C(0) -#define SUSPEND_MODE UINT8_C(1) - -/**\name ACCEL POWER MODE */ -#define ACCEL_MODE_NORMAL UINT8_C(0x11) - -/**\name MAG POWER MODE */ -#define MAG_MODE_SUSPEND UINT8_C(0x18) - -/**\name ENABLE/DISABLE BIT VALUES */ -#define BMA4_ENABLE UINT8_C(0x01) -#define BMA4_DISABLE UINT8_C(0x00) - -/**\name DEFINITION USED FOR DIFFERENT WRITE */ -#define BMA4_MANUAL_DISABLE UINT8_C(0x00) -#define BMA4_MANUAL_ENABLE UINT8_C(0x01) -#define BMA4_ENABLE_MAG_IF_MODE UINT8_C(0x01) -#define BMA4_MAG_DATA_READ_REG UINT8_C(0x0A) -#define BMA4_BMM_POWER_MODE_REG UINT8_C(0x06) -#define BMA4_SEC_IF_NULL UINT8_C(0) -#define BMA4_SEC_IF_BMM150 UINT8_C(1) -#define BMA4_SEC_IF_AKM09916 UINT8_C(2) -#define BMA4_ENABLE_AUX_IF_MODE UINT8_C(0x01) - -/**\name SENSOR RESOLUTION */ -#define BMA4_12_BIT_RESOLUTION UINT8_C(12) -#define BMA4_14_BIT_RESOLUTION UINT8_C(14) -#define BMA4_16_BIT_RESOLUTION UINT8_C(16) - -/**\name MULTIPLIER */ -/*! for handling micro-g values */ -#define BMA4XY_MULTIPLIER UINT32_C(1000000) -/*! for handling float temperature values */ -#define BMA4_SCALE_TEMP INT32_C(1000) -/* BMA4_FAHREN_SCALED = 1.8 * 1000 */ -#define BMA4_FAHREN_SCALED INT32_C(1800) -/* BMA4_KELVIN_SCALED = 273.15 * 1000 */ -#define BMA4_KELVIN_SCALED INT32_C(273150) - - -/**\name MAP BURST READ LENGTHS */ -#define BMA4_AUX_READ_LEN_0 0 -#define BMA4_AUX_READ_LEN_1 1 -#define BMA4_AUX_READ_LEN_2 2 -#define BMA4_AUX_READ_LEN_3 3 - -#ifndef ABS -#define ABS(a) ((a) > 0 ? (a) : -(a)) /*!< Absolute value */ -#endif - -/**\name BIT SLICE GET AND SET FUNCTIONS */ -#define BMA4_GET_BITSLICE(regvar, bitname)\ - ((regvar & bitname##_MSK) >> bitname##_POS) -#define BMA4_SET_BITSLICE(regvar, bitname, val)\ - ((regvar & ~bitname##_MSK) | \ - ((val<> 8) - -#define BMA4_SET_BIT_VAL_0(reg_data, bitname) (reg_data & ~(bitname##_MSK)) - -#define BMA4_SET_BITS_POS_0(reg_data, bitname, data) \ - ((reg_data & ~(bitname##_MSK)) | \ - (data & bitname##_MSK)) - -#define BMA4_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK)) - -/**\name TYPEDEF DEFINITIONS */ -/*! - * @brief Bus communication function pointer which should be mapped to - * the platform specific read and write functions of the user - */ -typedef uint16_t (*bma4_com_fptr_t)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *read_data, uint16_t len); - -/*! delay function pointer */ -typedef void (*bma4_delay_fptr_t)(uint32_t); - -/******************************************************************************/ -/*! @name Enum Declarations */ -/******************************************************************************/ - -/*! @name Enum to define BMA4 variants */ -enum bma4_variant { - BMA42X_VARIANT = 1, - BMA45X_VARIANT -}; - -/**\name STRUCTURE DEFINITIONS*/ - -/*! - * @brief - * This structure holds asic info. for feature configuration. - */ -struct bma4_asic_data { - /* Feature config start addr (0-3 bits)*/ - uint8_t asic_lsb; - /* Feature config start addr (4-11 bits)*/ - uint8_t asic_msb; -}; - -/*! - * @brief Auxiliary configuration structure for user settings - */ -struct bma4_aux_config { - /*! Device address of auxiliary sensor */ - uint8_t aux_dev_addr; - /*! To enable manual or auto mode */ - uint8_t manual_enable; - /*! No of bytes to be read at a time */ - uint8_t burst_read_length; - /*! Variable to set the auxiliary interface */ - uint8_t if_mode; -}; - -/*! - * @brief - * This structure holds all relevant information about BMA4 - */ -struct bma4_dev { - /*! Chip id of BMA4 */ - uint8_t chip_id; - /*! Chip id of auxiliary sensor */ - uint8_t aux_chip_id; - /*! Device address of BMA4 */ - uint8_t dev_addr; - /*! Interface detail */ - uint8_t interface; - /*! Auxiliary sensor information */ - uint8_t aux_sensor; - /*! Decide SPI or I2C read mechanism */ - uint8_t dummy_byte; - /*! Resolution for FOC */ - uint8_t resolution; - /*! Define the BMA4 variant BMA42X or BMA45X */ - enum bma4_variant variant; - /* ! Used to check mag manual/auto mode status - int8_t mag_manual_enable;*/ - /*! FIFO related configurations */ - struct bma4_fifo_frame *fifo; - /*! Config stream data buffer address will be assigned*/ - const uint8_t *config_file_ptr; - /*! Max read/write length (maximum supported length is 32). - To be set by the user */ - uint8_t read_write_len; - /*! Feature len */ - uint8_t feature_len; - /*! Contains asic information */ - struct bma4_asic_data asic_data; - /*! Contains aux configuration settings */ - struct bma4_aux_config aux_config; - /*! Bus read function pointer */ - bma4_com_fptr_t bus_read; - /*! Bus write function pointer */ - bma4_com_fptr_t bus_write; - /*! delay(in ms) function pointer */ - bma4_delay_fptr_t delay; -}; - -/*! - * @brief This structure holds the information for usage of - * FIFO by the user. - */ -struct bma4_fifo_frame { - /*! Data buffer of user defined length is to be mapped here */ - uint8_t *data; - /*! Number of bytes of FIFO to be read as specified by the user */ - uint16_t length; - /*! Enabling of the FIFO header to stream in header mode */ - uint8_t fifo_header_enable; - /*! Streaming of the Accelerometer, Auxiliary - * sensor data or both in FIFO */ - uint8_t fifo_data_enable; - /*! Will be equal to length when no more frames are there to parse */ - uint16_t accel_byte_start_idx; - /*! Will be equal to length when no more frames are there to parse */ - uint16_t mag_byte_start_idx; - /*! Will be equal to length when no more frames are there to parse */ - uint16_t sc_frame_byte_start_idx; - /*! Value of FIFO sensor time time */ - uint32_t sensor_time; - /*! Value of Skipped frame counts */ - uint8_t skipped_frame_count; - /*! Value of accel dropped frame count */ - uint8_t accel_dropped_frame_count; - /*! Value of mag dropped frame count */ - uint8_t mag_dropped_frame_count; -}; - -/*! - * @brief Error Status structure - */ -struct bma4_err_reg { - /*! Indicates fatal error */ - uint8_t fatal_err; - /*! Indicates command error */ - uint8_t cmd_err; - /*! Indicates error code */ - uint8_t err_code; - /*! Indicates fifo error */ - uint8_t fifo_err; - /*! Indicates mag error */ - uint8_t aux_err; -}; - -/*! - * @brief Asic Status structure - */ -struct bma4_asic_status { - /*! Asic is in sleep/halt state */ - uint8_t sleep; - /*! Dedicated interrupt is set again before previous interrupt - was acknowledged */ - uint8_t irq_ovrn; - /*! Watchcell event detected (asic stopped) */ - uint8_t wc_event; - /*! Stream transfer has started and transactions are ongoing */ - uint8_t stream_transfer_active; -}; - -/*! - * @brief Interrupt Pin Configuration structure - */ -struct bma4_int_pin_config { - /*! Trigger condition of interrupt pin */ - uint8_t edge_ctrl; - /*! Level of interrupt pin */ - uint8_t lvl; - /*! Behaviour of interrupt pin to open drain */ - uint8_t od; - /*! Output enable for interrupt pin */ - uint8_t output_en; - /*! Input enable for interrupt pin */ - uint8_t input_en; -}; - -/*! -* @brief Accelerometer configuration structure */ -struct bma4_accel_config { - /*! Output data rate in Hz */ - uint8_t odr; - /*! Bandwidth parameter, determines filter configuration */ - uint8_t bandwidth; - /*! Filter performance mode */ - uint8_t perf_mode; - /*! G-range */ - uint8_t range; -}; - -/*! - * @brief Auxiliary magnetometer configuration structure - */ -struct bma4_aux_mag_config { - /*! Poll rate for the sensor attached to the Magnetometer interface */ - uint8_t odr; - /*! Trigger-readout offset in units of 2.5 ms. - If set to zero, the offset is maximum, i.e. after readout a trigger - is issued immediately */ - uint8_t offset; -}; - -/*! - * @brief ASIC Config structure - */ -struct bma4_asic_config { - /*! Enable/Disable ASIC Wake Up */ - uint8_t asic_en; - /*! Configure stream_transfer/FIFO mode */ - uint8_t fifo_mode_en; - /*! Mapping of instance RAM1 */ - uint8_t mem_conf_ram1; - /*! Mapping of instance RAM2 */ - uint8_t mem_conf_ram2; - /*! Mapping of instance RAM3 */ - uint8_t mem_conf_ram3; -}; -/*! - * @brief bmm150 or akm09916 - * magnetometer values structure - */ -struct bma4_mag { - /*! BMM150 and AKM09916 X raw data */ - int32_t x; - /*! BMM150 and AKM09916 Y raw data */ - int32_t y; - /*! BMM150 and AKM09916 Z raw data */ - int32_t z; -}; - -/*! - * @brief bmm150 xyz data structure - */ -struct bma4_mag_xyzr { - /*! BMM150 X raw data */ - int16_t x; - /*! BMM150 Y raw data */ - int16_t y; - /*! BMM150 Z raw data */ - int16_t z; - /*! BMM150 R raw data */ - uint16_t r; -}; - -/*! - * @brief Accel xyz data structure - */ -struct bma4_accel { - /*! Accel X data */ - int16_t x; - /*! Accel Y data */ - int16_t y; - /*! Accel Z data */ - int16_t z; -}; - -/*! - * @brief FIFO mag data structure - */ -struct bma4_mag_fifo_data { - /*! The value of mag x LSB data */ - uint8_t mag_x_lsb; - /*! The value of mag x MSB data */ - uint8_t mag_x_msb; - /*! The value of mag y LSB data */ - uint8_t mag_y_lsb; - /*! The value of mag y MSB data */ - uint8_t mag_y_msb; - /*! The value of mag z LSB data */ - uint8_t mag_z_lsb; - /*! The value of mag z MSB data */ - uint8_t mag_z_msb; - /*! The value of mag r for BMM150 Y2 for YAMAHA LSB data */ - uint8_t mag_r_y2_lsb; - /*! The value of mag r for BMM150 Y2 for YAMAHA MSB data */ - uint8_t mag_r_y2_msb; -}; - -#endif -/* End of __BMA4_H__ */ +/* +* +**************************************************************************** +* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH +* +* File : bma4_defs.h +* +* Date: 12 Oct 2017 +* +* Revision: 2.1.9 $ +* +* Usage: Sensor Driver for BMA4 family of sensors +* +**************************************************************************** +* +* Disclaimer +* +* Common: +* Bosch Sensortec products are developed for the consumer goods industry. +* They may only be used within the parameters of the respective valid +* product data sheet. Bosch Sensortec products are provided with the +* express understanding that there is no warranty of fitness for a +* particular purpose.They are not fit for use in life-sustaining, +* safety or security sensitive systems or any system or device +* that may lead to bodily harm or property damage if the system +* or device malfunctions. In addition,Bosch Sensortec products are +* not fit for use in products which interact with motor vehicle systems. +* The resale and or use of products are at the purchasers own risk and +* his own responsibility. The examination of fitness for the intended use +* is the sole responsibility of the Purchaser. +* +* The purchaser shall indemnify Bosch Sensortec from all third party +* claims, including any claims for incidental, or consequential damages, +* arising from any product use not covered by the parameters of +* the respective valid product data sheet or not approved by +* Bosch Sensortec and reimburse Bosch Sensortec for all costs in +* connection with such claims. +* +* The purchaser must monitor the market for the purchased products, +* particularly with regard to product safety and inform Bosch Sensortec +* without delay of all security relevant incidents. +* +* Engineering Samples are marked with an asterisk (*) or (e). +* Samples may vary from the valid technical specifications of the product +* series. They are therefore not intended or fit for resale to third +* parties or for use in end products. Their sole purpose is internal +* client testing. The testing of an engineering sample may in no way +* replace the testing of a product series. Bosch Sensortec assumes +* no liability for the use of engineering samples. +* By accepting the engineering samples, the Purchaser agrees to indemnify +* Bosch Sensortec from all claims arising from the use of engineering +* samples. +* +* Special: +* This software module (hereinafter called "Software") and any information +* on application-sheets (hereinafter called "Information") is provided +* free of charge for the sole purpose to support your application work. +* The Software and Information is subject to the following +* terms and conditions: +* +* The Software is specifically designed for the exclusive use for +* Bosch Sensortec products by personnel who have special experience +* and training. Do not use this Software if you do not have the +* proper experience or training. +* +* This Software package is provided `` as is `` and without any expressed +* or implied warranties,including without limitation, the implied warranties +* of merchantability and fitness for a particular purpose. +* +* Bosch Sensortec and their representatives and agents deny any liability +* for the functional impairment +* of this Software in terms of fitness, performance and safety. +* Bosch Sensortec and their representatives and agents shall not be liable +* for any direct or indirect damages or injury, except as +* otherwise stipulated in mandatory applicable law. +* +* The Information provided is believed to be accurate and reliable. +* Bosch Sensortec assumes no responsibility for the consequences of use +* of such Information nor for any infringement of patents or +* other rights of third parties which may result from its use. +* No license is granted by implication or otherwise under any patent or +* patent rights of Bosch. Specifications mentioned in the Information are +* subject to change without notice. +**************************************************************************/ +/*! \file bma4_defs.h + \brief Sensor Driver for BMA4 family of sensors */ +#ifndef BMA4_DEFS_H__ +#define BMA4_DEFS_H__ +/*********************************************************************/ +/**\ header files */ +#ifdef __KERNEL__ +#include +#else +#include +#include +#include +#endif + +/*********************************************************************/ +/* macro definitions */ + +/* +#if (LONG_MAX) > 0x7fffffff +#define __have_long64 1 +#elif (LONG_MAX) == 0x7fffffff +#define __have_long32 1 +#endif +*/ + +#if !defined(UINT8_C) +#define INT8_C(x) x +#if (INT_MAX) > 0x7f +#define UINT8_C(x) x +#else +#define UINT8_C(x) x##U +#endif +#endif + +#if !defined(UINT16_C) +#define INT16_C(x) x +#if (INT_MAX) > 0x7fff +#define UINT16_C(x) x +#else +#define UINT16_C(x) x##U +#endif +#endif + +#if !defined(INT32_C) && !defined(UINT32_C) +#if __have_long32 +#define INT32_C(x) x##L +#define UINT32_C(x) x##UL +#else +#define INT32_C(x) x +#define UINT32_C(x) x##U +#endif +#endif + +#if !defined(INT64_C) && !defined(UINT64_C) +#if __have_long64 +#define INT64_C(x) x##L +#define UINT64_C(x) x##UL +#else +#define INT64_C(x) x##LL +#define UINT64_C(x) x##ULL +#endif +#endif + +/**\name CHIP ID ADDRESS*/ +#define BMA4_CHIP_ID_ADDR UINT8_C(0x00) + +/**\name RESET REGISTER */ +#define BMA4_RESET_ADDR UINT8_C(0xB6) +#define BMA4_RESET_SET_MASK UINT8_C(0x7E) +/**\name ERROR STATUS*/ +#define BMA4_ERROR_ADDR UINT8_C(0X02) + +/**\name STATUS REGISTER FOR SENSOR STATUS FLAG*/ +#define BMA4_STATUS_ADDR UINT8_C(0X03) + +/**\name AUX/ACCEL DATA BASE ADDRESS REGISTERS*/ +#define BMA4_DATA_0_ADDR UINT8_C(0X0A) +#define BMA4_DATA_8_ADDR UINT8_C(0X12) + +/**\name SENSOR TIME REGISTERS*/ +#define BMA4_SENSORTIME_0_ADDR UINT8_C(0X18) + +/**\name INTERRUPT/FEATURE STATUS REGISTERS*/ +#define BMA4_INT_STAT_0_ADDR UINT8_C(0X1C) + +/**\name INTERRUPT/FEATURE STATUS REGISTERS*/ +#define BMA4_INT_STAT_1_ADDR UINT8_C(0X1D) + +/**\name TEMPERATURE REGISTERS*/ +#define BMA4_TEMPERATURE_ADDR UINT8_C(0X22) + +/**\name FIFO REGISTERS*/ +#define BMA4_FIFO_LENGTH_0_ADDR UINT8_C(0X24) +#define BMA4_FIFO_DATA_ADDR UINT8_C(0X26) + +/**\name ACCEL CONFIG REGISTERS*/ +#define BMA4_ACCEL_CONFIG_ADDR UINT8_C(0X40) + +/**\name ACCEL RANGE ADDRESS*/ +#define BMA4_ACCEL_RANGE_ADDR UINT8_C(0X41) + +/**\name AUX CONFIG REGISTERS*/ +#define BMA4_AUX_CONFIG_ADDR UINT8_C(0X44) + +/**\name FIFO DOWN SAMPLING REGISTER ADDRESS FOR ACCEL*/ +#define BMA4_FIFO_DOWN_ADDR UINT8_C(0X45) + +/**\name FIFO WATERMARK REGISTER ADDRESS*/ +#define BMA4_FIFO_WTM_0_ADDR UINT8_C(0X46) + +/**\name FIFO CONFIG REGISTERS*/ +#define BMA4_FIFO_CONFIG_0_ADDR UINT8_C(0X48) +#define BMA4_FIFO_CONFIG_1_ADDR UINT8_C(0X49) + +/**\name MAG INTERFACE REGISTERS*/ +#define BMA4_AUX_DEV_ID_ADDR UINT8_C(0X4B) +#define BMA4_AUX_IF_CONF_ADDR UINT8_C(0X4C) +#define BMA4_AUX_RD_ADDR UINT8_C(0X4D) +#define BMA4_AUX_WR_ADDR UINT8_C(0X4E) +#define BMA4_AUX_WR_DATA_ADDR UINT8_C(0X4F) + +/**\name INTERRUPT ENABLE REGISTERS*/ +#define BMA4_INT1_IO_CTRL_ADDR UINT8_C(0X53) +#define BMA4_INT2_IO_CTRL_ADDR UINT8_C(0X54) + +/**\name LATCH DURATION REGISTERS*/ +#define BMA4_INTR_LATCH_ADDR UINT8_C(0X55) + +/**\name MAP INTERRUPT 1 and 2 REGISTERS*/ +#define BMA4_INT_MAP_1_ADDR UINT8_C(0X56) +#define BMA4_INT_MAP_2_ADDR UINT8_C(0X57) +#define BMA4_INT_MAP_DATA_ADDR UINT8_C(0x58) +#define BMA4_INIT_CTRL_ADDR UINT8_C(0x59) + +/**\name FEATURE CONFIG RELATED */ +#define BMA4_RESERVED_REG_5B_ADDR UINT8_C(0x5B) +#define BMA4_RESERVED_REG_5C_ADDR UINT8_C(0x5C) +#define BMA4_FEATURE_CONFIG_ADDR UINT8_C(0x5E) +#define BMA4_INTERNAL_ERROR UINT8_C(0x5F) + +/**\name SERIAL INTERFACE SETTINGS REGISTER*/ +#define BMA4_IF_CONFIG_ADDR UINT8_C(0X6B) + +/**\name SELF_TEST REGISTER*/ +#define BMA4_ACC_SELF_TEST_ADDR UINT8_C(0X6D) + +/**\name SPI,I2C SELECTION REGISTER*/ +#define BMA4_NV_CONFIG_ADDR UINT8_C(0x70) + +/**\name ACCEL OFFSET REGISTERS*/ +#define BMA4_OFFSET_0_ADDR UINT8_C(0X71) +#define BMA4_OFFSET_1_ADDR UINT8_C(0X72) +#define BMA4_OFFSET_2_ADDR UINT8_C(0X73) + +/**\name POWER_CTRL REGISTER*/ +#define BMA4_POWER_CONF_ADDR UINT8_C(0x7C) +#define BMA4_POWER_CTRL_ADDR UINT8_C(0x7D) + +/**\name COMMAND REGISTER*/ +#define BMA4_CMD_ADDR UINT8_C(0X7E) + +/**\name GPIO REGISTERS*/ +#define BMA4_STEP_CNT_OUT_0_ADDR UINT8_C(0x1E) +#define BMA4_HIGH_G_OUT_ADDR UINT8_C(0x1F) +#define BMA4_ACTIVITY_OUT_ADDR UINT8_C(0x27) +#define BMA4_ORIENTATION_OUT_ADDR UINT8_C(0x28) +#define BMA4_INTERNAL_STAT UINT8_C(0x2A) + +/*! + * @brief Block size for config write */ +#define BMA4_BLOCK_SIZE UINT8_C(32) + +/**\name I2C slave address */ +#define BMA4_I2C_ADDR_PRIMARY UINT8_C(0x18) +#define BMA4_I2C_ADDR_SECONDARY UINT8_C(0x19) +#define BMA4_I2C_BMM150_ADDR UINT8_C(0x10) + +/**\name Interface selection macro */ +#define BMA4_SPI_INTERFACE UINT8_C(1) +#define BMA4_I2C_INTERFACE UINT8_C(2) + +/**\name Interface selection macro */ +#define BMA4_SPI_WR_MASK UINT8_C(0x7F) +#define BMA4_SPI_RD_MASK UINT8_C(0x80) + +/**\name Chip ID macros */ +#define BMA4_CHIP_ID_MIN UINT8_C(0x10) +#define BMA4_CHIP_ID_MAX UINT8_C(0x15) + +/**\name Auxiliary sensor selection macro */ +#define BMM150_SENSOR UINT8_C(1) +#define AKM9916_SENSOR UINT8_C(2) +#define BMA4_ASIC_INITIALIZED UINT8_C(0x01) + +/**\name Auxiliary sensor chip id macros */ +#define BMM150_CHIP_ID UINT8_C(0x32) + +/**\name Auxiliary sensor other macros */ +#define BMM150_POWER_CONTROL_REG UINT8_C(0x4B) +#define BMM150_POWER_MODE_REG UINT8_C(0x4C) + +/**\name CONSTANTS */ +#define BMA4_FIFO_CONFIG_LENGTH UINT8_C(2) +#define BMA4_ACCEL_CONFIG_LENGTH UINT8_C(2) +#define BMA4_FIFO_WM_LENGTH UINT8_C(2) +#define BMA4_CONFIG_STREAM_SIZE UINT16_C(6144) +#define BMA4_NON_LATCH_MODE UINT8_C(0) +#define BMA4_LATCH_MODE UINT8_C(1) +#define BMA4_OPEN_DRAIN UINT8_C(1) +#define BMA4_PUSH_PULL UINT8_C(0) +#define BMA4_ACTIVE_HIGH UINT8_C(1) +#define BMA4_ACTIVE_LOW UINT8_C(0) +#define BMA4_EDGE_TRIGGER UINT8_C(1) +#define BMA4_LEVEL_TRIGGER UINT8_C(0) +#define BMA4_OUTPUT_ENABLE UINT8_C(1) +#define BMA4_OUTPUT_DISABLE UINT8_C(0) +#define BMA4_INPUT_ENABLE UINT8_C(1) +#define BMA4_INPUT_DISABLE UINT8_C(0) + +/**\name ACCEL RANGE CHECK*/ +#define BMA4_ACCEL_RANGE_2G UINT8_C(0) +#define BMA4_ACCEL_RANGE_4G UINT8_C(1) +#define BMA4_ACCEL_RANGE_8G UINT8_C(2) +#define BMA4_ACCEL_RANGE_16G UINT8_C(3) + +/**\name CONDITION CHECK FOR READING AND WRTING DATA*/ +#define BMA4_MAX_VALUE_FIFO_FILTER UINT8_C(1) +#define BMA4_MAX_VALUE_SPI3 UINT8_C(1) +#define BMA4_MAX_VALUE_SELFTEST_AMP UINT8_C(1) +#define BMA4_MAX_IF_MODE UINT8_C(3) +#define BMA4_MAX_VALUE_SELFTEST_SIGN UINT8_C(1) + +/**\name BUS READ AND WRITE LENGTH FOR MAG & ACCEL*/ +#define BMA4_MAG_TRIM_DATA_SIZE UINT8_C(16) +#define BMA4_MAG_XYZ_DATA_LENGTH UINT8_C(6) +#define BMA4_MAG_XYZR_DATA_LENGTH UINT8_C(8) +#define BMA4_ACCEL_DATA_LENGTH UINT8_C(6) +#define BMA4_FIFO_DATA_LENGTH UINT8_C(2) +#define BMA4_TEMP_DATA_SIZE UINT8_C(1) + +/**\name TEMPERATURE CONSTANT */ +#define BMA4_OFFSET_TEMP UINT8_C(23) +#define BMA4_DEG UINT8_C(1) +#define BMA4_FAHREN UINT8_C(2) +#define BMA4_KELVIN UINT8_C(3) + +/**\name DELAY DEFINITION IN MSEC*/ +#define BMA4_AUX_IF_DELAY UINT8_C(5) +#define BMA4_BMM150_WAKEUP_DELAY1 UINT8_C(2) +#define BMA4_BMM150_WAKEUP_DELAY2 UINT8_C(3) +#define BMA4_BMM150_WAKEUP_DELAY3 UINT8_C(1) +#define BMA4_GEN_READ_WRITE_DELAY UINT8_C(1) +#define BMA4_AUX_COM_DELAY UINT8_C(10) + +/**\name ARRAY PARAMETER DEFINITIONS*/ +#define BMA4_SENSOR_TIME_MSB_BYTE UINT8_C(2) +#define BMA4_SENSOR_TIME_XLSB_BYTE UINT8_C(1) +#define BMA4_SENSOR_TIME_LSB_BYTE UINT8_C(0) +#define BMA4_MAG_X_LSB_BYTE UINT8_C(0) +#define BMA4_MAG_X_MSB_BYTE UINT8_C(1) +#define BMA4_MAG_Y_LSB_BYTE UINT8_C(2) +#define BMA4_MAG_Y_MSB_BYTE UINT8_C(3) +#define BMA4_MAG_Z_LSB_BYTE UINT8_C(4) +#define BMA4_MAG_Z_MSB_BYTE UINT8_C(5) +#define BMA4_MAG_R_LSB_BYTE UINT8_C(6) +#define BMA4_MAG_R_MSB_BYTE UINT8_C(7) +#define BMA4_TEMP_BYTE UINT8_C(0) +#define BMA4_FIFO_LENGTH_MSB_BYTE UINT8_C(1) + +/**\name ERROR CODES */ +#define BMA4_OK UINT16_C(0) +#define BMA4_E_NULL_PTR UINT16_C(1) +#define BMA4_E_OUT_OF_RANGE UINT16_C(1 << 1) +#define BMA4_E_INVALID_SENSOR UINT16_C(1 << 2) +#define BMA4_E_CONFIG_STREAM_ERROR UINT16_C(1 << 3) +#define BMA4_E_SELF_TEST_FAIL UINT16_C(1 << 4) +#define BMA4_E_FOC_FAIL UINT16_C(1 << 5) +#define BMA4_E_FAIL UINT16_C(1 << 6) +#define BMA4_E_INT_LINE_INVALID UINT16_C(1 << 7) +#define BMA4_E_RD_WR_LENGTH_INVALID UINT16_C(1 << 8) +#define BMA4_E_AUX_CONFIG_FAIL UINT16_C(1 << 9) +#define BMA4_E_SC_FIFO_HEADER_ERR UINT16_C(1 << 10) +#define BMA4_E_SC_FIFO_CONFIG_ERR UINT16_C(1 << 11) + +/**\name UTILITY MACROS */ +#define BMA4_SET_LOW_BYTE UINT16_C(0x00FF) +#define BMA4_SET_HIGH_BYTE UINT16_C(0xFF00) +#define BMA4_SET_LOW_NIBBLE UINT8_C(0x0F) + +/**\name FOC RELATED MACROS */ +#define BMA4_ACCEL_CONFIG_FOC UINT8_C(0xB7) + +/* Macros used for Self test */ +/* Self-test: Resulting minimum difference signal in mg for BMA42x */ +#define BMA42X_ST_ACC_X_AXIS_SIGNAL_DIFF UINT16_C(400) +#define BMA42X_ST_ACC_Y_AXIS_SIGNAL_DIFF UINT16_C(800) +#define BMA42X_ST_ACC_Z_AXIS_SIGNAL_DIFF UINT16_C(400) + +/* Self-test: Resulting minimum difference signal in mg for BMA45x */ +#define BMA45X_ST_ACC_X_AXIS_SIGNAL_DIFF UINT16_C(1800) +#define BMA45X_ST_ACC_Y_AXIS_SIGNAL_DIFF UINT16_C(1800) +#define BMA45X_ST_ACC_Z_AXIS_SIGNAL_DIFF UINT16_C(1800) + +/**\name BOOLEAN TYPES*/ +#ifndef TRUE +#define TRUE UINT8_C(0x01) +#endif + +#ifndef FALSE +#define FALSE UINT8_C(0x00) +#endif + +#ifndef NULL +#define NULL UINT8_C(0x00) +#endif + +/**\name ERROR STATUS POSITION AND MASK*/ +#define BMA4_FATAL_ERR_MSK UINT8_C(0x01) +#define BMA4_CMD_ERR_POS UINT8_C(1) +#define BMA4_CMD_ERR_MSK UINT8_C(0x02) +#define BMA4_ERR_CODE_POS UINT8_C(2) +#define BMA4_ERR_CODE_MSK UINT8_C(0x1C) +#define BMA4_FIFO_ERR_POS UINT8_C(6) +#define BMA4_FIFO_ERR_MSK UINT8_C(0x40) +#define BMA4_AUX_ERR_POS UINT8_C(7) +#define BMA4_AUX_ERR_MSK UINT8_C(0x80) + +/**\name Maximum number of bytes to be read from the sensor */ +#define BMA4_MAX_BUFFER_SIZE UINT8_C(81) + +/**\name NV_CONFIG POSITION AND MASK*/ +/* NV_CONF Description - Reg Addr --> (0x70), Bit --> 3 */ +#define BMA4_NV_ACCEL_OFFSET_POS UINT8_C(3) +#define BMA4_NV_ACCEL_OFFSET_MSK UINT8_C(0x08) + +/**\name MAG DATA XYZ POSITION AND MASK*/ +#define BMA4_DATA_MAG_X_LSB_POS UINT8_C(3) +#define BMA4_DATA_MAG_X_LSB_MSK UINT8_C(0xF8) +#define BMA4_DATA_MAG_Y_LSB_POS UINT8_C(3) +#define BMA4_DATA_MAG_Y_LSB_MSK UINT8_C(0xF8) +#define BMA4_DATA_MAG_Z_LSB_POS UINT8_C(1) +#define BMA4_DATA_MAG_Z_LSB_MSK UINT8_C(0xFE) +#define BMA4_DATA_MAG_R_LSB_POS UINT8_C(2) +#define BMA4_DATA_MAG_R_LSB_MSK UINT8_C(0xFC) + +/**\name ACCEL DATA READY POSITION AND MASK*/ +#define BMA4_STAT_DATA_RDY_ACCEL_POS UINT8_C(7) +#define BMA4_STAT_DATA_RDY_ACCEL_MSK UINT8_C(0x80) + +/**\name MAG DATA READY POSITION AND MASK*/ +#define BMA4_STAT_DATA_RDY_MAG_POS UINT8_C(5) +#define BMA4_STAT_DATA_RDY_MAG_MSK UINT8_C(0x20) + +/**\name ADVANCE POWER SAVE POSITION AND MASK*/ +#define BMA4_ADVANCE_POWER_SAVE_MSK UINT8_C(0x01) + +/**\name ACCELEROMETER ENABLE POSITION AND MASK*/ +#define BMA4_ACCEL_ENABLE_POS UINT8_C(2) +#define BMA4_ACCEL_ENABLE_MSK UINT8_C(0x04) + +/**\name MAGNETOMETER ENABLE POSITION AND MASK*/ +#define BMA4_MAG_ENABLE_MSK UINT8_C(0x01) + +/**\name ACCEL CONFIGURATION POSITION AND MASK*/ +#define BMA4_ACCEL_ODR_MSK UINT8_C(0x0F) +#define BMA4_ACCEL_BW_POS UINT8_C(4) +#define BMA4_ACCEL_BW_MSK UINT8_C(0x70) +#define BMA4_ACCEL_RANGE_MSK UINT8_C(0x03) +#define BMA4_ACCEL_PERFMODE_POS UINT8_C(7) +#define BMA4_ACCEL_PERFMODE_MSK UINT8_C(0x80) + +/**\name MAG CONFIGURATION POSITION AND MASK*/ +#define BMA4_MAG_CONFIG_OFFSET_POS UINT8_C(4) +#define BMA4_MAG_CONFIG_OFFSET_LEN UINT8_C(4) +#define BMA4_MAG_CONFIG_OFFSET_MSK UINT8_C(0xF0) +#define BMA4_MAG_CONFIG_OFFSET_REG (BMA4_AUX_CONFIG_ADDR) + +/**\name FIFO SELF WAKE UP POSITION AND MASK*/ +#define BMA4_FIFO_SELF_WAKE_UP_POS UINT8_C(1) +#define BMA4_FIFO_SELF_WAKE_UP_MSK UINT8_C(0x02) + +/**\name FIFO BYTE COUNTER POSITION AND MASK*/ +#define BMA4_FIFO_BYTE_COUNTER_MSB_MSK UINT8_C(0x3F) + +/**\name FIFO DATA POSITION AND MASK*/ +#define BMA4_FIFO_DATA_POS UINT8_C(0) +#define BMA4_FIFO_DATA_MSK UINT8_C(0xFF) + +/**\name FIFO FILTER FOR ACCEL POSITION AND MASK*/ +#define BMA4_FIFO_DOWN_ACCEL_POS UINT8_C(4) +#define BMA4_FIFO_DOWN_ACCEL_MSK UINT8_C(0x70) +#define BMA4_FIFO_FILTER_ACCEL_POS UINT8_C(7) +#define BMA4_FIFO_FILTER_ACCEL_MSK UINT8_C(0x80) + +/**\name FIFO HEADER DATA DEFINITIONS */ +#define FIFO_HEAD_A UINT8_C(0x84) +#define FIFO_HEAD_M UINT8_C(0x90) +#define FIFO_HEAD_M_A UINT8_C(0x94) +#define FIFO_HEAD_SENSOR_TIME UINT8_C(0x44) +#define FIFO_HEAD_INPUT_CONFIG UINT8_C(0x48) +#define FIFO_HEAD_SKIP_FRAME UINT8_C(0x40) +#define FIFO_HEAD_OVER_READ_MSB UINT8_C(0x80) +#define FIFO_HEAD_SAMPLE_DROP UINT8_C(0x50) + +/**\name FIFO HEADERLESS MODE DATA ENABLE DEFINITIONS */ +#define BMA4_FIFO_M_A_ENABLE UINT8_C(0x60) +#define BMA4_FIFO_A_ENABLE UINT8_C(0x40) +#define BMA4_FIFO_M_ENABLE UINT8_C(0x20) + +/**\name FIFO CONFIGURATION SELECTION */ +#define BMA4_FIFO_STOP_ON_FULL UINT8_C(0x01) +#define BMA4_FIFO_TIME UINT8_C(0x02) +#define BMA4_FIFO_TAG_INTR2 UINT8_C(0x04) +#define BMA4_FIFO_TAG_INTR1 UINT8_C(0x08) +#define BMA4_FIFO_HEADER UINT8_C(0x10) +#define BMA4_FIFO_MAG UINT8_C(0x20) +#define BMA4_FIFO_ACCEL UINT8_C(0x40) +#define BMA4_FIFO_ALL UINT8_C(0x7F) +#define BMA4_FIFO_CONFIG_0_MASK UINT8_C(0x03) +#define BMA4_FIFO_CONFIG_1_MASK UINT8_C(0xFC) + +/**\name FIFO FRAME COUNT DEFINITION */ +#define FIFO_LSB_CONFIG_CHECK UINT8_C(0x00) +#define FIFO_MSB_CONFIG_CHECK UINT8_C(0x80) +#define BMA4_FIFO_TAG_INTR_MASK UINT8_C(0xFC) + +/**\name FIFO DROPPED FRAME DEFINITION */ +#define AUX_FIFO_DROP UINT8_C(0x04) +#define ACCEL_AUX_FIFO_DROP UINT8_C(0x05) +#define ACCEL_FIFO_DROP UINT8_C(0x01) + +/**\name FIFO MAG DEFINITION*/ +#define BMA4_MA_FIFO_A_X_LSB UINT8_C(8) + +/**\name FIFO sensor time length definitions*/ +#define BMA4_SENSOR_TIME_LENGTH UINT8_C(3) + +/**\name FIFO LENGTH DEFINITION*/ +#define BMA4_FIFO_A_LENGTH UINT8_C(6) +#define BMA4_FIFO_M_LENGTH UINT8_C(8) +#define BMA4_FIFO_MA_LENGTH UINT8_C(14) + +/**\name MAG I2C ADDRESS SELECTION POSITION AND MASK*/ +#define BMA4_I2C_DEVICE_ADDR_POS UINT8_C(1) +#define BMA4_I2C_DEVICE_ADDR_MSK UINT8_C(0xFE) + +/**\name MAG CONFIGURATION FOR SECONDARY INTERFACE POSITION AND MASK*/ +#define BMA4_MAG_BURST_MSK UINT8_C(0x03) +#define BMA4_MAG_MANUAL_ENABLE_POS UINT8_C(7) +#define BMA4_MAG_MANUAL_ENABLE_MSK UINT8_C(0x80) +#define BMA4_READ_ADDR_MSK UINT8_C(0xFF) +#define BMA4_WRITE_ADDR_MSK UINT8_C(0xFF) +#define BMA4_WRITE_DATA_MSK UINT8_C(0xFF) + +/**\name OUTPUT TYPE ENABLE POSITION AND MASK*/ +#define BMA4_INT_EDGE_CTRL_MASK UINT8_C(0x01) +#define BMA4_INT_EDGE_CTRL_POS UINT8_C(0x00) +#define BMA4_INT_LEVEL_MASK UINT8_C(0x02) +#define BMA4_INT_LEVEL_POS UINT8_C(0x01) +#define BMA4_INT_OPEN_DRAIN_MASK UINT8_C(0x04) +#define BMA4_INT_OPEN_DRAIN_POS UINT8_C(0x02) +#define BMA4_INT_OUTPUT_EN_MASK UINT8_C(0x08) +#define BMA4_INT_OUTPUT_EN_POS UINT8_C(0x03) +#define BMA4_INT_INPUT_EN_MASK UINT8_C(0x10) +#define BMA4_INT_INPUT_EN_POS UINT8_C(0x04) + +/**\name IF CONFIG POSITION AND MASK*/ +#define BMA4_CONFIG_SPI3_MSK UINT8_C(0x01) +#define BMA4_IF_CONFIG_IF_MODE_POS UINT8_C(4) +#define BMA4_IF_CONFIG_IF_MODE_MSK UINT8_C(0x10) + +/**\name ACCEL SELF TEST POSITION AND MASK*/ +#define BMA4_ACCEL_SELFTEST_ENABLE_MSK UINT8_C(0x01) +#define BMA4_ACCEL_SELFTEST_SIGN_POS UINT8_C(2) +#define BMA4_ACCEL_SELFTEST_SIGN_MSK UINT8_C(0x04) +#define BMA4_SELFTEST_AMP_POS UINT8_C(3) +#define BMA4_SELFTEST_AMP_MSK UINT8_C(0x08) + +/**\name ACCEL ODR */ +#define BMA4_OUTPUT_DATA_RATE_0_78HZ UINT8_C(0x01) +#define BMA4_OUTPUT_DATA_RATE_1_56HZ UINT8_C(0x02) +#define BMA4_OUTPUT_DATA_RATE_3_12HZ UINT8_C(0x03) +#define BMA4_OUTPUT_DATA_RATE_6_25HZ UINT8_C(0x04) +#define BMA4_OUTPUT_DATA_RATE_12_5HZ UINT8_C(0x05) +#define BMA4_OUTPUT_DATA_RATE_25HZ UINT8_C(0x06) +#define BMA4_OUTPUT_DATA_RATE_50HZ UINT8_C(0x07) +#define BMA4_OUTPUT_DATA_RATE_100HZ UINT8_C(0x08) +#define BMA4_OUTPUT_DATA_RATE_200HZ UINT8_C(0x09) +#define BMA4_OUTPUT_DATA_RATE_400HZ UINT8_C(0x0A) +#define BMA4_OUTPUT_DATA_RATE_800HZ UINT8_C(0x0B) +#define BMA4_OUTPUT_DATA_RATE_1600HZ UINT8_C(0x0C) + +/**\name ACCEL BANDWIDTH PARAMETER */ +#define BMA4_ACCEL_OSR4_AVG1 UINT8_C(0) +#define BMA4_ACCEL_OSR2_AVG2 UINT8_C(1) +#define BMA4_ACCEL_NORMAL_AVG4 UINT8_C(2) +#define BMA4_ACCEL_CIC_AVG8 UINT8_C(3) +#define BMA4_ACCEL_RES_AVG16 UINT8_C(4) +#define BMA4_ACCEL_RES_AVG32 UINT8_C(5) +#define BMA4_ACCEL_RES_AVG64 UINT8_C(6) +#define BMA4_ACCEL_RES_AVG128 UINT8_C(7) + +/**\name ACCEL PERFMODE PARAMETER */ +#define BMA4_CIC_AVG_MODE UINT8_C(0) +#define BMA4_CONTINUOUS_MODE UINT8_C(1) + +/**\name MAG OFFSET */ +#define BMA4_MAG_OFFSET_MAX UINT8_C(0x00) + +/**\name ENABLE/DISABLE SELECTIONS */ +#define BMA4_X_AXIS UINT8_C(0) +#define BMA4_Y_AXIS UINT8_C(1) +#define BMA4_Z_AXIS UINT8_C(2) + +/**\name SELF TEST*/ +#define BMA4_SELFTEST_PASS UINT8_C(0) +#define BMA4_SELFTEST_FAIL UINT8_C(1) + +/**\name INTERRUPT MAPS */ +#define BMA4_INTR1_MAP UINT8_C(0) +#define BMA4_INTR2_MAP UINT8_C(1) + +/**\name INTERRUPT MASKS */ +#define BMA4_FIFO_FULL_INT UINT16_C(0x0100) +#define BMA4_FIFO_WM_INT UINT16_C(0x0200) +#define BMA4_DATA_RDY_INT UINT16_C(0x0400) +#define BMA4_MAG_DATA_RDY_INT UINT16_C(0x2000) +#define BMA4_ACCEL_DATA_RDY_INT UINT16_C(0x8000) + + +/**\name AKM POWER MODE SELECTION */ +#define AKM_POWER_DOWN_MODE UINT8_C(0) +#define AKM_SINGLE_MEAS_MODE UINT8_C(1) + +/**\name SECONDARY_MAG POWER MODE SELECTION */ +#define BMA4_MAG_FORCE_MODE UINT8_C(0) +#define BMA4_MAG_SUSPEND_MODE UINT8_C(1) + +/**\name MAG POWER MODE SELECTION */ +#define FORCE_MODE UINT8_C(0) +#define SUSPEND_MODE UINT8_C(1) + +/**\name ACCEL POWER MODE */ +#define ACCEL_MODE_NORMAL UINT8_C(0x11) + +/**\name MAG POWER MODE */ +#define MAG_MODE_SUSPEND UINT8_C(0x18) + +/**\name ENABLE/DISABLE BIT VALUES */ +#define BMA4_ENABLE UINT8_C(0x01) +#define BMA4_DISABLE UINT8_C(0x00) + +/**\name DEFINITION USED FOR DIFFERENT WRITE */ +#define BMA4_MANUAL_DISABLE UINT8_C(0x00) +#define BMA4_MANUAL_ENABLE UINT8_C(0x01) +#define BMA4_ENABLE_MAG_IF_MODE UINT8_C(0x01) +#define BMA4_MAG_DATA_READ_REG UINT8_C(0x0A) +#define BMA4_BMM_POWER_MODE_REG UINT8_C(0x06) +#define BMA4_SEC_IF_NULL UINT8_C(0) +#define BMA4_SEC_IF_BMM150 UINT8_C(1) +#define BMA4_SEC_IF_AKM09916 UINT8_C(2) +#define BMA4_ENABLE_AUX_IF_MODE UINT8_C(0x01) + +/**\name SENSOR RESOLUTION */ +#define BMA4_12_BIT_RESOLUTION UINT8_C(12) +#define BMA4_14_BIT_RESOLUTION UINT8_C(14) +#define BMA4_16_BIT_RESOLUTION UINT8_C(16) + +/**\name MULTIPLIER */ +/*! for handling micro-g values */ +#define BMA4XY_MULTIPLIER UINT32_C(1000000) +/*! for handling float temperature values */ +#define BMA4_SCALE_TEMP INT32_C(1000) +/* BMA4_FAHREN_SCALED = 1.8 * 1000 */ +#define BMA4_FAHREN_SCALED INT32_C(1800) +/* BMA4_KELVIN_SCALED = 273.15 * 1000 */ +#define BMA4_KELVIN_SCALED INT32_C(273150) + + +/**\name MAP BURST READ LENGTHS */ +#define BMA4_AUX_READ_LEN_0 0 +#define BMA4_AUX_READ_LEN_1 1 +#define BMA4_AUX_READ_LEN_2 2 +#define BMA4_AUX_READ_LEN_3 3 + +#ifndef ABS +#define ABS(a) ((a) > 0 ? (a) : -(a)) /*!< Absolute value */ +#endif + +/**\name BIT SLICE GET AND SET FUNCTIONS */ +#define BMA4_GET_BITSLICE(regvar, bitname)\ + ((regvar & bitname##_MSK) >> bitname##_POS) +#define BMA4_SET_BITSLICE(regvar, bitname, val)\ + ((regvar & ~bitname##_MSK) | \ + ((val<> 8) + +#define BMA4_SET_BIT_VAL_0(reg_data, bitname) (reg_data & ~(bitname##_MSK)) + +#define BMA4_SET_BITS_POS_0(reg_data, bitname, data) \ + ((reg_data & ~(bitname##_MSK)) | \ + (data & bitname##_MSK)) + +#define BMA4_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK)) + +/**\name TYPEDEF DEFINITIONS */ +/*! + * @brief Bus communication function pointer which should be mapped to + * the platform specific read and write functions of the user + */ +typedef uint16_t (*bma4_com_fptr_t)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *read_data, uint16_t len); + +/*! delay function pointer */ +typedef void (*bma4_delay_fptr_t)(uint32_t); + +/******************************************************************************/ +/*! @name Enum Declarations */ +/******************************************************************************/ + +/*! @name Enum to define BMA4 variants */ +enum bma4_variant { + BMA42X_VARIANT = 1, + BMA45X_VARIANT +}; + +/**\name STRUCTURE DEFINITIONS*/ + +/*! + * @brief + * This structure holds asic info. for feature configuration. + */ +struct bma4_asic_data { + /* Feature config start addr (0-3 bits)*/ + uint8_t asic_lsb; + /* Feature config start addr (4-11 bits)*/ + uint8_t asic_msb; +}; + +/*! + * @brief Auxiliary configuration structure for user settings + */ +struct bma4_aux_config { + /*! Device address of auxiliary sensor */ + uint8_t aux_dev_addr; + /*! To enable manual or auto mode */ + uint8_t manual_enable; + /*! No of bytes to be read at a time */ + uint8_t burst_read_length; + /*! Variable to set the auxiliary interface */ + uint8_t if_mode; +}; + +/*! + * @brief + * This structure holds all relevant information about BMA4 + */ +struct bma4_dev { + /*! Chip id of BMA4 */ + uint8_t chip_id; + /*! Chip id of auxiliary sensor */ + uint8_t aux_chip_id; + /*! Device address of BMA4 */ + uint8_t dev_addr; + /*! Interface detail */ + uint8_t interface; + /*! Auxiliary sensor information */ + uint8_t aux_sensor; + /*! Decide SPI or I2C read mechanism */ + uint8_t dummy_byte; + /*! Resolution for FOC */ + uint8_t resolution; + /*! Define the BMA4 variant BMA42X or BMA45X */ + enum bma4_variant variant; + /* ! Used to check mag manual/auto mode status + int8_t mag_manual_enable;*/ + /*! FIFO related configurations */ + struct bma4_fifo_frame *fifo; + /*! Config stream data buffer address will be assigned*/ + const uint8_t *config_file_ptr; + /*! Max read/write length (maximum supported length is 32). + To be set by the user */ + uint8_t read_write_len; + /*! Feature len */ + uint8_t feature_len; + /*! Contains asic information */ + struct bma4_asic_data asic_data; + /*! Contains aux configuration settings */ + struct bma4_aux_config aux_config; + /*! Bus read function pointer */ + bma4_com_fptr_t bus_read; + /*! Bus write function pointer */ + bma4_com_fptr_t bus_write; + /*! delay(in ms) function pointer */ + bma4_delay_fptr_t delay; +}; + +/*! + * @brief This structure holds the information for usage of + * FIFO by the user. + */ +struct bma4_fifo_frame { + /*! Data buffer of user defined length is to be mapped here */ + uint8_t *data; + /*! Number of bytes of FIFO to be read as specified by the user */ + uint16_t length; + /*! Enabling of the FIFO header to stream in header mode */ + uint8_t fifo_header_enable; + /*! Streaming of the Accelerometer, Auxiliary + * sensor data or both in FIFO */ + uint8_t fifo_data_enable; + /*! Will be equal to length when no more frames are there to parse */ + uint16_t accel_byte_start_idx; + /*! Will be equal to length when no more frames are there to parse */ + uint16_t mag_byte_start_idx; + /*! Will be equal to length when no more frames are there to parse */ + uint16_t sc_frame_byte_start_idx; + /*! Value of FIFO sensor time time */ + uint32_t sensor_time; + /*! Value of Skipped frame counts */ + uint8_t skipped_frame_count; + /*! Value of accel dropped frame count */ + uint8_t accel_dropped_frame_count; + /*! Value of mag dropped frame count */ + uint8_t mag_dropped_frame_count; +}; + +/*! + * @brief Error Status structure + */ +struct bma4_err_reg { + /*! Indicates fatal error */ + uint8_t fatal_err; + /*! Indicates command error */ + uint8_t cmd_err; + /*! Indicates error code */ + uint8_t err_code; + /*! Indicates fifo error */ + uint8_t fifo_err; + /*! Indicates mag error */ + uint8_t aux_err; +}; + +/*! + * @brief Asic Status structure + */ +struct bma4_asic_status { + /*! Asic is in sleep/halt state */ + uint8_t sleep; + /*! Dedicated interrupt is set again before previous interrupt + was acknowledged */ + uint8_t irq_ovrn; + /*! Watchcell event detected (asic stopped) */ + uint8_t wc_event; + /*! Stream transfer has started and transactions are ongoing */ + uint8_t stream_transfer_active; +}; + +/*! + * @brief Interrupt Pin Configuration structure + */ +struct bma4_int_pin_config { + /*! Trigger condition of interrupt pin */ + uint8_t edge_ctrl; + /*! Level of interrupt pin */ + uint8_t lvl; + /*! Behaviour of interrupt pin to open drain */ + uint8_t od; + /*! Output enable for interrupt pin */ + uint8_t output_en; + /*! Input enable for interrupt pin */ + uint8_t input_en; +}; + +/*! +* @brief Accelerometer configuration structure */ +struct bma4_accel_config { + /*! Output data rate in Hz */ + uint8_t odr; + /*! Bandwidth parameter, determines filter configuration */ + uint8_t bandwidth; + /*! Filter performance mode */ + uint8_t perf_mode; + /*! G-range */ + uint8_t range; +}; + +/*! + * @brief Auxiliary magnetometer configuration structure + */ +struct bma4_aux_mag_config { + /*! Poll rate for the sensor attached to the Magnetometer interface */ + uint8_t odr; + /*! Trigger-readout offset in units of 2.5 ms. + If set to zero, the offset is maximum, i.e. after readout a trigger + is issued immediately */ + uint8_t offset; +}; + +/*! + * @brief ASIC Config structure + */ +struct bma4_asic_config { + /*! Enable/Disable ASIC Wake Up */ + uint8_t asic_en; + /*! Configure stream_transfer/FIFO mode */ + uint8_t fifo_mode_en; + /*! Mapping of instance RAM1 */ + uint8_t mem_conf_ram1; + /*! Mapping of instance RAM2 */ + uint8_t mem_conf_ram2; + /*! Mapping of instance RAM3 */ + uint8_t mem_conf_ram3; +}; +/*! + * @brief bmm150 or akm09916 + * magnetometer values structure + */ +struct bma4_mag { + /*! BMM150 and AKM09916 X raw data */ + int32_t x; + /*! BMM150 and AKM09916 Y raw data */ + int32_t y; + /*! BMM150 and AKM09916 Z raw data */ + int32_t z; +}; + +/*! + * @brief bmm150 xyz data structure + */ +struct bma4_mag_xyzr { + /*! BMM150 X raw data */ + int16_t x; + /*! BMM150 Y raw data */ + int16_t y; + /*! BMM150 Z raw data */ + int16_t z; + /*! BMM150 R raw data */ + uint16_t r; +}; + +/*! + * @brief Accel xyz data structure + */ +struct bma4_accel { + /*! Accel X data */ + int16_t x; + /*! Accel Y data */ + int16_t y; + /*! Accel Z data */ + int16_t z; +}; + +/*! + * @brief FIFO mag data structure + */ +struct bma4_mag_fifo_data { + /*! The value of mag x LSB data */ + uint8_t mag_x_lsb; + /*! The value of mag x MSB data */ + uint8_t mag_x_msb; + /*! The value of mag y LSB data */ + uint8_t mag_y_lsb; + /*! The value of mag y MSB data */ + uint8_t mag_y_msb; + /*! The value of mag z LSB data */ + uint8_t mag_z_lsb; + /*! The value of mag z MSB data */ + uint8_t mag_z_msb; + /*! The value of mag r for BMM150 Y2 for YAMAHA LSB data */ + uint8_t mag_r_y2_lsb; + /*! The value of mag r for BMM150 Y2 for YAMAHA MSB data */ + uint8_t mag_r_y2_msb; +}; + +#endif +/* End of __BMA4_H__ */ diff --git a/src/config.h b/src/config.h index 8f223d2..626c84d 100644 --- a/src/config.h +++ b/src/config.h @@ -1,54 +1,54 @@ -#ifndef CONFIG_H -#define CONFIG_H - -//pins -#define SDA 21 -#define SCL 22 -#define V10_ADC_PIN 33 //OG v1.0 Watchy -#define V15_ADC_PIN 35 //v1.5 Watchy with PCF8563 RTC -#define RTC_PIN GPIO_NUM_27 -#define CS 5 -#define DC 10 -#define RESET 9 -#define BUSY 19 -#define VIB_MOTOR_PIN 13 -#define MENU_BTN_PIN 26 -#define BACK_BTN_PIN 25 -#define UP_BTN_PIN 32 -#define DOWN_BTN_PIN 4 -#define MENU_BTN_MASK GPIO_SEL_26 -#define BACK_BTN_MASK GPIO_SEL_25 -#define UP_BTN_MASK GPIO_SEL_32 -#define DOWN_BTN_MASK GPIO_SEL_4 -#define ACC_INT_MASK GPIO_SEL_14 -#define BTN_PIN_MASK MENU_BTN_MASK|BACK_BTN_MASK|UP_BTN_MASK|DOWN_BTN_MASK -//display -#define DISPLAY_WIDTH 200 -#define DISPLAY_HEIGHT 200 -//wifi -#define WIFI_AP_TIMEOUT 60 -#define WIFI_AP_SSID "Watchy AP" -//menu -#define WATCHFACE_STATE -1 -#define MAIN_MENU_STATE 0 -#define APP_STATE 1 -#define FW_UPDATE_STATE 2 -#define MENU_HEIGHT 25 -#define MENU_LENGTH 7 -//set time -#define SET_HOUR 0 -#define SET_MINUTE 1 -#define SET_YEAR 2 -#define SET_MONTH 3 -#define SET_DAY 4 -#define HOUR_12_24 24 -//BLE OTA -#define BLE_DEVICE_NAME "Watchy BLE OTA" -#define WATCHFACE_NAME "Watchy 7 Segment" -#define SOFTWARE_VERSION_MAJOR 1 -#define SOFTWARE_VERSION_MINOR 0 -#define SOFTWARE_VERSION_PATCH 0 -#define HARDWARE_VERSION_MAJOR 1 -#define HARDWARE_VERSION_MINOR 0 - +#ifndef CONFIG_H +#define CONFIG_H + +//pins +#define SDA 21 +#define SCL 22 +#define V10_ADC_PIN 33 //OG v1.0 Watchy +#define V15_ADC_PIN 35 //v1.5 Watchy with PCF8563 RTC +#define RTC_PIN GPIO_NUM_27 +#define CS 5 +#define DC 10 +#define RESET 9 +#define BUSY 19 +#define VIB_MOTOR_PIN 13 +#define MENU_BTN_PIN 26 +#define BACK_BTN_PIN 25 +#define UP_BTN_PIN 32 +#define DOWN_BTN_PIN 4 +#define MENU_BTN_MASK GPIO_SEL_26 +#define BACK_BTN_MASK GPIO_SEL_25 +#define UP_BTN_MASK GPIO_SEL_32 +#define DOWN_BTN_MASK GPIO_SEL_4 +#define ACC_INT_MASK GPIO_SEL_14 +#define BTN_PIN_MASK MENU_BTN_MASK|BACK_BTN_MASK|UP_BTN_MASK|DOWN_BTN_MASK +//display +#define DISPLAY_WIDTH 200 +#define DISPLAY_HEIGHT 200 +//wifi +#define WIFI_AP_TIMEOUT 60 +#define WIFI_AP_SSID "Watchy AP" +//menu +#define WATCHFACE_STATE -1 +#define MAIN_MENU_STATE 0 +#define APP_STATE 1 +#define FW_UPDATE_STATE 2 +#define MENU_HEIGHT 25 +#define MENU_LENGTH 7 +//set time +#define SET_HOUR 0 +#define SET_MINUTE 1 +#define SET_YEAR 2 +#define SET_MONTH 3 +#define SET_DAY 4 +#define HOUR_12_24 24 +//BLE OTA +#define BLE_DEVICE_NAME "Watchy BLE OTA" +#define WATCHFACE_NAME "Watchy 7 Segment" +#define SOFTWARE_VERSION_MAJOR 1 +#define SOFTWARE_VERSION_MINOR 0 +#define SOFTWARE_VERSION_PATCH 0 +#define HARDWARE_VERSION_MAJOR 1 +#define HARDWARE_VERSION_MINOR 0 + #endif \ No newline at end of file