From 2c38feb388d770370e2a4ab90ccbf7827ea12115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ben=20H=C3=BCpeden?= Date: Mon, 6 Jun 2022 09:40:57 +0200 Subject: [PATCH] troubleshooting GPS --- .clang-format | 13 + .gitignore | 40 +- .vscode/extensions.json | 10 + .vscode/tasks.json | 17 + README.md | 37 +- include/README | 39 ++ include/configuration_template.h | 14 + include/credentials_template.h | 40 ++ include/main.h | 35 ++ include/sh_battery.h | 15 + include/sh_bme280.h | 30 ++ include/sh_board.h | 27 ++ include/sh_epd.h | 3 + include/sh_gps.h | 27 ++ include/sh_logo.h | 6 + include/sh_lora.h | 41 ++ include/utilities.h | 73 ++++ lib/README | 46 +++ platformio.ini | 35 ++ src/main.cpp | 165 ++++++++ src/sh_battery.cpp | 13 + src/sh_bme280.cpp | 55 +++ src/sh_board.cpp | 94 +++++ src/sh_gps.cpp | 45 +++ src/sh_logo.cpp | 630 +++++++++++++++++++++++++++++++ src/sh_lora.cpp | 10 + test/README | 11 + 27 files changed, 1540 insertions(+), 31 deletions(-) create mode 100644 .clang-format create mode 100644 .vscode/extensions.json create mode 100644 .vscode/tasks.json create mode 100644 include/README create mode 100644 include/configuration_template.h create mode 100644 include/credentials_template.h create mode 100644 include/main.h create mode 100644 include/sh_battery.h create mode 100644 include/sh_bme280.h create mode 100644 include/sh_board.h create mode 100644 include/sh_epd.h create mode 100644 include/sh_gps.h create mode 100644 include/sh_logo.h create mode 100644 include/sh_lora.h create mode 100644 include/utilities.h create mode 100644 lib/README create mode 100644 platformio.ini create mode 100644 src/main.cpp create mode 100644 src/sh_battery.cpp create mode 100644 src/sh_bme280.cpp create mode 100644 src/sh_board.cpp create mode 100644 src/sh_gps.cpp create mode 100644 src/sh_logo.cpp create mode 100644 src/sh_lora.cpp create mode 100644 test/README diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..ea14389 --- /dev/null +++ b/.clang-format @@ -0,0 +1,13 @@ +Language: Cpp +IndentWidth: 4 +ColumnLimit: 130 +PointerAlignment: Right +BreakBeforeBraces: Allman +AllowShortFunctionsOnASingleLine: Inline +AlignConsecutiveAssignments: AcrossEmptyLines +AlignConsecutiveDeclarations: AcrossEmptyLines +AlignConsecutiveMacros: AcrossEmptyLines +AlignTrailingComments: true +EmptyLineBeforeAccessModifier: Always +QualifierAlignment: Left +SeparateDefinitionBlocks: Always diff --git a/.gitignore b/.gitignore index 259148f..5b40593 100644 --- a/.gitignore +++ b/.gitignore @@ -1,32 +1,12 @@ -# Prerequisites -*.d +# general +.pio +include/configuration.h +include/credentials.h -# Compiled Object files -*.slo -*.lo -*.o -*.obj +# vscode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/extensions.json +*.code-workspace -# Precompiled Headers -*.gch -*.pch - -# Compiled Dynamic libraries -*.so -*.dylib -*.dll - -# Fortran module files -*.mod -*.smod - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib - -# Executables -*.exe -*.out -*.app diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..080e70d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..b234000 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,17 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "PlatformIO", + "task": "Build", + "problemMatcher": [ + "$platformio" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "label": "PlatformIO: Build" + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md index 863b644..966d4f2 100644 --- a/README.md +++ b/README.md @@ -1 +1,36 @@ -# SmartHarz-Tracker \ No newline at end of file +# SmartHarz-Tracker (English|[Deutsch weiter unten](#smartharz-tracker-deutsch)) + +A LoRaWAN tracker based on the [Lilygo T-Echo](https://github.com/Xinyuan-LilyGO/T-Echo). + +The T-Echo is based on following components: + +- Nordic Semiconductor nRF52840 MCU +- SemTech SX1262 LoRa Tranceiver +- Quectel GNSS L76 module +- an 200*200px e-paper display +- a user button +- a touch button +- (optional) Bosch Sensortec BME280 + +As Meshtastic and SoftRF are available for the T-Echo already, a tracker was the next logical step. Especially as we are currently have a number of Dragino LGT-92 trackers deployed at the fire departments of Goslar. As the LGT-92 is sadly EOL we are looking for a good replacement and the T-Echo is looking promising and offers even more features. + +## Feature List v0.1 + +- GNSS location service +- LoRaWAN/TTN integration +- BME280 integration +- Logo + +## ToDo for v1.0 + +- error handling +- touch button for POI select -> interrupt +- display with multiple options +- button 2 for power off/power on +- get battery voltage + +## Future additions + +- BLE/NFC + +# SmartHarz-Tracker (Deutsch) \ No newline at end of file diff --git a/include/README b/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/include/configuration_template.h b/include/configuration_template.h new file mode 100644 index 0000000..fcbc13a --- /dev/null +++ b/include/configuration_template.h @@ -0,0 +1,14 @@ +/** + * @file configuration.h + * @author your name (you@domain.com) + * @brief + * @version 0.1 + * @date 2022-05-28 + * + * @copyright Copyright (c) 2022 + * + */ + +/*** Configuration ***/ +#define BME280 // comment out if you have a T-Echo without BME280 +#define DEBUG // comment out to remove debug messages from serial bus \ No newline at end of file diff --git a/include/credentials_template.h b/include/credentials_template.h new file mode 100644 index 0000000..dbc4a03 --- /dev/null +++ b/include/credentials_template.h @@ -0,0 +1,40 @@ +/** + * @file credentials_template.h + * @author your name (you@domain.com) + * @brief + * @version 0.1 + * @date 2022-05-28 + * + * @copyright Copyright (c) 2022 + * + */ + +#ifndef _CREDENTIALS_H_ +#define _CREDENTIALS_H_ + + +#include +#include + +/** + * This EUI must be in little-endian format, so least-significant-byte + * first. When copying an EUI from ttnctl output, this means to reverse + * the bytes. For TTN issued EUIs the last bytes should be 0xD5, 0xB3, + * 0x70. + */ +static const u1_t PROGMEM DEVEUI[8]={ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI, 8);} + +/** This should also be in little endian format, see above. */ +static const u1_t PROGMEM APPEUI[8]={ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8);} + +/** + * This key should be in big endian format (or, since it is not really a + * number but a block of memory, endianness does not really apply). In + * practice, a key taken from ttnctl can be copied as-is. + */ +static const u1_t PROGMEM APPKEY[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +void os_getDevKey (u1_t* buf) { memcpy_P(buf, APPKEY, 16);} + +#endif // _CREDENTIALS_H_ \ No newline at end of file diff --git a/include/main.h b/include/main.h new file mode 100644 index 0000000..3a98c6e --- /dev/null +++ b/include/main.h @@ -0,0 +1,35 @@ +/** + * @file main.h + * @author SmartHarz (info@smartharz.de) + * @brief + * @version 0.1 + * @date 2022-05-28 + * + * @copyright Copyright (c) 2022 + * + */ + +/*** General includes ***/ +#include + +/*** Board setup ***/ +#include "configuration.h" +#include "sh_board.h" +#include "utilities.h" + +/*** LoRa setup ***/ +// #include "sh_lora.h" + +/*** BME280 setup ***/ +#include "sh_bme280.h" +Adafruit_BME280 bme; +float temperature, humidity, pressure; + +/*** E-paper setup ***/ +// #include "sh_epd.h" + +/*** GPS setup ***/ +#include "sh_gps.h" +TinyGPSPlus *gps; +float latitude, longitude, altitude; +int hdop, sats; diff --git a/include/sh_battery.h b/include/sh_battery.h new file mode 100644 index 0000000..9900931 --- /dev/null +++ b/include/sh_battery.h @@ -0,0 +1,15 @@ +/** + * @file sh_battery.h + * @author your name (you@domain.com) + * @brief + * @version 0.1 + * @date 2022-05-30 + * + * @copyright Copyright (c) 2022 + * + */ + + + +bool isBatteryConnect(); +float getBatteryVoltage(); diff --git a/include/sh_bme280.h b/include/sh_bme280.h new file mode 100644 index 0000000..e9d6289 --- /dev/null +++ b/include/sh_bme280.h @@ -0,0 +1,30 @@ +/** + * @file sh_bme280.h + * @author your name (you@domain.com) + * @brief + * @version 0.1 + * @date 2022-05-28 + * + * @copyright Copyright (c) 2022 + * + */ + +#ifndef _SH_BME280_H_ +#define _SH_BME280_H_ + +#if defined BME280 +#include "configuration.h" +#include "utilities.h" +#include +#include + +/** Variables **/ +extern Adafruit_BME280 bme; +extern float temperature, humidity, pressure; + +/** Function Prototypes **/ +void setupBME280(); +void getEnvironmentalData(); + +#endif // defined BME280 +#endif // _SH_BME280_H_ diff --git a/include/sh_board.h b/include/sh_board.h new file mode 100644 index 0000000..5b6337f --- /dev/null +++ b/include/sh_board.h @@ -0,0 +1,27 @@ +/** + * @file sh_board.h + * @author your name (you@domain.com) + * @brief + * @version 0.1 + * @date 2022-05-29 + * + * @copyright Copyright (c) 2022 + * + */ +#ifndef _SH_BOARD_H_ +#define _SH_BOARD_H_ + +/*** Includes ***/ +#include "configuration.h" +#include "utilities.h" +#include +#include + +/*** Function prototypes ***/ +void setupBoard(); +void i2cInit(); +void spiInit(); +void ledInit(); +void buttonInit(); + +#endif // _SH_BOARD_H_ diff --git a/include/sh_epd.h b/include/sh_epd.h new file mode 100644 index 0000000..a31149a --- /dev/null +++ b/include/sh_epd.h @@ -0,0 +1,3 @@ +#include +#include +#include "sh_logo.h" diff --git a/include/sh_gps.h b/include/sh_gps.h new file mode 100644 index 0000000..fd60c5a --- /dev/null +++ b/include/sh_gps.h @@ -0,0 +1,27 @@ +/** + * @file sh_gps.h + * @author your name (you@domain.com) + * @brief + * @version 0.1 + * @date 2022-05-27 + * + * @copyright Copyright (c) 2022 + * + */ + +#ifndef _SH_GPS_H_ +#define _SH_GPS_H_ + +#include "configuration.h" +#include "utilities.h" +#include + +extern TinyGPSPlus *gps; + +extern float latitude, longitude, altitude; +extern int hdop, sats; + +/** Function prototypes **/ +void setupGPS(); + +#endif // _SH_GPS_H_ diff --git a/include/sh_logo.h b/include/sh_logo.h new file mode 100644 index 0000000..e23bf28 --- /dev/null +++ b/include/sh_logo.h @@ -0,0 +1,6 @@ +#ifndef _SH_LOGO_H_ +#define _SH_LOGO_H_ + +extern const unsigned char Fichte[]; + +#endif // _SH_LOGO_H_ \ No newline at end of file diff --git a/include/sh_lora.h b/include/sh_lora.h new file mode 100644 index 0000000..3ced29a --- /dev/null +++ b/include/sh_lora.h @@ -0,0 +1,41 @@ +/** + * @file sh_lora.h + * @author your name (you@domain.com) + * @brief + * @version 0.1 + * @date 2022-05-28 + * + * @copyright Copyright (c) 2022 + * + */ + +#ifndef _SH_LORA_H_ +#define _SH_LORA_H_ + +#include "credentials.h" +#include +#include + +#include "utilities.h" +#include +#include + +/*** LoRa setup ***/ +/* TX scheduler */ +const unsigned TX_INTERVAL = 60; + +/* Pin mapping */ +// clang-format off +const lmic_pinmap lmic_pins = +{ + .nss = LORA_CS, + .rxtx = LMIC_UNUSED_PIN, + .rst = LORA_RST, + .dio = {LORA_DIO0, LORA_DIO0, LMIC_UNUSED_PIN} +}; +// clang-format on + +/** Function prototypes **/ +bool loraInit(); + +#endif // _SH_LORA_H_ \ No newline at end of file diff --git a/include/utilities.h b/include/utilities.h new file mode 100644 index 0000000..409f5e5 --- /dev/null +++ b/include/utilities.h @@ -0,0 +1,73 @@ +/** + * @file utilities.h + * @author your name (you@domain.com) + * @brief Pin setup for Arduino based T-Echo installation + * @version 0.1 + * @date 2022-05-28 + * + * @copyright Copyright (c) 2022 + * + */ + +#ifndef _UTILITIES_H_ +#define _UTILITIES_H_ + +#include + +#ifndef _PINNUM +#define _PINNUM(port, pin) ((port)*32 + (pin)) +#endif + +#define EPD_MISO _PINNUM(1, 6) +#define EPD_MOSI _PINNUM(0, 29) +#define EPD_SCLK _PINNUM(0, 31) +#define EPD_CS _PINNUM(0, 30) +#define EPD_DC _PINNUM(0, 28) +#define EPD_RST _PINNUM(0, 2) +#define EPD_BUSY _PINNUM(0, 3) +#define EPD_BACKLIGHT _PINNUM(1, 11) + +#define LORA_MISO _PINNUM(0, 23) +#define LORA_MOSI _PINNUM(0, 22) +#define LORA_SCLK _PINNUM(0, 19) +#define LORA_CS _PINNUM(0, 24) +#define LORA_RST _PINNUM(0, 25) +#define LORA_DIO0 _PINNUM(0, 15) +#define LORA_DIO1 _PINNUM(0, 20) +#define LORA_DIO3 _PINNUM(0, 21) +#define LORA_BUSY _PINNUM(0, 17) + +#define FLASH_CS _PINNUM(1, 15) +#define FLASH_SCLK _PINNUM(1, 14) +#define FLASH_MISO _PINNUM(1, 13) +#define FLASH_MOSI _PINNUM(1, 12) + +#define TOUCH_PIN _PINNUM(0, 11) + +#define ADC_PIN _PINNUM(0, 4) + +#define SDA_PIN _PINNUM(0, 26) +#define SCL_PIN _PINNUM(0, 27) + +#define RTC_INT_PIN _PINNUM(0, 16) + +#define GPS_RX_PIN _PINNUM(1, 9) +#define GPS_TX_PIN _PINNUM(1, 8) +#define GPS_WAKEUP_PIN _PINNUM(1, 2) +#define GPS_RESET_PIN _PINNUM(1, 5) +#define GPS_PPS_PIN _PINNUM(1, 4) + +#define BUTTON_PIN _PINNUM(1, 10) + +#define POWER_EN_PIN _PINNUM(0, 12) +#define POWER_EN2_PIN _PINNUM(0, 13) + +#define GREEN_LED_PIN _PINNUM(1, 1) +#define RED_LED_PIN _PINNUM(1, 3) +#define BLUE_LED_PIN _PINNUM(0, 14) + +/* better human readable labels for serial connections */ +#define SERIAL_MON Serial +#define SERIAL_GPS Serial2 + +#endif // _UTILITIES_H_ diff --git a/lib/README b/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..d39e396 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,35 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[platformio] +default_envs = t-echo + +[env:t-echo] +platform = nordicnrf52 +board = nrf52840_dk_adafruit +framework = arduino +upload_protocol = nrfutil +monitor_speed = 115200 +lib_deps = + zinggjm/GxEPD2@^1.4.5 + mikalhart/TinyGPSPlus@^1.0.3 + mcci-catena/MCCI LoRaWAN LMIC library@^4.1.1 + adafruit/Adafruit BusIO@^1.11.6 + adafruit/Adafruit Unified Sensor@^1.1.5 + adafruit/Adafruit BME280 Library@^2.2.2 + https://github.com/ElectronicCats/CayenneLPP#1.3.0 + bblanchon/ArduinoJson@^6.19.4 + lewisxhe/PCF8563_Library@^0.0.1 +build_flags = + -D ARDUINO_LMIC_PROJECT_CONFIG_H_SUPPRESS + -D LMIC_LORAWAN_SPEC_VERSION=LMIC_LORAWAN_SPEC_VERSION_1_0_2 + -D CFG_eu868=1 + -D CFG_sx1276_radio=1 + -DCFG_DEBUG=0 diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..eb27d57 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,165 @@ +/** + * @file main.cpp + * @author SmartHarz (info@smartharz.de) + * @brief + * @version 0.1 + * @date 2022-05-27 + * + * @copyright Copyright (c) 2022 + * + */ + +#include "main.h" + +int x = 0; +uint32_t last = 0; + +void setup() +{ + SERIAL_MON.begin(115200); + SERIAL_MON.println("Start\n"); + delay(2000); + + setupBoard(); + +#ifdef BME280 + setupBME280(); +#endif + + setupGPS(); + + delay(1000); + + SERIAL_MON.println("Setup finished..."); +} + +void loop() +{ + while (SERIAL_GPS.available() > 0) + gps->encode(SERIAL_GPS.read()); + + if (millis() - last > 5000) + { + if (gps->location.isUpdated()) + { + SERIAL_MON.print(F("LOCATION Fix Age=")); + SERIAL_MON.print(gps->location.age()); + SERIAL_MON.print(F("ms Raw Lat=")); + SERIAL_MON.print(gps->location.rawLat().negative ? "-" : "+"); + SERIAL_MON.print(gps->location.rawLat().deg); + SERIAL_MON.print("[+"); + SERIAL_MON.print(gps->location.rawLat().billionths); + SERIAL_MON.print(F(" billionths], Raw Long=")); + SERIAL_MON.print(gps->location.rawLng().negative ? "-" : "+"); + SERIAL_MON.print(gps->location.rawLng().deg); + SERIAL_MON.print("[+"); + SERIAL_MON.print(gps->location.rawLng().billionths); + SERIAL_MON.print(F(" billionths], Lat=")); + SERIAL_MON.print(gps->location.lat(), 6); + SERIAL_MON.print(F(" Long=")); + SERIAL_MON.println(gps->location.lng(), 6); + } + + if (gps->date.isUpdated()) + { + SERIAL_MON.print(F("DATE Fix Age=")); + SERIAL_MON.print(gps->date.age()); + SERIAL_MON.print(F("ms Raw=")); + SERIAL_MON.print(gps->date.value()); + SERIAL_MON.print(F(" Year=")); + SERIAL_MON.print(gps->date.year()); + SERIAL_MON.print(F(" Month=")); + SERIAL_MON.print(gps->date.month()); + SERIAL_MON.print(F(" Day=")); + SERIAL_MON.println(gps->date.day()); + } + + if (gps->time.isUpdated()) + { + SERIAL_MON.print(F("TIME Fix Age=")); + SERIAL_MON.print(gps->time.age()); + SERIAL_MON.print(F("ms Raw=")); + SERIAL_MON.print(gps->time.value()); + SERIAL_MON.print(F(" Hour=")); + SERIAL_MON.print(gps->time.hour()); + SERIAL_MON.print(F(" Minute=")); + SERIAL_MON.print(gps->time.minute()); + SERIAL_MON.print(F(" Second=")); + SERIAL_MON.print(gps->time.second()); + SERIAL_MON.print(F(" Hundredths=")); + SERIAL_MON.println(gps->time.centisecond()); + } + + if (gps->speed.isUpdated()) + { + SERIAL_MON.print(F("SPEED Fix Age=")); + SERIAL_MON.print(gps->speed.age()); + SERIAL_MON.print(F("ms Raw=")); + SERIAL_MON.print(gps->speed.value()); + SERIAL_MON.print(F(" Knots=")); + SERIAL_MON.print(gps->speed.knots()); + SERIAL_MON.print(F(" MPH=")); + SERIAL_MON.print(gps->speed.mph()); + SERIAL_MON.print(F(" m/s=")); + SERIAL_MON.print(gps->speed.mps()); + SERIAL_MON.print(F(" km/h=")); + SERIAL_MON.println(gps->speed.kmph()); + } + + if (gps->course.isUpdated()) + { + SERIAL_MON.print(F("COURSE Fix Age=")); + SERIAL_MON.print(gps->course.age()); + SERIAL_MON.print(F("ms Raw=")); + SERIAL_MON.print(gps->course.value()); + SERIAL_MON.print(F(" Deg=")); + SERIAL_MON.println(gps->course.deg()); + } + + if (gps->altitude.isUpdated()) + { + SERIAL_MON.print(F("ALTITUDE Fix Age=")); + SERIAL_MON.print(gps->altitude.age()); + SERIAL_MON.print(F("ms Raw=")); + SERIAL_MON.print(gps->altitude.value()); + SERIAL_MON.print(F(" Meters=")); + SERIAL_MON.print(gps->altitude.meters()); + SERIAL_MON.print(F(" Miles=")); + SERIAL_MON.print(gps->altitude.miles()); + SERIAL_MON.print(F(" KM=")); + SERIAL_MON.print(gps->altitude.kilometers()); + SERIAL_MON.print(F(" Feet=")); + SERIAL_MON.println(gps->altitude.feet()); + } + + if (gps->satellites.isUpdated()) + { + SERIAL_MON.print(F("SATELLITES Fix Age=")); + SERIAL_MON.print(gps->satellites.age()); + SERIAL_MON.print(F("ms Value=")); + SERIAL_MON.println(gps->satellites.value()); + } + + if (gps->hdop.isUpdated()) + { + SERIAL_MON.print(F("HDOP Fix Age=")); + SERIAL_MON.print(gps->hdop.age()); + SERIAL_MON.print(F("ms Value=")); + SERIAL_MON.println(gps->hdop.value()); + } + + if (gps->charsProcessed() < 10) + Serial.println(F("WARNING: No GPS data. Check wiring.")); + last = millis(); + Serial.println(); + } + + SERIAL_MON.println(); + + // /* Get BME sensor data */ + // getEnvironmentalData(); + + delay(500); + + delay(2500); +} diff --git a/src/sh_battery.cpp b/src/sh_battery.cpp new file mode 100644 index 0000000..aae26d1 --- /dev/null +++ b/src/sh_battery.cpp @@ -0,0 +1,13 @@ +/** + * @file sh_battery.cpp + * @author your name (you@domain.com) + * @brief + * @version 0.1 + * @date 2022-05-30 + * + * @copyright Copyright (c) 2022 + * + */ + + + diff --git a/src/sh_bme280.cpp b/src/sh_bme280.cpp new file mode 100644 index 0000000..d6ca98a --- /dev/null +++ b/src/sh_bme280.cpp @@ -0,0 +1,55 @@ +/** + * @file sh_bme280.cpp + * @author your name (you@domain.com) + * @brief + * @version 0.1 + * @date 2022-05-28 + * + * @copyright Copyright (c) 2022 + * + */ + +#include "configuration.h" + +#if defined BME280 +#include "sh_bme280.h" + +void setupBME280() +{ + SERIAL_MON.println("[BME280] Initializing ..."); + + SERIAL_MON.println(bme.begin()); + // if (!bme.begin()) + // { + // SERIAL_MON.println("[BME280] Missing, check configuration ..."); + // while (1) + // delay(10); + // } + + SERIAL_MON.println("[BME280] Setting forced mode and sampling rate ..."); + + // clang-format off + bme.setSampling(Adafruit_BME280::MODE_FORCED, + Adafruit_BME280::SAMPLING_X16, + Adafruit_BME280::SAMPLING_X16, + Adafruit_BME280::SAMPLING_X16, + Adafruit_BME280::FILTER_OFF, + Adafruit_BME280::STANDBY_MS_0_5); + // clang-format on + + SERIAL_MON.println("[BME280] Initialized"); +} + +/** + * @brief Get the Environmental Data object + * + */ +void getEnvironmentalData() +{ + bme.takeForcedMeasurement(); + temperature = bme.readTemperature(); + humidity = bme.readHumidity(); + pressure = bme.readPressure(); +} + +#endif diff --git a/src/sh_board.cpp b/src/sh_board.cpp new file mode 100644 index 0000000..8a6b31b --- /dev/null +++ b/src/sh_board.cpp @@ -0,0 +1,94 @@ +/** + * @file sh_board.cpp + * @author your name (you@domain.com) + * @brief + * @version 0.1 + * @date 2022-05-29 + * + * @copyright Copyright (c) 2022 + * + */ +#include "sh_board.h" + +void setupBoard() +{ + pinMode(POWER_EN_PIN, OUTPUT); + digitalWrite(POWER_EN_PIN, HIGH); + + SERIAL_MON.begin(115200); + SERIAL_MON.println("Start\n"); + delay(2000); + + SERIAL_MON.println("[Peripherals] Initializing ..."); + SERIAL_MON.flush(); + + ledInit(); + + buttonInit(); + + i2cInit(); + + SERIAL_MON.println("[Peripherals] Initialized"); +} + +void i2cInit() +{ + SERIAL_MON.println("[I2C] Initializing ..."); + + Wire.setPins(SDA_PIN, SCL_PIN); + Wire.begin(); + delay(500); + + SERIAL_MON.println("[I2C] Initialized"); +} + +void spiInit() +{ + SERIAL_MON.println("[SPI] Initializing ..."); + + // SPI.setPins(LORA_MISO, LORA_SCLK, LORA_MOSI); + SERIAL_MON.println("[SPI] Initialized"); +} + +void ledInit() +{ + SERIAL_MON.println("[LEDs] Initializing ..."); + + pinMode(RED_LED_PIN, OUTPUT); + pinMode(BLUE_LED_PIN, OUTPUT); + pinMode(GREEN_LED_PIN, OUTPUT); + digitalWrite(RED_LED_PIN, LOW); + digitalWrite(BLUE_LED_PIN, LOW); + digitalWrite(GREEN_LED_PIN, LOW); + + int i = 10; + while (i--) + { + digitalWrite(BLUE_LED_PIN, !digitalRead(BLUE_LED_PIN)); + digitalWrite(RED_LED_PIN, !digitalRead(RED_LED_PIN)); + digitalWrite(GREEN_LED_PIN, !digitalRead(GREEN_LED_PIN)); + delay(300); + } + + digitalWrite(BLUE_LED_PIN, HIGH); + digitalWrite(RED_LED_PIN, HIGH); + digitalWrite(GREEN_LED_PIN, HIGH); + + delay(100); + + digitalWrite(RED_LED_PIN, LOW); + digitalWrite(BLUE_LED_PIN, LOW); + digitalWrite(GREEN_LED_PIN, LOW); + + SERIAL_MON.println("[LEDs] Initialized"); +} + +void buttonInit() +{ + SERIAL_MON.println("[Buttons] Initializing ..."); + + pinMode(BUTTON_PIN, INPUT_PULLUP); + pinMode(TOUCH_PIN, INPUT_PULLUP); + + SERIAL_MON.println("[Buttons] Initialized"); +} \ No newline at end of file diff --git a/src/sh_gps.cpp b/src/sh_gps.cpp new file mode 100644 index 0000000..c608b34 --- /dev/null +++ b/src/sh_gps.cpp @@ -0,0 +1,45 @@ +/** + * @file sh_gps.cpp + * @author your name (you@domain.com) + * @brief + * @version 0.1 + * @date 2022-05-27 + * + * @copyright Copyright (c) 2022 + * + */ + +#include "sh_gps.h" + +void setupGPS() +{ + SERIAL_MON.println("[GPS] Initializing ..."); + + SERIAL_GPS.setPins(GPS_RX_PIN, GPS_TX_PIN); + SERIAL_GPS.begin(4800); + delay(250); + SERIAL_GPS.write("$PCAS01,1*1D\r\n"); + delay(250); + SERIAL_GPS.end(); + delay(250); + SERIAL_GPS.begin(9600); + delay(250); + + // pinMode(GPS_PPS_PIN, INPUT); + + pinMode(GPS_WAKEUP_PIN, OUTPUT); + digitalWrite(GPS_WAKEUP_PIN, HIGH); + + delay(10); + pinMode(GPS_RESET_PIN, OUTPUT); + digitalWrite(GPS_RESET_PIN, HIGH); + delay(10); + digitalWrite(GPS_RESET_PIN, LOW); + delay(10); + digitalWrite(GPS_RESET_PIN, HIGH); + gps = new TinyGPSPlus(); + + delay(500); + + SERIAL_MON.println("[GPS] Initialized ..."); +} diff --git a/src/sh_logo.cpp b/src/sh_logo.cpp new file mode 100644 index 0000000..b337ab0 --- /dev/null +++ b/src/sh_logo.cpp @@ -0,0 +1,630 @@ +#include "sh_logo.h" +#include + +const unsigned char Fichte[] PROGMEM = { + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFD, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF0, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE0, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE0, 0X01, 0XFF, 0XFF, 0XFF, + 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X01, 0XFF, 0XFF, + 0XFF, 0XF8, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X01, 0XFF, + 0XFF, 0XFF, 0XE0, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X01, + 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, + 0X01, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0X01, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X7F, 0XE0, 0X01, 0XFF, 0XFF, 0XF8, 0X00, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X7F, 0XE0, 0X01, 0XFF, 0XFF, 0XE0, 0X00, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF0, 0X7F, 0XE0, 0X01, 0XFF, 0XFF, 0X80, + 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE0, 0X7F, 0XE0, 0X01, 0XFF, 0XFF, + 0X00, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X80, 0X7F, 0XE0, 0X01, 0XFF, + 0XFC, 0X00, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X7F, 0XE0, 0X01, + 0XFF, 0XF8, 0X00, 0X00, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X7F, 0XE0, + 0X01, 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X7F, + 0XE0, 0X01, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, + 0X7F, 0XE0, 0X01, 0XFF, 0X00, 0X00, 0X00, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, + 0X00, 0X7F, 0XE0, 0X01, 0XFC, 0X00, 0X00, 0X00, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X00, 0X00, 0X7F, 0XE0, 0X01, 0XF0, 0X00, 0X00, + 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X00, 0X00, 0X7F, 0XE0, 0X01, 0XE0, 0X00, + 0X00, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF0, 0X00, 0X00, 0X7F, 0XE0, 0X01, 0X80, + 0X00, 0X00, 0X04, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0XFF, 0XE0, 0X00, + 0X00, 0X00, 0X00, 0X1C, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X03, 0XFF, 0XE0, + 0X00, 0X00, 0X00, 0X00, 0X3C, 0X00, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X0F, 0XFF, + 0XE0, 0X00, 0X00, 0X00, 0X00, 0XFC, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X1F, + 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X03, 0XFC, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, + 0X7F, 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X0F, 0XFC, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, + 0X00, 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X1F, + 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, + 0X00, 0X03, 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X00, + 0X7F, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XE0, 0X00, 0X00, + 0X01, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XE0, 0X00, + 0X00, 0X03, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF8, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XE0, + 0X00, 0X00, 0X0F, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0XFF, 0XFF, 0XFF, + 0XE0, 0X00, 0X00, 0X3F, 0XFF, 0XFC, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X01, 0XFF, 0XFF, + 0XFF, 0XE0, 0X00, 0X00, 0XFF, 0XFF, 0XFC, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X07, 0XFF, + 0XFF, 0XFF, 0XE0, 0X00, 0X01, 0XFF, 0XFF, 0XFC, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X0F, + 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X07, 0XFF, 0XFF, + 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X1F, 0XFF, + 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, + 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X3F, + 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, + 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, + 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, + 0X03, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0X0F, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF8, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE0, 0X1F, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFC, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X01, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X03, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X00, 0X0F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XEF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, + 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, + 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X80, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF8, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X00, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X03, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X00, 0X07, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X00, + 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, + 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XC0, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE0, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X00, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X0F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X00, + 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, + 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X0F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X03, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X01, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, + 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0X07, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X80, 0X00, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE0, 0X01, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X01, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE0, 0X00, 0XFF, 0XFF, 0XFF, 0XFC, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X3F, 0XFF, 0XFF, + 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X0F, 0XFF, + 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, + 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X07, + 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X80, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, + 0X01, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE0, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XE0, + 0X00, 0X00, 0X7F, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0X00, 0XFF, 0X3F, 0XFF, 0XFF, + 0XE0, 0X00, 0X00, 0X1F, 0XFF, 0XFC, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X01, 0XF8, 0X07, 0XFF, + 0XFF, 0XE0, 0X00, 0X00, 0X0F, 0XFF, 0XFC, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X03, 0XF0, 0X03, + 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X03, 0XFF, 0XFC, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XE0, + 0X01, 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X00, 0XFF, + 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, + 0XC0, 0X00, 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X00, + 0X7F, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF7, 0X80, 0X00, 0XFF, 0XFF, 0XE0, 0X00, 0X00, + 0X00, 0X1F, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X80, 0X00, 0XFF, 0XFF, 0XE0, 0X00, + 0X00, 0X00, 0X07, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X7F, 0XFF, 0XE0, + 0X00, 0X00, 0X00, 0X01, 0XFC, 0X00, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XC0, 0XFF, 0X80, 0X00, 0X7F, 0XFF, + 0XE0, 0X00, 0X00, 0X00, 0X00, 0XFC, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X00, 0XFF, 0X80, 0X00, 0X7B, + 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X3C, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFE, 0X1F, 0X00, 0XFF, 0X80, 0X00, + 0XF9, 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X0C, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE0, 0X1F, 0X00, 0XFF, 0XC0, + 0X00, 0XF0, 0X7F, 0XE0, 0X01, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X1F, 0X00, 0XFF, + 0XC0, 0X01, 0XF0, 0X3F, 0XE0, 0X01, 0XC0, 0X00, + 0X00, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XE0, 0X1F, 0X00, + 0XFF, 0XE0, 0X01, 0XF0, 0X0F, 0XE0, 0X01, 0XF0, + 0X00, 0X00, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XE0, 0X1F, + 0X00, 0XFF, 0XF0, 0X03, 0XE0, 0X03, 0XE0, 0X01, + 0XF8, 0X00, 0X00, 0X00, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X01, 0XE0, + 0X1F, 0X00, 0XFF, 0XFC, 0X0F, 0XC0, 0X01, 0XE0, + 0X01, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X01, + 0XE0, 0X1F, 0X80, 0X7F, 0XFF, 0XFF, 0XC0, 0X00, + 0X60, 0X01, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X01, 0XE0, 0X1F, 0X80, 0X7F, 0XFF, 0XFF, 0X00, + 0X00, 0X20, 0X01, 0XFF, 0XC0, 0X00, 0X00, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X01, 0XF0, 0X1F, 0X80, 0X7F, 0XFF, 0XFF, + 0X00, 0X00, 0X00, 0X01, 0XFF, 0XF0, 0X00, 0X00, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X01, 0XF0, 0X0F, 0XC0, 0X3F, 0XFF, + 0XFF, 0XC0, 0X00, 0X00, 0X01, 0XFF, 0XF8, 0X00, + 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X00, 0XF0, 0X0F, 0XC0, 0X1F, + 0XFF, 0XFF, 0XE0, 0X00, 0X00, 0X01, 0XFF, 0XFE, + 0X00, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0XF0, 0X0F, 0XC0, + 0X1F, 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0X01, 0XFF, + 0XFF, 0X80, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0XF8, 0X07, + 0XE0, 0X0F, 0XFF, 0XFF, 0XFE, 0X00, 0X00, 0X01, + 0XFF, 0XFF, 0XC0, 0X00, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0XF8, + 0X07, 0XF0, 0X03, 0XFF, 0XFF, 0XFF, 0X00, 0X00, + 0X01, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, + 0X78, 0X03, 0XF0, 0X01, 0XFF, 0XFF, 0XFF, 0XC0, + 0X00, 0X01, 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X80, 0X7C, 0X03, 0XF8, 0X00, 0X7F, 0XFC, 0X7F, + 0XE0, 0X00, 0X01, 0XFF, 0XFF, 0XFE, 0X00, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X80, 0X7C, 0X01, 0XFC, 0X00, 0X0F, 0XE0, + 0X7F, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0X80, + 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XC0, 0X3E, 0X00, 0XFE, 0X00, 0X00, + 0X00, 0X7F, 0XFC, 0X00, 0X01, 0XFF, 0XFF, 0XFF, + 0XC0, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC0, 0X3E, 0X00, 0XFF, 0X00, + 0X00, 0X00, 0X7F, 0XFF, 0X00, 0X01, 0XFF, 0XFF, + 0XFF, 0XF0, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X1F, 0X00, 0X7F, + 0X80, 0X00, 0X00, 0X3F, 0XFF, 0X80, 0X01, 0XFF, + 0XFF, 0XFF, 0XF8, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X1F, 0X00, + 0X3F, 0XC0, 0X00, 0X00, 0X3F, 0XFF, 0XE0, 0X01, + 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X0F, + 0X80, 0X1F, 0XF0, 0X00, 0X00, 0X3F, 0XFF, 0XF8, + 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, + 0X0F, 0XC0, 0X0F, 0XFC, 0X00, 0X00, 0X7F, 0XFF, + 0XFC, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF0, 0X07, 0XE0, 0X07, 0XFF, 0X80, 0X03, 0XFF, + 0XFF, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF8, 0X07, 0XE0, 0X03, 0XFF, 0XF8, 0X3F, + 0XFF, 0XFF, 0XFF, 0X81, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0X03, 0XF0, 0X00, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XE1, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X01, 0XF8, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0XFC, 0X00, + 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFD, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0XFE, + 0X00, 0X03, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, + 0X7F, 0X80, 0X00, 0X3F, 0XF8, 0X1F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X00, 0X3F, 0XC0, 0X00, 0X00, 0X00, 0X0F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X80, 0X1F, 0XE0, 0X00, 0X00, 0X00, 0X0F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XC0, 0X0F, 0XF8, 0X00, 0X00, 0X00, + 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE0, 0X03, 0XFE, 0X00, 0X00, + 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X01, 0XFF, 0X80, + 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0XFF, + 0XE0, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X3F, 0XFC, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X00, 0X0F, 0XFF, 0XF0, 0X1F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X80, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X1F, 0XFF, 0XFF, + 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X01, 0XFF, + 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, + 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, + 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X80, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0X00, 0X03, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X07, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF +}; diff --git a/src/sh_lora.cpp b/src/sh_lora.cpp new file mode 100644 index 0000000..33d523b --- /dev/null +++ b/src/sh_lora.cpp @@ -0,0 +1,10 @@ +/** + * @file sh_lora.cpp + * @author your name (you@domain.com) + * @brief + * @version 0.1 + * @date 2022-05-28 + * + * @copyright Copyright (c) 2022 + * + */ diff --git a/test/README b/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html