Hardware components | ||||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Recently, one of my many nieces told me she had brought a hamster and was very excited by it. For one mad moment, I had an idea to make her a device for tracking the exercise of her new pet. To begin with, it was going to be a simple odometer, but once I started, the project expanded and in the end, I had to stop myself coming up with evermore features!
The main microprocessor is an ESP8266, which I selected for a few reasons.
- I wanted to see the differences between an ESP and Arduino
- Physical size
- Processor speed
- Power usage, as I knew the unit would be powered by battery
Although the sketch is fairly long, that is only because of the different screens being displayed on the TFT panel.
The unit has a single sensor, which is a reed switch, connected by a 3.5mm jack plug. The reed switch is positioned next to the hamster’s wheel and when the magnet passes by, the unit records the event accordingly. This data is then used to update the screens, such as:
- Odometer
- Current session
- Last seven sessions – time
- Last seven sessions – distance
The user has the ability to set the wheel circumference, as well as the start screen to display when the unit is physically powered on. There is a master reset and the choice to load demo data.
Using the EEPROM within the ESP8266, I also record the total distance travelled since the start, as well as the last seven sessions, so should the battery fail, the data is not lost.
Other elements of the device, is a D1 Mini battery charging shield, which I have linked to the ESP8266 via a voltage divider and the analogue input. The voltage divider includes a potentiometer, so the reading of the battery can be accurately calibrated during construction.
I have now started a full stack development course, so one of my plans is to use the onboard wireless of the ESP 8266 and link it to a website. But that's for another day.
/*
Name: Pet_Bit.ino
Created: 10/4/2020 12:03:28 PM
Author: Christopher Cooper
*/
// Libraries.
#include <Adafruit_GFX.h> // Core graphics library.
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735.
#include <Fonts/FreeMono9pt7b.h> // Special font for displays.
#include <SPI.h> // SPI bus for TFT using software SPI.
#include <ESP8266WiFi.h> // ESP8266 library required for low power mode function.
#include <eeprom.h> // EEPROM library.
#include "startScreen.h" // Start screen bitmap.
#include "catStartScreen.h" // Cat start screen bitmap.
#include "batteryIcons.h" // Battery level bitmaps.
// Special ESP8266 settings.
extern "C" { // Required for ESP8266 sleep mode.
#include "gpio.h"
}
extern "C" { // Required for ESP8266 sleep mode.
#include "user_interface.h"
}
#define FPM_SLEEP_MAX_TIME 0xFFFFFFF // Sets ESP sleep mode for maximum duration.
// TFT SPI Interface for ESP 8266 using software SPI.
#define TFT_RST 4 // Reset // D2 on ESP8266.
#define TFT_DC 5 // Data command or AO // D1 on ESP8266.
#define TFT_MOSI 13 // Software data out // D7 on ESP8266.
#define TFT_SCLK 14 // Software clock out // D5 on ESP8266.
#define TFT_CS 15 // Chip select // D8 on ESP8266.
// Pin out Configuration.
byte bPlus = 1; // Button + // TX on ESP8266.
byte bMinus = 3; // Button - // RX on ESP8266.
const int lcdBackLightPin = 16; // D0 on ESP8266.
const int interruptMenuButton = 0; // D3 on ESP8266.
const int interruptWakeButton = 2; // D4 on ESP8266.
const int interruptWheelSensor = 12; // D6 on ESP8266.
// Float map function as inbuilt map function doesnt support floats.
float mapf(float x, float in_min, float in_max, float out_min, float out_max) {
float a = x - in_min;
float b = out_max - out_min;
float c = in_max - in_min;
return a * b / c + out_min;
}
// Configure ST7735 display.
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
boolean screenRedraw = 0;
// Global variables.
int screenMenu; // Screen menu selection.
byte configurationFlag = 0; // Configuration menu flag.
volatile byte displayBackLight = 1; // Enable / disable LCD back light.
volatile byte wakeInterrupt = 1; // Set wake interupt flag.
volatile unsigned int distanceCounter = 0; // Counting rotations for distance travelled.
volatile unsigned long passedTime; // Setting time to calculate speed.
volatile unsigned long startTime; // Setting time to calculate speed.
volatile unsigned long lastRotation1; // Checking if wheel is still turning.
volatile unsigned long lastRotation2; // Checking if wheel is still turning.
float circumference; // Wheel circumference.
float circImperial; // Conversion into MPH.
float distanceTravelled = 0.00; // Total distance travelled.
float speedKph = 0.00;
float speedMph = 0.00;
float rpm = 0.00;
float maxKphSpeed = 0; // Recording max speed.
char rpmArray[7]; // Holding data in character arrays for formatting reasons.
char kphArray[7];
char mphArray[7];
char maxKphArray[7];
char averageKphSpeedArray[7];
char sessionDistanceArray[7];
char currentSessionTimeArray[7];
// Configure EEEPROM.
int eeMenuAddress = 0; // EEPROM address for start menu position.
int eeMenuSetting; // Actual commit for writing, 4 bytes.
boolean eeMenuSettingChange = false; // Used for menu scrolling before committing to save EEPROM writes.
int eeCircAddress = 4; // EEPROM address for circumference.
float eeCircSetting; // Actual commit for writing, 4 bytes.
boolean eeCircSettingChange = false; // Used for circumference setting before committing to save EEPROM writes.
int eeTotalDistanceAddress = 8; // EEPROM address for total distance.
unsigned long eeTotalDistance; // Actual commit for writing, 4 bytes.
boolean eeTotalDistanceChange = false; // Used for total distance before committing to save EEPROM writes.
int eeSessionTimeArray1Address = 16; // EEPROM address for session time 1
unsigned long eeSessionTime1; // Actual commit for writing, 4 bytes.
int eeSessionTimeArray2Address = 20; // EEPROM address for session time 2
unsigned long eeSessionTime2; // Actual commit for writing, 4 bytes.
int eeSessionTimeArray3Address = 24; // EEPROM address for session time 3
unsigned long eeSessionTime3; // Actual commit for writing, 4 bytes.
int eeSessionTimeArray4Address = 28; // EEPROM address for session time 4
unsigned long eeSessionTime4; // Actual commit for writing, 4 bytes.
int eeSessionTimeArray5Address = 32; // EEPROM address for session time 5
unsigned long eeSessionTime5; // Actual commit for writing, 4 bytes.
int eeSessionTimeArray6Address = 36; // EEPROM address for session time 6
unsigned long eeSessionTime6; // Actual commit for writing, 4 bytes.
int eeSessionTimeArray7Address = 40; // EEPROM address for session time 7
unsigned long eeSessionTime7; // Actual commit for writing, 4 bytes.
int eeSessionDistanceArray1Address = 44; // EEPROM address for session distance 1
unsigned int eeSessionDistance1; // Actual commit for writing, 4 bytes.
int eeSessionDistanceArray2Address = 48; // EEPROM address for session distance 2
unsigned int eeSessionDistance2; // Actual commit for writing, 4 bytes.
int eeSessionDistanceArray3Address = 52; // EEPROM address for session distance 3
unsigned int eeSessionDistance3; // Actual commit for writing, 4 bytes.
int eeSessionDistanceArray4Address = 56; // EEPROM address for session distance 4
unsigned int eeSessionDistance4; // Actual commit for writing, 4 bytes.
int eeSessionDistanceArray5Address = 60; // EEPROM address for session distance 5
unsigned int eeSessionDistance5; // Actual commit for writing, 4 bytes.
int eeSessionDistanceArray6Address = 64; // EEPROM address for session distance 6
unsigned int eeSessionDistance6; // Actual commit for writing, 4 bytes.
int eeSessionDistanceArray7Address = 68; // EEPROM address for session distance 7
unsigned int eeSessionDistance7; // Actual commit for writing, 4 bytes.
boolean eeSessionChange = false; // Used for session time before committing to save EEPROM writes.
int eeResetSettingAddress = 72; // EEPROM address for master reset
unsigned int eeResetSetting; // Actual commit for writing, 1 byte.
boolean eeResetSettingChange = false; // Used for reset setting change before committing to save EEPROM writes.
int eeSessionArrayPositionAddress = 76; // EEPROM address for array position.
unsigned int eeSessionArrayPosition; // Actual commit for writing, 4 bytes.
// Average calculation variables.
const int numReadings = 10;
float readings[numReadings]; // Latest Kph readings.
int readIndex = 0; // The index of the current reading.
float total = 0.00; // The running total of the readings.
float averageKphSpeed = 0.00; // The average speed.
// Session time variables.
unsigned long sessionTimeCap = 10; // Set cap for graph if statements.
boolean recordSessions = 0; // Flag to trigger the recording of each session.
volatile boolean sessionTimeFlag = 0; // Flag to trigger the recording of each session.
volatile unsigned long sessionStartTime; // Time each pt session starts.
unsigned long sessionTimeArray[7]; // Array for storing 7 sessions.
byte sessionArrayPosition = 0; // Array position, this is also used for the distance array position.
volatile unsigned long sessionTimeMillis; // Time each pt session in millis.
volatile unsigned int sessionTime; // Time each pt session in minutes.
unsigned int sessionTimeArray1; // These variables are needed for the Kris Kasprzak charts.
unsigned int sessionTimeArray2;
unsigned int sessionTimeArray3;
unsigned int sessionTimeArray4;
unsigned int sessionTimeArray5;
unsigned int sessionTimeArray6;
unsigned int sessionTimeArray7;
// Session distance variables.
unsigned int distanceGraphCap = 20; // Set cap for graph if statements.
float sessionStartDistance = 0.00;
float sessionDistance; // Session distance.
unsigned int distanceTravelledArray[7]; // Array for storing 7 sessions.
unsigned int distanceTravelledArray1; // These variables are needed for the Kris Kasprzak charts.
unsigned int distanceTravelledArray2;
unsigned int distanceTravelledArray3;
unsigned int distanceTravelledArray4;
unsigned int distanceTravelledArray5;
unsigned int distanceTravelledArray6;
unsigned int distanceTravelledArray7;
// Battery measurement variables.
#define sensitivity (4 / 1024.0) // Battery sensitivity setting.
unsigned long batteryMeasureInterval = 600000; // Battery measuring interval.
unsigned long batteryMeasureNow;
float sensorValue;
float sensorValueVolts;
float sensorValuePerc;
// Kris Kasprzak Variables.
boolean dial_1 = true; // XPH dial.
boolean graph_1 = true; // Bar graph.
boolean graph_2 = true;
boolean graph_3 = true;
boolean graph_4 = true;
boolean graph_5 = true;
boolean graph_6 = true;
boolean graph_7 = true;
boolean graph_8 = true; // Bar graph.
boolean graph_9 = true;
boolean graph_10 = true;
boolean graph_11 = true;
boolean graph_12 = true;
boolean graph_13 = true;
boolean graph_14 = true;
// Define colours.
// http://www.barth-dev.de/online/rgb565-color-picker/
#define LTBLUE 0xB6DF
#define LTTEAL 0xBF5F
#define LTGREEN 0xBFF7
#define LTCYAN 0xC7FF
#define LTRED 0xFD34
#define LTMAGENTA 0xFD5F
#define LTYELLOW 0xFFF8
#define LTORANGE 0xFE73
#define LTPINK 0xFDDF
#define LTPURPLE 0xCCFF
#define LTGREY 0xE71C
#define BLUE 0x001F
#define TEAL 0x0438
#define GREEN 0x07E0
#define CYAN 0x07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define ORANGE 0xFD20
#define PINK 0xF81F
#define PURPLE 0x801F
#define GREY 0xC618
#define WHITE 0xFFFF
#define BLACK 0x0000
#define DKBLUE 0x000D
#define DKTEAL 0x020C
#define DKGREEN 0x03E0
#define DKCYAN 0x03EF
#define DKRED 0x6000
#define DKMAGENTA 0x8008
#define DKYELLOW 0x8400
#define DKORANGE 0x8200
#define DKPINK 0x9009
#define DKPURPLE 0x4010
#define DKGREY 0x4A49
// Define fonts.
#include <Fonts/FreeMonoBoldOblique12pt7b.h>
#include <Fonts/FreeSans9pt7b.h>
/*-----------------------------------------------------------------*/
void setup() {
// Set pin modes.
pinMode(interruptMenuButton, INPUT_PULLUP); // Menu selection interrupt button.
pinMode(interruptWakeButton, INPUT_PULLUP); // Wake up and sleep interrupt button.
pinMode(interruptWheelSensor, INPUT_PULLUP); // Wheel sensor (REED switch).
pinMode(bPlus, INPUT_PULLUP); // Menu button 1.
pinMode(bMinus, INPUT_PULLUP); // Menu button 2.
pinMode(lcdBackLightPin, OUTPUT); // Output for LCD back light.
digitalWrite(lcdBackLightPin, HIGH); // Outout for LCD back light.
// Configure interrupts.
attachInterrupt(digitalPinToInterrupt(interruptMenuButton), screenMenuISR, FALLING);
attachInterrupt(digitalPinToInterrupt(interruptWakeButton), wakeInterruptISR, FALLING);
gpio_pin_wakeup_enable(GPIO_ID_PIN(interruptWakeButton), GPIO_PIN_INTR_LOLEVEL);
attachInterrupt(digitalPinToInterrupt(interruptWheelSensor), rotationInterruptISR, FALLING);
// Configure EEPROM.
EEPROM.begin(512);
EEPROM.get(eeResetSettingAddress, eeResetSetting);
/*
*
* This line is used for initial ESP8266 power on from manufacture to set EEPROM, comment out once uploaded and re-upload.
*
* resetSystemDemoData();
*/
if (eeResetSetting == 1) {
resetSystemData();
}
else if (eeResetSetting == 2) {
resetSystemDemoData();
}
// Load previous settings and last recorded data.
EEPROM.get(eeMenuAddress, eeMenuSetting);
EEPROM.get(eeCircAddress, eeCircSetting);
EEPROM.get(eeMenuAddress, screenMenu);
EEPROM.get(eeCircAddress, circumference);
EEPROM.get(eeTotalDistanceAddress, distanceCounter);
EEPROM.get(eeSessionArrayPositionAddress, sessionArrayPosition);
EEPROM.commit();
EEPROM.get(eeSessionTimeArray1Address, sessionTimeArray[0]);
EEPROM.get(eeSessionTimeArray2Address, sessionTimeArray[1]);
EEPROM.get(eeSessionTimeArray3Address, sessionTimeArray[2]);
EEPROM.get(eeSessionTimeArray4Address, sessionTimeArray[3]);
EEPROM.get(eeSessionTimeArray5Address, sessionTimeArray[4]);
EEPROM.get(eeSessionTimeArray6Address, sessionTimeArray[5]);
EEPROM.get(eeSessionTimeArray7Address, sessionTimeArray[6]);
EEPROM.commit();
sessionTimeArray1 = sessionTimeArray[0] / 1000 / 60;
sessionTimeArray2 = sessionTimeArray[1] / 1000 / 60;
sessionTimeArray3 = sessionTimeArray[2] / 1000 / 60;
sessionTimeArray4 = sessionTimeArray[3] / 1000 / 60;
sessionTimeArray5 = sessionTimeArray[4] / 1000 / 60;
sessionTimeArray6 = sessionTimeArray[5] / 1000 / 60;
sessionTimeArray7 = sessionTimeArray[6] / 1000 / 60;
EEPROM.get(eeSessionDistanceArray1Address, distanceTravelledArray[0]);
EEPROM.get(eeSessionDistanceArray2Address, distanceTravelledArray[1]);
EEPROM.get(eeSessionDistanceArray3Address, distanceTravelledArray[2]);
EEPROM.get(eeSessionDistanceArray4Address, distanceTravelledArray[3]);
EEPROM.get(eeSessionDistanceArray5Address, distanceTravelledArray[4]);
EEPROM.get(eeSessionDistanceArray6Address, distanceTravelledArray[5]);
EEPROM.get(eeSessionDistanceArray7Address, distanceTravelledArray[6]);
EEPROM.commit();
distanceTravelledArray1 = distanceTravelledArray[0];
distanceTravelledArray2 = distanceTravelledArray[1];
distanceTravelledArray3 = distanceTravelledArray[2];
distanceTravelledArray4 = distanceTravelledArray[3];
distanceTravelledArray5 = distanceTravelledArray[4];
distanceTravelledArray6 = distanceTravelledArray[5];
distanceTravelledArray7 = distanceTravelledArray[6];
// Ensure menu position, circumference & array position are within parametres.
if (screenMenu < 0 || screenMenu > 4) {
screenMenu = 0;
} // Close if.
if (circumference < 0 || circumference > 2) {
circumference = 1.0;
} // Close if.
if (sessionArrayPosition < 0 || sessionArrayPosition > 6) {
sessionArrayPosition = 0;
} // Close if.
// Initialise TFT display.
tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab.
tft.setRotation(1);
tft.setCursor(0, 0);
tft.fillScreen(ST77XX_BLACK);
// Start up screen, hamster image.
tft.fillScreen(ST77XX_WHITE);
int h = 80, w = 112, row, col, buffidx = 0;
for (row = 16; row < h; row++) { // For each scanline.
for (col = 48; col < w; col++) { // For each pixel, read from Flash Memory, since image is stored as uint16_t, pgm_read_word is used as it uses 16bit address.
tft.drawPixel(col, row, pgm_read_word(startScreen + buffidx));
buffidx++;
} // End for loop.
} // End for loop.
tft.setFont(&FreeSans9pt7b);
tft.setTextSize(1);
tft.setTextColor(ST77XX_BLACK);
tft.setCursor(55, 105);
tft.println("PetBit");
delay(2000);
tft.fillScreen(ST77XX_BLACK);
// Configure rotation parametres.
circImperial = circumference * 0.62137; // convert metric to imperial for MPH calculations.
// Blank speed & distance variables.
rpm = 0.00;
speedKph = 0.00;
speedMph = 0.00;
maxKphSpeed = 0.00;
averageKphSpeed = 0.00;
sessionDistance = 0.00;
// Set average array to 0.
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;
}
// Set battery measuring period and check initial capacity.
batteryMeasureNow = millis() - batteryMeasureInterval; // Set initial level so first measurement is made.
batteryLevel(); // Calculates battery level.
batteryMeasureNow = millis(); // Reset measurement to match interval.
} // Close setup.
/*-----------------------------------------------------------------*/
void loop() {
mainData(); // Calculates main data.
batteryLevel(); // Calculates battery level.
lcdBackLight(); // Interrupt to disable back light.
lightSleep(); // Interrupt to send ESP to sleep.
averageSpeed(); // Calculate average speed.
if (screenMenu == 0) {
if (screenRedraw == 1) {
tft.fillScreen(ST77XX_BLACK);
screenRedraw = 0;
} // Close if.
configurationDisplay(); // Start up display.
} // Close if.
if (screenMenu == 1) {
if (screenRedraw == 1) {
tft.fillScreen(ST77XX_BLACK);
screenRedraw = 0;
} // Close if.
XphDialScreen(tft, 80, 64, 60, 0, 20, 2, 210, speedKph, 2, 0, RED, WHITE, BLACK, "Xph", dial_1); // XPH dial screen function.
} // Close if.
if (screenMenu == 2) {
if (screenRedraw == 1) {
tft.fillScreen(ST77XX_BLACK);
screenRedraw = 0;
} // Close if.
CurrentExerciseScreen(); // Current exercise screen.
} // Close if.
if (screenMenu == 3) {
if (screenRedraw == 1) {
tft.fillScreen(ST77XX_BLACK);
screenRedraw = 0;
} // Close if.
// Session time bar graphs.
if (sessionTimeArray1 <= 10) {
ptSessionTimeV1(tft, 1, 110, 8, 80, 0, 10, 1, sessionTimeArray1, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "1", graph_1);
} // Close if.
else ((ptSessionTimeV1(tft, 1, 110, 8, 80, 0, 10, 1, sessionTimeCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "1", graph_1)));
if (sessionTimeArray2 <= 10) {
ptSessionTimeV2(tft, 21, 110, 8, 80, 0, 10, 1, sessionTimeArray2, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "2", graph_2);
} // Close if.
else ((ptSessionTimeV2(tft, 21, 110, 8, 80, 0, 10, 1, sessionTimeCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "2", graph_2)));
if (sessionTimeArray3 <= 10) {
ptSessionTimeV2(tft, 41, 110, 8, 80, 0, 10, 1, sessionTimeArray3, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "3", graph_3);
} // Close if.
else ((ptSessionTimeV2(tft, 41, 110, 8, 80, 0, 10, 1, sessionTimeCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "3", graph_3)));
if (sessionTimeArray4 <= 10) {
ptSessionTimeV2(tft, 61, 110, 8, 80, 0, 10, 1, sessionTimeArray4, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "4", graph_4);
} // Close if.
else ((ptSessionTimeV2(tft, 61, 110, 8, 80, 0, 10, 1, sessionTimeCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "4", graph_4)));
if (sessionTimeArray5 <= 10) {
ptSessionTimeV2(tft, 81, 110, 8, 80, 0, 10, 1, sessionTimeArray5, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "5", graph_5);
} // Close if.
else ((ptSessionTimeV2(tft, 81, 110, 8, 80, 0, 10, 1, sessionTimeCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "5", graph_5)));
if (sessionTimeArray6 <= 10) {
ptSessionTimeV2(tft, 101, 110, 8, 80, 0, 10, 1, sessionTimeArray6, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "6", graph_6);
} // Close if.
else ((ptSessionTimeV2(tft, 101, 110, 8, 80, 0, 10, 1, sessionTimeCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "6", graph_6)));
if (sessionTimeArray7 <= 10) {
ptSessionTimeV3(tft, 121, 110, 8, 80, 0, 10, 1, sessionTimeArray7, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "7", graph_7);
} // Close if.
else ((ptSessionTimeV3(tft, 121, 110, 8, 80, 0, 10, 1, sessionTimeCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "7", graph_7)));
} // Close if.
if (screenMenu == 4) {
if (screenRedraw == 1) {
tft.fillScreen(ST77XX_BLACK);
screenRedraw = 0;
} // Close if.
// Distance bar graphs.
if (distanceTravelledArray1 <= 15) {
ptSessionDistanceV1(tft, 1, 110, 8, 80, 0, 20, 2, distanceTravelledArray1, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "1", graph_8);
} // Close if.
else if (distanceTravelledArray1 >= 20) {
ptSessionDistanceV1(tft, 1, 110, 8, 80, 0, 20, 2, distanceGraphCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "1", graph_8);
} // Close else if.
else ((ptSessionDistanceV1(tft, 1, 110, 8, 80, 0, 20, 2, distanceTravelledArray1, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "1", graph_8)));
if (distanceTravelledArray2 <= 15) {
ptSessionDistanceV2(tft, 21, 110, 8, 80, 0, 20, 2, distanceTravelledArray2, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "2", graph_9);
} // Close if.
else if (distanceTravelledArray2 >= 20) {
ptSessionDistanceV2(tft, 21, 110, 8, 80, 0, 20, 2, distanceGraphCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "2", graph_9);
} // Close else if.
else ((ptSessionDistanceV2(tft, 21, 110, 8, 80, 0, 20, 2, distanceTravelledArray2, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "2", graph_9)));
if (distanceTravelledArray3 <= 15) {
ptSessionDistanceV2(tft, 41, 110, 8, 80, 0, 20, 2, distanceTravelledArray3, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "3", graph_10);
} // Close if.
else if (distanceTravelledArray3 >= 20) {
ptSessionDistanceV2(tft, 41, 110, 8, 80, 0, 20, 2, distanceGraphCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "3", graph_10);
} // Close else if.
else ((ptSessionDistanceV2(tft, 41, 110, 8, 80, 0, 20, 2, distanceTravelledArray3, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "3", graph_10)));
if (distanceTravelledArray4 <= 15) {
ptSessionDistanceV2(tft, 61, 110, 8, 80, 0, 20, 2, distanceTravelledArray4, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "4", graph_11);
} // Close if.
else if (distanceTravelledArray4 >= 20) {
ptSessionDistanceV2(tft, 61, 110, 8, 80, 0, 20, 2, distanceGraphCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "4", graph_11);
} // Close else if.
else ((ptSessionDistanceV2(tft, 61, 110, 8, 80, 0, 20, 2, distanceTravelledArray4, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "4", graph_11)));
if (distanceTravelledArray5 <= 15) {
ptSessionDistanceV2(tft, 81, 110, 8, 80, 0, 20, 2, distanceTravelledArray5, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "5", graph_12);
} // Close if.
else if (distanceTravelledArray5 >= 20) {
ptSessionDistanceV2(tft, 81, 110, 8, 80, 0, 20, 2, distanceGraphCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "5", graph_12);
} // Close else if.
else ((ptSessionDistanceV2(tft, 81, 110, 8, 80, 0, 20, 2, distanceTravelledArray5, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "5", graph_12)));
if (distanceTravelledArray6 <= 15) {
ptSessionDistanceV2(tft, 101, 110, 8, 80, 0, 20, 2, distanceTravelledArray6, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "6", graph_13);
} // Close if.
else if (distanceTravelledArray6 >= 20) {
ptSessionDistanceV2(tft, 101, 110, 8, 80, 0, 20, 2, distanceGraphCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "6", graph_13);
} // Close else if.
else ((ptSessionDistanceV2(tft, 101, 110, 8, 80, 0, 20, 2, distanceTravelledArray6, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "6", graph_13)));
if (distanceTravelledArray7 <= 15) {
ptSessionDistanceV3(tft, 121, 110, 8, 80, 0, 20, 2, distanceTravelledArray7, 3, 0, CYAN, DKGREY, WHITE, WHITE, BLACK, "7", graph_14);
} // Close if.
else if (distanceTravelledArray7 >= 20) {
ptSessionDistanceV3(tft, 121, 110, 8, 80, 0, 20, 2, distanceGraphCap, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "7", graph_14);
} // Close else if.
else ((ptSessionDistanceV3(tft, 121, 110, 8, 80, 0, 20, 2, distanceTravelledArray7, 3, 0, RED, DKGREY, WHITE, WHITE, BLACK, "7", graph_14)));
} // Close if.
// Check for new max speed.
if (speedKph > maxKphSpeed) {
maxKphSpeed = speedKph;
} // Close if.
// Calculate average speed & remove any minus calculations.
averageKphSpeed = total / numReadings;
if (averageKphSpeed < 0.99) {
averageKphSpeed = 0.00;
} // Close if.
} // Close loop.
/*-----------------------------------------------------------------*/
void batteryLevel() {
if (millis() >= batteryMeasureNow + batteryMeasureInterval) {
// Battery voltage level detection.
sensorValue = analogRead(A0);
sensorValueVolts = sensorValue * sensitivity;
// mapf(input_value, in_min, in_max, out_min, out_max).
sensorValuePerc = mapf(sensorValueVolts, 3.0, 4.0, 0, 100);
batteryMeasureNow = millis();
} // Close if.
} // Close function.
/*-----------------------------------------------------------------*/
void mainData() {
// Set speed variables to "0.00" if the wheel doesnt turn for X period (currently 4000ms).
if (lastRotation2 < millis()) {
rpm = 0.00;
speedKph = 0.00;
speedMph = 0.00;
recordSessions = 1;
eeSessionChange = true;
} // Close if.
else {
// Calculate current session time.
sessionTimeMillis = millis() - sessionStartTime;
sessionTime = sessionTimeMillis / 10 / 60;
} // Close else.
// Ensure data is always "0" or greater, if not set to "0"
if ((rpm >= 0) || (speedKph >= 0) || (speedMph >= 0)) {
} // Close if.
else {
rpm = 0.00;
speedKph = 0.00;
speedMph = 0.00;
} // Close else.
if ((sessionTimeFlag == 1) && (recordSessions == 1)) { // Calculate session duration.
sessionTimeArray[sessionArrayPosition] = millis() - sessionStartTime; // Calculate last session time in millis & store into array.
distanceTravelledArray[sessionArrayPosition] = distanceTravelled - sessionStartDistance; // Store distance travelled into array.
if (eeSessionChange == true) {
switch (sessionArrayPosition) {
case 0:
sessionTimeArray1 = sessionTimeArray[0] / 1000 / 60; // Divided by 1000 for millis to seconds, then divided by 60 for minutes.
distanceTravelledArray1 = distanceTravelledArray[0]; // Update chart data.
EEPROM.put(eeSessionTimeArray1Address, sessionTimeArray[0]); // Record the chart data in EEPROM.
EEPROM.put(eeSessionDistanceArray1Address, distanceTravelledArray[0]); // Record the chart data in EEPROM.
EEPROM.commit();
eeSessionChange = false;
case 1:
sessionTimeArray2 = sessionTimeArray[1] / 1000 / 60;
distanceTravelledArray2 = distanceTravelledArray[1];
EEPROM.put(eeSessionTimeArray2Address, sessionTimeArray[1]);
EEPROM.put(eeSessionDistanceArray2Address, distanceTravelledArray[1]);
EEPROM.commit();
eeSessionChange = false;
case 2:
sessionTimeArray3 = sessionTimeArray[2] / 1000 / 60;
distanceTravelledArray3 = distanceTravelledArray[2];
EEPROM.put(eeSessionTimeArray3Address, sessionTimeArray[2]);
EEPROM.put(eeSessionDistanceArray3Address, distanceTravelledArray[2]);
EEPROM.commit();
eeSessionChange = false;
case 3:
sessionTimeArray4 = sessionTimeArray[3] / 1000 / 60;
distanceTravelledArray4 = distanceTravelledArray[3];
EEPROM.put(eeSessionTimeArray4Address, sessionTimeArray[3]);
EEPROM.put(eeSessionDistanceArray4Address, distanceTravelledArray[3]);
EEPROM.commit();
eeSessionChange = false;
case 4:
sessionTimeArray5 = sessionTimeArray[4] / 1000 / 60;
distanceTravelledArray5 = distanceTravelledArray[4];
EEPROM.put(eeSessionTimeArray5Address, sessionTimeArray[4]);
EEPROM.put(eeSessionDistanceArray5Address, distanceTravelledArray[4]);
EEPROM.commit();
eeSessionChange = false;
case 5:
sessionTimeArray6 = sessionTimeArray[5] / 1000 / 60;
distanceTravelledArray6 = distanceTravelledArray[5];
EEPROM.put(eeSessionTimeArray6Address, sessionTimeArray[5]);
EEPROM.put(eeSessionDistanceArray6Address, distanceTravelledArray[5]);
EEPROM.commit();
eeSessionChange = false;
case 6:
sessionTimeArray7 = sessionTimeArray[6] / 1000 / 60;
distanceTravelledArray7 = distanceTravelledArray[6];
EEPROM.put(eeSessionTimeArray7Address, sessionTimeArray[6]);
EEPROM.put(eeSessionDistanceArray7Address, distanceTravelledArray[6]);
EEPROM.commit();
eeSessionChange = false;
} // Close switch case.
} // Close if.
sessionArrayPosition++; // Increment sessionTimeArrayPosition.
if (sessionArrayPosition >= 7) { // Check array position is within parametres.
sessionArrayPosition = 0;
} // Close if.
EEPROM.put(eeSessionArrayPositionAddress, sessionArrayPosition); // Record the next array position in EEPROM.
EEPROM.commit();
sessionTimeFlag = 0;
recordSessions = 0;
if (eeTotalDistanceChange == true) {
EEPROM.put(eeTotalDistanceAddress, distanceCounter);
EEPROM.commit();
eeTotalDistanceChange = false;
} // Close if.
} // Close if.
// Calculate current session distance travelled.
sessionDistance = distanceTravelled - sessionStartDistance;
if (maxKphSpeed == 0) { // Reset start up session distance displayed to zero, otherwise it displays current total distance.
sessionDistance = 0;
} // Close if.
if (sessionTime == 0) {
// Reset max speed.
maxKphSpeed = 0;
} // Close if.
/*
Configure speed varibales to the same format for screen layout using dtostrf.
dtostrf(floatvar, StringLengthIncDecimalPoint, numVarsAfterDecimal, charbuf);
where
floatvar float variable.
StringLengthIncDecimalPoint This is the length of the string that will be created.
numVarsAfterDecimal The number of digits after the deimal point to print.
charbuf The array to store the results*/
dtostrf(rpm, 6, 2, rpmArray);
dtostrf(speedKph, 6, 2, kphArray);
dtostrf(speedMph, 6, 2, mphArray);
dtostrf(maxKphSpeed, 6, 2, maxKphArray);
dtostrf(averageKphSpeed, 6, 2, averageKphSpeedArray);
dtostrf(sessionDistance, 6, 0, sessionDistanceArray);
dtostrf(sessionTime, 6, 0, currentSessionTimeArray);
} // Close function.
/*-----------------------------------------------------------------*/
void configurationDisplay() {
// Drawing thicker rectangle with for loop, function, X, Y, W, H, colour.
for (uint16_t a = 0; a < 2; a++) {
tft.drawRect(0 + a, 0 + a, 158, 127, WHITE);
} // Close for loop.
EEPROM.get(eeMenuAddress, eeMenuSetting);
EEPROM.get(eeCircAddress, eeCircSetting);
EEPROM.get(eeResetSettingAddress, eeResetSetting);
tft.setCursor(0, 0);
tft.setFont(&FreeSans9pt7b);
tft.setTextSize(1);
tft.setTextColor(ST77XX_WHITE);
tft.setCursor(27, 20);
tft.println("Battery Level");
tft.setFont();
tft.setTextSize(1);
tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
tft.setCursor(35, 28);
tft.print("V: ");
tft.println(sensorValueVolts);
tft.setCursor(35, 38);
tft.print("%: ");
tft.println(int(sensorValuePerc));
tft.println();
if (sensorValuePerc > 95) {
drawBatteryBitmap(27, 90, ccBatt100, 32, 18);
}
else if (sensorValuePerc > 79 && sensorValuePerc < 95) {
drawBatteryBitmap(27, 90, ccBatt80, 32, 18);
}
else if (sensorValuePerc > 59 && sensorValuePerc < 80) {
drawBatteryBitmap(27, 90, ccBatt60, 32, 18);
}
else if (sensorValuePerc > 39 && sensorValuePerc < 60) {
drawBatteryBitmap(27, 90, ccBatt40, 32, 18);
}
else if (sensorValuePerc > 19 && sensorValuePerc < 40) {
drawBatteryBitmap(27, 90, ccBatt20, 32, 18);
}
else if (sensorValuePerc < 20) {
drawBatteryBitmap(27, 90, ccBatt00, 32, 18);
}
tft.setFont(&FreeSans9pt7b);
tft.setTextSize(1);
tft.setTextColor(ST77XX_WHITE);
tft.setCursor(27, 65);
tft.println("Configuration");
tft.setFont();
tft.setTextSize(1);
tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
if (configurationFlag == 3) {
tft.setTextColor(ST77XX_RED, ST77XX_BLACK);
} // Close if.
else tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
tft.setCursor(15, 70);
tft.print("System Reset : ");
tft.println(eeResetSetting);
if (configurationFlag == 2) {
tft.setTextColor(ST77XX_RED, ST77XX_BLACK);
} // Close if.
else tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
tft.setCursor(15, 80);
tft.print("Circumference : ");
tft.println(eeCircSetting);
tft.println();
tft.setCursor(15, 90);
if (configurationFlag == 1) {
tft.setTextColor(ST77XX_RED, ST77XX_BLACK);
} // Close if.
else tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
tft.print("Screen Menu Strt : ");
tft.println(eeMenuSetting);
tft.setCursor(15, 105);
tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
tft.print("Total Distance To Date");
tft.setCursor(70, 115);
tft.println(distanceTravelled = distanceCounter * circumference);
if (digitalRead(bPlus) == LOW && (digitalRead(bMinus) == LOW)) {
if (configurationFlag == 4) {
configurationFlag = 0;
}
configurationFlag++;
} // Close if.
if (digitalRead(bPlus) == LOW && configurationFlag == 1)
{
if (eeMenuSetting == 4)
{
eeMenuSetting = 0;
eeMenuSettingChange = true;
}
else
{
eeMenuSetting++;
eeMenuSettingChange = true;
}
} // Close if.
if (digitalRead(bMinus) == LOW && configurationFlag == 1)
{
if (eeMenuSetting == 0)
{
eeMenuSetting = 4;
eeMenuSettingChange = true;
}
else
{
eeMenuSetting--;
eeMenuSettingChange = true;
}
} // Close if.
// Write menu setting to EEPROM.
if (eeMenuSettingChange == true) {
EEPROM.put(eeMenuAddress, eeMenuSetting);
EEPROM.commit();
eeMenuSettingChange = false;
} // Close if.
if (digitalRead(bPlus) == LOW && configurationFlag == 2)
{
if (eeCircSetting > 2.00)
{
eeCircSetting = 0.00;
eeCircSettingChange = true;
}
else
{
eeCircSetting = eeCircSetting + 0.01;
eeCircSettingChange = true;
}
} // Close if.
if (digitalRead(bMinus) == LOW && configurationFlag == 2)
{
if (eeCircSetting < 0.00)
{
eeCircSetting = 2.00;
eeCircSettingChange = true;
}
else
{
eeCircSetting = eeCircSetting - 0.01;
eeCircSettingChange = true;
}
} // Close if.
// Write debug setting to EEPROM.
if (eeCircSettingChange == true) {
EEPROM.put(eeCircAddress, eeCircSetting);
EEPROM.commit();
eeCircSettingChange = false;
} // Close if.
if (digitalRead(bPlus) == LOW && configurationFlag == 3)
{
if (eeResetSetting == 2)
{
eeResetSetting = 0;
eeResetSettingChange = true;
}
else
{
eeResetSetting++;
eeResetSettingChange = true;
}
} // Close if.
if (digitalRead(bMinus) == LOW && configurationFlag == 3)
{
if (eeResetSetting == 0)
{
eeResetSetting = 2;
eeResetSettingChange = true;
}
else
{
eeResetSetting--;
eeResetSettingChange = true;
}
} // Close if.
// Write menu setting to EEPROM.
if (eeResetSettingChange == true) {
EEPROM.put(eeResetSettingAddress, eeResetSetting);
EEPROM.commit();
eeResetSettingChange = false;
} // Close if.
} // Close function.
/*-----------------------------------------------------------------*/
void CurrentExerciseScreen() {
// Drawing thicker rectangle with Foor Loop, function, X, Y, W, H, colour.
for (uint16_t a = 0; a < 2; a++) {
tft.drawRect(0 + a, 0 + a, 159, 127, WHITE);
} // Close for loop.
tft.setFont(&FreeSans9pt7b);
tft.setTextSize(1);
tft.setTextColor(ST77XX_WHITE);
tft.setCursor(14, 20);
tft.print("Current Session");
tft.setTextSize(1);
tft.setTextColor(ST77XX_WHITE);
tft.setCursor(15, 40);
tft.print("Xph: ");
tft.setCursor(15, 60);
tft.print("Ave: ");
tft.setCursor(15, 80);
tft.print("Max: ");
tft.setCursor(15, 100);
tft.print("Dis: ");
tft.setCursor(15, 120);
tft.print("Time: ");
tft.setFont();
tft.setTextSize(2);
tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
tft.setCursor(72, 28);
tft.println(kphArray);
tft.setCursor(72, 48);
tft.println(averageKphSpeedArray);
tft.setCursor(72, 68);
tft.println(maxKphArray);
tft.setCursor(72, 88);
tft.println(sessionDistanceArray);
tft.setCursor(72, 108);
tft.println(currentSessionTimeArray);
} // Close function.
/*-----------------------------------------------------------------*/
void XphDialScreen(Adafruit_ST7735& Screen, int cx, int cy, int r, int loval, double hival, double inc, double sa, double curval, int dig, int dec, unsigned int needlecolor, unsigned int dialcolor, unsigned int textcolor, String label, boolean& redraw) {
double ix, iy, ox, oy, tx, ty, lx, rx, ly, ry, i, offset, stepval, data, angle;
double degtorad = .0174532778;
static double px = cx, py = cy, pix = cx, piy = cy, plx = cx, ply = cy, prx = cx, pry = cy;
// Draw the dial only one time--this will minimize flicker.
if (redraw == true) {
redraw = false;
Screen.fillCircle(cx, cy, r - 2, dialcolor);
Screen.drawCircle(cx, cy, r, needlecolor);
Screen.drawCircle(cx, cy, r - 1, needlecolor);
Screen.setTextColor(textcolor, dialcolor);
Screen.setTextSize(1);
Screen.setFont(&FreeSans9pt7b);
Screen.setCursor(cx - 15, cy + 30);
Screen.println(label);
Screen.setFont();
}
// Draw the current value.
Screen.setTextSize(1);
Screen.setTextColor(textcolor, dialcolor);
Screen.setCursor(cx - 7, cy + 40);
Screen.println(Format(curval, dig, dec));
// Center the scale about the vertical axis--and use this to offset the needle, and scale text.
offset = (270 + sa / 2) * degtorad;
// Find the scale step value based on the hival low val and the scale sweep angle.
// Deducting a small value to eliminate round off errors, this val may need to be adjusted.
stepval = (inc) * (double(sa) / (double(hival - loval))) + .00;
// Draw the scale and numbers, note draw this each time to repaint where the needle was.
for (i = 0; i <= sa; i += stepval) {
angle = (i * degtorad);
angle = offset - angle;
ox = (r - 2) * cos(angle) + cx;
oy = (r - 2) * sin(angle) + cy;
ix = (r - 10) * cos(angle) + cx;
iy = (r - 10) * sin(angle) + cy;
tx = (r - 10) * cos(angle) + cx;
ty = (r - 15) * sin(angle) + cy;
Screen.drawLine(ox, oy, ix, iy, textcolor);
Screen.setTextSize(1.5);
Screen.setTextColor(textcolor, dialcolor);
Screen.setCursor(tx - 7, ty);
data = hival - (i * (inc / stepval));
Screen.println(Format(data, dig, dec));
}
// Compute and draw the needle.
angle = (sa * (1 - (((curval - loval) / (hival - loval)))));
angle = angle * degtorad;
angle = offset - angle;
ix = (r - 10) * cos(angle) + cx;
iy = (r - 10) * sin(angle) + cy;
// Draw a triangle for the needle (compute and store 3 vertiticies).
lx = 5 * cos(angle - 90 * degtorad) + cx;
ly = 5 * sin(angle - 90 * degtorad) + cy;
rx = 5 * cos(angle + 90 * degtorad) + cx;
ry = 5 * sin(angle + 90 * degtorad) + cy;
// First draw the previous needle in dial color to hide it, note draw performance for triangle is pretty bad.
//d.fillTriangle (pix, piy, plx, ply, prx, pry, dialcolor);
//d.fillTriangle (pix, piy, plx, ply, prx, pry, dialcolor);
//d.fillTriangle (pix, piy, plx, ply, prx - 20, pry - 20, dialcolor);
//d.fillTriangle (pix, piy, prx, pry, prx + 20, pry + 20, dialcolor);
Screen.fillTriangle(pix, piy, plx, ply, prx, pry, dialcolor);
Screen.drawTriangle(pix, piy, plx, ply, prx, pry, dialcolor);
// Then draw the old needle in need color to display it.
Screen.fillTriangle(ix, iy, lx, ly, rx, ry, needlecolor);
Screen.drawTriangle(ix, iy, lx, ly, rx, ry, textcolor);
// Draw a cute little dial center.
Screen.fillCircle(cx, cy, 8, textcolor);
//Save all current to old so the previous dial can be hidden.
pix = ix;
piy = iy;
plx = lx;
ply = ly;
prx = rx;
pry = ry;
} // Close function.
/*-----------------------------------------------------------------*/
void ptSessionTimeV1(Adafruit_ST7735& Screen, double x, double y, double w, double h, double loval, double hival, double inc, double curval, int dig, int dec, unsigned int barcolor, unsigned int voidcolor, unsigned int bordercolor, unsigned int textcolor, unsigned int backcolor, String label, boolean& redraw) {
Screen.setFont(&FreeSans9pt7b);
Screen.setTextSize(1);
Screen.setTextColor(ST77XX_WHITE);
Screen.setCursor(20, 20);
Screen.println("Session Times");
Screen.setFont();
double stepval, range;
double my, level;
double i, data;
// draw the border, scale, and label once.
// avoid doing this on every update to minimize flicker.
if (redraw == true) {
redraw = false;
Screen.drawRect(x - 1, y - h - 1, w + 2, h + 2, bordercolor);
Screen.setTextColor(textcolor, backcolor);
Screen.setTextSize(1);
Screen.setCursor(x + 2, y + 7);
Screen.println(label);
// step val basically scales the hival and low val to the height
// deducting a small value to eliminate round off errors
// this val may need to be adjusted.
stepval = (inc) * (double(h) / (double(hival - loval))) - 0;
for (i = 0; i <= h; i += stepval) {
my = y - h + i;
Screen.drawFastHLine(x + w + 1, my + 1, 5, textcolor);
// draw lables
Screen.setTextSize(1);
Screen.setTextColor(BLACK, backcolor);
Screen.setCursor(x + w + 12, my - 3);
data = hival - (i * (inc / stepval));
Screen.println(Format(data, dig, dec));
Screen.setFont();
}
}
// compute level of bar graph that is scaled to the height and the hi and low vals
// this is needed to accompdate for +/- range
level = (h * (((curval - loval) / (hival - loval))));
// draw the bar graph
// write a upper and lower bar to minimize flicker cause by blanking out bar and redraw on update
Screen.fillRect(x, y - h, w, h - level, voidcolor);
Screen.fillRect(x, y - level + 1, w, level, barcolor);
// write the current value
/*
tft.setTextColor(textcolor, backcolor);
tft.setTextSize(1);
tft.setCursor(x , y - h - 23);
tft.println(Format(curval, dig, dec));
*/
} // Close function.
/*-----------------------------------------------------------------*/
void ptSessionTimeV2(Adafruit_ST7735& Screen, double x, double y, double w, double h, double loval, double hival, double inc, double curval, int dig, int dec, unsigned int barcolor, unsigned int voidcolor, unsigned int bordercolor, unsigned int textcolor, unsigned int backcolor, String label, boolean& redraw) {
double stepval, range;
double my, level;
double i, data;
// draw the border, scale, and label once
// avoid doing this on every update to minimize flicker
if (redraw == true) {
redraw = false;
Screen.drawRect(x - 1, y - h - 1, w + 2, h + 2, bordercolor);
Screen.setTextColor(textcolor, backcolor);
Screen.setTextSize(1);
Screen.setCursor(x + 2, y + 7);
Screen.println(label);
// step val basically scales the hival and low val to the height
// deducting a small value to eliminate round off errors
// this val may need to be adjusted
stepval = (inc) * (double(h) / (double(hival - loval))) - 0;
for (i = 0; i <= h; i += stepval) {
my = y - h + i;
Screen.drawFastHLine(x + w + 1, my + 1, 5, textcolor);
// draw lables
Screen.setTextSize(1);
Screen.setTextColor(BLACK, backcolor);
Screen.setCursor(x + w + 12, my - 3);
data = hival - (i * (inc / stepval));
Screen.println(Format(data, dig, dec));
}
}
// compute level of bar graph that is scaled to the height and the hi and low vals
// this is needed to accompdate for +/- range
level = (h * (((curval - loval) / (hival - loval))));
// draw the bar graph
// write a upper and lower bar to minimize flicker cause by blanking out bar and redraw on update
Screen.fillRect(x, y - h, w, h - level, voidcolor);
Screen.fillRect(x, y - level + 1, w, level, barcolor);
// write the current value
/*
tft.setTextColor(textcolor, backcolor);
tft.setTextSize(1);
tft.setCursor(x , y - h - 23);
tft.println(Format(curval, dig, dec));
*/
} // Close function.
/*-----------------------------------------------------------------*/
void ptSessionTimeV3(Adafruit_ST7735& Screen, double x, double y, double w, double h, double loval, double hival, double inc, double curval, int dig, int dec, unsigned int barcolor, unsigned int voidcolor, unsigned int bordercolor, unsigned int textcolor, unsigned int backcolor, String label, boolean& redraw) {
double stepval, range;
double my, level;
double i, data;
// draw the border, scale, and label once
// avoid doing this on every update to minimize flicker
if (redraw == true) {
redraw = false;
Screen.drawRect(x - 1, y - h - 1, w + 2, h + 2, bordercolor);
Screen.setTextColor(textcolor, backcolor);
Screen.setTextSize(1);
Screen.setCursor(x + 2, y + 7);
Screen.println(label);
// step val basically scales the hival and low val to the height
// deducting a small value to eliminate round off errors
// this val may need to be adjusted
stepval = (inc) * (double(h) / (double(hival - loval))) - 0;
for (i = 0; i <= h; i += stepval) {
my = y - h + i;
Screen.drawFastHLine(x + w + 1, my + 1, 5, textcolor);
// draw lables
Screen.setTextSize(1);
Screen.setTextColor(textcolor, backcolor);
Screen.setCursor(x + w + 12, my - 3);
data = hival - (i * (inc / stepval));
Screen.println(Format(data, dig, dec));
}
}
// compute level of bar graph that is scaled to the height and the hi and low vals
// this is needed to accompdate for +/- range
level = (h * (((curval - loval) / (hival - loval))));
// draw the bar graph
// write a upper and lower bar to minimize flicker cause by blanking out bar and redraw on update
Screen.fillRect(x, y - h, w, h - level, voidcolor);
Screen.fillRect(x, y - level + 1, w, level, barcolor);
// write the current value
/*
tft.setTextColor(textcolor, backcolor);
tft.setTextSize(1);
tft.setCursor(x , y - h - 23);
tft.println(Format(curval, dig, dec));
*/
} // Close function.
/*-----------------------------------------------------------------*/
void ptSessionDistanceV1(Adafruit_ST7735& Screen, double x, double y, double w, double h, double loval, double hival, double inc, double curval, int dig, int dec, unsigned int barcolor, unsigned int voidcolor, unsigned int bordercolor, unsigned int textcolor, unsigned int backcolor, String label, boolean& redraw)
{
Screen.setFont(&FreeSans9pt7b);
Screen.setTextSize(1);
Screen.setTextColor(ST77XX_WHITE);
Screen.setCursor(4, 20);
Screen.println("Session Distances");
Screen.setFont();
double stepval, range;
double my, level;
double i, data;
// draw the border, scale, and label once.
// avoid doing this on every update to minimize flicker.
if (redraw == true) {
redraw = false;
Screen.drawRect(x - 1, y - h - 1, w + 2, h + 2, bordercolor);
Screen.setTextColor(textcolor, backcolor);
Screen.setTextSize(1);
Screen.setCursor(x + 2, y + 7);
Screen.println(label);
// step val basically scales the hival and low val to the height
// deducting a small value to eliminate round off errors
// this val may need to be adjusted.
stepval = (inc) * (double(h) / (double(hival - loval))) - 0;
for (i = 0; i <= h; i += stepval) {
my = y - h + i;
Screen.drawFastHLine(x + w + 1, my, 5, textcolor);
// draw lables
Screen.setTextSize(1);
Screen.setTextColor(BLACK, backcolor);
Screen.setCursor(x + w + 12, my - 3);
data = hival - (i * (inc / stepval));
Screen.println(Format(data, dig, dec));
Screen.setFont();
}
}
// compute level of bar graph that is scaled to the height and the hi and low vals
// this is needed to accompdate for +/- range
level = (h * (((curval - loval) / (hival - loval))));
// draw the bar graph
// write a upper and lower bar to minimize flicker cause by blanking out bar and redraw on update
Screen.fillRect(x, y - h, w, h - level, voidcolor);
Screen.fillRect(x, y - level + 1, w, level, barcolor);
// write the current value
/*
tft.setTextColor(textcolor, backcolor);
tft.setTextSize(1);
tft.setCursor(x , y - h - 23);
tft.println(Format(curval, dig, dec));
*/
} // Close function.
/*-----------------------------------------------------------------*/
void ptSessionDistanceV2(Adafruit_ST7735& Screen, double x, double y, double w, double h, double loval, double hival, double inc, double curval, int dig, int dec, unsigned int barcolor, unsigned int voidcolor, unsigned int bordercolor, unsigned int textcolor, unsigned int backcolor, String label, boolean& redraw)
{
double stepval, range;
double my, level;
double i, data;
// draw the border, scale, and label once
// avoid doing this on every update to minimize flicker
if (redraw == true) {
redraw = false;
Screen.drawRect(x - 1, y - h - 1, w + 2, h + 2, bordercolor);
Screen.setTextColor(textcolor, backcolor);
Screen.setTextSize(1);
Screen.setCursor(x + 2, y + 7);
Screen.println(label);
// step val basically scales the hival and low val to the height
// deducting a small value to eliminate round off errors
// this val may need to be adjusted
stepval = (inc) * (double(h) / (double(hival - loval))) - 0;
for (i = 0; i <= h; i += stepval) {
my = y - h + i;
Screen.drawFastHLine(x + w + 1, my, 5, textcolor);
// draw lables
Screen.setTextSize(1);
Screen.setTextColor(BLACK, backcolor);
Screen.setCursor(x + w + 12, my - 3);
data = hival - (i * (inc / stepval));
Screen.println(Format(data, dig, dec));
}
}
// compute level of bar graph that is scaled to the height and the hi and low vals
// this is needed to accompdate for +/- range
level = (h * (((curval - loval) / (hival - loval))));
// draw the bar graph
// write a upper and lower bar to minimize flicker cause by blanking out bar and redraw on update
Screen.fillRect(x, y - h, w, h - level, voidcolor);
Screen.fillRect(x, y - level + 1, w, level, barcolor);
// write the current value
/*
tft.setTextColor(textcolor, backcolor);
tft.setTextSize(1);
tft.setCursor(x , y - h - 23);
tft.println(Format(curval, dig, dec));
*/
} // Close function.
/*-----------------------------------------------------------------*/
void ptSessionDistanceV3(Adafruit_ST7735& Screen, double x, double y, double w, double h, double loval, double hival, double inc, double curval, int dig, int dec, unsigned int barcolor, unsigned int voidcolor, unsigned int bordercolor, unsigned int textcolor, unsigned int backcolor, String label, boolean& redraw)
{
double stepval, range;
double my, level;
double i, data;
// draw the border, scale, and label once
// avoid doing this on every update to minimize flicker
if (redraw == true) {
redraw = false;
Screen.drawRect(x - 1, y - h - 1, w + 2, h + 2, bordercolor);
Screen.setTextColor(textcolor, backcolor);
Screen.setTextSize(1);
Screen.setCursor(x + 2, y + 7);
Screen.println(label);
// step val basically scales the hival and low val to the height
// deducting a small value to eliminate round off errors
// this val may need to be adjusted
stepval = (inc) * (double(h) / (double(hival - loval))) - 0;
for (i = 0; i <= h; i += stepval) {
my = y - h + i;
Screen.drawFastHLine(x + w + 1, my, 5, textcolor);
// draw lables
Screen.setTextSize(1);
Screen.setTextColor(textcolor, backcolor);
Screen.setCursor(x + w + 7, my - 3);
data = hival - (i * (inc / stepval));
Screen.println(Format(data, dig, dec));
}
}
// compute level of bar graph that is scaled to the height and the hi and low vals
// this is needed to accompdate for +/- range
level = (h * (((curval - loval) / (hival - loval))));
// draw the bar graph
// write a upper and lower bar to minimize flicker cause by blanking out bar and redraw on update
Screen.fillRect(x, y - h, w, h - level, voidcolor);
Screen.fillRect(x, y - level + 1, w, level, barcolor);
// write the current value
/*
tft.setTextColor(textcolor, backcolor);
tft.setTextSize(1);
tft.setCursor(x , y - h - 23);
tft.println(Format(curval, dig, dec));
*/
} // Close function.
/*-----------------------------------------------------------------*/
String Format(double val, int dec, int dig) {
int addpad = 0;
char sbuf[20];
String condata = (dtostrf(val, dec, dig, sbuf));
int slen = condata.length();
for (addpad = 1; addpad <= dec + dig - slen; addpad++) {
condata = " " + condata;
}
return (condata);
} // Close function.
/*-----------------------------------------------------------------*/
void averageSpeed() {
// Subtract the last reading.
total = total - readings[readIndex];
// Get latest Kph.
readings[readIndex] = speedKph;
// Add the reading to the total.
total = total + readings[readIndex];
// Advance to the next position in the average array.
readIndex = readIndex + 1;
// If we're at the end of the array.
if (readIndex >= numReadings) {
readIndex = 0;
} // Close if.
} // Close function.
/*-----------------------------------------------------------------*/
void lcdBackLight() {
if (displayBackLight == 0) {
digitalWrite(lcdBackLightPin, LOW);
} // Close if.
else digitalWrite(lcdBackLightPin, HIGH);
} // Close function.
/*-----------------------------------------------------------------*/
ICACHE_RAM_ATTR void screenMenuISR() {
static unsigned long last_interrupt_time = 0; // Function to solve debounce
unsigned long interrupt_time = millis();
if (interrupt_time - last_interrupt_time > 800)
{
detachInterrupt(interruptMenuButton);
if (screenMenu == 0) {
screenMenu = 1;
dial_1 = true;
screenRedraw = 1;
} // Close if.
else if (screenMenu == 1) {
screenMenu = 2;
screenRedraw = 1;
configurationFlag = 0;
} // Close else
else if (screenMenu == 2) {
screenMenu = 3;
graph_1 = true;
graph_2 = true;
graph_3 = true;
graph_4 = true;
graph_5 = true;
graph_6 = true;
graph_7 = true;
screenRedraw = 1;
} // Close else
else if (screenMenu == 3) {
screenMenu = 4;
graph_8 = true;
graph_9 = true;
graph_10 = true;
graph_11 = true;
graph_12 = true;
graph_13 = true;
graph_14 = true;
screenRedraw = 1;
} // Close else
else if (screenMenu == 4) {
screenMenu = 0;
screenRedraw = 1;
} // Close else
} // Close if.
attachInterrupt(digitalPinToInterrupt(interruptMenuButton), screenMenuISR, FALLING);
last_interrupt_time = interrupt_time;
} // Close function.
/*-----------------------------------------------------------------*/
ICACHE_RAM_ATTR void wakeInterruptISR() {
static unsigned long last_interrupt_time = 0; // Function to solve debounce
unsigned long interrupt_time = millis();
if (interrupt_time - last_interrupt_time > 50)
{
if (wakeInterrupt == 1) {
wakeInterrupt = 0;
displayBackLight = 0;
} // Close if.
else (
wakeInterrupt = 1,
displayBackLight = 1
); // Close else.
} // Close if.
last_interrupt_time = interrupt_time;
} // Close function.
/*-----------------------------------------------------------------*/
ICACHE_RAM_ATTR void rotationInterruptISR() {
static unsigned long last_interrupt_time = 0; // Function to solve debounce
unsigned long interrupt_time = millis();
if (interrupt_time - last_interrupt_time > 100) {
detachInterrupt(interruptWheelSensor);
passedTime = millis() - startTime;
startTime = millis();
rpm = (60000 * circumference) / passedTime; // Revs per minute.
speedKph = (3600 * circumference) / passedTime; // km/h.
speedMph = (3600 * circImperial) / passedTime; // Miles per hour.
distanceCounter++;
eeTotalDistanceChange = true;
distanceTravelled = distanceCounter * circumference;
if (sessionTimeFlag == 0) { // Set session timer to start.
sessionTimeFlag = 1;
sessionStartTime = millis();
sessionStartDistance = distanceTravelled;
recordSessions = 0;
} // Close if.
lastRotation1 = millis();
lastRotation2 = lastRotation1 + 4000;
attachInterrupt(digitalPinToInterrupt(interruptWheelSensor), rotationInterruptISR, FALLING);
} // Close if.
last_interrupt_time = interrupt_time;
} // Close function.
/*-----------------------------------------------------------------*/
void lightSleep() {
if (wakeInterrupt == 0) {
wifi_station_disconnect();
wifi_set_opmode_current(NULL_MODE);
wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
wifi_fpm_open(); // Enables force sleep
wifi_fpm_do_sleep(FPM_SLEEP_MAX_TIME); // Sleep for longest possible time
delay(200);
} // Close if.
else {} // Do nothing
} // Close function.
/*-----------------------------------------------------------------*/
void drawBatteryBitmap(int x, int y, const uint16_t* bitmap, int bw, int bh) {
//int h = 64, w = 64, row, col, buffidx = 0;
int buffidx = 0;
int row;
int col;
int w = bw + y;
int h = bh + x;
for (row = x; row < h; row++) { // For each scanline...
for (col = y; col < w; col++) { // For each pixel...
//To read from Flash Memory, pgm_read_XXX is required.
//Since image is stored as uint16_t, pgm_read_word is used as it uses 16bit address
tft.drawPixel(col, row, pgm_read_word(bitmap + buffidx));
buffidx++;
} // end pixel
}
} // Close function.
/*-----------------------------------------------------------------*/
void resetSystemData() {
eeMenuSetting = 0;
EEPROM.put(eeMenuAddress, eeMenuSetting);
EEPROM.commit();
eeCircSetting = 1.00;
EEPROM.put(eeCircAddress, eeCircSetting);
EEPROM.commit();
eeTotalDistance = 0.00;
EEPROM.put(eeTotalDistanceAddress, eeTotalDistance);
EEPROM.commit();
eeSessionArrayPosition = 0;
EEPROM.put(eeSessionArrayPositionAddress, eeSessionArrayPosition);
EEPROM.put(eeSessionTimeArray1Address, 0); // Populate arrays with zero data.
EEPROM.put(eeSessionTimeArray2Address, 0);
EEPROM.put(eeSessionTimeArray3Address, 0);
EEPROM.put(eeSessionTimeArray4Address, 0);
EEPROM.put(eeSessionTimeArray5Address, 0);
EEPROM.put(eeSessionTimeArray6Address, 0);
EEPROM.put(eeSessionTimeArray7Address, 0);
EEPROM.commit();
EEPROM.put(eeSessionDistanceArray1Address, 0);
EEPROM.put(eeSessionDistanceArray2Address, 0);
EEPROM.put(eeSessionDistanceArray3Address, 0);
EEPROM.put(eeSessionDistanceArray4Address, 0);
EEPROM.put(eeSessionDistanceArray5Address, 0);
EEPROM.put(eeSessionDistanceArray6Address, 0);
EEPROM.put(eeSessionDistanceArray7Address, 0);
EEPROM.commit();
eeResetSetting = 0;
EEPROM.put(eeResetSettingAddress, 0);
EEPROM.commit();
EEPROM.get(eeMenuAddress, eeMenuSetting);
EEPROM.get(eeCircAddress, eeCircSetting);
EEPROM.get(eeMenuAddress, screenMenu);
EEPROM.get(eeCircAddress, circumference);
EEPROM.get(eeTotalDistanceAddress, distanceCounter);
EEPROM.commit();
EEPROM.get(eeSessionTimeArray1Address, sessionTimeArray[0]);
EEPROM.get(eeSessionTimeArray2Address, sessionTimeArray[1]);
EEPROM.get(eeSessionTimeArray3Address, sessionTimeArray[2]);
EEPROM.get(eeSessionTimeArray4Address, sessionTimeArray[3]);
EEPROM.get(eeSessionTimeArray5Address, sessionTimeArray[4]);
EEPROM.get(eeSessionTimeArray6Address, sessionTimeArray[5]);
EEPROM.get(eeSessionTimeArray7Address, sessionTimeArray[6]);
EEPROM.commit();
sessionTimeArray1 = sessionTimeArray[0] / 1000 / 60; // Times to be updated, needs to be divided by 1000.
sessionTimeArray2 = sessionTimeArray[1] / 1000 / 60;
sessionTimeArray3 = sessionTimeArray[2] / 1000 / 60;
sessionTimeArray4 = sessionTimeArray[3] / 1000 / 60;
sessionTimeArray5 = sessionTimeArray[4] / 1000 / 60;
sessionTimeArray6 = sessionTimeArray[5] / 1000 / 60;
sessionTimeArray7 = sessionTimeArray[6] / 1000 / 60;
EEPROM.get(eeSessionDistanceArray1Address, distanceTravelledArray[0]);
EEPROM.get(eeSessionDistanceArray2Address, distanceTravelledArray[1]);
EEPROM.get(eeSessionDistanceArray3Address, distanceTravelledArray[2]);
EEPROM.get(eeSessionDistanceArray4Address, distanceTravelledArray[3]);
EEPROM.get(eeSessionDistanceArray5Address, distanceTravelledArray[4]);
EEPROM.get(eeSessionDistanceArray6Address, distanceTravelledArray[5]);
EEPROM.get(eeSessionDistanceArray7Address, distanceTravelledArray[6]);
EEPROM.commit();
distanceTravelledArray1 = distanceTravelledArray[0];
distanceTravelledArray2 = distanceTravelledArray[1];
distanceTravelledArray3 = distanceTravelledArray[2];
distanceTravelledArray4 = distanceTravelledArray[3];
distanceTravelledArray5 = distanceTravelledArray[4];
distanceTravelledArray6 = distanceTravelledArray[5];
distanceTravelledArray7 = distanceTravelledArray[6];
} // Close function.
/*-----------------------------------------------------------------*/
void resetSystemDemoData() {
eeMenuSetting = 0;
EEPROM.put(eeMenuAddress, eeMenuSetting);
EEPROM.commit();
eeCircSetting = 0.75;
EEPROM.put(eeCircAddress, eeCircSetting);
EEPROM.commit();
eeTotalDistance = 5000.00;
EEPROM.put(eeTotalDistanceAddress, eeTotalDistance);
EEPROM.commit();
eeSessionArrayPosition = 0;
EEPROM.put(eeSessionArrayPositionAddress, eeSessionArrayPosition);
EEPROM.put(eeSessionTimeArray1Address, 240000); // Populate arrays with demo data.
EEPROM.put(eeSessionTimeArray2Address, 300000);
EEPROM.put(eeSessionTimeArray3Address, 360000);
EEPROM.put(eeSessionTimeArray4Address, 420000);
EEPROM.put(eeSessionTimeArray5Address, 480000);
EEPROM.put(eeSessionTimeArray6Address, 540000);
EEPROM.put(eeSessionTimeArray7Address, 660000);
EEPROM.commit();
EEPROM.put(eeSessionDistanceArray1Address, 8);
EEPROM.put(eeSessionDistanceArray2Address, 10);
EEPROM.put(eeSessionDistanceArray3Address, 12);
EEPROM.put(eeSessionDistanceArray4Address, 14);
EEPROM.put(eeSessionDistanceArray5Address, 16);
EEPROM.put(eeSessionDistanceArray6Address, 18);
EEPROM.put(eeSessionDistanceArray7Address, 20);
EEPROM.commit();
eeResetSetting = 0;
EEPROM.put(eeResetSettingAddress, 0);
EEPROM.commit();
EEPROM.get(eeMenuAddress, eeMenuSetting);
EEPROM.get(eeCircAddress, eeCircSetting);
EEPROM.get(eeMenuAddress, screenMenu);
EEPROM.get(eeCircAddress, circumference);
EEPROM.get(eeTotalDistanceAddress, distanceCounter);
EEPROM.commit();
EEPROM.get(eeSessionTimeArray1Address, sessionTimeArray[0]);
EEPROM.get(eeSessionTimeArray2Address, sessionTimeArray[1]);
EEPROM.get(eeSessionTimeArray3Address, sessionTimeArray[2]);
EEPROM.get(eeSessionTimeArray4Address, sessionTimeArray[3]);
EEPROM.get(eeSessionTimeArray5Address, sessionTimeArray[4]);
EEPROM.get(eeSessionTimeArray6Address, sessionTimeArray[5]);
EEPROM.get(eeSessionTimeArray7Address, sessionTimeArray[6]);
EEPROM.commit();
sessionTimeArray1 = sessionTimeArray[0] / 100 / 60; // Times to be updated, needs to be divided by 1000.
sessionTimeArray2 = sessionTimeArray[1] / 100 / 60;
sessionTimeArray3 = sessionTimeArray[2] / 100 / 60;
sessionTimeArray4 = sessionTimeArray[3] / 100 / 60;
sessionTimeArray5 = sessionTimeArray[4] / 100 / 60;
sessionTimeArray6 = sessionTimeArray[5] / 100 / 60;
sessionTimeArray7 = sessionTimeArray[6] / 100 / 60;
EEPROM.get(eeSessionDistanceArray1Address, distanceTravelledArray[0]);
EEPROM.get(eeSessionDistanceArray2Address, distanceTravelledArray[1]);
EEPROM.get(eeSessionDistanceArray3Address, distanceTravelledArray[2]);
EEPROM.get(eeSessionDistanceArray4Address, distanceTravelledArray[3]);
EEPROM.get(eeSessionDistanceArray5Address, distanceTravelledArray[4]);
EEPROM.get(eeSessionDistanceArray6Address, distanceTravelledArray[5]);
EEPROM.get(eeSessionDistanceArray7Address, distanceTravelledArray[6]);
EEPROM.commit();
distanceTravelledArray1 = distanceTravelledArray[0];
distanceTravelledArray2 = distanceTravelledArray[1];
distanceTravelledArray3 = distanceTravelledArray[2];
distanceTravelledArray4 = distanceTravelledArray[3];
distanceTravelledArray5 = distanceTravelledArray[4];
distanceTravelledArray6 = distanceTravelledArray[5];
distanceTravelledArray7 = distanceTravelledArray[6];
} // Close function.
/*-----------------------------------------------------------------*/
#pragma once
#define startScreen_h
const uint16_t startScreen [] PROGMEM = { 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0820, 0x0000, 0x0000, 0x0820, 0x72c4, 0x72a4, 0x20e1, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0840, 0x1060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x20e1, 0x72a4, 0x72c4, 0x0820, 0x0000, 0x0000, 0x0820, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x4124, 0xf3d0, 0xfc10, 0xe38f, 0x69a7, 0x0000, 0x0020, 0xa3c6, 0xed69, 0x6a64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1060, 0x41a2, 0x72a4, 0x9ba6, 0xbca7, 0xe5a9, 0xfe4a, 0xfe4a, 0xf5e9, 0xd528, 0xb467, 0x93a5, 0x5a23, 0x0820, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a64, 0xed69, 0xa3c6, 0x0020, 0x0000, 0x69a7, 0xe38f, 0xfc10, 0xf3d0, 0x4124, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x4104, 0xf3f0, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xa2ab, 0x0000, 0x0020, 0xc487, 0xed69, 0x8b45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18a1, 0x8325, 0xeda9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xf5e9, 0x9bc6, 0x3962, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8325, 0xed69, 0xc487, 0x0020, 0x0000, 0xa28a, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xf3f0, 0x4104, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xdb6e, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0x9249, 0x0000, 0x4182, 0xed69, 0xe549, 0x3942, 0x0000, 0x0000, 0x28e1, 0x9366, 0xe569, 0xf5e9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xd528, 0x3982, 0x0000, 0x0000, 0x3962, 0xe549, 0xed69, 0x4182, 0x0000, 0x8a49, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xdb6e, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x6186, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfbf0, 0x28a2, 0x0000, 0x9365, 0x3122, 0x0000, 0x0840, 0x9ba6, 0xed69, 0xed69, 0xf5c9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe29, 0x8b85, 0x0820, 0x0000, 0x3142, 0x9b86, 0x0000, 0x28a2, 0xfbf0, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0x6186, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0xaaab, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xaaab, 0x0000, 0x0000, 0x0000, 0x1881, 0xc487, 0xed69, 0xed69, 0xf5c9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xdd48, 0x3962, 0x0000, 0x0000, 0x0000, 0xaaab, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xaaab, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0xd34d, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xe3af, 0x0000, 0x0000, 0x20c1, 0xccc8, 0xed69, 0xed69, 0xed89, 0xfe2a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe09, 0x41a2, 0x0000, 0x0000, 0xe3af, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xd34d, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0xfbf0, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfbf0, 0x4104, 0x0000, 0x3122, 0xdd08, 0xed69, 0xed69, 0xed69, 0xfe09, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xf5e9, 0x3142, 0x0000, 0x38e4, 0xfbf0, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfbf0, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0x1041, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0x79e8, 0x0000, 0x3142, 0xe549, 0xed69, 0xed69, 0xed69, 0xf5c9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xedc9, 0x2901, 0x0000, 0x79e8, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0x1041, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0xebaf, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xbaec, 0x0000, 0x0000, 0xc487, 0xed69, 0xed69, 0xed69, 0xed89, 0xfe2a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xe5a9, 0x4182, 0x9269, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xebaf, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0xbaec, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfbf0, 0x28c3, 0x0000, 0x6a64, 0xed69, 0xed69, 0xed69, 0xed69, 0xf5c9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfd2d, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xbaec, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x8a29, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xa2ab, 0x0000, 0x1080, 0xdd28, 0xed69, 0xed69, 0xed69, 0xed69, 0xfe09, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe2a, 0xa2ea, 0xcb2d, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0x8a29, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x30e3, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0xfbf0, 0x2082, 0x0000, 0x9b86, 0xed69, 0xed69, 0xed69, 0xed69, 0xed89, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe29, 0x0000, 0x1861, 0xfbf0, 0xfc10, 0xfc10, 0xfc10, 0xfc10, 0x30e3, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0xb2cc, 0xfc10, 0xfc10, 0xfc10, 0x9a6a, 0x0000, 0x3942, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xf5e9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x5203, 0x0000, 0x9a6a, 0xfc10, 0xfc10, 0xfc10, 0xb2cc, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x30c3, 0xfbf0, 0xfc10, 0xfbf0, 0x2082, 0x0000, 0xbc47, 0xed69, 0xed69, 0xed69, 0xed69, 0xed89, 0xfe2a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xd528, 0x0000, 0x2082, 0xfbf0, 0xfc10, 0xfbf0, 0x30c3, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x69a6, 0xfc10, 0x9a6a, 0x0000, 0x49c3, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xf5a9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x5a23, 0x0000, 0x9a6a, 0xfc10, 0x69a6, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x79e8, 0x2082, 0x0000, 0xc4a8, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xfe09, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xdd68, 0x0000, 0x2082, 0x79e8, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a23, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed89, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x6284, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0020, 0xd4e8, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xf5c9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xe589, 0x0820, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x6a84, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xfe29, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x72e4, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x28e1, 0xe549, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xf5c9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe09, 0x2901, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0020, 0xc487, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed89, 0xfe29, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xd528, 0x0020, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x8325, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xf5c9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x9385, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x4182, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed89, 0xfe2a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x49c3, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x1060, 0xd4e8, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xf5e9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xeda9, 0x1060, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x8b45, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed89, 0xfe2a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe2a, 0x9ba6, 0x4182, 0x20e1, 0xcd08, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x9bc6, 0x41a2, 0x20c1, 0xc4c7, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x9bc6, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff,
0xffff, 0xffff, 0x0000, 0x0000, 0x3142, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xf5e9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe2a, 0x5203, 0x0000, 0x0000, 0x0841, 0x5229, 0xac4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x5a23, 0x0000, 0x0000, 0x0020, 0x4a08, 0xac4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe2a, 0x3962, 0x0000, 0x0000, 0xffff, 0xffff,
0xffff, 0x0000, 0x0000, 0x0000, 0xc467, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed89, 0xfe2a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x93a5, 0x0000, 0x0841, 0x6b2d, 0xef5d, 0xa4f4, 0x524a, 0x18c1, 0xac26, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe8e, 0xfed1, 0xfe8e, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xa3e6, 0x0000, 0x0841, 0x62cc, 0xe73d, 0xad35, 0x526b, 0x18c2, 0xa406, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xd508, 0x0000, 0x0000, 0x0000, 0xffff,
0xffff, 0x0000, 0x0000, 0x3942, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xf5e9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x3962, 0x0000, 0x3146, 0xf79e, 0xffff, 0xef5d, 0x4a2a, 0x0000, 0x49c2, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4b, 0xff37, 0xff59, 0xff59, 0xff59, 0xfed2, 0xfe4a, 0xfe4a, 0xfe4a, 0x41c2, 0x0000, 0x2946, 0xe73c, 0xffff, 0xf79e, 0x524a, 0x0000, 0x41a2, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x3982, 0x0000, 0x0000, 0xffff,
0xffff, 0x0000, 0x0000, 0x9b86, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xfe29, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x0840, 0x0020, 0x49e9, 0xa4d4, 0xef7d, 0xa4f4, 0x5a8c, 0x0000, 0x1080, 0xfe4a, 0xfe4a, 0xfe4a, 0xfef2, 0xff59, 0xff59, 0xff59, 0xff59, 0xff58, 0xfe4b, 0xfe4a, 0xfe4a, 0x1080, 0x0000, 0x49e9, 0x9493, 0xef7d, 0xad35, 0x5a8c, 0x0020, 0x0860, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xa406, 0x0000, 0x0000, 0xffff,
0x0000, 0x0000, 0x1060, 0xe549, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed89, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x0020, 0x0020, 0x49e9, 0x4a09, 0x5a8c, 0x5a8c, 0x5a8c, 0x0020, 0x0860, 0xfe4a, 0xfe4a, 0xfe4a, 0xff58, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xfe8e, 0xfe4a, 0xfe4a, 0x0860, 0x0020, 0x49e9, 0x49e9, 0x5a8c, 0x5a8c, 0x5a8c, 0x0821, 0x0020, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe09, 0x1080, 0x0000, 0x0000,
0x0000, 0x0000, 0x49c3, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xf5c9, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x0840, 0x0020, 0x49e9, 0x49e9, 0x5a6b, 0x5a8c, 0x5a8b, 0x0000, 0x1080, 0xfe4a, 0xfe4a, 0xfe8e, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xfe8e, 0xfe4a, 0xfe4a, 0x1080, 0x0000, 0x49e9, 0x49e9, 0x5a6b, 0x5a8c, 0x5a8b, 0x0020, 0x0840, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x5203, 0x0000, 0x0000,
0x0000, 0x0000, 0x82e5, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xfe09, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x3962, 0x0000, 0x3146, 0x49e9, 0x522a, 0x5a6b, 0x3987, 0x0000, 0x41a2, 0xfe4a, 0xfe4a, 0xff14, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xfeb0, 0xfe4a, 0xfe4a, 0x41a2, 0x0000, 0x2946, 0x49e9, 0x4a2a, 0x5a6b, 0x39a7, 0x0000, 0x3962, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x8b65, 0x0000, 0x0000,
0x0000, 0x0000, 0xb427, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xfe29, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x9385, 0x0000, 0x0841, 0x3146, 0x41e9, 0x3146, 0x0841, 0x0000, 0x9be6, 0xfe4a, 0xfe4b, 0xff58, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xfed2, 0xfe4a, 0xfe4a, 0x9be6, 0x0000, 0x0841, 0x3146, 0x41e9, 0x3146, 0x0841, 0x0000, 0x9385, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xc4a7, 0x0000, 0x0000,
0x0000, 0x0000, 0xdd28, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xfe2a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe29, 0x49c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5203, 0xfe4a, 0xfe4a, 0xfed1, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff14, 0xfe4a, 0xfe4a, 0xfe4a, 0x5203, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49c2, 0xfe29, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xf5e9, 0x0000, 0x0000,
0x0000, 0x0000, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed89, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe2a, 0x93a5, 0x4182, 0x18a1, 0x41a2, 0x9bc6, 0xfe2a, 0xfe4a, 0xfeaf, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff58, 0xfe6d, 0xfe4a, 0xfe4a, 0xfe2a, 0x9bc6, 0x41a2, 0x18a1, 0x4182, 0x93a5, 0xfe2a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x0000, 0x0000,
0x0000, 0x0820, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed89, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe8d, 0xff58, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff36, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x0820, 0x0000,
0x0000, 0x1060, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed89, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe8e, 0xfef4, 0xff58, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff14, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0x1060, 0x0000,
0x0000, 0x0840, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed89, 0xfe4a, 0xfe4a, 0xfe8e, 0xfeb0, 0xfed1, 0xfed1, 0xfed2, 0xfed2, 0xfef2, 0xfef2, 0xfef2, 0xfef3, 0xff58, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff37, 0xfeb0, 0xfe4b, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe6b, 0xfe8e, 0xfeb0, 0xfef2, 0xff14, 0xfef3, 0xfed1, 0xfeaf, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe2a, 0x0840, 0x0000,
0x0000, 0x0000, 0xcca8, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xedab, 0xfef2, 0xff57, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff37, 0xff36, 0xff36, 0xff58, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff58, 0xfef2, 0xfe4b, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xdd68, 0x0000, 0x0000,
0x0000, 0x0000, 0x9ba6, 0xed69, 0xed69, 0xed69, 0xed69, 0xed69, 0xeded, 0xf6f6, 0xff58, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xd634, 0x734b, 0x4a27, 0x2924, 0x2924, 0x4a27, 0x734b, 0xd634, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff57, 0xfe8d, 0xfe4a, 0xfe4a, 0xfe4a, 0xfe4a, 0xac26, 0x0000, 0x0000,
0x0000, 0x0000, 0x72a4, 0xed69, 0xed69, 0xed69, 0xed69, 0xedcc, 0xf6f6, 0xf6f6, 0xff38, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xe6d7, 0x5268, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5268, 0xe6d7, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff58, 0xfe8d, 0xfe4a, 0xfe4a, 0xfe4a, 0x7b04, 0x0000, 0x0000,
0x0000, 0x0000, 0x41a2, 0xed69, 0xed69, 0xe569, 0xc487, 0xa48e, 0x7b6b, 0x62c9, 0x5288, 0x4a27, 0x39a5, 0x2944, 0x20e3, 0x2103, 0x2944, 0x2964, 0x3185, 0x39a5, 0x4a27, 0xde76, 0xff59, 0xff59, 0xff59, 0xeef7, 0x3185, 0x0000, 0x2082, 0x8a6a, 0xd3f0, 0xf493, 0xf493, 0xd3f0, 0x92ab, 0x20a2, 0x0000, 0x3185, 0xeef7, 0xff59, 0xff59, 0xff59, 0xde76, 0x4a27, 0x39a5, 0x3185, 0x2964, 0x2944, 0x2103, 0x20e3, 0x2944, 0x39a5, 0x4a27, 0x5a88, 0x6b0a, 0x7bac, 0xa4f0, 0xd613, 0xfe2a, 0xfe4a, 0xfe4a, 0x49e3, 0x0000, 0x0000,
0x0000, 0x0000, 0x1060, 0x49c3, 0x20e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbd92, 0xff59, 0xff59, 0xff59, 0x7b8c, 0x0000, 0x4925, 0xf3d0, 0xfcb3, 0xfcb4, 0xfcb4, 0xfcb4, 0xfcb4, 0xfcb4, 0xf493, 0x4966, 0x0000, 0x7b8c, 0xff59, 0xff59, 0xff59, 0xbd92, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x2901, 0x5203, 0x1060, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1881, 0x41c5, 0x6ae9, 0x940d, 0xacf0, 0xbd51, 0xce14, 0xde76, 0xeef7, 0xff58, 0xf738, 0xf718, 0xeef7, 0xe6d7, 0xe696, 0xeed7, 0xff59, 0xff59, 0xff59, 0xff59, 0x3185, 0x0000, 0xe38e, 0xfc10, 0xfc93, 0xfcb4, 0xfcb4, 0xfcb4, 0xfcb4, 0xfcb4, 0xfcb4, 0xe431, 0x0000, 0x3185, 0xff59, 0xff59, 0xff59, 0xff59, 0xeed7, 0xe696, 0xe6d7, 0xeef7, 0xf718, 0xf738, 0xff58, 0xeef7, 0xde76, 0xce14, 0xc5b3, 0xb531, 0x944e, 0x6b2a, 0x41e6, 0x18a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x3122, 0xdd28, 0xed69, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xff38, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0x2944, 0x0000, 0xe38f, 0xfc10, 0xfc52, 0xfcb4, 0xfcb4, 0xfcb4, 0xfcb4, 0xfcb4, 0xfcb4, 0xe432, 0x0000, 0x2944, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff58, 0xf5ea, 0x3962, 0x0000, 0x0000, 0x0000,
0xffff, 0x0000, 0x0000, 0x0000, 0xb447, 0xed69, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xf717, 0xff59, 0xf738, 0xc5b3, 0x83cc, 0x5ac9, 0x41e6, 0x2103, 0x6b2b, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0x736b, 0x0000, 0x4925, 0xf3f0, 0xfc10, 0xfc93, 0xfcb4, 0xfcb4, 0xfcb4, 0xfcb4, 0xf493, 0x4965, 0x0000, 0x736b, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0x6b2b, 0x2103, 0x41e6, 0x5ac9, 0x83cc, 0xc5b3, 0xf738, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xc4e8, 0x0000, 0x0000, 0x0000, 0xffff,
0xffff, 0xffff, 0x0000, 0x0000, 0x3142, 0xed69, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xd613, 0x940d, 0x4a47, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5aa9, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xeef7, 0x3164, 0x0000, 0x2082, 0xa28a, 0xfbf0, 0xfc52, 0xfcb3, 0xfcb3, 0xa2ec, 0x2082, 0x0000, 0x3164, 0xeef7, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0x5aa9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, 0x4a48, 0x946e, 0xde75, 0xff59, 0xff59, 0xff59, 0xff59, 0xff58, 0x3962, 0x0000, 0x0000, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0xa3a6, 0xf6f6, 0xf6f6, 0xb4f0, 0x2103, 0x0000, 0x0000, 0x0000, 0x0841, 0x4a27, 0x8c2e, 0xbd72, 0xd655, 0xf738, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xe6d7, 0x62e9, 0x0000, 0x0000, 0x28a2, 0x71c7, 0x71c7, 0x28a3, 0x0000, 0x0000, 0x62e9, 0xe6d7, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xf738, 0xd655, 0xb572, 0x8c2e, 0x4a27, 0x0841, 0x0000, 0x0000, 0x0000, 0x2103, 0xb552, 0xff59, 0xff59, 0xacef, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x1060, 0xd5d1, 0xf6f6, 0x8bec, 0x0000, 0x3164, 0x734a, 0xbd31, 0xf717, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xce14, 0x4206, 0x0000, 0x0000, 0x0000, 0x0000, 0x4206, 0xce14, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xf738, 0xbd92, 0x7b8c, 0x3185, 0x0000, 0x8c2e, 0xff59, 0xd655, 0x1061, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x20e2, 0xe675, 0xf6f6, 0xeeb5, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xff58, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xe6b6, 0xacf1, 0xacf1, 0xe6b6, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xf738, 0xff59, 0xeef7, 0x2123, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x41e6, 0xf6d6, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xf717, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0x630a, 0x5aa9, 0xeef7, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xeef7, 0x5aa9, 0x630a, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xf738, 0x4207, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x39c5, 0xe675, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xff38, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0x4207, 0x0000, 0x2944, 0xbd92, 0xf718, 0xf738, 0xbd92, 0x7b8c, 0x3165, 0x3165, 0x7b8c, 0xbd92, 0xf738, 0xf718, 0xbd92, 0x2944, 0x0000, 0x4207, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xeef7, 0x41e6, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x2103, 0xd613, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xff38, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xf738, 0x5a88, 0x0000, 0x0000, 0x0020, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x0020, 0x0000, 0x0000, 0x5a88, 0xf738, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xde75, 0x2123, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x1081, 0x9c6e, 0xf6d6, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xff38, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xa4d0, 0x62c9, 0x2103, 0x18c2, 0x5ac9, 0xa4b0, 0xd634, 0xd634, 0xa4b0, 0x5ac9, 0x18c2, 0x2103, 0x62c9, 0xa4d0, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff58, 0x9caf, 0x1082, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x3185, 0xc592, 0xf6f6, 0xf6f6, 0xf6f6, 0xf6f6, 0xff38, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xcdf4, 0x39a5, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a06, 0xa4af, 0xeeb5, 0xf6f6, 0xf6f6, 0xf717, 0xff58, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xf738, 0xacf0, 0x4a27, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, 0x5aa8, 0x940d, 0xbd31, 0xe675, 0xff38, 0xff59, 0xff59, 0xff59, 0xff59, 0xf718, 0xe6d7, 0xde75, 0xd614, 0xc5d3, 0xbd72, 0xbd72, 0xc5d3, 0xd614, 0xde75, 0xe6d7, 0xf718, 0xff59, 0xff59, 0xff59, 0xff59, 0xff59, 0xe6d7, 0xbd93, 0x944e, 0x62c9, 0x1061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x0841, 0x0841, 0x0840, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0840, 0x0841, 0x0861, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff };
PetBit Battery Images
Arduino#pragma once
#define batteryIcons_h
const uint16_t ccBatt100[] PROGMEM = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0841, 0xa534, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xc618, 0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0x6b4d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdefb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xce59, 0xffff, 0x5b0b, 0x39c7, 0x39a7, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x39c7, 0x5acb, 0xffff, 0xce59, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0xc618, 0xffff, 0x2104, 0x0000, 0x0901, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x0901, 0x0000, 0x18a3, 0xffff, 0xf79e, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0xc638, 0xffff, 0x2925, 0x1182, 0x5e4b, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55aa, 0x5e4b, 0x11e3, 0x20c4, 0xffff, 0xffff, 0xd6ba, 0xbdf7, 0x94b2, 0x0000, 0x0000,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55ca, 0x4d49, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d49, 0x55ca, 0x11a2, 0x20c4, 0xffff, 0xffff, 0xffff, 0xffff, 0xd69a, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d49, 0x55eb, 0x11c2, 0x20c4, 0xffff, 0xffff, 0xffdf, 0xffff, 0xc618, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d49, 0x55eb, 0x11c2, 0x20c4, 0xffff, 0xffff, 0xffff, 0xffff, 0xc638, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d49, 0x55eb, 0x11c2, 0x20c4, 0xffff, 0xffff, 0xffff, 0xffff, 0xc638, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d49, 0x55eb, 0x11c2, 0x20c4, 0xffff, 0xffff, 0xffdf, 0xffff, 0xc618, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55ca, 0x4d49, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d49, 0x55ca, 0x11a2, 0x20c4, 0xffff, 0xffff, 0xffff, 0xffff, 0xd69a, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2925, 0x1182, 0x5e4b, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55aa, 0x5e4b, 0x11e3, 0x20c4, 0xffff, 0xffff, 0xd6ba, 0xbdf7, 0x94b2, 0x0000, 0x0000,
0x0020, 0x0000, 0xc618, 0xffff, 0x2104, 0x0000, 0x0901, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x0901, 0x0000, 0x18a3, 0xffff, 0xf79e, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xce59, 0xffff, 0x5b0b, 0x39c7, 0x39a7, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x39c7, 0x5acb, 0xffff, 0xce59, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0x6b4d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdefb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0841, 0xa534, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xc618, 0x5aeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
const uint16_t ccBatt80[] PROGMEM = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0841, 0xa534, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xc618, 0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0x6b4d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdefb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xce59, 0xffff, 0x5b0b, 0x39c7, 0x39a7, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x31a7, 0x29e7, 0x29e7, 0x31e7, 0x39e7, 0x5aaa, 0xffff, 0xce59, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0xc618, 0xffff, 0x2104, 0x0000, 0x0901, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x08c0, 0x3000, 0x2800, 0x3000, 0x0000, 0x10c3, 0xffff, 0xf79e, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0xc638, 0xffff, 0x2925, 0x1182, 0x5e4b, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x4deb, 0x6549, 0xf820, 0xf800, 0xf820, 0x5800, 0x1145, 0xffff, 0xffff, 0xd6ba, 0xbdf7, 0x94b2, 0x0000, 0x0000,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55ca, 0x4d49, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d49, 0x458a, 0x5ce8, 0xf000, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xd69a, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d69, 0x458a, 0x5ce9, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffdf, 0xffff, 0xc618, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d69, 0x458a, 0x5ce9, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xc638, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d69, 0x458a, 0x5ce9, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xc638, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d69, 0x458a, 0x5ce9, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffdf, 0xffff, 0xc618, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55ca, 0x4d49, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d49, 0x458a, 0x5ce8, 0xf000, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xd69a, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2925, 0x1182, 0x5e4b, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x4deb, 0x6549, 0xf820, 0xf800, 0xf820, 0x5800, 0x1145, 0xffff, 0xffff, 0xd6ba, 0xbdf7, 0x94b2, 0x0000, 0x0000,
0x0020, 0x0000, 0xc618, 0xffff, 0x2104, 0x0000, 0x0901, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x08c0, 0x3000, 0x2800, 0x3000, 0x0000, 0x10c3, 0xffff, 0xf79e, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xce59, 0xffff, 0x5b0b, 0x39c7, 0x39a7, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x31a7, 0x29e7, 0x29e7, 0x31e7, 0x39e7, 0x5aaa, 0xffff, 0xce59, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0x6b4d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdefb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0841, 0xa534, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xc618, 0x5aeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
const uint16_t ccBatt60[] PROGMEM = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0841, 0xa534, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xc618, 0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0x6b4d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdefb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xce59, 0xffff, 0x5b0b, 0x39c7, 0x39a7, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x31c7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x31e7, 0x39e7, 0x5aaa, 0xffff, 0xce59, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0xc618, 0xffff, 0x2104, 0x0000, 0x0901, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x0100, 0x1820, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x0000, 0x10c3, 0xffff, 0xf79e, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0xc638, 0xffff, 0x2925, 0x1182, 0x5e4b, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55aa, 0x464b, 0xaae5, 0xf800, 0xf820, 0xf800, 0xf800, 0xf800, 0xf820, 0x5800, 0x1145, 0xffff, 0xffff, 0xd6ba, 0xbdf7, 0x94b2, 0x0000, 0x0000,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55ca, 0x4d49, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d49, 0x3dca, 0xa2a4, 0xf800, 0xf000, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xd69a, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d49, 0x3dea, 0xa2a4, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffdf, 0xffff, 0xc618, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d49, 0x3dea, 0xa2a4, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xc638, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d49, 0x3dea, 0xa2a4, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xc638, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d49, 0x3dea, 0xa2a4, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffdf, 0xffff, 0xc618, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55ca, 0x4d49, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d49, 0x3dca, 0xa2a4, 0xf800, 0xf000, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xd69a, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2925, 0x1182, 0x5e4b, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55aa, 0x464b, 0xaae5, 0xf800, 0xf820, 0xf800, 0xf800, 0xf800, 0xf820, 0x5800, 0x1145, 0xffff, 0xffff, 0xd6ba, 0xbdf7, 0x94b2, 0x0000, 0x0000,
0x0020, 0x0000, 0xc618, 0xffff, 0x2104, 0x0000, 0x0901, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x0100, 0x1820, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x0000, 0x10c3, 0xffff, 0xf79e, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xce59, 0xffff, 0x5b0b, 0x39c7, 0x39a7, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x31c7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x31e7, 0x39e7, 0x5aaa, 0xffff, 0xce59, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0x6b4d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdefb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0841, 0xa534, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xc618, 0x5aeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
const uint16_t ccBatt40[] PROGMEM = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0841, 0xa534, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xc618, 0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0x6b4d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdefb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xce59, 0xffff, 0x5b0b, 0x39c7, 0x39a7, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x29c7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x31e7, 0x39e7, 0x5aaa, 0xffff, 0xce59, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0xc618, 0xffff, 0x2104, 0x0000, 0x0901, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x0000, 0x10c3, 0xffff, 0xf79e, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0xc638, 0xffff, 0x2925, 0x1182, 0x5e4b, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ea, 0x55aa, 0xf881, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf820, 0x5800, 0x1145, 0xffff, 0xffff, 0xd6ba, 0xbdf7, 0x94b2, 0x0000, 0x0000,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55ca, 0x4d49, 0x4d69, 0x4d69, 0x4d49, 0x4d69, 0x4d49, 0xe860, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xd69a, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d69, 0x4d8a, 0x5549, 0xe860, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffdf, 0xffff, 0xc618, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d69, 0x4d8a, 0x5549, 0xe860, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xc638, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d69, 0x4d8a, 0x5549, 0xe860, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xc638, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d69, 0x4d6a, 0x4d6a, 0x4d69, 0x4d8a, 0x5549, 0xe860, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffdf, 0xffff, 0xc618, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55ca, 0x4d49, 0x4d69, 0x4d69, 0x4d49, 0x4d69, 0x4d49, 0xe860, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xd69a, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2925, 0x1182, 0x5e4b, 0x55ca, 0x55ca, 0x55ca, 0x55ca, 0x55ea, 0x55aa, 0xf881, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf820, 0x5800, 0x1145, 0xffff, 0xffff, 0xd6ba, 0xbdf7, 0x94b2, 0x0000, 0x0000,
0x0020, 0x0000, 0xc618, 0xffff, 0x2104, 0x0000, 0x0901, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x0000, 0x10c3, 0xffff, 0xf79e, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xce59, 0xffff, 0x5b0b, 0x39c7, 0x39a7, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x3987, 0x29c7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x31e7, 0x39e7, 0x5aaa, 0xffff, 0xce59, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0x6b4d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdefb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0841, 0xa534, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xc618, 0x5aeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
const uint16_t ccBatt20[] PROGMEM = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0841, 0xa534, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xc618, 0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0x6b4d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdefb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xce59, 0xffff, 0x5b0b, 0x39c7, 0x39a7, 0x3987, 0x3987, 0x31a7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x31e7, 0x39e7, 0x5aaa, 0xffff, 0xce59, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0xc618, 0xffff, 0x2104, 0x0000, 0x0901, 0x00e0, 0x0100, 0x1060, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x0000, 0x10c3, 0xffff, 0xf79e, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0xc638, 0xffff, 0x2925, 0x1182, 0x5e4b, 0x55aa, 0x464b, 0x9b86, 0xf800, 0xf820, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf820, 0x5800, 0x1145, 0xffff, 0xffff, 0xd6ba, 0xbdf7, 0x94b2, 0x0000, 0x0000,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55ca, 0x4d29, 0x3dca, 0x8b25, 0xf800, 0xf000, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xd69a, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d49, 0x3dea, 0x9346, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffdf, 0xffff, 0xc618, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d49, 0x3dea, 0x9346, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xc638, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d49, 0x3dea, 0x9346, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xc638, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55eb, 0x4d49, 0x3dea, 0x9346, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffdf, 0xffff, 0xc618, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0961, 0x55ca, 0x4d29, 0x3dca, 0x8b25, 0xf800, 0xf000, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xd69a, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2925, 0x1182, 0x5e4b, 0x55aa, 0x464b, 0x9b86, 0xf800, 0xf820, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf820, 0x5800, 0x1145, 0xffff, 0xffff, 0xd6ba, 0xbdf7, 0x94b2, 0x0000, 0x0000,
0x0020, 0x0000, 0xc618, 0xffff, 0x2104, 0x0000, 0x0901, 0x00e0, 0x0100, 0x1060, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x0000, 0x10c3, 0xffff, 0xf79e, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xce59, 0xffff, 0x5b0b, 0x39c7, 0x39a7, 0x3987, 0x3987, 0x31a7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x31e7, 0x39e7, 0x5aaa, 0xffff, 0xce59, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0x6b4d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdefb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0841, 0xa534, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xc618, 0x5aeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
const uint16_t ccBatt00[] PROGMEM = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0841, 0xa534, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xc618, 0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0x6b4d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdefb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xce59, 0xffff, 0x5b0b, 0x39c7, 0x31e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x31e7, 0x39e7, 0x5aaa, 0xffff, 0xce59, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0xc618, 0xffff, 0x2104, 0x0000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x0000, 0x10c3, 0xffff, 0xf79e, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x09a2, 0xf183, 0xf800, 0xf820, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf820, 0x5800, 0x1145, 0xffff, 0xffff, 0xd6ba, 0xbdf7, 0x94b2, 0x0000, 0x0000,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0981, 0xe162, 0xf800, 0xf000, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xd69a, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0982, 0xe162, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffdf, 0xffff, 0xc618, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0982, 0xe162, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xc638, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0982, 0xe162, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xc638, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0982, 0xe162, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffdf, 0xffff, 0xc618, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x0981, 0xe162, 0xf800, 0xf000, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0xf800, 0x5000, 0x1124, 0xffff, 0xffff, 0xffff, 0xffff, 0xd69a, 0x0000, 0x0020,
0x0020, 0x0000, 0xc638, 0xffff, 0x2905, 0x09a2, 0xf183, 0xf800, 0xf820, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf820, 0x5800, 0x1145, 0xffff, 0xffff, 0xd6ba, 0xbdf7, 0x94b2, 0x0000, 0x0000,
0x0020, 0x0000, 0xc618, 0xffff, 0x2104, 0x0000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x0000, 0x10c3, 0xffff, 0xf79e, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xce59, 0xffff, 0x5b0b, 0x39c7, 0x31e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x29e7, 0x31e7, 0x39e7, 0x5aaa, 0xffff, 0xce59, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
0x0020, 0x0000, 0x6b4d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdefb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0841, 0xa534, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf7, 0xc618, 0x5aeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
Comments
Please log in or sign up to comment.