mirror of
https://github.com/thooge/esp32-nmea2000-obp60.git
synced 2025-12-28 21:23:07 +01:00
Compare commits
115 Commits
4aefc99212
...
anchor
| Author | SHA1 | Date | |
|---|---|---|---|
| 5b477331de | |||
| 9b9bf76e4d | |||
|
|
470c0e5f4d | ||
|
|
9a792b49db | ||
| 8f851a4b61 | |||
|
|
f46a43d7fd | ||
| 84e99365f7 | |||
|
|
e5950f95fd | ||
|
|
d0076f336d | ||
|
|
d94c4bbbdb | ||
|
|
6ef7681a40 | ||
|
|
34a289048f | ||
|
|
df1bd498ae | ||
|
|
e5eee37b59 | ||
|
|
28b3cfba0b | ||
|
|
674a78b03c | ||
|
|
de448974d9 | ||
|
|
6b91400cfc | ||
|
|
be946440d3 | ||
|
|
ac86bfb304 | ||
|
|
d719c7260e | ||
|
|
1abcb158ec | ||
|
|
00ea413411 | ||
|
|
851149bae6 | ||
|
|
c6c2ad537a | ||
| 3eb2c8093e | |||
|
|
636b1596f5 | ||
|
|
a21ce00260 | ||
|
|
794cbf1c4f | ||
| 4f6079f418 | |||
|
|
a8f3fbb34d | ||
|
|
748867682c | ||
|
|
5b5e003836 | ||
|
|
07200ad701 | ||
|
|
371816f946 | ||
|
|
c8a7f14773 | ||
|
|
4a97768d0b | ||
|
|
e19bd0898d | ||
|
|
d130f7ff78 | ||
|
|
7c14577bbc | ||
|
|
ba94fddb80 | ||
|
|
8faead0a1a | ||
| bc9d139d19 | |||
|
|
a74ce9e553 | ||
| 779f557d47 | |||
|
|
4a273d2c93 | ||
|
|
9be1b864f4 | ||
|
|
bfc4337417 | ||
|
|
398b8e0d02 | ||
| 28a7e58e27 | |||
| eb51092b23 | |||
|
|
fb3af0bf83 | ||
|
|
539500e088 | ||
|
|
229106b04c | ||
|
|
eefa59a7c2 | ||
| 588008e370 | |||
| caf5572459 | |||
|
|
05f8b3ec65 | ||
|
|
351ef5d9fe | ||
|
|
e93193c3e0 | ||
| e367d15568 | |||
|
|
2773685db3 | ||
|
|
9953165dfe | ||
|
|
da451bee70 | ||
|
|
f79124eed3 | ||
|
|
33b5776421 | ||
|
|
2954a9a58b | ||
|
|
e6add8e6fc | ||
|
|
15bcd53350 | ||
|
|
938b566bfc | ||
|
|
fe2223839f | ||
|
|
c888804aef | ||
| d963153b35 | |||
|
|
4934fb1346 | ||
|
|
8150947cd6 | ||
| 1e7368db4d | |||
| 238e0fc79d | |||
|
|
34801d1e0e | ||
| 0afe629b38 | |||
|
|
ccc0d2b6c1 | ||
|
|
791fa10b01 | ||
|
|
c48c6a2e48 | ||
|
|
4110e3f812 | ||
|
|
bb99978177 | ||
|
|
85dee2a622 | ||
|
|
f2e069b768 | ||
|
|
71946248e2 | ||
|
|
91a3ac081f | ||
|
|
59cf52b5d2 | ||
|
|
60193fa3be | ||
|
|
7f954e702d | ||
| 7ca0a4d09a | |||
| 13abfe4c14 | |||
| 8e34fa936d | |||
|
|
6f4e9b625d | ||
| fa4b563ff0 | |||
|
|
72ddeb3cfb | ||
|
|
2729ef9cb6 | ||
|
|
1f90cefbd6 | ||
|
|
9ada5be7cb | ||
|
|
03d8339170 | ||
|
|
73656e7d14 | ||
|
|
bd9741d851 | ||
|
|
13c85adad2 | ||
|
|
9b504469bc | ||
|
|
f0aba89301 | ||
|
|
fe095a9716 | ||
|
|
235188dfb2 | ||
|
|
aa70c34a96 | ||
|
|
62aef176d3 | ||
|
|
9f79a7d4bc | ||
|
|
bf4dff45b4 | ||
|
|
f153d82825 | ||
|
|
da06f3e791 | ||
|
|
7d66ec91da |
@@ -526,3 +526,17 @@ env.Append(
|
|||||||
)
|
)
|
||||||
#script does not run on clean yet - maybe in the future
|
#script does not run on clean yet - maybe in the future
|
||||||
env.AddPostAction("clean",cleangenerated)
|
env.AddPostAction("clean",cleangenerated)
|
||||||
|
|
||||||
|
#look for extra task scripts and include them here
|
||||||
|
for taskdir in userTaskDirs:
|
||||||
|
script = os.path.join(taskdir, "extra_task.py")
|
||||||
|
if os.path.isfile(script):
|
||||||
|
taskname = os.path.basename(os.path.normpath(taskdir))
|
||||||
|
print("#extra task script for '{}'".format(taskname))
|
||||||
|
with open(script) as fh:
|
||||||
|
try:
|
||||||
|
code = compile(fh.read(), taskname, 'exec')
|
||||||
|
except SyntaxError:
|
||||||
|
print("#ERROR: script does not compile")
|
||||||
|
continue
|
||||||
|
exec(code)
|
||||||
|
|||||||
@@ -520,19 +520,23 @@ prebuild(env)
|
|||||||
board="PLATFORM_BOARD_%s"%env["BOARD"].replace("-","_").upper()
|
board="PLATFORM_BOARD_%s"%env["BOARD"].replace("-","_").upper()
|
||||||
print("Board=#%s#"%board)
|
print("Board=#%s#"%board)
|
||||||
print("BuildFlags=%s"%(" ".join(env["BUILD_FLAGS"])))
|
print("BuildFlags=%s"%(" ".join(env["BUILD_FLAGS"])))
|
||||||
|
|
||||||
epdtype = "unknown"
|
|
||||||
pcbvers = "unknown"
|
|
||||||
for x in env["BUILD_FLAGS"]:
|
|
||||||
if x.startswith("-D HARDWARE_"):
|
|
||||||
pcbvers = x.split('_')[1]
|
|
||||||
if x.startswith("-D DISPLAY_"):
|
|
||||||
epdtype = x.split('_')[1]
|
|
||||||
|
|
||||||
env.Append(
|
env.Append(
|
||||||
LINKFLAGS=[ "-u", "custom_app_desc" ],
|
LINKFLAGS=[ "-u", "custom_app_desc" ],
|
||||||
CPPDEFINES=[(board,"1"), ("BOARD", env["BOARD"]), ("EPDTYPE", epdtype),
|
CPPDEFINES=[(board,"1")]
|
||||||
("PCBVERS", pcbvers)]
|
|
||||||
)
|
)
|
||||||
#script does not run on clean yet - maybe in the future
|
#script does not run on clean yet - maybe in the future
|
||||||
env.AddPostAction("clean",cleangenerated)
|
env.AddPostAction("clean",cleangenerated)
|
||||||
|
|
||||||
|
#look for extra task scripts and include them here
|
||||||
|
for taskdir in userTaskDirs:
|
||||||
|
script = os.path.join(taskdir, "extra_task.py")
|
||||||
|
if os.path.isfile(script):
|
||||||
|
taskname = os.path.basename(os.path.normpath(taskdir))
|
||||||
|
print("#extra task script for '{}'".format(taskname))
|
||||||
|
with open(script) as fh:
|
||||||
|
try:
|
||||||
|
code = compile(fh.read(), taskname, 'exec')
|
||||||
|
except SyntaxError:
|
||||||
|
print("#ERROR: script does not compile")
|
||||||
|
continue
|
||||||
|
exec(code)
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ void CalibrationDataList::readConfig(GwConfigHandler* config, GwLog* logger)
|
|||||||
calibMap[instance].slope = slope;
|
calibMap[instance].slope = slope;
|
||||||
calibMap[instance].smooth = smooth;
|
calibMap[instance].smooth = smooth;
|
||||||
calibMap[instance].isCalibrated = false;
|
calibMap[instance].isCalibrated = false;
|
||||||
LOG_DEBUG(GwLog::LOG, "stored calibration data: %s, offset: %f, slope: %f, smoothing: %f", instance.c_str(),
|
LOG_DEBUG(GwLog::LOG, "calibration data: %s, offset: %f, slope: %f, smoothing: %f", instance.c_str(),
|
||||||
calibMap[instance].offset, calibMap[instance].slope, calibMap[instance].smooth);
|
calibMap[instance].offset, calibMap[instance].slope, calibMap[instance].smooth);
|
||||||
}
|
}
|
||||||
LOG_DEBUG(GwLog::LOG, "all calibration data read");
|
LOG_DEBUG(GwLog::LOG, "all calibration data read");
|
||||||
@@ -117,7 +117,7 @@ void CalibrationDataList::calibrateInstance(GwApi::BoatValue* boatDataValue, GwL
|
|||||||
std::string format = "";
|
std::string format = "";
|
||||||
|
|
||||||
if (calibMap.find(instance) == calibMap.end()) {
|
if (calibMap.find(instance) == calibMap.end()) {
|
||||||
LOG_DEBUG(GwLog::DEBUG, "BoatDataCalibration: %s not found in calibration data list", instance.c_str());
|
LOG_DEBUG(GwLog::DEBUG, "BoatDataCalibration: %s not in calibration list", instance.c_str());
|
||||||
return;
|
return;
|
||||||
} else if (!boatDataValue->valid) { // no valid boat data value, so we don't want to apply calibration data
|
} else if (!boatDataValue->valid) { // no valid boat data value, so we don't want to apply calibration data
|
||||||
calibMap[instance].isCalibrated = false;
|
calibMap[instance].isCalibrated = false;
|
||||||
@@ -173,7 +173,7 @@ void CalibrationDataList::smoothInstance(GwApi::BoatValue* boatDataValue, GwLog*
|
|||||||
if (!boatDataValue->valid) { // no valid boat data value, so we don't want to smoothen value
|
if (!boatDataValue->valid) { // no valid boat data value, so we don't want to smoothen value
|
||||||
return;
|
return;
|
||||||
} else if (calibMap.find(instance) == calibMap.end()) {
|
} else if (calibMap.find(instance) == calibMap.end()) {
|
||||||
LOG_DEBUG(GwLog::DEBUG, "BoatDataCalibration: smooth factor for %s not found in calibration data list", instance.c_str());
|
LOG_DEBUG(GwLog::DEBUG, "BoatDataCalibration: smooth factor for %s not found in calibration list", instance.c_str());
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
smoothFactor = calibMap[instance].smooth;
|
smoothFactor = calibMap[instance].smooth;
|
||||||
@@ -184,8 +184,6 @@ void CalibrationDataList::smoothInstance(GwApi::BoatValue* boatDataValue, GwLog*
|
|||||||
}
|
}
|
||||||
lastValue[instance] = dataValue; // store the new value for next cycle; first time, store only the current value and return
|
lastValue[instance] = dataValue; // store the new value for next cycle; first time, store only the current value and return
|
||||||
boatDataValue->value = dataValue; // set the smoothed value to the boat data value
|
boatDataValue->value = dataValue; // set the smoothed value to the boat data value
|
||||||
|
|
||||||
LOG_DEBUG(GwLog::DEBUG, "BoatDataCalibration: %s: Smoothing factor: %f, Smoothed value: %f", instance.c_str(), smoothFactor, dataValue);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
#ifndef _BOATDATACALIBRATION_H
|
#ifndef _BOATDATACALIBRATION_H
|
||||||
#define _BOATDATACALIBRATION_H
|
#define _BOATDATACALIBRATION_H
|
||||||
|
|
||||||
#include "Pagedata.h"
|
// #include "Pagedata.h"
|
||||||
|
#include "GwApi.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
|
|||||||
25
lib/obp60task/Graphics.cpp
Normal file
25
lib/obp60task/Graphics.cpp
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
Generic graphics functions
|
||||||
|
|
||||||
|
*/
|
||||||
|
#include <math.h>
|
||||||
|
#include "Graphics.h"
|
||||||
|
|
||||||
|
Point rotatePoint(const Point& origin, const Point& p, double angle) {
|
||||||
|
// rotate poind around origin by degrees
|
||||||
|
Point rotated;
|
||||||
|
double phi = angle * M_PI / 180.0;
|
||||||
|
double dx = p.x - origin.x;
|
||||||
|
double dy = p.y - origin.y;
|
||||||
|
rotated.x = origin.x + cos(phi) * dx - sin(phi) * dy;
|
||||||
|
rotated.y = origin.y + sin(phi) * dx + cos(phi) * dy;
|
||||||
|
return rotated;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<Point> rotatePoints(const Point& origin, const std::vector<Point>& pts, double angle) {
|
||||||
|
std::vector<Point> rotatedPoints;
|
||||||
|
for (const auto& p : pts) {
|
||||||
|
rotatedPoints.push_back(rotatePoint(origin, p, angle));
|
||||||
|
}
|
||||||
|
return rotatedPoints;
|
||||||
|
}
|
||||||
17
lib/obp60task/Graphics.h
Normal file
17
lib/obp60task/Graphics.h
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
struct Point {
|
||||||
|
double x;
|
||||||
|
double y;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Rect {
|
||||||
|
double x;
|
||||||
|
double y;
|
||||||
|
double w;
|
||||||
|
double h;
|
||||||
|
};
|
||||||
|
|
||||||
|
Point rotatePoint(const Point& origin, const Point& p, double angle);
|
||||||
|
std::vector<Point> rotatePoints(const Point& origin, const std::vector<Point>& pts, double angle);
|
||||||
@@ -11,20 +11,20 @@
|
|||||||
#include "imglib.h"
|
#include "imglib.h"
|
||||||
|
|
||||||
// Character sets
|
// Character sets
|
||||||
#include "Ubuntu_Bold8pt7b.h"
|
#include "fonts/DSEG7Classic-BoldItalic16pt7b.h"
|
||||||
#include "Ubuntu_Bold10pt7b.h"
|
#include "fonts/DSEG7Classic-BoldItalic20pt7b.h"
|
||||||
#include "Ubuntu_Bold12pt7b.h"
|
#include "fonts/DSEG7Classic-BoldItalic26pt7b.h"
|
||||||
#include "Ubuntu_Bold16pt7b.h"
|
#include "fonts/DSEG7Classic-BoldItalic30pt7b.h"
|
||||||
#include "Ubuntu_Bold20pt7b.h"
|
#include "fonts/DSEG7Classic-BoldItalic42pt7b.h"
|
||||||
#include "Ubuntu_Bold32pt7b.h"
|
#include "fonts/DSEG7Classic-BoldItalic60pt7b.h"
|
||||||
#include "DSEG7Classic-BoldItalic16pt7b.h"
|
#include "fonts/Ubuntu_Bold8pt8b.h"
|
||||||
#include "DSEG7Classic-BoldItalic20pt7b.h"
|
#include "fonts/Ubuntu_Bold10pt8b.h"
|
||||||
#include "DSEG7Classic-BoldItalic30pt7b.h"
|
#include "fonts/Ubuntu_Bold12pt8b.h"
|
||||||
#include "DSEG7Classic-BoldItalic42pt7b.h"
|
#include "fonts/Ubuntu_Bold16pt8b.h"
|
||||||
#include "DSEG7Classic-BoldItalic60pt7b.h"
|
#include "fonts/Ubuntu_Bold20pt8b.h"
|
||||||
#include "Atari16px8b.h" // Key label font
|
#include "fonts/Ubuntu_Bold32pt8b.h"
|
||||||
|
#include "fonts/Atari16px8b.h" // Key label font
|
||||||
#include "Ubuntu_Bold20pt8b.h"
|
#include "fonts/IBM8x8px.h"
|
||||||
|
|
||||||
// E-Ink Display
|
// E-Ink Display
|
||||||
#define GxEPD_WIDTH 400 // Display width
|
#define GxEPD_WIDTH 400 // Display width
|
||||||
@@ -65,6 +65,12 @@ PCF8574 pcf8574_Out(PCF8574_I2C_ADDR1); // First digital output modul PCF8574 fr
|
|||||||
Adafruit_FRAM_I2C fram;
|
Adafruit_FRAM_I2C fram;
|
||||||
bool hasFRAM = false;
|
bool hasFRAM = false;
|
||||||
|
|
||||||
|
// SD Card
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
sdmmc_card_t *sdcard;
|
||||||
|
#endif
|
||||||
|
bool hasSDCard = false;
|
||||||
|
|
||||||
// Global vars
|
// Global vars
|
||||||
bool blinkingLED = false; // Enable / disable blinking flash LED
|
bool blinkingLED = false; // Enable / disable blinking flash LED
|
||||||
bool statusLED = false; // Actual status of flash LED on/off
|
bool statusLED = false; // Actual status of flash LED on/off
|
||||||
@@ -79,6 +85,9 @@ LedTaskData *ledTaskData=nullptr;
|
|||||||
|
|
||||||
void hardwareInit(GwApi *api)
|
void hardwareInit(GwApi *api)
|
||||||
{
|
{
|
||||||
|
GwLog *logger = api->getLogger();
|
||||||
|
GwConfigHandler *config = api->getConfig();
|
||||||
|
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
// Init PCF8574 digital outputs
|
// Init PCF8574 digital outputs
|
||||||
Wire.setClock(I2C_SPEED); // Set I2C clock on 10 kHz
|
Wire.setClock(I2C_SPEED); // Set I2C clock on 10 kHz
|
||||||
@@ -88,7 +97,7 @@ void hardwareInit(GwApi *api)
|
|||||||
fram = Adafruit_FRAM_I2C();
|
fram = Adafruit_FRAM_I2C();
|
||||||
if (esp_reset_reason() == ESP_RST_POWERON) {
|
if (esp_reset_reason() == ESP_RST_POWERON) {
|
||||||
// help initialize FRAM
|
// help initialize FRAM
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"Delaying I2C init for 250ms due to cold boot");
|
logger->logDebug(GwLog::LOG, "Delaying I2C init for 250ms due to cold boot");
|
||||||
delay(250);
|
delay(250);
|
||||||
}
|
}
|
||||||
// FRAM (e.g. MB85RC256V)
|
// FRAM (e.g. MB85RC256V)
|
||||||
@@ -100,11 +109,88 @@ void hardwareInit(GwApi *api)
|
|||||||
// Boot counter
|
// Boot counter
|
||||||
uint8_t framcounter = fram.read(0x0000);
|
uint8_t framcounter = fram.read(0x0000);
|
||||||
fram.write(0x0000, framcounter+1);
|
fram.write(0x0000, framcounter+1);
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"FRAM detected: 0x%04x/0x%04x (counter=%d)", manufacturerID, productID, framcounter);
|
logger->logDebug(GwLog::LOG, "FRAM detected: 0x%04x/0x%04x (counter=%d)", manufacturerID, productID, framcounter);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
hasFRAM = false;
|
hasFRAM = false;
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"NO FRAM detected");
|
logger->logDebug(GwLog::LOG, "NO FRAM detected");
|
||||||
|
}
|
||||||
|
// SD Card
|
||||||
|
hasSDCard = false;
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
if (config->getBool(config->useSDCard)) {
|
||||||
|
esp_err_t ret;
|
||||||
|
sdmmc_host_t host = SDSPI_HOST_DEFAULT();
|
||||||
|
host.slot = SPI3_HOST;
|
||||||
|
logger->logDebug(GwLog::DEBUG, "SDSPI_HOST: max_freq_khz=%d" , host.max_freq_khz);
|
||||||
|
spi_bus_config_t bus_cfg = {
|
||||||
|
.mosi_io_num = SD_SPI_MOSI,
|
||||||
|
.miso_io_num = SD_SPI_MISO,
|
||||||
|
.sclk_io_num = SD_SPI_CLK,
|
||||||
|
.quadwp_io_num = -1,
|
||||||
|
.quadhd_io_num = -1,
|
||||||
|
.max_transfer_sz = 4000,
|
||||||
|
};
|
||||||
|
ret = spi_bus_initialize((spi_host_device_t) host.slot, &bus_cfg, SDSPI_DEFAULT_DMA);
|
||||||
|
if (ret != ESP_OK) {
|
||||||
|
logger->logDebug(GwLog::ERROR, "Failed to initialize SPI bus for SD card");
|
||||||
|
} else {
|
||||||
|
sdspi_device_config_t slot_config = SDSPI_DEVICE_CONFIG_DEFAULT();
|
||||||
|
slot_config.gpio_cs = SD_SPI_CS;
|
||||||
|
slot_config.host_id = (spi_host_device_t) host.slot;
|
||||||
|
esp_vfs_fat_sdmmc_mount_config_t mount_config = {
|
||||||
|
.format_if_mount_failed = false,
|
||||||
|
.max_files = 5,
|
||||||
|
.allocation_unit_size = 16 * 1024
|
||||||
|
};
|
||||||
|
ret = esp_vfs_fat_sdspi_mount(MOUNT_POINT, &host, &slot_config, &mount_config, &sdcard);
|
||||||
|
if (ret != ESP_OK) {
|
||||||
|
if (ret == ESP_FAIL) {
|
||||||
|
logger->logDebug(GwLog::ERROR, "Failed to mount SD card filesystem");
|
||||||
|
} else {
|
||||||
|
// ret == 263 could be not powered up yet
|
||||||
|
logger->logDebug(GwLog::ERROR, "Failed to initialize SD card (error #%d)", ret);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger->logDebug(GwLog::LOG, "SD card filesystem mounted at '%s'", MOUNT_POINT);
|
||||||
|
hasSDCard = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasSDCard) {
|
||||||
|
// read some stats
|
||||||
|
String features = "";
|
||||||
|
if (sdcard->is_mem) features += "MEM "; // Memory card
|
||||||
|
if (sdcard->is_sdio) features += "IO "; // IO Card
|
||||||
|
if (sdcard->is_mmc) features += "MMC "; // MMC Card
|
||||||
|
if (sdcard->is_ddr) features += "DDR ";
|
||||||
|
// if (sdcard->is_uhs1) features += "UHS-1 ";
|
||||||
|
// ext_csd. Extended information
|
||||||
|
// uint8_t rev, uint8_t power_class
|
||||||
|
logger->logDebug(GwLog::LOG, "SD card features: %s", features);
|
||||||
|
logger->logDebug(GwLog::LOG, "SD card size: %lluMB", ((uint64_t) sdcard->csd.capacity) * sdcard->csd.sector_size / (1024 * 1024));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void powerInit(String powermode) {
|
||||||
|
// Max Power | Only 5.0V | Min Power
|
||||||
|
if (powermode == "Max Power" || powermode == "Only 5.0V") {
|
||||||
|
#ifdef HARDWARE_V21
|
||||||
|
setPortPin(OBP_POWER_50, true); // Power on 5.0V rail
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
setPortPin(OBP_POWER_EPD, true);// Power on ePaper display
|
||||||
|
setPortPin(OBP_POWER_SD, true); // Power on SD card
|
||||||
|
#endif
|
||||||
|
} else { // Min Power
|
||||||
|
#ifdef HARDWARE_V21
|
||||||
|
setPortPin(OBP_POWER_50, false); // Power off 5.0V rail
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
setPortPin(OBP_POWER_EPD, false);// Power off ePaper display
|
||||||
|
setPortPin(OBP_POWER_SD, false); // Power off SD card
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,10 +224,10 @@ void deepSleep(CommonData &common){
|
|||||||
getdisplay().setFullWindow(); // Set full Refresh
|
getdisplay().setFullWindow(); // Set full Refresh
|
||||||
getdisplay().fillScreen(common.bgcolor); // Clear screen
|
getdisplay().fillScreen(common.bgcolor); // Clear screen
|
||||||
getdisplay().setTextColor(common.fgcolor);
|
getdisplay().setTextColor(common.fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(85, 150);
|
getdisplay().setCursor(85, 150);
|
||||||
getdisplay().print("Sleep Mode");
|
getdisplay().print("Sleep Mode");
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(65, 175);
|
getdisplay().setCursor(65, 175);
|
||||||
getdisplay().print("To wake up press key and wait 5s");
|
getdisplay().print("To wake up press key and wait 5s");
|
||||||
getdisplay().nextPage(); // Update display contents
|
getdisplay().nextPage(); // Update display contents
|
||||||
@@ -163,10 +249,10 @@ void deepSleep(CommonData &common){
|
|||||||
//getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
//getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
getdisplay().fillScreen(common.bgcolor); // Clear screen
|
getdisplay().fillScreen(common.bgcolor); // Clear screen
|
||||||
getdisplay().setTextColor(common.fgcolor);
|
getdisplay().setTextColor(common.fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(85, 150);
|
getdisplay().setCursor(85, 150);
|
||||||
getdisplay().print("Sleep Mode");
|
getdisplay().print("Sleep Mode");
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(65, 175);
|
getdisplay().setCursor(65, 175);
|
||||||
getdisplay().print("To wake up press wheel and wait 5s");
|
getdisplay().print("To wake up press wheel and wait 5s");
|
||||||
getdisplay().nextPage(); // Partial update
|
getdisplay().nextPage(); // Partial update
|
||||||
@@ -277,30 +363,63 @@ String xdrDelete(String input){
|
|||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
Point rotatePoint(const Point& origin, const Point& p, double angle) {
|
|
||||||
// rotate poind around origin by degrees
|
|
||||||
Point rotated;
|
|
||||||
double phi = angle * M_PI / 180.0;
|
|
||||||
double dx = p.x - origin.x;
|
|
||||||
double dy = p.y - origin.y;
|
|
||||||
rotated.x = origin.x + cos(phi) * dx - sin(phi) * dy;
|
|
||||||
rotated.y = origin.y + sin(phi) * dx + cos(phi) * dy;
|
|
||||||
return rotated;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<Point> rotatePoints(const Point& origin, const std::vector<Point>& pts, double angle) {
|
|
||||||
std::vector<Point> rotatedPoints;
|
|
||||||
for (const auto& p : pts) {
|
|
||||||
rotatedPoints.push_back(rotatePoint(origin, p, angle));
|
|
||||||
}
|
|
||||||
return rotatedPoints;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fillPoly4(const std::vector<Point>& p4, uint16_t color) {
|
void fillPoly4(const std::vector<Point>& p4, uint16_t color) {
|
||||||
getdisplay().fillTriangle(p4[0].x, p4[0].y, p4[1].x, p4[1].y, p4[2].x, p4[2].y, color);
|
getdisplay().fillTriangle(p4[0].x, p4[0].y, p4[1].x, p4[1].y, p4[2].x, p4[2].y, color);
|
||||||
getdisplay().fillTriangle(p4[0].x, p4[0].y, p4[2].x, p4[2].y, p4[3].x, p4[3].y, color);
|
getdisplay().fillTriangle(p4[0].x, p4[0].y, p4[2].x, p4[2].y, p4[3].x, p4[3].y, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawPoly(const std::vector<Point>& points, uint16_t color) {
|
||||||
|
size_t polysize = points.size();
|
||||||
|
for (size_t i = 0; i < polysize - 1; i++) {
|
||||||
|
getdisplay().drawLine(points[i].x, points[i].y, points[i+1].x, points[i+1].y, color);
|
||||||
|
}
|
||||||
|
// close path
|
||||||
|
getdisplay().drawLine(points[polysize-1].x, points[polysize-1].y, points[0].x, points[0].y, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Split string into words, whitespace separated
|
||||||
|
std::vector<String> split(const String &s) {
|
||||||
|
std::vector<String> words;
|
||||||
|
String word = "";
|
||||||
|
for (size_t i = 0; i < s.length(); i++) {
|
||||||
|
if (s[i] == ' ' || s[i] == '\t' || s[i] == '\r' || s[i] == '\n') {
|
||||||
|
if (word.length() > 0) {
|
||||||
|
words.push_back(word);
|
||||||
|
word = "";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
word += s[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (word.length() > 0) {
|
||||||
|
words.push_back(word);
|
||||||
|
}
|
||||||
|
return words;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wordwrap single line, monospaced font
|
||||||
|
std::vector<String> wordwrap(String &line, uint16_t maxwidth) {
|
||||||
|
std::vector<String> lines;
|
||||||
|
std::vector<String> words = split(line);
|
||||||
|
String currentLine = "";
|
||||||
|
for (const auto& word : words) {
|
||||||
|
if (currentLine.length() + word.length() + 1 > maxwidth) {
|
||||||
|
if (currentLine.length() > 0) {
|
||||||
|
lines.push_back(currentLine);
|
||||||
|
currentLine = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (currentLine.length() > 0) {
|
||||||
|
currentLine += " ";
|
||||||
|
}
|
||||||
|
currentLine += word;
|
||||||
|
}
|
||||||
|
if (currentLine.length() > 0) {
|
||||||
|
lines.push_back(currentLine);
|
||||||
|
}
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
|
||||||
// Draw centered text
|
// Draw centered text
|
||||||
void drawTextCenter(int16_t cx, int16_t cy, String text) {
|
void drawTextCenter(int16_t cx, int16_t cy, String text) {
|
||||||
int16_t x1, y1;
|
int16_t x1, y1;
|
||||||
@@ -319,6 +438,24 @@ void drawTextRalign(int16_t x, int16_t y, String text) {
|
|||||||
getdisplay().print(text);
|
getdisplay().print(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Draw text inside box, normal or inverted
|
||||||
|
void drawTextBoxed(Rect box, String text, uint16_t fg, uint16_t bg, bool inverted, bool border) {
|
||||||
|
if (inverted) {
|
||||||
|
getdisplay().fillRect(box.x, box.y, box.w, box.h, fg);
|
||||||
|
getdisplay().setTextColor(bg);
|
||||||
|
} else {
|
||||||
|
if (border) {
|
||||||
|
getdisplay().fillRect(box.x + 1, box.y + 1, box.w - 2, box.h - 2, bg);
|
||||||
|
getdisplay().drawRect(box.x, box.y, box.w, box.h, fg);
|
||||||
|
}
|
||||||
|
getdisplay().setTextColor(fg);
|
||||||
|
}
|
||||||
|
uint16_t border_offset = box.h / 4; // 25% of box height
|
||||||
|
getdisplay().setCursor(box.x + border_offset, box.y + box.h - border_offset);
|
||||||
|
getdisplay().print(text);
|
||||||
|
getdisplay().setTextColor(fg);
|
||||||
|
}
|
||||||
|
|
||||||
// Show a triangle for trend direction high (x, y is the left edge)
|
// Show a triangle for trend direction high (x, y is the left edge)
|
||||||
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color){
|
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color){
|
||||||
getdisplay().fillTriangle(x, y, x+size*2, y, x+size, y-size*2, color);
|
getdisplay().fillTriangle(x, y, x+size*2, y, x+size, y-size*2, color);
|
||||||
@@ -348,7 +485,7 @@ void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatVa
|
|||||||
|
|
||||||
// Show status info
|
// Show status info
|
||||||
getdisplay().setTextColor(commonData.fgcolor);
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(0, 15);
|
getdisplay().setCursor(0, 15);
|
||||||
if(commonData.status.wifiApOn){
|
if(commonData.status.wifiApOn){
|
||||||
getdisplay().print(" AP ");
|
getdisplay().print(" AP ");
|
||||||
@@ -418,7 +555,7 @@ void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatVa
|
|||||||
getdisplay().setTextColor(commonData.fgcolor);
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
getdisplay().drawRect(201, 0, 23, 19, commonData.fgcolor);
|
getdisplay().drawRect(201, 0, 23, 19, commonData.fgcolor);
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
drawTextCenter(211, 9, String(commonData.data.actpage));
|
drawTextCenter(211, 9, String(commonData.data.actpage));
|
||||||
heartbeat = !heartbeat;
|
heartbeat = !heartbeat;
|
||||||
|
|
||||||
@@ -427,7 +564,7 @@ void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatVa
|
|||||||
String timesource = commonData.config->getString(commonData.config->timeSource);
|
String timesource = commonData.config->getString(commonData.config->timeSource);
|
||||||
double tz = commonData.config->getString(commonData.config->timeZone).toDouble();
|
double tz = commonData.config->getString(commonData.config->timeZone).toDouble();
|
||||||
getdisplay().setTextColor(commonData.fgcolor);
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(230, 15);
|
getdisplay().setCursor(230, 15);
|
||||||
if (timesource == "RTC" or timesource == "iRTC") {
|
if (timesource == "RTC" or timesource == "iRTC") {
|
||||||
// TODO take DST into account
|
// TODO take DST into account
|
||||||
@@ -546,6 +683,47 @@ void displayFooter(CommonData &commonData) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Alarm overlay, to be drawn as very last draw operation
|
||||||
|
void displayAlarm(CommonData &commonData) {
|
||||||
|
|
||||||
|
const uint16_t x = 50; // overlay area
|
||||||
|
const uint16_t y = 100;
|
||||||
|
const uint16_t w = 300;
|
||||||
|
const uint16_t h = 150;
|
||||||
|
|
||||||
|
getdisplay().setFont(&Atari16px);
|
||||||
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
|
|
||||||
|
// overlay
|
||||||
|
getdisplay().drawRect(x, y, w, h, commonData.fgcolor);
|
||||||
|
getdisplay().fillRect(x + 1, y + 1, w - 1, h - 1, commonData.bgcolor);
|
||||||
|
getdisplay().drawRect(x + 3, y + 3, w - 5, h - 5, commonData.fgcolor);
|
||||||
|
|
||||||
|
// exclamation icon in left top corner
|
||||||
|
getdisplay().drawXBitmap(x + 16, y + 16, exclamation_bits, exclamation_width, exclamation_height, commonData.fgcolor);
|
||||||
|
|
||||||
|
// title
|
||||||
|
getdisplay().setCursor(x + 64, y + 30);
|
||||||
|
getdisplay().print("A L A R M");
|
||||||
|
getdisplay().setCursor(x + 64, y + 48);
|
||||||
|
getdisplay().print("#" + commonData.alarm.id);
|
||||||
|
getdisplay().print(" from ");
|
||||||
|
getdisplay().print(commonData.alarm.source);
|
||||||
|
|
||||||
|
// message, but maximum 4 lines
|
||||||
|
std::vector<String> lines = wordwrap (commonData.alarm.message, w - 16 - 8 / 8);
|
||||||
|
int n = 0;
|
||||||
|
for (const auto& l : lines) {
|
||||||
|
getdisplay().setCursor(x + 16, y + 80 + n);
|
||||||
|
getdisplay().print(l);
|
||||||
|
n += 16;
|
||||||
|
if (n > 64) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
drawTextCenter(x + w / 2, y + h - 16, "Press button 1 to dismiss alarm");
|
||||||
|
}
|
||||||
|
|
||||||
// Sunset und sunrise calculation
|
// Sunset und sunrise calculation
|
||||||
SunData calcSunsetSunrise(double time, double date, double latitude, double longitude, float timezone){
|
SunData calcSunsetSunrise(double time, double date, double latitude, double longitude, float timezone){
|
||||||
SunData returnset;
|
SunData returnset;
|
||||||
@@ -681,7 +859,7 @@ void generatorGraphic(uint x, uint y, int pcolor, int bcolor){
|
|||||||
getdisplay().fillCircle(xb, yb, 41, bcolor);
|
getdisplay().fillCircle(xb, yb, 41, bcolor);
|
||||||
// Insert G
|
// Insert G
|
||||||
getdisplay().setTextColor(pcolor);
|
getdisplay().setTextColor(pcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
getdisplay().setFont(&Ubuntu_Bold32pt8b);
|
||||||
getdisplay().setCursor(xb-22, yb+20);
|
getdisplay().setCursor(xb-22, yb+20);
|
||||||
getdisplay().print("G");
|
getdisplay().print("G");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,9 +4,16 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "OBP60Hardware.h"
|
#include "OBP60Hardware.h"
|
||||||
#include "LedSpiTask.h"
|
#include "LedSpiTask.h"
|
||||||
|
#include "Graphics.h"
|
||||||
#include <GxEPD2_BW.h> // E-paper lib V2
|
#include <GxEPD2_BW.h> // E-paper lib V2
|
||||||
#include <Adafruit_FRAM_I2C.h> // I2C FRAM
|
#include <Adafruit_FRAM_I2C.h> // I2C FRAM
|
||||||
|
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
#include "esp_vfs_fat.h"
|
||||||
|
#include "sdmmc_cmd.h"
|
||||||
|
#define MOUNT_POINT "/sdcard"
|
||||||
|
#endif
|
||||||
|
|
||||||
// FRAM address reservations 32kB: 0x0000 - 0x7FFF
|
// FRAM address reservations 32kB: 0x0000 - 0x7FFF
|
||||||
// 0x0000 - 0x03ff: single variables
|
// 0x0000 - 0x03ff: single variables
|
||||||
#define FRAM_PAGE_NO 0x0002
|
#define FRAM_PAGE_NO 0x0002
|
||||||
@@ -15,6 +22,7 @@
|
|||||||
#define FRAM_VOLTAGE_AVG 0x000A
|
#define FRAM_VOLTAGE_AVG 0x000A
|
||||||
#define FRAM_VOLTAGE_TREND 0x000B
|
#define FRAM_VOLTAGE_TREND 0x000B
|
||||||
#define FRAM_VOLTAGE_MODE 0x000C
|
#define FRAM_VOLTAGE_MODE 0x000C
|
||||||
|
// Wind page
|
||||||
#define FRAM_WIND_SIZE 0x000D
|
#define FRAM_WIND_SIZE 0x000D
|
||||||
#define FRAM_WIND_SRC 0x000E
|
#define FRAM_WIND_SRC 0x000E
|
||||||
#define FRAM_WIND_MODE 0x000F
|
#define FRAM_WIND_MODE 0x000F
|
||||||
@@ -24,21 +32,26 @@
|
|||||||
|
|
||||||
extern Adafruit_FRAM_I2C fram;
|
extern Adafruit_FRAM_I2C fram;
|
||||||
extern bool hasFRAM;
|
extern bool hasFRAM;
|
||||||
|
extern bool hasSDCard;
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
extern sdmmc_card_t *sdcard;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Fonts declarations for display (#includes see OBP60Extensions.cpp)
|
// Fonts declarations for display (#includes see OBP60Extensions.cpp)
|
||||||
extern const GFXfont Ubuntu_Bold8pt7b;
|
|
||||||
extern const GFXfont Ubuntu_Bold10pt7b;
|
|
||||||
extern const GFXfont Ubuntu_Bold12pt7b;
|
|
||||||
extern const GFXfont Ubuntu_Bold16pt7b;
|
|
||||||
extern const GFXfont Ubuntu_Bold20pt7b;
|
|
||||||
extern const GFXfont Ubuntu_Bold20pt8b;
|
|
||||||
extern const GFXfont Ubuntu_Bold32pt7b;
|
|
||||||
extern const GFXfont DSEG7Classic_BoldItalic16pt7b;
|
extern const GFXfont DSEG7Classic_BoldItalic16pt7b;
|
||||||
extern const GFXfont DSEG7Classic_BoldItalic20pt7b;
|
extern const GFXfont DSEG7Classic_BoldItalic20pt7b;
|
||||||
|
extern const GFXfont DSEG7Classic_BoldItalic26pt7b;
|
||||||
extern const GFXfont DSEG7Classic_BoldItalic30pt7b;
|
extern const GFXfont DSEG7Classic_BoldItalic30pt7b;
|
||||||
extern const GFXfont DSEG7Classic_BoldItalic42pt7b;
|
extern const GFXfont DSEG7Classic_BoldItalic42pt7b;
|
||||||
extern const GFXfont DSEG7Classic_BoldItalic60pt7b;
|
extern const GFXfont DSEG7Classic_BoldItalic60pt7b;
|
||||||
|
extern const GFXfont Ubuntu_Bold8pt8b;
|
||||||
|
extern const GFXfont Ubuntu_Bold10pt8b;
|
||||||
|
extern const GFXfont Ubuntu_Bold12pt8b;
|
||||||
|
extern const GFXfont Ubuntu_Bold16pt8b;
|
||||||
|
extern const GFXfont Ubuntu_Bold20pt8b;
|
||||||
|
extern const GFXfont Ubuntu_Bold32pt8b;
|
||||||
extern const GFXfont Atari16px;
|
extern const GFXfont Atari16px;
|
||||||
|
extern const GFXfont IBM8x8px;
|
||||||
|
|
||||||
// Global functions
|
// Global functions
|
||||||
#ifdef DISPLAY_GDEW042T2
|
#ifdef DISPLAY_GDEW042T2
|
||||||
@@ -57,19 +70,20 @@ GxEPD2_BW<GxEPD2_420_GYE042A87, GxEPD2_420_GYE042A87::HEIGHT> & getdisplay();
|
|||||||
GxEPD2_BW<GxEPD2_420_SE0420NQ04, GxEPD2_420_SE0420NQ04::HEIGHT> & getdisplay();
|
GxEPD2_BW<GxEPD2_420_SE0420NQ04, GxEPD2_420_SE0420NQ04::HEIGHT> & getdisplay();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct Point {
|
// Page display return values
|
||||||
double x;
|
#define PAGE_OK 0 // all ok, do nothing
|
||||||
double y;
|
#define PAGE_UPDATE 1 // page wants display to update
|
||||||
};
|
#define PAGE_HIBERNATE 2 // page wants displey to hibernate
|
||||||
Point rotatePoint(const Point& origin, const Point& p, double angle);
|
|
||||||
std::vector<Point> rotatePoints(const Point& origin, const std::vector<Point>& pts, double angle);
|
|
||||||
void fillPoly4(const std::vector<Point>& p4, uint16_t color);
|
void fillPoly4(const std::vector<Point>& p4, uint16_t color);
|
||||||
|
void drawPoly(const std::vector<Point>& points, uint16_t color);
|
||||||
|
|
||||||
void deepSleep(CommonData &common);
|
void deepSleep(CommonData &common);
|
||||||
|
|
||||||
uint8_t getLastPage();
|
uint8_t getLastPage();
|
||||||
|
|
||||||
void hardwareInit(GwApi *api);
|
void hardwareInit(GwApi *api);
|
||||||
|
void powerInit(String powermode);
|
||||||
|
|
||||||
void setPortPin(uint pin, bool value); // Set port pin for extension port
|
void setPortPin(uint pin, bool value); // Set port pin for extension port
|
||||||
|
|
||||||
@@ -91,12 +105,14 @@ String xdrDelete(String input); // Delete xdr prefix from string
|
|||||||
|
|
||||||
void drawTextCenter(int16_t cx, int16_t cy, String text);
|
void drawTextCenter(int16_t cx, int16_t cy, String text);
|
||||||
void drawTextRalign(int16_t x, int16_t y, String text);
|
void drawTextRalign(int16_t x, int16_t y, String text);
|
||||||
|
void drawTextBoxed(Rect box, String text, uint16_t fg, uint16_t bg, bool inverted, bool border);
|
||||||
|
|
||||||
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
||||||
void displayTrendLow(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
void displayTrendLow(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
||||||
|
|
||||||
void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatValue *time, GwApi::BoatValue *hdop); // Draw display header
|
void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatValue *time, GwApi::BoatValue *hdop); // Draw display header
|
||||||
void displayFooter(CommonData &commonData);
|
void displayFooter(CommonData &commonData);
|
||||||
|
void displayAlarm(CommonData &commonData);
|
||||||
|
|
||||||
SunData calcSunsetSunrise(double time, double date, double latitude, double longitude, float timezone); // Calulate sunset and sunrise
|
SunData calcSunsetSunrise(double time, double date, double latitude, double longitude, float timezone); // Calulate sunset and sunrise
|
||||||
SunData calcSunsetSunriseRTC(struct tm *rtctime, double latitude, double longitude, float timezone);
|
SunData calcSunsetSunriseRTC(struct tm *rtctime, double latitude, double longitude, float timezone);
|
||||||
@@ -142,12 +158,12 @@ static unsigned char fram_bits[] PROGMEM = {
|
|||||||
0xff, 0xff, 0xf8, 0x1f, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f,
|
0xff, 0xff, 0xf8, 0x1f, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f,
|
||||||
0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f };
|
0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f };
|
||||||
|
|
||||||
static unsigned char ap_bits[] = {
|
static unsigned char ap_bits[] PROGMEM = {
|
||||||
0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0xc2, 0x21, 0x30, 0x06, 0x08, 0x08,
|
0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0xc2, 0x21, 0x30, 0x06, 0x08, 0x08,
|
||||||
0xc0, 0x01, 0x20, 0x02, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x01, 0xc0, 0x01,
|
0xc0, 0x01, 0x20, 0x02, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x01, 0xc0, 0x01,
|
||||||
0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00 };
|
0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00 };
|
||||||
|
|
||||||
static unsigned char dish_bits[] PROGMEM= {
|
static unsigned char dish_bits[] PROGMEM = {
|
||||||
0x3c, 0x00, 0x42, 0x18, 0xfa, 0x1b, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x09,
|
0x3c, 0x00, 0x42, 0x18, 0xfa, 0x1b, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x09,
|
||||||
0x82, 0x08, 0x06, 0x0a, 0x0e, 0x1b, 0x9c, 0x2b, 0x38, 0x2b, 0x74, 0x20,
|
0x82, 0x08, 0x06, 0x0a, 0x0e, 0x1b, 0x9c, 0x2b, 0x38, 0x2b, 0x74, 0x20,
|
||||||
0xec, 0x1f, 0x1c, 0x00, 0xf4, 0x00, 0xfe, 0x03 };
|
0xec, 0x1f, 0x1c, 0x00, 0xf4, 0x00, 0xfe, 0x03 };
|
||||||
|
|||||||
@@ -49,9 +49,9 @@ String formatLongitude(double lon) {
|
|||||||
return String(degree, 0) + "\x90 " + String(minute, 4) + "' " + ((lon > 0) ? "E" : "W");
|
return String(degree, 0) + "\x90 " + String(minute, 4) + "' " + ((lon > 0) ? "E" : "W");
|
||||||
}
|
}
|
||||||
|
|
||||||
FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
FormattedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
||||||
GwLog *logger = commondata.logger;
|
GwLog *logger = commondata.logger;
|
||||||
FormatedData result;
|
FormattedData result;
|
||||||
static int dayoffset = 0;
|
static int dayoffset = 0;
|
||||||
double rawvalue = 0;
|
double rawvalue = 0;
|
||||||
|
|
||||||
@@ -65,6 +65,7 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
String tempFormat = commondata.config->getString(commondata.config->tempFormat); // [K|°C|°F]
|
String tempFormat = commondata.config->getString(commondata.config->tempFormat); // [K|°C|°F]
|
||||||
String dateFormat = commondata.config->getString(commondata.config->dateFormat); // [DE|GB|US]
|
String dateFormat = commondata.config->getString(commondata.config->dateFormat); // [DE|GB|US]
|
||||||
bool usesimudata = commondata.config->getBool(commondata.config->useSimuData); // [on|off]
|
bool usesimudata = commondata.config->getBool(commondata.config->useSimuData); // [on|off]
|
||||||
|
String precision = commondata.config->getString(commondata.config->valueprecision); // [1|2]
|
||||||
|
|
||||||
// If boat value not valid
|
// If boat value not valid
|
||||||
if (! value->valid && !usesimudata){
|
if (! value->valid && !usesimudata){
|
||||||
@@ -72,6 +73,19 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* fmt_dec_1;
|
||||||
|
const char* fmt_dec_10;
|
||||||
|
const char* fmt_dec_100;
|
||||||
|
if (precision == "1") {
|
||||||
|
fmt_dec_1 = "%3.1f";
|
||||||
|
fmt_dec_10 = "%3.0f";
|
||||||
|
fmt_dec_100 = "%3.0f";
|
||||||
|
} else {
|
||||||
|
fmt_dec_1 = "%3.2f";
|
||||||
|
fmt_dec_10 = "%3.1f";
|
||||||
|
fmt_dec_100 = "%3.0f";
|
||||||
|
}
|
||||||
|
|
||||||
// LOG_DEBUG(GwLog::DEBUG,"formatValue init: getFormat: %s date->value: %f time->value: %f", value->getFormat(), commondata.date->value, commondata.time->value);
|
// LOG_DEBUG(GwLog::DEBUG,"formatValue init: getFormat: %s date->value: %f time->value: %f", value->getFormat(), commondata.date->value, commondata.time->value);
|
||||||
static const int bsize = 30;
|
static const int bsize = 30;
|
||||||
char buffer[bsize+1];
|
char buffer[bsize+1];
|
||||||
@@ -91,25 +105,25 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
tmElements_t parts;
|
tmElements_t parts;
|
||||||
time_t tv=tNMEA0183Msg::daysToTime_t(value->value + dayoffset);
|
time_t tv=tNMEA0183Msg::daysToTime_t(value->value + dayoffset);
|
||||||
tNMEA0183Msg::breakTime(tv,parts);
|
tNMEA0183Msg::breakTime(tv,parts);
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
if(String(dateFormat) == "DE"){
|
if (String(dateFormat) == "DE") {
|
||||||
snprintf(buffer,bsize,"%02d.%02d.%04d",parts.tm_mday,parts.tm_mon+1,parts.tm_year+1900);
|
snprintf(buffer,bsize, "%02d.%02d.%04d", parts.tm_mday, parts.tm_mon+1, parts.tm_year+1900);
|
||||||
}
|
}
|
||||||
else if(String(dateFormat) == "GB"){
|
else if(String(dateFormat) == "GB") {
|
||||||
snprintf(buffer,bsize,"%02d/%02d/%04d",parts.tm_mday,parts.tm_mon+1,parts.tm_year+1900);
|
snprintf(buffer, bsize, "%02d/%02d/%04d", parts.tm_mday, parts.tm_mon+1, parts.tm_year+1900);
|
||||||
}
|
}
|
||||||
else if(String(dateFormat) == "US"){
|
else if(String(dateFormat) == "US") {
|
||||||
snprintf(buffer,bsize,"%02d/%02d/%04d",parts.tm_mon+1,parts.tm_mday,parts.tm_year+1900);
|
snprintf(buffer, bsize, "%02d/%02d/%04d", parts.tm_mon+1, parts.tm_mday, parts.tm_year+1900);
|
||||||
}
|
}
|
||||||
else if(String(dateFormat) == "ISO"){
|
else if(String(dateFormat) == "ISO") {
|
||||||
snprintf(buffer,bsize,"%04d-%02d-%02d",parts.tm_year+1900,parts.tm_mon+1,parts.tm_mday);
|
snprintf(buffer, bsize, "%04d-%02d-%02d", parts.tm_year+1900, parts.tm_mon+1, parts.tm_mday);
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
snprintf(buffer,bsize,"%02d.%02d.%04d",parts.tm_mday,parts.tm_mon+1,parts.tm_year+1900);
|
snprintf(buffer, bsize, "%02d.%02d.%04d", parts.tm_mday, parts.tm_mon+1, parts.tm_year+1900);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
snprintf(buffer,bsize,"01.01.2022");
|
snprintf(buffer, bsize, "01.01.2022");
|
||||||
}
|
}
|
||||||
if(timeZone == 0){
|
if(timeZone == 0){
|
||||||
result.unit = "UTC";
|
result.unit = "UTC";
|
||||||
@@ -130,11 +144,11 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
if (timeInSeconds > 86400) {timeInSeconds = timeInSeconds - 86400;}
|
if (timeInSeconds > 86400) {timeInSeconds = timeInSeconds - 86400;}
|
||||||
if (timeInSeconds < 0) {timeInSeconds = timeInSeconds + 86400;}
|
if (timeInSeconds < 0) {timeInSeconds = timeInSeconds + 86400;}
|
||||||
// LOG_DEBUG(GwLog::DEBUG,"... formatTime value: %f tz: %f corrected timeInSeconds: %f ", value->value, timeZone, timeInSeconds);
|
// LOG_DEBUG(GwLog::DEBUG,"... formatTime value: %f tz: %f corrected timeInSeconds: %f ", value->value, timeZone, timeInSeconds);
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
val=modf(timeInSeconds/3600.0,&inthr);
|
val = modf(timeInSeconds/3600.0, &inthr);
|
||||||
val=modf(val*3600.0/60.0,&intmin);
|
val = modf(val*3600.0/60.0, &intmin);
|
||||||
modf(val*60.0,&intsec);
|
modf(val*60.0,&intsec);
|
||||||
snprintf(buffer,bsize,"%02.0f:%02.0f:%02.0f",inthr,intmin,intsec);
|
snprintf(buffer, bsize, "%02.0f:%02.0f:%02.0f", inthr, intmin, intsec);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
static long sec;
|
static long sec;
|
||||||
@@ -143,7 +157,7 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
sec ++;
|
sec ++;
|
||||||
}
|
}
|
||||||
sec = sec % 60;
|
sec = sec % 60;
|
||||||
snprintf(buffer,bsize,"11:36:%02i", int(sec));
|
snprintf(buffer, bsize, "11:36:%02i", int(sec));
|
||||||
lasttime = millis();
|
lasttime = millis();
|
||||||
}
|
}
|
||||||
if(timeZone == 0){
|
if(timeZone == 0){
|
||||||
@@ -156,23 +170,23 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatFixed0"){
|
else if (value->getFormat() == "formatFixed0"){
|
||||||
if(usesimudata == false) {
|
if(usesimudata == false) {
|
||||||
snprintf(buffer,bsize,"%3.0f",value->value);
|
snprintf(buffer, bsize, "%3.0f", value->value);
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
rawvalue = 8.0 + float(random(0, 10)) / 10.0;
|
rawvalue = 8.0 + float(random(0, 10)) / 10.0;
|
||||||
snprintf(buffer,bsize,"%3.0f", rawvalue);
|
snprintf(buffer, bsize, "%3.0f", rawvalue);
|
||||||
}
|
}
|
||||||
result.unit = "";
|
result.unit = "";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatCourse" || value->getFormat() == "formatWind"){
|
else if (value->getFormat() == "formatCourse" || value->getFormat() == "formatWind"){
|
||||||
double course = 0;
|
double course = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
course = value->value;
|
course = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
course = 2.53 + float(random(0, 10) / 100.0);
|
course = 2.53 + float(random(0, 10) / 100.0);
|
||||||
rawvalue = course;
|
rawvalue = course;
|
||||||
}
|
}
|
||||||
@@ -185,7 +199,7 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatKnots" && (value->getName() == "SOG" || value->getName() == "STW")){
|
else if (value->getFormat() == "formatKnots" && (value->getName() == "SOG" || value->getName() == "STW")){
|
||||||
double speed = 0;
|
double speed = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
speed = value->value;
|
speed = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
@@ -193,85 +207,85 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
rawvalue = 4.0 + float(random(0, 40));
|
rawvalue = 4.0 + float(random(0, 40));
|
||||||
speed = rawvalue;
|
speed = rawvalue;
|
||||||
}
|
}
|
||||||
if(String(speedFormat) == "km/h"){
|
if (String(speedFormat) == "km/h"){
|
||||||
speed = speed * 3.6; // Unit conversion form m/s to km/h
|
speed = speed * 3.6; // Unit conversion form m/s to km/h
|
||||||
result.unit = "km/h";
|
result.unit = "km/h";
|
||||||
}
|
}
|
||||||
else if(String(speedFormat) == "kn"){
|
else if (String(speedFormat) == "kn"){
|
||||||
speed = speed * 1.94384; // Unit conversion form m/s to kn
|
speed = speed * 1.94384; // Unit conversion form m/s to kn
|
||||||
result.unit = "kn";
|
result.unit = "kn";
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
speed = speed; // Unit conversion form m/s to m/s
|
speed = speed; // Unit conversion form m/s to m/s
|
||||||
result.unit = "m/s";
|
result.unit = "m/s";
|
||||||
}
|
}
|
||||||
if(speed < 10){
|
if(speed < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",speed);
|
snprintf(buffer, bsize, fmt_dec_1, speed);
|
||||||
}
|
}
|
||||||
if(speed >= 10 && speed < 100){
|
else if (speed < 100) {
|
||||||
snprintf(buffer,bsize,"%3.1f",speed);
|
snprintf(buffer, bsize, fmt_dec_10, speed);
|
||||||
}
|
}
|
||||||
if(speed >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",speed);
|
snprintf(buffer, bsize, fmt_dec_100, speed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatKnots" && (value->getName() == "AWS" || value->getName() == "TWS" || value->getName() == "MaxAws" || value->getName() == "MaxTws")){
|
else if (value->getFormat() == "formatKnots" && (value->getName() == "AWS" || value->getName() == "TWS" || value->getName() == "MaxAws" || value->getName() == "MaxTws")){
|
||||||
double speed = 0;
|
double speed = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
speed = value->value;
|
speed = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 4.0 + float(random(0, 40));
|
rawvalue = 4.0 + float(random(0, 40));
|
||||||
speed = rawvalue;
|
speed = rawvalue;
|
||||||
}
|
}
|
||||||
if(String(windspeedFormat) == "km/h"){
|
if (String(windspeedFormat) == "km/h"){
|
||||||
speed = speed * 3.6; // Unit conversion form m/s to km/h
|
speed = speed * 3.6; // Unit conversion form m/s to km/h
|
||||||
result.unit = "km/h";
|
result.unit = "km/h";
|
||||||
}
|
}
|
||||||
else if(String(windspeedFormat) == "kn"){
|
else if (String(windspeedFormat) == "kn"){
|
||||||
speed = speed * 1.94384; // Unit conversion form m/s to kn
|
speed = speed * 1.94384; // Unit conversion form m/s to kn
|
||||||
result.unit = "kn";
|
result.unit = "kn";
|
||||||
}
|
}
|
||||||
else if(String(windspeedFormat) == "bft"){
|
else if(String(windspeedFormat) == "bft"){
|
||||||
if(speed < 0.3){
|
if (speed < 0.3) {
|
||||||
speed = 0;
|
speed = 0;
|
||||||
}
|
}
|
||||||
if(speed >=0.3 && speed < 1.5){
|
else if (speed < 1.5) {
|
||||||
speed = 1;
|
speed = 1;
|
||||||
}
|
}
|
||||||
if(speed >=1.5 && speed < 3.3){
|
else if (speed < 3.3) {
|
||||||
speed = 2;
|
speed = 2;
|
||||||
}
|
}
|
||||||
if(speed >=3.3 && speed < 5.4){
|
else if (speed < 5.4) {
|
||||||
speed = 3;
|
speed = 3;
|
||||||
}
|
}
|
||||||
if(speed >=5.4 && speed < 7.9){
|
else if (speed < 7.9) {
|
||||||
speed = 4;
|
speed = 4;
|
||||||
}
|
}
|
||||||
if(speed >=7.9 && speed < 10.7){
|
else if (speed < 10.7) {
|
||||||
speed = 5;
|
speed = 5;
|
||||||
}
|
}
|
||||||
if(speed >=10.7 && speed < 13.8){
|
else if (speed < 13.8) {
|
||||||
speed = 6;
|
speed = 6;
|
||||||
}
|
}
|
||||||
if(speed >=13.8 && speed < 17.1){
|
else if (speed < 17.1) {
|
||||||
speed = 7;
|
speed = 7;
|
||||||
}
|
}
|
||||||
if(speed >=17.1 && speed < 20.7){
|
else if (speed < 20.7) {
|
||||||
speed = 8;
|
speed = 8;
|
||||||
}
|
}
|
||||||
if(speed >=20.7 && speed < 24.4){
|
else if (speed < 24.4) {
|
||||||
speed = 9;
|
speed = 9;
|
||||||
}
|
}
|
||||||
if(speed >=24.4 && speed < 28.4){
|
else if (speed < 28.4) {
|
||||||
speed = 10;
|
speed = 10;
|
||||||
}
|
}
|
||||||
if(speed >=28.4 && speed < 32.6){
|
else if (speed < 32.6) {
|
||||||
speed = 11;
|
speed = 11;
|
||||||
}
|
}
|
||||||
if(speed >=32.6){
|
else {
|
||||||
speed = 12;
|
speed = 12;
|
||||||
}
|
}
|
||||||
result.unit = "bft";
|
result.unit = "bft";
|
||||||
@@ -280,82 +294,85 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
speed = speed; // Unit conversion form m/s to m/s
|
speed = speed; // Unit conversion form m/s to m/s
|
||||||
result.unit = "m/s";
|
result.unit = "m/s";
|
||||||
}
|
}
|
||||||
if(String(windspeedFormat) == "bft"){
|
if (String(windspeedFormat) == "bft"){
|
||||||
snprintf(buffer,bsize,"%2.0f",speed);
|
snprintf(buffer, bsize, "%2.0f", speed);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(speed < 10){
|
if (speed < 10){
|
||||||
snprintf(buffer,bsize,"%3.2f",speed);
|
snprintf(buffer, bsize, fmt_dec_1, speed);
|
||||||
}
|
}
|
||||||
if(speed >= 10 && speed < 100){
|
else if (speed < 100){
|
||||||
snprintf(buffer,bsize,"%3.1f",speed);
|
snprintf(buffer, bsize, fmt_dec_10, speed);
|
||||||
}
|
}
|
||||||
if(speed >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",speed);
|
snprintf(buffer, bsize, fmt_dec_100, speed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatRot"){
|
else if (value->getFormat() == "formatRot"){
|
||||||
double rotation = 0;
|
double rotation = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
rotation = value->value;
|
rotation = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 0.04 + float(random(0, 10)) / 100.0;
|
rawvalue = 0.04 + float(random(0, 10)) / 100.0;
|
||||||
rotation = rawvalue;
|
rotation = rawvalue;
|
||||||
}
|
}
|
||||||
rotation = rotation * 57.2958; // Unit conversion form rad/s to deg/s
|
rotation = rotation * 57.2958; // Unit conversion form rad/s to deg/s
|
||||||
result.unit = "Deg/s";
|
result.unit = "Deg/s";
|
||||||
if(rotation < -100){
|
if (rotation < -100){
|
||||||
rotation = -99;
|
rotation = -99;
|
||||||
}
|
}
|
||||||
if(rotation > 100){
|
if (rotation > 100){
|
||||||
rotation = 99;
|
rotation = 99;
|
||||||
}
|
}
|
||||||
if(rotation > -10 && rotation < 10){
|
if (rotation > -10 && rotation < 10){
|
||||||
snprintf(buffer,bsize,"%3.2f",rotation);
|
snprintf(buffer, bsize, "%3.2f", rotation);
|
||||||
}
|
}
|
||||||
if(rotation <= -10 || rotation >= 10){
|
if (rotation <= -10 || rotation >= 10){
|
||||||
snprintf(buffer,bsize,"%3.0f",rotation);
|
snprintf(buffer, bsize, "%3.0f", rotation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatDop"){
|
else if (value->getFormat() == "formatDop"){
|
||||||
double dop = 0;
|
double dop = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
dop = value->value;
|
dop = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 2.0 + float(random(0, 40)) / 10.0;
|
rawvalue = 2.0 + float(random(0, 40)) / 10.0;
|
||||||
dop = rawvalue;
|
dop = rawvalue;
|
||||||
}
|
}
|
||||||
result.unit = "m";
|
result.unit = "m";
|
||||||
if(dop > 99.9){
|
if (dop > 99.9){
|
||||||
dop = 99.9;
|
dop = 99.9;
|
||||||
}
|
}
|
||||||
if(dop < 10){
|
if (dop < 10){
|
||||||
snprintf(buffer,bsize,"%3.2f",dop);
|
snprintf(buffer, bsize, fmt_dec_1, dop);
|
||||||
}
|
}
|
||||||
if(dop >= 10 && dop < 100){
|
else if(dop < 100){
|
||||||
snprintf(buffer,bsize,"%3.1f",dop);
|
snprintf(buffer, bsize, fmt_dec_10, dop);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
snprintf(buffer, bsize, fmt_dec_100, dop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatLatitude"){
|
else if (value->getFormat() == "formatLatitude"){
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
double lat = value->value;
|
double lat = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
String latitude = "";
|
String latitude = "";
|
||||||
String latdir = "";
|
String latdir = "";
|
||||||
float degree = abs(int(lat));
|
float degree = abs(int(lat));
|
||||||
float minute = abs((lat - int(lat)) * 60);
|
float minute = abs((lat - int(lat)) * 60);
|
||||||
if(lat > 0){
|
if (lat > 0){
|
||||||
latdir = "N";
|
latdir = "N";
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
latdir = "S";
|
latdir = "S";
|
||||||
}
|
}
|
||||||
latitude = String(degree,0) + "\x90 " + String(minute,4) + "' " + latdir;
|
latitude = String(degree,0) + "\x90 " + String(minute,4) + "' " + latdir;
|
||||||
@@ -364,41 +381,41 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
rawvalue = 35.0 + float(random(0, 10)) / 10000.0;
|
rawvalue = 35.0 + float(random(0, 10)) / 10000.0;
|
||||||
snprintf(buffer,bsize," 51\" %2.4f' N", rawvalue);
|
snprintf(buffer, bsize, " 51\" %2.4f' N", rawvalue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatLongitude"){
|
else if (value->getFormat() == "formatLongitude"){
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
double lon = value->value;
|
double lon = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
String longitude = "";
|
String longitude = "";
|
||||||
String londir = "";
|
String londir = "";
|
||||||
float degree = abs(int(lon));
|
float degree = abs(int(lon));
|
||||||
float minute = abs((lon - int(lon)) * 60);
|
float minute = abs((lon - int(lon)) * 60);
|
||||||
if(lon > 0){
|
if (lon > 0){
|
||||||
londir = "E";
|
londir = "E";
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
londir = "W";
|
londir = "W";
|
||||||
}
|
}
|
||||||
longitude = String(degree,0) + "\x90 " + String(minute,4) + "' " + londir;
|
longitude = String(degree,0) + "\x90 " + String(minute,4) + "' " + londir;
|
||||||
result.unit = "";
|
result.unit = "";
|
||||||
strcpy(buffer, longitude.c_str());
|
strcpy(buffer, longitude.c_str());
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 6.0 + float(random(0, 10)) / 100000.0;
|
rawvalue = 6.0 + float(random(0, 10)) / 100000.0;
|
||||||
snprintf(buffer,bsize," 15\" %2.4f'", rawvalue);
|
snprintf(buffer, bsize, " 15\" %2.4f'", rawvalue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatDepth"){
|
else if (value->getFormat() == "formatDepth"){
|
||||||
double depth = 0;
|
double depth = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
depth = value->value;
|
depth = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 18.0 + float(random(0, 100)) / 10.0;
|
rawvalue = 18.0 + float(random(0, 100)) / 10.0;
|
||||||
depth = rawvalue;
|
depth = rawvalue;
|
||||||
}
|
}
|
||||||
@@ -409,71 +426,84 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
else{
|
else{
|
||||||
result.unit = "m";
|
result.unit = "m";
|
||||||
}
|
}
|
||||||
if(depth < 10){
|
if (depth < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",depth);
|
snprintf(buffer, bsize, fmt_dec_1, depth);
|
||||||
}
|
}
|
||||||
if(depth >= 10 && depth < 100){
|
else if (depth < 100){
|
||||||
snprintf(buffer,bsize,"%3.1f",depth);
|
snprintf(buffer, bsize, fmt_dec_10, depth);
|
||||||
}
|
}
|
||||||
if(depth >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",depth);
|
snprintf(buffer, bsize, fmt_dec_100, depth);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXte"){
|
else if (value->getFormat() == "formatXte"){
|
||||||
double xte = 0;
|
double xte = 0;
|
||||||
if (!usesimudata) {
|
if(usesimudata == false) {
|
||||||
xte = abs(value->value);
|
xte = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
} else {
|
}
|
||||||
|
else{
|
||||||
rawvalue = 6.0 + float(random(0, 4));
|
rawvalue = 6.0 + float(random(0, 4));
|
||||||
xte = rawvalue;
|
xte = rawvalue;
|
||||||
}
|
}
|
||||||
if (xte >= 100) {
|
if(String(distanceFormat) == "km"){
|
||||||
snprintf(buffer,bsize,"%3.0f",value->value);
|
xte = xte * 0.001;
|
||||||
} else if (xte >= 10) {
|
result.unit = "km";
|
||||||
snprintf(buffer,bsize,"%3.1f",value->value);
|
}
|
||||||
} else {
|
else if(String(distanceFormat) == "nm"){
|
||||||
snprintf(buffer,bsize,"%3.2f",value->value);
|
xte = xte * 0.000539957;
|
||||||
|
result.unit = "nm";
|
||||||
|
}
|
||||||
|
else{;
|
||||||
|
result.unit = "m";
|
||||||
|
}
|
||||||
|
if(xte < 10){
|
||||||
|
snprintf(buffer,bsize,"%3.2f",xte);
|
||||||
|
}
|
||||||
|
if(xte >= 10 && xte < 100){
|
||||||
|
snprintf(buffer,bsize,"%3.1f",xte);
|
||||||
|
}
|
||||||
|
if(xte >= 100){
|
||||||
|
snprintf(buffer,bsize,"%3.0f",xte);
|
||||||
}
|
}
|
||||||
result.unit = "nm";
|
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "kelvinToC"){
|
else if (value->getFormat() == "kelvinToC"){
|
||||||
double temp = 0;
|
double temp = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
temp = value->value;
|
temp = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 296.0 + float(random(0, 10)) / 10.0;
|
rawvalue = 296.0 + float(random(0, 10)) / 10.0;
|
||||||
temp = rawvalue;
|
temp = rawvalue;
|
||||||
}
|
}
|
||||||
if(String(tempFormat) == "C"){
|
if (String(tempFormat) == "C") {
|
||||||
temp = temp - 273.15;
|
temp = temp - 273.15;
|
||||||
result.unit = "C";
|
result.unit = "C";
|
||||||
}
|
}
|
||||||
else if(String(tempFormat) == "F"){
|
else if (String(tempFormat) == "F") {
|
||||||
temp = (temp - 273.15) * 9 / 5 + 32;
|
temp = (temp - 273.15) * 9 / 5 + 32;
|
||||||
result.unit = "F";
|
result.unit = "F";
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
result.unit = "K";
|
result.unit = "K";
|
||||||
}
|
}
|
||||||
if(temp < 10){
|
if(temp < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",temp);
|
snprintf(buffer, bsize, fmt_dec_1, temp);
|
||||||
}
|
}
|
||||||
if(temp >= 10 && temp < 100){
|
else if (temp < 100) {
|
||||||
snprintf(buffer,bsize,"%3.1f",temp);
|
snprintf(buffer, bsize, fmt_dec_10, temp);
|
||||||
}
|
}
|
||||||
if(temp >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",temp);
|
snprintf(buffer, bsize, fmt_dec_100, temp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "mtr2nm"){
|
else if (value->getFormat() == "mtr2nm"){
|
||||||
double distance = 0;
|
double distance = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
distance = value->value;
|
distance = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
@@ -481,25 +511,25 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
rawvalue = 2960.0 + float(random(0, 10));
|
rawvalue = 2960.0 + float(random(0, 10));
|
||||||
distance = rawvalue;
|
distance = rawvalue;
|
||||||
}
|
}
|
||||||
if(String(distanceFormat) == "km"){
|
if (String(distanceFormat) == "km") {
|
||||||
distance = distance * 0.001;
|
distance = distance * 0.001;
|
||||||
result.unit = "km";
|
result.unit = "km";
|
||||||
}
|
}
|
||||||
else if(String(distanceFormat) == "nm"){
|
else if (String(distanceFormat) == "nm") {
|
||||||
distance = distance * 0.000539957;
|
distance = distance * 0.000539957;
|
||||||
result.unit = "nm";
|
result.unit = "nm";
|
||||||
}
|
}
|
||||||
else{;
|
else {
|
||||||
result.unit = "m";
|
result.unit = "m";
|
||||||
}
|
}
|
||||||
if(distance < 10){
|
if (distance < 10){
|
||||||
snprintf(buffer,bsize,"%3.2f",distance);
|
snprintf(buffer, bsize, fmt_dec_1, distance);
|
||||||
}
|
}
|
||||||
if(distance >= 10 && distance < 100){
|
else if (distance < 100){
|
||||||
snprintf(buffer,bsize,"%3.1f",distance);
|
snprintf(buffer, bsize, fmt_dec_10, distance);
|
||||||
}
|
}
|
||||||
if(distance >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",distance);
|
snprintf(buffer, bsize, fmt_dec_100, distance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
@@ -508,122 +538,122 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:P:P"){
|
else if (value->getFormat() == "formatXdr:P:P"){
|
||||||
double pressure = 0;
|
double pressure = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
pressure = value->value;
|
pressure = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
pressure = pressure / 100.0; // Unit conversion form Pa to hPa
|
pressure = pressure / 100.0; // Unit conversion form Pa to hPa
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 968 + float(random(0, 10));
|
rawvalue = 968 + float(random(0, 10));
|
||||||
pressure = rawvalue;
|
pressure = rawvalue;
|
||||||
}
|
}
|
||||||
snprintf(buffer,bsize,"%4.0f",pressure);
|
snprintf(buffer, bsize, "%4.0f", pressure);
|
||||||
result.unit = "hPa";
|
result.unit = "hPa";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:P:B"){
|
else if (value->getFormat() == "formatXdr:P:B"){
|
||||||
double pressure = 0;
|
double pressure = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
pressure = value->value;
|
pressure = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
pressure = pressure / 100.0; // Unit conversion form Pa to mBar
|
pressure = pressure / 100.0; // Unit conversion form Pa to mBar
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
pressure = 968 + float(random(0, 10));
|
pressure = 968 + float(random(0, 10));
|
||||||
}
|
}
|
||||||
snprintf(buffer,bsize,"%4.0f",pressure);
|
snprintf(buffer, bsize, "%4.0f", pressure);
|
||||||
result.unit = "mBar";
|
result.unit = "mBar";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:U:V"){
|
else if (value->getFormat() == "formatXdr:U:V"){
|
||||||
double voltage = 0;
|
double voltage = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
voltage = value->value;
|
voltage = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 12 + float(random(0, 30)) / 10.0;
|
rawvalue = 12 + float(random(0, 30)) / 10.0;
|
||||||
voltage = rawvalue;
|
voltage = rawvalue;
|
||||||
}
|
}
|
||||||
if(voltage < 10){
|
if (voltage < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",voltage);
|
snprintf(buffer, bsize, fmt_dec_1, voltage);
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
snprintf(buffer,bsize,"%3.1f",voltage);
|
snprintf(buffer, bsize, fmt_dec_10, voltage);
|
||||||
}
|
}
|
||||||
result.unit = "V";
|
result.unit = "V";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:I:A"){
|
else if (value->getFormat() == "formatXdr:I:A"){
|
||||||
double current = 0;
|
double current = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
current = value->value;
|
current = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 8.2 + float(random(0, 50)) / 10.0;
|
rawvalue = 8.2 + float(random(0, 50)) / 10.0;
|
||||||
current = rawvalue;
|
current = rawvalue;
|
||||||
}
|
}
|
||||||
if(current < 10){
|
if (current < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",current);
|
snprintf(buffer, bsize, fmt_dec_1, current);
|
||||||
}
|
}
|
||||||
if(current >= 10 && current < 100){
|
else if(current < 100) {
|
||||||
snprintf(buffer,bsize,"%3.1f",current);
|
snprintf(buffer, bsize, fmt_dec_10, current);
|
||||||
}
|
}
|
||||||
if(current >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",current);
|
snprintf(buffer, bsize, fmt_dec_100, current);
|
||||||
}
|
}
|
||||||
result.unit = "A";
|
result.unit = "A";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:C:K"){
|
else if (value->getFormat() == "formatXdr:C:K"){
|
||||||
double temperature = 0;
|
double temperature = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
temperature = value->value - 273.15; // Convert K to C
|
temperature = value->value - 273.15; // Convert K to C
|
||||||
rawvalue = value->value - 273.15;
|
rawvalue = value->value - 273.15;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 21.8 + float(random(0, 50)) / 10.0;
|
rawvalue = 21.8 + float(random(0, 50)) / 10.0;
|
||||||
temperature = rawvalue;
|
temperature = rawvalue;
|
||||||
}
|
}
|
||||||
if(temperature < 10){
|
if (temperature < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",temperature);
|
snprintf(buffer, bsize, fmt_dec_1, temperature);
|
||||||
}
|
}
|
||||||
if(temperature >= 10 && temperature < 100){
|
else if (temperature < 100) {
|
||||||
snprintf(buffer,bsize,"%3.1f",temperature);
|
snprintf(buffer, bsize, fmt_dec_10, temperature);
|
||||||
}
|
}
|
||||||
if(temperature >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",temperature);
|
snprintf(buffer, bsize, fmt_dec_100, temperature);
|
||||||
}
|
}
|
||||||
result.unit = "Deg C";
|
result.unit = "Deg C";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:C:C"){
|
else if (value->getFormat() == "formatXdr:C:C"){
|
||||||
double temperature = 0;
|
double temperature = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
temperature = value->value; // Value in C
|
temperature = value->value; // Value in C
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 21.8 + float(random(0, 50)) / 10.0;
|
rawvalue = 21.8 + float(random(0, 50)) / 10.0;
|
||||||
temperature = rawvalue;
|
temperature = rawvalue;
|
||||||
}
|
}
|
||||||
if(temperature < 10){
|
if (temperature < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",temperature);
|
snprintf(buffer, bsize, fmt_dec_1, temperature);
|
||||||
}
|
}
|
||||||
if(temperature >= 10 && temperature < 100){
|
else if(temperature < 100) {
|
||||||
snprintf(buffer,bsize,"%3.1f",temperature);
|
snprintf(buffer, bsize, fmt_dec_10, temperature);
|
||||||
}
|
}
|
||||||
if(temperature >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",temperature);
|
snprintf(buffer, bsize, fmt_dec_100, temperature);
|
||||||
}
|
}
|
||||||
result.unit = "Deg C";
|
result.unit = "Deg C";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:H:P"){
|
else if (value->getFormat() == "formatXdr:H:P"){
|
||||||
double humidity = 0;
|
double humidity = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
humidity = value->value; // Value in %
|
humidity = value->value; // Value in %
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
@@ -631,143 +661,143 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
rawvalue = 41.3 + float(random(0, 50)) / 10.0;
|
rawvalue = 41.3 + float(random(0, 50)) / 10.0;
|
||||||
humidity = rawvalue;
|
humidity = rawvalue;
|
||||||
}
|
}
|
||||||
if(humidity < 10){
|
if (humidity < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",humidity);
|
snprintf(buffer, bsize, fmt_dec_1, humidity);
|
||||||
}
|
}
|
||||||
if(humidity >= 10 && humidity < 100){
|
else if(humidity < 100) {
|
||||||
snprintf(buffer,bsize,"%3.1f",humidity);
|
snprintf(buffer, bsize, fmt_dec_10, humidity);
|
||||||
}
|
}
|
||||||
if(humidity >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",humidity);
|
snprintf(buffer, bsize, fmt_dec_100, humidity);
|
||||||
}
|
}
|
||||||
result.unit = "%";
|
result.unit = "%";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:V:P"){
|
else if (value->getFormat() == "formatXdr:V:P"){
|
||||||
double volume = 0;
|
double volume = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
volume = value->value; // Value in %
|
volume = value->value; // Value in %
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 85.8 + float(random(0, 50)) / 10.0;
|
rawvalue = 85.8 + float(random(0, 50)) / 10.0;
|
||||||
volume = rawvalue;
|
volume = rawvalue;
|
||||||
}
|
}
|
||||||
if(volume < 10){
|
if (volume < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",volume);
|
snprintf(buffer, bsize, fmt_dec_1, volume);
|
||||||
}
|
}
|
||||||
if(volume >= 10 && volume < 100){
|
else if (volume < 100) {
|
||||||
snprintf(buffer,bsize,"%3.1f",volume);
|
snprintf(buffer, bsize, fmt_dec_10, volume);
|
||||||
}
|
}
|
||||||
if(volume >= 100){
|
else if (volume >= 100) {
|
||||||
snprintf(buffer,bsize,"%3.0f",volume);
|
snprintf(buffer, bsize, fmt_dec_100, volume);
|
||||||
}
|
}
|
||||||
result.unit = "%";
|
result.unit = "%";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:V:M"){
|
else if (value->getFormat() == "formatXdr:V:M"){
|
||||||
double volume = 0;
|
double volume = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
volume = value->value; // Value in l
|
volume = value->value; // Value in l
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 75.2 + float(random(0, 50)) / 10.0;
|
rawvalue = 75.2 + float(random(0, 50)) / 10.0;
|
||||||
volume = rawvalue;
|
volume = rawvalue;
|
||||||
}
|
}
|
||||||
if(volume < 10){
|
if (volume < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",volume);
|
snprintf(buffer, bsize, fmt_dec_1, volume);
|
||||||
}
|
}
|
||||||
if(volume >= 10 && volume < 100){
|
else if (volume < 100) {
|
||||||
snprintf(buffer,bsize,"%3.1f",volume);
|
snprintf(buffer, bsize, fmt_dec_10, volume);
|
||||||
}
|
}
|
||||||
if(volume >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",volume);
|
snprintf(buffer, bsize, fmt_dec_100, volume);
|
||||||
}
|
}
|
||||||
result.unit = "l";
|
result.unit = "l";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:R:I"){
|
else if (value->getFormat() == "formatXdr:R:I"){
|
||||||
double flow = 0;
|
double flow = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
flow = value->value; // Value in l/min
|
flow = value->value; // Value in l/min
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 7.5 + float(random(0, 20)) / 10.0;
|
rawvalue = 7.5 + float(random(0, 20)) / 10.0;
|
||||||
flow = rawvalue;
|
flow = rawvalue;
|
||||||
}
|
}
|
||||||
if(flow < 10){
|
if (flow < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",flow);
|
snprintf(buffer, bsize, fmt_dec_1, flow);
|
||||||
}
|
}
|
||||||
if(flow >= 10 && flow < 100){
|
else if (flow < 100) {
|
||||||
snprintf(buffer,bsize,"%3.1f",flow);
|
snprintf(buffer, bsize, fmt_dec_10, flow);
|
||||||
}
|
}
|
||||||
if(flow >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",flow);
|
snprintf(buffer, bsize, fmt_dec_100, flow);
|
||||||
}
|
}
|
||||||
result.unit = "l/min";
|
result.unit = "l/min";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:G:"){
|
else if (value->getFormat() == "formatXdr:G:"){
|
||||||
double generic = 0;
|
double generic = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
generic = value->value; // Value in l/min
|
generic = value->value;
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 18.5 + float(random(0, 20)) / 10.0;
|
rawvalue = 18.5 + float(random(0, 20)) / 10.0;
|
||||||
generic = rawvalue;
|
generic = rawvalue;
|
||||||
}
|
}
|
||||||
if(generic < 10){
|
if (generic < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",generic);
|
snprintf(buffer, bsize, fmt_dec_1, generic);
|
||||||
}
|
}
|
||||||
if(generic >= 10 && generic < 100){
|
else if (generic < 100) {
|
||||||
snprintf(buffer,bsize,"%3.1f",generic);
|
snprintf(buffer, bsize, fmt_dec_10, generic);
|
||||||
}
|
}
|
||||||
if(generic >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",generic);
|
snprintf(buffer, bsize, fmt_dec_100, generic);
|
||||||
}
|
}
|
||||||
result.unit = "";
|
result.unit = "";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:A:P"){
|
else if (value->getFormat() == "formatXdr:A:P"){
|
||||||
double dplace = 0;
|
double dplace = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
dplace = value->value; // Value in %
|
dplace = value->value; // Value in %
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 55.3 + float(random(0, 20)) / 10.0;
|
rawvalue = 55.3 + float(random(0, 20)) / 10.0;
|
||||||
dplace = rawvalue;
|
dplace = rawvalue;
|
||||||
}
|
}
|
||||||
if(dplace < 10){
|
if (dplace < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",dplace);
|
snprintf(buffer, bsize, fmt_dec_1, dplace);
|
||||||
}
|
}
|
||||||
if(dplace >= 10 && dplace < 100){
|
else if (dplace < 100) {
|
||||||
snprintf(buffer,bsize,"%3.1f",dplace);
|
snprintf(buffer, bsize, fmt_dec_10, dplace);
|
||||||
}
|
}
|
||||||
if(dplace >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",dplace);
|
snprintf(buffer, bsize, fmt_dec_100, dplace);
|
||||||
}
|
}
|
||||||
result.unit = "%";
|
result.unit = "%";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:A:D"){
|
else if (value->getFormat() == "formatXdr:A:D"){
|
||||||
double angle = 0;
|
double angle = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
angle = value->value;
|
angle = value->value;
|
||||||
angle = angle * 57.2958; // Unit conversion form rad to deg
|
angle = angle * 57.2958; // Unit conversion form rad to deg
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = PI / 100 + (random(-5, 5) / 360 * 2* PI);
|
rawvalue = PI / 100 + (random(-5, 5) / 360 * 2* PI);
|
||||||
angle = rawvalue * 57.2958;
|
angle = rawvalue * 57.2958;
|
||||||
}
|
}
|
||||||
if(angle > -10 && angle < 10){
|
if (angle > -10 && angle < 10) {
|
||||||
snprintf(buffer,bsize,"%3.1f",angle);
|
snprintf(buffer,bsize,"%3.1f",angle);
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",angle);
|
snprintf(buffer,bsize,"%3.0f",angle);
|
||||||
}
|
}
|
||||||
result.unit = "Deg";
|
result.unit = "Deg";
|
||||||
@@ -775,41 +805,41 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
|
|||||||
//########################################################
|
//########################################################
|
||||||
else if (value->getFormat() == "formatXdr:T:R"){
|
else if (value->getFormat() == "formatXdr:T:R"){
|
||||||
double rpm = 0;
|
double rpm = 0;
|
||||||
if(usesimudata == false) {
|
if (usesimudata == false) {
|
||||||
rpm = value->value; // Value in rpm
|
rpm = value->value; // Value in rpm
|
||||||
rawvalue = value->value;
|
rawvalue = value->value;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
rawvalue = 2505 + random(0, 20);
|
rawvalue = 2505 + random(0, 20);
|
||||||
rpm = rawvalue;
|
rpm = rawvalue;
|
||||||
}
|
}
|
||||||
if(rpm < 10){
|
if (rpm < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",rpm);
|
snprintf(buffer, bsize, fmt_dec_1, rpm);
|
||||||
}
|
}
|
||||||
if(rpm >= 10 && rpm < 100){
|
else if (rpm < 100) {
|
||||||
snprintf(buffer,bsize,"%3.1f",rpm);
|
snprintf(buffer, bsize, fmt_dec_10, rpm);
|
||||||
}
|
}
|
||||||
if(rpm >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",rpm);
|
snprintf(buffer, bsize, fmt_dec_100, rpm);
|
||||||
}
|
}
|
||||||
result.unit = "rpm";
|
result.unit = "rpm";
|
||||||
}
|
}
|
||||||
//########################################################
|
//########################################################
|
||||||
// Default format
|
// Default format
|
||||||
//########################################################
|
//########################################################
|
||||||
else{
|
else {
|
||||||
if(value->value < 10){
|
if (value->value < 10) {
|
||||||
snprintf(buffer,bsize,"%3.2f",value->value);
|
snprintf(buffer, bsize, fmt_dec_1, value->value);
|
||||||
}
|
}
|
||||||
if(value->value >= 10 && value->value < 100){
|
else if (value->value < 100) {
|
||||||
snprintf(buffer,bsize,"%3.1f",value->value);
|
snprintf(buffer, bsize, fmt_dec_10, value->value);
|
||||||
}
|
}
|
||||||
if(value->value >= 100){
|
else {
|
||||||
snprintf(buffer,bsize,"%3.0f",value->value);
|
snprintf(buffer, bsize, fmt_dec_100, value->value);
|
||||||
}
|
}
|
||||||
result.unit = "";
|
result.unit = "";
|
||||||
}
|
}
|
||||||
buffer[bsize]=0;
|
buffer[bsize] = 0;
|
||||||
result.value = rawvalue; // Return value is only necessary in case of simulation of graphic pointer
|
result.value = rawvalue; // Return value is only necessary in case of simulation of graphic pointer
|
||||||
result.svalue = String(buffer);
|
result.svalue = String(buffer);
|
||||||
return result;
|
return result;
|
||||||
@@ -82,7 +82,7 @@
|
|||||||
// Direction pin for RS485 NMEA0183
|
// Direction pin for RS485 NMEA0183
|
||||||
#define OBP_DIRECTION_PIN 8
|
#define OBP_DIRECTION_PIN 8
|
||||||
// I2C
|
// I2C
|
||||||
#define I2C_SPEED 10000UL // 10kHz clock speed on I2C bus
|
#define I2C_SPEED 100000UL // 100kHz clock speed on I2C bus
|
||||||
#define OBP_I2C_SDA 21
|
#define OBP_I2C_SDA 21
|
||||||
#define OBP_I2C_SCL 38
|
#define OBP_I2C_SCL 38
|
||||||
// DS1388 RTC
|
// DS1388 RTC
|
||||||
@@ -120,10 +120,10 @@
|
|||||||
#define SHOW_TIME 6000 // Show time in [ms] for logo and WiFi QR code
|
#define SHOW_TIME 6000 // Show time in [ms] for logo and WiFi QR code
|
||||||
#define FULL_REFRESH_TIME 600 // Refresh cycle time in [s][600...3600] for full display update (very important healcy function)
|
#define FULL_REFRESH_TIME 600 // Refresh cycle time in [s][600...3600] for full display update (very important healcy function)
|
||||||
// SPI SD-Card
|
// SPI SD-Card
|
||||||
#define SD_SPI_CS 10
|
#define SD_SPI_CS GPIO_NUM_10
|
||||||
#define SD_SPI_MOSI 40
|
#define SD_SPI_MOSI GPIO_NUM_40
|
||||||
#define SD_SPI_CLK 39
|
#define SD_SPI_CLK GPIO_NUM_39
|
||||||
#define SD_SPI_MISO 13
|
#define SD_SPI_MISO GPIO_NUM_13
|
||||||
|
|
||||||
// GPS (NEO-6M, NEO-M8N, ATGM336H)
|
// GPS (NEO-6M, NEO-M8N, ATGM336H)
|
||||||
#define OBP_GPS_RX 19
|
#define OBP_GPS_RX 19
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ void qrWiFi(String ssid, String passwd, uint16_t fgcolor, uint16_t bgcolor){
|
|||||||
box_y = box_y + box_s;
|
box_y = box_y + box_s;
|
||||||
box_x = init_x;
|
box_x = init_x;
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
getdisplay().setFont(&Ubuntu_Bold32pt8b);
|
||||||
getdisplay().setTextColor(fgcolor);
|
getdisplay().setTextColor(fgcolor);
|
||||||
getdisplay().setCursor(140, 285);
|
getdisplay().setCursor(140, 285);
|
||||||
getdisplay().print("WiFi");
|
getdisplay().print("WiFi");
|
||||||
|
|||||||
322
lib/obp60task/OBPDataOperations.cpp
Normal file
322
lib/obp60task/OBPDataOperations.cpp
Normal file
@@ -0,0 +1,322 @@
|
|||||||
|
#include "OBPDataOperations.h"
|
||||||
|
|
||||||
|
// --- Class HstryBuf ---------------
|
||||||
|
// Init history buffers for selected boat data
|
||||||
|
void HstryBuf::init(BoatValueList* boatValues, GwLog *log) {
|
||||||
|
|
||||||
|
logger = log;
|
||||||
|
|
||||||
|
int hstryUpdFreq = 1000; // Update frequency for history buffers in ms
|
||||||
|
int hstryMinVal = 0; // Minimum value for these history buffers
|
||||||
|
twdHstryMax = 6283; // Max value for wind direction (TWD, AWD) in rad [0...2*PI], shifted by 1000 for 3 decimals
|
||||||
|
twsHstryMax = 65000; // Max value for wind speed (TWS, AWS) in m/s [0..65], shifted by 1000 for 3 decimals
|
||||||
|
awdHstryMax = twdHstryMax;
|
||||||
|
awsHstryMax = twsHstryMax;
|
||||||
|
twdHstryMin = hstryMinVal;
|
||||||
|
twsHstryMin = hstryMinVal;
|
||||||
|
awdHstryMin = hstryMinVal;
|
||||||
|
awsHstryMin = hstryMinVal;
|
||||||
|
const double DBL_MAX = std::numeric_limits<double>::max();
|
||||||
|
|
||||||
|
// Initialize history buffers with meta data
|
||||||
|
hstryBufList.twdHstry->setMetaData("TWD", "formatCourse", hstryUpdFreq, hstryMinVal, twdHstryMax);
|
||||||
|
hstryBufList.twsHstry->setMetaData("TWS", "formatKnots", hstryUpdFreq, hstryMinVal, twsHstryMax);
|
||||||
|
hstryBufList.awdHstry->setMetaData("AWD", "formatCourse", hstryUpdFreq, hstryMinVal, twdHstryMax);
|
||||||
|
hstryBufList.awsHstry->setMetaData("AWS", "formatKnots", hstryUpdFreq, hstryMinVal, twsHstryMax);
|
||||||
|
|
||||||
|
// create boat values for history data types, if they don't exist yet
|
||||||
|
twdBVal = boatValues->findValueOrCreate(hstryBufList.twdHstry->getName());
|
||||||
|
twsBVal = boatValues->findValueOrCreate(hstryBufList.twsHstry->getName());
|
||||||
|
twaBVal = boatValues->findValueOrCreate("TWA");
|
||||||
|
awdBVal = boatValues->findValueOrCreate(hstryBufList.awdHstry->getName());
|
||||||
|
awsBVal = boatValues->findValueOrCreate(hstryBufList.awsHstry->getName());
|
||||||
|
|
||||||
|
if (!awdBVal->valid) { // AWD usually does not exist
|
||||||
|
awdBVal->setFormat(hstryBufList.awdHstry->getFormat());
|
||||||
|
awdBVal->value = DBL_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
// collect boat values for true wind calculation
|
||||||
|
awaBVal = boatValues->findValueOrCreate("AWA");
|
||||||
|
hdtBVal = boatValues->findValueOrCreate("HDT");
|
||||||
|
hdmBVal = boatValues->findValueOrCreate("HDM");
|
||||||
|
varBVal = boatValues->findValueOrCreate("VAR");
|
||||||
|
cogBVal = boatValues->findValueOrCreate("COG");
|
||||||
|
sogBVal = boatValues->findValueOrCreate("SOG");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle history buffers for TWD, TWS, AWD, AWS
|
||||||
|
//void HstryBuf::handleHstryBuf(GwApi* api, BoatValueList* boatValues, bool useSimuData) {
|
||||||
|
void HstryBuf::handleHstryBuf(bool useSimuData) {
|
||||||
|
|
||||||
|
static int16_t twd = 20; //initial value only relevant if we use simulation data
|
||||||
|
static uint16_t tws = 20; //initial value only relevant if we use simulation data
|
||||||
|
static double awd, aws, hdt = 20; //initial value only relevant if we use simulation data
|
||||||
|
GwApi::BoatValue *calBVal; // temp variable just for data calibration -> we don't want to calibrate the original data here
|
||||||
|
|
||||||
|
LOG_DEBUG(GwLog::DEBUG,"obp60task handleHstryBuf: TWD_isValid? %d, twdBVal: %.1f, twaBVal: %.1f, twsBVal: %.1f", twdBVal->valid, twdBVal->value * RAD_TO_DEG,
|
||||||
|
twaBVal->value * RAD_TO_DEG, twsBVal->value * 3.6 / 1.852);
|
||||||
|
|
||||||
|
if (twdBVal->valid) {
|
||||||
|
calBVal = new GwApi::BoatValue("TWD"); // temporary solution for calibration of history buffer values
|
||||||
|
calBVal->setFormat(twdBVal->getFormat());
|
||||||
|
calBVal->value = twdBVal->value;
|
||||||
|
calBVal->valid = twdBVal->valid;
|
||||||
|
calibrationData.calibrateInstance(calBVal, logger); // Check if boat data value is to be calibrated
|
||||||
|
twd = static_cast<int16_t>(std::round(calBVal->value * 1000.0));
|
||||||
|
if (twd >= twdHstryMin && twd <= twdHstryMax) {
|
||||||
|
hstryBufList.twdHstry->add(twd);
|
||||||
|
}
|
||||||
|
delete calBVal;
|
||||||
|
calBVal = nullptr;
|
||||||
|
} else if (useSimuData) {
|
||||||
|
twd += random(-20, 20);
|
||||||
|
twd = WindUtils::to360(twd);
|
||||||
|
hstryBufList.twdHstry->add(static_cast<int16_t>(DegToRad(twd) * 1000.0));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (twsBVal->valid) {
|
||||||
|
calBVal = new GwApi::BoatValue("TWS"); // temporary solution for calibration of history buffer values
|
||||||
|
calBVal->setFormat(twsBVal->getFormat());
|
||||||
|
calBVal->value = twsBVal->value;
|
||||||
|
calBVal->valid = twsBVal->valid;
|
||||||
|
calibrationData.calibrateInstance(calBVal, logger); // Check if boat data value is to be calibrated
|
||||||
|
tws = static_cast<uint16_t>(std::round(calBVal->value * 1000));
|
||||||
|
if (tws >= twsHstryMin && tws <= twsHstryMax) {
|
||||||
|
hstryBufList.twsHstry->add(tws);
|
||||||
|
}
|
||||||
|
delete calBVal;
|
||||||
|
calBVal = nullptr;
|
||||||
|
} else if (useSimuData) {
|
||||||
|
tws += random(-5000, 5000); // TWS value in m/s; expands to 3 decimals
|
||||||
|
tws = constrain(tws, 0, 25000); // Limit TWS to [0..25] m/s
|
||||||
|
hstryBufList.twsHstry->add(tws);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (awaBVal->valid) {
|
||||||
|
if (hdtBVal->valid) {
|
||||||
|
hdt = hdtBVal->value; // Use HDT if available
|
||||||
|
} else {
|
||||||
|
hdt = WindUtils::calcHDT(&hdmBVal->value, &varBVal->value, &cogBVal->value, &sogBVal->value);
|
||||||
|
}
|
||||||
|
|
||||||
|
awd = awaBVal->value + hdt;
|
||||||
|
awd = WindUtils::to2PI(awd);
|
||||||
|
calBVal = new GwApi::BoatValue("AWD"); // temporary solution for calibration of history buffer values
|
||||||
|
calBVal->value = awd;
|
||||||
|
calBVal->setFormat(awdBVal->getFormat());
|
||||||
|
calBVal->valid = true;
|
||||||
|
calibrationData.calibrateInstance(calBVal, logger); // Check if boat data value is to be calibrated
|
||||||
|
awdBVal->value = calBVal->value;
|
||||||
|
awdBVal->valid = true;
|
||||||
|
awd = std::round(calBVal->value * 1000.0);
|
||||||
|
if (awd >= awdHstryMin && awd <= awdHstryMax) {
|
||||||
|
hstryBufList.awdHstry->add(static_cast<int16_t>(awd));
|
||||||
|
}
|
||||||
|
delete calBVal;
|
||||||
|
calBVal = nullptr;
|
||||||
|
} else if (useSimuData) {
|
||||||
|
awd += random(-20, 20);
|
||||||
|
awd = WindUtils::to360(awd);
|
||||||
|
hstryBufList.awdHstry->add(static_cast<int16_t>(DegToRad(awd) * 1000.0));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (awsBVal->valid) {
|
||||||
|
calBVal = new GwApi::BoatValue("AWS"); // temporary solution for calibration of history buffer values
|
||||||
|
calBVal->setFormat(awsBVal->getFormat());
|
||||||
|
calBVal->value = awsBVal->value;
|
||||||
|
calBVal->valid = awsBVal->valid;
|
||||||
|
calibrationData.calibrateInstance(calBVal, logger); // Check if boat data value is to be calibrated
|
||||||
|
aws = std::round(calBVal->value * 1000);
|
||||||
|
if (aws >= awsHstryMin && aws <= awsHstryMax) {
|
||||||
|
hstryBufList.awsHstry->add(static_cast<uint16_t>(aws));
|
||||||
|
}
|
||||||
|
delete calBVal;
|
||||||
|
calBVal = nullptr;
|
||||||
|
} else if (useSimuData) {
|
||||||
|
aws += random(-5000, 5000); // TWS value in m/s; expands to 1 decimal
|
||||||
|
aws = constrain(aws, 0, 25000); // Limit TWS to [0..25] m/s
|
||||||
|
hstryBufList.awsHstry->add(aws);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// --- Class HstryBuf ---------------
|
||||||
|
|
||||||
|
// --- Class WindUtils --------------
|
||||||
|
double WindUtils::to2PI(double a)
|
||||||
|
{
|
||||||
|
a = fmod(a, 2 * M_PI);
|
||||||
|
if (a < 0.0) {
|
||||||
|
a += 2 * M_PI;
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
double WindUtils::toPI(double a)
|
||||||
|
{
|
||||||
|
a += M_PI;
|
||||||
|
a = to2PI(a);
|
||||||
|
a -= M_PI;
|
||||||
|
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
double WindUtils::to360(double a)
|
||||||
|
{
|
||||||
|
a = fmod(a, 360);
|
||||||
|
if (a < 0.0) {
|
||||||
|
a += 360;
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
double WindUtils::to180(double a)
|
||||||
|
{
|
||||||
|
a += 180;
|
||||||
|
a = to360(a);
|
||||||
|
a -= 180;
|
||||||
|
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WindUtils::toCart(const double* phi, const double* r, double* x, double* y)
|
||||||
|
{
|
||||||
|
*x = *r * sin(*phi);
|
||||||
|
*y = *r * cos(*phi);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WindUtils::toPol(const double* x, const double* y, double* phi, double* r)
|
||||||
|
{
|
||||||
|
*phi = (M_PI / 2) - atan2(*y, *x);
|
||||||
|
*phi = to2PI(*phi);
|
||||||
|
*r = sqrt(*x * *x + *y * *y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WindUtils::addPolar(const double* phi1, const double* r1,
|
||||||
|
const double* phi2, const double* r2,
|
||||||
|
double* phi, double* r)
|
||||||
|
{
|
||||||
|
double x1, y1, x2, y2;
|
||||||
|
toCart(phi1, r1, &x1, &y1);
|
||||||
|
toCart(phi2, r2, &x2, &y2);
|
||||||
|
x1 += x2;
|
||||||
|
y1 += y2;
|
||||||
|
toPol(&x1, &y1, phi, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WindUtils::calcTwdSA(const double* AWA, const double* AWS,
|
||||||
|
const double* CTW, const double* STW, const double* HDT,
|
||||||
|
double* TWD, double* TWS, double* TWA)
|
||||||
|
{
|
||||||
|
double awd = *AWA + *HDT;
|
||||||
|
awd = to2PI(awd);
|
||||||
|
double stw = -*STW;
|
||||||
|
addPolar(&awd, AWS, CTW, &stw, TWD, TWS);
|
||||||
|
|
||||||
|
// Normalize TWD and TWA to 0-360°
|
||||||
|
*TWD = to2PI(*TWD);
|
||||||
|
*TWA = toPI(*TWD - *HDT);
|
||||||
|
}
|
||||||
|
|
||||||
|
double WindUtils::calcHDT(const double* hdmVal, const double* varVal, const double* cogVal, const double* sogVal)
|
||||||
|
{
|
||||||
|
double hdt;
|
||||||
|
double minSogVal = 0.1; // SOG below this value (m/s) is assumed to be data noise from GPS sensor
|
||||||
|
|
||||||
|
if (*hdmVal != DBL_MAX) {
|
||||||
|
hdt = *hdmVal + (*varVal != DBL_MAX ? *varVal : 0.0); // Use corrected HDM if HDT is not available (or just HDM if VAR is not available)
|
||||||
|
hdt = to2PI(hdt);
|
||||||
|
} else if (*cogVal != DBL_MAX && *sogVal >= minSogVal) {
|
||||||
|
hdt = *cogVal; // Use COG as fallback if HDT and HDM are not available, and SOG is not data noise
|
||||||
|
} else {
|
||||||
|
hdt = DBL_MAX; // Cannot calculate HDT without valid HDM or HDM+VAR or COG
|
||||||
|
}
|
||||||
|
|
||||||
|
return hdt;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WindUtils::calcTrueWind(const double* awaVal, const double* awsVal,
|
||||||
|
const double* cogVal, const double* stwVal, const double* sogVal, const double* hdtVal,
|
||||||
|
const double* hdmVal, const double* varVal, double* twdVal, double* twsVal, double* twaVal)
|
||||||
|
{
|
||||||
|
double stw, hdt, ctw;
|
||||||
|
double twd, tws, twa;
|
||||||
|
double minSogVal = 0.1; // SOG below this value (m/s) is assumed to be data noise from GPS sensor
|
||||||
|
|
||||||
|
if (*hdtVal != DBL_MAX) {
|
||||||
|
hdt = *hdtVal; // Use HDT if available
|
||||||
|
} else {
|
||||||
|
hdt = calcHDT(hdmVal, varVal, cogVal, sogVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*cogVal != DBL_MAX && *sogVal >= minSogVal) { // if SOG is data noise, we don't trust COG
|
||||||
|
|
||||||
|
ctw = *cogVal; // Use COG for CTW if available
|
||||||
|
} else {
|
||||||
|
ctw = hdt; // 2nd approximation for CTW; hdt must exist if we reach this part of the code
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*stwVal != DBL_MAX) {
|
||||||
|
stw = *stwVal; // Use STW if available
|
||||||
|
} else if (*sogVal != DBL_MAX) {
|
||||||
|
stw = *sogVal;
|
||||||
|
} else {
|
||||||
|
// If STW and SOG are not available, we cannot calculate true wind
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Serial.println("\ncalcTrueWind: HDT: " + String(hdt) + ", CTW: " + String(ctw) + ", STW: " + String(stw));
|
||||||
|
|
||||||
|
if ((*awaVal == DBL_MAX) || (*awsVal == DBL_MAX)) {
|
||||||
|
// Cannot calculate true wind without valid AWA, AWS; other checks are done earlier
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
calcTwdSA(awaVal, awsVal, &ctw, &stw, &hdt, &twd, &tws, &twa);
|
||||||
|
*twdVal = twd;
|
||||||
|
*twsVal = tws;
|
||||||
|
*twaVal = twa;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate true wind data and add to obp60task boat data list
|
||||||
|
bool WindUtils::addTrueWind(GwApi* api, BoatValueList* boatValues, GwLog* log) {
|
||||||
|
|
||||||
|
GwLog* logger = log;
|
||||||
|
|
||||||
|
double awaVal, awsVal, cogVal, stwVal, sogVal, hdtVal, hdmVal, varVal;
|
||||||
|
double twd, tws, twa;
|
||||||
|
bool isCalculated = false;
|
||||||
|
|
||||||
|
awaVal = awaBVal->valid ? awaBVal->value : DBL_MAX;
|
||||||
|
awsVal = awsBVal->valid ? awsBVal->value : DBL_MAX;
|
||||||
|
cogVal = cogBVal->valid ? cogBVal->value : DBL_MAX;
|
||||||
|
stwVal = stwBVal->valid ? stwBVal->value : DBL_MAX;
|
||||||
|
sogVal = sogBVal->valid ? sogBVal->value : DBL_MAX;
|
||||||
|
hdtVal = hdtBVal->valid ? hdtBVal->value : DBL_MAX;
|
||||||
|
hdmVal = hdmBVal->valid ? hdmBVal->value : DBL_MAX;
|
||||||
|
varVal = varBVal->valid ? varBVal->value : DBL_MAX;
|
||||||
|
LOG_DEBUG(GwLog::DEBUG,"obp60task addTrueWind: AWA %.1f, AWS %.1f, COG %.1f, STW %.1f, SOG %.2f, HDT %.1f, HDM %.1f, VAR %.1f", awaBVal->value * RAD_TO_DEG, awsBVal->value * 3.6 / 1.852,
|
||||||
|
cogBVal->value * RAD_TO_DEG, stwBVal->value * 3.6 / 1.852, sogBVal->value * 3.6 / 1.852, hdtBVal->value * RAD_TO_DEG, hdmBVal->value * RAD_TO_DEG, varBVal->value * RAD_TO_DEG);
|
||||||
|
|
||||||
|
isCalculated = calcTrueWind(&awaVal, &awsVal, &cogVal, &stwVal, &sogVal, &hdtVal, &hdmVal, &varVal, &twd, &tws, &twa);
|
||||||
|
|
||||||
|
if (isCalculated) { // Replace values only, if successfully calculated and not already available
|
||||||
|
if (!twdBVal->valid) {
|
||||||
|
twdBVal->value = twd;
|
||||||
|
twdBVal->valid = true;
|
||||||
|
}
|
||||||
|
if (!twsBVal->valid) {
|
||||||
|
twsBVal->value = tws;
|
||||||
|
twsBVal->valid = true;
|
||||||
|
}
|
||||||
|
if (!twaBVal->valid) {
|
||||||
|
twaBVal->value = twa;
|
||||||
|
twaBVal->valid = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOG_DEBUG(GwLog::DEBUG,"obp60task addTrueWind: isCalculated %d, TWD %.1f, TWA %.1f, TWS %.1f", isCalculated, twdBVal->value * RAD_TO_DEG,
|
||||||
|
twaBVal->value * RAD_TO_DEG, twsBVal->value * 3.6 / 1.852);
|
||||||
|
|
||||||
|
return isCalculated;
|
||||||
|
}
|
||||||
|
// --- Class WindUtils --------------
|
||||||
91
lib/obp60task/OBPDataOperations.h
Normal file
91
lib/obp60task/OBPDataOperations.h
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <N2kMessages.h>
|
||||||
|
#include "OBPRingBuffer.h"
|
||||||
|
#include "BoatDataCalibration.h" // Functions lib for data instance calibration
|
||||||
|
#include "obp60task.h"
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
RingBuffer<int16_t>* twdHstry;
|
||||||
|
RingBuffer<uint16_t>* twsHstry;
|
||||||
|
RingBuffer<int16_t>* awdHstry;
|
||||||
|
RingBuffer<uint16_t>* awsHstry;
|
||||||
|
} tBoatHstryData; // Holds pointers to all history buffers for boat data
|
||||||
|
|
||||||
|
class HstryBuf {
|
||||||
|
private:
|
||||||
|
GwLog *logger;
|
||||||
|
|
||||||
|
RingBuffer<int16_t> twdHstry; // Circular buffer to store true wind direction values
|
||||||
|
RingBuffer<uint16_t> twsHstry; // Circular buffer to store true wind speed values (TWS)
|
||||||
|
RingBuffer<int16_t> awdHstry; // Circular buffer to store apparant wind direction values
|
||||||
|
RingBuffer<uint16_t> awsHstry; // Circular buffer to store apparant xwind speed values (AWS)
|
||||||
|
int16_t twdHstryMin; // Min value for wind direction (TWD) in history buffer
|
||||||
|
int16_t twdHstryMax; // Max value for wind direction (TWD) in history buffer
|
||||||
|
uint16_t twsHstryMin;
|
||||||
|
uint16_t twsHstryMax;
|
||||||
|
int16_t awdHstryMin;
|
||||||
|
int16_t awdHstryMax;
|
||||||
|
uint16_t awsHstryMin;
|
||||||
|
uint16_t awsHstryMax;
|
||||||
|
|
||||||
|
// boat values for buffers and for true wind calculation
|
||||||
|
GwApi::BoatValue *twdBVal, *twsBVal, *twaBVal, *awdBVal, *awsBVal;
|
||||||
|
GwApi::BoatValue *awaBVal, *hdtBVal, *hdmBVal, *varBVal, *cogBVal, *sogBVal;
|
||||||
|
|
||||||
|
public:
|
||||||
|
tBoatHstryData hstryBufList;
|
||||||
|
|
||||||
|
HstryBuf(){
|
||||||
|
hstryBufList = {&twdHstry, &twsHstry, &awdHstry, &awsHstry}; // Generate history buffers of zero size
|
||||||
|
};
|
||||||
|
|
||||||
|
HstryBuf(int size) {
|
||||||
|
hstryBufList = {&twdHstry, &twsHstry, &awdHstry, &awsHstry};
|
||||||
|
hstryBufList.twdHstry->resize(size); // store <size> xWD values for <size>/60 minutes history
|
||||||
|
hstryBufList.twsHstry->resize(size);
|
||||||
|
hstryBufList.awdHstry->resize(size);
|
||||||
|
hstryBufList.awsHstry->resize(size);
|
||||||
|
};
|
||||||
|
void init(BoatValueList* boatValues, GwLog *log);
|
||||||
|
void handleHstryBuf(bool useSimuData);
|
||||||
|
};
|
||||||
|
|
||||||
|
class WindUtils {
|
||||||
|
private:
|
||||||
|
GwApi::BoatValue *twdBVal, *twsBVal, *twaBVal;
|
||||||
|
GwApi::BoatValue *awaBVal, *awsBVal, *cogBVal, *stwBVal, *sogBVal, *hdtBVal, *hdmBVal, *varBVal;
|
||||||
|
static constexpr double DBL_MAX = std::numeric_limits<double>::max();
|
||||||
|
|
||||||
|
public:
|
||||||
|
WindUtils(BoatValueList* boatValues){
|
||||||
|
twdBVal = boatValues->findValueOrCreate("TWD");
|
||||||
|
twsBVal = boatValues->findValueOrCreate("TWS");
|
||||||
|
twaBVal = boatValues->findValueOrCreate("TWA");
|
||||||
|
awaBVal = boatValues->findValueOrCreate("AWA");
|
||||||
|
awsBVal = boatValues->findValueOrCreate("AWS");
|
||||||
|
cogBVal = boatValues->findValueOrCreate("COG");
|
||||||
|
stwBVal = boatValues->findValueOrCreate("STW");
|
||||||
|
sogBVal = boatValues->findValueOrCreate("SOG");
|
||||||
|
hdtBVal = boatValues->findValueOrCreate("HDT");
|
||||||
|
hdmBVal = boatValues->findValueOrCreate("HDM");
|
||||||
|
varBVal = boatValues->findValueOrCreate("VAR");
|
||||||
|
};
|
||||||
|
static double to2PI(double a);
|
||||||
|
static double toPI(double a);
|
||||||
|
static double to360(double a);
|
||||||
|
static double to180(double a);
|
||||||
|
void toCart(const double* phi, const double* r, double* x, double* y);
|
||||||
|
void toPol(const double* x, const double* y, double* phi, double* r);
|
||||||
|
void addPolar(const double* phi1, const double* r1,
|
||||||
|
const double* phi2, const double* r2,
|
||||||
|
double* phi, double* r);
|
||||||
|
void calcTwdSA(const double* AWA, const double* AWS,
|
||||||
|
const double* CTW, const double* STW, const double* HDT,
|
||||||
|
double* TWD, double* TWS, double* TWA);
|
||||||
|
static double calcHDT(const double* hdmVal, const double* varVal, const double* cogVal, const double* sogVal);
|
||||||
|
bool calcTrueWind(const double* awaVal, const double* awsVal,
|
||||||
|
const double* cogVal, const double* stwVal, const double* sogVal, const double* hdtVal,
|
||||||
|
const double* hdmVal, const double* varVal, double* twdVal, double* twsVal, double* twaVal);
|
||||||
|
bool addTrueWind(GwApi* api, BoatValueList* boatValues, GwLog *log);
|
||||||
|
};
|
||||||
99
lib/obp60task/OBPRingBuffer.h
Normal file
99
lib/obp60task/OBPRingBuffer.h
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "GwSynchronized.h"
|
||||||
|
#include "WString.h"
|
||||||
|
#include "esp_heap_caps.h"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <limits>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct PSRAMAllocator {
|
||||||
|
using value_type = T;
|
||||||
|
|
||||||
|
PSRAMAllocator() = default;
|
||||||
|
|
||||||
|
template <class U>
|
||||||
|
constexpr PSRAMAllocator(const PSRAMAllocator<U>&) noexcept { }
|
||||||
|
|
||||||
|
T* allocate(std::size_t n)
|
||||||
|
{
|
||||||
|
void* ptr = heap_caps_malloc(n * sizeof(T), MALLOC_CAP_SPIRAM);
|
||||||
|
if (!ptr) {
|
||||||
|
return nullptr;
|
||||||
|
} else {
|
||||||
|
return static_cast<T*>(ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void deallocate(T* p, std::size_t) noexcept
|
||||||
|
{
|
||||||
|
heap_caps_free(p);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T, class U>
|
||||||
|
bool operator==(const PSRAMAllocator<T>&, const PSRAMAllocator<U>&) { return true; }
|
||||||
|
|
||||||
|
template <class T, class U>
|
||||||
|
bool operator!=(const PSRAMAllocator<T>&, const PSRAMAllocator<U>&) { return false; }
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class RingBuffer {
|
||||||
|
private:
|
||||||
|
// std::vector<T> buffer; // THE buffer vector
|
||||||
|
std::vector<T, PSRAMAllocator<T>> buffer; // THE buffer vector, allocated in PSRAM
|
||||||
|
size_t capacity;
|
||||||
|
size_t head; // Points to the next insertion position
|
||||||
|
size_t first; // Points to the first (oldest) valid element
|
||||||
|
size_t last; // Points to the last (newest) valid element
|
||||||
|
size_t count; // Number of valid elements currently in buffer
|
||||||
|
bool is_Full; // Indicates that all buffer elements are used and ringing is in use
|
||||||
|
T MIN_VAL; // lowest possible value of buffer of type <T>
|
||||||
|
T MAX_VAL; // highest possible value of buffer of type <T> -> indicates invalid value in buffer
|
||||||
|
mutable SemaphoreHandle_t bufLocker;
|
||||||
|
|
||||||
|
// metadata for buffer
|
||||||
|
String dataName; // Name of boat data in buffer
|
||||||
|
String dataFmt; // Format of boat data in buffer
|
||||||
|
int updFreq; // Update frequency in milliseconds
|
||||||
|
T smallest; // Value range of buffer: smallest value; needs to be => MIN_VAL
|
||||||
|
T largest; // Value range of buffer: biggest value; needs to be < MAX_VAL, since MAX_VAL indicates invalid entries
|
||||||
|
|
||||||
|
void initCommon();
|
||||||
|
|
||||||
|
public:
|
||||||
|
RingBuffer();
|
||||||
|
RingBuffer(size_t size);
|
||||||
|
void setMetaData(String name, String format, int updateFrequency, T minValue, T maxValue); // Set meta data for buffer
|
||||||
|
bool getMetaData(String& name, String& format, int& updateFrequency, T& minValue, T& maxValue); // Get meta data of buffer
|
||||||
|
bool getMetaData(String& name, String& format);
|
||||||
|
String getName() const; // Get buffer name
|
||||||
|
String getFormat() const; // Get buffer data format
|
||||||
|
void add(const T& value); // Add a new value to buffer
|
||||||
|
T get(size_t index) const; // Get value at specific position (0-based index from oldest to newest)
|
||||||
|
T getFirst() const; // Get the first (oldest) value in buffer
|
||||||
|
T getLast() const; // Get the last (newest) value in buffer
|
||||||
|
T getMin() const; // Get the lowest value in buffer
|
||||||
|
T getMin(size_t amount) const; // Get minimum value of the last <amount> values of buffer
|
||||||
|
T getMax() const; // Get the highest value in buffer
|
||||||
|
T getMax(size_t amount) const; // Get maximum value of the last <amount> values of buffer
|
||||||
|
T getMid() const; // Get mid value between <min> and <max> value in buffer
|
||||||
|
T getMid(size_t amount) const; // Get mid value between <min> and <max> value of the last <amount> values of buffer
|
||||||
|
T getMedian() const; // Get the median value in buffer
|
||||||
|
T getMedian(size_t amount) const; // Get the median value of the last <amount> values of buffer
|
||||||
|
size_t getCapacity() const; // Get the buffer capacity (maximum size)
|
||||||
|
size_t getCurrentSize() const; // Get the current number of elements in buffer
|
||||||
|
size_t getFirstIdx() const; // Get the index of oldest value in buffer
|
||||||
|
size_t getLastIdx() const; // Get the index of newest value in buffer
|
||||||
|
bool isEmpty() const; // Check if buffer is empty
|
||||||
|
bool isFull() const; // Check if buffer is full
|
||||||
|
T getMinVal() const; // Get lowest possible value for buffer
|
||||||
|
T getMaxVal() const; // Get highest possible value for buffer; used for unset/invalid buffer data
|
||||||
|
void clear(); // Clear buffer
|
||||||
|
void resize(size_t size); // Delete buffer and set new size
|
||||||
|
T operator[](size_t index) const; // Operator[] for convenient access (same as get())
|
||||||
|
std::vector<T> getAllValues() const; // Get all current values as a vector
|
||||||
|
};
|
||||||
|
|
||||||
|
#include "OBPRingBuffer.tpp"
|
||||||
426
lib/obp60task/OBPRingBuffer.tpp
Normal file
426
lib/obp60task/OBPRingBuffer.tpp
Normal file
@@ -0,0 +1,426 @@
|
|||||||
|
#include "OBPRingBuffer.h"
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void RingBuffer<T>::initCommon() {
|
||||||
|
MIN_VAL = std::numeric_limits<T>::lowest();
|
||||||
|
MAX_VAL = std::numeric_limits<T>::max();
|
||||||
|
dataName = "";
|
||||||
|
dataFmt = "";
|
||||||
|
updFreq = -1;
|
||||||
|
smallest = MIN_VAL;
|
||||||
|
largest = MAX_VAL;
|
||||||
|
bufLocker = xSemaphoreCreateMutex();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
RingBuffer<T>::RingBuffer()
|
||||||
|
: capacity(0)
|
||||||
|
, head(0)
|
||||||
|
, first(0)
|
||||||
|
, last(0)
|
||||||
|
, count(0)
|
||||||
|
, is_Full(false)
|
||||||
|
{
|
||||||
|
initCommon();
|
||||||
|
// <buffer> stays empty
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
RingBuffer<T>::RingBuffer(size_t size)
|
||||||
|
: capacity(size)
|
||||||
|
, head(0)
|
||||||
|
, first(0)
|
||||||
|
, last(0)
|
||||||
|
, count(0)
|
||||||
|
, is_Full(false)
|
||||||
|
{
|
||||||
|
initCommon();
|
||||||
|
|
||||||
|
buffer.reserve(size);
|
||||||
|
buffer.resize(size, MAX_VAL); // MAX_VAL indicate invalid values
|
||||||
|
}
|
||||||
|
|
||||||
|
// Specify meta data of buffer content
|
||||||
|
template <typename T>
|
||||||
|
void RingBuffer<T>::setMetaData(String name, String format, int updateFrequency, T minValue, T maxValue)
|
||||||
|
{
|
||||||
|
GWSYNCHRONIZED(&bufLocker);
|
||||||
|
dataName = name;
|
||||||
|
dataFmt = format;
|
||||||
|
updFreq = updateFrequency;
|
||||||
|
smallest = std::max(MIN_VAL, minValue);
|
||||||
|
largest = std::min(MAX_VAL, maxValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get meta data of buffer content
|
||||||
|
template <typename T>
|
||||||
|
bool RingBuffer<T>::getMetaData(String& name, String& format, int& updateFrequency, T& minValue, T& maxValue)
|
||||||
|
{
|
||||||
|
if (dataName == "" || dataFmt == "" || updFreq == -1) {
|
||||||
|
return false; // Meta data not set
|
||||||
|
}
|
||||||
|
|
||||||
|
GWSYNCHRONIZED(&bufLocker);
|
||||||
|
name = dataName;
|
||||||
|
format = dataFmt;
|
||||||
|
updateFrequency = updFreq;
|
||||||
|
minValue = smallest;
|
||||||
|
maxValue = largest;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get meta data of buffer content
|
||||||
|
template <typename T>
|
||||||
|
bool RingBuffer<T>::getMetaData(String& name, String& format)
|
||||||
|
{
|
||||||
|
if (dataName == "" || dataFmt == "") {
|
||||||
|
return false; // Meta data not set
|
||||||
|
}
|
||||||
|
|
||||||
|
GWSYNCHRONIZED(&bufLocker);
|
||||||
|
name = dataName;
|
||||||
|
format = dataFmt;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get buffer name
|
||||||
|
template <typename T>
|
||||||
|
String RingBuffer<T>::getName() const
|
||||||
|
{
|
||||||
|
return dataName;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get buffer data format
|
||||||
|
template <typename T>
|
||||||
|
String RingBuffer<T>::getFormat() const
|
||||||
|
{
|
||||||
|
return dataFmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a new value to buffer
|
||||||
|
template <typename T>
|
||||||
|
void RingBuffer<T>::add(const T& value)
|
||||||
|
{
|
||||||
|
GWSYNCHRONIZED(&bufLocker);
|
||||||
|
if (value < smallest || value > largest) {
|
||||||
|
buffer[head] = MAX_VAL; // Store MAX_VAL if value is out of range
|
||||||
|
} else {
|
||||||
|
buffer[head] = value;
|
||||||
|
}
|
||||||
|
last = head;
|
||||||
|
|
||||||
|
if (is_Full) {
|
||||||
|
first = (first + 1) % capacity; // Move pointer to oldest element when overwriting
|
||||||
|
} else {
|
||||||
|
count++;
|
||||||
|
if (count == capacity) {
|
||||||
|
is_Full = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
head = (head + 1) % capacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get value at specific position (0-based index from oldest to newest)
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::get(size_t index) const
|
||||||
|
{
|
||||||
|
GWSYNCHRONIZED(&bufLocker);
|
||||||
|
if (isEmpty() || index < 0 || index >= count) {
|
||||||
|
return MAX_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t realIndex = (first + index) % capacity;
|
||||||
|
return buffer[realIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Operator[] for convenient access (same as get())
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::operator[](size_t index) const
|
||||||
|
{
|
||||||
|
return get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the first (oldest) value in the buffer
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::getFirst() const
|
||||||
|
{
|
||||||
|
if (isEmpty()) {
|
||||||
|
return MAX_VAL;
|
||||||
|
}
|
||||||
|
return get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the last (newest) value in the buffer
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::getLast() const
|
||||||
|
{
|
||||||
|
if (isEmpty()) {
|
||||||
|
return MAX_VAL;
|
||||||
|
}
|
||||||
|
return get(count - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the lowest value in the buffer
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::getMin() const
|
||||||
|
{
|
||||||
|
if (isEmpty()) {
|
||||||
|
return MAX_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
T minVal = MAX_VAL;
|
||||||
|
T value;
|
||||||
|
for (size_t i = 0; i < count; i++) {
|
||||||
|
value = get(i);
|
||||||
|
if (value < minVal && value != MAX_VAL) {
|
||||||
|
minVal = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return minVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get minimum value of the last <amount> values of buffer
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::getMin(size_t amount) const
|
||||||
|
{
|
||||||
|
if (isEmpty() || amount <= 0) {
|
||||||
|
return MAX_VAL;
|
||||||
|
}
|
||||||
|
if (amount > count)
|
||||||
|
amount = count;
|
||||||
|
|
||||||
|
T minVal = MAX_VAL;
|
||||||
|
T value;
|
||||||
|
for (size_t i = 0; i < amount; i++) {
|
||||||
|
value = get(count - 1 - i);
|
||||||
|
if (value < minVal && value != MAX_VAL) {
|
||||||
|
minVal = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return minVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the highest value in the buffer
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::getMax() const
|
||||||
|
{
|
||||||
|
if (isEmpty()) {
|
||||||
|
return MAX_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
T maxVal = MIN_VAL;
|
||||||
|
T value;
|
||||||
|
for (size_t i = 0; i < count; i++) {
|
||||||
|
value = get(i);
|
||||||
|
if (value > maxVal && value != MAX_VAL) {
|
||||||
|
maxVal = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maxVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get maximum value of the last <amount> values of buffer
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::getMax(size_t amount) const
|
||||||
|
{
|
||||||
|
if (isEmpty() || amount <= 0) {
|
||||||
|
return MAX_VAL;
|
||||||
|
}
|
||||||
|
if (amount > count)
|
||||||
|
amount = count;
|
||||||
|
|
||||||
|
T maxVal = MIN_VAL;
|
||||||
|
T value;
|
||||||
|
for (size_t i = 0; i < amount; i++) {
|
||||||
|
value = get(count - 1 - i);
|
||||||
|
if (value > maxVal && value != MAX_VAL) {
|
||||||
|
maxVal = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maxVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get mid value between <min> and <max> value in the buffer
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::getMid() const
|
||||||
|
{
|
||||||
|
if (isEmpty()) {
|
||||||
|
return MAX_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (getMin() + getMax()) / static_cast<T>(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get mid value between <min> and <max> value of the last <amount> values of buffer
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::getMid(size_t amount) const
|
||||||
|
{
|
||||||
|
if (isEmpty() || amount <= 0) {
|
||||||
|
return MAX_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (amount > count)
|
||||||
|
amount = count;
|
||||||
|
|
||||||
|
return (getMin(amount) + getMax(amount)) / static_cast<T>(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the median value in the buffer
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::getMedian() const
|
||||||
|
{
|
||||||
|
if (isEmpty()) {
|
||||||
|
return MAX_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a temporary vector with current valid elements
|
||||||
|
std::vector<T> temp;
|
||||||
|
temp.reserve(count);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < count; i++) {
|
||||||
|
temp.push_back(get(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort to find median
|
||||||
|
std::sort(temp.begin(), temp.end());
|
||||||
|
|
||||||
|
if (count % 2 == 1) {
|
||||||
|
// Odd number of elements
|
||||||
|
return temp[count / 2];
|
||||||
|
} else {
|
||||||
|
// Even number of elements - return average of middle two
|
||||||
|
// Note: For integer types, this truncates. For floating point, it's exact.
|
||||||
|
return (temp[count / 2 - 1] + temp[count / 2]) / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the median value of the last <amount> values of buffer
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::getMedian(size_t amount) const
|
||||||
|
{
|
||||||
|
if (isEmpty() || amount <= 0) {
|
||||||
|
return MAX_VAL;
|
||||||
|
}
|
||||||
|
if (amount > count)
|
||||||
|
amount = count;
|
||||||
|
|
||||||
|
// Create a temporary vector with current valid elements
|
||||||
|
std::vector<T> temp;
|
||||||
|
temp.reserve(amount);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < amount; i++) {
|
||||||
|
temp.push_back(get(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort to find median
|
||||||
|
std::sort(temp.begin(), temp.end());
|
||||||
|
|
||||||
|
if (amount % 2 == 1) {
|
||||||
|
// Odd number of elements
|
||||||
|
return temp[amount / 2];
|
||||||
|
} else {
|
||||||
|
// Even number of elements - return average of middle two
|
||||||
|
// Note: For integer types, this truncates. For floating point, it's exact.
|
||||||
|
return (temp[amount / 2 - 1] + temp[amount / 2]) / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the buffer capacity (maximum size)
|
||||||
|
template <typename T>
|
||||||
|
size_t RingBuffer<T>::getCapacity() const
|
||||||
|
{
|
||||||
|
return capacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the current number of elements in the buffer
|
||||||
|
template <typename T>
|
||||||
|
size_t RingBuffer<T>::getCurrentSize() const
|
||||||
|
{
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the first index of buffer
|
||||||
|
template <typename T>
|
||||||
|
size_t RingBuffer<T>::getFirstIdx() const
|
||||||
|
{
|
||||||
|
return first;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the last index of buffer
|
||||||
|
template <typename T>
|
||||||
|
size_t RingBuffer<T>::getLastIdx() const
|
||||||
|
{
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if buffer is empty
|
||||||
|
template <typename T>
|
||||||
|
bool RingBuffer<T>::isEmpty() const
|
||||||
|
{
|
||||||
|
return count == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if buffer is full
|
||||||
|
template <typename T>
|
||||||
|
bool RingBuffer<T>::isFull() const
|
||||||
|
{
|
||||||
|
return is_Full;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get lowest possible value for buffer
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::getMinVal() const
|
||||||
|
{
|
||||||
|
return MIN_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get highest possible value for buffer; used for unset/invalid buffer data
|
||||||
|
template <typename T>
|
||||||
|
T RingBuffer<T>::getMaxVal() const
|
||||||
|
{
|
||||||
|
return MAX_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear buffer
|
||||||
|
template <typename T>
|
||||||
|
void RingBuffer<T>::clear()
|
||||||
|
{
|
||||||
|
GWSYNCHRONIZED(&bufLocker);
|
||||||
|
head = 0;
|
||||||
|
first = 0;
|
||||||
|
last = 0;
|
||||||
|
count = 0;
|
||||||
|
is_Full = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete buffer and set new size
|
||||||
|
template <typename T>
|
||||||
|
void RingBuffer<T>::resize(size_t newSize)
|
||||||
|
{
|
||||||
|
GWSYNCHRONIZED(&bufLocker);
|
||||||
|
capacity = newSize;
|
||||||
|
head = 0;
|
||||||
|
first = 0;
|
||||||
|
last = 0;
|
||||||
|
count = 0;
|
||||||
|
is_Full = false;
|
||||||
|
|
||||||
|
buffer.clear();
|
||||||
|
buffer.reserve(newSize);
|
||||||
|
buffer.resize(newSize, MAX_VAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get all current values as a vector
|
||||||
|
template <typename T>
|
||||||
|
std::vector<T> RingBuffer<T>::getAllValues() const
|
||||||
|
{
|
||||||
|
std::vector<T> result;
|
||||||
|
result.reserve(count);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < count; i++) {
|
||||||
|
result.push_back(get(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
@@ -498,14 +498,18 @@ void sensorTask(void *param){
|
|||||||
// Send supply voltage value all 1s
|
// Send supply voltage value all 1s
|
||||||
if(millis() > starttime5 + 1000 && String(powsensor1) == "off"){
|
if(millis() > starttime5 + 1000 && String(powsensor1) == "off"){
|
||||||
starttime5 = millis();
|
starttime5 = millis();
|
||||||
float rawVoltage = 0;
|
float rawVoltage = 0; // Default value
|
||||||
#if defined(BOARD_OBP40S3) && defined(VOLTAGE_SENSOR)
|
#ifdef BOARD_OBP40S3
|
||||||
|
sensors.batteryVoltage = 0; // If no sensor then zero voltage
|
||||||
|
#endif
|
||||||
|
#if defined(BOARD_OBP40S3) && defined(VOLTAGE_SENSOR)
|
||||||
rawVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.53) * 2; // Vin = 1/2 for OBP40
|
rawVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.53) * 2; // Vin = 1/2 for OBP40
|
||||||
|
sensors.batteryVoltage = rawVoltage * vslope + voffset; // Calibration
|
||||||
#endif
|
#endif
|
||||||
#ifdef BOARD_OBP60S3
|
#ifdef BOARD_OBP60S3
|
||||||
rawVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.17) * 20; // Vin = 1/20 for OBP60
|
rawVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.17) * 20; // Vin = 1/20 for OBP60
|
||||||
#endif
|
|
||||||
sensors.batteryVoltage = rawVoltage * vslope + voffset; // Calibration
|
sensors.batteryVoltage = rawVoltage * vslope + voffset; // Calibration
|
||||||
|
#endif
|
||||||
// Save new data in average array
|
// Save new data in average array
|
||||||
batV.reading(int(sensors.batteryVoltage * 100));
|
batV.reading(int(sensors.batteryVoltage * 100));
|
||||||
// Calculate the average values for different time lines from integer values
|
// Calculate the average values for different time lines from integer values
|
||||||
|
|||||||
443
lib/obp60task/PageAnchor.cpp
Normal file
443
lib/obp60task/PageAnchor.cpp
Normal file
@@ -0,0 +1,443 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
|
|
||||||
|
/*
|
||||||
|
This page is in experimental stage so be warned!
|
||||||
|
North is up.
|
||||||
|
Anchor page with background map from mapservice
|
||||||
|
|
||||||
|
Boatdata used
|
||||||
|
DBS - Water depth
|
||||||
|
HDT - Boat heading
|
||||||
|
AWS - Wind strength; Boat not moving so we assume AWS=TWS and AWD=TWD
|
||||||
|
AWD - Wind direction
|
||||||
|
LAT/LON - Boat position, current
|
||||||
|
HDOP - Position error
|
||||||
|
|
||||||
|
Drop / raise function in device OBP40 has to be done inside
|
||||||
|
config mode because of limited number of buttons.
|
||||||
|
|
||||||
|
TODO
|
||||||
|
gzip for data transfer,
|
||||||
|
manually inflating with tinflate from ROM
|
||||||
|
Save position in FRAM
|
||||||
|
Alarm: gps fix lost
|
||||||
|
switch unit feet/meter
|
||||||
|
force map update if new position is different from old position by
|
||||||
|
a certain level (e.g. 10m)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <HTTPClient.h>
|
||||||
|
#include "Pagedata.h"
|
||||||
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
|
#define anchor_width 16
|
||||||
|
#define anchor_height 16
|
||||||
|
static unsigned char anchor_bits[] PROGMEM = {
|
||||||
|
0x80, 0x01, 0x40, 0x02, 0x40, 0x02, 0x80, 0x01, 0xf0, 0x0f, 0x80, 0x01,
|
||||||
|
0x80, 0x01, 0x88, 0x11, 0x8c, 0x31, 0x8e, 0x71, 0x84, 0x21, 0x86, 0x61,
|
||||||
|
0x86, 0x61, 0xfc, 0x3f, 0xf8, 0x1f, 0x80, 0x01 };
|
||||||
|
|
||||||
|
class PageAnchor : public Page
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
char mode = 'N'; // (N)ormal, (C)onfig
|
||||||
|
int8_t editmode = -1; // marker for menu/edit/set function
|
||||||
|
|
||||||
|
//uint8_t *mapbuf = new uint8_t[10000]; // 8450 Byte without header
|
||||||
|
//int mapbuf_size = 10000;
|
||||||
|
//uint8_t *mapbuf = (uint8_t*) heap_caps_malloc(mapbuf_size, MALLOC_CAP_SPIRAM);
|
||||||
|
GFXcanvas1 *canvas;
|
||||||
|
const uint16_t map_width = 264;
|
||||||
|
const uint16_t map_height = 260;
|
||||||
|
bool map_valid = false;
|
||||||
|
double map_lat = 0; // current center of valid map
|
||||||
|
double map_lon = 0;
|
||||||
|
String server_name; // server with map service
|
||||||
|
String tile_path;
|
||||||
|
|
||||||
|
String lengthformat;
|
||||||
|
|
||||||
|
double scale = 50; // Radius of display circle in meter, depends on lat
|
||||||
|
uint8_t zoom = 15; // map zoom level
|
||||||
|
|
||||||
|
bool alarm = false;
|
||||||
|
bool alarm_enabled = false;
|
||||||
|
uint8_t alarm_range;
|
||||||
|
|
||||||
|
uint8_t chain_length;
|
||||||
|
uint8_t chain = 0;
|
||||||
|
|
||||||
|
bool anchor_set = false;
|
||||||
|
double anchor_lat;
|
||||||
|
double anchor_lon;
|
||||||
|
double anchor_depth;
|
||||||
|
int anchor_ts; // time stamp anchor dropped
|
||||||
|
|
||||||
|
void displayModeNormal(PageData &pageData) {
|
||||||
|
|
||||||
|
// Boatvalues: DBS, HDT, AWS, AWD, LAT, LON, HDOP
|
||||||
|
GwApi::BoatValue *bv_dbs = pageData.values[0]; // DBS
|
||||||
|
String sval_dbs = formatValue(bv_dbs, *commonData).svalue;
|
||||||
|
String sunit_dbs = formatValue(bv_dbs, *commonData).unit;
|
||||||
|
GwApi::BoatValue *bv_hdt = pageData.values[1]; // HDT
|
||||||
|
String sval_hdt = formatValue(bv_hdt, *commonData).svalue;
|
||||||
|
GwApi::BoatValue *bv_aws = pageData.values[2]; // AWS
|
||||||
|
String sval_aws = formatValue(bv_aws, *commonData).svalue;
|
||||||
|
String sunit_aws = formatValue(bv_aws, *commonData).unit;
|
||||||
|
GwApi::BoatValue *bv_awd = pageData.values[3]; // AWD
|
||||||
|
String sval_awd = formatValue(bv_awd, *commonData).svalue;
|
||||||
|
GwApi::BoatValue *bv_lat = pageData.values[4]; // LAT
|
||||||
|
String sval_lat = formatValue(bv_lat, *commonData).svalue;
|
||||||
|
GwApi::BoatValue *bv_lon = pageData.values[5]; // LON
|
||||||
|
String sval_lon = formatValue(bv_lon, *commonData).svalue;
|
||||||
|
GwApi::BoatValue *bv_hdop = pageData.values[6]; // HDOP
|
||||||
|
String sval_hdop = formatValue(bv_hdop, *commonData).svalue;
|
||||||
|
String sunit_hdop = formatValue(bv_hdop, *commonData).unit;
|
||||||
|
|
||||||
|
commonData->logger->logDebug(GwLog::DEBUG, "Drawing at PageAnchor; DBS=%f, HDT=%f, AWS=%f", bv_dbs->value, bv_hdt->value, bv_aws->value);
|
||||||
|
|
||||||
|
// Draw canvas with background map
|
||||||
|
// rhumb(map_lat, map_lon, bv_lat->value, bv_lon->value)
|
||||||
|
int posdiff = 0;
|
||||||
|
if (map_valid) {
|
||||||
|
if (bv_lat->valid and bv_lon->valid) {
|
||||||
|
// calculate movement since last map refresh
|
||||||
|
posdiff = rhumb(map_lat, map_lon, bv_lat->value, bv_lon->value);
|
||||||
|
if (posdiff > 25) {
|
||||||
|
map_lat = bv_lat->value;
|
||||||
|
map_lon = bv_lon->value;
|
||||||
|
getBackgroundMap(map_lat, map_lon, zoom);
|
||||||
|
if (map_valid) {
|
||||||
|
// prepare visible space for anchor-symbol or boat
|
||||||
|
canvas->fillCircle(132, 130, 12, commonData->fgcolor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getdisplay().drawBitmap(68, 20, canvas->getBuffer(), map_width, map_height, commonData->fgcolor);
|
||||||
|
}
|
||||||
|
|
||||||
|
Point c = {200, 150}; // center = anchor position
|
||||||
|
uint16_t r = 125;
|
||||||
|
|
||||||
|
// Circle as map border
|
||||||
|
getdisplay().drawCircle(c.x, c.y, r, commonData->fgcolor);
|
||||||
|
getdisplay().drawCircle(c.x, c.y, r + 1, commonData->fgcolor);
|
||||||
|
|
||||||
|
Point b = {200, 180}; // boat position while dropping anchor
|
||||||
|
|
||||||
|
const std::vector<Point> pts_boat = { // polygon lines
|
||||||
|
{b.x - 5, b.y},
|
||||||
|
{b.x - 5, b.y - 10},
|
||||||
|
{b.x, b.y - 16},
|
||||||
|
{b.x + 5, b.y - 10},
|
||||||
|
{b.x + 5, b.y}
|
||||||
|
};
|
||||||
|
//rotatePoints und dann Linien zeichnen
|
||||||
|
// TODO rotate boat according to current heading
|
||||||
|
if (bv_hdt->valid) {
|
||||||
|
if (map_valid) {
|
||||||
|
Point b1 = rotatePoint(c, {b.x, b.y - 8}, RadToDeg(bv_hdt->value));
|
||||||
|
getdisplay().fillCircle(b1.x, b1.y, 10, commonData->bgcolor);
|
||||||
|
}
|
||||||
|
drawPoly(rotatePoints(c, pts_boat, RadToDeg(bv_hdt->value)), commonData->fgcolor);
|
||||||
|
} else {
|
||||||
|
// no heading available draw north oriented
|
||||||
|
if (map_valid) {
|
||||||
|
getdisplay().fillCircle(b.x, b.y - 8, 10, commonData->bgcolor);
|
||||||
|
}
|
||||||
|
drawPoly(pts_boat, commonData->fgcolor);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw wind arrow
|
||||||
|
const std::vector<Point> pts_wind = {
|
||||||
|
{c.x, c.y - r + 25},
|
||||||
|
{c.x - 12, c.y - r - 4},
|
||||||
|
{c.x, c.y - r + 6},
|
||||||
|
{c.x + 12, c.y - r - 4}
|
||||||
|
};
|
||||||
|
if (bv_awd->valid) {
|
||||||
|
fillPoly4(rotatePoints(c, pts_wind, bv_awd->value), commonData->fgcolor);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Title and corner value headings
|
||||||
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold10pt8b);
|
||||||
|
// Left
|
||||||
|
getdisplay().setCursor(8, 36);
|
||||||
|
getdisplay().print("Anchor");
|
||||||
|
getdisplay().setCursor(8, 210);
|
||||||
|
getdisplay().print("Depth");
|
||||||
|
// Right
|
||||||
|
drawTextRalign(392, 80, "Chain");
|
||||||
|
drawTextRalign(392, 210, "Wind");
|
||||||
|
|
||||||
|
// Units
|
||||||
|
getdisplay().setCursor(8, 272);
|
||||||
|
getdisplay().print(sunit_dbs);
|
||||||
|
drawTextRalign(392, 272, sunit_aws);
|
||||||
|
// drawTextRalign(392, 100, lengthformat); // chain unit not implemented
|
||||||
|
|
||||||
|
// Corner values
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
getdisplay().setCursor(8, 54);
|
||||||
|
getdisplay().print(anchor_set ? "Dropped" : "Ready"); // Anchor state
|
||||||
|
getdisplay().setCursor(8, 72);
|
||||||
|
getdisplay().print("Alarm: "); // Alarm state
|
||||||
|
getdisplay().print(alarm_enabled ? "on" : "off");
|
||||||
|
|
||||||
|
getdisplay().setCursor(8, 120);
|
||||||
|
getdisplay().print("Zoom");
|
||||||
|
getdisplay().setCursor(8, 136);
|
||||||
|
getdisplay().print(zoom);
|
||||||
|
|
||||||
|
getdisplay().setCursor(8, 160);
|
||||||
|
getdisplay().print("diff");
|
||||||
|
getdisplay().setCursor(8, 176);
|
||||||
|
if (map_valid and bv_lat->valid and bv_lon->valid) {
|
||||||
|
getdisplay().print(String(posdiff));
|
||||||
|
} else {
|
||||||
|
getdisplay().print("n/a");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chain out TODO lengthformat ft/m
|
||||||
|
drawTextRalign(392, 96, String(chain) + " m");
|
||||||
|
drawTextRalign(392, 96+16, "of " + String(chain_length) + " m");
|
||||||
|
|
||||||
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
|
|
||||||
|
// Depth
|
||||||
|
getdisplay().setCursor(8, 250);
|
||||||
|
getdisplay().print(sval_dbs);
|
||||||
|
|
||||||
|
// Wind
|
||||||
|
getdisplay().setCursor(320, 250);
|
||||||
|
getdisplay().print(sval_aws);
|
||||||
|
|
||||||
|
// Position of boat in center of map
|
||||||
|
getdisplay().setFont(&IBM8x8px);
|
||||||
|
drawTextRalign(392, 34, sval_lat);
|
||||||
|
drawTextRalign(392, 44, sval_lon);
|
||||||
|
// quality
|
||||||
|
String hdop = "HDOP: ";
|
||||||
|
if (bv_hdop->valid) {
|
||||||
|
hdop += String(round(bv_hdop->value));
|
||||||
|
} else {
|
||||||
|
hdop += " n/a";
|
||||||
|
}
|
||||||
|
drawTextRalign(392, 54, hdop);
|
||||||
|
|
||||||
|
// zoom scale
|
||||||
|
getdisplay().drawLine(c.x + 10, c.y, c.x + r - 4, c.y, commonData->fgcolor);
|
||||||
|
// arrow left
|
||||||
|
getdisplay().drawLine(c.x + 10, c.y, c.x + 16, c.y - 4, commonData->fgcolor);
|
||||||
|
getdisplay().drawLine(c.x + 10, c.y, c.x + 16, c.y + 4, commonData->fgcolor);
|
||||||
|
// arrow right
|
||||||
|
getdisplay().drawLine(c.x + r - 4, c.y, c.x + r - 10, c.y - 4, commonData->fgcolor);
|
||||||
|
getdisplay().drawLine(c.x + r - 4, c.y, c.x + r - 10, c.y + 4, commonData->fgcolor);
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
drawTextCenter(c.x + r / 2, c.y + 8, String(scale, 0) + "m");
|
||||||
|
|
||||||
|
// draw anchor symbol (as bitmap)
|
||||||
|
getdisplay().drawXBitmap(c.x - anchor_width / 2, c.y - anchor_height / 2,
|
||||||
|
anchor_bits, anchor_width, anchor_height, commonData->fgcolor);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayModeConfig() {
|
||||||
|
|
||||||
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().setCursor(8, 48);
|
||||||
|
getdisplay().print("Anchor configuration");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
PageAnchor(CommonData &common)
|
||||||
|
{
|
||||||
|
commonData = &common;
|
||||||
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageAnchor");
|
||||||
|
|
||||||
|
server_name = common.config->getString(common.config->mapServer);
|
||||||
|
tile_path = common.config->getString(common.config->mapTilePath);
|
||||||
|
|
||||||
|
lengthformat = common.config->getString(common.config->lengthFormat);
|
||||||
|
chain_length = common.config->getInt(common.config->chainLength);
|
||||||
|
|
||||||
|
canvas = new GFXcanvas1(264, 260); // Byte aligned, no padding!
|
||||||
|
}
|
||||||
|
|
||||||
|
void setupKeys(){
|
||||||
|
Page::setupKeys();
|
||||||
|
commonData->keydata[0].label = "MODE";
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
commonData->keydata[1].label = "DROP";
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP60S3
|
||||||
|
commonData->keydata[4].label = "DROP";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO OBP40 / OBP60 different handling
|
||||||
|
int handleKey(int key) {
|
||||||
|
if (key == 1) { // Switch between normal and config mode
|
||||||
|
if (mode == 'N') {
|
||||||
|
mode = 'C';
|
||||||
|
commonData->keydata[1].label = "EDIT";
|
||||||
|
} else {
|
||||||
|
mode = 'N';
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
commonData->keydata[1].label = anchor_set ? "RAISE": "DROP";
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP60S3
|
||||||
|
commonData->keydata[4].label = anchor_set ? "RAISE": "DROP";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (key == 2) {
|
||||||
|
anchor_set = !anchor_set;
|
||||||
|
commonData->keydata[1].label = anchor_set ? "RAISE": "DROP";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// Code for keylock
|
||||||
|
if (key == 11){
|
||||||
|
commonData->keylock = !commonData->keylock;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rhumb(double lat1, double lon1, double lat2, double lon2) {
|
||||||
|
// calc distance in m between two geo points
|
||||||
|
static const double degToRad = M_PI / 180.0;
|
||||||
|
lat1 = degToRad * lat1;
|
||||||
|
lon1 = degToRad * lon1;
|
||||||
|
lat2 = degToRad * lat2;
|
||||||
|
lon2 = degToRad * lon2;
|
||||||
|
double dlon = lon2 - lon1;
|
||||||
|
double dlat = lat2 - lat1;
|
||||||
|
double mlat = (lat1 + lat2) / 2;
|
||||||
|
return (int) (6371000 * sqrt(pow(dlat, 2) + pow(cos(mlat) * dlon, 2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool getBackgroundMap(double lat, double lon, uint8_t zoom) {
|
||||||
|
// HTTP-Request for map
|
||||||
|
// TODO über pagedata -> status abfragen?
|
||||||
|
if (WiFi.status() != WL_CONNECTED) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool valid = false;
|
||||||
|
HTTPClient http;
|
||||||
|
String url = "http://" + server_name + "/" + tile_path;
|
||||||
|
String parameter = "?lat=" + String(lat, 6) + "&lon=" + String(lon, 6)+ "&zoom=" + String(zoom)
|
||||||
|
+ "&width=" + String(map_width) + "&height=" + String(map_height);
|
||||||
|
commonData->logger->logDebug(GwLog::LOG, "HTTP query: %s", String(url + parameter).c_str());
|
||||||
|
http.begin(url + parameter);
|
||||||
|
// http.SetAcceptEncoding("gzip");
|
||||||
|
// TODO miniz.c from ROM
|
||||||
|
int httpCode = http.GET();
|
||||||
|
if (httpCode > 0) {
|
||||||
|
if (httpCode == HTTP_CODE_OK) {
|
||||||
|
WiFiClient* stream = http.getStreamPtr();
|
||||||
|
int size = http.getSize();
|
||||||
|
commonData->logger->logDebug(GwLog::LOG, "HTTP get size: %d", size);
|
||||||
|
// header: P4<LF><width> <height><LF> (e.g. 11 byte)
|
||||||
|
uint8_t header[14]; // max: P4<LF>wwww wwww<LF>
|
||||||
|
bool header_read = false;
|
||||||
|
int header_size = 0;
|
||||||
|
uint8_t* buf = canvas->getBuffer();
|
||||||
|
int n = 0;
|
||||||
|
int ix = 0;
|
||||||
|
while (stream->available()) {
|
||||||
|
uint8_t b = stream->read();
|
||||||
|
n += 1;
|
||||||
|
if ((! header_read) and (n < 13) ) {
|
||||||
|
header[n-1] = b;
|
||||||
|
if ((n > 3) and (b == 0x0a)) {
|
||||||
|
header_read = true;
|
||||||
|
header_size = n;
|
||||||
|
header[n] = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// write image data to canvas buffer
|
||||||
|
buf[ix++] = b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (n == size) {
|
||||||
|
valid = true;
|
||||||
|
}
|
||||||
|
commonData->logger->logDebug(GwLog::LOG, "HTTP: final bytesRead=%d, header-size=%d", n, header_size);
|
||||||
|
} else {
|
||||||
|
commonData->logger->logDebug(GwLog::LOG, "HTTP result #%d", httpCode);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
commonData->logger->logDebug(GwLog::ERROR, "HTTP error #%d", httpCode);
|
||||||
|
}
|
||||||
|
http.end();
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayNew(PageData &pageData){
|
||||||
|
|
||||||
|
GwApi::BoatValue *bv_lat = pageData.values[4]; // LAT
|
||||||
|
GwApi::BoatValue *bv_lon = pageData.values[5]; // LON
|
||||||
|
|
||||||
|
// check if valid data available
|
||||||
|
if (!bv_lat->valid or !bv_lon->valid) {
|
||||||
|
map_valid = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
map_lat = bv_lat->value; // save for later comparison
|
||||||
|
map_lon = bv_lon->value;
|
||||||
|
map_valid = getBackgroundMap(map_lat, map_lon, zoom);
|
||||||
|
|
||||||
|
if (map_valid) {
|
||||||
|
// prepare visible space for anchor-symbol or boat
|
||||||
|
canvas->fillCircle(132, 130, 10, commonData->fgcolor);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int displayPage(PageData &pageData) {
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
|
// Logging boat values
|
||||||
|
logger->logDebug(GwLog::LOG, "Drawing at PageAnchor; Mode=%c", mode);
|
||||||
|
|
||||||
|
// Set display in partial refresh mode
|
||||||
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
|
if (mode == 'N') {
|
||||||
|
displayModeNormal(pageData);
|
||||||
|
} else if (mode == 'C') {
|
||||||
|
displayModeConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
return PAGE_UPDATE;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
static Page *createPage(CommonData &common){
|
||||||
|
return new PageAnchor(common);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* with the code below we make this page known to the PageTask
|
||||||
|
* we give it a type (name) that can be selected in the config
|
||||||
|
* we define which function is to be called
|
||||||
|
* and we provide the number of user parameters we expect
|
||||||
|
* this will be number of BoatValue pointers in pageData.values
|
||||||
|
*/
|
||||||
|
PageDescription registerPageAnchor(
|
||||||
|
"Anchor", // Page name
|
||||||
|
createPage, // Action
|
||||||
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
|
{"DBS", "HDT", "AWS", "AWD", "LAT", "LON", "HDOP"}, // Names of bus values undepends on selection in Web configuration (refer GwBoatData.h)
|
||||||
|
true // Show display header on/off
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -20,7 +20,7 @@ class PageBME280 : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -112,12 +112,12 @@ class PageBME280 : public Page
|
|||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 55);
|
getdisplay().setCursor(20, 55);
|
||||||
getdisplay().print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
|
|
||||||
@@ -136,12 +136,12 @@ class PageBME280 : public Page
|
|||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 145);
|
getdisplay().setCursor(20, 145);
|
||||||
getdisplay().print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
|
|
||||||
@@ -160,12 +160,12 @@ class PageBME280 : public Page
|
|||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 235);
|
getdisplay().setCursor(20, 235);
|
||||||
getdisplay().print(name3); // Page name
|
getdisplay().print(name3); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 270);
|
getdisplay().setCursor(20, 270);
|
||||||
getdisplay().print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
|
|
||||||
@@ -176,9 +176,7 @@ class PageBME280 : public Page
|
|||||||
// Show bus data
|
// Show bus data
|
||||||
getdisplay().print(svalue3); // Real value as formated string
|
getdisplay().print(svalue3); // Real value as formated string
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
class PageBattery : public Page
|
class PageBattery : public Page
|
||||||
{
|
{
|
||||||
int average = 0; // Average type [0...3], 0=off, 1=10s, 2=60s, 3=300s
|
int average = 0; // Average type [0...3], 0=off, 1=10s, 2=60s, 3=300s
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageBattery(CommonData &common){
|
PageBattery(CommonData &common){
|
||||||
@@ -34,7 +34,7 @@ class PageBattery : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -162,7 +162,7 @@ class PageBattery : public Page
|
|||||||
|
|
||||||
// Show average settings
|
// Show average settings
|
||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
switch (average) {
|
switch (average) {
|
||||||
case 0:
|
case 0:
|
||||||
getdisplay().setCursor(60, 90);
|
getdisplay().setCursor(60, 90);
|
||||||
@@ -209,12 +209,12 @@ class PageBattery : public Page
|
|||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 55);
|
getdisplay().setCursor(20, 55);
|
||||||
getdisplay().print(name1); // Value name
|
getdisplay().print(name1); // Value name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
|
|
||||||
@@ -238,12 +238,12 @@ class PageBattery : public Page
|
|||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 145);
|
getdisplay().setCursor(20, 145);
|
||||||
getdisplay().print(name2); // Value name
|
getdisplay().print(name2); // Value name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
|
|
||||||
@@ -267,12 +267,12 @@ class PageBattery : public Page
|
|||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 235);
|
getdisplay().setCursor(20, 235);
|
||||||
getdisplay().print(name3); // Value name
|
getdisplay().print(name3); // Value name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 270);
|
getdisplay().setCursor(20, 270);
|
||||||
getdisplay().print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
|
|
||||||
@@ -288,9 +288,7 @@ class PageBattery : public Page
|
|||||||
getdisplay().print("---"); // No sensor data (sensor is off)
|
getdisplay().print("---"); // No sensor data (sensor is off)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData)
|
int displayPage(PageData &pageData)
|
||||||
{
|
{
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
@@ -189,12 +189,12 @@ public:
|
|||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
getdisplay().print("Bat.");
|
getdisplay().print("Bat.");
|
||||||
|
|
||||||
// Show battery type
|
// Show battery type
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(90, 65);
|
getdisplay().setCursor(90, 65);
|
||||||
getdisplay().print(batType);
|
getdisplay().print(batType);
|
||||||
|
|
||||||
@@ -205,7 +205,7 @@ public:
|
|||||||
if(String(batVoltage) == "12V") bvoltage = 12;
|
if(String(batVoltage) == "12V") bvoltage = 12;
|
||||||
else bvoltage = 24;
|
else bvoltage = 24;
|
||||||
getdisplay().print(bvoltage);
|
getdisplay().print(bvoltage);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show battery capacity
|
// Show battery capacity
|
||||||
@@ -213,12 +213,12 @@ public:
|
|||||||
getdisplay().setCursor(10, 200);
|
getdisplay().setCursor(10, 200);
|
||||||
if(batCapacity <= 999) getdisplay().print(batCapacity, 0);
|
if(batCapacity <= 999) getdisplay().print(batCapacity, 0);
|
||||||
if(batCapacity > 999) getdisplay().print(float(batCapacity/1000.0), 1);
|
if(batCapacity > 999) getdisplay().print(float(batCapacity/1000.0), 1);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
if(batCapacity <= 999) getdisplay().print("Ah");
|
if(batCapacity <= 999) getdisplay().print("Ah");
|
||||||
if(batCapacity > 999) getdisplay().print("kAh");
|
if(batCapacity > 999) getdisplay().print("kAh");
|
||||||
|
|
||||||
// Show info
|
// Show info
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 235);
|
getdisplay().setCursor(10, 235);
|
||||||
getdisplay().print("Installed");
|
getdisplay().print("Installed");
|
||||||
getdisplay().setCursor(10, 255);
|
getdisplay().setCursor(10, 255);
|
||||||
@@ -228,7 +228,7 @@ public:
|
|||||||
batteryGraphic(150, 45, batPercentage, commonData->fgcolor, commonData->bgcolor);
|
batteryGraphic(150, 45, batPercentage, commonData->fgcolor, commonData->bgcolor);
|
||||||
|
|
||||||
// Show average settings
|
// Show average settings
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(150, 145);
|
getdisplay().setCursor(150, 145);
|
||||||
switch (average) {
|
switch (average) {
|
||||||
case 0:
|
case 0:
|
||||||
@@ -252,7 +252,7 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(150, 200);
|
getdisplay().setCursor(150, 200);
|
||||||
getdisplay().print(batPercentage);
|
getdisplay().print(batPercentage);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("%");
|
getdisplay().print("%");
|
||||||
|
|
||||||
// Show time to full discharge
|
// Show time to full discharge
|
||||||
@@ -263,12 +263,12 @@ public:
|
|||||||
else getdisplay().print(batRange, 0);
|
else getdisplay().print(batRange, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("--");
|
else getdisplay().print("--");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("h");
|
getdisplay().print("h");
|
||||||
|
|
||||||
// Show sensor type info
|
// Show sensor type info
|
||||||
String i2cAddr = "";
|
String i2cAddr = "";
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(270, 60);
|
getdisplay().setCursor(270, 60);
|
||||||
if(powerSensor == "off") getdisplay().print("Internal");
|
if(powerSensor == "off") getdisplay().print("Internal");
|
||||||
if(powerSensor == "INA219"){
|
if(powerSensor == "INA219"){
|
||||||
@@ -307,7 +307,7 @@ public:
|
|||||||
getdisplay().print("---"); // Missing bus data
|
getdisplay().print("---"); // Missing bus data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show actual current in A
|
// Show actual current in A
|
||||||
@@ -319,7 +319,7 @@ public:
|
|||||||
if(value2 > 99.9) getdisplay().print(value2, 0);
|
if(value2 > 99.9) getdisplay().print(value2, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("---");
|
else getdisplay().print("---");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("A");
|
getdisplay().print("A");
|
||||||
|
|
||||||
// Show actual consumption in W
|
// Show actual consumption in W
|
||||||
@@ -331,11 +331,10 @@ public:
|
|||||||
if(value3 > 99.9) getdisplay().print(value3, 0);
|
if(value3 > 99.9) getdisplay().print(value3, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("---");
|
else getdisplay().print("---");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("W");
|
getdisplay().print("W");
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData)
|
int displayPage(PageData &pageData)
|
||||||
{
|
{
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
@@ -120,7 +120,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
value1 = simtime++; // Simulation data for time value 11:36 in seconds
|
value1 = simtime++; // Simulation data for time value 11:36 in seconds
|
||||||
} // Other simulation data see OBP60Formater.cpp
|
} // Other simulation data see OBP60Formatter.cpp
|
||||||
bool valid1 = bvalue1->valid; // Valid information
|
bool valid1 = bvalue1->valid; // Valid information
|
||||||
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
@@ -162,7 +162,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageClock, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageClock, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -177,7 +177,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
struct tm *local_tm = localtime(&tv);
|
struct tm *local_tm = localtime(&tv);
|
||||||
|
|
||||||
// Show values GPS date
|
// Show values GPS date
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
if (holdvalues == false) {
|
if (holdvalues == false) {
|
||||||
if (source == 'G') {
|
if (source == 'G') {
|
||||||
@@ -197,7 +197,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
} else {
|
} else {
|
||||||
getdisplay().print(svalue2old);
|
getdisplay().print(svalue2old);
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 95);
|
getdisplay().setCursor(10, 95);
|
||||||
getdisplay().print("Date"); // Name
|
getdisplay().print("Date"); // Name
|
||||||
|
|
||||||
@@ -205,7 +205,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
getdisplay().fillRect(0, 149, 60, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 149, 60, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// Show values GPS time
|
// Show values GPS time
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 250);
|
getdisplay().setCursor(10, 250);
|
||||||
if (holdvalues == false) {
|
if (holdvalues == false) {
|
||||||
if (source == 'G') {
|
if (source == 'G') {
|
||||||
@@ -225,7 +225,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
else {
|
else {
|
||||||
getdisplay().print(svalue1old);
|
getdisplay().print(svalue1old);
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 220);
|
getdisplay().setCursor(10, 220);
|
||||||
getdisplay().print("Time"); // Name
|
getdisplay().print("Time"); // Name
|
||||||
|
|
||||||
@@ -238,11 +238,11 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
sunrise = String("06:42");
|
sunrise = String("06:42");
|
||||||
}
|
}
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 65);
|
getdisplay().setCursor(335, 65);
|
||||||
if(holdvalues == false) getdisplay().print(sunrise); // Value
|
if(holdvalues == false) getdisplay().print(sunrise); // Value
|
||||||
else getdisplay().print(svalue5old);
|
else getdisplay().print(svalue5old);
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(335, 95);
|
getdisplay().setCursor(335, 95);
|
||||||
getdisplay().print("SunR"); // Name
|
getdisplay().print("SunR"); // Name
|
||||||
|
|
||||||
@@ -258,11 +258,11 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
sunset = String("21:03");
|
sunset = String("21:03");
|
||||||
}
|
}
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 250);
|
getdisplay().setCursor(335, 250);
|
||||||
if(holdvalues == false) getdisplay().print(sunset); // Value
|
if(holdvalues == false) getdisplay().print(sunset); // Value
|
||||||
else getdisplay().print(svalue6old);
|
else getdisplay().print(svalue6old);
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(335, 220);
|
getdisplay().setCursor(335, 220);
|
||||||
getdisplay().print("SunS"); // Name
|
getdisplay().print("SunS"); // Name
|
||||||
|
|
||||||
@@ -304,7 +304,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
||||||
getdisplay().setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -336,7 +336,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Print Unit in clock
|
// Print Unit in clock
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(175, 110);
|
getdisplay().setCursor(175, 110);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(tz == 'L' ? "LOT" : "UTC");
|
getdisplay().print(tz == 'L' ? "LOT" : "UTC");
|
||||||
@@ -345,7 +345,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
getdisplay().print(unit2old); // date unit
|
getdisplay().print(unit2old); // date unit
|
||||||
}
|
}
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(185, 190);
|
getdisplay().setCursor(185, 190);
|
||||||
if (source == 'G') {
|
if (source == 'G') {
|
||||||
getdisplay().print("GPS");
|
getdisplay().print("GPS");
|
||||||
@@ -438,9 +438,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
||||||
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ class PageCompass : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ class PageCompass : public Page
|
|||||||
String DataText[HowManyValues];
|
String DataText[HowManyValues];
|
||||||
String DataUnits[HowManyValues];
|
String DataUnits[HowManyValues];
|
||||||
String DataFormat[HowManyValues];
|
String DataFormat[HowManyValues];
|
||||||
FormatedData TheFormattedData;
|
FormattedData TheFormattedData;
|
||||||
|
|
||||||
for (int i = 0; i < HowManyValues; i++){
|
for (int i = 0; i < HowManyValues; i++){
|
||||||
bvalue = pageData.values[i];
|
bvalue = pageData.values[i];
|
||||||
@@ -104,7 +104,7 @@ class PageCompass : public Page
|
|||||||
setFlashLED(false);
|
setFlashLED(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bvalue == NULL) return;
|
if (bvalue == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
|
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
@@ -115,11 +115,11 @@ class PageCompass : public Page
|
|||||||
// Horizontal line 2 pix top & bottom
|
// Horizontal line 2 pix top & bottom
|
||||||
// Print data on top half
|
// Print data on top half
|
||||||
getdisplay().fillRect(0, 130, 400, 2, commonData->fgcolor);
|
getdisplay().fillRect(0, 130, 400, 2, commonData->fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(10, 70);
|
getdisplay().setCursor(10, 70);
|
||||||
getdisplay().print(DataName[WhichDataDisplay]); // Page name
|
getdisplay().print(DataName[WhichDataDisplay]); // Page name
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 120);
|
getdisplay().setCursor(10, 120);
|
||||||
getdisplay().print(DataUnits[WhichDataDisplay]);
|
getdisplay().print(DataUnits[WhichDataDisplay]);
|
||||||
getdisplay().setCursor(190, 120);
|
getdisplay().setCursor(190, 120);
|
||||||
@@ -148,7 +148,7 @@ class PageCompass : public Page
|
|||||||
char buffer[bsize+1];
|
char buffer[bsize+1];
|
||||||
buffer[0]=0;
|
buffer[0]=0;
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(10, Compass_Y0-60);
|
getdisplay().setCursor(10, Compass_Y0-60);
|
||||||
getdisplay().print(DataName[WhichDataCompass]); // Page name
|
getdisplay().print(DataName[WhichDataCompass]); // Page name
|
||||||
|
|
||||||
@@ -235,12 +235,11 @@ class PageCompass : public Page
|
|||||||
// if ( x_test > 390)
|
// if ( x_test > 390)
|
||||||
// x_test = 320;
|
// x_test = 320;
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
static Page *createPage(CommonData &common){
|
static Page *createPage(CommonData &common){
|
||||||
return new PageCompass(common);
|
return new PageCompass(common);
|
||||||
}/**
|
}/**
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageDST810, %s: %f, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageDST810, %s: %f, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -98,12 +98,12 @@ public:
|
|||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 55);
|
getdisplay().setCursor(20, 55);
|
||||||
getdisplay().print("Depth"); // Page name
|
getdisplay().print("Depth"); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
@@ -136,12 +136,12 @@ public:
|
|||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 145);
|
getdisplay().setCursor(20, 145);
|
||||||
getdisplay().print("Speed"); // Page name
|
getdisplay().print("Speed"); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
@@ -174,12 +174,12 @@ public:
|
|||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 220);
|
getdisplay().setCursor(20, 220);
|
||||||
getdisplay().print("Log"); // Page name
|
getdisplay().print("Log"); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 240);
|
getdisplay().setCursor(20, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
@@ -212,12 +212,12 @@ public:
|
|||||||
// ############### Value 4 ################
|
// ############### Value 4 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(220, 220);
|
getdisplay().setCursor(220, 220);
|
||||||
getdisplay().print("Temp"); // Page name
|
getdisplay().print("Temp"); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(220, 240);
|
getdisplay().setCursor(220, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit4); // Unit
|
getdisplay().print(unit4); // Unit
|
||||||
@@ -242,9 +242,7 @@ public:
|
|||||||
unit4old = unit4; // Save the old unit
|
unit4old = unit4; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ class PageFluid : public Page
|
|||||||
commonData->logger->logDebug(GwLog::LOG,"New PageFluid: fluidtype=%d", fluidtype);
|
commonData->logger->logDebug(GwLog::LOG,"New PageFluid: fluidtype=%d", fluidtype);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -143,7 +143,7 @@ class PageFluid : public Page
|
|||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// descriptions
|
// descriptions
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 60);
|
getdisplay().setCursor(20, 60);
|
||||||
getdisplay().print("Fluid");
|
getdisplay().print("Fluid");
|
||||||
|
|
||||||
@@ -201,7 +201,7 @@ class PageFluid : public Page
|
|||||||
Point p, pr;
|
Point p, pr;
|
||||||
|
|
||||||
// scale texts
|
// scale texts
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
p = {c.x, c.y - r + 30};
|
p = {c.x, c.y - r + 30};
|
||||||
drawTextCenter(p.x, p.y, "1/2");
|
drawTextCenter(p.x, p.y, "1/2");
|
||||||
pr = rotatePoint(c, p, -60);
|
pr = rotatePoint(c, p, -60);
|
||||||
@@ -210,7 +210,7 @@ class PageFluid : public Page
|
|||||||
drawTextCenter(pr.x, pr.y, "3/4");
|
drawTextCenter(pr.x, pr.y, "3/4");
|
||||||
|
|
||||||
// empty and full
|
// empty and full
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
p = rotatePoint(c, {c.x, c.y - r + 30}, -130);
|
p = rotatePoint(c, {c.x, c.y - r + 30}, -130);
|
||||||
drawTextCenter(p.x, p.y, "E");
|
drawTextCenter(p.x, p.y, "E");
|
||||||
p = rotatePoint(c, {c.x, c.y - r + 30}, 130);
|
p = rotatePoint(c, {c.x, c.y - r + 30}, 130);
|
||||||
@@ -252,9 +252,7 @@ class PageFluid : public Page
|
|||||||
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class PageFourValues : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ class PageFourValues : public Page
|
|||||||
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Get boat values #2
|
// Get boat values #2
|
||||||
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list
|
||||||
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
||||||
name2 = name2.substring(0, 6); // String length limit for value name
|
name2 = name2.substring(0, 6); // String length limit for value name
|
||||||
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
||||||
@@ -63,7 +63,7 @@ class PageFourValues : public Page
|
|||||||
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Get boat values #3
|
// Get boat values #3
|
||||||
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Third element in list
|
||||||
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
||||||
name3 = name3.substring(0, 6); // String length limit for value name
|
name3 = name3.substring(0, 6); // String length limit for value name
|
||||||
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
||||||
@@ -73,7 +73,7 @@ class PageFourValues : public Page
|
|||||||
String unit3 = formatValue(bvalue3, *commonData).unit; // Unit of value
|
String unit3 = formatValue(bvalue3, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Get boat values #4
|
// Get boat values #4
|
||||||
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Fourth element in list
|
||||||
String name4 = xdrDelete(bvalue4->getName()); // Value name
|
String name4 = xdrDelete(bvalue4->getName()); // Value name
|
||||||
name4 = name4.substring(0, 6); // String length limit for value name
|
name4 = name4.substring(0, 6); // String length limit for value name
|
||||||
calibrationData.calibrateInstance(bvalue4, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue4, logger); // Check if boat data value is to be calibrated
|
||||||
@@ -89,7 +89,7 @@ class PageFourValues : public Page
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageFourValues, %s: %f, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageFourValues, %s: %f, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -103,12 +103,12 @@ class PageFourValues : public Page
|
|||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(20, 45);
|
getdisplay().setCursor(20, 45);
|
||||||
getdisplay().print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 65);
|
getdisplay().setCursor(20, 65);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
@@ -119,11 +119,11 @@ class PageFourValues : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue1->getFormat() == "formatLatitude" || bvalue1->getFormat() == "formatLongitude"){
|
if(bvalue1->getFormat() == "formatLatitude" || bvalue1->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(120, 55);
|
getdisplay().setCursor(120, 55);
|
||||||
}
|
}
|
||||||
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(150, 58);
|
getdisplay().setCursor(150, 58);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -151,12 +151,12 @@ class PageFourValues : public Page
|
|||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(20, 113);
|
getdisplay().setCursor(20, 113);
|
||||||
getdisplay().print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 133);
|
getdisplay().setCursor(20, 133);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
@@ -167,11 +167,11 @@ class PageFourValues : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue2->getFormat() == "formatLatitude" || bvalue2->getFormat() == "formatLongitude"){
|
if(bvalue2->getFormat() == "formatLatitude" || bvalue2->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(120, 123);
|
getdisplay().setCursor(120, 123);
|
||||||
}
|
}
|
||||||
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(150, 123);
|
getdisplay().setCursor(150, 123);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -199,12 +199,12 @@ class PageFourValues : public Page
|
|||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(20, 181);
|
getdisplay().setCursor(20, 181);
|
||||||
getdisplay().print(name3); // Page name
|
getdisplay().print(name3); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 201);
|
getdisplay().setCursor(20, 201);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
@@ -215,11 +215,11 @@ class PageFourValues : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue3->getFormat() == "formatLatitude" || bvalue3->getFormat() == "formatLongitude"){
|
if(bvalue3->getFormat() == "formatLatitude" || bvalue3->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(120, 191);
|
getdisplay().setCursor(120, 191);
|
||||||
}
|
}
|
||||||
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(150, 191);
|
getdisplay().setCursor(150, 191);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -247,12 +247,12 @@ class PageFourValues : public Page
|
|||||||
// ############### Value 4 ################
|
// ############### Value 4 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(20, 249);
|
getdisplay().setCursor(20, 249);
|
||||||
getdisplay().print(name4); // Page name
|
getdisplay().print(name4); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 269);
|
getdisplay().setCursor(20, 269);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit4); // Unit
|
getdisplay().print(unit4); // Unit
|
||||||
@@ -263,11 +263,11 @@ class PageFourValues : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue4->getFormat() == "formatLatitude" || bvalue4->getFormat() == "formatLongitude"){
|
if(bvalue4->getFormat() == "formatLatitude" || bvalue4->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(120, 259);
|
getdisplay().setCursor(120, 259);
|
||||||
}
|
}
|
||||||
else if(bvalue4->getFormat() == "formatTime" || bvalue4->getFormat() == "formatDate"){
|
else if(bvalue4->getFormat() == "formatTime" || bvalue4->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(150, 259);
|
getdisplay().setCursor(150, 259);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -287,9 +287,7 @@ class PageFourValues : public Page
|
|||||||
unit4old = unit4; // Save the old unit
|
unit4old = unit4; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -303,7 +301,7 @@ static Page *createPage(CommonData &common){
|
|||||||
* this will be number of BoatValue pointers in pageData.values
|
* this will be number of BoatValue pointers in pageData.values
|
||||||
*/
|
*/
|
||||||
PageDescription registerPageFourValues(
|
PageDescription registerPageFourValues(
|
||||||
"FourValues", // Page name
|
"FourValues", // Page name
|
||||||
createPage, // Action
|
createPage, // Action
|
||||||
4, // Number of bus values depends on selection in Web configuration
|
4, // Number of bus values depends on selection in Web configuration
|
||||||
true // Show display header on/off
|
true // Show display header on/off
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class PageFourValues2 : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ class PageFourValues2 : public Page
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageFourValues2, %s: %f, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageFourValues2, %s: %f, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -108,7 +108,7 @@ class PageFourValues2 : public Page
|
|||||||
getdisplay().print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
@@ -119,11 +119,11 @@ class PageFourValues2 : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue1->getFormat() == "formatLatitude" || bvalue1->getFormat() == "formatLongitude"){
|
if(bvalue1->getFormat() == "formatLatitude" || bvalue1->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(100, 90);
|
getdisplay().setCursor(100, 90);
|
||||||
}
|
}
|
||||||
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(180, 77);
|
getdisplay().setCursor(180, 77);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -156,7 +156,7 @@ class PageFourValues2 : public Page
|
|||||||
getdisplay().print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
@@ -167,11 +167,11 @@ class PageFourValues2 : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue2->getFormat() == "formatLatitude" || bvalue2->getFormat() == "formatLongitude"){
|
if(bvalue2->getFormat() == "formatLatitude" || bvalue2->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(100, 180);
|
getdisplay().setCursor(100, 180);
|
||||||
}
|
}
|
||||||
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(180, 158);
|
getdisplay().setCursor(180, 158);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -199,12 +199,12 @@ class PageFourValues2 : public Page
|
|||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 220);
|
getdisplay().setCursor(20, 220);
|
||||||
getdisplay().print(name3); // Page name
|
getdisplay().print(name3); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 240);
|
getdisplay().setCursor(20, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
@@ -215,11 +215,11 @@ class PageFourValues2 : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue3->getFormat() == "formatLatitude" || bvalue3->getFormat() == "formatLongitude"){
|
if(bvalue3->getFormat() == "formatLatitude" || bvalue3->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(50, 240);
|
getdisplay().setCursor(50, 240);
|
||||||
}
|
}
|
||||||
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(100, 240);
|
getdisplay().setCursor(100, 240);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -247,12 +247,12 @@ class PageFourValues2 : public Page
|
|||||||
// ############### Value 4 ################
|
// ############### Value 4 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(220, 220);
|
getdisplay().setCursor(220, 220);
|
||||||
getdisplay().print(name4); // Page name
|
getdisplay().print(name4); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(220, 240);
|
getdisplay().setCursor(220, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit4); // Unit
|
getdisplay().print(unit4); // Unit
|
||||||
@@ -263,11 +263,11 @@ class PageFourValues2 : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue4->getFormat() == "formatLatitude" || bvalue4->getFormat() == "formatLongitude"){
|
if(bvalue4->getFormat() == "formatLatitude" || bvalue4->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(250, 240);
|
getdisplay().setCursor(250, 240);
|
||||||
}
|
}
|
||||||
else if(bvalue4->getFormat() == "formatTime" || bvalue4->getFormat() == "formatDate"){
|
else if(bvalue4->getFormat() == "formatTime" || bvalue4->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(300, 240);
|
getdisplay().setCursor(300, 240);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -287,9 +287,7 @@ class PageFourValues2 : public Page
|
|||||||
unit4old = unit4; // Save the old unit
|
unit4old = unit4; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData)
|
int displayPage(PageData &pageData)
|
||||||
{
|
{
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
@@ -88,10 +88,10 @@ public:
|
|||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
getdisplay().print("Power");
|
getdisplay().print("Power");
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(12, 82);
|
getdisplay().setCursor(12, 82);
|
||||||
getdisplay().print("Generator");
|
getdisplay().print("Generator");
|
||||||
|
|
||||||
@@ -102,7 +102,7 @@ public:
|
|||||||
if(String(batVoltage) == "12V") bvoltage = 12;
|
if(String(batVoltage) == "12V") bvoltage = 12;
|
||||||
else bvoltage = 24;
|
else bvoltage = 24;
|
||||||
getdisplay().print(bvoltage);
|
getdisplay().print(bvoltage);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show solar power
|
// Show solar power
|
||||||
@@ -110,12 +110,12 @@ public:
|
|||||||
getdisplay().setCursor(10, 200);
|
getdisplay().setCursor(10, 200);
|
||||||
if(genPower <= 999) getdisplay().print(genPower, 0);
|
if(genPower <= 999) getdisplay().print(genPower, 0);
|
||||||
if(genPower > 999) getdisplay().print(float(genPower/1000.0), 1);
|
if(genPower > 999) getdisplay().print(float(genPower/1000.0), 1);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
if(genPower <= 999) getdisplay().print("W");
|
if(genPower <= 999) getdisplay().print("W");
|
||||||
if(genPower > 999) getdisplay().print("kW");
|
if(genPower > 999) getdisplay().print("kW");
|
||||||
|
|
||||||
// Show info
|
// Show info
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 235);
|
getdisplay().setCursor(10, 235);
|
||||||
getdisplay().print("Installed");
|
getdisplay().print("Installed");
|
||||||
getdisplay().setCursor(10, 255);
|
getdisplay().setCursor(10, 255);
|
||||||
@@ -128,15 +128,15 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(150, 200);
|
getdisplay().setCursor(150, 200);
|
||||||
getdisplay().print(genPercentage);
|
getdisplay().print(genPercentage);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("%");
|
getdisplay().print("%");
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(150, 235);
|
getdisplay().setCursor(150, 235);
|
||||||
getdisplay().print("Load");
|
getdisplay().print("Load");
|
||||||
|
|
||||||
// Show sensor type info
|
// Show sensor type info
|
||||||
String i2cAddr = "";
|
String i2cAddr = "";
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(270, 60);
|
getdisplay().setCursor(270, 60);
|
||||||
if(powerSensor == "off") getdisplay().print("Internal");
|
if(powerSensor == "off") getdisplay().print("Internal");
|
||||||
if(powerSensor == "INA219"){
|
if(powerSensor == "INA219"){
|
||||||
@@ -176,7 +176,7 @@ public:
|
|||||||
getdisplay().print("---"); // Missing bus data
|
getdisplay().print("---"); // Missing bus data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show actual current in A
|
// Show actual current in A
|
||||||
@@ -188,7 +188,7 @@ public:
|
|||||||
if(value2 > 99.9) getdisplay().print(value2, 0);
|
if(value2 > 99.9) getdisplay().print(value2, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("---");
|
else getdisplay().print("---");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("A");
|
getdisplay().print("A");
|
||||||
|
|
||||||
// Show actual consumption in W
|
// Show actual consumption in W
|
||||||
@@ -200,11 +200,10 @@ public:
|
|||||||
if(value3 > 99.9) getdisplay().print(value3, 0);
|
if(value3 > 99.9) getdisplay().print(value3, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("---");
|
else getdisplay().print("---");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("W");
|
getdisplay().print("W");
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData)
|
int displayPage(PageData &pageData)
|
||||||
{
|
{
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
@@ -86,21 +86,20 @@ public:
|
|||||||
float x = 200 + (rInstrument-30)*sin(i/180.0*pi); // x-coordinate dots
|
float x = 200 + (rInstrument-30)*sin(i/180.0*pi); // x-coordinate dots
|
||||||
float y = 150 - (rInstrument-30)*cos(i/180.0*pi); // y-coordinate cots
|
float y = 150 - (rInstrument-30)*cos(i/180.0*pi); // y-coordinate cots
|
||||||
const char *ii = " ";
|
const char *ii = " ";
|
||||||
switch (i)
|
switch (i) {
|
||||||
{
|
case 0: ii=" "; break; // Use a blank for a empty scale value
|
||||||
case 0: ii=" "; break; // Use a blank for a empty scale value
|
case 30 : ii=" "; break;
|
||||||
case 30 : ii=" "; break;
|
case 60 : ii=" "; break;
|
||||||
case 60 : ii=" "; break;
|
case 90 : ii="45"; break;
|
||||||
case 90 : ii="45"; break;
|
case 120 : ii="30"; break;
|
||||||
case 120 : ii="30"; break;
|
case 150 : ii="15"; break;
|
||||||
case 150 : ii="15"; break;
|
case 180 : ii="0"; break;
|
||||||
case 180 : ii="0"; break;
|
case 210 : ii="15"; break;
|
||||||
case 210 : ii="15"; break;
|
case 240 : ii="30"; break;
|
||||||
case 240 : ii="30"; break;
|
case 270 : ii="45"; break;
|
||||||
case 270 : ii="45"; break;
|
case 300 : ii=" "; break;
|
||||||
case 300 : ii=" "; break;
|
case 330 : ii=" "; break;
|
||||||
case 330 : ii=" "; break;
|
default: break;
|
||||||
default: break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print text centered on position x, y
|
// Print text centered on position x, y
|
||||||
@@ -109,7 +108,7 @@ public:
|
|||||||
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
||||||
getdisplay().setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,26 +188,24 @@ public:
|
|||||||
getdisplay().fillRect(150, 150, 100, 4, commonData->fgcolor); // Water line
|
getdisplay().fillRect(150, 150, 100, 4, commonData->fgcolor); // Water line
|
||||||
|
|
||||||
// Print label
|
// Print label
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(100, 70);
|
getdisplay().setCursor(100, 70);
|
||||||
getdisplay().print("Keel Position"); // Label
|
getdisplay().print("Keel Position"); // Label
|
||||||
|
|
||||||
if((rotsensor == "AS5600" && rotfunction == "Keel" && (valid1 == true || holdvalues == true)) || simulation == true){
|
if((rotsensor == "AS5600" && rotfunction == "Keel" && (valid1 == true || holdvalues == true)) || simulation == true){
|
||||||
// Print Unit of keel position
|
// Print Unit of keel position
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(175, 110);
|
getdisplay().setCursor(175, 110);
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Print Unit of keel position
|
// Print Unit of keel position
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(145, 110);
|
getdisplay().setCursor(145, 110);
|
||||||
getdisplay().print("No sensor data"); // Info missing sensor
|
getdisplay().print("No sensor data"); // Info missing sensor
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class PageOneValue : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ class PageOneValue : public Page
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageOneValue, %s: %f", name1.c_str(), value1);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageOneValue, %s: %f", name1.c_str(), value1);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -64,7 +64,7 @@ class PageOneValue : public Page
|
|||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
getdisplay().setFont(&Ubuntu_Bold32pt8b);
|
||||||
getdisplay().setCursor(20, 100);
|
getdisplay().setCursor(20, 100);
|
||||||
getdisplay().print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ class PageOneValue : public Page
|
|||||||
getdisplay().setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
}
|
}
|
||||||
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
getdisplay().setFont(&Ubuntu_Bold32pt8b);
|
||||||
getdisplay().setCursor(20, 200);
|
getdisplay().setCursor(20, 200);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -104,9 +104,7 @@ class PageOneValue : public Page
|
|||||||
unit1old = unit1; // Save the old unit
|
unit1old = unit1; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -41,9 +41,9 @@ public:
|
|||||||
String backlightMode = config->getString(config->backlight);
|
String backlightMode = config->getString(config->backlight);
|
||||||
int rolllimit = config->getInt(config->rollLimit);
|
int rolllimit = config->getInt(config->rollLimit);
|
||||||
String roffset = config->getString(config->rollOffset);
|
String roffset = config->getString(config->rollOffset);
|
||||||
double rolloffset = roffset.toFloat()/360*(2*PI);
|
double rolloffset = roffset.toFloat()/360*(2*M_PI);
|
||||||
String poffset = config->getString(config->pitchOffset);
|
String poffset = config->getString(config->pitchOffset);
|
||||||
double pitchoffset = poffset.toFloat()/360*(2*PI);
|
double pitchoffset = poffset.toFloat()/360*(2*M_PI);
|
||||||
|
|
||||||
// Get boat values for roll
|
// Get boat values for roll
|
||||||
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (xdrRoll)
|
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (xdrRoll)
|
||||||
@@ -55,17 +55,17 @@ public:
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(simulation == true){
|
if(simulation == true){
|
||||||
value1 = (20 + float(random(0, 50)) / 10.0)/360*2*PI;
|
value1 = (20 + float(random(0, 50)) / 10.0)/360*2*M_PI;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
value1 = 0;
|
value1 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(value1/(2*PI)*360 > -10 && value1/(2*PI)*360 < 10){
|
if(value1/(2*M_PI)*360 > -10 && value1/(2*M_PI)*360 < 10){
|
||||||
svalue1 = String(value1/(2*PI)*360,1); // Convert raw value to string
|
svalue1 = String(value1/(2*M_PI)*360,1); // Convert raw value to string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
svalue1 = String(value1/(2*PI)*360,0);
|
svalue1 = String(value1/(2*M_PI)*360,0);
|
||||||
}
|
}
|
||||||
if(valid1 == true){
|
if(valid1 == true){
|
||||||
svalue1old = svalue1; // Save the old value
|
svalue1old = svalue1; // Save the old value
|
||||||
@@ -80,17 +80,17 @@ public:
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(simulation == true){
|
if(simulation == true){
|
||||||
value2 = (float(random(-5, 5)))/360*2*PI;
|
value2 = (float(random(-5, 5)))/360*2*M_PI;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
value2 = 0;
|
value2 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(value2/(2*PI)*360 > -10 && value2/(2*PI)*360 < 10){
|
if(value2/(2*PI)*360 > -10 && value2/(2*M_PI)*360 < 10){
|
||||||
svalue2 = String(value2/(2*PI)*360,1); // Convert raw value to string
|
svalue2 = String(value2/(2*M_PI)*360,1); // Convert raw value to string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
svalue2 = String(value2/(2*PI)*360,0);
|
svalue2 = String(value2/(2*M_PI)*360,0);
|
||||||
}
|
}
|
||||||
if(valid2 == true){
|
if(valid2 == true){
|
||||||
svalue2old = svalue2; // Save the old value
|
svalue2old = svalue2; // Save the old value
|
||||||
@@ -99,7 +99,7 @@ public:
|
|||||||
// Optical warning by limit violation
|
// Optical warning by limit violation
|
||||||
if(String(flashLED) == "Limit Violation"){
|
if(String(flashLED) == "Limit Violation"){
|
||||||
// Limits for roll
|
// Limits for roll
|
||||||
if(value1*360/(2*PI) >= -1*rolllimit && value1*360/(2*PI) <= rolllimit){
|
if(value1*360/(2*M_PI) >= -1*rolllimit && value1*360/(2*M_PI) <= rolllimit){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
setFlashLED(false);
|
setFlashLED(false);
|
||||||
}
|
}
|
||||||
@@ -109,7 +109,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageRollPitch, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageRollPitch, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -126,10 +126,10 @@ public:
|
|||||||
getdisplay().print(rolllimit); // Value
|
getdisplay().print(rolllimit); // Value
|
||||||
//getdisplay().print(svalue1); // Value
|
//getdisplay().print(svalue1); // Value
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 95);
|
getdisplay().setCursor(10, 95);
|
||||||
getdisplay().print("Limit"); // Name
|
getdisplay().print("Limit"); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 115);
|
getdisplay().setCursor(10, 115);
|
||||||
getdisplay().print("DEG");
|
getdisplay().print("DEG");
|
||||||
|
|
||||||
@@ -141,10 +141,10 @@ public:
|
|||||||
getdisplay().setCursor(10, 270);
|
getdisplay().setCursor(10, 270);
|
||||||
if(holdvalues == false) getdisplay().print(svalue1); // Value
|
if(holdvalues == false) getdisplay().print(svalue1); // Value
|
||||||
else getdisplay().print(svalue1old);
|
else getdisplay().print(svalue1old);
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 220);
|
getdisplay().setCursor(10, 220);
|
||||||
getdisplay().print(name1); // Name
|
getdisplay().print(name1); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 190);
|
getdisplay().setCursor(10, 190);
|
||||||
getdisplay().print("Deg");
|
getdisplay().print("Deg");
|
||||||
|
|
||||||
@@ -156,10 +156,10 @@ public:
|
|||||||
getdisplay().setCursor(295, 270);
|
getdisplay().setCursor(295, 270);
|
||||||
if(holdvalues == false) getdisplay().print(svalue2); // Value
|
if(holdvalues == false) getdisplay().print(svalue2); // Value
|
||||||
else getdisplay().print(svalue2old);
|
else getdisplay().print(svalue2old);
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(335, 220);
|
getdisplay().setCursor(335, 220);
|
||||||
getdisplay().print(name2); // Name
|
getdisplay().print(name2); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 190);
|
getdisplay().setCursor(335, 190);
|
||||||
getdisplay().print("Deg");
|
getdisplay().print("Deg");
|
||||||
|
|
||||||
@@ -177,19 +177,18 @@ public:
|
|||||||
// Only scaling +/- 60 degrees
|
// Only scaling +/- 60 degrees
|
||||||
if((i >= 0 && i <= 60) || (i >= 300 && i <= 360)){
|
if((i >= 0 && i <= 60) || (i >= 300 && i <= 360)){
|
||||||
// Scaling values
|
// Scaling values
|
||||||
float x = 200 + (rInstrument+25)*sin(i/180.0*pi); // x-coordinate dots
|
float x = 200 + (rInstrument+25)*sin(i/180.0*M_PI); // x-coordinate dots
|
||||||
float y = 150 - (rInstrument+25)*cos(i/180.0*pi); // y-coordinate cots
|
float y = 150 - (rInstrument+25)*cos(i/180.0*M_PI); // y-coordinate cots
|
||||||
const char *ii = "";
|
const char *ii = "";
|
||||||
switch (i)
|
switch (i) {
|
||||||
{
|
case 0: ii="0"; break;
|
||||||
case 0: ii="0"; break;
|
case 20 : ii="20"; break;
|
||||||
case 20 : ii="20"; break;
|
case 40 : ii="40"; break;
|
||||||
case 40 : ii="40"; break;
|
case 60 : ii="60"; break;
|
||||||
case 60 : ii="60"; break;
|
case 300 : ii="60"; break;
|
||||||
case 300 : ii="60"; break;
|
case 320 : ii="40"; break;
|
||||||
case 320 : ii="40"; break;
|
case 340 : ii="20"; break;
|
||||||
case 340 : ii="20"; break;
|
default: break;
|
||||||
default: break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print text centered on position x, y
|
// Print text centered on position x, y
|
||||||
@@ -198,16 +197,16 @@ public:
|
|||||||
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
||||||
getdisplay().setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 20 == 0){
|
if(i % 20 == 0){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw sub scale with dots
|
// Draw sub scale with dots
|
||||||
float x1c = 200 + rInstrument*sin(i/180.0*pi);
|
float x1c = 200 + rInstrument*sin(i/180.0*M_PI);
|
||||||
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
float y1c = 150 - rInstrument*cos(i/180.0*M_PI);
|
||||||
getdisplay().fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
getdisplay().fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
||||||
float sinx=sin(i/180.0*pi);
|
float sinx=sin(i/180.0*M_PI);
|
||||||
float cosx=cos(i/180.0*pi);
|
float cosx=cos(i/180.0*M_PI);
|
||||||
|
|
||||||
// Draw sub scale with lines (two triangles)
|
// Draw sub scale with lines (two triangles)
|
||||||
if(i % 20 == 0){
|
if(i % 20 == 0){
|
||||||
@@ -229,11 +228,11 @@ public:
|
|||||||
// Draw mast position pointer
|
// Draw mast position pointer
|
||||||
float startwidth = 8; // Start width of pointer
|
float startwidth = 8; // Start width of pointer
|
||||||
|
|
||||||
// value1 = (2 * pi ) - value1; // Mirror coordiante system for pointer, keel and boat
|
// value1 = (2 * M_PI ) - value1; // Mirror coordiante system for pointer, keel and boat
|
||||||
|
|
||||||
if(valid1 == true || holdvalues == true || simulation == true){
|
if(valid1 == true || holdvalues == true || simulation == true){
|
||||||
float sinx=sin(value1 + pi);
|
float sinx=sin(value1 + M_PI);
|
||||||
float cosx=cos(value1 + pi);
|
float cosx=cos(value1 + M_PI);
|
||||||
// Normal pointer
|
// Normal pointer
|
||||||
// Pointer as triangle with center base 2*width
|
// Pointer as triangle with center base 2*width
|
||||||
float xx1 = -startwidth;
|
float xx1 = -startwidth;
|
||||||
@@ -300,14 +299,12 @@ public:
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Print sensor info
|
// Print sensor info
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(145, 200);
|
getdisplay().setCursor(145, 200);
|
||||||
getdisplay().print("No sensor data"); // Info missing sensor
|
getdisplay().print("No sensor data"); // Info missing sensor
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageRudderPosition, %s:%f", name1.c_str(), value1);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageRudderPosition, %s:%f", name1.c_str(), value1);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -115,7 +115,7 @@ public:
|
|||||||
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
||||||
getdisplay().setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,26 +144,26 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Print label
|
// Print label
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(80, 70);
|
getdisplay().setCursor(80, 70);
|
||||||
getdisplay().print("Rudder Position"); // Label
|
getdisplay().print("Rudder Position"); // Label
|
||||||
|
|
||||||
// Print Unit in RudderPosition
|
// Print Unit in RudderPosition
|
||||||
if(valid1 == true || simulation == true){
|
if(valid1 == true || simulation == true){
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(175, 110);
|
getdisplay().setCursor(175, 110);
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(175, 110);
|
getdisplay().setCursor(175, 110);
|
||||||
getdisplay().print(unit1old); // Unit
|
getdisplay().print(unit1old); // Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Print Unit of keel position
|
// Print Unit of keel position
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(145, 110);
|
getdisplay().setCursor(145, 110);
|
||||||
getdisplay().print("No sensor data"); // Info missing sensor
|
getdisplay().print("No sensor data"); // Info missing sensor
|
||||||
}
|
}
|
||||||
@@ -207,8 +207,7 @@ public:
|
|||||||
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
||||||
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -4,10 +4,6 @@
|
|||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
#include "BoatDataCalibration.h"
|
#include "BoatDataCalibration.h"
|
||||||
|
|
||||||
#include "DSEG7Classic-BoldItalic26pt7b.h"
|
|
||||||
|
|
||||||
extern const GFXfont DSEG7Classic_BoldItalic30pt7b;
|
|
||||||
|
|
||||||
const int SixValues_x1 = 5;
|
const int SixValues_x1 = 5;
|
||||||
const int SixValues_DeltaX = 200;
|
const int SixValues_DeltaX = 200;
|
||||||
|
|
||||||
@@ -33,7 +29,7 @@ class PageSixValues : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -75,7 +71,7 @@ class PageSixValues : public Page
|
|||||||
setFlashLED(false);
|
setFlashLED(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bvalue == NULL) return;
|
if (bvalue == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
@@ -96,12 +92,12 @@ class PageSixValues : public Page
|
|||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageSixValue: %d %s %f %s", ValueIndex, DataName[ValueIndex], DataValue[ValueIndex], DataFormat[ValueIndex] );
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageSixValue: %d %s %f %s", ValueIndex, DataName[ValueIndex], DataValue[ValueIndex], DataFormat[ValueIndex] );
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(x0, y0+25);
|
getdisplay().setCursor(x0, y0+25);
|
||||||
getdisplay().print(DataName[ValueIndex]); // Page name
|
getdisplay().print(DataName[ValueIndex]); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(x0, y0+72);
|
getdisplay().setCursor(x0, y0+72);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(DataUnits[ValueIndex]); // Unit
|
getdisplay().print(DataUnits[ValueIndex]); // Unit
|
||||||
@@ -112,11 +108,11 @@ class PageSixValues : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(DataFormat[ValueIndex] == "formatLatitude" || DataFormat[ValueIndex] == "formatLongitude"){
|
if(DataFormat[ValueIndex] == "formatLatitude" || DataFormat[ValueIndex] == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(x0+10, y0+60);
|
getdisplay().setCursor(x0+10, y0+60);
|
||||||
}
|
}
|
||||||
else if(DataFormat[ValueIndex] == "formatTime" || DataFormat[ValueIndex] == "formatDate"){
|
else if(DataFormat[ValueIndex] == "formatTime" || DataFormat[ValueIndex] == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(x0+20,y0+55);
|
getdisplay().setCursor(x0+20,y0+55);
|
||||||
}
|
}
|
||||||
// pressure in hPa
|
// pressure in hPa
|
||||||
@@ -153,9 +149,7 @@ class PageSixValues : public Page
|
|||||||
getdisplay().fillRect(SixValues_x1+SixValues_DeltaX-8, SixValues_y1+i*SixValues_DeltaY, 3, SixValues_DeltaY, commonData->fgcolor);
|
getdisplay().fillRect(SixValues_x1+SixValues_DeltaX-8, SixValues_y1+i*SixValues_DeltaY, 3, SixValues_DeltaY, commonData->fgcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
204
lib/obp60task/PageSkyView.cpp
Normal file
204
lib/obp60task/PageSkyView.cpp
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
|
|
||||||
|
#include "Pagedata.h"
|
||||||
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm> // for vector sorting
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SkyView / Satellites
|
||||||
|
*/
|
||||||
|
|
||||||
|
class PageSkyView : public Page
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
String flashLED;
|
||||||
|
GwBoatData *bd;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PageSkyView(CommonData &common)
|
||||||
|
{
|
||||||
|
commonData = &common;
|
||||||
|
|
||||||
|
// task name access is for example purpose only
|
||||||
|
TaskHandle_t currentTaskHandle = xTaskGetCurrentTaskHandle();
|
||||||
|
const char* taskName = pcTaskGetName(currentTaskHandle);
|
||||||
|
common.logger->logDebug(GwLog::LOG, "Instantiate PageSkyView in task '%s'", taskName);
|
||||||
|
|
||||||
|
flashLED = common.config->getString(common.config->flashLED);
|
||||||
|
}
|
||||||
|
|
||||||
|
int handleKey(int key) {
|
||||||
|
// return 0 to mark the key handled completely
|
||||||
|
// return the key to allow further action
|
||||||
|
if (key == 11) {
|
||||||
|
commonData->keylock = !commonData->keylock;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayNew(PageData &pageData) {
|
||||||
|
#ifdef BOARD_OBP60S3
|
||||||
|
// Clear optical warning
|
||||||
|
if (flashLED == "Limit Violation") {
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
bd = pageData.api->getBoatData();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Comparator function to sort by SNR
|
||||||
|
static bool compareBySNR(const GwSatInfo& a, const GwSatInfo& b) {
|
||||||
|
return a.SNR > b.SNR; // Sort in descending order
|
||||||
|
}
|
||||||
|
|
||||||
|
int displayPage(PageData &pageData) {
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
|
std::vector<GwSatInfo> sats;
|
||||||
|
int nSat = bd->SatInfo->getNumSats();
|
||||||
|
|
||||||
|
logger->logDebug(GwLog::LOG, "Drawing at PageSkyView, %d satellites", nSat);
|
||||||
|
|
||||||
|
for (int i = 0; i < nSat; i++) {
|
||||||
|
sats.push_back(*bd->SatInfo->getAt(i));
|
||||||
|
}
|
||||||
|
std::sort(sats.begin(), sats.end(), compareBySNR);
|
||||||
|
|
||||||
|
// Draw page
|
||||||
|
//***********************************************************
|
||||||
|
|
||||||
|
// Set display in partial refresh mode
|
||||||
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
|
// current position
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
|
||||||
|
// sky view
|
||||||
|
Point c = {130, 148};
|
||||||
|
uint16_t r = 120;
|
||||||
|
uint16_t r1 = r / 2;
|
||||||
|
|
||||||
|
getdisplay().fillCircle(c.x, c.y, r + 2, commonData->fgcolor);
|
||||||
|
getdisplay().fillCircle(c.x, c.y, r - 1, commonData->bgcolor);
|
||||||
|
getdisplay().drawCircle(c.x, c.y, r1, commonData->fgcolor);
|
||||||
|
|
||||||
|
// separation lines
|
||||||
|
getdisplay().drawLine(c.x - r, c.y, c.x + r, c.y, commonData->fgcolor);
|
||||||
|
getdisplay().drawLine(c.x, c.y - r, c.x, c.y + r, commonData->fgcolor);
|
||||||
|
Point p = {c.x, c.y - r};
|
||||||
|
Point p1, p2;
|
||||||
|
p1 = rotatePoint(c, p, 45);
|
||||||
|
p2 = rotatePoint(c, p, 45 + 180);
|
||||||
|
getdisplay().drawLine(p1.x, p1.y, p2.x, p2.y, commonData->fgcolor);
|
||||||
|
p1 = rotatePoint(c, p, -45);
|
||||||
|
p2 = rotatePoint(c, p, -45 + 180);
|
||||||
|
getdisplay().drawLine(p1.x, p1.y, p2.x, p2.y, commonData->fgcolor);
|
||||||
|
|
||||||
|
// directions
|
||||||
|
|
||||||
|
int16_t x1, y1;
|
||||||
|
uint16_t w, h;
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
|
||||||
|
getdisplay().getTextBounds("N", 0, 150, &x1, &y1, &w, &h);
|
||||||
|
getdisplay().setCursor(c.x - w / 2, c.y - r + h + 3);
|
||||||
|
getdisplay().print("N");
|
||||||
|
|
||||||
|
getdisplay().getTextBounds("S", 0, 150, &x1, &y1, &w, &h);
|
||||||
|
getdisplay().setCursor(c.x - w / 2, c.y + r - 3);
|
||||||
|
getdisplay().print("S");
|
||||||
|
|
||||||
|
getdisplay().getTextBounds("E", 0, 150, &x1, &y1, &w, &h);
|
||||||
|
getdisplay().setCursor(c.x + r - w - 3, c.y + h / 2);
|
||||||
|
getdisplay().print("E");
|
||||||
|
|
||||||
|
getdisplay().getTextBounds("W", 0, 150, &x1, &y1, &w, &h);
|
||||||
|
getdisplay().setCursor(c.x - r + 3 , c.y + h / 2);
|
||||||
|
getdisplay().print("W");
|
||||||
|
|
||||||
|
// show satellites in "map"
|
||||||
|
getdisplay().setFont(&IBM8x8px);
|
||||||
|
for (int i = 0; i < nSat; i++) {
|
||||||
|
float arad = (sats[i].Azimut * M_PI / 180.0) + M_PI;
|
||||||
|
float erad = sats[i].Elevation * M_PI / 180.0;
|
||||||
|
uint16_t x = c.x + sin(arad) * erad * r1;
|
||||||
|
uint16_t y = c.y + cos(arad) * erad * r1;
|
||||||
|
getdisplay().fillRect(x-4, y-4, 8, 8, commonData->fgcolor);
|
||||||
|
getdisplay().setCursor(x-7, y+12);
|
||||||
|
getdisplay().printf("%02d", static_cast<int>(sats[i].PRN));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Signal / Noise bars
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
getdisplay().setCursor(325, 34);
|
||||||
|
getdisplay().print("SNR");
|
||||||
|
// getdisplay().drawRect(270, 20, 125, 257, commonData->fgcolor);
|
||||||
|
int maxsat = std::min(nSat, 12);
|
||||||
|
for (int i = 0; i < maxsat; i++) {
|
||||||
|
uint16_t y = 29 + (i + 1) * 20;
|
||||||
|
getdisplay().setCursor(276, y);
|
||||||
|
char buffer[3];
|
||||||
|
snprintf(buffer, 3, "%02d", static_cast<int>(sats[i].PRN));
|
||||||
|
getdisplay().print(String(buffer));
|
||||||
|
getdisplay().drawRect(305, y-12, 85, 14, commonData->fgcolor);
|
||||||
|
getdisplay().setCursor(315, y);
|
||||||
|
// TODO SNR as number or as bar via mode key?
|
||||||
|
if (sats[i].SNR <= 100) {
|
||||||
|
// getdisplay().print(sats[i].SNR);
|
||||||
|
getdisplay().fillRect(307, y-10, int(81 * sats[i].SNR / 100.0), 10, commonData->fgcolor);
|
||||||
|
} else {
|
||||||
|
getdisplay().print("n/a");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show SatInfo and HDOP
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
|
||||||
|
getdisplay().setCursor(220, 34);
|
||||||
|
getdisplay().print("Sat:");
|
||||||
|
|
||||||
|
GwApi::BoatValue *bv_satinfo = pageData.values[0]; // SatInfo
|
||||||
|
String sval_satinfo = formatValue(bv_satinfo, *commonData).svalue;
|
||||||
|
getdisplay().setCursor(220, 49);
|
||||||
|
getdisplay().print(sval_satinfo);
|
||||||
|
|
||||||
|
getdisplay().setCursor(220, 254);
|
||||||
|
getdisplay().print("HDOP:");
|
||||||
|
|
||||||
|
GwApi::BoatValue *bv_hdop = pageData.values[1]; // HDOP
|
||||||
|
double hdop = formatValue(bv_hdop, *commonData).value * 4; // 4 is factor for UERE (translation in meter)
|
||||||
|
char sval_hdop[20];
|
||||||
|
dtostrf(hdop, 0, 1, sval_hdop); // Only one prefix
|
||||||
|
strcat(sval_hdop, "m");
|
||||||
|
getdisplay().setCursor(220, 269);
|
||||||
|
getdisplay().print(sval_hdop);
|
||||||
|
|
||||||
|
return PAGE_UPDATE;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
static Page* createPage(CommonData &common){
|
||||||
|
return new PageSkyView(common);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* with the code below we make this page known to the PageTask
|
||||||
|
* we give it a type (name) that can be selected in the config
|
||||||
|
* we define which function is to be called
|
||||||
|
* and we provide the number of user parameters we expect
|
||||||
|
* this will be number of BoatValue pointers in pageData.values
|
||||||
|
*/
|
||||||
|
PageDescription registerPageSkyView(
|
||||||
|
"SkyView", // Page name
|
||||||
|
createPage, // Action
|
||||||
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
|
{"SatInfo", "HDOP"}, // Bus values we need in the page
|
||||||
|
true // Show display header on/off
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -20,7 +20,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ public:
|
|||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
getdisplay().print("Solar");
|
getdisplay().print("Solar");
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ public:
|
|||||||
if(String(batVoltage) == "12V") bvoltage = 12;
|
if(String(batVoltage) == "12V") bvoltage = 12;
|
||||||
else bvoltage = 24;
|
else bvoltage = 24;
|
||||||
getdisplay().print(bvoltage);
|
getdisplay().print(bvoltage);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show solar power
|
// Show solar power
|
||||||
@@ -106,12 +106,12 @@ public:
|
|||||||
getdisplay().setCursor(10, 200);
|
getdisplay().setCursor(10, 200);
|
||||||
if(solPower <= 999) getdisplay().print(solPower, 0);
|
if(solPower <= 999) getdisplay().print(solPower, 0);
|
||||||
if(solPower > 999) getdisplay().print(float(solPower/1000.0), 1);
|
if(solPower > 999) getdisplay().print(float(solPower/1000.0), 1);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
if(solPower <= 999) getdisplay().print("W");
|
if(solPower <= 999) getdisplay().print("W");
|
||||||
if(solPower > 999) getdisplay().print("kW");
|
if(solPower > 999) getdisplay().print("kW");
|
||||||
|
|
||||||
// Show info
|
// Show info
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 235);
|
getdisplay().setCursor(10, 235);
|
||||||
getdisplay().print("Installed");
|
getdisplay().print("Installed");
|
||||||
getdisplay().setCursor(10, 255);
|
getdisplay().setCursor(10, 255);
|
||||||
@@ -124,15 +124,15 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(150, 200);
|
getdisplay().setCursor(150, 200);
|
||||||
getdisplay().print(solPercentage);
|
getdisplay().print(solPercentage);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("%");
|
getdisplay().print("%");
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(150, 235);
|
getdisplay().setCursor(150, 235);
|
||||||
getdisplay().print("Load");
|
getdisplay().print("Load");
|
||||||
|
|
||||||
// Show sensor type info
|
// Show sensor type info
|
||||||
String i2cAddr = "";
|
String i2cAddr = "";
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(270, 60);
|
getdisplay().setCursor(270, 60);
|
||||||
if(powerSensor == "off") getdisplay().print("Internal");
|
if(powerSensor == "off") getdisplay().print("Internal");
|
||||||
if(powerSensor == "INA219"){
|
if(powerSensor == "INA219"){
|
||||||
@@ -172,7 +172,7 @@ public:
|
|||||||
getdisplay().print("---"); // Missing bus data
|
getdisplay().print("---"); // Missing bus data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show actual current in A
|
// Show actual current in A
|
||||||
@@ -184,7 +184,7 @@ public:
|
|||||||
if(value2 > 99.9) getdisplay().print(value2, 0);
|
if(value2 > 99.9) getdisplay().print(value2, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("---");
|
else getdisplay().print("---");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("A");
|
getdisplay().print("A");
|
||||||
|
|
||||||
// Show actual consumption in W
|
// Show actual consumption in W
|
||||||
@@ -196,11 +196,10 @@ public:
|
|||||||
if(value3 > 99.9) getdisplay().print(value3, 0);
|
if(value3 > 99.9) getdisplay().print(value3, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("---");
|
else getdisplay().print("---");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("W");
|
getdisplay().print("W");
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +1,5 @@
|
|||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
|
|
||||||
#include "Pagedata.h"
|
|
||||||
#include "OBP60Extensions.h"
|
|
||||||
#include "images/logo64.xbm"
|
|
||||||
#include <esp32/clk.h>
|
|
||||||
#include "qrcode.h"
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
#include <SD.h>
|
|
||||||
#include <FS.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define STRINGIZE_IMPL(x) #x
|
|
||||||
#define STRINGIZE(x) STRINGIZE_IMPL(x)
|
|
||||||
#define VERSINFO STRINGIZE(GWDEVVERSION)
|
|
||||||
#define BOARDINFO STRINGIZE(BOARD)
|
|
||||||
#define PCBINFO STRINGIZE(PCBVERS)
|
|
||||||
#define DISPLAYINFO STRINGIZE(EPDTYPE)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Special system page, called directly with fast key sequence 5,4
|
* Special system page, called directly with fast key sequence 5,4
|
||||||
* Out of normal page order.
|
* Out of normal page order.
|
||||||
@@ -25,28 +7,48 @@
|
|||||||
* 1. Hard and software information
|
* 1. Hard and software information
|
||||||
* 2. System settings
|
* 2. System settings
|
||||||
* 3. NMEA2000 device list
|
* 3. NMEA2000 device list
|
||||||
|
* 4. SD Card information if available
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "Pagedata.h"
|
||||||
|
#include "OBP60Extensions.h"
|
||||||
|
#include "images/logo64.xbm"
|
||||||
|
#include <esp32/clk.h>
|
||||||
|
#include "qrcode.h"
|
||||||
|
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
#include "dirent.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define STRINGIZE_IMPL(x) #x
|
||||||
|
#define STRINGIZE(x) STRINGIZE_IMPL(x)
|
||||||
|
#define VERSINFO STRINGIZE(GWDEVVERSION)
|
||||||
|
#define BOARDINFO STRINGIZE(BOARD)
|
||||||
|
#define PCBINFO STRINGIZE(PCBVERS)
|
||||||
|
#define DISPLAYINFO STRINGIZE(EPDTYPE)
|
||||||
|
#define GXEPD2INFO STRINGIZE(GXEPD2VERS)
|
||||||
|
|
||||||
class PageSystem : public Page
|
class PageSystem : public Page
|
||||||
{
|
{
|
||||||
uint64_t chipid;
|
private:
|
||||||
bool simulation;
|
uint64_t chipid;
|
||||||
bool sdcard;
|
bool simulation;
|
||||||
String buzzer_mode;
|
bool use_sdcard;
|
||||||
uint8_t buzzer_power;
|
String buzzer_mode;
|
||||||
String cpuspeed;
|
uint8_t buzzer_power;
|
||||||
String rtc_module;
|
String cpuspeed;
|
||||||
String gps_module;
|
String rtc_module;
|
||||||
String env_module;
|
String gps_module;
|
||||||
|
String env_module;
|
||||||
|
|
||||||
String batt_sensor;
|
String batt_sensor;
|
||||||
String solar_sensor;
|
String solar_sensor;
|
||||||
String gen_sensor;
|
String gen_sensor;
|
||||||
String rot_sensor;
|
String rot_sensor;
|
||||||
double homelat;
|
double homelat;
|
||||||
double homelon;
|
double homelon;
|
||||||
|
|
||||||
char mode = 'N'; // (N)ormal, (S)ettings, (D)evice list, (C)ard
|
char mode = 'N'; // (N)ormal, (S)ettings, (D)evice list, (C)ard
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageSystem(CommonData &common){
|
PageSystem(CommonData &common){
|
||||||
@@ -54,11 +56,12 @@ public:
|
|||||||
common.logger->logDebug(GwLog::LOG,"Instantiate PageSystem");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageSystem");
|
||||||
if (hasFRAM) {
|
if (hasFRAM) {
|
||||||
mode = fram.read(FRAM_SYSTEM_MODE);
|
mode = fram.read(FRAM_SYSTEM_MODE);
|
||||||
|
common.logger->logDebug(GwLog::DEBUG, "Loaded mode '%c' from FRAM", mode);
|
||||||
}
|
}
|
||||||
chipid = ESP.getEfuseMac();
|
chipid = ESP.getEfuseMac();
|
||||||
simulation = common.config->getBool(common.config->useSimuData);
|
simulation = common.config->getBool(common.config->useSimuData);
|
||||||
#ifdef BOARD_OBP40S3
|
#ifdef BOARD_OBP40S3
|
||||||
sdcard = common.config->getBool(common.config->useSDCard);
|
use_sdcard = common.config->getBool(common.config->useSDCard);
|
||||||
#endif
|
#endif
|
||||||
buzzer_mode = common.config->getString(common.config->buzzerMode);
|
buzzer_mode = common.config->getString(common.config->buzzerMode);
|
||||||
buzzer_mode.toLowerCase();
|
buzzer_mode.toLowerCase();
|
||||||
@@ -75,7 +78,7 @@ public:
|
|||||||
homelon = common.config->getString(common.config->homeLON).toDouble();
|
homelon = common.config->getString(common.config->homeLON).toDouble();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setupKeys(){
|
void setupKeys() {
|
||||||
commonData->keydata[0].label = "EXIT";
|
commonData->keydata[0].label = "EXIT";
|
||||||
commonData->keydata[1].label = "MODE";
|
commonData->keydata[1].label = "MODE";
|
||||||
commonData->keydata[2].label = "";
|
commonData->keydata[2].label = "";
|
||||||
@@ -84,7 +87,7 @@ public:
|
|||||||
commonData->keydata[5].label = "ILUM";
|
commonData->keydata[5].label = "ILUM";
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int handleKey(int key){
|
int handleKey(int key) {
|
||||||
// do *NOT* handle key #1 this handled by obp60task as exit
|
// do *NOT* handle key #1 this handled by obp60task as exit
|
||||||
// Switch display mode
|
// Switch display mode
|
||||||
commonData->logger->logDebug(GwLog::LOG, "System keyboard handler");
|
commonData->logger->logDebug(GwLog::LOG, "System keyboard handler");
|
||||||
@@ -94,7 +97,7 @@ public:
|
|||||||
} else if (mode == 'S') {
|
} else if (mode == 'S') {
|
||||||
mode = 'D';
|
mode = 'D';
|
||||||
} else if (mode == 'D') {
|
} else if (mode == 'D') {
|
||||||
if (sdcard) {
|
if (hasSDCard) {
|
||||||
mode = 'C';
|
mode = 'C';
|
||||||
} else {
|
} else {
|
||||||
mode = 'N';
|
mode = 'N';
|
||||||
@@ -116,7 +119,8 @@ public:
|
|||||||
}
|
}
|
||||||
// standby / deep sleep
|
// standby / deep sleep
|
||||||
if (key == 5) {
|
if (key == 5) {
|
||||||
deepSleep(*commonData);
|
commonData->logger->logDebug(GwLog::LOG, "System going into deep sleep mode...");
|
||||||
|
deepSleep(*commonData);
|
||||||
}
|
}
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if (key == 11) {
|
if (key == 11) {
|
||||||
@@ -131,6 +135,7 @@ public:
|
|||||||
}
|
}
|
||||||
// standby / deep sleep
|
// standby / deep sleep
|
||||||
if (key == 12) {
|
if (key == 12) {
|
||||||
|
commonData->logger->logDebug(GwLog::LOG, "System going into deep sleep mode...");
|
||||||
deepSleep(*commonData);
|
deepSleep(*commonData);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -163,7 +168,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -177,7 +182,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageSystem");
|
logger->logDebug(GwLog::LOG, "Drawing at PageSystem, Mode=%c", mode);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
@@ -190,13 +195,13 @@ public:
|
|||||||
|
|
||||||
if (mode == 'N') {
|
if (mode == 'N') {
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(8, 48);
|
getdisplay().setCursor(8, 48);
|
||||||
getdisplay().print("System Information");
|
getdisplay().print("System Information");
|
||||||
|
|
||||||
getdisplay().drawXBitmap(320, 25, logo64_bits, logo64_width, logo64_height, commonData->fgcolor);
|
getdisplay().drawXBitmap(320, 25, logo64_bits, logo64_width, logo64_height, commonData->fgcolor);
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
y0 = 155;
|
y0 = 155;
|
||||||
|
|
||||||
char ssid[13];
|
char ssid[13];
|
||||||
@@ -207,19 +212,21 @@ public:
|
|||||||
|
|
||||||
getdisplay().setCursor(8, 95);
|
getdisplay().setCursor(8, 95);
|
||||||
getdisplay().print("Firmware version: ");
|
getdisplay().print("Firmware version: ");
|
||||||
getdisplay().setCursor(160, 95);
|
getdisplay().setCursor(150, 95);
|
||||||
getdisplay().print(VERSINFO);
|
getdisplay().print(VERSINFO);
|
||||||
|
|
||||||
getdisplay().setCursor(8, 113);
|
getdisplay().setCursor(8, 113);
|
||||||
getdisplay().print("Board version: ");
|
getdisplay().print("Board version: ");
|
||||||
getdisplay().setCursor(160, 113);
|
getdisplay().setCursor(150, 113);
|
||||||
getdisplay().print(BOARDINFO);
|
getdisplay().print(BOARDINFO);
|
||||||
getdisplay().print(String(" HW ") + String(PCBINFO));
|
getdisplay().print(String(" HW ") + String(PCBINFO));
|
||||||
|
|
||||||
getdisplay().setCursor(8, 131);
|
getdisplay().setCursor(8, 131);
|
||||||
getdisplay().print("Display version: ");
|
getdisplay().print("Display version: ");
|
||||||
getdisplay().setCursor(160, 131);
|
getdisplay().setCursor(150, 131);
|
||||||
getdisplay().print(DISPLAYINFO);
|
getdisplay().print(DISPLAYINFO);
|
||||||
|
getdisplay().print("; GxEPD2 v");
|
||||||
|
getdisplay().print(GXEPD2INFO);
|
||||||
|
|
||||||
getdisplay().setCursor(8, 265);
|
getdisplay().setCursor(8, 265);
|
||||||
#ifdef BOARD_OBP60S3
|
#ifdef BOARD_OBP60S3
|
||||||
@@ -254,14 +261,37 @@ public:
|
|||||||
getdisplay().setCursor(8, y0 + 48);
|
getdisplay().setCursor(8, y0 + 48);
|
||||||
getdisplay().print("SD-Card:");
|
getdisplay().print("SD-Card:");
|
||||||
getdisplay().setCursor(90, y0 + 48);
|
getdisplay().setCursor(90, y0 + 48);
|
||||||
if (sdcard) {
|
if (hasSDCard) {
|
||||||
uint64_t cardsize = SD.cardSize() / (1024 * 1024);
|
uint64_t cardsize = ((uint64_t) sdcard->csd.capacity) * sdcard->csd.sector_size / (1024 * 1024);
|
||||||
getdisplay().print(String(cardsize) + String(" MB"));
|
getdisplay().printf("%llu MB", cardsize);
|
||||||
} else {
|
} else {
|
||||||
getdisplay().print("off");
|
getdisplay().print("off");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Uptime
|
||||||
|
int64_t uptime = esp_timer_get_time() / 1000000;
|
||||||
|
String uptime_unit;
|
||||||
|
if (uptime < 120) {
|
||||||
|
uptime_unit = " seconds";
|
||||||
|
} else {
|
||||||
|
if (uptime < 2 * 3600) {
|
||||||
|
uptime /= 60;
|
||||||
|
uptime_unit = " minutes";
|
||||||
|
} else if (uptime < 2 * 3600 * 24) {
|
||||||
|
uptime /= 3600;
|
||||||
|
uptime_unit = " hours";
|
||||||
|
} else {
|
||||||
|
uptime /= 86400;
|
||||||
|
uptime_unit = " days";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getdisplay().setCursor(8, y0 + 80);
|
||||||
|
getdisplay().print("Uptime:");
|
||||||
|
getdisplay().setCursor(90, y0 + 80);
|
||||||
|
getdisplay().print(uptime);
|
||||||
|
getdisplay().print(uptime_unit);
|
||||||
|
|
||||||
// CPU speed config / active
|
// CPU speed config / active
|
||||||
getdisplay().setCursor(202, y0);
|
getdisplay().setCursor(202, y0);
|
||||||
getdisplay().print("CPU speed:");
|
getdisplay().print("CPU speed:");
|
||||||
@@ -288,11 +318,11 @@ public:
|
|||||||
} else if (mode == 'S') {
|
} else if (mode == 'S') {
|
||||||
// Settings
|
// Settings
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(x0, 48);
|
getdisplay().setCursor(x0, 48);
|
||||||
getdisplay().print("System settings");
|
getdisplay().print("System settings");
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
x0 = 8;
|
x0 = 8;
|
||||||
y0 = 72;
|
y0 = 72;
|
||||||
|
|
||||||
@@ -359,25 +389,78 @@ public:
|
|||||||
|
|
||||||
} else if (mode == 'C') {
|
} else if (mode == 'C') {
|
||||||
// Card info
|
// Card info
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(8, 48);
|
getdisplay().setCursor(8, 48);
|
||||||
getdisplay().print("SD Card info");
|
getdisplay().print("SD Card info");
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
|
||||||
x0 = 20;
|
x0 = 20;
|
||||||
y0 = 72;
|
y0 = 72;
|
||||||
getdisplay().setCursor(x0, y0);
|
getdisplay().setCursor(x0, y0);
|
||||||
|
#ifdef BOARD_OBP60S3
|
||||||
|
// This mode should not be callable by devices without card hardware
|
||||||
|
// In case of accidential reaching this, display a friendly message
|
||||||
|
getdisplay().print("This mode is not indended to be reached!\n");
|
||||||
|
getdisplay().print("There's nothing to see here. Move on.");
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
getdisplay().print("Work in progress...");
|
getdisplay().print("Work in progress...");
|
||||||
|
|
||||||
|
/* TODO
|
||||||
|
this code should go somewhere else. only for testing purposes here
|
||||||
|
identify card as OBP-Card:
|
||||||
|
magic.dat
|
||||||
|
version.dat
|
||||||
|
readme.txt
|
||||||
|
IMAGES/
|
||||||
|
CHARTS/
|
||||||
|
LOGS/
|
||||||
|
DATA/
|
||||||
|
hint: file access with fopen, fgets, fread, fclose
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Simple test for magic file in root
|
||||||
|
getdisplay().setCursor(x0, y0 + 32);
|
||||||
|
String file_magic = MOUNT_POINT "/magic.dat";
|
||||||
|
logger->logDebug(GwLog::LOG, "Test magicfile: %s", file_magic.c_str());
|
||||||
|
struct stat st;
|
||||||
|
if (stat(file_magic.c_str(), &st) == 0) {
|
||||||
|
getdisplay().printf("File %s exists", file_magic.c_str());
|
||||||
|
} else {
|
||||||
|
getdisplay().printf("File %s not found", file_magic.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Root directory check
|
||||||
|
DIR* dir = opendir(MOUNT_POINT);
|
||||||
|
int dy = 0;
|
||||||
|
if (dir != NULL) {
|
||||||
|
logger->logDebug(GwLog::LOG, "Root directory: %s", MOUNT_POINT);
|
||||||
|
struct dirent* entry;
|
||||||
|
while (((entry = readdir(dir)) != NULL) and (dy < 140)) {
|
||||||
|
getdisplay().setCursor(x0, y0 + 64 + dy);
|
||||||
|
getdisplay().print(entry->d_name);
|
||||||
|
// type 1 is file, type 2 is dir
|
||||||
|
if (entry->d_type == 2) {
|
||||||
|
getdisplay().print("/");
|
||||||
|
}
|
||||||
|
dy += 20;
|
||||||
|
logger->logDebug(GwLog::DEBUG, " %s type %d", entry->d_name, entry->d_type);
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
} else {
|
||||||
|
logger->logDebug(GwLog::LOG, "Failed to open root directory");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// NMEA2000 device list
|
// NMEA2000 device list
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(8, 48);
|
getdisplay().setCursor(8, 48);
|
||||||
getdisplay().print("NMEA2000 device list");
|
getdisplay().print("NMEA2000 device list");
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 80);
|
getdisplay().setCursor(20, 80);
|
||||||
getdisplay().print("RxD: ");
|
getdisplay().print("RxD: ");
|
||||||
getdisplay().print(String(commonData->status.n2kRx));
|
getdisplay().print(String(commonData->status.n2kRx));
|
||||||
@@ -388,7 +471,7 @@ public:
|
|||||||
|
|
||||||
// Update display
|
// Update display
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
return PAGE_OK;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class PageThreeValues : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ class PageThreeValues : public Page
|
|||||||
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Get boat values #2
|
// Get boat values #2
|
||||||
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list
|
||||||
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
||||||
name2 = name2.substring(0, 6); // String length limit for value name
|
name2 = name2.substring(0, 6); // String length limit for value name
|
||||||
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
||||||
@@ -61,7 +61,7 @@ class PageThreeValues : public Page
|
|||||||
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Get boat values #3
|
// Get boat values #3
|
||||||
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Third element in list
|
||||||
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
||||||
name3 = name3.substring(0, 6); // String length limit for value name
|
name3 = name3.substring(0, 6); // String length limit for value name
|
||||||
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
||||||
@@ -77,7 +77,7 @@ class PageThreeValues : public Page
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageThreeValues, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageThreeValues, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -95,7 +95,7 @@ class PageThreeValues : public Page
|
|||||||
getdisplay().print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
@@ -143,7 +143,7 @@ class PageThreeValues : public Page
|
|||||||
getdisplay().print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
@@ -191,7 +191,7 @@ class PageThreeValues : public Page
|
|||||||
getdisplay().print(name3); // Page name
|
getdisplay().print(name3); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 270);
|
getdisplay().setCursor(20, 270);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
@@ -226,8 +226,7 @@ class PageThreeValues : public Page
|
|||||||
unit3old = unit3; // Save the old unit
|
unit3old = unit3; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class PageTwoValues : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ class PageTwoValues : public Page
|
|||||||
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Get boat values #2
|
// Get boat values #2
|
||||||
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list
|
||||||
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
||||||
name2 = name2.substring(0, 6); // String length limit for value name
|
name2 = name2.substring(0, 6); // String length limit for value name
|
||||||
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
||||||
@@ -65,7 +65,7 @@ class PageTwoValues : public Page
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageTwoValues, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageTwoValues, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -83,7 +83,7 @@ class PageTwoValues : public Page
|
|||||||
getdisplay().print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 130);
|
getdisplay().setCursor(20, 130);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
@@ -131,7 +131,7 @@ class PageTwoValues : public Page
|
|||||||
getdisplay().print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 240);
|
getdisplay().setCursor(20, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
@@ -166,8 +166,7 @@ class PageTwoValues : public Page
|
|||||||
unit2old = unit2; // Save the old unit
|
unit2old = unit2; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void printAvg(int avg, uint16_t x, uint16_t y, bool prefix) {
|
void printAvg(int avg, uint16_t x, uint16_t y, bool prefix) {
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(x, y);
|
getdisplay().setCursor(x, y);
|
||||||
if (prefix) {
|
if (prefix) {
|
||||||
getdisplay().print("Avg: ");
|
getdisplay().print("Avg: ");
|
||||||
@@ -91,7 +91,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void printVoltageSymbol(uint16_t x, uint16_t y, uint16_t color) {
|
void printVoltageSymbol(uint16_t x, uint16_t y, uint16_t color) {
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(x, y);
|
getdisplay().setCursor(x, y);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
getdisplay().fillRect(x, y + 6, 22, 3, color);
|
getdisplay().fillRect(x, y + 6, 22, 3, color);
|
||||||
@@ -100,7 +100,7 @@ public:
|
|||||||
getdisplay().fillRect(x + 16, y + 11, 6, 3, color);
|
getdisplay().fillRect(x + 16, y + 11, 6, 3, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -187,7 +187,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging voltage value
|
// Logging voltage value
|
||||||
if (raw == 0) return;
|
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageVoltage, Type:%s %s:=%f", batType, name1.c_str(), raw);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageVoltage, Type:%s %s:=%f", batType, name1.c_str(), raw);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -201,13 +200,13 @@ public:
|
|||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
getdisplay().setFont(&Ubuntu_Bold32pt8b);
|
||||||
getdisplay().setCursor(20, 100);
|
getdisplay().setCursor(20, 100);
|
||||||
getdisplay().print(name1); // Value name
|
getdisplay().print(name1); // Value name
|
||||||
|
|
||||||
#if defined BOARD_OBP40S3 && defined LIPO_ACCU_1200 && defined VOLTAGE_SENSOR
|
#if defined BOARD_OBP40S3 && defined LIPO_ACCU_1200 && defined VOLTAGE_SENSOR
|
||||||
// Show charge status
|
// Show charge status
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(185, 100);
|
getdisplay().setCursor(185, 100);
|
||||||
if(commonData->data.BatteryChargeStatus == true){
|
if(commonData->data.BatteryChargeStatus == true){
|
||||||
getdisplay().print("Charge");
|
getdisplay().print("Charge");
|
||||||
@@ -218,12 +217,12 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(270, 100);
|
getdisplay().setCursor(270, 100);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show battery type
|
// Show battery type
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(295, 100);
|
getdisplay().setCursor(295, 100);
|
||||||
#ifdef BOARD_OBP60S3
|
#ifdef BOARD_OBP60S3
|
||||||
getdisplay().print(batType);
|
getdisplay().print(batType);
|
||||||
@@ -305,7 +304,7 @@ public:
|
|||||||
{c.x - r + 12, c.y + 1},
|
{c.x - r + 12, c.y + 1},
|
||||||
{c.x - r, c.y + 1}
|
{c.x - r, c.y + 1}
|
||||||
};
|
};
|
||||||
getdisplay().setFont(&Ubuntu_Bold10pt7b);
|
getdisplay().setFont(&Ubuntu_Bold10pt8b);
|
||||||
for (int angle = 3; angle < 90; angle += 3) {
|
for (int angle = 3; angle < 90; angle += 3) {
|
||||||
if (angle % 15 == 0) {
|
if (angle % 15 == 0) {
|
||||||
fillPoly4(rotatePoints(c, pts, angle), commonData->fgcolor);
|
fillPoly4(rotatePoints(c, pts, angle), commonData->fgcolor);
|
||||||
@@ -362,7 +361,7 @@ public:
|
|||||||
printVoltageSymbol(40, 60, commonData->fgcolor);
|
printVoltageSymbol(40, 60, commonData->fgcolor);
|
||||||
|
|
||||||
// Additional information at right side
|
// Additional information at right side
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(300, 60);
|
getdisplay().setCursor(300, 60);
|
||||||
getdisplay().print("Source:");
|
getdisplay().print("Source:");
|
||||||
getdisplay().setCursor(300, 80);
|
getdisplay().setCursor(300, 80);
|
||||||
@@ -384,8 +383,7 @@ public:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -400,11 +398,11 @@ static Page *createPage(CommonData &common){
|
|||||||
* and will will provide the names of the fixed values we need
|
* and will will provide the names of the fixed values we need
|
||||||
*/
|
*/
|
||||||
PageDescription registerPageVoltage(
|
PageDescription registerPageVoltage(
|
||||||
"Voltage", // Name of page
|
"Voltage", // Name of page
|
||||||
createPage, // Action
|
createPage, // Action
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
{}, // Names of bus values undepends on selection in Web configuration (refer GwBoatData.h)
|
{}, // Names of bus values undepends on selection in Web configuration (refer GwBoatData.h)
|
||||||
true // Show display header on/off
|
true // Show display header on/off
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -2,8 +2,14 @@
|
|||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
#include "MFD_OBP60_400x300_sw.h" // MFD with logo
|
|
||||||
#include "Logo_OBP_400x300_sw.h" // OBP Logo
|
#include "images/OBP_400x300.xbm" // OBP Logo
|
||||||
|
#ifdef BOARD_OBP60S3
|
||||||
|
#include "images/OBP60_400x300.xbm" // MFD with logo
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
#include "images/OBP40_400x300.xbm" // MFD with logo
|
||||||
|
#endif
|
||||||
|
|
||||||
class PageWhite : public Page
|
class PageWhite : public Page
|
||||||
{
|
{
|
||||||
@@ -31,7 +37,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -61,17 +67,21 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mode == 'L') {
|
if (mode == 'L') {
|
||||||
getdisplay().drawBitmap(0, 0, gImage_Logo_OBP_400x300_sw, getdisplay().width(), getdisplay().height(), commonData->fgcolor);
|
getdisplay().drawXBitmap(0, 0, OBP_400x300_bits, OBP_400x300_width, OBP_400x300_height, commonData->fgcolor);
|
||||||
} else if (mode == 'M') {
|
} else if (mode == 'M') {
|
||||||
getdisplay().drawBitmap(0, 0, gImage_MFD_OBP60_400x300_sw, getdisplay().width(), getdisplay().height(), commonData->fgcolor);
|
#ifdef BOARD_OBP60S3
|
||||||
|
getdisplay().drawXBitmap(0, 0, OBP60_400x300_bits, OBP60_400x300_width, OBP60_400x300_height, commonData->fgcolor);
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
getdisplay().drawXBitmap(0, 0, OBP40_400x300_bits, OBP40_400x300_width, OBP40_400x300_height, commonData->fgcolor);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
int ret = PAGE_UPDATE;
|
||||||
getdisplay().nextPage();
|
|
||||||
if (mode == 'W') {
|
if (mode == 'W') {
|
||||||
getdisplay().hibernate();
|
ret |= PAGE_HIBERNATE;
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -247,8 +247,8 @@ public:
|
|||||||
if(key == 1){ // Mode switch
|
if(key == 1){ // Mode switch
|
||||||
if(mode == 'N'){
|
if(mode == 'N'){
|
||||||
mode = 'L';
|
mode = 'L';
|
||||||
} else if (mode == 'L') {
|
// } else if (mode == 'L') {
|
||||||
mode = 'X';
|
// mode = 'X';
|
||||||
} else {
|
} else {
|
||||||
mode = 'N';
|
mode = 'N';
|
||||||
}
|
}
|
||||||
@@ -296,7 +296,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData)
|
int displayPage(PageData &pageData)
|
||||||
{
|
{
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
@@ -354,7 +354,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageWind, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageWind, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -370,7 +370,7 @@ public:
|
|||||||
// Original example code with scaling circle
|
// Original example code with scaling circle
|
||||||
|
|
||||||
// Show values AWS/TWS
|
// Show values AWS/TWS
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 50);
|
getdisplay().setCursor(20, 50);
|
||||||
getdisplay().print(name1); // Value name
|
getdisplay().print(name1); // Value name
|
||||||
getdisplay().print(": ");
|
getdisplay().print(": ");
|
||||||
@@ -386,7 +386,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Show values AWD/TWD
|
// Show values AWD/TWD
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 260);
|
getdisplay().setCursor(20, 260);
|
||||||
getdisplay().print(name2); // Value name
|
getdisplay().print(name2); // Value name
|
||||||
getdisplay().print(": ");
|
getdisplay().print(": ");
|
||||||
@@ -420,7 +420,7 @@ public:
|
|||||||
};
|
};
|
||||||
fillPoly4(rotatePoints(c, pts, RadToDeg(value2)), commonData->fgcolor);
|
fillPoly4(rotatePoints(c, pts, RadToDeg(value2)), commonData->fgcolor);
|
||||||
} else {
|
} else {
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
drawTextCenter(c.x, c.y, "no data");
|
drawTextCenter(c.x, c.y, "no data");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -438,7 +438,7 @@ public:
|
|||||||
};
|
};
|
||||||
int angle;
|
int angle;
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
|
||||||
// starbord
|
// starbord
|
||||||
// text with line
|
// text with line
|
||||||
@@ -475,7 +475,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// data source
|
// data source
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(8, 50);
|
getdisplay().setCursor(8, 50);
|
||||||
if (source == 'A') {
|
if (source == 'A') {
|
||||||
getdisplay().print("APP");
|
getdisplay().print("APP");
|
||||||
@@ -510,7 +510,7 @@ public:
|
|||||||
fillPoly4(rotatePoints(c, pts, alpha), commonData->fgcolor);
|
fillPoly4(rotatePoints(c, pts, alpha), commonData->fgcolor);
|
||||||
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
||||||
} else {
|
} else {
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
drawTextCenter(c.x, c.y, "no data");
|
drawTextCenter(c.x, c.y, "no data");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -523,7 +523,7 @@ public:
|
|||||||
getdisplay().print(svalue1old);
|
getdisplay().print(svalue1old);
|
||||||
}
|
}
|
||||||
// unit
|
// unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(220, 265);
|
getdisplay().setCursor(220, 265);
|
||||||
getdisplay().print("kts");
|
getdisplay().print("kts");
|
||||||
}
|
}
|
||||||
@@ -531,7 +531,7 @@ public:
|
|||||||
// Normal mode
|
// Normal mode
|
||||||
|
|
||||||
// data source
|
// data source
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(8, 50);
|
getdisplay().setCursor(8, 50);
|
||||||
if (source == 'A') {
|
if (source == 'A') {
|
||||||
getdisplay().print("APP");
|
getdisplay().print("APP");
|
||||||
@@ -595,7 +595,7 @@ public:
|
|||||||
getdisplay().print(svalue1old);
|
getdisplay().print(svalue1old);
|
||||||
}
|
}
|
||||||
// unit
|
// unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(220, 265);
|
getdisplay().setCursor(220, 265);
|
||||||
getdisplay().print("kts");
|
getdisplay().print("kts");
|
||||||
|
|
||||||
@@ -612,15 +612,13 @@ public:
|
|||||||
fillPoly4(rotatePoints(c, pts, alpha), commonData->fgcolor);
|
fillPoly4(rotatePoints(c, pts, alpha), commonData->fgcolor);
|
||||||
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
||||||
} else {
|
} else {
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
drawTextCenter(c.x, c.y, "no data");
|
drawTextCenter(c.x, c.y, "no data");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -635,11 +633,11 @@ static Page *createPage(CommonData &common){
|
|||||||
* and will will provide the names of the fixed values we need
|
* and will will provide the names of the fixed values we need
|
||||||
*/
|
*/
|
||||||
PageDescription registerPageWind(
|
PageDescription registerPageWind(
|
||||||
"Wind", // Page name
|
"Wind", // Page name
|
||||||
createPage, // Action
|
createPage, // Action
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
{"AWS","AWA", "TWS", "TWA"}, // Bus values we need in the page
|
{"AWS","AWA", "TWS", "TWA"}, // Bus values we need in the page
|
||||||
true // Show display header on/off
|
true // Show display header on/off
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
530
lib/obp60task/PageWindPlot.cpp
Normal file
530
lib/obp60task/PageWindPlot.cpp
Normal file
@@ -0,0 +1,530 @@
|
|||||||
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
|
|
||||||
|
#include "Pagedata.h"
|
||||||
|
#include "OBP60Extensions.h"
|
||||||
|
#include "OBPRingBuffer.h"
|
||||||
|
#include "OBPDataOperations.h"
|
||||||
|
#include "BoatDataCalibration.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
static const double radToDeg = 180.0 / M_PI; // Conversion factor from radians to degrees
|
||||||
|
|
||||||
|
// Get maximum difference of last <amount> of TWD ringbuffer values to center chart; returns "0" if data is not valid
|
||||||
|
int getCntr(const RingBuffer<int16_t>& windDirHstry, size_t amount)
|
||||||
|
{
|
||||||
|
const int MAX_VAL = windDirHstry.getMaxVal();
|
||||||
|
size_t count = windDirHstry.getCurrentSize();
|
||||||
|
|
||||||
|
if (windDirHstry.isEmpty() || amount <= 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (amount > count)
|
||||||
|
amount = count;
|
||||||
|
|
||||||
|
uint16_t midWndDir, minWndDir, maxWndDir = 0;
|
||||||
|
int wndCenter = 0;
|
||||||
|
|
||||||
|
midWndDir = windDirHstry.getMid(amount);
|
||||||
|
if (midWndDir != MAX_VAL) {
|
||||||
|
midWndDir = midWndDir / 1000.0 * radToDeg;
|
||||||
|
wndCenter = int((midWndDir + (midWndDir >= 0 ? 5 : -5)) / 10) * 10; // Set new center value; round to nearest 10 degree value
|
||||||
|
minWndDir = windDirHstry.getMin(amount) / 1000.0 * radToDeg;
|
||||||
|
maxWndDir = windDirHstry.getMax(amount) / 1000.0 * radToDeg;
|
||||||
|
if ((maxWndDir - minWndDir) > 180 && !(minWndDir > maxWndDir)) { // if wind range is > 180 and no 0° crossover, adjust wndCenter to smaller wind range end
|
||||||
|
wndCenter = WindUtils::to360(wndCenter + 180);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return wndCenter;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get maximum difference of last <amount> of TWD ringbuffer values to center chart
|
||||||
|
int getRng(const RingBuffer<int16_t>& windDirHstry, int center, size_t amount)
|
||||||
|
{
|
||||||
|
int minVal = windDirHstry.getMinVal();
|
||||||
|
const int MAX_VAL = windDirHstry.getMaxVal();
|
||||||
|
size_t count = windDirHstry.getCurrentSize();
|
||||||
|
|
||||||
|
if (windDirHstry.isEmpty() || amount <= 0) {
|
||||||
|
return MAX_VAL;
|
||||||
|
}
|
||||||
|
if (amount > count)
|
||||||
|
amount = count;
|
||||||
|
|
||||||
|
int value = 0;
|
||||||
|
int rng = 0;
|
||||||
|
int maxRng = minVal;
|
||||||
|
// Start from the newest value (last) and go backwards x times
|
||||||
|
for (size_t i = 0; i < amount; i++) {
|
||||||
|
value = windDirHstry.get(count - 1 - i);
|
||||||
|
|
||||||
|
if (value == MAX_VAL) {
|
||||||
|
continue; // ignore invalid values
|
||||||
|
}
|
||||||
|
|
||||||
|
value = value / 1000.0 * radToDeg;
|
||||||
|
rng = abs(((value - center + 540) % 360) - 180);
|
||||||
|
if (rng > maxRng)
|
||||||
|
maxRng = rng;
|
||||||
|
}
|
||||||
|
if (maxRng > 180) {
|
||||||
|
maxRng = 180;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (maxRng != minVal ? maxRng : MAX_VAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ****************************************************************
|
||||||
|
class PageWindPlot : public Page {
|
||||||
|
|
||||||
|
bool keylock = false; // Keylock
|
||||||
|
char chrtMode = 'D'; // Chart mode: 'D' for TWD, 'S' for TWS, 'B' for both
|
||||||
|
bool showTruW = true; // Show true wind or apparant wind in chart area
|
||||||
|
bool oldShowTruW = false; // remember recent user selection of wind data type
|
||||||
|
|
||||||
|
int dataIntv = 1; // Update interval for wind history chart:
|
||||||
|
// (1)|(2)|(3)|(4)|(8) x 240 seconds for 4, 8, 12, 16, 32 min. history chart
|
||||||
|
bool useSimuData;
|
||||||
|
String flashLED;
|
||||||
|
String backlightMode;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PageWindPlot(CommonData& common)
|
||||||
|
{
|
||||||
|
commonData = &common;
|
||||||
|
common.logger->logDebug(GwLog::LOG, "Instantiate PageWindPlot");
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
useSimuData = common.config->getBool(common.config->useSimuData);
|
||||||
|
// holdValues = common.config->getBool(common.config->holdvalues);
|
||||||
|
flashLED = common.config->getString(common.config->flashLED);
|
||||||
|
backlightMode = common.config->getString(common.config->backlight);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void setupKeys()
|
||||||
|
{
|
||||||
|
Page::setupKeys();
|
||||||
|
// commonData->keydata[0].label = "MODE";
|
||||||
|
#if defined BOARD_OBP60S3
|
||||||
|
commonData->keydata[1].label = "SRC";
|
||||||
|
commonData->keydata[4].label = "INTV";
|
||||||
|
#elif defined BOARD_OBP40S3
|
||||||
|
commonData->keydata[1].label = "INTV";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Key functions
|
||||||
|
virtual int handleKey(int key)
|
||||||
|
{
|
||||||
|
// Set chart mode TWD | TWS -> to be implemented
|
||||||
|
if (key == 1) {
|
||||||
|
if (chrtMode == 'D') {
|
||||||
|
chrtMode = 'S';
|
||||||
|
} else if (chrtMode == 'S') {
|
||||||
|
chrtMode = 'B';
|
||||||
|
} else {
|
||||||
|
chrtMode = 'D';
|
||||||
|
}
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined BOARD_OBP60S3
|
||||||
|
// Set data source TRUE | APP
|
||||||
|
if (key == 2) {
|
||||||
|
showTruW = !showTruW;
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set interval for wind history chart update time (interval)
|
||||||
|
if (key == 5) {
|
||||||
|
#elif defined BOARD_OBP40S3
|
||||||
|
if (key == 2) {
|
||||||
|
#endif
|
||||||
|
if (dataIntv == 1) {
|
||||||
|
dataIntv = 2;
|
||||||
|
} else if (dataIntv == 2) {
|
||||||
|
dataIntv = 3;
|
||||||
|
} else if (dataIntv == 3) {
|
||||||
|
dataIntv = 4;
|
||||||
|
} else if (dataIntv == 4) {
|
||||||
|
dataIntv = 8;
|
||||||
|
} else {
|
||||||
|
dataIntv = 1;
|
||||||
|
}
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keylock function
|
||||||
|
if (key == 11) { // Code for keylock
|
||||||
|
commonData->keylock = !commonData->keylock;
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void displayNew(PageData &pageData){
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
String wndSrc; // Wind source true/apparant wind - preselection for OBP40
|
||||||
|
|
||||||
|
wndSrc = commonData->config->getString("page" + String(pageData.pageNumber) + "wndsrc");
|
||||||
|
if (wndSrc =="True wind") {
|
||||||
|
showTruW = true;
|
||||||
|
} else {
|
||||||
|
showTruW = false; // Wind source is apparant wind
|
||||||
|
}
|
||||||
|
commonData->logger->logDebug(GwLog::LOG,"New PageWindPlot: wind source=%s", wndSrc);
|
||||||
|
#endif
|
||||||
|
oldShowTruW = !showTruW; // makes wind source being initialized at initial page call
|
||||||
|
}
|
||||||
|
|
||||||
|
int displayPage(PageData& pageData)
|
||||||
|
{
|
||||||
|
GwConfigHandler* config = commonData->config;
|
||||||
|
GwLog* logger = commonData->logger;
|
||||||
|
|
||||||
|
static RingBuffer<int16_t>* wdHstry; // Wind direction data buffer
|
||||||
|
static RingBuffer<uint16_t>* wsHstry; // Wind speed data buffer
|
||||||
|
static String wdName, wdFormat; // Wind direction name and format
|
||||||
|
static String wsName, wsFormat; // Wind speed name and format
|
||||||
|
static int16_t wdMAX_VAL; // Max. value of wd history buffer, indicating invalid values
|
||||||
|
float wsValue; // Wind speed value in chart area
|
||||||
|
String wsUnit; // Wind speed unit in chart area
|
||||||
|
static GwApi::BoatValue* wsBVal = new GwApi::BoatValue("TWS"); // temp BoatValue for wind speed unit identification; required by OBP60Formater
|
||||||
|
|
||||||
|
// current boat data values; TWD/AWD only for validation test
|
||||||
|
const int numBoatData = 2;
|
||||||
|
GwApi::BoatValue* bvalue;
|
||||||
|
bool BDataValid[numBoatData];
|
||||||
|
|
||||||
|
static bool isInitialized = false; // Flag to indicate that page is initialized
|
||||||
|
static bool wndDataValid = false; // Flag to indicate if wind data is valid
|
||||||
|
static int numNoData; // Counter for multiple invalid data values in a row
|
||||||
|
|
||||||
|
static int width; // Screen width
|
||||||
|
static int height; // Screen height
|
||||||
|
static int xCenter; // Center of screen in x direction
|
||||||
|
static const int yOffset = 48; // Offset for y coordinates of chart area
|
||||||
|
static int cHeight; // height of chart area
|
||||||
|
static int bufSize; // History buffer size: 1.920 values for 32 min. history chart
|
||||||
|
static int intvBufSize; // Buffer size used for currently selected time interval
|
||||||
|
int count; // current size of buffer
|
||||||
|
static int numWndVals; // number of wind values available for current interval selection
|
||||||
|
static int bufStart; // 1st data value in buffer to show
|
||||||
|
int numAddedBufVals; // Number of values added to buffer since last display
|
||||||
|
size_t currIdx; // Current index in TWD history buffer
|
||||||
|
static size_t lastIdx; // Last index of TWD history buffer
|
||||||
|
static size_t lastAddedIdx = 0; // Last index of TWD history buffer when new data was added
|
||||||
|
static int oldDataIntv; // remember recent user selection of data interval
|
||||||
|
|
||||||
|
static int wndCenter; // chart wind center value position
|
||||||
|
static int wndLeft; // chart wind left value position
|
||||||
|
static int wndRight; // chart wind right value position
|
||||||
|
static int chrtRng; // Range of wind values from mid wind value to min/max wind value in degrees
|
||||||
|
int diffRng; // Difference between mid and current wind value
|
||||||
|
static const int dfltRng = 60; // Default range for chart
|
||||||
|
int midWndDir; // New value for wndCenter after chart start / shift
|
||||||
|
|
||||||
|
int x, y; // x and y coordinates for drawing
|
||||||
|
static int prevX, prevY; // Last x and y coordinates for drawing
|
||||||
|
static float chrtScl; // Scale for wind values in pixels per degree
|
||||||
|
int chrtVal; // Current wind value
|
||||||
|
static int chrtPrevVal; // Last wind value in chart area for check if value crosses 180 degree line
|
||||||
|
|
||||||
|
LOG_DEBUG(GwLog::LOG, "Display PageWindPlot");
|
||||||
|
ulong timer = millis();
|
||||||
|
|
||||||
|
if (!isInitialized) {
|
||||||
|
width = getdisplay().width();
|
||||||
|
height = getdisplay().height();
|
||||||
|
xCenter = width / 2;
|
||||||
|
cHeight = height - yOffset - 22;
|
||||||
|
numNoData = 0;
|
||||||
|
bufStart = 0;
|
||||||
|
oldDataIntv = 0;
|
||||||
|
wsValue = 0;
|
||||||
|
numAddedBufVals, currIdx, lastIdx = 0;
|
||||||
|
wndCenter = INT_MAX;
|
||||||
|
midWndDir = 0;
|
||||||
|
diffRng = dfltRng;
|
||||||
|
chrtRng = dfltRng;
|
||||||
|
|
||||||
|
isInitialized = true; // Set flag to indicate that page is now initialized
|
||||||
|
}
|
||||||
|
|
||||||
|
// read boat data values; TWD only for validation test, TWS for display of current value
|
||||||
|
for (int i = 0; i < numBoatData; i++) {
|
||||||
|
bvalue = pageData.values[i];
|
||||||
|
BDataValid[i] = bvalue->valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if (String(flashLED) == "Limit Violation") {
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showTruW != oldShowTruW) {
|
||||||
|
if (showTruW) {
|
||||||
|
wdHstry = pageData.boatHstry->hstryBufList.twdHstry;
|
||||||
|
wsHstry = pageData.boatHstry->hstryBufList.twsHstry;
|
||||||
|
} else {
|
||||||
|
wdHstry = pageData.boatHstry->hstryBufList.awdHstry;
|
||||||
|
wsHstry = pageData.boatHstry->hstryBufList.awsHstry;
|
||||||
|
}
|
||||||
|
wdHstry->getMetaData(wdName, wdFormat);
|
||||||
|
wsHstry->getMetaData(wsName, wsFormat);
|
||||||
|
wdMAX_VAL = wdHstry->getMaxVal();
|
||||||
|
bufSize = wdHstry->getCapacity();
|
||||||
|
wsBVal->setFormat(wsHstry->getFormat());
|
||||||
|
lastAddedIdx = wdHstry->getLastIdx();
|
||||||
|
|
||||||
|
oldShowTruW = showTruW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Identify buffer size and buffer start position for chart
|
||||||
|
count = wdHstry->getCurrentSize();
|
||||||
|
currIdx = wdHstry->getLastIdx();
|
||||||
|
numAddedBufVals = (currIdx - lastAddedIdx + bufSize) % bufSize; // Number of values added to buffer since last display
|
||||||
|
if (dataIntv != oldDataIntv || count == 1) {
|
||||||
|
// new data interval selected by user; this is only x * 230 values instead of 240 seconds (4 minutes) per interval step
|
||||||
|
intvBufSize = cHeight * dataIntv;
|
||||||
|
numWndVals = min(count, (cHeight - 60) * dataIntv);
|
||||||
|
bufStart = max(0, count - numWndVals);
|
||||||
|
lastAddedIdx = currIdx;
|
||||||
|
oldDataIntv = dataIntv;
|
||||||
|
} else {
|
||||||
|
numWndVals = numWndVals + numAddedBufVals;
|
||||||
|
lastAddedIdx = currIdx;
|
||||||
|
if (count == bufSize) {
|
||||||
|
bufStart = max(0, bufStart - numAddedBufVals);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// LOG_DEBUG(GwLog::DEBUG,"PSRAM Size: %d kByte; free: %d Byte", ESP.getPsramSize()/1024, ESP.getFreePsram());
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "PageWindPlot Dataset: count: %d, xWD: %.1f, xWS: %.2f, xWD_valid? %d, intvBufSize: %d, numWndVals: %d, bufStart: %d, numAddedBufVals: %d, lastIdx: %d, wind source: %s",
|
||||||
|
count, wdHstry->getLast() / 1000.0 * radToDeg, wsHstry->getLast() / 1000.0 * 1.94384, BDataValid[0], intvBufSize, numWndVals, bufStart, numAddedBufVals, wdHstry->getLastIdx(),
|
||||||
|
showTruW ? "True" : "App");
|
||||||
|
|
||||||
|
// Set wndCenter from 1st real buffer value
|
||||||
|
if (wndCenter == INT_MAX || (wndCenter == 0 && count == 1)) {
|
||||||
|
wndCenter = getCntr(*wdHstry, numWndVals);
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "PageWindPlot Range Init: count: %d, xWD: %.1f, wndCenter: %d, diffRng: %d, chrtRng: %d, Min: %.0f, Max: %.0f", count, wdHstry->getLast() / 1000.0 * radToDeg,
|
||||||
|
wndCenter, diffRng, chrtRng, wdHstry->getMin(numWndVals) / 1000.0 * radToDeg, wdHstry->getMax(numWndVals) / 1000.0 * radToDeg);
|
||||||
|
} else {
|
||||||
|
// check and adjust range between left, center, and right chart limit
|
||||||
|
diffRng = getRng(*wdHstry, wndCenter, numWndVals);
|
||||||
|
diffRng = (diffRng == wdMAX_VAL ? 0 : diffRng);
|
||||||
|
if (diffRng > chrtRng) {
|
||||||
|
chrtRng = int((diffRng + (diffRng >= 0 ? 9 : -1)) / 10) * 10; // Round up to next 10 degree value
|
||||||
|
} else if (diffRng + 10 < chrtRng) { // Reduce chart range for higher resolution if possible
|
||||||
|
chrtRng = max(dfltRng, int((diffRng + (diffRng >= 0 ? 9 : -1)) / 10) * 10);
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "PageWindPlot Range adjust: wndCenter: %d, diffRng: %d, chrtRng: %d, Min: %.0f, Max: %.0f", wndCenter, diffRng, chrtRng,
|
||||||
|
wdHstry->getMin(numWndVals) / 1000.0 * radToDeg, wdHstry->getMax(numWndVals) / 1000.0 * radToDeg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
chrtScl = float(width) / float(chrtRng) / 2.0; // Chart scale: pixels per degree
|
||||||
|
wndLeft = wndCenter - chrtRng;
|
||||||
|
if (wndLeft < 0)
|
||||||
|
wndLeft += 360;
|
||||||
|
wndRight = (chrtRng < 180 ? wndCenter + chrtRng : wndCenter + chrtRng - 1);
|
||||||
|
if (wndRight >= 360)
|
||||||
|
wndRight -= 360;
|
||||||
|
|
||||||
|
// Draw page
|
||||||
|
//***********************************************************************
|
||||||
|
|
||||||
|
// Set display in partial refresh mode
|
||||||
|
getdisplay().setPartialWindow(0, 0, width, height); // Set partial update
|
||||||
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
|
// chart lines
|
||||||
|
getdisplay().fillRect(0, yOffset, width, 2, commonData->fgcolor);
|
||||||
|
getdisplay().fillRect(xCenter, yOffset, 1, cHeight, commonData->fgcolor);
|
||||||
|
|
||||||
|
// chart labels
|
||||||
|
char sWndLbl[4]; // char buffer for Wind angle label
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().setCursor(xCenter - 88, yOffset - 3);
|
||||||
|
getdisplay().print(wdName); // Wind data name
|
||||||
|
snprintf(sWndLbl, 4, "%03d", (wndCenter < 0) ? (wndCenter + 360) : wndCenter);
|
||||||
|
drawTextCenter(xCenter, yOffset - 11, sWndLbl);
|
||||||
|
getdisplay().drawCircle(xCenter + 25, yOffset - 17, 2, commonData->fgcolor); // <degree> symbol
|
||||||
|
getdisplay().drawCircle(xCenter + 25, yOffset - 17, 3, commonData->fgcolor); // <degree> symbol
|
||||||
|
getdisplay().setCursor(1, yOffset - 3);
|
||||||
|
snprintf(sWndLbl, 4, "%03d", (wndLeft < 0) ? (wndLeft + 360) : wndLeft);
|
||||||
|
getdisplay().print(sWndLbl); // Wind left value
|
||||||
|
getdisplay().drawCircle(46, yOffset - 17, 2, commonData->fgcolor); // <degree> symbol
|
||||||
|
getdisplay().drawCircle(46, yOffset - 17, 3, commonData->fgcolor); // <degree> symbol
|
||||||
|
getdisplay().setCursor(width - 50, yOffset - 3);
|
||||||
|
snprintf(sWndLbl, 4, "%03d", (wndRight < 0) ? (wndRight + 360) : wndRight);
|
||||||
|
getdisplay().print(sWndLbl); // Wind right value
|
||||||
|
getdisplay().drawCircle(width - 5, yOffset - 17, 2, commonData->fgcolor); // <degree> symbol
|
||||||
|
getdisplay().drawCircle(width - 5, yOffset - 17, 3, commonData->fgcolor); // <degree> symbol
|
||||||
|
|
||||||
|
if (wdHstry->getMax() == wdMAX_VAL) {
|
||||||
|
// only <MAX_VAL> values in buffer -> no valid wind data available
|
||||||
|
wndDataValid = false;
|
||||||
|
} else if (!BDataValid[0] && !useSimuData) {
|
||||||
|
// currently no valid xWD data available and no simulation mode
|
||||||
|
numNoData++;
|
||||||
|
wndDataValid = true;
|
||||||
|
if (numNoData > 3) {
|
||||||
|
// If more than 4 invalid values in a row, send message
|
||||||
|
wndDataValid = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
numNoData = 0; // reset data error counter
|
||||||
|
wndDataValid = true; // At least some wind data available
|
||||||
|
}
|
||||||
|
// Draw wind values in chart
|
||||||
|
//***********************************************************************
|
||||||
|
if (wndDataValid) {
|
||||||
|
for (int i = 0; i < (numWndVals / dataIntv); i++) {
|
||||||
|
chrtVal = static_cast<int>(wdHstry->get(bufStart + (i * dataIntv))); // show the latest wind values in buffer; keep 1st value constant in a rolling buffer
|
||||||
|
if (chrtVal == wdMAX_VAL) {
|
||||||
|
chrtPrevVal = wdMAX_VAL;
|
||||||
|
} else {
|
||||||
|
chrtVal = static_cast<int>((chrtVal / 1000.0 * radToDeg) + 0.5); // Convert to degrees and round
|
||||||
|
x = ((chrtVal - wndLeft + 360) % 360) * chrtScl;
|
||||||
|
y = yOffset + cHeight - i; // Position in chart area
|
||||||
|
|
||||||
|
if (i >= (numWndVals / dataIntv) - 1) // log chart data of 1 line (adjust for test purposes)
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "PageWindPlot Chart: i: %d, chrtVal: %d, bufStart: %d, count: %d, linesToShow: %d", i, chrtVal, bufStart, count, (numWndVals / dataIntv));
|
||||||
|
|
||||||
|
if ((i == 0) || (chrtPrevVal == wdMAX_VAL)) {
|
||||||
|
// just a dot for 1st chart point or after some invalid values
|
||||||
|
prevX = x;
|
||||||
|
prevY = y;
|
||||||
|
} else {
|
||||||
|
// cross borders check; shift values to [-180..0..180]; when crossing borders, range is 2x 180 degrees
|
||||||
|
int wndLeftDlt = -180 - ((wndLeft >= 180) ? (wndLeft - 360) : wndLeft);
|
||||||
|
int chrtVal180 = ((chrtVal + wndLeftDlt + 180) % 360 + 360) % 360 - 180;
|
||||||
|
int chrtPrevVal180 = ((chrtPrevVal + wndLeftDlt + 180) % 360 + 360) % 360 - 180;
|
||||||
|
if (((chrtPrevVal180 >= -180) && (chrtPrevVal180 < -90) && (chrtVal180 > 90)) || ((chrtPrevVal180 <= 179) && (chrtPrevVal180 > 90) && chrtVal180 <= -90)) {
|
||||||
|
// If current value crosses chart borders compared to previous value, split line
|
||||||
|
int xSplit = (((chrtPrevVal180 > 0 ? wndRight : wndLeft) - wndLeft + 360) % 360) * chrtScl;
|
||||||
|
getdisplay().drawLine(prevX, prevY, xSplit, y, commonData->fgcolor);
|
||||||
|
getdisplay().drawLine(prevX, prevY - 1, ((xSplit != prevX) ? xSplit : xSplit - 1), ((xSplit != prevX) ? y - 1 : y), commonData->fgcolor);
|
||||||
|
prevX = (((chrtVal180 > 0 ? wndRight : wndLeft) - wndLeft + 360) % 360) * chrtScl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw line with 2 pixels width + make sure vertical line are drawn correctly
|
||||||
|
getdisplay().drawLine(prevX, prevY, x, y, commonData->fgcolor);
|
||||||
|
getdisplay().drawLine(prevX, prevY - 1, ((x != prevX) ? x : x - 1), ((x != prevX) ? y - 1 : y), commonData->fgcolor);
|
||||||
|
chrtPrevVal = chrtVal;
|
||||||
|
prevX = x;
|
||||||
|
prevY = y;
|
||||||
|
}
|
||||||
|
// Reaching chart area top end
|
||||||
|
if (i >= (cHeight - 1)) {
|
||||||
|
oldDataIntv = 0; // force reset of buffer start and number of values to show in next display loop
|
||||||
|
|
||||||
|
int minWndDir = wdHstry->getMin(numWndVals) / 1000.0 * radToDeg;
|
||||||
|
int maxWndDir = wdHstry->getMax(numWndVals) / 1000.0 * radToDeg;
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "PageWindPlot FreeTop: Minimum: %d, Maximum: %d, OldwndCenter: %d", minWndDir, maxWndDir, wndCenter);
|
||||||
|
// if (((minWndDir - wndCenter >= 0) && (minWndDir - wndCenter < 180)) || ((maxWndDir - wndCenter <= 0) && (maxWndDir - wndCenter >=180))) {
|
||||||
|
if ((wndRight > wndCenter && (minWndDir >= wndCenter && minWndDir <= wndRight)) || (wndRight <= wndCenter && (minWndDir >= wndCenter || minWndDir <= wndRight)) || (wndLeft < wndCenter && (maxWndDir <= wndCenter && maxWndDir >= wndLeft)) || (wndLeft >= wndCenter && (maxWndDir <= wndCenter || maxWndDir >= wndLeft))) {
|
||||||
|
// Check if all wind value are left or right of center value -> optimize chart center
|
||||||
|
wndCenter = getCntr(*wdHstry, numWndVals);
|
||||||
|
}
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "PageWindPlot FreeTop: cHeight: %d, bufStart: %d, numWndVals: %d, wndCenter: %d", cHeight, bufStart, numWndVals, wndCenter);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print wind speed value
|
||||||
|
int currentZone;
|
||||||
|
static int lastZone = 0;
|
||||||
|
static bool flipTws = false;
|
||||||
|
int xPosTws;
|
||||||
|
static const int yPosTws = yOffset + 40;
|
||||||
|
|
||||||
|
xPosTws = flipTws ? 20 : width - 145;
|
||||||
|
currentZone = (y >= yPosTws - 38) && (y <= yPosTws + 6) && (x >= xPosTws - 4) && (x <= xPosTws + 146) ? 1 : 0; // Define current zone for TWS value
|
||||||
|
if (currentZone != lastZone) {
|
||||||
|
// Only flip when x moves to a different zone
|
||||||
|
if ((y >= yPosTws - 38) && (y <= yPosTws + 6) && (x >= xPosTws - 4) && (x <= xPosTws + 146)) {
|
||||||
|
flipTws = !flipTws;
|
||||||
|
xPosTws = flipTws ? 20 : width - 145;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lastZone = currentZone;
|
||||||
|
|
||||||
|
wsValue = wsHstry->getLast();
|
||||||
|
wsBVal->value = wsValue / 1000.0; // temp variable to retreive data unit from OBP60Formater
|
||||||
|
wsBVal->valid = (static_cast<uint16_t>(wsValue) != wsHstry->getMinVal());
|
||||||
|
String swsValue = formatValue(wsBVal, *commonData).svalue; // value (string)
|
||||||
|
wsUnit = formatValue(wsBVal, *commonData).unit; // Unit of value
|
||||||
|
getdisplay().fillRect(xPosTws - 4, yPosTws - 38, 142, 44, commonData->bgcolor); // Clear area for TWS value
|
||||||
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
|
getdisplay().setCursor(xPosTws, yPosTws);
|
||||||
|
getdisplay().print(swsValue); // Value
|
||||||
|
/* if (!wsBVal->valid) {
|
||||||
|
getdisplay().print("--.-");
|
||||||
|
} else {
|
||||||
|
wsValue = wsValue / 1000.0 * 1.94384; // Wind speed value in knots
|
||||||
|
if (wsValue < 10.0) {
|
||||||
|
getdisplay().printf("!%3.1f", wsValue); // Value, round to 1 decimal
|
||||||
|
} else {
|
||||||
|
getdisplay().printf("%4.1f", wsValue); // Value, round to 1 decimal
|
||||||
|
}
|
||||||
|
} */
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().setCursor(xPosTws + 82, yPosTws - 14);
|
||||||
|
getdisplay().print(wsName); // Name
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
getdisplay().setCursor(xPosTws + 82, yPosTws + 1);
|
||||||
|
getdisplay().print(wsUnit); // Unit
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// No valid data available
|
||||||
|
LOG_DEBUG(GwLog::LOG, "PageWindPlot: No valid data available");
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold10pt8b);
|
||||||
|
getdisplay().fillRect(xCenter - 33, height / 2 - 20, 66, 24, commonData->bgcolor); // Clear area for message
|
||||||
|
drawTextCenter(xCenter, height / 2 - 10, "No data");
|
||||||
|
}
|
||||||
|
|
||||||
|
// chart Y axis labels; print at last to overwrite potential chart lines in label area
|
||||||
|
int yPos;
|
||||||
|
int chrtLbl;
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
for (int i = 1; i <= 3; i++) {
|
||||||
|
yPos = yOffset + (i * 60);
|
||||||
|
getdisplay().fillRect(0, yPos, width, 1, commonData->fgcolor);
|
||||||
|
getdisplay().fillRect(0, yPos - 8, 24, 16, commonData->bgcolor); // Clear small area to remove potential chart lines
|
||||||
|
getdisplay().setCursor(1, yPos + 4);
|
||||||
|
if (count >= intvBufSize) {
|
||||||
|
// Calculate minute value for label
|
||||||
|
chrtLbl = ((i - 1 + (prevY < yOffset + 30)) * dataIntv) * -1; // change label if last data point is more than 30 lines (= seconds) from chart line
|
||||||
|
} else {
|
||||||
|
int j = 3 - i;
|
||||||
|
chrtLbl = (int((((numWndVals / dataIntv) - 50) * dataIntv / 60) + 1) - (j * dataIntv)) * -1; // 50 lines left below last chart line
|
||||||
|
}
|
||||||
|
getdisplay().printf("%3d", chrtLbl); // Wind value label
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "PageWindPlot time: %ld", millis() - timer);
|
||||||
|
return PAGE_UPDATE;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
static Page* createPage(CommonData& common)
|
||||||
|
{
|
||||||
|
return new PageWindPlot(common);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* with the code below we make this page known to the PageTask
|
||||||
|
* we give it a type (name) that can be selected in the config
|
||||||
|
* we define which function is to be called
|
||||||
|
* and we provide the number of user parameters we expect (0 here)
|
||||||
|
* and will will provide the names of the fixed values we need */
|
||||||
|
PageDescription registerPageWindPlot(
|
||||||
|
"WindPlot", // Page name
|
||||||
|
createPage, // Action
|
||||||
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
|
{ "TWD", "AWD" }, // Bus values we need in the page
|
||||||
|
true // Show display header on/off
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -24,7 +24,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ public:
|
|||||||
String flashLED = config->getString(config->flashLED);
|
String flashLED = config->getString(config->flashLED);
|
||||||
String backlightMode = config->getString(config->backlight);
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
// Get boat values for AWA
|
// Get boat value for AWA
|
||||||
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (only one value by PageOneValue)
|
||||||
String name1 = xdrDelete(bvalue1->getName()); // Value name
|
String name1 = xdrDelete(bvalue1->getName()); // Value name
|
||||||
name1 = name1.substring(0, 6); // String length limit for value name
|
name1 = name1.substring(0, 6); // String length limit for value name
|
||||||
@@ -63,8 +63,8 @@ public:
|
|||||||
unit1old = unit1; // Save old unit
|
unit1old = unit1; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values for AWS
|
// Get boat value for AWS
|
||||||
GwApi::BoatValue *bvalue2 = pageData.values[1]; // First element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list
|
||||||
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
||||||
name2 = name2.substring(0, 6); // String length limit for value name
|
name2 = name2.substring(0, 6); // String length limit for value name
|
||||||
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
||||||
@@ -77,8 +77,8 @@ public:
|
|||||||
unit2old = unit2; // Save old unit
|
unit2old = unit2; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values TWD
|
// Get boat value for TWD
|
||||||
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Third element in list
|
||||||
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
||||||
name3 = name3.substring(0, 6); // String length limit for value name
|
name3 = name3.substring(0, 6); // String length limit for value name
|
||||||
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
||||||
@@ -91,9 +91,9 @@ public:
|
|||||||
unit3old = unit3; // Save old unit
|
unit3old = unit3; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values TWS
|
// Get boat value for TWS
|
||||||
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Fourth element in list
|
||||||
String name4 = xdrDelete(bvalue4->getName()); // Value name
|
String name4 = xdrDelete(bvalue4->getName()); // Value name
|
||||||
name4 = name4.substring(0, 6); // String length limit for value name
|
name4 = name4.substring(0, 6); // String length limit for value name
|
||||||
calibrationData.calibrateInstance(bvalue4, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue4, logger); // Check if boat data value is to be calibrated
|
||||||
double value4 = bvalue4->value; // Value as double in SI unit
|
double value4 = bvalue4->value; // Value as double in SI unit
|
||||||
@@ -105,9 +105,9 @@ public:
|
|||||||
unit4old = unit4; // Save old unit
|
unit4old = unit4; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values DBT
|
// Get boat value for DBT
|
||||||
GwApi::BoatValue *bvalue5 = pageData.values[4]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue5 = pageData.values[4]; // Fifth element in list
|
||||||
String name5 = xdrDelete(bvalue5->getName()); // Value name
|
String name5 = xdrDelete(bvalue5->getName()); // Value name
|
||||||
name5 = name5.substring(0, 6); // String length limit for value name
|
name5 = name5.substring(0, 6); // String length limit for value name
|
||||||
calibrationData.calibrateInstance(bvalue5, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue5, logger); // Check if boat data value is to be calibrated
|
||||||
double value5 = bvalue5->value; // Value as double in SI unit
|
double value5 = bvalue5->value; // Value as double in SI unit
|
||||||
@@ -119,9 +119,9 @@ public:
|
|||||||
unit5old = unit5; // Save old unit
|
unit5old = unit5; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values STW
|
// Get boat value for STW
|
||||||
GwApi::BoatValue *bvalue6 = pageData.values[5]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue6 = pageData.values[5]; // Sixth element in list
|
||||||
String name6 = xdrDelete(bvalue6->getName()); // Value name
|
String name6 = xdrDelete(bvalue6->getName()); // Value name
|
||||||
name6 = name6.substring(0, 6); // String length limit for value name
|
name6 = name6.substring(0, 6); // String length limit for value name
|
||||||
calibrationData.calibrateInstance(bvalue6, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue6, logger); // Check if boat data value is to be calibrated
|
||||||
double value6 = bvalue6->value; // Value as double in SI unit
|
double value6 = bvalue6->value; // Value as double in SI unit
|
||||||
@@ -140,7 +140,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageWindRose, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4, name5.c_str(), value5, name6.c_str(), value6);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageWindRose, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4, name5.c_str(), value5, name6.c_str(), value6);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -155,10 +155,10 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
getdisplay().print(svalue1); // Value
|
getdisplay().print(svalue1); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 95);
|
getdisplay().setCursor(10, 95);
|
||||||
getdisplay().print(name1); // Name
|
getdisplay().print(name1); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 115);
|
getdisplay().setCursor(10, 115);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -175,10 +175,10 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(10, 270);
|
getdisplay().setCursor(10, 270);
|
||||||
getdisplay().print(svalue2); // Value
|
getdisplay().print(svalue2); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 220);
|
getdisplay().setCursor(10, 220);
|
||||||
getdisplay().print(name2); // Name
|
getdisplay().print(name2); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 190);
|
getdisplay().setCursor(10, 190);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -197,10 +197,10 @@ public:
|
|||||||
else{
|
else{
|
||||||
getdisplay().print("---"); // Value
|
getdisplay().print("---"); // Value
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(335, 95);
|
getdisplay().setCursor(335, 95);
|
||||||
getdisplay().print(name3); // Name
|
getdisplay().print(name3); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 115);
|
getdisplay().setCursor(335, 115);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -217,10 +217,10 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(295, 270);
|
getdisplay().setCursor(295, 270);
|
||||||
getdisplay().print(svalue4); // Value
|
getdisplay().print(svalue4); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(335, 220);
|
getdisplay().setCursor(335, 220);
|
||||||
getdisplay().print(name4); // Name
|
getdisplay().print(name4); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 190);
|
getdisplay().setCursor(335, 190);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -248,7 +248,7 @@ public:
|
|||||||
float y = 150 - (rInstrument-30)*cos(i/180.0*pi); // y-coordinate cots
|
float y = 150 - (rInstrument-30)*cos(i/180.0*pi); // y-coordinate cots
|
||||||
const char *ii = "";
|
const char *ii = "";
|
||||||
switch (i)
|
switch (i)
|
||||||
{
|
{
|
||||||
case 0: ii="0"; break;
|
case 0: ii="0"; break;
|
||||||
case 30 : ii="30"; break;
|
case 30 : ii="30"; break;
|
||||||
case 60 : ii="60"; break;
|
case 60 : ii="60"; break;
|
||||||
@@ -270,7 +270,7 @@ public:
|
|||||||
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
||||||
getdisplay().setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,7 +333,7 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
getdisplay().setCursor(160, 200);
|
getdisplay().setCursor(160, 200);
|
||||||
getdisplay().print(svalue5); // Value
|
getdisplay().print(svalue5); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(190, 215);
|
getdisplay().setCursor(190, 215);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -347,7 +347,7 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
getdisplay().setCursor(160, 130);
|
getdisplay().setCursor(160, 130);
|
||||||
getdisplay().print(svalue6); // Value
|
getdisplay().print(svalue6); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(190, 90);
|
getdisplay().setCursor(190, 90);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -357,8 +357,7 @@ public:
|
|||||||
getdisplay().print(unit6old); // Unit
|
getdisplay().print(unit6old); // Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -373,11 +372,11 @@ static Page *createPage(CommonData &common){
|
|||||||
* and will will provide the names of the fixed values we need
|
* and will will provide the names of the fixed values we need
|
||||||
*/
|
*/
|
||||||
PageDescription registerPageWindRose(
|
PageDescription registerPageWindRose(
|
||||||
"WindRose", // Page name
|
"WindRose", // Page name
|
||||||
createPage, // Action
|
createPage, // Action
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
{"AWA", "AWS", "TWD", "TWS", "DBT", "STW"}, // Bus values we need in the page
|
{"AWA", "AWS", "TWD", "TWS", "DBT", "STW"}, // Bus values we need in the page
|
||||||
true // Show display header on/off
|
true // Show display header on/off
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -7,15 +7,33 @@
|
|||||||
class PageWindRoseFlex : public Page
|
class PageWindRoseFlex : public Page
|
||||||
{
|
{
|
||||||
int16_t lp = 80; // Pointer length
|
int16_t lp = 80; // Pointer length
|
||||||
|
char source = 'A'; // data source (A)pparent | (T)rue
|
||||||
|
String ssource="App."; // String for Data Source
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageWindRoseFlex(CommonData &common){
|
PageWindRoseFlex(CommonData &common){
|
||||||
commonData = &common;
|
commonData = &common;
|
||||||
common.logger->logDebug(GwLog::LOG,"Instantiate PageWindRoseFlex");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageWindRoseFlex");
|
||||||
}
|
}
|
||||||
|
virtual void setupKeys(){
|
||||||
|
Page::setupKeys();
|
||||||
|
commonData->keydata[1].label = "SRC";
|
||||||
|
}
|
||||||
|
|
||||||
// Key functions
|
// Key functions
|
||||||
virtual int handleKey(int key){
|
virtual int handleKey(int key){
|
||||||
|
if(key == 2){
|
||||||
|
// Code for set source
|
||||||
|
if(source == 'A'){
|
||||||
|
source = 'T';
|
||||||
|
ssource = "True"; // String to display
|
||||||
|
} else {
|
||||||
|
source = 'A';
|
||||||
|
ssource = "App."; // String to display
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return key; // Commit the key
|
||||||
|
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -24,7 +42,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -40,6 +58,11 @@ public:
|
|||||||
static String unit5old = "";
|
static String unit5old = "";
|
||||||
static String svalue6old = "";
|
static String svalue6old = "";
|
||||||
static String unit6old = "";
|
static String unit6old = "";
|
||||||
|
static GFXfont name3font;
|
||||||
|
static GFXfont name4font;
|
||||||
|
static GFXfont name5font;
|
||||||
|
static GFXfont name6font;
|
||||||
|
|
||||||
|
|
||||||
// Get config data
|
// Get config data
|
||||||
String lengthformat = config->getString(config->lengthFormat);
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
@@ -48,39 +71,60 @@ public:
|
|||||||
String flashLED = config->getString(config->flashLED);
|
String flashLED = config->getString(config->flashLED);
|
||||||
String backlightMode = config->getString(config->backlight);
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
// Get boat values for AWA
|
GwApi::BoatValue *bvalue1; // Value 1 for angle
|
||||||
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue2; // Value 2 for speed
|
||||||
String name1 = xdrDelete(bvalue1->getName()); // Value name
|
|
||||||
|
// Get boat value for wind angle (AWA/TWA), shown by pointer
|
||||||
|
if (source == 'A') {
|
||||||
|
bvalue1 = pageData.values[4];
|
||||||
|
} else {
|
||||||
|
bvalue1 = pageData.values[6];
|
||||||
|
}
|
||||||
|
String name1 = bvalue1->getName().c_str(); // Value name
|
||||||
name1 = name1.substring(0, 6); // String length limit for value name
|
name1 = name1.substring(0, 6); // String length limit for value name
|
||||||
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
||||||
double value1 = bvalue1->value; // Value as double in SI unit
|
double value1 = bvalue1->value; // Value as double in SI unit
|
||||||
bool valid1 = bvalue1->valid; // Valid information
|
bool valid1 = bvalue1->valid; // Valid information
|
||||||
value1 = formatValue(bvalue1, *commonData).value;// Format only nesaccery for simulation data for pointer
|
|
||||||
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
if(valid1 == true){
|
if(valid1 == true){
|
||||||
svalue1old = svalue1; // Save old value
|
svalue1old = svalue1; // Save old value
|
||||||
unit1old = unit1; // Save old unit
|
unit1old = unit1; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values for AWS
|
// Get boat value for wind speed (AWS/TWS), shown in top left corner
|
||||||
GwApi::BoatValue *bvalue2 = pageData.values[1]; // First element in list (only one value by PageOneValue)
|
if (source == 'A') {
|
||||||
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
bvalue2 =pageData.values[5];
|
||||||
|
} else {
|
||||||
|
bvalue2 = pageData.values[7];
|
||||||
|
}
|
||||||
|
String name2 = bvalue2->getName().c_str(); // Value name
|
||||||
name2 = name2.substring(0, 6); // String length limit for value name
|
name2 = name2.substring(0, 6); // String length limit for value name
|
||||||
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
||||||
double value2 = bvalue2->value; // Value as double in SI unit
|
double value2 = bvalue2->value; // Value as double in SI unit
|
||||||
bool valid2 = bvalue2->valid; // Valid information
|
bool valid2 = bvalue2->valid; // Valid information
|
||||||
|
if (simulation) {
|
||||||
|
value2 = 0.62731; // some random value
|
||||||
|
}
|
||||||
String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
||||||
if(valid2 == true){
|
if(valid2 == true){
|
||||||
svalue2old = svalue2; // Save old value
|
svalue2old = svalue2; // Save old value
|
||||||
unit2old = unit2; // Save old unit
|
unit2old = unit2; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values TWD
|
|
||||||
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue)
|
|
||||||
|
// Get boat value for bottom left corner
|
||||||
|
GwApi::BoatValue *bvalue3 = pageData.values[0];
|
||||||
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
||||||
name3 = name3.substring(0, 6); // String length limit for value name
|
name3 = name3.substring(0, 6); // String length limit for value name
|
||||||
|
if (name3.length()>3){
|
||||||
|
name3font=Ubuntu_Bold8pt8b;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
name3font=Ubuntu_Bold12pt8b;
|
||||||
|
}
|
||||||
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
||||||
double value3 = bvalue3->value; // Value as double in SI unit
|
double value3 = bvalue3->value; // Value as double in SI unit
|
||||||
bool valid3 = bvalue3->valid; // Valid information
|
bool valid3 = bvalue3->valid; // Valid information
|
||||||
@@ -91,10 +135,16 @@ public:
|
|||||||
unit3old = unit3; // Save old unit
|
unit3old = unit3; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values TWS
|
// Get boat value for top right corner
|
||||||
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue4 = pageData.values[1];
|
||||||
String name4 = xdrDelete(bvalue4->getName()); // Value name
|
String name4 = xdrDelete(bvalue4->getName()); // Value name
|
||||||
name4 = name4.substring(0, 6); // String length limit for value name
|
name4 = name4.substring(0, 6); // String length limit for value name
|
||||||
|
if (name4.length()>3){
|
||||||
|
name4font=Ubuntu_Bold8pt8b;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
name4font=Ubuntu_Bold12pt8b;
|
||||||
|
}
|
||||||
calibrationData.calibrateInstance(bvalue4, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue4, logger); // Check if boat data value is to be calibrated
|
||||||
double value4 = bvalue4->value; // Value as double in SI unit
|
double value4 = bvalue4->value; // Value as double in SI unit
|
||||||
bool valid4 = bvalue4->valid; // Valid information
|
bool valid4 = bvalue4->valid; // Valid information
|
||||||
@@ -105,10 +155,16 @@ public:
|
|||||||
unit4old = unit4; // Save old unit
|
unit4old = unit4; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values DBT
|
// Get boat value bottom right corner
|
||||||
GwApi::BoatValue *bvalue5 = pageData.values[4]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue5 = pageData.values[2];
|
||||||
String name5 = xdrDelete(bvalue5->getName()); // Value name
|
String name5 = xdrDelete(bvalue5->getName()); // Value name
|
||||||
name5 = name5.substring(0, 6); // String length limit for value name
|
name5 = name5.substring(0, 6); // String length limit for value name
|
||||||
|
if (name5.length()>3){
|
||||||
|
name5font=Ubuntu_Bold8pt8b;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
name5font=Ubuntu_Bold12pt8b;
|
||||||
|
}
|
||||||
calibrationData.calibrateInstance(bvalue5, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue5, logger); // Check if boat data value is to be calibrated
|
||||||
double value5 = bvalue5->value; // Value as double in SI unit
|
double value5 = bvalue5->value; // Value as double in SI unit
|
||||||
bool valid5 = bvalue5->valid; // Valid information
|
bool valid5 = bvalue5->valid; // Valid information
|
||||||
@@ -119,10 +175,16 @@ public:
|
|||||||
unit5old = unit5; // Save old unit
|
unit5old = unit5; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values STW
|
// Get boat value for center (name is not displayed)
|
||||||
GwApi::BoatValue *bvalue6 = pageData.values[5]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue6 = pageData.values[3];
|
||||||
String name6 = xdrDelete(bvalue6->getName()); // Value name
|
String name6 = xdrDelete(bvalue6->getName()); // Value name
|
||||||
name6 = name6.substring(0, 6); // String length limit for value name
|
name6 = name6.substring(0, 6); // String length limit for value name
|
||||||
|
if (name6.length()>3){
|
||||||
|
name6font=Ubuntu_Bold8pt8b;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
name6font=Ubuntu_Bold8pt8b;
|
||||||
|
}
|
||||||
calibrationData.calibrateInstance(bvalue6, logger); // Check if boat data value is to be calibrated
|
calibrationData.calibrateInstance(bvalue6, logger); // Check if boat data value is to be calibrated
|
||||||
double value6 = bvalue6->value; // Value as double in SI unit
|
double value6 = bvalue6->value; // Value as double in SI unit
|
||||||
bool valid6 = bvalue6->valid; // Valid information
|
bool valid6 = bvalue6->valid; // Valid information
|
||||||
@@ -133,6 +195,7 @@ public:
|
|||||||
unit6old = unit6; // Save old unit
|
unit6old = unit6; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Optical warning by limit violation (unused)
|
// Optical warning by limit violation (unused)
|
||||||
if(String(flashLED) == "Limit Violation"){
|
if(String(flashLED) == "Limit Violation"){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
@@ -140,7 +203,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageWindRoseFlex, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4, name5.c_str(), value5, name6.c_str(), value6);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageWindRoseFlex, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4, name5.c_str(), value5, name6.c_str(), value6);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -151,14 +214,14 @@ public:
|
|||||||
|
|
||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show value 2 at position of value 1 (top left)
|
// Show AWS or TWS top left
|
||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
getdisplay().print(svalue2); // Value
|
getdisplay().print(svalue2); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 95);
|
getdisplay().setCursor(10, 95);
|
||||||
getdisplay().print(name2); // Name
|
getdisplay().print(name2); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 115);
|
getdisplay().setCursor(10, 115);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -171,14 +234,14 @@ public:
|
|||||||
// Horizintal separator left
|
// Horizintal separator left
|
||||||
getdisplay().fillRect(0, 149, 60, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 149, 60, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// Show value 3 at bottom left
|
// Show value 3 (=first user-configured parameter) at bottom left
|
||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(10, 270);
|
getdisplay().setCursor(10, 270);
|
||||||
getdisplay().print(svalue3); // Value
|
getdisplay().print(svalue3); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&name3font);
|
||||||
getdisplay().setCursor(10, 220);
|
getdisplay().setCursor(10, 220);
|
||||||
getdisplay().print(name3); // Name
|
getdisplay().print(name3); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 190);
|
getdisplay().setCursor(10, 190);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -188,21 +251,15 @@ public:
|
|||||||
getdisplay().print(unit3old); // Unit
|
getdisplay().print(unit3old); // Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show value 4 at top right
|
// Show value 4 (=second user-configured parameter) at top right
|
||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(295, 65);
|
getdisplay().setCursor(295, 65);
|
||||||
if(valid3 == true){
|
getdisplay().print(svalue4); // Value
|
||||||
// getdisplay().print(abs(value3 * 180 / PI), 0); // Value
|
getdisplay().setFont(&name4font);
|
||||||
getdisplay().print(svalue4); // Value
|
getdisplay().setCursor(325, 95);
|
||||||
}
|
|
||||||
else{
|
|
||||||
getdisplay().print("---"); // Value
|
|
||||||
}
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
|
||||||
getdisplay().setCursor(335, 95);
|
|
||||||
getdisplay().print(name4); // Name
|
getdisplay().print(name4); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 115);
|
getdisplay().setCursor(325, 115);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit4); // Unit
|
getdisplay().print(unit4); // Unit
|
||||||
@@ -214,15 +271,15 @@ public:
|
|||||||
// Horizintal separator right
|
// Horizintal separator right
|
||||||
getdisplay().fillRect(340, 149, 80, 3, commonData->fgcolor);
|
getdisplay().fillRect(340, 149, 80, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// Show value 5 at bottom right
|
// Show value 5 (=third user-configured parameter) at bottom right
|
||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(295, 270);
|
getdisplay().setCursor(295, 270);
|
||||||
getdisplay().print(svalue5); // Value
|
getdisplay().print(svalue5); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&name5font);
|
||||||
getdisplay().setCursor(335, 220);
|
getdisplay().setCursor(325, 220);
|
||||||
getdisplay().print(name5); // Name
|
getdisplay().print(name5); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 190);
|
getdisplay().setCursor(325, 190);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit5); // Unit
|
getdisplay().print(unit5); // Unit
|
||||||
@@ -236,7 +293,6 @@ public:
|
|||||||
|
|
||||||
// Draw wind rose
|
// Draw wind rose
|
||||||
int rInstrument = 110; // Radius of grafic instrument
|
int rInstrument = 110; // Radius of grafic instrument
|
||||||
float pi = 3.141592;
|
|
||||||
|
|
||||||
getdisplay().fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
||||||
getdisplay().fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
||||||
@@ -246,24 +302,23 @@ public:
|
|||||||
for(int i=0; i<360; i=i+10)
|
for(int i=0; i<360; i=i+10)
|
||||||
{
|
{
|
||||||
// Scaling values
|
// Scaling values
|
||||||
float x = 200 + (rInstrument-30)*sin(i/180.0*pi); // x-coordinate dots
|
float x = 200 + (rInstrument-30)*sin(i/180.0*M_PI); // x-coordinate dots
|
||||||
float y = 150 - (rInstrument-30)*cos(i/180.0*pi); // y-coordinate dots
|
float y = 150 - (rInstrument-30)*cos(i/180.0*M_PI); // y-coordinate dots
|
||||||
const char *ii = "";
|
const char *ii = "";
|
||||||
switch (i)
|
switch (i) {
|
||||||
{
|
case 0: ii="0"; break;
|
||||||
case 0: ii="0"; break;
|
case 30 : ii="30"; break;
|
||||||
case 30 : ii="30"; break;
|
case 60 : ii="60"; break;
|
||||||
case 60 : ii="60"; break;
|
case 90 : ii="90"; break;
|
||||||
case 90 : ii="90"; break;
|
case 120 : ii="120"; break;
|
||||||
case 120 : ii="120"; break;
|
case 150 : ii="150"; break;
|
||||||
case 150 : ii="150"; break;
|
case 180 : ii="180"; break;
|
||||||
case 180 : ii="180"; break;
|
case 210 : ii="210"; break;
|
||||||
case 210 : ii="210"; break;
|
case 240 : ii="240"; break;
|
||||||
case 240 : ii="240"; break;
|
case 270 : ii="270"; break;
|
||||||
case 270 : ii="270"; break;
|
case 300 : ii="300"; break;
|
||||||
case 300 : ii="300"; break;
|
case 330 : ii="330"; break;
|
||||||
case 330 : ii="330"; break;
|
default: break;
|
||||||
default: break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print text centered on position x, y
|
// Print text centered on position x, y
|
||||||
@@ -272,16 +327,16 @@ public:
|
|||||||
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
||||||
getdisplay().setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw sub scale with dots
|
// Draw sub scale with dots
|
||||||
float x1c = 200 + rInstrument*sin(i/180.0*pi);
|
float x1c = 200 + rInstrument*sin(i/180.0*M_PI);
|
||||||
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
float y1c = 150 - rInstrument*cos(i/180.0*M_PI);
|
||||||
getdisplay().fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
getdisplay().fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
||||||
float sinx=sin(i/180.0*pi);
|
float sinx=sin(i/180.0*M_PI);
|
||||||
float cosx=cos(i/180.0*pi);
|
float cosx=cos(i/180.0*M_PI);
|
||||||
|
|
||||||
// Draw sub scale with lines (two triangles)
|
// Draw sub scale with lines (two triangles)
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
@@ -331,12 +386,13 @@ public:
|
|||||||
|
|
||||||
//*******************************************************************************************
|
//*******************************************************************************************
|
||||||
|
|
||||||
// Show value6, so that it does not collide with the wind pointer
|
// Show value6 (=fourth user-configured parameter) and ssource, so that they do not collide with the wind pointer
|
||||||
if ( cos(value1) > 0){
|
if ( cos(value1) > 0){
|
||||||
|
//pointer points upwards
|
||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
getdisplay().setCursor(160, 200);
|
getdisplay().setCursor(160, 200);
|
||||||
getdisplay().print(svalue6); // Value
|
getdisplay().print(svalue6); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(190, 215);
|
getdisplay().setCursor(190, 215);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -345,12 +401,20 @@ if ( cos(value1) > 0){
|
|||||||
else{
|
else{
|
||||||
getdisplay().print(unit6old); // Unit
|
getdisplay().print(unit6old); // Unit
|
||||||
}
|
}
|
||||||
|
if (sin(value1)>0){
|
||||||
|
getdisplay().setCursor(160, 130);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
getdisplay().setCursor(220, 130);
|
||||||
|
}
|
||||||
|
getdisplay().print(ssource); // true or app.
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
// pointer points downwards
|
||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
getdisplay().setCursor(160, 130);
|
getdisplay().setCursor(160, 130);
|
||||||
getdisplay().print(svalue6); // Value
|
getdisplay().print(svalue6); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(190, 90);
|
getdisplay().setCursor(190, 90);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -359,11 +423,16 @@ if ( cos(value1) > 0){
|
|||||||
else{
|
else{
|
||||||
getdisplay().print(unit6old); // Unit
|
getdisplay().print(unit6old); // Unit
|
||||||
}
|
}
|
||||||
|
if (sin(value1)>0){
|
||||||
|
getdisplay().setCursor(160, 200);
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().setCursor(220, 200);
|
||||||
|
}
|
||||||
|
getdisplay().print(ssource); //true or app.
|
||||||
|
}
|
||||||
|
|
||||||
|
return PAGE_UPDATE;
|
||||||
// Update display
|
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -374,15 +443,15 @@ static Page *createPage(CommonData &common){
|
|||||||
* with the code below we make this page known to the PageTask
|
* with the code below we make this page known to the PageTask
|
||||||
* we give it a type (name) that can be selected in the config
|
* we give it a type (name) that can be selected in the config
|
||||||
* we define which function is to be called
|
* we define which function is to be called
|
||||||
* and we provide the number of user parameters we expect (0 here)
|
* and we provide the number of user parameters we expect (4 here)
|
||||||
* and will will provide the names of the fixed values we need
|
* and will will provide the names of the fixed values we need
|
||||||
*/
|
*/
|
||||||
PageDescription registerPageWindRoseFlex(
|
PageDescription registerPageWindRoseFlex(
|
||||||
"WindRoseFlex", // Page name
|
"WindRoseFlex", // Page name
|
||||||
createPage, // Action
|
createPage, // Action
|
||||||
6, // Number of bus values depends on selection in Web configuration; was zero
|
4, // Number of bus values depends on selection in Web configuration
|
||||||
//{"AWA", "AWS", "COG", "SOG", "TWD", "TWS"}, // Bus values we need in the page, modified for WindRose2
|
{"AWA", "AWS", "TWA", "TWS"}, // fixed values we need in the page. They are inserted AFTER the web-configured values.
|
||||||
true // Show display header on/off
|
true // Show display header on/off
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ class PageXTETrack : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -94,7 +94,7 @@ class PageXTETrack : public Page
|
|||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// descriptions
|
// descriptions
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(50, 188);
|
getdisplay().setCursor(50, 188);
|
||||||
getdisplay().print("Cross-track error");
|
getdisplay().print("Cross-track error");
|
||||||
getdisplay().setCursor(270, 188);
|
getdisplay().setCursor(270, 188);
|
||||||
@@ -148,7 +148,7 @@ class PageXTETrack : public Page
|
|||||||
sval_wpname = "Tonne 122";
|
sval_wpname = "Tonne 122";
|
||||||
}
|
}
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold10pt7b);
|
getdisplay().setFont(&Ubuntu_Bold10pt8b);
|
||||||
getdisplay().getTextBounds(sval_wpname, 0, 150, &x, &y, &w, &h);
|
getdisplay().getTextBounds(sval_wpname, 0, 150, &x, &y, &w, &h);
|
||||||
// TODO if text don't fix use smaller font size.
|
// TODO if text don't fix use smaller font size.
|
||||||
// if smallest size does not fit use 2 lines
|
// if smallest size does not fit use 2 lines
|
||||||
@@ -207,9 +207,7 @@ class PageXTETrack : public Page
|
|||||||
drawSegment(399, 100, 318, 24, 289, 24, 350, 100, commonData->fgcolor, seg[4]);
|
drawSegment(399, 100, 318, 24, 289, 24, 350, 100, commonData->fgcolor, seg[4]);
|
||||||
drawSegment(399, 54, 354, 24, 325, 24, 399, 90, commonData->fgcolor, seg[5]);
|
drawSegment(399, 54, 354, 24, 325, 24, 399, 90, commonData->fgcolor, seg[5]);
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -225,11 +223,11 @@ static Page* createPage(CommonData &common){
|
|||||||
* this will be number of BoatValue pointers in pageData.values
|
* this will be number of BoatValue pointers in pageData.values
|
||||||
*/
|
*/
|
||||||
PageDescription registerPageXTETrack(
|
PageDescription registerPageXTETrack(
|
||||||
"XTETrack", // Page name
|
"XTETrack", // Page name
|
||||||
createPage, // Action
|
createPage, // Action
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
{"XTE", "COG", "DTW", "BTW"}, // Bus values we need in the page
|
{"XTE", "COG", "DTW", "BTW"}, // Bus values we need in the page
|
||||||
true // Show display header on/off
|
true // Show display header on/off
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,15 +4,19 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "LedSpiTask.h"
|
#include "LedSpiTask.h"
|
||||||
|
#include "OBPDataOperations.h"
|
||||||
|
|
||||||
#define MAX_PAGE_NUMBER 10 // Max number of pages for show data
|
#define MAX_PAGE_NUMBER 10 // Max number of pages for show data
|
||||||
|
|
||||||
typedef std::vector<GwApi::BoatValue *> ValueList;
|
typedef std::vector<GwApi::BoatValue *> ValueList;
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
|
GwApi *api;
|
||||||
String pageName;
|
String pageName;
|
||||||
uint8_t pageNumber; // page number in sequence of visible pages
|
uint8_t pageNumber; // page number in sequence of visible pages
|
||||||
//the values will always contain the user defined values first
|
//the values will always contain the user defined values first
|
||||||
ValueList values;
|
ValueList values;
|
||||||
|
HstryBuf* boatHstry;
|
||||||
} PageData;
|
} PageData;
|
||||||
|
|
||||||
// Sensor data structure (only for extended sensors, not for NMEA bus sensors)
|
// Sensor data structure (only for extended sensors, not for NMEA bus sensors)
|
||||||
@@ -78,20 +82,37 @@ typedef struct{
|
|||||||
bool on; // fast on/off detector
|
bool on; // fast on/off detector
|
||||||
} BacklightData;
|
} BacklightData;
|
||||||
|
|
||||||
|
enum AlarmSource {
|
||||||
|
Alarm_Generic,
|
||||||
|
Alarm_Local,
|
||||||
|
Alarm_NMEA0183,
|
||||||
|
Alarm_NMEA2000
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
GwApi::Status status;
|
uint8_t id; // alarm-id e.g. 01..99 from NMEA0183
|
||||||
GwLog *logger=NULL;
|
AlarmSource source;
|
||||||
GwConfigHandler *config=NULL;
|
String message; // single line of plain text
|
||||||
SensorData data;
|
bool active = false;
|
||||||
SunData sundata;
|
uint8_t signal; // how to signal MESSAGE | LED | BUZZER
|
||||||
TouchKeyData keydata[6];
|
uint8_t length_sec; // seconds until alarm disappeares without user interaction
|
||||||
BacklightData backlight;
|
} AlarmData;
|
||||||
GwApi::BoatValue *time=NULL;
|
|
||||||
GwApi::BoatValue *date=NULL;
|
typedef struct{
|
||||||
uint16_t fgcolor;
|
GwApi::Status status;
|
||||||
uint16_t bgcolor;
|
GwLog *logger = nullptr;
|
||||||
bool keylock = false;
|
GwConfigHandler *config = nullptr;
|
||||||
String powermode;
|
SensorData data;
|
||||||
|
SunData sundata;
|
||||||
|
TouchKeyData keydata[6];
|
||||||
|
BacklightData backlight;
|
||||||
|
AlarmData alarm;
|
||||||
|
GwApi::BoatValue *time = nullptr;
|
||||||
|
GwApi::BoatValue *date = nullptr;
|
||||||
|
uint16_t fgcolor;
|
||||||
|
uint16_t bgcolor;
|
||||||
|
bool keylock = false;
|
||||||
|
String powermode;
|
||||||
} CommonData;
|
} CommonData;
|
||||||
|
|
||||||
//a base class that all pages must inherit from
|
//a base class that all pages must inherit from
|
||||||
@@ -100,8 +121,9 @@ class Page{
|
|||||||
CommonData *commonData;
|
CommonData *commonData;
|
||||||
public:
|
public:
|
||||||
int refreshtime = 1000;
|
int refreshtime = 1000;
|
||||||
virtual void displayPage(PageData &pageData)=0;
|
virtual int displayPage(PageData &pageData)=0;
|
||||||
virtual void displayNew(PageData &pageData){}
|
virtual void displayNew(PageData &pageData){}
|
||||||
|
virtual void leavePage(PageData &pageData){}
|
||||||
virtual void setupKeys() {
|
virtual void setupKeys() {
|
||||||
#ifdef HARDWARE_V21
|
#ifdef HARDWARE_V21
|
||||||
commonData->keydata[0].label = "";
|
commonData->keydata[0].label = "";
|
||||||
@@ -160,9 +182,9 @@ class PageDescription{
|
|||||||
|
|
||||||
class PageStruct{
|
class PageStruct{
|
||||||
public:
|
public:
|
||||||
Page *page=NULL;
|
Page *page = nullptr;
|
||||||
PageData parameters;
|
PageData parameters;
|
||||||
PageDescription *description=NULL;
|
PageDescription *description = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Standard format functions without overhead
|
// Standard format functions without overhead
|
||||||
@@ -176,7 +198,7 @@ typedef struct{
|
|||||||
double value;
|
double value;
|
||||||
String svalue;
|
String svalue;
|
||||||
String unit;
|
String unit;
|
||||||
} FormatedData;
|
} FormattedData;
|
||||||
|
|
||||||
// Formatter for boat values
|
// Formatter for boat values
|
||||||
FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata);
|
FormattedData formatValue(GwApi::BoatValue *value, CommonData &commondata);
|
||||||
|
|||||||
@@ -1,232 +0,0 @@
|
|||||||
const uint8_t Ubuntu_Bold10pt7bBitmaps[] PROGMEM = {
|
|
||||||
0xFF, 0xFF, 0xFF, 0xE3, 0xFF, 0xC0, 0xEF, 0xDF, 0xBF, 0x7E, 0xFD, 0xC0,
|
|
||||||
0x0E, 0xE0, 0xEE, 0x1D, 0xCF, 0xFF, 0xFF, 0xF1, 0xDC, 0x1D, 0xC3, 0xB8,
|
|
||||||
0xFF, 0xFF, 0xFF, 0x3B, 0x83, 0xB8, 0x77, 0x07, 0x70, 0x1C, 0x0E, 0x0F,
|
|
||||||
0xCF, 0xEE, 0x07, 0x03, 0x81, 0xFC, 0x7F, 0x0F, 0xC0, 0xE0, 0x74, 0x3F,
|
|
||||||
0xF9, 0xF8, 0x38, 0x1C, 0x00, 0x38, 0x38, 0x7C, 0x70, 0xC6, 0x70, 0xC6,
|
|
||||||
0xE0, 0xC6, 0xE0, 0xC7, 0xC0, 0x7D, 0xDC, 0x3B, 0xBE, 0x03, 0xE3, 0x07,
|
|
||||||
0x63, 0x07, 0x63, 0x0E, 0x63, 0x0E, 0x3E, 0x1C, 0x1C, 0x1E, 0x01, 0xF8,
|
|
||||||
0x1F, 0xE0, 0xE7, 0x07, 0x38, 0x1F, 0x80, 0xF8, 0x0F, 0xCE, 0xEF, 0x77,
|
|
||||||
0x3F, 0x38, 0xF9, 0xFF, 0xC7, 0xFF, 0x1F, 0xBC, 0xFF, 0xFF, 0xC0, 0x08,
|
|
||||||
0x73, 0x8E, 0x71, 0xCE, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x87, 0x1C, 0x38,
|
|
||||||
0xE1, 0xC2, 0x43, 0x87, 0x1C, 0x38, 0xE1, 0xC7, 0x1C, 0x71, 0xC7, 0x1C,
|
|
||||||
0x73, 0x8E, 0x71, 0xCE, 0x10, 0x1C, 0x0E, 0x17, 0x5F, 0xFF, 0xF9, 0xB1,
|
|
||||||
0xDC, 0x6C, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F, 0xFF, 0xFF, 0xFF, 0xF8,
|
|
||||||
0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0x77, 0x77, 0xEE, 0xFF, 0xFF, 0xC0,
|
|
||||||
0x6F, 0xF6, 0x01, 0xC0, 0xE0, 0x38, 0x0E, 0x07, 0x01, 0xC0, 0x70, 0x38,
|
|
||||||
0x0E, 0x03, 0x81, 0xC0, 0x70, 0x1C, 0x0E, 0x03, 0x80, 0xE0, 0x70, 0x1C,
|
|
||||||
0x07, 0x03, 0x80, 0x1C, 0x3F, 0x9F, 0xDE, 0xFE, 0x3F, 0x1F, 0x8F, 0xC7,
|
|
||||||
0xE3, 0xF1, 0xFD, 0xEF, 0xE7, 0xF0, 0xE0, 0x0E, 0x3D, 0xFF, 0xF6, 0xE1,
|
|
||||||
0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC0, 0x3E, 0x7F, 0xBF, 0xEC,
|
|
||||||
0x70, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0xFF, 0xFF, 0xFC,
|
|
||||||
0x3C, 0x7F, 0x3F, 0xC8, 0xE0, 0x70, 0x30, 0xF0, 0x7E, 0x07, 0x81, 0xE0,
|
|
||||||
0xFF, 0xFF, 0xF3, 0xF0, 0x07, 0x07, 0x87, 0xC3, 0xE3, 0xF3, 0xB9, 0x9D,
|
|
||||||
0xCE, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0x70, 0x38, 0x3F, 0x1F, 0x8F, 0xC7,
|
|
||||||
0x03, 0x83, 0xF1, 0xFC, 0xFF, 0x07, 0x81, 0xC0, 0xFF, 0xFF, 0xF3, 0xE0,
|
|
||||||
0x07, 0x0F, 0x8F, 0xCF, 0x07, 0x07, 0xF3, 0xFD, 0xFF, 0xE3, 0xF1, 0xF8,
|
|
||||||
0xEF, 0xF7, 0xF1, 0xF0, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0x70, 0x70,
|
|
||||||
0x38, 0x38, 0x1C, 0x0E, 0x0E, 0x07, 0x03, 0x80, 0x3E, 0x3F, 0xBF, 0xFC,
|
|
||||||
0x7E, 0x3F, 0xB9, 0xF8, 0xFE, 0xE7, 0xF1, 0xF8, 0xFF, 0xF7, 0xF1, 0xF0,
|
|
||||||
0x3E, 0x3F, 0xBF, 0xDC, 0x7E, 0x3F, 0x1F, 0xFE, 0xFF, 0x3F, 0x83, 0xC3,
|
|
||||||
0xCF, 0xC7, 0xC3, 0x80, 0x6F, 0xF6, 0x00, 0x06, 0xFF, 0x60, 0x33, 0xDE,
|
|
||||||
0x60, 0x00, 0x00, 0x73, 0x9C, 0xEE, 0x70, 0x01, 0x87, 0xEF, 0xFF, 0xF8,
|
|
||||||
0xE0, 0x3F, 0x8F, 0xFC, 0x7E, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xE0, 0x00,
|
|
||||||
0x07, 0xFF, 0xFF, 0xFF, 0x60, 0x3E, 0x3F, 0xE3, 0xF0, 0x38, 0xFF, 0xFE,
|
|
||||||
0xF8, 0x60, 0x00, 0x7C, 0xFE, 0xFF, 0x07, 0x07, 0x07, 0x0E, 0x1E, 0x3C,
|
|
||||||
0x38, 0x38, 0x00, 0x30, 0x78, 0x78, 0x30, 0x03, 0xF0, 0x07, 0xFE, 0x0F,
|
|
||||||
0x03, 0x86, 0x00, 0xE6, 0x1F, 0xB7, 0x3F, 0xCF, 0x3C, 0xE7, 0x9C, 0x73,
|
|
||||||
0xCE, 0x39, 0xE7, 0x1C, 0xF3, 0xCE, 0x5C, 0xFF, 0xE6, 0x3F, 0xE3, 0x80,
|
|
||||||
0x00, 0xF0, 0x00, 0x3F, 0xE0, 0x07, 0xF8, 0x00, 0x03, 0x80, 0x0F, 0x80,
|
|
||||||
0x1F, 0x00, 0x77, 0x00, 0xEE, 0x03, 0xDE, 0x07, 0x1C, 0x1E, 0x3C, 0x3F,
|
|
||||||
0xF8, 0x7F, 0xF1, 0xFF, 0xF3, 0x80, 0xE7, 0x01, 0xDC, 0x01, 0xC0, 0xFE,
|
|
||||||
0x3F, 0xCF, 0xFB, 0x8E, 0xE3, 0xBF, 0xCF, 0xF3, 0xFE, 0xE1, 0xF8, 0x7E,
|
|
||||||
0x1F, 0xFF, 0xFF, 0xBF, 0x80, 0x0F, 0xC7, 0xFD, 0xFF, 0xBC, 0x2F, 0x01,
|
|
||||||
0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1E, 0x01, 0xE0, 0x3F, 0xF3, 0xFE, 0x1F,
|
|
||||||
0x80, 0xFF, 0x0F, 0xFC, 0xFF, 0xEE, 0x1E, 0xE0, 0xFE, 0x07, 0xE0, 0x7E,
|
|
||||||
0x07, 0xE0, 0x7E, 0x0F, 0xE1, 0xEF, 0xFE, 0xFF, 0xCF, 0xF0, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFC, 0x0E, 0x07, 0xFB, 0xFD, 0xFE, 0xE0, 0x70, 0x38, 0x1F, 0xFF,
|
|
||||||
0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xFE, 0xFE, 0xFE, 0xE0, 0xE0,
|
|
||||||
0xE0, 0xE0, 0xE0, 0xE0, 0x0F, 0xC7, 0xFD, 0xFF, 0xBC, 0x2F, 0x01, 0xC0,
|
|
||||||
0x38, 0x07, 0x07, 0xE0, 0xFE, 0x1D, 0xE3, 0xBF, 0xF3, 0xFE, 0x1F, 0x80,
|
|
||||||
0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
|
|
||||||
0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xC0, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03,
|
|
||||||
0x81, 0xD1, 0xEF, 0xFF, 0xF3, 0xF0, 0xE0, 0xFE, 0x1E, 0xE3, 0xCE, 0x78,
|
|
||||||
0xEF, 0x0F, 0xE0, 0xFC, 0x0F, 0xC0, 0xEE, 0x0E, 0x70, 0xE7, 0x8E, 0x3C,
|
|
||||||
0xE1, 0xEE, 0x0F, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0,
|
|
||||||
0xE0, 0x70, 0x38, 0x1F, 0xFF, 0xFF, 0xFC, 0x70, 0x1C, 0xF0, 0x79, 0xE0,
|
|
||||||
0xF3, 0xE3, 0xE7, 0xC7, 0xDD, 0x8D, 0xFB, 0xBB, 0xF3, 0x67, 0xE7, 0xCF,
|
|
||||||
0xCF, 0x9F, 0x8E, 0x3F, 0x1C, 0x7E, 0x00, 0xFC, 0x01, 0xC0, 0xE0, 0xFE,
|
|
||||||
0x1F, 0xC3, 0xFC, 0x7F, 0xCF, 0xD9, 0xFB, 0xBF, 0x3F, 0xE7, 0xFC, 0x7F,
|
|
||||||
0x87, 0xF0, 0xFE, 0x0F, 0xC1, 0xC0, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF, 0x9E,
|
|
||||||
0x1E, 0xF0, 0x3F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0xF7,
|
|
||||||
0x87, 0x9F, 0xFE, 0x3F, 0xF0, 0x3F, 0x00, 0xFE, 0x3F, 0xEF, 0xFF, 0x87,
|
|
||||||
0xE1, 0xF8, 0x7F, 0xFF, 0xFE, 0xFE, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38,
|
|
||||||
0x00, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF, 0x9E, 0x1E, 0xF0, 0x3F, 0x80, 0x7E,
|
|
||||||
0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0,
|
|
||||||
0x3F, 0x00, 0x3C, 0x00, 0x7E, 0x00, 0x78, 0xFE, 0x1F, 0xF3, 0xFF, 0x70,
|
|
||||||
0xEE, 0x1D, 0xC3, 0xBF, 0xF7, 0xFC, 0xFF, 0x1C, 0xF3, 0x8E, 0x70, 0xEE,
|
|
||||||
0x1D, 0xC1, 0xC0, 0x3F, 0x1F, 0xEF, 0xFB, 0x80, 0xE0, 0x3E, 0x07, 0xF0,
|
|
||||||
0x7E, 0x03, 0xC0, 0x74, 0x1F, 0xFF, 0xFF, 0x9F, 0xC0, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0x87, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38,
|
|
||||||
0x07, 0x00, 0xE0, 0x1C, 0x00, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F,
|
|
||||||
0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0xC7, 0xBF, 0xE7, 0xFC, 0x3E,
|
|
||||||
0x00, 0xE0, 0x0E, 0xE0, 0x39, 0xC0, 0x71, 0xC1, 0xC3, 0x83, 0x87, 0x07,
|
|
||||||
0x07, 0x1C, 0x0E, 0x38, 0x0E, 0xE0, 0x1D, 0xC0, 0x1F, 0x00, 0x3E, 0x00,
|
|
||||||
0x7C, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xFC, 0x1C, 0x1D, 0xC3, 0x87, 0x38,
|
|
||||||
0x78, 0xE7, 0x1F, 0x1C, 0xE3, 0x63, 0x8E, 0x6C, 0xE1, 0xDD, 0xDC, 0x3B,
|
|
||||||
0xBB, 0x83, 0x63, 0x60, 0x7C, 0x7C, 0x0F, 0x8F, 0x81, 0xE0, 0xF0, 0x1C,
|
|
||||||
0x1C, 0x00, 0xF0, 0x3D, 0xE1, 0xE3, 0x87, 0x07, 0x38, 0x1F, 0xE0, 0x3F,
|
|
||||||
0x00, 0x78, 0x01, 0xE0, 0x0F, 0xC0, 0x7F, 0x81, 0xCE, 0x0E, 0x1C, 0x78,
|
|
||||||
0x7B, 0xC0, 0xF0, 0xE0, 0x3B, 0x83, 0x9C, 0x1C, 0x71, 0xC3, 0xDE, 0x0E,
|
|
||||||
0xE0, 0x3E, 0x01, 0xF0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70,
|
|
||||||
0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFC, 0x0E, 0x07, 0x03, 0x80, 0xE0, 0x70,
|
|
||||||
0x38, 0x1E, 0x07, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xCE, 0x73,
|
|
||||||
0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0xFF, 0xF0, 0xE0, 0x1C, 0x07,
|
|
||||||
0x01, 0xC0, 0x38, 0x0E, 0x03, 0x80, 0x70, 0x1C, 0x07, 0x00, 0xE0, 0x38,
|
|
||||||
0x0E, 0x01, 0xC0, 0x70, 0x1C, 0x03, 0x80, 0xE0, 0x38, 0x07, 0xFF, 0xFE,
|
|
||||||
0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x3F, 0xFF, 0xF0, 0x0E,
|
|
||||||
0x03, 0xE0, 0x7C, 0x1D, 0xC7, 0xBC, 0xE3, 0xB8, 0x3B, 0x06, 0xFF, 0xFF,
|
|
||||||
0xF0, 0x47, 0x1E, 0x20, 0x7E, 0x3F, 0x9F, 0xE0, 0x73, 0xFB, 0xFF, 0x8F,
|
|
||||||
0xC7, 0xFF, 0xBF, 0xCF, 0xE0, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x3F,
|
|
||||||
0xCF, 0xFB, 0xFE, 0xE3, 0xF8, 0x7E, 0x1F, 0x87, 0xE3, 0xFF, 0xEF, 0xFB,
|
|
||||||
0xF8, 0x1F, 0x3F, 0x7F, 0xF0, 0xE0, 0xE0, 0xE0, 0xF0, 0x7F, 0x7F, 0x1F,
|
|
||||||
0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC7, 0xF7, 0xFD, 0xFF, 0xF1, 0xF8,
|
|
||||||
0x7E, 0x1F, 0x87, 0xF1, 0xDF, 0xF7, 0xFC, 0x7F, 0x1F, 0x1F, 0xE7, 0xFF,
|
|
||||||
0x87, 0xFF, 0xFF, 0xFE, 0x03, 0xC0, 0x7F, 0x9F, 0xE1, 0xF8, 0x3F, 0x7E,
|
|
||||||
0xFE, 0xE0, 0xE0, 0xFE, 0xFE, 0xFE, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
|
|
||||||
0xE0, 0xE0, 0x1F, 0xDF, 0xF7, 0xFF, 0xC7, 0xE1, 0xF8, 0x7F, 0x1F, 0xFF,
|
|
||||||
0x7F, 0xCF, 0xF0, 0x1C, 0x0F, 0x7F, 0x9F, 0xE7, 0xE0, 0xE0, 0x38, 0x0E,
|
|
||||||
0x03, 0x80, 0xE0, 0x3F, 0xCF, 0xFB, 0xFF, 0xE3, 0xF8, 0x7E, 0x1F, 0x87,
|
|
||||||
0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1C,
|
|
||||||
0x71, 0xC7, 0x00, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1F,
|
|
||||||
0xFF, 0xBC, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC3, 0xB8, 0xE7,
|
|
||||||
0x38, 0xEE, 0x1F, 0x83, 0xF8, 0x77, 0x8E, 0x79, 0xC7, 0x38, 0x77, 0x07,
|
|
||||||
0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x7F, 0xE7, 0xFE, 0xF9,
|
|
||||||
0xFF, 0xFB, 0xFF, 0xFF, 0x1C, 0x7E, 0x38, 0xFC, 0x71, 0xF8, 0xE3, 0xF1,
|
|
||||||
0xC7, 0xE3, 0x8F, 0xC7, 0x1F, 0x8E, 0x38, 0xFF, 0x3F, 0xEF, 0xFF, 0x8F,
|
|
||||||
0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1C, 0x1E, 0x1F, 0xE7,
|
|
||||||
0xFB, 0xCF, 0xE1, 0xF8, 0x7E, 0x1F, 0xCF, 0x7F, 0x9F, 0xE1, 0xE0, 0xFE,
|
|
||||||
0x3F, 0xEF, 0xFB, 0x8F, 0xE1, 0xF8, 0x7E, 0x1F, 0x8F, 0xFF, 0xBF, 0xEF,
|
|
||||||
0xF3, 0x80, 0xE0, 0x38, 0x0E, 0x00, 0x1F, 0xDF, 0xF7, 0xFF, 0xC7, 0xE1,
|
|
||||||
0xF8, 0x7E, 0x1F, 0xC7, 0x7F, 0xDF, 0xF3, 0xFC, 0x07, 0x01, 0xC0, 0x70,
|
|
||||||
0x1C, 0x7F, 0xFF, 0xFF, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x80, 0x3E,
|
|
||||||
0xFE, 0xE0, 0xE0, 0xF8, 0x7E, 0x1F, 0x07, 0x87, 0xFF, 0xFC, 0xE1, 0xC3,
|
|
||||||
0x87, 0xFF, 0xFF, 0xF8, 0x70, 0xE1, 0xC3, 0x87, 0xF7, 0xE7, 0xC0, 0xE1,
|
|
||||||
0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0xC7, 0xFF, 0xDF, 0xF3,
|
|
||||||
0xFC, 0xE0, 0xFE, 0x1D, 0xC7, 0x38, 0xE7, 0xBC, 0x77, 0x0E, 0xE1, 0xFC,
|
|
||||||
0x1F, 0x03, 0xE0, 0x38, 0x00, 0xE3, 0x8F, 0xC7, 0x1D, 0x8E, 0x33, 0x9E,
|
|
||||||
0xE7, 0x7D, 0xCE, 0xDB, 0x8D, 0xB6, 0x1F, 0x7C, 0x3C, 0x78, 0x38, 0xE0,
|
|
||||||
0x71, 0xC0, 0xF1, 0xEF, 0x78, 0xEE, 0x1F, 0xC1, 0xF0, 0x1C, 0x07, 0xC1,
|
|
||||||
0xFC, 0x3B, 0x8F, 0x7B, 0xC7, 0x80, 0xE0, 0xFC, 0x1D, 0xC7, 0x38, 0xE7,
|
|
||||||
0x1C, 0x77, 0x0E, 0xE1, 0xFC, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x0F, 0xE1,
|
|
||||||
0xF8, 0x3E, 0x00, 0xFF, 0xFF, 0xFF, 0x0E, 0x1C, 0x38, 0x38, 0x70, 0xFF,
|
|
||||||
0xFF, 0xFF, 0x0E, 0x3C, 0xF9, 0xC3, 0x87, 0x0E, 0x1C, 0x79, 0xE3, 0xC7,
|
|
||||||
0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x7C, 0xF8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xF0, 0xE1, 0xE3, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x3C,
|
|
||||||
0x3C, 0x79, 0xF3, 0x87, 0x0E, 0x1C, 0x39, 0xF3, 0xE7, 0x00, 0x30, 0x9F,
|
|
||||||
0x3F, 0xFF, 0x3E, 0x43, 0x00 };
|
|
||||||
|
|
||||||
const GFXglyph Ubuntu_Bold10pt7bGlyphs[] PROGMEM = {
|
|
||||||
{ 0, 0, 0, 5, 0, 1 }, // 0x20 ' '
|
|
||||||
{ 0, 3, 14, 5, 1, -13 }, // 0x21 '!'
|
|
||||||
{ 6, 7, 6, 9, 1, -14 }, // 0x22 '"'
|
|
||||||
{ 12, 12, 14, 14, 1, -13 }, // 0x23 '#'
|
|
||||||
{ 33, 9, 17, 11, 1, -14 }, // 0x24 '$'
|
|
||||||
{ 53, 16, 14, 18, 1, -13 }, // 0x25 '%'
|
|
||||||
{ 81, 13, 14, 14, 1, -13 }, // 0x26 '&'
|
|
||||||
{ 104, 3, 6, 5, 1, -14 }, // 0x27 '''
|
|
||||||
{ 107, 6, 20, 7, 1, -15 }, // 0x28 '('
|
|
||||||
{ 122, 6, 20, 7, 0, -15 }, // 0x29 ')'
|
|
||||||
{ 137, 9, 8, 10, 1, -13 }, // 0x2A '*'
|
|
||||||
{ 146, 11, 11, 13, 1, -11 }, // 0x2B '+'
|
|
||||||
{ 162, 4, 6, 5, 0, -2 }, // 0x2C ','
|
|
||||||
{ 165, 6, 3, 8, 1, -7 }, // 0x2D '-'
|
|
||||||
{ 168, 4, 4, 6, 1, -3 }, // 0x2E '.'
|
|
||||||
{ 170, 10, 20, 9, -1, -15 }, // 0x2F '/'
|
|
||||||
{ 195, 9, 14, 11, 1, -13 }, // 0x30 '0'
|
|
||||||
{ 211, 7, 14, 11, 1, -13 }, // 0x31 '1'
|
|
||||||
{ 224, 9, 14, 11, 1, -13 }, // 0x32 '2'
|
|
||||||
{ 240, 9, 14, 11, 1, -13 }, // 0x33 '3'
|
|
||||||
{ 256, 9, 14, 11, 1, -13 }, // 0x34 '4'
|
|
||||||
{ 272, 9, 14, 11, 1, -13 }, // 0x35 '5'
|
|
||||||
{ 288, 9, 14, 11, 1, -13 }, // 0x36 '6'
|
|
||||||
{ 304, 9, 14, 11, 1, -13 }, // 0x37 '7'
|
|
||||||
{ 320, 9, 14, 11, 1, -13 }, // 0x38 '8'
|
|
||||||
{ 336, 9, 14, 11, 1, -13 }, // 0x39 '9'
|
|
||||||
{ 352, 4, 11, 6, 1, -10 }, // 0x3A ':'
|
|
||||||
{ 358, 5, 14, 6, 0, -10 }, // 0x3B ';'
|
|
||||||
{ 367, 10, 9, 11, 1, -9 }, // 0x3C '<'
|
|
||||||
{ 379, 9, 8, 11, 1, -9 }, // 0x3D '='
|
|
||||||
{ 388, 9, 9, 11, 1, -9 }, // 0x3E '>'
|
|
||||||
{ 399, 8, 16, 9, 0, -15 }, // 0x3F '?'
|
|
||||||
{ 415, 17, 17, 19, 1, -13 }, // 0x40 '@'
|
|
||||||
{ 452, 15, 14, 15, 0, -13 }, // 0x41 'A'
|
|
||||||
{ 479, 10, 14, 13, 2, -13 }, // 0x42 'B'
|
|
||||||
{ 497, 11, 14, 13, 1, -13 }, // 0x43 'C'
|
|
||||||
{ 517, 12, 14, 15, 2, -13 }, // 0x44 'D'
|
|
||||||
{ 538, 9, 14, 12, 2, -13 }, // 0x45 'E'
|
|
||||||
{ 554, 8, 14, 11, 2, -13 }, // 0x46 'F'
|
|
||||||
{ 568, 11, 14, 14, 1, -13 }, // 0x47 'G'
|
|
||||||
{ 588, 11, 14, 15, 2, -13 }, // 0x48 'H'
|
|
||||||
{ 608, 3, 14, 7, 2, -13 }, // 0x49 'I'
|
|
||||||
{ 614, 9, 14, 11, 0, -13 }, // 0x4A 'J'
|
|
||||||
{ 630, 12, 14, 14, 2, -13 }, // 0x4B 'K'
|
|
||||||
{ 651, 9, 14, 11, 2, -13 }, // 0x4C 'L'
|
|
||||||
{ 667, 15, 14, 17, 1, -13 }, // 0x4D 'M'
|
|
||||||
{ 694, 11, 14, 15, 2, -13 }, // 0x4E 'N'
|
|
||||||
{ 714, 14, 14, 16, 1, -13 }, // 0x4F 'O'
|
|
||||||
{ 739, 10, 14, 13, 2, -13 }, // 0x50 'P'
|
|
||||||
{ 757, 14, 17, 16, 1, -13 }, // 0x51 'Q'
|
|
||||||
{ 787, 11, 14, 13, 2, -13 }, // 0x52 'R'
|
|
||||||
{ 807, 10, 14, 12, 1, -13 }, // 0x53 'S'
|
|
||||||
{ 825, 11, 14, 11, 0, -13 }, // 0x54 'T'
|
|
||||||
{ 845, 11, 14, 15, 2, -13 }, // 0x55 'U'
|
|
||||||
{ 865, 15, 14, 15, 0, -13 }, // 0x56 'V'
|
|
||||||
{ 892, 19, 14, 19, 0, -13 }, // 0x57 'W'
|
|
||||||
{ 926, 14, 14, 14, 0, -13 }, // 0x58 'X'
|
|
||||||
{ 951, 13, 14, 13, 0, -13 }, // 0x59 'Y'
|
|
||||||
{ 974, 10, 14, 12, 1, -13 }, // 0x5A 'Z'
|
|
||||||
{ 992, 5, 20, 7, 2, -15 }, // 0x5B '['
|
|
||||||
{ 1005, 10, 20, 9, -1, -15 }, // 0x5C '\'
|
|
||||||
{ 1030, 5, 20, 7, 0, -15 }, // 0x5D ']'
|
|
||||||
{ 1043, 11, 8, 11, 0, -13 }, // 0x5E '^'
|
|
||||||
{ 1054, 10, 2, 10, 0, 3 }, // 0x5F '_'
|
|
||||||
{ 1057, 5, 4, 6, 1, -15 }, // 0x60 '`'
|
|
||||||
{ 1060, 9, 11, 11, 1, -10 }, // 0x61 'a'
|
|
||||||
{ 1073, 10, 16, 12, 1, -15 }, // 0x62 'b'
|
|
||||||
{ 1093, 8, 11, 10, 1, -10 }, // 0x63 'c'
|
|
||||||
{ 1104, 10, 16, 12, 1, -15 }, // 0x64 'd'
|
|
||||||
{ 1124, 10, 11, 12, 1, -10 }, // 0x65 'e'
|
|
||||||
{ 1138, 8, 16, 8, 1, -15 }, // 0x66 'f'
|
|
||||||
{ 1154, 10, 15, 12, 1, -10 }, // 0x67 'g'
|
|
||||||
{ 1173, 10, 16, 12, 1, -15 }, // 0x68 'h'
|
|
||||||
{ 1193, 3, 16, 5, 1, -15 }, // 0x69 'i'
|
|
||||||
{ 1199, 6, 20, 5, -2, -15 }, // 0x6A 'j'
|
|
||||||
{ 1214, 11, 16, 12, 1, -15 }, // 0x6B 'k'
|
|
||||||
{ 1236, 5, 16, 6, 1, -15 }, // 0x6C 'l'
|
|
||||||
{ 1246, 15, 11, 17, 1, -10 }, // 0x6D 'm'
|
|
||||||
{ 1267, 10, 11, 12, 1, -10 }, // 0x6E 'n'
|
|
||||||
{ 1281, 10, 11, 12, 1, -10 }, // 0x6F 'o'
|
|
||||||
{ 1295, 10, 15, 12, 1, -10 }, // 0x70 'p'
|
|
||||||
{ 1314, 10, 15, 12, 1, -10 }, // 0x71 'q'
|
|
||||||
{ 1333, 7, 11, 8, 1, -10 }, // 0x72 'r'
|
|
||||||
{ 1343, 8, 11, 10, 1, -10 }, // 0x73 's'
|
|
||||||
{ 1354, 7, 14, 9, 1, -13 }, // 0x74 't'
|
|
||||||
{ 1367, 10, 11, 12, 1, -10 }, // 0x75 'u'
|
|
||||||
{ 1381, 11, 11, 11, 0, -10 }, // 0x76 'v'
|
|
||||||
{ 1397, 15, 11, 15, 0, -10 }, // 0x77 'w'
|
|
||||||
{ 1418, 11, 11, 11, 0, -10 }, // 0x78 'x'
|
|
||||||
{ 1434, 11, 15, 11, 0, -10 }, // 0x79 'y'
|
|
||||||
{ 1455, 8, 11, 10, 1, -10 }, // 0x7A 'z'
|
|
||||||
{ 1466, 7, 20, 8, 1, -15 }, // 0x7B '{'
|
|
||||||
{ 1484, 3, 20, 7, 2, -15 }, // 0x7C '|'
|
|
||||||
{ 1492, 7, 20, 8, 0, -15 }, // 0x7D '}'
|
|
||||||
{ 1510, 10, 5, 11, 1, -8 } }; // 0x7E '~'
|
|
||||||
|
|
||||||
const GFXfont Ubuntu_Bold10pt7b PROGMEM = {
|
|
||||||
(uint8_t *)Ubuntu_Bold10pt7bBitmaps,
|
|
||||||
(GFXglyph *)Ubuntu_Bold10pt7bGlyphs,
|
|
||||||
0x20, 0x7E, 23 };
|
|
||||||
|
|
||||||
// Approx. 2189 bytes
|
|
||||||
@@ -1,290 +0,0 @@
|
|||||||
const uint8_t Ubuntu_Bold12pt7bBitmaps[] PROGMEM = {
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0x60, 0xF7, 0xFB, 0xFD,
|
|
||||||
0xFE, 0xFF, 0x7F, 0xBF, 0x9C, 0x0F, 0x3C, 0x1E, 0x78, 0x3C, 0xF0, 0xF3,
|
|
||||||
0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x3C, 0x3E, 0xF8, 0x79, 0xE3,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x9E, 0x1E, 0x78, 0x3C, 0xF0, 0x79,
|
|
||||||
0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xFC, 0x7F, 0xE7, 0xFE, 0xF0, 0x4F,
|
|
||||||
0x00, 0xF0, 0x0F, 0xF0, 0x7F, 0xC3, 0xFE, 0x07, 0xF0, 0x1F, 0x00, 0xF6,
|
|
||||||
0x0F, 0xFF, 0xEF, 0xFC, 0x3F, 0x80, 0xE0, 0x0E, 0x00, 0xE0, 0x3E, 0x0F,
|
|
||||||
0x07, 0xF0, 0xE0, 0xF7, 0x9E, 0x0E, 0x39, 0xC0, 0xE3, 0xBC, 0x0E, 0x3B,
|
|
||||||
0x80, 0xF7, 0xF8, 0x07, 0xF7, 0x00, 0x3E, 0xF7, 0xC0, 0x0E, 0xFE, 0x01,
|
|
||||||
0xFE, 0xF0, 0x1D, 0xC7, 0x03, 0xDC, 0x70, 0x39, 0xC7, 0x07, 0x9E, 0xF0,
|
|
||||||
0x70, 0xFE, 0x0F, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0xC0, 0x3F, 0xE0, 0x38,
|
|
||||||
0xE0, 0x38, 0xE0, 0x3D, 0xE0, 0x1F, 0xC0, 0x1F, 0x80, 0x3F, 0x9E, 0x7F,
|
|
||||||
0x9E, 0xF3, 0xDC, 0xF1, 0xFC, 0xF0, 0xF8, 0xF8, 0xF8, 0xFF, 0xFC, 0x7F,
|
|
||||||
0xFE, 0x1F, 0x9F, 0xFF, 0xFF, 0xFF, 0xE0, 0x08, 0x3C, 0xF1, 0xE7, 0x8F,
|
|
||||||
0x1E, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0x78, 0xF1, 0xE1,
|
|
||||||
0xE3, 0xC3, 0xC2, 0x00, 0x21, 0xE1, 0xE3, 0xC3, 0xC7, 0x8F, 0x0F, 0x1E,
|
|
||||||
0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x3C, 0x78, 0xF3, 0xC7, 0x9E, 0x08,
|
|
||||||
0x00, 0x0E, 0x01, 0xC1, 0x39, 0x7A, 0xFF, 0xFE, 0x1C, 0x06, 0xC1, 0xDC,
|
|
||||||
0x7B, 0xC2, 0x20, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0x7B, 0xDE, 0xF7, 0xBB, 0xCC,
|
|
||||||
0xFF, 0xFF, 0xF8, 0x6F, 0xF6, 0x00, 0xF0, 0x1F, 0x01, 0xE0, 0x1E, 0x03,
|
|
||||||
0xC0, 0x3C, 0x03, 0xC0, 0x78, 0x07, 0x80, 0x78, 0x0F, 0x00, 0xF0, 0x0F,
|
|
||||||
0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x03, 0xC0, 0x3C, 0x07, 0x80, 0x78,
|
|
||||||
0x0F, 0x80, 0xF0, 0x00, 0x0F, 0x03, 0xFC, 0x7F, 0xE7, 0x9E, 0x70, 0xEF,
|
|
||||||
0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xE7,
|
|
||||||
0x9E, 0x7F, 0xE3, 0xFC, 0x0F, 0x00, 0x07, 0x1F, 0x7F, 0xFF, 0xEF, 0x4F,
|
|
||||||
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F,
|
|
||||||
0x07, 0xFC, 0xFF, 0xE6, 0x3E, 0x01, 0xE0, 0x1E, 0x03, 0xE0, 0x3C, 0x07,
|
|
||||||
0x80, 0xF8, 0x3F, 0x03, 0xE0, 0x7C, 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xF0, 0x3E, 0x1F, 0xF3, 0xFF, 0x21, 0xE0, 0x3C, 0x07, 0x87, 0xE0, 0xF8,
|
|
||||||
0x1F, 0xC0, 0x78, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0xFF, 0xF7, 0xFC, 0x7F,
|
|
||||||
0x00, 0x03, 0xC0, 0x7C, 0x0F, 0xC0, 0xFC, 0x1F, 0xC3, 0xBC, 0x3B, 0xC7,
|
|
||||||
0x3C, 0x73, 0xCF, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3C, 0x03, 0xC0,
|
|
||||||
0x3C, 0x03, 0xC0, 0x3F, 0xE3, 0xFE, 0x3F, 0xE3, 0x80, 0x38, 0x07, 0x80,
|
|
||||||
0x7F, 0x07, 0xFC, 0x7F, 0xE0, 0x3F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x1F,
|
|
||||||
0xFF, 0xEF, 0xFC, 0x7F, 0x00, 0x01, 0xE0, 0xFE, 0x1F, 0xE3, 0xF0, 0x7C,
|
|
||||||
0x07, 0x80, 0xFF, 0x8F, 0xFE, 0xFF, 0xEF, 0x1F, 0xF0, 0xFF, 0x0F, 0xF0,
|
|
||||||
0xF7, 0x9F, 0x7F, 0xE3, 0xFC, 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
|
|
||||||
0x1E, 0x03, 0xE0, 0x7C, 0x07, 0x80, 0x78, 0x0F, 0x00, 0xF0, 0x1F, 0x01,
|
|
||||||
0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x03, 0xC0, 0x3C, 0x00, 0x1F, 0x83, 0xFE,
|
|
||||||
0x7F, 0xEF, 0x9F, 0xF0, 0xFF, 0x0F, 0xF9, 0xF7, 0xFE, 0x3F, 0xC7, 0xFE,
|
|
||||||
0xF9, 0xFF, 0x0F, 0xF0, 0xFF, 0x8F, 0xFF, 0xE7, 0xFE, 0x1F, 0x80, 0x1F,
|
|
||||||
0x03, 0xFC, 0x7F, 0xEF, 0x9E, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x8F, 0x7F,
|
|
||||||
0xF7, 0xFF, 0x1F, 0xF0, 0x1E, 0x03, 0xE0, 0x7C, 0x7F, 0x87, 0xF0, 0x78,
|
|
||||||
0x00, 0x6F, 0xF6, 0x00, 0x00, 0x06, 0xFF, 0x60, 0x33, 0xDE, 0x60, 0x00,
|
|
||||||
0x00, 0x03, 0xDE, 0xF7, 0xBD, 0xDE, 0x60, 0x00, 0x60, 0x3E, 0x1F, 0xFF,
|
|
||||||
0xFF, 0xFF, 0x8F, 0x00, 0xFF, 0x8F, 0xFF, 0x1F, 0xF0, 0x3E, 0x00, 0x60,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x60,
|
|
||||||
0x07, 0xC0, 0xFF, 0x8F, 0xFF, 0x1F, 0xF0, 0x0F, 0x1F, 0xFF, 0xFF, 0xFF,
|
|
||||||
0x87, 0xC0, 0x60, 0x00, 0x3E, 0x3F, 0xEF, 0xF9, 0x0F, 0x03, 0xC0, 0xF0,
|
|
||||||
0x7C, 0x1E, 0x0F, 0x83, 0xC1, 0xE0, 0x78, 0x1C, 0x07, 0x00, 0x00, 0x30,
|
|
||||||
0x1E, 0x07, 0x80, 0xC0, 0x01, 0xFC, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0,
|
|
||||||
0x7E, 0x07, 0xC3, 0xC0, 0x0F, 0x3C, 0x7E, 0x39, 0xC7, 0xF8, 0xFE, 0x7F,
|
|
||||||
0xC7, 0xE7, 0x8E, 0x3F, 0x38, 0x71, 0xF9, 0xC3, 0x8F, 0xCE, 0x1C, 0x7E,
|
|
||||||
0x78, 0xE7, 0x71, 0xFF, 0xF9, 0xCF, 0xFF, 0x8F, 0x1F, 0xF8, 0x3C, 0x00,
|
|
||||||
0x01, 0xF8, 0x00, 0x07, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x1F, 0xE0, 0x00,
|
|
||||||
0x03, 0xE0, 0x01, 0xF0, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x77, 0x00, 0x7B,
|
|
||||||
0xC0, 0x3D, 0xE0, 0x3C, 0x78, 0x1E, 0x3C, 0x0F, 0x1E, 0x0F, 0xFF, 0x87,
|
|
||||||
0xFF, 0xC3, 0xFF, 0xE3, 0xC0, 0x79, 0xE0, 0x3D, 0xF0, 0x1E, 0xF0, 0x07,
|
|
||||||
0x80, 0xFF, 0x87, 0xFF, 0x3F, 0xF9, 0xE3, 0xEF, 0x0F, 0x78, 0x7B, 0xC7,
|
|
||||||
0xDF, 0xFC, 0xFF, 0xE7, 0xFF, 0xBC, 0x3F, 0xE0, 0xFF, 0x07, 0xF8, 0x7F,
|
|
||||||
0xFF, 0xDF, 0xFC, 0xFF, 0x80, 0x07, 0xF0, 0x7F, 0xF3, 0xFF, 0xDF, 0x82,
|
|
||||||
0x78, 0x03, 0xE0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00,
|
|
||||||
0x3E, 0x00, 0x78, 0x01, 0xF0, 0x23, 0xFF, 0xC7, 0xFF, 0x07, 0xF0, 0xFF,
|
|
||||||
0x81, 0xFF, 0xE3, 0xFF, 0xE7, 0x87, 0xEF, 0x03, 0xDE, 0x07, 0xFC, 0x07,
|
|
||||||
0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x81, 0xFF, 0x03, 0xDE,
|
|
||||||
0x1F, 0xBF, 0xFE, 0x7F, 0xF8, 0xFF, 0x80, 0xFF, 0xEF, 0xFE, 0xFF, 0xEF,
|
|
||||||
0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE, 0xF0, 0x0F,
|
|
||||||
0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0xFE, 0xFF, 0xDF, 0xFB, 0xC0,
|
|
||||||
0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x00, 0x07, 0xF0, 0x7F,
|
|
||||||
0xF3, 0xFF, 0xDF, 0x02, 0x78, 0x03, 0xE0, 0x0F, 0x00, 0x3C, 0x00, 0xF0,
|
|
||||||
0x3F, 0xC0, 0xFF, 0x03, 0xFE, 0x0F, 0x78, 0x3D, 0xF0, 0xF3, 0xFF, 0xC7,
|
|
||||||
0xFF, 0x07, 0xF8, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F,
|
|
||||||
0xC0, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFC, 0x0F,
|
|
||||||
0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3C, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0,
|
|
||||||
0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E,
|
|
||||||
0x87, 0xDF, 0xF7, 0xFE, 0x3F, 0x00, 0xF0, 0xFF, 0xC7, 0xEF, 0x1F, 0x3C,
|
|
||||||
0xF8, 0xF7, 0xC3, 0xFE, 0x0F, 0xF0, 0x3F, 0x80, 0xFF, 0x03, 0xFC, 0x0F,
|
|
||||||
0x78, 0x3D, 0xF0, 0xF3, 0xE3, 0xC7, 0x8F, 0x1F, 0x3C, 0x3E, 0xF0, 0x7C,
|
|
||||||
0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00,
|
|
||||||
0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xF0, 0x78, 0x03, 0xCF, 0x80, 0xF9, 0xF0, 0x1F, 0x3F, 0x07, 0xE7,
|
|
||||||
0xE0, 0xFC, 0xFE, 0x3F, 0xBD, 0xC7, 0xFF, 0xBC, 0xEF, 0xF3, 0xB9, 0xFE,
|
|
||||||
0x77, 0x3F, 0xCF, 0xE7, 0xF8, 0xF8, 0xFF, 0x1F, 0x1F, 0xE1, 0xC3, 0xFC,
|
|
||||||
0x38, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xE0, 0xF0, 0x3F, 0xE0, 0xFF, 0x83,
|
|
||||||
0xFF, 0x0F, 0xFE, 0x3F, 0xF8, 0xFF, 0x73, 0xFD, 0xCF, 0xF3, 0xBF, 0xCF,
|
|
||||||
0xFF, 0x1F, 0xFC, 0x3F, 0xF0, 0xFF, 0xC1, 0xFF, 0x07, 0xFC, 0x0F, 0xF0,
|
|
||||||
0x3C, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x8F, 0x83, 0xE7, 0x80, 0xF7,
|
|
||||||
0xC0, 0x7F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01,
|
|
||||||
0xFF, 0x01, 0xF7, 0x80, 0xF3, 0xE0, 0xF8, 0xFF, 0xF8, 0x3F, 0xF8, 0x07,
|
|
||||||
0xF0, 0x00, 0xFF, 0x0F, 0xFC, 0xFF, 0xEF, 0x1F, 0xF0, 0xFF, 0x0F, 0xF0,
|
|
||||||
0xFF, 0x1F, 0xFF, 0xEF, 0xFC, 0xFF, 0x8F, 0x00, 0xF0, 0x0F, 0x00, 0xF0,
|
|
||||||
0x0F, 0x00, 0xF0, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x8F, 0x83,
|
|
||||||
0xE7, 0x80, 0xF7, 0xC0, 0x7F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8,
|
|
||||||
0x03, 0xFC, 0x01, 0xFF, 0x01, 0xF7, 0x80, 0xF3, 0xE0, 0xF8, 0xFF, 0xF8,
|
|
||||||
0x3F, 0xF8, 0x07, 0xF0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x1F, 0xE0, 0x07,
|
|
||||||
0xF0, 0x00, 0x70, 0xFF, 0x83, 0xFF, 0x8F, 0xFF, 0x3C, 0x3E, 0xF0, 0x7B,
|
|
||||||
0xC1, 0xEF, 0x07, 0xBC, 0x3E, 0xFF, 0xF3, 0xFF, 0x8F, 0xFC, 0x3C, 0xF8,
|
|
||||||
0xF1, 0xF3, 0xC3, 0xCF, 0x0F, 0xBC, 0x1E, 0xF0, 0x7C, 0x1F, 0x87, 0xFE,
|
|
||||||
0x7F, 0xCF, 0x04, 0xF0, 0x0F, 0x00, 0xFC, 0x07, 0xF8, 0x3F, 0xC0, 0xFE,
|
|
||||||
0x01, 0xF0, 0x0F, 0x00, 0xF4, 0x1F, 0xFF, 0xEF, 0xFE, 0x3F, 0x80, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01,
|
|
||||||
0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00,
|
|
||||||
0x78, 0x01, 0xE0, 0x07, 0x80, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF,
|
|
||||||
0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0,
|
|
||||||
0xFF, 0x07, 0xBC, 0x79, 0xFF, 0xC7, 0xFC, 0x0F, 0x80, 0xF0, 0x07, 0xFC,
|
|
||||||
0x07, 0x9E, 0x03, 0xCF, 0x01, 0xE7, 0xC1, 0xE1, 0xE0, 0xF0, 0xF0, 0x78,
|
|
||||||
0x3C, 0x78, 0x1E, 0x3C, 0x0F, 0x1E, 0x03, 0xDE, 0x01, 0xEF, 0x00, 0xF7,
|
|
||||||
0x80, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, 0x03, 0xE0, 0x00, 0xF0, 0x00,
|
|
||||||
0x1F, 0xE0, 0x00, 0x3F, 0xE0, 0xE0, 0xFB, 0xC3, 0xE1, 0xE7, 0x87, 0xC3,
|
|
||||||
0xCF, 0x0F, 0x87, 0x9E, 0x1F, 0x8F, 0x3C, 0x77, 0x3E, 0x7C, 0xEE, 0x7C,
|
|
||||||
0x7B, 0xDE, 0xF0, 0xF7, 0x1D, 0xE1, 0xEE, 0x3B, 0xC3, 0xFC, 0x7F, 0x83,
|
|
||||||
0xF0, 0x7E, 0x07, 0xE0, 0xFC, 0x0F, 0xC1, 0xF8, 0x1F, 0x01, 0xF0, 0xF8,
|
|
||||||
0x1F, 0x7C, 0x3E, 0x3C, 0x3C, 0x3E, 0x7C, 0x1F, 0xF8, 0x0F, 0xF0, 0x0F,
|
|
||||||
0xF0, 0x07, 0xE0, 0x03, 0xC0, 0x07, 0xE0, 0x0F, 0xF0, 0x0F, 0xF0, 0x1F,
|
|
||||||
0xF8, 0x3E, 0x7C, 0x3C, 0x3C, 0x7C, 0x3E, 0xF8, 0x1F, 0xF8, 0x1F, 0x78,
|
|
||||||
0x1E, 0x7C, 0x3E, 0x3C, 0x3C, 0x3E, 0x7C, 0x1E, 0xF8, 0x0F, 0xF0, 0x0F,
|
|
||||||
0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03,
|
|
||||||
0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
|
|
||||||
0x03, 0xE0, 0x1E, 0x01, 0xF0, 0x1F, 0x00, 0xF0, 0x0F, 0x80, 0xF8, 0x07,
|
|
||||||
0x80, 0x7C, 0x07, 0xC0, 0x3E, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF,
|
|
||||||
0xFF, 0xFF, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C,
|
|
||||||
0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0xFF, 0xFF, 0x80, 0xF0, 0x07, 0x80, 0x78,
|
|
||||||
0x07, 0x80, 0x3C, 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x0F,
|
|
||||||
0x00, 0xF0, 0x0F, 0x00, 0x78, 0x07, 0x80, 0x78, 0x03, 0xC0, 0x3C, 0x03,
|
|
||||||
0xC0, 0x1E, 0x01, 0xE0, 0x1E, 0x00, 0xF0, 0xFF, 0xFF, 0xF8, 0xF1, 0xE3,
|
|
||||||
0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78,
|
|
||||||
0xFF, 0xFF, 0xFF, 0x80, 0x07, 0x00, 0x7C, 0x03, 0xE0, 0x3F, 0x83, 0xDE,
|
|
||||||
0x1E, 0xF1, 0xE3, 0xCE, 0x0E, 0xF0, 0x79, 0x01, 0x00, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xF0, 0x23, 0xC7, 0x8F, 0x08, 0x7F, 0x1F, 0xE7, 0xFC, 0x0F, 0x03,
|
|
||||||
0xCF, 0xF7, 0xFF, 0xCF, 0xF3, 0xFC, 0xFF, 0xFD, 0xFF, 0x3F, 0x80, 0x70,
|
|
||||||
0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0x8F, 0xFC, 0xFF,
|
|
||||||
0xEF, 0x1F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x1E, 0xFF,
|
|
||||||
0xEF, 0xFC, 0x7F, 0x00, 0x0F, 0x8F, 0xF7, 0xFD, 0xE0, 0xF0, 0x3C, 0x0F,
|
|
||||||
0x03, 0xC0, 0xF0, 0x1E, 0x17, 0xFC, 0xFF, 0x0F, 0x80, 0x00, 0x70, 0x0F,
|
|
||||||
0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x1F, 0xF3, 0xFF, 0x7F, 0xFF, 0x8F,
|
|
||||||
0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xF7, 0x8F, 0x7F, 0xF3, 0xFF,
|
|
||||||
0x0F, 0xE0, 0x0F, 0x83, 0xFC, 0x7F, 0xE7, 0x9E, 0xF0, 0xFF, 0x0F, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xF0, 0x07, 0x82, 0x7F, 0xE3, 0xFE, 0x0F, 0xC0, 0x1F, 0x3F,
|
|
||||||
0x9F, 0xDF, 0x0F, 0x07, 0x83, 0xFD, 0xFE, 0xFF, 0x78, 0x3C, 0x1E, 0x0F,
|
|
||||||
0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x00, 0x1F, 0xC7, 0xFD, 0xFF,
|
|
||||||
0xFC, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF9, 0xEF, 0xFD, 0xFF, 0x9F,
|
|
||||||
0xF0, 0x1E, 0x87, 0xDF, 0xF3, 0xFE, 0x7F, 0x00, 0x70, 0x1E, 0x03, 0xC0,
|
|
||||||
0x78, 0x0F, 0x01, 0xE0, 0x3F, 0xE7, 0xFE, 0xFF, 0xDE, 0x7F, 0xC7, 0xF8,
|
|
||||||
0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0x80, 0xFF,
|
|
||||||
0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1E, 0x3C, 0x78,
|
|
||||||
0xF0, 0x00, 0x07, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E,
|
|
||||||
0x3C, 0x78, 0xFF, 0xFF, 0xBE, 0x00, 0x70, 0x0F, 0x00, 0xF0, 0x0F, 0x00,
|
|
||||||
0xF0, 0x0F, 0x00, 0xF1, 0xFF, 0x3E, 0xF7, 0xCF, 0xF8, 0xFF, 0x0F, 0xE0,
|
|
||||||
0xFF, 0x0F, 0xF8, 0xF7, 0x8F, 0x7C, 0xF3, 0xEF, 0x1E, 0xF1, 0xF0, 0x73,
|
|
||||||
0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3E, 0xFD,
|
|
||||||
0xF3, 0xC0, 0x7F, 0x3F, 0x3F, 0xFF, 0xEF, 0xFF, 0xFB, 0xCF, 0x9F, 0xF1,
|
|
||||||
0xE3, 0xFC, 0x78, 0xFF, 0x1E, 0x3F, 0xC7, 0x8F, 0xF1, 0xE3, 0xFC, 0x78,
|
|
||||||
0xFF, 0x1E, 0x3F, 0xC7, 0x8F, 0xF1, 0xE3, 0xC0, 0x7F, 0x1F, 0xFB, 0xFF,
|
|
||||||
0x79, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8,
|
|
||||||
0xFF, 0x1E, 0x0F, 0x81, 0xFF, 0x1F, 0xFC, 0xF1, 0xEF, 0x07, 0xF8, 0x3F,
|
|
||||||
0xC1, 0xFE, 0x0F, 0xF0, 0x7B, 0xC7, 0x9F, 0xFC, 0x7F, 0xC0, 0xF8, 0x00,
|
|
||||||
0x7F, 0x0F, 0xFC, 0xFF, 0xEF, 0x1E, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F,
|
|
||||||
0xF0, 0xFF, 0x1F, 0xFF, 0xEF, 0xFC, 0xFF, 0x8F, 0x00, 0xF0, 0x0F, 0x00,
|
|
||||||
0xF0, 0x00, 0x0F, 0xF1, 0xFF, 0xDF, 0xFE, 0xF0, 0xFF, 0x07, 0xF8, 0x3F,
|
|
||||||
0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0xC3, 0xDF, 0xFE, 0x7F, 0xF1, 0xFF, 0x80,
|
|
||||||
0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x3F, 0xFF, 0xFF, 0xFE, 0x0F, 0x07,
|
|
||||||
0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x00, 0x1F, 0x9F, 0xEF,
|
|
||||||
0xFB, 0xC0, 0xF0, 0x3F, 0xE7, 0xFC, 0xFF, 0x03, 0xE0, 0xFF, 0xFF, 0xFE,
|
|
||||||
0x7E, 0x00, 0x70, 0x78, 0x3C, 0x1E, 0x0F, 0xF7, 0xFB, 0xFD, 0xE0, 0xF0,
|
|
||||||
0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xFC, 0xFE, 0x3F, 0x00, 0xF1, 0xFE,
|
|
||||||
0x3F, 0xC7, 0xF8, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFF, 0x3D,
|
|
||||||
0xFF, 0xBF, 0xF1, 0xFC, 0xF0, 0x7F, 0xC7, 0xDE, 0x3C, 0xF1, 0xE7, 0x8F,
|
|
||||||
0x1C, 0xF0, 0xF7, 0x87, 0xBC, 0x3D, 0xC0, 0xFE, 0x07, 0xF0, 0x1F, 0x00,
|
|
||||||
0xF8, 0x00, 0xF0, 0xE1, 0xFE, 0x1C, 0x3D, 0xC7, 0xC7, 0x3C, 0xF9, 0xE7,
|
|
||||||
0x9F, 0x3C, 0xF7, 0xE7, 0x8E, 0xEE, 0xE1, 0xDD, 0xDC, 0x3F, 0x3F, 0x83,
|
|
||||||
0xE3, 0xE0, 0x7C, 0x7C, 0x0F, 0x07, 0x80, 0xE0, 0xE0, 0xF8, 0xFB, 0xC7,
|
|
||||||
0x8F, 0x78, 0x7B, 0xC1, 0xFC, 0x07, 0xC0, 0x1C, 0x01, 0xF0, 0x1F, 0xC1,
|
|
||||||
0xEF, 0x0F, 0x78, 0xFB, 0xEF, 0x8F, 0x80, 0xF0, 0x7F, 0xC7, 0xDE, 0x3C,
|
|
||||||
0xF1, 0xE7, 0x8F, 0x1E, 0xF0, 0xF7, 0x87, 0xBC, 0x1D, 0xC0, 0xFE, 0x07,
|
|
||||||
0xF0, 0x1F, 0x00, 0xF8, 0x0F, 0x83, 0xFC, 0x1F, 0xC0, 0xFC, 0x00, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFC, 0x3E, 0x0F, 0x87, 0xC3, 0xE0, 0xF8, 0x7C, 0x1F, 0x0F,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0x1F, 0x3F, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C,
|
|
||||||
0x3C, 0x7C, 0xF8, 0xF0, 0xF8, 0x7C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C,
|
|
||||||
0x3F, 0x1F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
|
|
||||||
0xF0, 0xF8, 0xFC, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3E, 0x1F, 0x0F,
|
|
||||||
0x1F, 0x3E, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0xFC, 0xF8, 0xF0, 0x38,
|
|
||||||
0x27, 0xE7, 0xFF, 0xFE, 0x7E, 0x41, 0xC0 };
|
|
||||||
|
|
||||||
const GFXglyph Ubuntu_Bold12pt7bGlyphs[] PROGMEM = {
|
|
||||||
{ 0, 0, 0, 6, 0, 1 }, // 0x20 ' '
|
|
||||||
{ 0, 4, 17, 8, 2, -16 }, // 0x21 '!'
|
|
||||||
{ 9, 9, 7, 11, 1, -17 }, // 0x22 '"'
|
|
||||||
{ 17, 15, 17, 17, 1, -16 }, // 0x23 '#'
|
|
||||||
{ 49, 12, 22, 14, 1, -18 }, // 0x24 '$'
|
|
||||||
{ 82, 20, 17, 22, 1, -16 }, // 0x25 '%'
|
|
||||||
{ 125, 16, 17, 17, 1, -16 }, // 0x26 '&'
|
|
||||||
{ 159, 4, 7, 6, 1, -17 }, // 0x27 '''
|
|
||||||
{ 163, 7, 23, 9, 2, -18 }, // 0x28 '('
|
|
||||||
{ 184, 7, 23, 9, 0, -18 }, // 0x29 ')'
|
|
||||||
{ 205, 11, 10, 12, 1, -16 }, // 0x2A '*'
|
|
||||||
{ 219, 11, 11, 13, 1, -12 }, // 0x2B '+'
|
|
||||||
{ 235, 5, 8, 6, 0, -3 }, // 0x2C ','
|
|
||||||
{ 240, 7, 3, 9, 1, -8 }, // 0x2D '-'
|
|
||||||
{ 243, 4, 4, 6, 1, -3 }, // 0x2E '.'
|
|
||||||
{ 245, 12, 23, 10, -1, -18 }, // 0x2F '/'
|
|
||||||
{ 280, 12, 17, 14, 1, -16 }, // 0x30 '0'
|
|
||||||
{ 306, 8, 17, 14, 2, -16 }, // 0x31 '1'
|
|
||||||
{ 323, 12, 17, 14, 1, -16 }, // 0x32 '2'
|
|
||||||
{ 349, 11, 17, 14, 1, -16 }, // 0x33 '3'
|
|
||||||
{ 373, 12, 17, 14, 1, -16 }, // 0x34 '4'
|
|
||||||
{ 399, 12, 17, 14, 1, -16 }, // 0x35 '5'
|
|
||||||
{ 425, 12, 17, 14, 1, -16 }, // 0x36 '6'
|
|
||||||
{ 451, 12, 17, 14, 1, -16 }, // 0x37 '7'
|
|
||||||
{ 477, 12, 17, 14, 1, -16 }, // 0x38 '8'
|
|
||||||
{ 503, 12, 17, 14, 1, -16 }, // 0x39 '9'
|
|
||||||
{ 529, 4, 13, 6, 1, -12 }, // 0x3A ':'
|
|
||||||
{ 536, 5, 17, 6, 0, -12 }, // 0x3B ';'
|
|
||||||
{ 547, 12, 11, 14, 1, -12 }, // 0x3C '<'
|
|
||||||
{ 564, 11, 8, 14, 2, -10 }, // 0x3D '='
|
|
||||||
{ 575, 12, 11, 14, 1, -12 }, // 0x3E '>'
|
|
||||||
{ 592, 10, 19, 11, 0, -18 }, // 0x3F '?'
|
|
||||||
{ 616, 21, 21, 23, 1, -16 }, // 0x40 '@'
|
|
||||||
{ 672, 17, 17, 17, 0, -16 }, // 0x41 'A'
|
|
||||||
{ 709, 13, 17, 16, 2, -16 }, // 0x42 'B'
|
|
||||||
{ 737, 14, 17, 16, 1, -16 }, // 0x43 'C'
|
|
||||||
{ 767, 15, 17, 18, 2, -16 }, // 0x44 'D'
|
|
||||||
{ 799, 12, 17, 15, 2, -16 }, // 0x45 'E'
|
|
||||||
{ 825, 11, 17, 14, 2, -16 }, // 0x46 'F'
|
|
||||||
{ 849, 14, 17, 17, 1, -16 }, // 0x47 'G'
|
|
||||||
{ 879, 14, 17, 18, 2, -16 }, // 0x48 'H'
|
|
||||||
{ 909, 4, 17, 8, 2, -16 }, // 0x49 'I'
|
|
||||||
{ 918, 11, 17, 13, 0, -16 }, // 0x4A 'J'
|
|
||||||
{ 942, 14, 17, 16, 2, -16 }, // 0x4B 'K'
|
|
||||||
{ 972, 12, 17, 14, 2, -16 }, // 0x4C 'L'
|
|
||||||
{ 998, 19, 17, 21, 1, -16 }, // 0x4D 'M'
|
|
||||||
{ 1039, 14, 17, 18, 2, -16 }, // 0x4E 'N'
|
|
||||||
{ 1069, 17, 17, 19, 1, -16 }, // 0x4F 'O'
|
|
||||||
{ 1106, 12, 17, 15, 2, -16 }, // 0x50 'P'
|
|
||||||
{ 1132, 17, 22, 19, 1, -16 }, // 0x51 'Q'
|
|
||||||
{ 1179, 14, 17, 16, 2, -16 }, // 0x52 'R'
|
|
||||||
{ 1209, 12, 17, 14, 1, -16 }, // 0x53 'S'
|
|
||||||
{ 1235, 14, 17, 14, 0, -16 }, // 0x54 'T'
|
|
||||||
{ 1265, 13, 17, 17, 2, -16 }, // 0x55 'U'
|
|
||||||
{ 1293, 17, 17, 17, 0, -16 }, // 0x56 'V'
|
|
||||||
{ 1330, 23, 17, 23, 0, -16 }, // 0x57 'W'
|
|
||||||
{ 1379, 16, 17, 16, 0, -16 }, // 0x58 'X'
|
|
||||||
{ 1413, 16, 17, 16, 0, -16 }, // 0x59 'Y'
|
|
||||||
{ 1447, 13, 17, 15, 1, -16 }, // 0x5A 'Z'
|
|
||||||
{ 1475, 7, 23, 9, 2, -18 }, // 0x5B '['
|
|
||||||
{ 1496, 12, 23, 10, -1, -18 }, // 0x5C '\'
|
|
||||||
{ 1531, 7, 23, 9, 0, -18 }, // 0x5D ']'
|
|
||||||
{ 1552, 13, 10, 13, 0, -16 }, // 0x5E '^'
|
|
||||||
{ 1569, 12, 3, 12, 0, 2 }, // 0x5F '_'
|
|
||||||
{ 1574, 6, 5, 7, 1, -18 }, // 0x60 '`'
|
|
||||||
{ 1578, 10, 13, 13, 1, -12 }, // 0x61 'a'
|
|
||||||
{ 1595, 12, 19, 15, 2, -18 }, // 0x62 'b'
|
|
||||||
{ 1624, 10, 13, 12, 1, -12 }, // 0x63 'c'
|
|
||||||
{ 1641, 12, 19, 15, 1, -18 }, // 0x64 'd'
|
|
||||||
{ 1670, 12, 13, 14, 1, -12 }, // 0x65 'e'
|
|
||||||
{ 1690, 9, 19, 10, 2, -18 }, // 0x66 'f'
|
|
||||||
{ 1712, 11, 17, 14, 1, -12 }, // 0x67 'g'
|
|
||||||
{ 1736, 11, 19, 15, 2, -18 }, // 0x68 'h'
|
|
||||||
{ 1763, 4, 19, 8, 2, -18 }, // 0x69 'i'
|
|
||||||
{ 1773, 7, 23, 6, -2, -18 }, // 0x6A 'j'
|
|
||||||
{ 1794, 12, 19, 14, 2, -18 }, // 0x6B 'k'
|
|
||||||
{ 1823, 6, 19, 8, 2, -18 }, // 0x6C 'l'
|
|
||||||
{ 1838, 18, 13, 22, 2, -12 }, // 0x6D 'm'
|
|
||||||
{ 1868, 11, 13, 15, 2, -12 }, // 0x6E 'n'
|
|
||||||
{ 1886, 13, 13, 15, 1, -12 }, // 0x6F 'o'
|
|
||||||
{ 1908, 12, 17, 15, 2, -12 }, // 0x70 'p'
|
|
||||||
{ 1934, 13, 17, 15, 1, -12 }, // 0x71 'q'
|
|
||||||
{ 1962, 9, 13, 11, 2, -12 }, // 0x72 'r'
|
|
||||||
{ 1977, 10, 13, 12, 1, -12 }, // 0x73 's'
|
|
||||||
{ 1994, 9, 17, 11, 2, -16 }, // 0x74 't'
|
|
||||||
{ 2014, 11, 13, 15, 2, -12 }, // 0x75 'u'
|
|
||||||
{ 2032, 13, 13, 13, 0, -12 }, // 0x76 'v'
|
|
||||||
{ 2054, 19, 13, 19, 0, -12 }, // 0x77 'w'
|
|
||||||
{ 2085, 13, 13, 13, 0, -12 }, // 0x78 'x'
|
|
||||||
{ 2107, 13, 17, 13, 0, -12 }, // 0x79 'y'
|
|
||||||
{ 2135, 10, 13, 12, 1, -12 }, // 0x7A 'z'
|
|
||||||
{ 2152, 8, 23, 9, 1, -18 }, // 0x7B '{'
|
|
||||||
{ 2175, 3, 23, 7, 2, -18 }, // 0x7C '|'
|
|
||||||
{ 2184, 8, 23, 9, 0, -18 }, // 0x7D '}'
|
|
||||||
{ 2207, 12, 5, 14, 1, -9 } }; // 0x7E '~'
|
|
||||||
|
|
||||||
const GFXfont Ubuntu_Bold12pt7b PROGMEM = {
|
|
||||||
(uint8_t *)Ubuntu_Bold12pt7bBitmaps,
|
|
||||||
(GFXglyph *)Ubuntu_Bold12pt7bGlyphs,
|
|
||||||
0x20, 0x7E, 28 };
|
|
||||||
|
|
||||||
// Approx. 2887 bytes
|
|
||||||
@@ -1,402 +0,0 @@
|
|||||||
const uint8_t Ubuntu_Bold16pt7bBitmaps[] PROGMEM = {
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x0E, 0xFF, 0xFF,
|
|
||||||
0xF7, 0x00, 0xF9, 0xFF, 0x9F, 0xF9, 0xFF, 0x9F, 0xF9, 0xFF, 0x9F, 0xF9,
|
|
||||||
0xFF, 0x1E, 0x70, 0xE0, 0x07, 0xCF, 0x81, 0xF3, 0xE0, 0x7D, 0xF8, 0x3E,
|
|
||||||
0x7C, 0x0F, 0x9F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xC7, 0xCF, 0x81, 0xF3, 0xE0, 0x7C, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0x7C, 0x0F, 0x9F, 0x07, 0xEF, 0x81, 0xF3,
|
|
||||||
0xE0, 0x7C, 0xF8, 0x00, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0xF8,
|
|
||||||
0x1F, 0xFE, 0x3F, 0xFE, 0x3F, 0xFC, 0x7E, 0x0C, 0x7C, 0x00, 0x7C, 0x00,
|
|
||||||
0x7E, 0x00, 0x7F, 0xE0, 0x3F, 0xF8, 0x1F, 0xFC, 0x0F, 0xFE, 0x01, 0xFF,
|
|
||||||
0x00, 0x3F, 0x00, 0x1F, 0x00, 0x1F, 0x70, 0x3F, 0x7F, 0xFE, 0xFF, 0xFE,
|
|
||||||
0xFF, 0xFC, 0x1F, 0xF0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
|
|
||||||
0x1F, 0x80, 0xF8, 0x0F, 0xF0, 0x3C, 0x07, 0xFE, 0x1F, 0x03, 0xE7, 0xC7,
|
|
||||||
0x80, 0xF0, 0xF3, 0xE0, 0x3C, 0x3C, 0xF0, 0x0F, 0x0F, 0x78, 0x03, 0xC3,
|
|
||||||
0xFE, 0x00, 0xF9, 0xFF, 0x00, 0x1F, 0xFF, 0xDF, 0x83, 0xFD, 0xEF, 0xF0,
|
|
||||||
0x7E, 0xFF, 0xFE, 0x00, 0x3F, 0xE7, 0xC0, 0x1F, 0xF0, 0xF0, 0x07, 0xBC,
|
|
||||||
0x3C, 0x03, 0xCF, 0x0F, 0x01, 0xF3, 0xC3, 0xC0, 0x78, 0xF9, 0xF0, 0x3E,
|
|
||||||
0x1F, 0xF8, 0x0F, 0x03, 0xFC, 0x07, 0xC0, 0x7E, 0x00, 0x07, 0xF0, 0x00,
|
|
||||||
0x7F, 0xE0, 0x07, 0xFF, 0x00, 0x7F, 0xFC, 0x03, 0xE3, 0xE0, 0x1F, 0x1F,
|
|
||||||
0x00, 0xFD, 0xF0, 0x03, 0xFF, 0x80, 0x1F, 0xF8, 0x00, 0xFF, 0x00, 0x0F,
|
|
||||||
0xFC, 0xF8, 0xFF, 0xF7, 0xC7, 0xDF, 0xBE, 0x7C, 0x7F, 0xE3, 0xE1, 0xFF,
|
|
||||||
0x1F, 0x07, 0xF0, 0xFC, 0x1F, 0x87, 0xFF, 0xFE, 0x1F, 0xFF, 0xF8, 0x7F,
|
|
||||||
0xFF, 0xE0, 0xFE, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x70, 0x04,
|
|
||||||
0x07, 0x87, 0xE3, 0xE3, 0xF1, 0xF1, 0xF8, 0xF8, 0x7C, 0x3E, 0x3E, 0x1F,
|
|
||||||
0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x07, 0xC3, 0xE1,
|
|
||||||
0xF0, 0xFC, 0x3E, 0x1F, 0x87, 0xC3, 0xF0, 0xF0, 0x20, 0x10, 0x3C, 0x3F,
|
|
||||||
0x0F, 0x87, 0xE1, 0xF0, 0xFC, 0x3E, 0x1F, 0x0F, 0x83, 0xE1, 0xF0, 0xF8,
|
|
||||||
0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF1, 0xF0, 0xF8, 0x7C, 0x7E,
|
|
||||||
0x3E, 0x3F, 0x1F, 0x1F, 0x87, 0x80, 0x80, 0x0F, 0x80, 0x7C, 0x1B, 0xCC,
|
|
||||||
0xEE, 0xEF, 0xFF, 0xFF, 0xFC, 0x1C, 0x03, 0xF8, 0x3D, 0xE3, 0xEF, 0x8E,
|
|
||||||
0x38, 0x11, 0x00, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x83,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x1E, 0x00, 0x78, 0x01, 0xE0,
|
|
||||||
0x07, 0x80, 0x1E, 0x00, 0x7D, 0xF7, 0xDF, 0x7D, 0xE7, 0xBE, 0xF0, 0xC0,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7B, 0xFF, 0xFF, 0xFD, 0xE0, 0x00, 0x3E,
|
|
||||||
0x00, 0xFC, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00,
|
|
||||||
0xFC, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00, 0xFC,
|
|
||||||
0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00, 0xFC, 0x01,
|
|
||||||
0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00, 0xFC, 0x01, 0xF0,
|
|
||||||
0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x3F,
|
|
||||||
0xFC, 0x3F, 0xFC, 0x7E, 0x7E, 0x7C, 0x3E, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8,
|
|
||||||
0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8,
|
|
||||||
0x1F, 0x7C, 0x3E, 0x7E, 0x7E, 0x3F, 0xFC, 0x3F, 0xFC, 0x1F, 0xF8, 0x07,
|
|
||||||
0xE0, 0x03, 0xC1, 0xF1, 0xFD, 0xFF, 0xFF, 0xFF, 0xF7, 0x7D, 0x1F, 0x07,
|
|
||||||
0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0,
|
|
||||||
0x7C, 0x1F, 0x07, 0xC0, 0x0F, 0xC0, 0x7F, 0xE3, 0xFF, 0xE7, 0xFF, 0xE7,
|
|
||||||
0x8F, 0xC4, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x03, 0xF0, 0x0F,
|
|
||||||
0xC0, 0x3F, 0x00, 0xFE, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x3E, 0x00,
|
|
||||||
0xFF, 0xFD, 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xE0, 0x1F, 0xC0, 0xFF, 0xE3,
|
|
||||||
0xFF, 0xE3, 0xFF, 0xE6, 0x0F, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x7C, 0x1F,
|
|
||||||
0xF8, 0x3F, 0xC0, 0x7F, 0xE0, 0xFF, 0xE0, 0x0F, 0xE0, 0x07, 0xC0, 0x0F,
|
|
||||||
0x80, 0x1F, 0x60, 0x7F, 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xC3, 0xFC, 0x00,
|
|
||||||
0x00, 0x7C, 0x00, 0xFC, 0x01, 0xFC, 0x03, 0xFC, 0x07, 0xFC, 0x0F, 0xFC,
|
|
||||||
0x0F, 0x7C, 0x1F, 0x7C, 0x3E, 0x7C, 0x3C, 0x7C, 0x78, 0x7C, 0xF8, 0x7C,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7C, 0x00, 0x7C,
|
|
||||||
0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x3F, 0xFC, 0x7F, 0xF8, 0xFF, 0xF1,
|
|
||||||
0xFF, 0xE3, 0xC0, 0x07, 0x80, 0x1F, 0x00, 0x3F, 0xC0, 0x7F, 0xF0, 0xFF,
|
|
||||||
0xF1, 0xFF, 0xF0, 0x0F, 0xF0, 0x07, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F,
|
|
||||||
0x40, 0x7F, 0xFF, 0xFB, 0xFF, 0xE7, 0xFF, 0x83, 0xFC, 0x00, 0x00, 0x3E,
|
|
||||||
0x01, 0xFE, 0x07, 0xFE, 0x0F, 0xFE, 0x1F, 0xE0, 0x3F, 0x00, 0x7E, 0x00,
|
|
||||||
0x7C, 0x00, 0xFF, 0xF0, 0xFF, 0xFC, 0xFF, 0xFE, 0xFF, 0xFE, 0xF8, 0x3F,
|
|
||||||
0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0x7C, 0x3F, 0x7F, 0xFE, 0x3F, 0xFC,
|
|
||||||
0x1F, 0xF8, 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0x00, 0x3E, 0x00, 0x7C, 0x00, 0xFC, 0x00, 0xF8, 0x01, 0xF8, 0x01, 0xF0,
|
|
||||||
0x01, 0xF0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x07, 0xC0, 0x07, 0xC0,
|
|
||||||
0x07, 0xC0, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0xE0,
|
|
||||||
0x3F, 0xF8, 0x7F, 0xFC, 0x7F, 0xFE, 0xFC, 0x7E, 0xF8, 0x3E, 0xF8, 0x3E,
|
|
||||||
0xFC, 0x7C, 0x7F, 0xFC, 0x3F, 0xF0, 0x3F, 0xFC, 0x7F, 0xFE, 0xFC, 0x3E,
|
|
||||||
0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC, 0x3F, 0x7F, 0xFE, 0x7F, 0xFE,
|
|
||||||
0x3F, 0xFC, 0x07, 0xF0, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE,
|
|
||||||
0xFC, 0x3E, 0xF8, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC, 0x1F, 0x7F, 0xFF,
|
|
||||||
0x7F, 0xFF, 0x3F, 0xFF, 0x0F, 0xDF, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0xFE,
|
|
||||||
0x03, 0xFC, 0x3F, 0xF8, 0x3F, 0xF0, 0x3F, 0xC0, 0x3E, 0x00, 0x7B, 0xFF,
|
|
||||||
0xFF, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0x78, 0x7B,
|
|
||||||
0xFF, 0xFF, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xF7, 0xDF, 0x7D,
|
|
||||||
0xE7, 0xBE, 0xF0, 0xC0, 0x00, 0x0C, 0x01, 0xF8, 0x3F, 0xFB, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0x3F, 0xE0, 0x7C, 0x00, 0xFF, 0x81, 0xFF, 0xF3, 0xFF,
|
|
||||||
0xFB, 0xFF, 0xF0, 0xFF, 0xE0, 0x1F, 0x80, 0x03, 0x00, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x60, 0x01, 0xF0, 0x0F, 0xFC, 0x3F,
|
|
||||||
0xFE, 0xFF, 0xFC, 0xFF, 0xF0, 0x3F, 0xC0, 0x1F, 0x03, 0xFC, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFE, 0xFF, 0xC1, 0xF0, 0x06, 0x00, 0x00, 0x3F, 0x8F, 0xFC,
|
|
||||||
0xFF, 0xE7, 0xFF, 0x63, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x03, 0xE0, 0x7E,
|
|
||||||
0x0F, 0xC0, 0xF8, 0x1F, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x00, 0x00, 0x00,
|
|
||||||
0x1E, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x01, 0xE0, 0x00, 0x7F, 0x80,
|
|
||||||
0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFF, 0xC0, 0x3F, 0x03, 0xF8, 0x1F, 0x00,
|
|
||||||
0x3F, 0x0F, 0x80, 0x03, 0xC3, 0xC1, 0xF8, 0x79, 0xE1, 0xFF, 0x1E, 0x78,
|
|
||||||
0xFF, 0xC7, 0xFE, 0x3C, 0xF0, 0xFF, 0x1E, 0x3C, 0x3F, 0xC7, 0x8F, 0x0F,
|
|
||||||
0xF1, 0xE3, 0xC3, 0xFC, 0x78, 0xF0, 0xFF, 0x1E, 0x3C, 0x3F, 0xC7, 0x8F,
|
|
||||||
0x0F, 0xF1, 0xE3, 0xC7, 0xBE, 0x3C, 0xF1, 0xE7, 0x8F, 0xFF, 0xF1, 0xE1,
|
|
||||||
0xFF, 0xF8, 0x3C, 0x3E, 0xF8, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00,
|
|
||||||
0x3F, 0x80, 0x40, 0x07, 0xFF, 0xF0, 0x00, 0x7F, 0xFC, 0x00, 0x03, 0xFE,
|
|
||||||
0x00, 0x00, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x07, 0xFC, 0x00,
|
|
||||||
0x3F, 0xF0, 0x03, 0xEF, 0x80, 0x1F, 0x7C, 0x00, 0xFB, 0xF0, 0x0F, 0x8F,
|
|
||||||
0x80, 0x7C, 0x7E, 0x03, 0xE3, 0xF0, 0x3E, 0x0F, 0x81, 0xFF, 0xFC, 0x1F,
|
|
||||||
0xFF, 0xF0, 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x7E, 0x03, 0xF3, 0xE0, 0x0F,
|
|
||||||
0x9F, 0x00, 0x7D, 0xF8, 0x03, 0xFF, 0x80, 0x0F, 0x80, 0xFF, 0xE0, 0x7F,
|
|
||||||
0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF, 0x83, 0xF7, 0xC0, 0xFB, 0xE0, 0x7D,
|
|
||||||
0xF0, 0x7E, 0xFF, 0xFE, 0x7F, 0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF, 0x81,
|
|
||||||
0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x1F, 0xFF, 0xFF, 0xBF,
|
|
||||||
0xFF, 0xDF, 0xFF, 0x87, 0xFF, 0x00, 0x01, 0xFC, 0x03, 0xFF, 0xC7, 0xFF,
|
|
||||||
0xE7, 0xFF, 0xE3, 0xF0, 0x33, 0xF0, 0x01, 0xF0, 0x01, 0xF0, 0x00, 0xF8,
|
|
||||||
0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03,
|
|
||||||
0xF0, 0x00, 0xFC, 0x00, 0x7F, 0x03, 0x1F, 0xFF, 0x87, 0xFF, 0xE1, 0xFF,
|
|
||||||
0xF0, 0x3F, 0xC0, 0xFF, 0xE0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0xFF,
|
|
||||||
0xCF, 0x83, 0xF9, 0xF0, 0x1F, 0xBE, 0x01, 0xF7, 0xC0, 0x3F, 0xF8, 0x03,
|
|
||||||
0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x0F,
|
|
||||||
0xFE, 0x01, 0xF7, 0xC0, 0x7E, 0xF8, 0x3F, 0x9F, 0xFF, 0xF3, 0xFF, 0xFC,
|
|
||||||
0x7F, 0xFE, 0x0F, 0xFE, 0x00, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF,
|
|
||||||
0xFE, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFC, 0xFF,
|
|
||||||
0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8,
|
|
||||||
0x00, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0x00, 0x3E, 0x00,
|
|
||||||
0x7C, 0x00, 0xFF, 0xFD, 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xEF, 0x80, 0x1F,
|
|
||||||
0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0,
|
|
||||||
0x0F, 0x80, 0x00, 0x01, 0xFE, 0x01, 0xFF, 0xF1, 0xFF, 0xFC, 0xFF, 0xFE,
|
|
||||||
0x3F, 0x01, 0x9F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E,
|
|
||||||
0x00, 0x0F, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xF7, 0xC0,
|
|
||||||
0x7D, 0xF8, 0x1F, 0x7F, 0x07, 0xCF, 0xFF, 0xF1, 0xFF, 0xFC, 0x3F, 0xFF,
|
|
||||||
0x01, 0xFF, 0x00, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01,
|
|
||||||
0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xF0, 0x07,
|
|
||||||
0xFE, 0x00, 0xFF, 0xC0, 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F,
|
|
||||||
0xFC, 0x01, 0xFF, 0x80, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x7C, 0x01, 0xF0, 0x07,
|
|
||||||
0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01,
|
|
||||||
0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x60,
|
|
||||||
0xFD, 0xFF, 0xEF, 0xFF, 0xBF, 0xFC, 0x1F, 0xC0, 0xF8, 0x1F, 0xDF, 0x07,
|
|
||||||
0xF3, 0xE1, 0xFC, 0x7C, 0x7F, 0x0F, 0x9F, 0xC1, 0xF7, 0xF0, 0x3F, 0xFC,
|
|
||||||
0x07, 0xFF, 0x00, 0xFF, 0xC0, 0x1F, 0xF0, 0x03, 0xFF, 0x00, 0x7F, 0xF0,
|
|
||||||
0x0F, 0xFF, 0x01, 0xF7, 0xE0, 0x3E, 0x7E, 0x07, 0xC7, 0xE0, 0xF8, 0x7E,
|
|
||||||
0x1F, 0x07, 0xE3, 0xE0, 0x7E, 0x7C, 0x0F, 0xEF, 0x80, 0xFE, 0xF8, 0x03,
|
|
||||||
0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00,
|
|
||||||
0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80,
|
|
||||||
0x3E, 0x00, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3E,
|
|
||||||
0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x3F, 0x00, 0xFC, 0x7F, 0x00, 0xFE, 0x7F,
|
|
||||||
0x80, 0xFE, 0x7F, 0x81, 0xFE, 0x7F, 0xC1, 0xFE, 0x7F, 0xC3, 0xFE, 0x7F,
|
|
||||||
0xE3, 0xFE, 0x7D, 0xE7, 0xBE, 0x79, 0xF7, 0x9E, 0x78, 0xF7, 0x9E, 0x78,
|
|
||||||
0xFF, 0x1E, 0xF8, 0x7F, 0x1E, 0xF8, 0x7E, 0x1F, 0xF8, 0x3E, 0x1F, 0xF8,
|
|
||||||
0x3E, 0x1F, 0xF8, 0x3C, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xF8,
|
|
||||||
0x00, 0x1F, 0xF8, 0x03, 0xFF, 0x80, 0x7F, 0xF8, 0x0F, 0xFF, 0x01, 0xFF,
|
|
||||||
0xF0, 0x3F, 0xFF, 0x07, 0xFF, 0xF0, 0xFF, 0xFF, 0x1F, 0xFB, 0xE3, 0xFF,
|
|
||||||
0x3E, 0x7F, 0xE3, 0xEF, 0xFC, 0x7D, 0xFF, 0x87, 0xFF, 0xF0, 0x7F, 0xFE,
|
|
||||||
0x07, 0xFF, 0xC0, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0xFF, 0xE0, 0x1F, 0xFC,
|
|
||||||
0x01, 0xFF, 0x80, 0x3E, 0x01, 0xF8, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83,
|
|
||||||
0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xE0, 0x7E, 0x7C, 0x03, 0xEF, 0x80, 0x1F,
|
|
||||||
0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01,
|
|
||||||
0xFF, 0x80, 0x1F, 0x7C, 0x03, 0xE7, 0xE0, 0x7E, 0x7F, 0x0F, 0xE3, 0xFF,
|
|
||||||
0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xF8, 0x00, 0xFF, 0xE0, 0x7F,
|
|
||||||
0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF, 0x83, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F,
|
|
||||||
0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x1F, 0xFF, 0xFF, 0xDF, 0xFF, 0xCF, 0xFF,
|
|
||||||
0xC7, 0xFF, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E,
|
|
||||||
0x00, 0x1F, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0xFF, 0xF0, 0x1F,
|
|
||||||
0xFF, 0x83, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xE0, 0x7E, 0x7C, 0x03, 0xEF,
|
|
||||||
0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F,
|
|
||||||
0xF8, 0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x03, 0xF7, 0xE0, 0x7E, 0x3F, 0x0F,
|
|
||||||
0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0xFF, 0xF0, 0x01, 0xFE, 0x00, 0x07,
|
|
||||||
0xC0, 0x00, 0x7F, 0x00, 0x03, 0xFE, 0x00, 0x1F, 0xE0, 0x00, 0xFC, 0x00,
|
|
||||||
0x03, 0xC0, 0xFF, 0xE0, 0x3F, 0xFF, 0x0F, 0xFF, 0xE3, 0xFF, 0xFC, 0xF8,
|
|
||||||
0x3F, 0xBE, 0x03, 0xEF, 0x80, 0xFB, 0xE0, 0x3E, 0xF8, 0x0F, 0xBE, 0x0F,
|
|
||||||
0xEF, 0xFF, 0xF3, 0xFF, 0xF8, 0xFF, 0xFC, 0x3F, 0xFE, 0x0F, 0x9F, 0xC3,
|
|
||||||
0xE3, 0xF0, 0xF8, 0x7E, 0x3E, 0x0F, 0xCF, 0x83, 0xF3, 0xE0, 0x7E, 0xF8,
|
|
||||||
0x0F, 0xC0, 0x07, 0xF0, 0x3F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFC, 0xFC, 0x0C,
|
|
||||||
0xF8, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0x7F, 0x80, 0x7F, 0xF0, 0x1F, 0xFC,
|
|
||||||
0x07, 0xFE, 0x00, 0xFF, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x1F, 0x70, 0x3F,
|
|
||||||
0x7F, 0xFF, 0xFF, 0xFE, 0xFF, 0xFC, 0x1F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07,
|
|
||||||
0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00,
|
|
||||||
0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8,
|
|
||||||
0x00, 0x7C, 0x00, 0x3E, 0x00, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F,
|
|
||||||
0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8,
|
|
||||||
0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01,
|
|
||||||
0xFF, 0x80, 0x7F, 0xF0, 0x3F, 0x7E, 0x1F, 0x9F, 0xFF, 0xE3, 0xFF, 0xF0,
|
|
||||||
0x7F, 0xF8, 0x07, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xE0, 0x0F, 0x9F, 0x00,
|
|
||||||
0x7C, 0xF8, 0x03, 0xE7, 0xE0, 0x3E, 0x1F, 0x01, 0xF0, 0xF8, 0x1F, 0x87,
|
|
||||||
0xE0, 0xF8, 0x1F, 0x07, 0xC0, 0xF8, 0x7E, 0x07, 0xE3, 0xE0, 0x1F, 0x1F,
|
|
||||||
0x00, 0xFD, 0xF8, 0x07, 0xEF, 0x80, 0x1F, 0x7C, 0x00, 0xFF, 0xE0, 0x03,
|
|
||||||
0xFE, 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x1F, 0xC0,
|
|
||||||
0x00, 0xF8, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x0F, 0xDF, 0x03, 0xE0, 0x7C,
|
|
||||||
0xF8, 0x1F, 0x03, 0xE7, 0xC1, 0xFC, 0x1F, 0x3E, 0x0F, 0xE0, 0xF8, 0xF0,
|
|
||||||
0x7F, 0x0F, 0x87, 0xC3, 0xF8, 0x7C, 0x3E, 0x3D, 0xE3, 0xE1, 0xF1, 0xEF,
|
|
||||||
0x1F, 0x07, 0x8F, 0x78, 0xF0, 0x3E, 0xFB, 0xEF, 0x81, 0xF7, 0x8F, 0x7C,
|
|
||||||
0x0F, 0xBC, 0x7B, 0xE0, 0x3D, 0xE3, 0xFE, 0x01, 0xFF, 0x1F, 0xF0, 0x0F,
|
|
||||||
0xF0, 0x7F, 0x80, 0x3F, 0x83, 0xF8, 0x01, 0xFC, 0x1F, 0xC0, 0x0F, 0xC0,
|
|
||||||
0x7E, 0x00, 0x3E, 0x03, 0xE0, 0x00, 0xFC, 0x01, 0xFB, 0xF0, 0x1F, 0x8F,
|
|
||||||
0xC1, 0xF8, 0x3E, 0x0F, 0x81, 0xF8, 0xFC, 0x07, 0xEF, 0xC0, 0x1F, 0xFC,
|
|
||||||
0x00, 0xFF, 0xE0, 0x03, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x3E, 0x00, 0x03,
|
|
||||||
0xF8, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0x80, 0x1F, 0xFC, 0x01, 0xFB, 0xF0,
|
|
||||||
0x1F, 0x8F, 0xC1, 0xF8, 0x3E, 0x0F, 0xC1, 0xF8, 0xFC, 0x07, 0xEF, 0xC0,
|
|
||||||
0x1F, 0x80, 0xFC, 0x01, 0xFB, 0xE0, 0x1F, 0x9F, 0x80, 0xFC, 0x7E, 0x0F,
|
|
||||||
0xC1, 0xF0, 0x7C, 0x0F, 0xC7, 0xE0, 0x3F, 0x7E, 0x01, 0xFB, 0xF0, 0x07,
|
|
||||||
0xFF, 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x0F, 0x80,
|
|
||||||
0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07,
|
|
||||||
0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7F, 0xFF,
|
|
||||||
0xBF, 0xFF, 0xDF, 0xFF, 0xEF, 0xFF, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03,
|
|
||||||
0xF0, 0x03, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xFC, 0x00,
|
|
||||||
0xFC, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7F, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E,
|
|
||||||
0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83,
|
|
||||||
0xE0, 0xF8, 0x3E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF8, 0x01, 0xF8,
|
|
||||||
0x01, 0xF0, 0x03, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x80,
|
|
||||||
0x1F, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF8, 0x01,
|
|
||||||
0xF0, 0x03, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x80, 0x1F,
|
|
||||||
0x00, 0x3E, 0x00, 0x7E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF8, 0x01, 0xF0,
|
|
||||||
0x03, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07,
|
|
||||||
0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0,
|
|
||||||
0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F,
|
|
||||||
0x07, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xC0, 0x01, 0xF0,
|
|
||||||
0x01, 0xFC, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0x7B, 0xC0, 0x7D, 0xF0, 0x7C,
|
|
||||||
0x7C, 0x3C, 0x1E, 0x3E, 0x0F, 0xBE, 0x03, 0xEF, 0x01, 0xE1, 0x00, 0x40,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0xE3, 0xE3, 0xE3,
|
|
||||||
0xE3, 0x82, 0x00, 0x1F, 0xE0, 0xFF, 0xC3, 0xFF, 0x8F, 0xFF, 0x00, 0xFC,
|
|
||||||
0x01, 0xF1, 0xFF, 0xDF, 0xFF, 0x7F, 0xFF, 0xF1, 0xFF, 0x87, 0xFE, 0x1F,
|
|
||||||
0xFF, 0xFD, 0xFF, 0xF7, 0xFF, 0xC7, 0xFC, 0x38, 0x00, 0xF8, 0x00, 0xF8,
|
|
||||||
0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFB,
|
|
||||||
0xE0, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xFE, 0xF8, 0x3E, 0xF8, 0x3F, 0xF8,
|
|
||||||
0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x3F, 0xF8, 0x7E, 0xFF,
|
|
||||||
0xFE, 0xFF, 0xFC, 0xFF, 0xF8, 0x3F, 0xE0, 0x03, 0xF8, 0x3F, 0xF3, 0xFF,
|
|
||||||
0xDF, 0xFE, 0x7E, 0x03, 0xF0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0,
|
|
||||||
0x0F, 0xC0, 0x1F, 0x80, 0x7F, 0xFC, 0xFF, 0xF1, 0xFF, 0xC1, 0xFE, 0x00,
|
|
||||||
0x07, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00,
|
|
||||||
0x1F, 0x00, 0x1F, 0x07, 0xDF, 0x1F, 0xFF, 0x3F, 0xFF, 0x7F, 0xFF, 0x7C,
|
|
||||||
0x1F, 0xFC, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC,
|
|
||||||
0x1F, 0x7E, 0x1F, 0x7F, 0xFF, 0x3F, 0xFF, 0x1F, 0xFF, 0x07, 0xFC, 0x07,
|
|
||||||
0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0x7C, 0x3F, 0xF8, 0x1F, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x04, 0x7F,
|
|
||||||
0xFE, 0x3F, 0xFE, 0x1F, 0xFE, 0x07, 0xF8, 0x0F, 0xE3, 0xFF, 0x7F, 0xE7,
|
|
||||||
0xFE, 0xFC, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xFF, 0xEF, 0xFE, 0xFF, 0xEF,
|
|
||||||
0xFE, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F,
|
|
||||||
0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0x07, 0xF8, 0x3F, 0xFC, 0xFF,
|
|
||||||
0xFB, 0xFF, 0xF7, 0xC3, 0xFF, 0x87, 0xFE, 0x0F, 0xFC, 0x1F, 0xF8, 0x3F,
|
|
||||||
0xF0, 0x7F, 0xF0, 0xFB, 0xFF, 0xF7, 0xFF, 0xE7, 0xFF, 0xC3, 0xFF, 0x80,
|
|
||||||
0x1F, 0x00, 0x3E, 0x40, 0xFD, 0xFF, 0xF3, 0xFF, 0xE7, 0xFF, 0x03, 0xF8,
|
|
||||||
0x00, 0x38, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F,
|
|
||||||
0x80, 0x3E, 0x00, 0xFF, 0xE3, 0xFF, 0xCF, 0xFF, 0xBF, 0xFE, 0xF8, 0xFF,
|
|
||||||
0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F,
|
|
||||||
0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0x77, 0xFF, 0xF7, 0x00, 0x00,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x07,
|
|
||||||
0xC3, 0xE1, 0xF0, 0x70, 0x00, 0x00, 0x00, 0x0F, 0x87, 0xC3, 0xE1, 0xF0,
|
|
||||||
0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E,
|
|
||||||
0x1F, 0x0F, 0x8F, 0xFF, 0xFF, 0xEF, 0xE7, 0xE0, 0x38, 0x01, 0xF0, 0x03,
|
|
||||||
0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8,
|
|
||||||
0xFF, 0xF1, 0xFB, 0xE7, 0xE7, 0xDF, 0x8F, 0xFF, 0x1F, 0xFC, 0x3F, 0xF0,
|
|
||||||
0x7F, 0xC0, 0xFF, 0xC1, 0xFF, 0xC3, 0xFF, 0xC7, 0xDF, 0x8F, 0x9F, 0x9F,
|
|
||||||
0x1F, 0xBE, 0x3F, 0x7C, 0x3F, 0x38, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
|
|
||||||
0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
|
|
||||||
0xFC, 0xFF, 0x7F, 0x7F, 0x1E, 0x3F, 0xC3, 0xF1, 0xFF, 0xFF, 0xF3, 0xFF,
|
|
||||||
0xFF, 0xF7, 0xFF, 0xFF, 0xEF, 0x8F, 0xC7, 0xFF, 0x0F, 0x87, 0xFE, 0x1F,
|
|
||||||
0x0F, 0xFC, 0x3E, 0x1F, 0xF8, 0x7C, 0x3F, 0xF0, 0xF8, 0x7F, 0xE1, 0xF0,
|
|
||||||
0xFF, 0xC3, 0xE1, 0xFF, 0x87, 0xC3, 0xFF, 0x0F, 0x87, 0xFE, 0x1F, 0x0F,
|
|
||||||
0xFC, 0x3E, 0x1F, 0x3F, 0xC3, 0xFF, 0xCF, 0xFF, 0xBF, 0xFE, 0xF8, 0xFF,
|
|
||||||
0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F,
|
|
||||||
0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0x07, 0xF0, 0x0F, 0xFE, 0x0F,
|
|
||||||
0xFF, 0x8F, 0xFF, 0xE7, 0xE3, 0xF7, 0xE0, 0xFF, 0xE0, 0x3F, 0xF0, 0x1F,
|
|
||||||
0xF8, 0x0F, 0xFC, 0x07, 0xFF, 0x07, 0xEF, 0xC7, 0xE7, 0xFF, 0xF1, 0xFF,
|
|
||||||
0xF0, 0x7F, 0xF0, 0x0F, 0xE0, 0x3F, 0xC0, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF,
|
|
||||||
0xFE, 0xF8, 0x7E, 0xF8, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8,
|
|
||||||
0x1F, 0xF8, 0x3F, 0xF8, 0x3E, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8, 0xFB,
|
|
||||||
0xF0, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8,
|
|
||||||
0x00, 0x03, 0xFE, 0x0F, 0xFF, 0xCF, 0xFF, 0xEF, 0xFF, 0xF7, 0xE0, 0xFF,
|
|
||||||
0xE0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFF, 0x03,
|
|
||||||
0xEF, 0xC1, 0xF7, 0xFF, 0xF9, 0xFF, 0xFC, 0x7F, 0xFE, 0x0F, 0xDF, 0x00,
|
|
||||||
0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C,
|
|
||||||
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8,
|
|
||||||
0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0x0F, 0xE1,
|
|
||||||
0xFF, 0x9F, 0xFD, 0xFF, 0xEF, 0x81, 0x7C, 0x03, 0xFF, 0xDF, 0xFE, 0x7F,
|
|
||||||
0xF9, 0xFF, 0xC0, 0x3F, 0x81, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0x8F, 0xF0,
|
|
||||||
0x38, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE,
|
|
||||||
0xFF, 0xEF, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80,
|
|
||||||
0xFC, 0x0F, 0xFE, 0x7F, 0xE3, 0xFF, 0x0F, 0xE0, 0xF8, 0x7F, 0xE1, 0xFF,
|
|
||||||
0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F,
|
|
||||||
0xE1, 0xFF, 0x87, 0xFF, 0x1F, 0x7F, 0xFD, 0xFF, 0xF3, 0xFF, 0xC3, 0xFC,
|
|
||||||
0xF8, 0x0F, 0xFE, 0x0F, 0xDF, 0x07, 0xCF, 0x83, 0xE7, 0xE3, 0xF1, 0xF1,
|
|
||||||
0xF0, 0xF8, 0xF8, 0x7E, 0xFC, 0x1F, 0x7C, 0x0F, 0xBE, 0x03, 0xFE, 0x01,
|
|
||||||
0xFF, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x07, 0xC0, 0xF8, 0x38,
|
|
||||||
0x1F, 0xF8, 0x3C, 0x1F, 0x7C, 0x7C, 0x3E, 0x7C, 0x7C, 0x3E, 0x7C, 0x7E,
|
|
||||||
0x3E, 0x3C, 0x7E, 0x3C, 0x3C, 0xFE, 0x3C, 0x3E, 0xEE, 0x7C, 0x1E, 0xEF,
|
|
||||||
0x78, 0x1E, 0xEF, 0x78, 0x1F, 0xE7, 0xF8, 0x0F, 0xC7, 0xF0, 0x0F, 0xC3,
|
|
||||||
0xF0, 0x0F, 0xC3, 0xF0, 0x07, 0x83, 0xE0, 0x07, 0x81, 0xE0, 0xFC, 0x1F,
|
|
||||||
0xBF, 0x1F, 0x8F, 0xDF, 0x87, 0xEF, 0xC1, 0xFF, 0xC0, 0x7F, 0xC0, 0x3F,
|
|
||||||
0xE0, 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xF8, 0x03, 0xFE, 0x03, 0xFF, 0x83,
|
|
||||||
0xF7, 0xE1, 0xFB, 0xF1, 0xF8, 0xFD, 0xF8, 0x3F, 0xF8, 0x0F, 0xFE, 0x0F,
|
|
||||||
0xDF, 0x07, 0xCF, 0x83, 0xE7, 0xC3, 0xF1, 0xF1, 0xF0, 0xF8, 0xF8, 0x7C,
|
|
||||||
0x78, 0x1F, 0x7C, 0x0F, 0xBE, 0x03, 0xDE, 0x01, 0xFF, 0x00, 0x7F, 0x00,
|
|
||||||
0x3F, 0x80, 0x0F, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x03, 0xE0, 0x1F, 0xF0,
|
|
||||||
0x1F, 0xF0, 0x0F, 0xF0, 0x03, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0x03, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF8, 0x1F, 0xC0, 0xFE,
|
|
||||||
0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03,
|
|
||||||
0xE1, 0xFC, 0x3F, 0x8F, 0xF1, 0xF8, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03,
|
|
||||||
0xE0, 0x7C, 0x0F, 0x83, 0xF1, 0xFC, 0x3F, 0x87, 0xE0, 0xFE, 0x07, 0xE0,
|
|
||||||
0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xF0, 0x7F,
|
|
||||||
0x87, 0xF0, 0x7E, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x83, 0xF8,
|
|
||||||
0x7F, 0x83, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F,
|
|
||||||
0x81, 0xF8, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE3, 0xF0, 0x7C, 0x0F, 0x81,
|
|
||||||
0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x07, 0xE3, 0xFC, 0x7F, 0x0F, 0xE1,
|
|
||||||
0xF0, 0x00, 0x1E, 0x06, 0x3F, 0x8F, 0x7F, 0xFF, 0xFF, 0xFE, 0xF1, 0xFC,
|
|
||||||
0x60, 0x78 };
|
|
||||||
|
|
||||||
const GFXglyph Ubuntu_Bold16pt7bGlyphs[] PROGMEM = {
|
|
||||||
{ 0, 0, 0, 7, 0, 1 }, // 0x20 ' '
|
|
||||||
{ 0, 5, 21, 9, 2, -20 }, // 0x21 '!'
|
|
||||||
{ 14, 12, 9, 14, 2, -23 }, // 0x22 '"'
|
|
||||||
{ 28, 18, 21, 22, 2, -20 }, // 0x23 '#'
|
|
||||||
{ 76, 16, 28, 18, 1, -23 }, // 0x24 '$'
|
|
||||||
{ 132, 26, 21, 28, 1, -20 }, // 0x25 '%'
|
|
||||||
{ 201, 21, 21, 22, 1, -20 }, // 0x26 '&'
|
|
||||||
{ 257, 5, 9, 9, 2, -23 }, // 0x27 '''
|
|
||||||
{ 263, 9, 30, 11, 2, -23 }, // 0x28 '('
|
|
||||||
{ 297, 9, 30, 11, 0, -23 }, // 0x29 ')'
|
|
||||||
{ 331, 13, 12, 16, 2, -20 }, // 0x2A '*'
|
|
||||||
{ 351, 14, 14, 18, 2, -15 }, // 0x2B '+'
|
|
||||||
{ 376, 6, 10, 8, 1, -4 }, // 0x2C ','
|
|
||||||
{ 384, 9, 4, 11, 1, -10 }, // 0x2D '-'
|
|
||||||
{ 389, 6, 6, 8, 1, -5 }, // 0x2E '.'
|
|
||||||
{ 394, 15, 30, 14, -1, -23 }, // 0x2F '/'
|
|
||||||
{ 451, 16, 21, 18, 1, -20 }, // 0x30 '0'
|
|
||||||
{ 493, 10, 21, 18, 3, -20 }, // 0x31 '1'
|
|
||||||
{ 520, 15, 21, 18, 1, -20 }, // 0x32 '2'
|
|
||||||
{ 560, 15, 21, 18, 1, -20 }, // 0x33 '3'
|
|
||||||
{ 600, 16, 21, 18, 1, -20 }, // 0x34 '4'
|
|
||||||
{ 642, 15, 21, 18, 1, -20 }, // 0x35 '5'
|
|
||||||
{ 682, 16, 21, 18, 1, -20 }, // 0x36 '6'
|
|
||||||
{ 724, 16, 21, 18, 1, -20 }, // 0x37 '7'
|
|
||||||
{ 766, 16, 21, 18, 1, -20 }, // 0x38 '8'
|
|
||||||
{ 808, 16, 21, 18, 1, -20 }, // 0x39 '9'
|
|
||||||
{ 850, 6, 17, 8, 1, -16 }, // 0x3A ':'
|
|
||||||
{ 863, 6, 22, 8, 1, -16 }, // 0x3B ';'
|
|
||||||
{ 880, 15, 15, 18, 1, -16 }, // 0x3C '<'
|
|
||||||
{ 909, 15, 11, 18, 1, -14 }, // 0x3D '='
|
|
||||||
{ 930, 14, 15, 18, 2, -16 }, // 0x3E '>'
|
|
||||||
{ 957, 12, 24, 14, 1, -23 }, // 0x3F '?'
|
|
||||||
{ 993, 26, 27, 30, 2, -21 }, // 0x40 '@'
|
|
||||||
{ 1081, 21, 21, 21, 0, -20 }, // 0x41 'A'
|
|
||||||
{ 1137, 17, 21, 21, 2, -20 }, // 0x42 'B'
|
|
||||||
{ 1182, 17, 21, 20, 2, -20 }, // 0x43 'C'
|
|
||||||
{ 1227, 19, 21, 23, 2, -20 }, // 0x44 'D'
|
|
||||||
{ 1277, 16, 21, 19, 2, -20 }, // 0x45 'E'
|
|
||||||
{ 1319, 15, 21, 18, 2, -20 }, // 0x46 'F'
|
|
||||||
{ 1359, 18, 21, 22, 2, -20 }, // 0x47 'G'
|
|
||||||
{ 1407, 19, 21, 23, 2, -20 }, // 0x48 'H'
|
|
||||||
{ 1457, 5, 21, 9, 2, -20 }, // 0x49 'I'
|
|
||||||
{ 1471, 14, 21, 16, 0, -20 }, // 0x4A 'J'
|
|
||||||
{ 1508, 19, 21, 21, 2, -20 }, // 0x4B 'K'
|
|
||||||
{ 1558, 14, 21, 17, 2, -20 }, // 0x4C 'L'
|
|
||||||
{ 1595, 24, 21, 28, 2, -20 }, // 0x4D 'M'
|
|
||||||
{ 1658, 19, 21, 23, 2, -20 }, // 0x4E 'N'
|
|
||||||
{ 1708, 20, 21, 24, 2, -20 }, // 0x4F 'O'
|
|
||||||
{ 1761, 17, 21, 20, 2, -20 }, // 0x50 'P'
|
|
||||||
{ 1806, 20, 27, 24, 2, -20 }, // 0x51 'Q'
|
|
||||||
{ 1874, 18, 21, 21, 2, -20 }, // 0x52 'R'
|
|
||||||
{ 1922, 16, 21, 18, 1, -20 }, // 0x53 'S'
|
|
||||||
{ 1964, 17, 21, 19, 1, -20 }, // 0x54 'T'
|
|
||||||
{ 2009, 18, 21, 22, 2, -20 }, // 0x55 'U'
|
|
||||||
{ 2057, 21, 21, 21, 0, -20 }, // 0x56 'V'
|
|
||||||
{ 2113, 29, 21, 31, 1, -20 }, // 0x57 'W'
|
|
||||||
{ 2190, 21, 21, 21, 0, -20 }, // 0x58 'X'
|
|
||||||
{ 2246, 21, 21, 21, 0, -20 }, // 0x59 'Y'
|
|
||||||
{ 2302, 17, 21, 19, 1, -20 }, // 0x5A 'Z'
|
|
||||||
{ 2347, 10, 30, 12, 2, -23 }, // 0x5B '['
|
|
||||||
{ 2385, 15, 30, 14, -1, -23 }, // 0x5C '\'
|
|
||||||
{ 2442, 10, 30, 12, 0, -23 }, // 0x5D ']'
|
|
||||||
{ 2480, 17, 13, 19, 1, -21 }, // 0x5E '^'
|
|
||||||
{ 2508, 16, 4, 16, 0, 3 }, // 0x5F '_'
|
|
||||||
{ 2516, 7, 7, 9, 1, -24 }, // 0x60 '`'
|
|
||||||
{ 2523, 14, 16, 17, 1, -15 }, // 0x61 'a'
|
|
||||||
{ 2551, 16, 24, 19, 2, -23 }, // 0x62 'b'
|
|
||||||
{ 2599, 14, 16, 16, 1, -15 }, // 0x63 'c'
|
|
||||||
{ 2627, 16, 24, 19, 1, -23 }, // 0x64 'd'
|
|
||||||
{ 2675, 16, 16, 18, 1, -15 }, // 0x65 'e'
|
|
||||||
{ 2707, 12, 24, 14, 2, -23 }, // 0x66 'f'
|
|
||||||
{ 2743, 15, 22, 18, 1, -15 }, // 0x67 'g'
|
|
||||||
{ 2785, 14, 24, 18, 2, -23 }, // 0x68 'h'
|
|
||||||
{ 2827, 5, 24, 9, 2, -23 }, // 0x69 'i'
|
|
||||||
{ 2842, 9, 30, 9, -2, -23 }, // 0x6A 'j'
|
|
||||||
{ 2876, 15, 24, 18, 2, -23 }, // 0x6B 'k'
|
|
||||||
{ 2921, 8, 24, 10, 2, -23 }, // 0x6C 'l'
|
|
||||||
{ 2945, 23, 16, 27, 2, -15 }, // 0x6D 'm'
|
|
||||||
{ 2991, 14, 16, 18, 2, -15 }, // 0x6E 'n'
|
|
||||||
{ 3019, 17, 16, 19, 1, -15 }, // 0x6F 'o'
|
|
||||||
{ 3053, 16, 22, 19, 2, -15 }, // 0x70 'p'
|
|
||||||
{ 3097, 17, 22, 19, 1, -15 }, // 0x71 'q'
|
|
||||||
{ 3144, 11, 16, 13, 2, -15 }, // 0x72 'r'
|
|
||||||
{ 3166, 13, 16, 15, 1, -15 }, // 0x73 's'
|
|
||||||
{ 3192, 12, 21, 15, 2, -20 }, // 0x74 't'
|
|
||||||
{ 3224, 14, 16, 18, 2, -15 }, // 0x75 'u'
|
|
||||||
{ 3252, 17, 16, 17, 0, -15 }, // 0x76 'v'
|
|
||||||
{ 3286, 24, 16, 24, 0, -15 }, // 0x77 'w'
|
|
||||||
{ 3334, 17, 16, 17, 0, -15 }, // 0x78 'x'
|
|
||||||
{ 3368, 17, 22, 17, 0, -15 }, // 0x79 'y'
|
|
||||||
{ 3415, 14, 16, 16, 1, -15 }, // 0x7A 'z'
|
|
||||||
{ 3443, 11, 30, 12, 1, -23 }, // 0x7B '{'
|
|
||||||
{ 3485, 4, 30, 10, 3, -23 }, // 0x7C '|'
|
|
||||||
{ 3500, 11, 30, 12, 0, -23 }, // 0x7D '}'
|
|
||||||
{ 3542, 16, 6, 18, 1, -11 } }; // 0x7E '~'
|
|
||||||
|
|
||||||
const GFXfont Ubuntu_Bold16pt7b PROGMEM = {
|
|
||||||
(uint8_t *)Ubuntu_Bold16pt7bBitmaps,
|
|
||||||
(GFXglyph *)Ubuntu_Bold16pt7bGlyphs,
|
|
||||||
0x20, 0x7E, 36 };
|
|
||||||
|
|
||||||
// Approx. 4226 bytes
|
|
||||||
@@ -1,578 +0,0 @@
|
|||||||
const uint8_t Ubuntu_Bold20pt7bBitmaps[] PROGMEM = {
|
|
||||||
0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E,
|
|
||||||
0x7E, 0x7E, 0x7E, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF,
|
|
||||||
0xFF, 0x7E, 0x3C, 0xFC, 0x7F, 0xF8, 0xFF, 0xF1, 0xFF, 0xE3, 0xFF, 0xC7,
|
|
||||||
0xFF, 0x8F, 0xFF, 0x1F, 0xFE, 0x3F, 0xF8, 0x7C, 0xF0, 0x79, 0xE0, 0xF0,
|
|
||||||
0x01, 0xF9, 0xF8, 0x03, 0xF3, 0xF0, 0x07, 0xEF, 0xE0, 0x1F, 0x9F, 0x80,
|
|
||||||
0x3F, 0x3F, 0x00, 0x7E, 0x7E, 0x00, 0xFC, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0x3F, 0x00, 0x7E,
|
|
||||||
0x7E, 0x01, 0xFD, 0xFC, 0x03, 0xF3, 0xF0, 0x07, 0xE7, 0xE0, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF9, 0xF8,
|
|
||||||
0x03, 0xF3, 0xF0, 0x07, 0xE7, 0xE0, 0x0F, 0xCF, 0xC0, 0x3F, 0xBF, 0x00,
|
|
||||||
0x7E, 0x7E, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03,
|
|
||||||
0xE0, 0x00, 0x7C, 0x00, 0x1F, 0xF0, 0x1F, 0xFF, 0x87, 0xFF, 0xF1, 0xFF,
|
|
||||||
0xFE, 0x3F, 0xFF, 0x8F, 0xE0, 0x71, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xF0,
|
|
||||||
0x00, 0xFF, 0x80, 0x1F, 0xFE, 0x01, 0xFF, 0xF0, 0x1F, 0xFF, 0x81, 0xFF,
|
|
||||||
0xF8, 0x0F, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0xFE, 0x00, 0x0F, 0xC0, 0x01,
|
|
||||||
0xF8, 0x00, 0x3F, 0x78, 0x0F, 0xEF, 0xFF, 0xF9, 0xFF, 0xFF, 0x7F, 0xFF,
|
|
||||||
0xC7, 0xFF, 0xF0, 0x1F, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8,
|
|
||||||
0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x0F, 0xF8,
|
|
||||||
0x01, 0xF8, 0x07, 0xFF, 0x00, 0x7E, 0x01, 0xFF, 0xC0, 0x3F, 0x00, 0xF8,
|
|
||||||
0xF8, 0x0F, 0x80, 0x3C, 0x1E, 0x07, 0xE0, 0x0F, 0x07, 0x83, 0xF0, 0x03,
|
|
||||||
0xC1, 0xE0, 0xF8, 0x00, 0xF0, 0x78, 0x7E, 0x00, 0x3C, 0x1E, 0x1F, 0x00,
|
|
||||||
0x0F, 0x07, 0x8F, 0xC0, 0x03, 0xE3, 0xE7, 0xE1, 0xF0, 0x7F, 0xF1, 0xF1,
|
|
||||||
0xFF, 0x1F, 0xFC, 0xFC, 0xFF, 0xE3, 0xFE, 0x3E, 0x3F, 0xF8, 0x3E, 0x1F,
|
|
||||||
0x9F, 0x1F, 0x00, 0x0F, 0xC7, 0x83, 0xC0, 0x03, 0xE1, 0xE0, 0xF0, 0x01,
|
|
||||||
0xF8, 0x78, 0x3C, 0x00, 0x7C, 0x1E, 0x0F, 0x00, 0x3F, 0x07, 0x83, 0xC0,
|
|
||||||
0x1F, 0x81, 0xE0, 0xF0, 0x07, 0xC0, 0x7C, 0x7C, 0x03, 0xF0, 0x0F, 0xFE,
|
|
||||||
0x01, 0xF8, 0x03, 0xFF, 0x80, 0x7E, 0x00, 0x7F, 0xC0, 0x3F, 0x00, 0x07,
|
|
||||||
0xC0, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x07,
|
|
||||||
0xFF, 0xF0, 0x01, 0xFF, 0xFE, 0x00, 0x3F, 0x8F, 0xC0, 0x07, 0xE1, 0xF8,
|
|
||||||
0x00, 0xFC, 0x3F, 0x00, 0x1F, 0xCF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F,
|
|
||||||
0xFE, 0x00, 0x03, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x3F, 0xFC, 0x3E,
|
|
||||||
0x0F, 0xFF, 0xC7, 0xE3, 0xFB, 0xFC, 0xFC, 0x7E, 0x3F, 0xFF, 0x1F, 0x83,
|
|
||||||
0xFF, 0xE3, 0xF0, 0x3F, 0xF8, 0x7E, 0x07, 0xFF, 0x0F, 0xC0, 0x7F, 0xC1,
|
|
||||||
0xFE, 0x07, 0xFC, 0x1F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF,
|
|
||||||
0xFF, 0x83, 0xFF, 0xF7, 0xF8, 0x0F, 0xF0, 0x7F, 0x80, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xF9, 0xE7, 0x80, 0x01, 0x00, 0x70, 0x1F, 0x87, 0xE0,
|
|
||||||
0xFC, 0x3F, 0x07, 0xE1, 0xF8, 0x3F, 0x07, 0xE1, 0xF8, 0x3F, 0x07, 0xE1,
|
|
||||||
0xFC, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8,
|
|
||||||
0x3F, 0x07, 0xE0, 0xFC, 0x0F, 0xC1, 0xF8, 0x3F, 0x03, 0xF0, 0x7E, 0x0F,
|
|
||||||
0xC0, 0xFC, 0x1F, 0x81, 0xF8, 0x3F, 0x03, 0xF0, 0x38, 0x02, 0x00, 0x10,
|
|
||||||
0x07, 0x03, 0xF0, 0x3F, 0x07, 0xE0, 0x7E, 0x0F, 0xC0, 0xFC, 0x1F, 0x83,
|
|
||||||
0xF0, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x81, 0xF8, 0x3F, 0x07, 0xE0, 0xFC,
|
|
||||||
0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x0F, 0xE1, 0xF8, 0x3F,
|
|
||||||
0x07, 0xE1, 0xF8, 0x3F, 0x07, 0xE1, 0xF8, 0x3F, 0x0F, 0xC1, 0xF8, 0x7E,
|
|
||||||
0x03, 0x80, 0x20, 0x00, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x0C, 0x7C,
|
|
||||||
0x67, 0x9C, 0xF3, 0xEE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0x03,
|
|
||||||
0xF8, 0x03, 0xDE, 0x03, 0xEF, 0x83, 0xF7, 0xE0, 0xF1, 0xE0, 0x38, 0xE0,
|
|
||||||
0x08, 0x20, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00,
|
|
||||||
0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0x00, 0x03, 0xE0, 0x00,
|
|
||||||
0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00,
|
|
||||||
0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7E, 0x7E, 0x7E, 0x7C, 0xFC, 0x18,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x38, 0xFB, 0xFF, 0xFF, 0xEF,
|
|
||||||
0x8E, 0x00, 0x00, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x00, 0x07, 0xE0,
|
|
||||||
0x01, 0xFC, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x00,
|
|
||||||
0x07, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00,
|
|
||||||
0x3F, 0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01,
|
|
||||||
0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07,
|
|
||||||
0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x3F,
|
|
||||||
0x00, 0x0F, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xF8,
|
|
||||||
0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00,
|
|
||||||
0x7F, 0xE0, 0x0F, 0xFF, 0x01, 0xFF, 0xF8, 0x3F, 0xFF, 0xC3, 0xF0, 0xFE,
|
|
||||||
0x7E, 0x07, 0xE7, 0xE0, 0x7E, 0xFE, 0x07, 0xEF, 0xC0, 0x3F, 0xFC, 0x03,
|
|
||||||
0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0,
|
|
||||||
0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x07, 0xF7, 0xE0, 0x7E, 0x7E,
|
|
||||||
0x07, 0xE7, 0xF0, 0xFE, 0x3F, 0xFF, 0xC1, 0xFF, 0xF8, 0x1F, 0xFF, 0x00,
|
|
||||||
0x7F, 0xE0, 0x01, 0xF8, 0x00, 0x00, 0xF8, 0x0F, 0xC0, 0xFE, 0x0F, 0xF1,
|
|
||||||
0xFF, 0xBF, 0xFF, 0xFF, 0xEF, 0xBF, 0x79, 0xF9, 0x0F, 0xC0, 0x7E, 0x03,
|
|
||||||
0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E,
|
|
||||||
0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0,
|
|
||||||
0x7E, 0x07, 0xF8, 0x03, 0xFF, 0xC1, 0xFF, 0xFC, 0x7F, 0xFF, 0xC7, 0xFF,
|
|
||||||
0xFC, 0xF8, 0x3F, 0x8C, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01,
|
|
||||||
0xF8, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xFE, 0x00, 0x7F,
|
|
||||||
0x80, 0x1F, 0xE0, 0x07, 0xF8, 0x01, 0xFE, 0x00, 0x7F, 0x80, 0x0F, 0xE0,
|
|
||||||
0x03, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0xFF, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF,
|
|
||||||
0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x80, 0x07, 0xF0, 0x07, 0xFF, 0xC3, 0xFF,
|
|
||||||
0xFC, 0x3F, 0xFF, 0xC7, 0xFF, 0xF8, 0x70, 0x3F, 0x88, 0x03, 0xF0, 0x00,
|
|
||||||
0x7E, 0x00, 0x0F, 0xC0, 0x07, 0xF8, 0x3F, 0xFE, 0x07, 0xFF, 0x80, 0xFF,
|
|
||||||
0xE0, 0x1F, 0xFE, 0x03, 0xFF, 0xF0, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x00,
|
|
||||||
0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0xFE, 0xE0, 0x3F, 0xDF, 0xFF,
|
|
||||||
0xF7, 0xFF, 0xFE, 0xFF, 0xFF, 0x9F, 0xFF, 0xC0, 0x3F, 0xC0, 0x00, 0x00,
|
|
||||||
0x1F, 0x80, 0x03, 0xF8, 0x00, 0x7F, 0x80, 0x0F, 0xF8, 0x01, 0xFF, 0x80,
|
|
||||||
0x1F, 0xF8, 0x03, 0xFF, 0x80, 0x7F, 0xF8, 0x07, 0xDF, 0x80, 0xF9, 0xF8,
|
|
||||||
0x1F, 0x9F, 0x81, 0xF1, 0xF8, 0x3E, 0x1F, 0x83, 0xE1, 0xF8, 0x7C, 0x1F,
|
|
||||||
0x8F, 0xC1, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00,
|
|
||||||
0x1F, 0x80, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x1F, 0xFF, 0xC3, 0xFF, 0xF8,
|
|
||||||
0x7F, 0xFF, 0x0F, 0xFF, 0xE1, 0xFF, 0xFC, 0x3E, 0x00, 0x07, 0xC0, 0x00,
|
|
||||||
0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFF, 0x80, 0x1F, 0xFE, 0x03,
|
|
||||||
0xFF, 0xF0, 0x7F, 0xFF, 0x0F, 0xFF, 0xF0, 0x03, 0xFE, 0x00, 0x0F, 0xE0,
|
|
||||||
0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0xFE, 0xC0, 0x3F, 0xDF,
|
|
||||||
0xFF, 0xF7, 0xFF, 0xFC, 0xFF, 0xFF, 0x1F, 0xFF, 0xC0, 0x7F, 0xC0, 0x00,
|
|
||||||
0x00, 0x07, 0xC0, 0x07, 0xFC, 0x01, 0xFF, 0xC0, 0x3F, 0xFC, 0x0F, 0xFF,
|
|
||||||
0xC1, 0xFF, 0xC0, 0x1F, 0xE0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x07, 0xE0,
|
|
||||||
0x00, 0x7F, 0xFC, 0x0F, 0xFF, 0xF8, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0xFF,
|
|
||||||
0xFF, 0xEF, 0xC0, 0xFF, 0xFC, 0x07, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF,
|
|
||||||
0xC0, 0x3F, 0x7E, 0x07, 0xF7, 0xF0, 0xFE, 0x3F, 0xFF, 0xE3, 0xFF, 0xFC,
|
|
||||||
0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0xE0, 0x03, 0xF0,
|
|
||||||
0x01, 0xFC, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x07, 0xE0, 0x01,
|
|
||||||
0xF8, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x07, 0xE0, 0x01, 0xF8,
|
|
||||||
0x00, 0x7E, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00,
|
|
||||||
0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x03, 0xF8, 0x01,
|
|
||||||
0xFF, 0xC0, 0x7F, 0xFC, 0x1F, 0xFF, 0xC3, 0xFF, 0xFC, 0xFE, 0x3F, 0x9F,
|
|
||||||
0x83, 0xF3, 0xF0, 0x7E, 0x7E, 0x0F, 0xCF, 0xE3, 0xF0, 0xFE, 0x7E, 0x0F,
|
|
||||||
0xFF, 0x80, 0xFF, 0xE0, 0x1F, 0xFE, 0x07, 0xFF, 0xE1, 0xF9, 0xFE, 0x7E,
|
|
||||||
0x0F, 0xDF, 0x80, 0xFF, 0xF0, 0x1F, 0xFE, 0x03, 0xFF, 0xC0, 0x7F, 0xFC,
|
|
||||||
0x1F, 0xDF, 0xFF, 0xF3, 0xFF, 0xFE, 0x3F, 0xFF, 0x83, 0xFF, 0xE0, 0x0F,
|
|
||||||
0xE0, 0x00, 0x03, 0xF8, 0x01, 0xFF, 0xC0, 0x7F, 0xFC, 0x1F, 0xFF, 0xC7,
|
|
||||||
0xFF, 0xF8, 0xFE, 0x3F, 0xBF, 0x83, 0xF7, 0xE0, 0x3F, 0xFC, 0x07, 0xFF,
|
|
||||||
0x80, 0xFF, 0xF0, 0x1F, 0xFF, 0x03, 0xF7, 0xFF, 0xFE, 0xFF, 0xFF, 0xCF,
|
|
||||||
0xFF, 0xF8, 0xFF, 0xFF, 0x07, 0xFF, 0xE0, 0x01, 0xF8, 0x00, 0x7F, 0x00,
|
|
||||||
0x0F, 0xC0, 0x07, 0xF8, 0x07, 0xFE, 0x0F, 0xFF, 0x81, 0xFF, 0xE0, 0x3F,
|
|
||||||
0xF8, 0x07, 0xFC, 0x00, 0xF8, 0x00, 0x00, 0x38, 0xFB, 0xFF, 0xFF, 0xEF,
|
|
||||||
0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x3E, 0xFF, 0xFF, 0xFB,
|
|
||||||
0xE3, 0x80, 0x1C, 0x3E, 0x7F, 0x7F, 0x7F, 0x3E, 0x1C, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7E, 0x7E,
|
|
||||||
0x7E, 0x7C, 0xFC, 0x18, 0x00, 0x01, 0x80, 0x01, 0xF0, 0x01, 0xFF, 0x03,
|
|
||||||
0xFF, 0xE3, 0xFF, 0xFD, 0xFF, 0xFF, 0xBF, 0xFF, 0xC7, 0xFF, 0xC0, 0xFF,
|
|
||||||
0x80, 0x1F, 0x80, 0x03, 0xFE, 0x00, 0x7F, 0xFC, 0x0F, 0xFF, 0xF1, 0xFF,
|
|
||||||
0xFF, 0x8F, 0xFF, 0xF0, 0x3F, 0xFE, 0x00, 0x7F, 0xC0, 0x01, 0xF0, 0x00,
|
|
||||||
0x06, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x30, 0x00,
|
|
||||||
0x07, 0xC0, 0x01, 0xFF, 0x00, 0x3F, 0xFE, 0x07, 0xFF, 0xF8, 0xFF, 0xFF,
|
|
||||||
0xC7, 0xFF, 0xF8, 0x1F, 0xFF, 0x00, 0x3F, 0xE0, 0x00, 0xFC, 0x00, 0xFF,
|
|
||||||
0x81, 0xFF, 0xF1, 0xFF, 0xFE, 0xFF, 0xFF, 0xDF, 0xFF, 0xE3, 0xFF, 0xE0,
|
|
||||||
0x7F, 0xC0, 0x07, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x0F, 0xE0, 0x7F, 0xF8,
|
|
||||||
0xFF, 0xFC, 0x7F, 0xFE, 0x7F, 0xFF, 0x70, 0x7F, 0x00, 0x3F, 0x00, 0x3F,
|
|
||||||
0x00, 0x3F, 0x00, 0x7E, 0x00, 0xFE, 0x01, 0xFC, 0x01, 0xF8, 0x03, 0xF8,
|
|
||||||
0x03, 0xF0, 0x07, 0xE0, 0x07, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x03, 0x80, 0x07, 0xC0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0,
|
|
||||||
0x07, 0xC0, 0x03, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xE0,
|
|
||||||
0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFF, 0xE0, 0x07, 0xFC, 0x07,
|
|
||||||
0xFC, 0x03, 0xF8, 0x00, 0x3F, 0x81, 0xFC, 0x00, 0x07, 0xF0, 0x7C, 0x00,
|
|
||||||
0x00, 0xFC, 0x3F, 0x01, 0xFC, 0x1F, 0x8F, 0x81, 0xFF, 0xC3, 0xE7, 0xC1,
|
|
||||||
0xFF, 0xF0, 0xF9, 0xF0, 0x7F, 0xFC, 0x1F, 0xFC, 0x3F, 0x1F, 0x07, 0xFE,
|
|
||||||
0x0F, 0x87, 0xC1, 0xFF, 0x87, 0xC1, 0xF0, 0x7F, 0xE1, 0xF0, 0x7C, 0x1F,
|
|
||||||
0xF8, 0x7C, 0x1F, 0x07, 0xFE, 0x1F, 0x07, 0xC1, 0xFF, 0x87, 0xC1, 0xF0,
|
|
||||||
0x7F, 0xE1, 0xF0, 0x7C, 0x3E, 0xF8, 0x7E, 0x1F, 0x0F, 0xBF, 0x0F, 0xC7,
|
|
||||||
0xC7, 0xE7, 0xC3, 0xFF, 0xFF, 0xF1, 0xF0, 0x7F, 0xFF, 0xF8, 0x7E, 0x0F,
|
|
||||||
0xFF, 0xFC, 0x0F, 0x80, 0xF8, 0xFC, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x7E,
|
|
||||||
0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x20, 0x00,
|
|
||||||
0x3F, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xC0,
|
|
||||||
0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00,
|
|
||||||
0x01, 0xFF, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0xFF,
|
|
||||||
0xC0, 0x00, 0x7E, 0xF8, 0x00, 0x0F, 0xDF, 0x80, 0x01, 0xFB, 0xF0, 0x00,
|
|
||||||
0x7E, 0x3F, 0x00, 0x0F, 0xC7, 0xE0, 0x03, 0xF8, 0xFC, 0x00, 0x7E, 0x0F,
|
|
||||||
0xC0, 0x0F, 0xC1, 0xF8, 0x03, 0xF8, 0x3F, 0x80, 0x7E, 0x03, 0xF0, 0x0F,
|
|
||||||
0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF,
|
|
||||||
0x83, 0xFF, 0xFF, 0xF8, 0x7E, 0x00, 0x3F, 0x1F, 0xC0, 0x07, 0xE3, 0xF8,
|
|
||||||
0x00, 0xFE, 0x7E, 0x00, 0x0F, 0xDF, 0xC0, 0x01, 0xFB, 0xF8, 0x00, 0x3F,
|
|
||||||
0x80, 0x7F, 0xFC, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0xCF,
|
|
||||||
0xFF, 0xFF, 0x7E, 0x03, 0xFB, 0xF0, 0x0F, 0xDF, 0x80, 0x7E, 0xFC, 0x03,
|
|
||||||
0xF7, 0xE0, 0x7F, 0x3F, 0xFF, 0xF9, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F,
|
|
||||||
0xFF, 0xF3, 0xFF, 0xFF, 0xDF, 0x80, 0xFF, 0xFC, 0x03, 0xFF, 0xE0, 0x0F,
|
|
||||||
0xFF, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0xC0, 0x3F, 0xFE, 0x03, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xDF, 0xFF, 0xFC, 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x0F, 0xFF, 0x00,
|
|
||||||
0x00, 0x3F, 0xC0, 0x07, 0xFF, 0xE0, 0x7F, 0xFF, 0xC3, 0xFF, 0xFE, 0x1F,
|
|
||||||
0xFF, 0xF8, 0xFF, 0x81, 0xE3, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x7E, 0x00,
|
|
||||||
0x03, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03,
|
|
||||||
0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8,
|
|
||||||
0x00, 0x07, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00,
|
|
||||||
0xE1, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x0F, 0xFF, 0xE0,
|
|
||||||
0x07, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xE0,
|
|
||||||
0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFC, 0x07, 0xFC, 0xFC, 0x01, 0xFC,
|
|
||||||
0xFC, 0x00, 0xFE, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x3F,
|
|
||||||
0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F,
|
|
||||||
0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7E,
|
|
||||||
0xFC, 0x00, 0xFE, 0xFC, 0x01, 0xFC, 0xFC, 0x0F, 0xFC, 0xFF, 0xFF, 0xF8,
|
|
||||||
0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0x80, 0x7F, 0xF8, 0x00,
|
|
||||||
0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF,
|
|
||||||
0xEF, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0,
|
|
||||||
0x00, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF,
|
|
||||||
0xFF, 0xCF, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F,
|
|
||||||
0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0F, 0xC0, 0x03,
|
|
||||||
0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xFF, 0xFE, 0xFF,
|
|
||||||
0xFF, 0xBF, 0xFF, 0xEF, 0xFF, 0xFB, 0xFF, 0xFE, 0xFC, 0x00, 0x3F, 0x00,
|
|
||||||
0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03,
|
|
||||||
0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x7F, 0xC0,
|
|
||||||
0x07, 0xFF, 0xE0, 0x7F, 0xFF, 0xC3, 0xFF, 0xFE, 0x1F, 0xFF, 0xF8, 0xFF,
|
|
||||||
0x81, 0xE3, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF8, 0x00,
|
|
||||||
0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x03, 0xFF,
|
|
||||||
0xC0, 0x0F, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF8, 0x03, 0xF7, 0xE0,
|
|
||||||
0x0F, 0xDF, 0xC0, 0x3F, 0x7F, 0x80, 0xFC, 0xFF, 0x03, 0xF1, 0xFF, 0xFF,
|
|
||||||
0xC3, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x07, 0xFE, 0x00,
|
|
||||||
0xFC, 0x00, 0x7F, 0xF8, 0x00, 0xFF, 0xF0, 0x01, 0xFF, 0xE0, 0x03, 0xFF,
|
|
||||||
0xC0, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x1F, 0xFE, 0x00, 0x3F, 0xFC,
|
|
||||||
0x00, 0x7F, 0xF8, 0x00, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00,
|
|
||||||
0x7F, 0xF8, 0x00, 0xFF, 0xF0, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x07,
|
|
||||||
0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x1F, 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0x7F,
|
|
||||||
0xF8, 0x00, 0xFF, 0xF0, 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F,
|
|
||||||
0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0,
|
|
||||||
0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00,
|
|
||||||
0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F,
|
|
||||||
0x00, 0x1F, 0xDE, 0x0F, 0xE7, 0xFF, 0xF9, 0xFF, 0xFE, 0xFF, 0xFF, 0x1F,
|
|
||||||
0xFF, 0x00, 0xFF, 0x00, 0xFC, 0x01, 0xFE, 0xFC, 0x03, 0xFC, 0xFC, 0x07,
|
|
||||||
0xF8, 0xFC, 0x0F, 0xF0, 0xFC, 0x1F, 0xE0, 0xFC, 0x3F, 0xC0, 0xFC, 0x7F,
|
|
||||||
0x80, 0xFC, 0xFF, 0x00, 0xFD, 0xFE, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xF8,
|
|
||||||
0x00, 0xFF, 0xF0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0xFF, 0xF8,
|
|
||||||
0x00, 0xFF, 0xFC, 0x00, 0xFD, 0xFE, 0x00, 0xFC, 0xFE, 0x00, 0xFC, 0x7F,
|
|
||||||
0x00, 0xFC, 0x3F, 0x80, 0xFC, 0x3F, 0xC0, 0xFC, 0x1F, 0xE0, 0xFC, 0x0F,
|
|
||||||
0xF0, 0xFC, 0x07, 0xF8, 0xFC, 0x03, 0xFC, 0xFC, 0x01, 0xFE, 0xFC, 0x00,
|
|
||||||
0xFF, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00,
|
|
||||||
0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F,
|
|
||||||
0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0,
|
|
||||||
0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00,
|
|
||||||
0x3F, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFC, 0x3F, 0x00, 0x01, 0xF8, 0x7F, 0x00, 0x07, 0xF0, 0xFE, 0x00,
|
|
||||||
0x0F, 0xE1, 0xFE, 0x00, 0x3F, 0xC7, 0xFC, 0x00, 0x7F, 0xCF, 0xFC, 0x01,
|
|
||||||
0xFF, 0x9F, 0xF8, 0x03, 0xFF, 0x3F, 0xF8, 0x07, 0xFE, 0x7F, 0xF0, 0x1F,
|
|
||||||
0xFC, 0xFF, 0xE0, 0x3F, 0xF9, 0xFF, 0xE0, 0xFB, 0xF3, 0xF7, 0xC1, 0xF7,
|
|
||||||
0xE7, 0xEF, 0xC7, 0xEF, 0xCF, 0xCF, 0x8F, 0x9F, 0x9F, 0x9F, 0x1F, 0x3F,
|
|
||||||
0x3E, 0x1F, 0x7C, 0x3E, 0x7C, 0x3E, 0xF8, 0x7D, 0xF8, 0x7F, 0xE0, 0xFB,
|
|
||||||
0xF0, 0x7F, 0xC1, 0xFF, 0xE0, 0xFF, 0x03, 0xFF, 0xC0, 0xFE, 0x07, 0xFF,
|
|
||||||
0x81, 0xFC, 0x0F, 0xFF, 0x01, 0xF0, 0x1F, 0xFE, 0x03, 0xE0, 0x3F, 0xFC,
|
|
||||||
0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x01, 0xF8, 0xF8,
|
|
||||||
0x00, 0x7F, 0xF8, 0x00, 0xFF, 0xF8, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF8,
|
|
||||||
0x07, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF0,
|
|
||||||
0x7F, 0xFF, 0xF0, 0xFF, 0xF7, 0xE1, 0xFF, 0xE7, 0xE3, 0xFF, 0xCF, 0xE7,
|
|
||||||
0xFF, 0x8F, 0xCF, 0xFF, 0x0F, 0xDF, 0xFE, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF,
|
|
||||||
0xF8, 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0x3F, 0xFF,
|
|
||||||
0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xF8,
|
|
||||||
0x00, 0xFF, 0xF0, 0x00, 0xF8, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xFE, 0x00,
|
|
||||||
0x1F, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xF0, 0x7F, 0xC1,
|
|
||||||
0xFF, 0x0F, 0xE0, 0x0F, 0xE3, 0xF8, 0x00, 0xFE, 0x7E, 0x00, 0x0F, 0xDF,
|
|
||||||
0xC0, 0x01, 0xFF, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00,
|
|
||||||
0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFC,
|
|
||||||
0x00, 0x07, 0xFF, 0xC0, 0x01, 0xFD, 0xF8, 0x00, 0x3F, 0x3F, 0x80, 0x0F,
|
|
||||||
0xE3, 0xF8, 0x03, 0xF8, 0x7F, 0xC1, 0xFF, 0x07, 0xFF, 0xFF, 0xC0, 0x7F,
|
|
||||||
0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0xFF, 0x00,
|
|
||||||
0x00, 0x7F, 0xF8, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0xFF,
|
|
||||||
0xFF, 0xEF, 0xC0, 0xFE, 0xFC, 0x07, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF,
|
|
||||||
0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x7F, 0xFC, 0x0F, 0xEF, 0xFF, 0xFE,
|
|
||||||
0xFF, 0xFF, 0xCF, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F, 0xFF, 0x80, 0xFC, 0x00,
|
|
||||||
0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0,
|
|
||||||
0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x3F, 0x80,
|
|
||||||
0x00, 0x3F, 0xFE, 0x00, 0x1F, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0x01, 0xFF,
|
|
||||||
0xFF, 0xF0, 0x7F, 0xC1, 0xFF, 0x0F, 0xE0, 0x0F, 0xE3, 0xF8, 0x00, 0xFE,
|
|
||||||
0x7E, 0x00, 0x0F, 0xDF, 0xC0, 0x01, 0xFB, 0xF0, 0x00, 0x1F, 0xFE, 0x00,
|
|
||||||
0x03, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF,
|
|
||||||
0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, 0xC0, 0x01, 0xFD, 0xF8, 0x00,
|
|
||||||
0x3F, 0x3F, 0x80, 0x0F, 0xE7, 0xF8, 0x03, 0xF8, 0x7F, 0xC1, 0xFF, 0x07,
|
|
||||||
0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x00, 0x7F, 0xFE,
|
|
||||||
0x00, 0x01, 0xFF, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xFC, 0x00, 0x00,
|
|
||||||
0x1F, 0xF0, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0xFF,
|
|
||||||
0x00, 0x00, 0x03, 0xE0, 0x7F, 0xF8, 0x01, 0xFF, 0xFE, 0x03, 0xFF, 0xFF,
|
|
||||||
0x07, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0x1F, 0x81, 0xFE, 0x3F, 0x00, 0xFE,
|
|
||||||
0x7E, 0x00, 0xFC, 0xFC, 0x01, 0xF9, 0xF8, 0x03, 0xF3, 0xF0, 0x0F, 0xE7,
|
|
||||||
0xE0, 0x3F, 0x8F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0x7F,
|
|
||||||
0xFF, 0x80, 0xFF, 0xFF, 0x01, 0xF8, 0xFF, 0x03, 0xF0, 0xFE, 0x07, 0xE0,
|
|
||||||
0xFE, 0x0F, 0xC0, 0xFE, 0x1F, 0x81, 0xFE, 0x3F, 0x01, 0xFC, 0x7E, 0x01,
|
|
||||||
0xFC, 0xFC, 0x03, 0xFD, 0xF8, 0x03, 0xFB, 0xF0, 0x03, 0xF8, 0x03, 0xFE,
|
|
||||||
0x00, 0xFF, 0xFC, 0x3F, 0xFF, 0xE7, 0xFF, 0xFC, 0x7F, 0xFF, 0xCF, 0xE0,
|
|
||||||
0x1C, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F,
|
|
||||||
0xC0, 0x07, 0xFF, 0x80, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x07, 0xFF, 0xC0,
|
|
||||||
0x0F, 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x3F,
|
|
||||||
0x00, 0x03, 0xF7, 0x80, 0x7F, 0x7F, 0xFF, 0xE7, 0xFF, 0xFE, 0xFF, 0xFF,
|
|
||||||
0xC7, 0xFF, 0xF8, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0xF0, 0x00, 0x0F,
|
|
||||||
0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0,
|
|
||||||
0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00,
|
|
||||||
0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F,
|
|
||||||
0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00,
|
|
||||||
0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0xFF,
|
|
||||||
0xF0, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0,
|
|
||||||
0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, 0x03,
|
|
||||||
0xFF, 0xC0, 0x0F, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, 0x03, 0xFF,
|
|
||||||
0xC0, 0x0F, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, 0x03, 0xFF, 0xC0,
|
|
||||||
0x0F, 0xFF, 0x80, 0x7F, 0x7E, 0x01, 0xF9, 0xFE, 0x1F, 0xE7, 0xFF, 0xFF,
|
|
||||||
0x8F, 0xFF, 0xFC, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x1F, 0xE0, 0x00,
|
|
||||||
0xFE, 0x00, 0x0F, 0xEF, 0xC0, 0x01, 0xF9, 0xF8, 0x00, 0x3F, 0x3F, 0x80,
|
|
||||||
0x0F, 0xE3, 0xF0, 0x01, 0xF8, 0x7E, 0x00, 0x3F, 0x07, 0xE0, 0x0F, 0xC0,
|
|
||||||
0xFC, 0x01, 0xF8, 0x1F, 0x80, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x3F, 0x01,
|
|
||||||
0xF8, 0x07, 0xE0, 0x7E, 0x00, 0x7E, 0x0F, 0xC0, 0x0F, 0xC1, 0xF8, 0x00,
|
|
||||||
0xFC, 0x7E, 0x00, 0x1F, 0x8F, 0xC0, 0x03, 0xF1, 0xF8, 0x00, 0x3F, 0x7E,
|
|
||||||
0x00, 0x07, 0xEF, 0xC0, 0x00, 0x7D, 0xF0, 0x00, 0x0F, 0xFE, 0x00, 0x01,
|
|
||||||
0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x3F, 0x80,
|
|
||||||
0x00, 0x07, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x03,
|
|
||||||
0xFF, 0xC0, 0x00, 0x00, 0x7F, 0x7E, 0x00, 0x00, 0x07, 0xE7, 0xE0, 0x1F,
|
|
||||||
0x00, 0x7E, 0x7E, 0x03, 0xF8, 0x07, 0xE7, 0xE0, 0x3F, 0x80, 0x7E, 0x7E,
|
|
||||||
0x03, 0xF8, 0x0F, 0xE3, 0xF0, 0x3F, 0xC0, 0xFC, 0x3F, 0x07, 0xFC, 0x0F,
|
|
||||||
0xC3, 0xF0, 0x7F, 0xC0, 0xFC, 0x3F, 0x07, 0xFE, 0x0F, 0xC1, 0xF8, 0x7B,
|
|
||||||
0xE1, 0xF8, 0x1F, 0x8F, 0xBE, 0x1F, 0x81, 0xF8, 0xFB, 0xF1, 0xF8, 0x1F,
|
|
||||||
0x8F, 0x9F, 0x1F, 0x80, 0xFC, 0xF1, 0xF3, 0xF0, 0x0F, 0xDF, 0x1F, 0xBF,
|
|
||||||
0x00, 0xFD, 0xF0, 0xFB, 0xF0, 0x07, 0xDF, 0x0F, 0xBE, 0x00, 0x7F, 0xE0,
|
|
||||||
0xFF, 0xE0, 0x07, 0xFE, 0x07, 0xFE, 0x00, 0x7F, 0xE0, 0x7F, 0xE0, 0x03,
|
|
||||||
0xFC, 0x07, 0xFC, 0x00, 0x3F, 0xC0, 0x3F, 0xC0, 0x03, 0xFC, 0x03, 0xFC,
|
|
||||||
0x00, 0x1F, 0xC0, 0x3F, 0x80, 0x01, 0xF8, 0x01, 0xF8, 0x00, 0xFE, 0x00,
|
|
||||||
0x1F, 0xDF, 0xC0, 0x0F, 0xE3, 0xF8, 0x07, 0xF0, 0xFF, 0x03, 0xFC, 0x1F,
|
|
||||||
0xC0, 0xFE, 0x03, 0xF8, 0x7F, 0x00, 0x7F, 0x3F, 0x80, 0x1F, 0xCF, 0xE0,
|
|
||||||
0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF,
|
|
||||||
0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x03,
|
|
||||||
0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xFF, 0x00,
|
|
||||||
0x1F, 0xCF, 0xE0, 0x0F, 0xE3, 0xF8, 0x03, 0xF8, 0x7F, 0x01, 0xFC, 0x0F,
|
|
||||||
0xE0, 0xFE, 0x01, 0xFC, 0x3F, 0x80, 0x7F, 0x1F, 0xC0, 0x0F, 0xEF, 0xE0,
|
|
||||||
0x01, 0xFC, 0xFE, 0x00, 0x1F, 0xDF, 0xC0, 0x0F, 0xE7, 0xF0, 0x03, 0xF8,
|
|
||||||
0xFE, 0x01, 0xFC, 0x3F, 0x80, 0x7F, 0x07, 0xF0, 0x3F, 0x80, 0xFC, 0x1F,
|
|
||||||
0xC0, 0x3F, 0x87, 0xF0, 0x07, 0xF3, 0xF8, 0x01, 0xFC, 0xFE, 0x00, 0x3F,
|
|
||||||
0xFF, 0x00, 0x07, 0xFF, 0x80, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xF0, 0x00,
|
|
||||||
0x0F, 0xF8, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, 0xC0,
|
|
||||||
0x00, 0x03, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F,
|
|
||||||
0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00,
|
|
||||||
0x0F, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x7F, 0xFF, 0xFD, 0xFF, 0xFF, 0xF7,
|
|
||||||
0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFC, 0x00, 0x1F, 0xE0, 0x00,
|
|
||||||
0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF8,
|
|
||||||
0x00, 0x3F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0xC0, 0x01,
|
|
||||||
0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF0,
|
|
||||||
0x00, 0x3F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0,
|
|
||||||
0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E,
|
|
||||||
0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F,
|
|
||||||
0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xC0, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x03,
|
|
||||||
0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03,
|
|
||||||
0xF0, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x01,
|
|
||||||
0xF8, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00,
|
|
||||||
0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00,
|
|
||||||
0xFC, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00,
|
|
||||||
0x7E, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00,
|
|
||||||
0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F,
|
|
||||||
0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83,
|
|
||||||
0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0,
|
|
||||||
0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xC0, 0x00, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x07, 0xFC,
|
|
||||||
0x00, 0x7F, 0xF0, 0x03, 0xFF, 0x80, 0x3F, 0x7E, 0x01, 0xFB, 0xF0, 0x1F,
|
|
||||||
0x8F, 0xC1, 0xFC, 0x7F, 0x0F, 0xC1, 0xF8, 0xFC, 0x07, 0xE7, 0xE0, 0x3F,
|
|
||||||
0x7E, 0x00, 0xFC, 0xF0, 0x07, 0x81, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x10, 0x1C, 0x1E,
|
|
||||||
0x1F, 0x83, 0xE0, 0xF8, 0x3E, 0x0E, 0x02, 0x00, 0x0F, 0xF0, 0x1F, 0xFE,
|
|
||||||
0x0F, 0xFF, 0x87, 0xFF, 0xE1, 0xFF, 0xF0, 0x81, 0xFC, 0x00, 0x7E, 0x00,
|
|
||||||
0x3F, 0x0F, 0xFF, 0x9F, 0xFF, 0xDF, 0xFF, 0xEF, 0xFF, 0xFF, 0xE1, 0xFF,
|
|
||||||
0xE0, 0xFF, 0xF0, 0x7F, 0xFC, 0x3F, 0xFF, 0xFF, 0xBF, 0xFF, 0xDF, 0xFF,
|
|
||||||
0xE7, 0xFF, 0xF0, 0xFF, 0xC0, 0x1C, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00,
|
|
||||||
0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00,
|
|
||||||
0xFC, 0x00, 0x1F, 0xBF, 0x03, 0xFF, 0xF8, 0x7F, 0xFF, 0x8F, 0xFF, 0xF9,
|
|
||||||
0xFF, 0xFF, 0xBF, 0x87, 0xF7, 0xE0, 0x7F, 0xFC, 0x07, 0xFF, 0x80, 0xFF,
|
|
||||||
0xF0, 0x1F, 0xFE, 0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF, 0x03, 0xFF,
|
|
||||||
0xE0, 0x7E, 0xFC, 0x1F, 0xDF, 0xFF, 0xF3, 0xFF, 0xFE, 0x7F, 0xFF, 0x8F,
|
|
||||||
0xFF, 0xC0, 0x3F, 0xE0, 0x00, 0x01, 0xFE, 0x03, 0xFF, 0xC3, 0xFF, 0xE3,
|
|
||||||
0xFF, 0xE3, 0xFF, 0xF3, 0xFC, 0x09, 0xF8, 0x01, 0xFC, 0x00, 0xFC, 0x00,
|
|
||||||
0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xF0, 0x01, 0xF8,
|
|
||||||
0x00, 0xFF, 0x02, 0x7F, 0xFF, 0x1F, 0xFF, 0xC7, 0xFF, 0xE1, 0xFF, 0xF0,
|
|
||||||
0x1F, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0,
|
|
||||||
0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0,
|
|
||||||
0x7E, 0xFC, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, 0xFF, 0xFE, 0xFF, 0xFF, 0xDF,
|
|
||||||
0xC3, 0xFB, 0xF0, 0x3F, 0xFC, 0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x1F, 0xFE,
|
|
||||||
0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF, 0x81, 0xFB, 0xF0, 0x3F, 0x7F,
|
|
||||||
0x07, 0xEF, 0xFF, 0xFC, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0xFF, 0xFE, 0x03,
|
|
||||||
0xFE, 0x00, 0x01, 0xF8, 0x01, 0xFF, 0xC0, 0x7F, 0xFC, 0x1F, 0xFF, 0xC3,
|
|
||||||
0xFF, 0xFC, 0xFE, 0x1F, 0x9F, 0x81, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x01, 0xF8, 0x00, 0x1F,
|
|
||||||
0x80, 0x03, 0xFC, 0x04, 0x7F, 0xFF, 0x87, 0xFF, 0xF8, 0x7F, 0xFF, 0x07,
|
|
||||||
0xFF, 0xE0, 0x1F, 0xE0, 0x07, 0xF0, 0x7F, 0xF3, 0xFF, 0xDF, 0xFE, 0x7F,
|
|
||||||
0xFB, 0xF8, 0x2F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xFF, 0xEF, 0xFF, 0xBF,
|
|
||||||
0xFE, 0xFF, 0xFB, 0xFF, 0xEF, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F,
|
|
||||||
0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03,
|
|
||||||
0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x00, 0x03, 0xFE, 0x03,
|
|
||||||
0xFF, 0xF1, 0xFF, 0xFC, 0xFF, 0xFF, 0x7F, 0xFF, 0xDF, 0xC3, 0xFF, 0xE0,
|
|
||||||
0xFF, 0xF0, 0x3F, 0xFC, 0x0F, 0xFF, 0x03, 0xFF, 0xC0, 0xFF, 0xF0, 0x3F,
|
|
||||||
0xFE, 0x0F, 0xFF, 0x87, 0xF7, 0xFF, 0xFD, 0xFF, 0xFF, 0x3F, 0xFF, 0xC7,
|
|
||||||
0xFF, 0xF0, 0x7E, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x07, 0xF3, 0x03,
|
|
||||||
0xF8, 0xFF, 0xFE, 0x7F, 0xFF, 0x1F, 0xFF, 0xC7, 0xFF, 0xC0, 0x3F, 0xC0,
|
|
||||||
0x1C, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0,
|
|
||||||
0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7F, 0xF8, 0x3F, 0xFF, 0x1F,
|
|
||||||
0xFF, 0xCF, 0xFF, 0xF7, 0xFF, 0xFB, 0xF0, 0xFF, 0xF8, 0x3F, 0xFC, 0x1F,
|
|
||||||
0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0x83, 0xFF, 0xC1, 0xFF, 0xE0, 0xFF, 0xF0,
|
|
||||||
0x7F, 0xF8, 0x3F, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0x83, 0xFF,
|
|
||||||
0xC1, 0xFF, 0xE0, 0xFC, 0x3C, 0x7E, 0x7E, 0xFF, 0x7E, 0x7E, 0x3C, 0x00,
|
|
||||||
0x00, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E,
|
|
||||||
0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x01, 0xE0,
|
|
||||||
0x1F, 0x80, 0xFC, 0x0F, 0xF0, 0x3F, 0x01, 0xF8, 0x07, 0x80, 0x00, 0x00,
|
|
||||||
0x00, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E,
|
|
||||||
0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0,
|
|
||||||
0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F,
|
|
||||||
0xC0, 0xFE, 0x7F, 0xE3, 0xFF, 0x3F, 0xF1, 0xFF, 0x0F, 0xE0, 0x00, 0x1C,
|
|
||||||
0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8,
|
|
||||||
0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x83, 0xFF, 0xF0,
|
|
||||||
0xFF, 0x7E, 0x3F, 0xCF, 0xC7, 0xF1, 0xF9, 0xFC, 0x3F, 0x7F, 0x87, 0xFF,
|
|
||||||
0xE0, 0xFF, 0xF8, 0x1F, 0xFE, 0x03, 0xFF, 0x80, 0x7F, 0xF8, 0x0F, 0xFF,
|
|
||||||
0x81, 0xFF, 0xF8, 0x3F, 0x7F, 0x07, 0xE7, 0xF0, 0xFC, 0x7F, 0x1F, 0x8F,
|
|
||||||
0xE3, 0xF0, 0xFE, 0x7E, 0x1F, 0xEF, 0xC1, 0xFD, 0xF8, 0x1F, 0xC0, 0x1C,
|
|
||||||
0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F,
|
|
||||||
0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3,
|
|
||||||
0xF1, 0xF8, 0xFE, 0x7F, 0xDF, 0xEF, 0xF3, 0xF0, 0x78, 0x1F, 0xF0, 0x7E,
|
|
||||||
0x0F, 0xFF, 0xDF, 0xF8, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFE, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xEF, 0xC3, 0xF8, 0x7F, 0xFC, 0x3F, 0x87, 0xFF, 0xC1, 0xF8,
|
|
||||||
0x3F, 0xFC, 0x1F, 0x83, 0xFF, 0xC1, 0xF8, 0x3F, 0xFC, 0x1F, 0x83, 0xFF,
|
|
||||||
0xC1, 0xF8, 0x3F, 0xFC, 0x1F, 0x83, 0xFF, 0xC1, 0xF8, 0x3F, 0xFC, 0x1F,
|
|
||||||
0x83, 0xFF, 0xC1, 0xF8, 0x3F, 0xFC, 0x1F, 0x83, 0xFF, 0xC1, 0xF8, 0x3F,
|
|
||||||
0xFC, 0x1F, 0x83, 0xFF, 0xC1, 0xF8, 0x3F, 0xFC, 0x1F, 0x83, 0xF0, 0x1F,
|
|
||||||
0xF0, 0x7F, 0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF, 0xFF, 0xF7, 0xE1, 0xFF,
|
|
||||||
0xF0, 0x7F, 0xF8, 0x3F, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0x83,
|
|
||||||
0xFF, 0xC1, 0xFF, 0xE0, 0xFF, 0xF0, 0x7F, 0xF8, 0x3F, 0xFC, 0x1F, 0xFE,
|
|
||||||
0x0F, 0xFF, 0x07, 0xFF, 0x83, 0xFF, 0xC1, 0xF8, 0x01, 0xF8, 0x00, 0x7F,
|
|
||||||
0xE0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x3F, 0xFF, 0xC7, 0xF0, 0xFE, 0x7E,
|
|
||||||
0x07, 0xEF, 0xE0, 0x7F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF,
|
|
||||||
0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x7F, 0x7E, 0x07, 0xE7, 0xF0, 0xFE,
|
|
||||||
0x3F, 0xFF, 0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xF8,
|
|
||||||
0x00, 0x1F, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0xFF, 0xCF, 0xFF,
|
|
||||||
0xF9, 0xF8, 0x3F, 0xBF, 0x03, 0xF7, 0xE0, 0x7F, 0xFC, 0x07, 0xFF, 0x80,
|
|
||||||
0xFF, 0xF0, 0x1F, 0xFE, 0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF, 0x03,
|
|
||||||
0xFF, 0xF0, 0xFE, 0xFF, 0xFF, 0xDF, 0xFF, 0xF3, 0xFF, 0xFC, 0x7F, 0xFF,
|
|
||||||
0x0F, 0xDF, 0x81, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00,
|
|
||||||
0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x7F,
|
|
||||||
0xFF, 0x1F, 0xFF, 0xF3, 0xFF, 0xFF, 0x3F, 0xFF, 0xF7, 0xF8, 0x3F, 0x7E,
|
|
||||||
0x03, 0xFF, 0xE0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF,
|
|
||||||
0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFE, 0x03, 0xF7, 0xF0, 0x7F,
|
|
||||||
0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x03, 0xFB,
|
|
||||||
0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00,
|
|
||||||
0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x0F, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFE, 0xFF, 0xFB, 0xF0, 0x2F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F,
|
|
||||||
0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03,
|
|
||||||
0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x00, 0x07, 0xF8, 0x0F, 0xFE, 0x3F,
|
|
||||||
0xFE, 0x3F, 0xFE, 0x7F, 0xFC, 0x7E, 0x04, 0x7E, 0x00, 0x7F, 0x00, 0x7F,
|
|
||||||
0xF8, 0x7F, 0xFE, 0x3F, 0xFE, 0x1F, 0xFF, 0x07, 0xFF, 0x00, 0x7F, 0x00,
|
|
||||||
0x3F, 0x70, 0x3F, 0x7F, 0xFF, 0x7F, 0xFE, 0x7F, 0xFE, 0xFF, 0xF8, 0x1F,
|
|
||||||
0xE0, 0x1C, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F,
|
|
||||||
0xFF, 0xBF, 0xFE, 0xFF, 0xFB, 0xFF, 0xEF, 0xFF, 0xBF, 0x00, 0xFC, 0x03,
|
|
||||||
0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00,
|
|
||||||
0xFC, 0x03, 0xF8, 0x27, 0xFF, 0x9F, 0xFE, 0x3F, 0xFC, 0x7F, 0xF0, 0x7F,
|
|
||||||
0x00, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0x83, 0xFF, 0xC1, 0xFF,
|
|
||||||
0xE0, 0xFF, 0xF0, 0x7F, 0xF8, 0x3F, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07,
|
|
||||||
0xFF, 0x83, 0xFF, 0xC1, 0xFF, 0xE0, 0xFF, 0xF0, 0x7F, 0xFC, 0x3F, 0x7F,
|
|
||||||
0xFF, 0xBF, 0xFF, 0xCF, 0xFF, 0xE3, 0xFF, 0xF0, 0x7F, 0xC0, 0xFC, 0x01,
|
|
||||||
0xFF, 0xF0, 0x1F, 0xDF, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xF0, 0x7F, 0x1F,
|
|
||||||
0x83, 0xF0, 0xFC, 0x1F, 0x87, 0xE0, 0xFC, 0x3F, 0x8F, 0xC0, 0xFC, 0x7E,
|
|
||||||
0x07, 0xE3, 0xF0, 0x3F, 0xBF, 0x00, 0xFD, 0xF8, 0x07, 0xEF, 0xC0, 0x1F,
|
|
||||||
0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x80,
|
|
||||||
0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFC, 0x0F, 0x80, 0xFF, 0xF0, 0x3E,
|
|
||||||
0x03, 0xF7, 0xE0, 0xF8, 0x1F, 0x9F, 0x83, 0xF0, 0x7E, 0x7E, 0x0F, 0xC1,
|
|
||||||
0xF8, 0xF8, 0x7F, 0x07, 0xC3, 0xF1, 0xFC, 0x3F, 0x0F, 0xC7, 0xF8, 0xFC,
|
|
||||||
0x1F, 0x1F, 0xE3, 0xE0, 0x7C, 0xF7, 0x8F, 0x81, 0xFB, 0xDF, 0x7E, 0x07,
|
|
||||||
0xEF, 0x7D, 0xF0, 0x0F, 0xBC, 0xF7, 0xC0, 0x3E, 0xE3, 0xDF, 0x00, 0xFF,
|
|
||||||
0x8F, 0xF8, 0x01, 0xFE, 0x1F, 0xE0, 0x07, 0xF8, 0x7F, 0x80, 0x0F, 0xC1,
|
|
||||||
0xFC, 0x00, 0x3F, 0x03, 0xF0, 0x00, 0xFC, 0x0F, 0xC0, 0x01, 0xF0, 0x3E,
|
|
||||||
0x00, 0xFF, 0x03, 0xFD, 0xFC, 0x0F, 0xE3, 0xF8, 0x7F, 0x0F, 0xF3, 0xFC,
|
|
||||||
0x1F, 0xCF, 0xE0, 0x3F, 0xFF, 0x00, 0x7F, 0xF8, 0x01, 0xFF, 0xE0, 0x03,
|
|
||||||
0xFF, 0x00, 0x07, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x03, 0xFF,
|
|
||||||
0x00, 0x1F, 0xFE, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0xF0, 0x1F, 0xCF, 0xE0,
|
|
||||||
0xFF, 0x3F, 0x83, 0xF8, 0x7F, 0x1F, 0xC0, 0xFE, 0xFF, 0x03, 0xFC, 0xFC,
|
|
||||||
0x01, 0xFF, 0xF0, 0x1F, 0xDF, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xF0, 0x7F,
|
|
||||||
0x1F, 0x83, 0xF0, 0xFC, 0x1F, 0x87, 0xE0, 0xFC, 0x3F, 0x8F, 0xC0, 0xFC,
|
|
||||||
0x7E, 0x07, 0xE3, 0xF0, 0x1F, 0xBF, 0x00, 0xFD, 0xF8, 0x07, 0xEF, 0xC0,
|
|
||||||
0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0xFF,
|
|
||||||
0x80, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xE0, 0x0F,
|
|
||||||
0xFE, 0x00, 0x7F, 0xF0, 0x07, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0xFE, 0x00,
|
|
||||||
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x01, 0xFC, 0x00, 0xFF, 0x00,
|
|
||||||
0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE,
|
|
||||||
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xC0, 0x00, 0xF8, 0x3F, 0xC3, 0xFE, 0x1F, 0xF1, 0xFF, 0x8F, 0xE0, 0x7E,
|
|
||||||
0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0,
|
|
||||||
0x7E, 0x03, 0xF0, 0x3F, 0x87, 0xF8, 0x3F, 0x81, 0xFC, 0x0F, 0xF0, 0x7F,
|
|
||||||
0x80, 0xFE, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8,
|
|
||||||
0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0xC3, 0xFE, 0x1F, 0xF0,
|
|
||||||
0x7F, 0x80, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF8, 0x07, 0xF8, 0x3F,
|
|
||||||
0xE1, 0xFF, 0x0F, 0xFC, 0x0F, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E,
|
|
||||||
0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xE0,
|
|
||||||
0x3F, 0xC0, 0xFE, 0x07, 0xF0, 0x7F, 0x87, 0xFC, 0x3F, 0x81, 0xF8, 0x0F,
|
|
||||||
0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8,
|
|
||||||
0x1F, 0xC7, 0xFE, 0x3F, 0xE1, 0xFF, 0x0F, 0xF0, 0x7C, 0x00, 0x0F, 0x00,
|
|
||||||
0xC3, 0xFC, 0x0F, 0x3F, 0xF1, 0xF7, 0xFF, 0xFE, 0x7F, 0xFF, 0xEF, 0x8F,
|
|
||||||
0xFC, 0xF0, 0x3F, 0xC3, 0x00, 0xF0 };
|
|
||||||
|
|
||||||
const GFXglyph Ubuntu_Bold20pt7bGlyphs[] PROGMEM = {
|
|
||||||
{ 0, 0, 0, 9, 0, 1 }, // 0x20 ' '
|
|
||||||
{ 0, 8, 27, 11, 2, -26 }, // 0x21 '!'
|
|
||||||
{ 27, 15, 11, 18, 2, -29 }, // 0x22 '"'
|
|
||||||
{ 48, 23, 27, 27, 2, -26 }, // 0x23 '#'
|
|
||||||
{ 126, 19, 35, 22, 1, -29 }, // 0x24 '$'
|
|
||||||
{ 210, 34, 27, 36, 1, -26 }, // 0x25 '%'
|
|
||||||
{ 325, 27, 27, 28, 1, -26 }, // 0x26 '&'
|
|
||||||
{ 417, 6, 11, 10, 2, -29 }, // 0x27 '''
|
|
||||||
{ 426, 11, 38, 14, 3, -30 }, // 0x28 '('
|
|
||||||
{ 479, 11, 38, 14, 0, -30 }, // 0x29 ')'
|
|
||||||
{ 532, 17, 16, 20, 2, -26 }, // 0x2A '*'
|
|
||||||
{ 566, 19, 19, 23, 2, -20 }, // 0x2B '+'
|
|
||||||
{ 612, 8, 12, 9, 0, -5 }, // 0x2C ','
|
|
||||||
{ 624, 11, 5, 13, 1, -13 }, // 0x2D '-'
|
|
||||||
{ 631, 7, 7, 9, 1, -5 }, // 0x2E '.'
|
|
||||||
{ 638, 19, 38, 17, -1, -30 }, // 0x2F '/'
|
|
||||||
{ 729, 20, 27, 22, 1, -26 }, // 0x30 '0'
|
|
||||||
{ 797, 13, 27, 22, 3, -26 }, // 0x31 '1'
|
|
||||||
{ 841, 19, 27, 22, 1, -26 }, // 0x32 '2'
|
|
||||||
{ 906, 19, 27, 22, 1, -26 }, // 0x33 '3'
|
|
||||||
{ 971, 20, 27, 22, 1, -26 }, // 0x34 '4'
|
|
||||||
{ 1039, 19, 27, 22, 1, -26 }, // 0x35 '5'
|
|
||||||
{ 1104, 20, 27, 22, 1, -26 }, // 0x36 '6'
|
|
||||||
{ 1172, 18, 27, 22, 2, -26 }, // 0x37 '7'
|
|
||||||
{ 1233, 19, 27, 22, 2, -26 }, // 0x38 '8'
|
|
||||||
{ 1298, 19, 27, 22, 1, -26 }, // 0x39 '9'
|
|
||||||
{ 1363, 7, 21, 9, 1, -19 }, // 0x3A ':'
|
|
||||||
{ 1382, 8, 26, 9, 0, -19 }, // 0x3B ';'
|
|
||||||
{ 1408, 19, 19, 22, 2, -20 }, // 0x3C '<'
|
|
||||||
{ 1454, 18, 14, 22, 2, -17 }, // 0x3D '='
|
|
||||||
{ 1486, 19, 19, 22, 1, -20 }, // 0x3E '>'
|
|
||||||
{ 1532, 16, 28, 18, 1, -27 }, // 0x3F '?'
|
|
||||||
{ 1588, 34, 34, 38, 2, -27 }, // 0x40 '@'
|
|
||||||
{ 1733, 27, 27, 27, 0, -26 }, // 0x41 'A'
|
|
||||||
{ 1825, 21, 27, 26, 3, -26 }, // 0x42 'B'
|
|
||||||
{ 1896, 22, 27, 25, 2, -26 }, // 0x43 'C'
|
|
||||||
{ 1971, 24, 27, 29, 3, -26 }, // 0x44 'D'
|
|
||||||
{ 2052, 20, 27, 24, 3, -26 }, // 0x45 'E'
|
|
||||||
{ 2120, 18, 27, 22, 3, -26 }, // 0x46 'F'
|
|
||||||
{ 2181, 22, 27, 27, 2, -26 }, // 0x47 'G'
|
|
||||||
{ 2256, 23, 27, 29, 3, -26 }, // 0x48 'H'
|
|
||||||
{ 2334, 6, 27, 12, 3, -26 }, // 0x49 'I'
|
|
||||||
{ 2355, 18, 27, 21, 0, -26 }, // 0x4A 'J'
|
|
||||||
{ 2416, 24, 27, 27, 3, -26 }, // 0x4B 'K'
|
|
||||||
{ 2497, 18, 27, 22, 3, -26 }, // 0x4C 'L'
|
|
||||||
{ 2558, 31, 27, 35, 2, -26 }, // 0x4D 'M'
|
|
||||||
{ 2663, 23, 27, 29, 3, -26 }, // 0x4E 'N'
|
|
||||||
{ 2741, 27, 27, 31, 2, -26 }, // 0x4F 'O'
|
|
||||||
{ 2833, 20, 27, 25, 3, -26 }, // 0x50 'P'
|
|
||||||
{ 2901, 27, 34, 31, 2, -26 }, // 0x51 'Q'
|
|
||||||
{ 3016, 23, 27, 26, 3, -26 }, // 0x52 'R'
|
|
||||||
{ 3094, 20, 27, 23, 1, -26 }, // 0x53 'S'
|
|
||||||
{ 3162, 22, 27, 24, 1, -26 }, // 0x54 'T'
|
|
||||||
{ 3237, 22, 27, 28, 3, -26 }, // 0x55 'U'
|
|
||||||
{ 3312, 27, 27, 27, 0, -26 }, // 0x56 'V'
|
|
||||||
{ 3404, 36, 27, 38, 1, -26 }, // 0x57 'W'
|
|
||||||
{ 3526, 26, 27, 26, 0, -26 }, // 0x58 'X'
|
|
||||||
{ 3614, 26, 27, 26, 0, -26 }, // 0x59 'Y'
|
|
||||||
{ 3702, 22, 27, 24, 1, -26 }, // 0x5A 'Z'
|
|
||||||
{ 3777, 11, 38, 14, 3, -30 }, // 0x5B '['
|
|
||||||
{ 3830, 19, 38, 17, -1, -30 }, // 0x5C '\'
|
|
||||||
{ 3921, 11, 38, 14, 0, -30 }, // 0x5D ']'
|
|
||||||
{ 3974, 21, 16, 23, 1, -26 }, // 0x5E '^'
|
|
||||||
{ 4016, 20, 5, 20, 0, 3 }, // 0x5F '_'
|
|
||||||
{ 4029, 9, 9, 11, 1, -30 }, // 0x60 '`'
|
|
||||||
{ 4040, 17, 21, 22, 2, -20 }, // 0x61 'a'
|
|
||||||
{ 4085, 19, 30, 24, 3, -29 }, // 0x62 'b'
|
|
||||||
{ 4157, 17, 21, 20, 2, -20 }, // 0x63 'c'
|
|
||||||
{ 4202, 19, 30, 24, 2, -29 }, // 0x64 'd'
|
|
||||||
{ 4274, 19, 21, 23, 2, -20 }, // 0x65 'e'
|
|
||||||
{ 4324, 14, 30, 17, 3, -29 }, // 0x66 'f'
|
|
||||||
{ 4377, 18, 28, 23, 2, -20 }, // 0x67 'g'
|
|
||||||
{ 4440, 17, 30, 23, 3, -29 }, // 0x68 'h'
|
|
||||||
{ 4504, 8, 30, 12, 2, -29 }, // 0x69 'i'
|
|
||||||
{ 4534, 13, 37, 10, -4, -29 }, // 0x6A 'j'
|
|
||||||
{ 4595, 19, 30, 23, 3, -29 }, // 0x6B 'k'
|
|
||||||
{ 4667, 9, 30, 13, 3, -29 }, // 0x6C 'l'
|
|
||||||
{ 4701, 28, 21, 34, 3, -20 }, // 0x6D 'm'
|
|
||||||
{ 4775, 17, 21, 23, 3, -20 }, // 0x6E 'n'
|
|
||||||
{ 4820, 20, 21, 24, 2, -20 }, // 0x6F 'o'
|
|
||||||
{ 4873, 19, 28, 24, 3, -20 }, // 0x70 'p'
|
|
||||||
{ 4940, 20, 28, 24, 2, -20 }, // 0x71 'q'
|
|
||||||
{ 5010, 14, 21, 17, 3, -20 }, // 0x72 'r'
|
|
||||||
{ 5047, 16, 21, 19, 1, -20 }, // 0x73 's'
|
|
||||||
{ 5089, 14, 27, 18, 3, -26 }, // 0x74 't'
|
|
||||||
{ 5137, 17, 21, 23, 3, -20 }, // 0x75 'u'
|
|
||||||
{ 5182, 21, 21, 21, 0, -20 }, // 0x76 'v'
|
|
||||||
{ 5238, 30, 21, 30, 0, -20 }, // 0x77 'w'
|
|
||||||
{ 5317, 22, 21, 22, 0, -20 }, // 0x78 'x'
|
|
||||||
{ 5375, 21, 28, 21, 0, -20 }, // 0x79 'y'
|
|
||||||
{ 5449, 18, 21, 20, 1, -20 }, // 0x7A 'z'
|
|
||||||
{ 5497, 13, 38, 14, 1, -30 }, // 0x7B '{'
|
|
||||||
{ 5559, 6, 38, 14, 4, -30 }, // 0x7C '|'
|
|
||||||
{ 5588, 13, 38, 14, 0, -30 }, // 0x7D '}'
|
|
||||||
{ 5650, 20, 8, 22, 1, -15 } }; // 0x7E '~'
|
|
||||||
|
|
||||||
const GFXfont Ubuntu_Bold20pt7b PROGMEM = {
|
|
||||||
(uint8_t *)Ubuntu_Bold20pt7bBitmaps,
|
|
||||||
(GFXglyph *)Ubuntu_Bold20pt7bGlyphs,
|
|
||||||
0x20, 0x7E, 45 };
|
|
||||||
|
|
||||||
// Approx. 6342 bytes
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,182 +0,0 @@
|
|||||||
const uint8_t Ubuntu_Bold8pt7bBitmaps[] PROGMEM = {
|
|
||||||
0xFF, 0xFC, 0xFC, 0xDE, 0xF7, 0xBD, 0x80, 0x1B, 0x0D, 0x87, 0xDF, 0xFF,
|
|
||||||
0xF9, 0xB3, 0xFF, 0xFF, 0x6C, 0x36, 0x1B, 0x00, 0x18, 0x30, 0xFF, 0xFC,
|
|
||||||
0x38, 0x1C, 0x1E, 0x0E, 0x0C, 0x1F, 0xF7, 0xC3, 0x06, 0x00, 0x78, 0x63,
|
|
||||||
0xF3, 0x0C, 0xCC, 0x33, 0x60, 0xCF, 0xFB, 0xFF, 0xF7, 0xFC, 0xC1, 0xB3,
|
|
||||||
0x0C, 0xCC, 0x33, 0xF1, 0x87, 0x80, 0x3C, 0x1F, 0x86, 0x61, 0x98, 0x3C,
|
|
||||||
0x1E, 0x6C, 0xDB, 0x1C, 0xC7, 0x3F, 0xE7, 0xDC, 0xFF, 0xC0, 0x13, 0x66,
|
|
||||||
0xCC, 0xCC, 0xCC, 0xCC, 0x66, 0x31, 0x8C, 0x66, 0x33, 0x33, 0x33, 0x33,
|
|
||||||
0x66, 0xC8, 0x39, 0xFF, 0xF8, 0x86, 0xDD, 0xD1, 0x00, 0x18, 0x18, 0x18,
|
|
||||||
0xFF, 0xFF, 0x18, 0x18, 0x18, 0x6D, 0xEC, 0xFF, 0xC0, 0xFF, 0x80, 0x06,
|
|
||||||
0x1C, 0x30, 0x60, 0xC3, 0x06, 0x0C, 0x30, 0x60, 0xC3, 0x06, 0x0C, 0x38,
|
|
||||||
0x60, 0x38, 0xFB, 0xBE, 0x3C, 0x78, 0xF1, 0xE3, 0xEE, 0xF8, 0xE0, 0x1B,
|
|
||||||
0xFE, 0xB1, 0x8C, 0x63, 0x18, 0xC6, 0x7D, 0xFD, 0x18, 0x30, 0xE3, 0x8E,
|
|
||||||
0x38, 0xE1, 0xFF, 0xF8, 0x7D, 0xFC, 0x18, 0x33, 0xE7, 0x81, 0x83, 0x87,
|
|
||||||
0xFF, 0xE0, 0x06, 0x0E, 0x1E, 0x3E, 0x36, 0x66, 0xE6, 0xFF, 0xFF, 0x06,
|
|
||||||
0x06, 0x7E, 0xFD, 0x83, 0x0F, 0x9F, 0x83, 0x83, 0x07, 0xFB, 0xE0, 0x1C,
|
|
||||||
0x79, 0xC7, 0x0F, 0xDF, 0xF1, 0xE3, 0xC6, 0xF8, 0xE0, 0xFF, 0xFC, 0x30,
|
|
||||||
0xE1, 0x87, 0x0C, 0x18, 0x60, 0xC1, 0x80, 0x3C, 0xFF, 0x1E, 0x3E, 0xEF,
|
|
||||||
0xBF, 0xE3, 0xC7, 0xFD, 0xF0, 0x38, 0xFB, 0x1E, 0x3C, 0x7F, 0xDF, 0x87,
|
|
||||||
0x1C, 0xF1, 0xC0, 0xFF, 0x80, 0x3F, 0xE0, 0x77, 0x70, 0x00, 0x06, 0x66,
|
|
||||||
0xCC, 0x06, 0x3E, 0xF8, 0xC0, 0xF8, 0x3F, 0x06, 0xFF, 0xFF, 0x00, 0x00,
|
|
||||||
0xFF, 0xFF, 0x60, 0x7C, 0x1F, 0x03, 0x1F, 0xFC, 0x60, 0x7D, 0xFC, 0x18,
|
|
||||||
0x30, 0xC3, 0x0C, 0x18, 0x00, 0x70, 0xE1, 0xC0, 0x0F, 0xC0, 0x7F, 0xC3,
|
|
||||||
0x83, 0x98, 0x06, 0xE7, 0xCF, 0x3F, 0x3D, 0x8C, 0xF6, 0x33, 0xD8, 0xCF,
|
|
||||||
0xBF, 0xE6, 0x7F, 0x1E, 0x00, 0x3F, 0xC0, 0x3F, 0x00, 0x0E, 0x01, 0xC0,
|
|
||||||
0x7C, 0x0D, 0x83, 0xB8, 0x63, 0x0C, 0x63, 0xFE, 0x7F, 0xCC, 0x1B, 0x01,
|
|
||||||
0x80, 0xFC, 0x7F, 0xB0, 0xD8, 0x6F, 0xE7, 0xFB, 0x07, 0x83, 0xC3, 0xFF,
|
|
||||||
0xBF, 0x80, 0x1F, 0x1F, 0xD8, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0x60,
|
|
||||||
0x3F, 0xC7, 0xC0, 0xFE, 0x3F, 0xCC, 0x3B, 0x07, 0xC0, 0xF0, 0x3C, 0x0F,
|
|
||||||
0x07, 0xC3, 0xBF, 0xCF, 0xE0, 0xFF, 0xFF, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0,
|
|
||||||
0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0,
|
|
||||||
0xC0, 0xC0, 0xC0, 0x1F, 0x1F, 0xD8, 0x18, 0x0C, 0x06, 0x0F, 0x07, 0x83,
|
|
||||||
0x71, 0xBF, 0xC7, 0xE0, 0xC1, 0xE0, 0xF0, 0x78, 0x3F, 0xFF, 0xFF, 0x07,
|
|
||||||
0x83, 0xC1, 0xE0, 0xF0, 0x60, 0xFF, 0xFF, 0xFC, 0x06, 0x0C, 0x18, 0x30,
|
|
||||||
0x60, 0xC1, 0x83, 0x07, 0xF9, 0xE0, 0xC1, 0xB0, 0xCC, 0x63, 0x30, 0xF8,
|
|
||||||
0x3C, 0x0D, 0x83, 0x30, 0xC6, 0x30, 0xCC, 0x18, 0xC0, 0xC0, 0xC0, 0xC0,
|
|
||||||
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0x60, 0x33, 0x83, 0x9C, 0x1C,
|
|
||||||
0xF1, 0xED, 0x8D, 0xEE, 0xEF, 0x36, 0x79, 0xF3, 0xC7, 0x1E, 0x38, 0xF0,
|
|
||||||
0x06, 0xC0, 0xF8, 0x3F, 0x0F, 0xE3, 0xDC, 0xF3, 0xBC, 0x7F, 0x0F, 0xC1,
|
|
||||||
0xF0, 0x7C, 0x0C, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80, 0xF0,
|
|
||||||
0x1F, 0x07, 0x71, 0xCF, 0xF8, 0x7C, 0x00, 0xFC, 0xFE, 0xC3, 0xC3, 0xC3,
|
|
||||||
0xFE, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C,
|
|
||||||
0x07, 0x80, 0xF0, 0x1F, 0x07, 0x71, 0xCF, 0xF0, 0xF8, 0x07, 0x00, 0x7C,
|
|
||||||
0x07, 0x80, 0xFC, 0x7F, 0x30, 0xD8, 0x6C, 0x37, 0xF3, 0xE1, 0x98, 0xC6,
|
|
||||||
0x63, 0xB0, 0xE0, 0x3D, 0xFF, 0x06, 0x0F, 0x0F, 0x87, 0x83, 0x07, 0xFD,
|
|
||||||
0xF0, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
|
||||||
0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xE3, 0xBF, 0x8F,
|
|
||||||
0x80, 0xC0, 0x6C, 0x19, 0x83, 0x38, 0xE3, 0x18, 0x63, 0x06, 0xC0, 0xD8,
|
|
||||||
0x0E, 0x01, 0xC0, 0x38, 0x00, 0xC0, 0x07, 0x87, 0x0D, 0x8E, 0x33, 0x1C,
|
|
||||||
0x66, 0x6C, 0xC6, 0xDB, 0x0D, 0xB6, 0x1B, 0x6C, 0x1C, 0x70, 0x38, 0xE0,
|
|
||||||
0x71, 0xC0, 0xE0, 0xEC, 0x18, 0xC6, 0x0D, 0x80, 0xE0, 0x1C, 0x03, 0x80,
|
|
||||||
0xD8, 0x31, 0x8C, 0x1B, 0x83, 0x80, 0xC0, 0xD8, 0x67, 0x38, 0xCC, 0x1E,
|
|
||||||
0x07, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0xFF, 0xFF, 0x06, 0x0C,
|
|
||||||
0x1C, 0x18, 0x30, 0x70, 0x60, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C, 0x63, 0x18,
|
|
||||||
0xC6, 0x31, 0x8C, 0x63, 0xFF, 0xC1, 0xC1, 0x83, 0x06, 0x06, 0x0C, 0x18,
|
|
||||||
0x18, 0x30, 0x60, 0x60, 0xC1, 0x83, 0x83, 0xFF, 0xC6, 0x31, 0x8C, 0x63,
|
|
||||||
0x18, 0xC6, 0x31, 0x8F, 0xFF, 0x08, 0x0E, 0x0F, 0x86, 0xC7, 0x77, 0x1D,
|
|
||||||
0x04, 0xFF, 0xFF, 0x4E, 0x72, 0x7C, 0xFC, 0x1B, 0xFF, 0xF8, 0xFF, 0xBF,
|
|
||||||
0xC1, 0x83, 0x06, 0x0F, 0x9F, 0xB3, 0xE3, 0xC7, 0x9F, 0xF7, 0xC0, 0x3D,
|
|
||||||
0xFE, 0x30, 0xC3, 0x87, 0xCF, 0x06, 0x0C, 0x18, 0x33, 0xEF, 0xF9, 0xE3,
|
|
||||||
0xC7, 0xCD, 0xF9, 0xF0, 0x38, 0xFB, 0x1F, 0xFF, 0xF8, 0x1F, 0x1E, 0x7F,
|
|
||||||
0xF1, 0x8F, 0xFF, 0x18, 0xC6, 0x31, 0x80, 0x3E, 0xFF, 0x9E, 0x3C, 0x7C,
|
|
||||||
0xDF, 0x9F, 0x06, 0xFB, 0xE0, 0xC1, 0x83, 0x06, 0x0F, 0xDF, 0xF1, 0xE3,
|
|
||||||
0xC7, 0x8F, 0x1E, 0x30, 0xFC, 0xFF, 0xFF, 0x33, 0x30, 0x33, 0x33, 0x33,
|
|
||||||
0x33, 0x3F, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC6, 0xCC, 0xD8, 0xF0, 0xD8,
|
|
||||||
0xCC, 0xC6, 0xC7, 0xDB, 0x6D, 0xB6, 0xDB, 0xB0, 0xFD, 0xEF, 0xFF, 0xC6,
|
|
||||||
0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xFD, 0xFF, 0x1E, 0x3C,
|
|
||||||
0x78, 0xF1, 0xE3, 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0xF9,
|
|
||||||
0xFB, 0x3E, 0x3C, 0x79, 0xFF, 0x7C, 0xC1, 0x83, 0x00, 0x3E, 0xFF, 0x9E,
|
|
||||||
0x3C, 0x7C, 0xDF, 0xBF, 0x06, 0x0C, 0x18, 0xFF, 0xF1, 0x8C, 0x63, 0x18,
|
|
||||||
0x7F, 0xEC, 0x3E, 0x7C, 0x3F, 0xFE, 0xC6, 0x3F, 0xFC, 0x63, 0x18, 0xFB,
|
|
||||||
0xC0, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xFF, 0xBF, 0xC1, 0xB1, 0x98, 0xCE,
|
|
||||||
0xE3, 0x61, 0xF0, 0x70, 0x38, 0xC6, 0x79, 0xCD, 0xBB, 0x35, 0x66, 0xAC,
|
|
||||||
0x77, 0x0E, 0xE1, 0x8C, 0xE3, 0xBB, 0x8D, 0x83, 0x81, 0xC1, 0xB1, 0xDD,
|
|
||||||
0xC7, 0xE3, 0xB1, 0x98, 0xCE, 0xE3, 0x61, 0xF0, 0x70, 0x38, 0x18, 0x7C,
|
|
||||||
0x3C, 0x00, 0xFF, 0xF1, 0x8E, 0x71, 0x8F, 0xFF, 0x3B, 0xD8, 0xC6, 0x31,
|
|
||||||
0x98, 0xC3, 0x18, 0xC6, 0x31, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x8C,
|
|
||||||
0x63, 0x18, 0xC3, 0x19, 0x8C, 0x63, 0x1B, 0xDC, 0x73, 0xFF, 0xCE };
|
|
||||||
|
|
||||||
const GFXglyph Ubuntu_Bold8pt7bGlyphs[] PROGMEM = {
|
|
||||||
{ 0, 0, 0, 4, 0, 1 }, // 0x20 ' '
|
|
||||||
{ 0, 2, 11, 4, 1, -10 }, // 0x21 '!'
|
|
||||||
{ 3, 5, 5, 7, 1, -11 }, // 0x22 '"'
|
|
||||||
{ 7, 9, 11, 11, 1, -10 }, // 0x23 '#'
|
|
||||||
{ 20, 7, 15, 9, 1, -12 }, // 0x24 '$'
|
|
||||||
{ 34, 14, 11, 16, 1, -10 }, // 0x25 '%'
|
|
||||||
{ 54, 10, 11, 11, 1, -10 }, // 0x26 '&'
|
|
||||||
{ 68, 2, 5, 4, 1, -11 }, // 0x27 '''
|
|
||||||
{ 70, 4, 16, 6, 1, -12 }, // 0x28 '('
|
|
||||||
{ 78, 4, 16, 6, 1, -12 }, // 0x29 ')'
|
|
||||||
{ 86, 7, 7, 8, 1, -10 }, // 0x2A '*'
|
|
||||||
{ 93, 8, 8, 10, 1, -8 }, // 0x2B '+'
|
|
||||||
{ 101, 3, 5, 4, 0, -1 }, // 0x2C ','
|
|
||||||
{ 103, 5, 2, 7, 1, -5 }, // 0x2D '-'
|
|
||||||
{ 105, 3, 3, 5, 1, -2 }, // 0x2E '.'
|
|
||||||
{ 107, 7, 16, 7, 0, -12 }, // 0x2F '/'
|
|
||||||
{ 121, 7, 11, 9, 1, -10 }, // 0x30 '0'
|
|
||||||
{ 131, 5, 11, 9, 1, -10 }, // 0x31 '1'
|
|
||||||
{ 138, 7, 11, 9, 1, -10 }, // 0x32 '2'
|
|
||||||
{ 148, 7, 11, 9, 1, -10 }, // 0x33 '3'
|
|
||||||
{ 158, 8, 11, 9, 1, -10 }, // 0x34 '4'
|
|
||||||
{ 169, 7, 11, 9, 1, -10 }, // 0x35 '5'
|
|
||||||
{ 179, 7, 11, 9, 1, -10 }, // 0x36 '6'
|
|
||||||
{ 189, 7, 11, 9, 1, -10 }, // 0x37 '7'
|
|
||||||
{ 199, 7, 11, 9, 1, -10 }, // 0x38 '8'
|
|
||||||
{ 209, 7, 11, 9, 1, -10 }, // 0x39 '9'
|
|
||||||
{ 219, 3, 9, 5, 1, -8 }, // 0x3A ':'
|
|
||||||
{ 223, 4, 12, 5, 0, -8 }, // 0x3B ';'
|
|
||||||
{ 229, 8, 7, 9, 1, -7 }, // 0x3C '<'
|
|
||||||
{ 236, 8, 6, 10, 1, -7 }, // 0x3D '='
|
|
||||||
{ 242, 8, 7, 9, 0, -7 }, // 0x3E '>'
|
|
||||||
{ 249, 7, 12, 7, 0, -11 }, // 0x3F '?'
|
|
||||||
{ 260, 14, 14, 16, 1, -10 }, // 0x40 '@'
|
|
||||||
{ 285, 11, 11, 11, 0, -10 }, // 0x41 'A'
|
|
||||||
{ 301, 9, 11, 11, 1, -10 }, // 0x42 'B'
|
|
||||||
{ 314, 9, 11, 11, 1, -10 }, // 0x43 'C'
|
|
||||||
{ 327, 10, 11, 12, 1, -10 }, // 0x44 'D'
|
|
||||||
{ 341, 8, 11, 10, 1, -10 }, // 0x45 'E'
|
|
||||||
{ 352, 8, 11, 9, 1, -10 }, // 0x46 'F'
|
|
||||||
{ 363, 9, 11, 11, 1, -10 }, // 0x47 'G'
|
|
||||||
{ 376, 9, 11, 11, 1, -10 }, // 0x48 'H'
|
|
||||||
{ 389, 2, 11, 4, 1, -10 }, // 0x49 'I'
|
|
||||||
{ 392, 7, 11, 8, 0, -10 }, // 0x4A 'J'
|
|
||||||
{ 402, 10, 11, 11, 1, -10 }, // 0x4B 'K'
|
|
||||||
{ 416, 8, 11, 9, 1, -10 }, // 0x4C 'L'
|
|
||||||
{ 427, 13, 11, 15, 1, -10 }, // 0x4D 'M'
|
|
||||||
{ 445, 10, 11, 12, 1, -10 }, // 0x4E 'N'
|
|
||||||
{ 459, 11, 11, 13, 1, -10 }, // 0x4F 'O'
|
|
||||||
{ 475, 8, 11, 10, 1, -10 }, // 0x50 'P'
|
|
||||||
{ 486, 11, 14, 13, 1, -10 }, // 0x51 'Q'
|
|
||||||
{ 506, 9, 11, 10, 1, -10 }, // 0x52 'R'
|
|
||||||
{ 519, 7, 11, 9, 1, -10 }, // 0x53 'S'
|
|
||||||
{ 529, 8, 11, 8, 0, -10 }, // 0x54 'T'
|
|
||||||
{ 540, 9, 11, 11, 1, -10 }, // 0x55 'U'
|
|
||||||
{ 553, 11, 11, 11, 0, -10 }, // 0x56 'V'
|
|
||||||
{ 569, 15, 11, 15, 0, -10 }, // 0x57 'W'
|
|
||||||
{ 590, 11, 11, 11, 0, -10 }, // 0x58 'X'
|
|
||||||
{ 606, 10, 11, 10, 0, -10 }, // 0x59 'Y'
|
|
||||||
{ 620, 8, 11, 10, 1, -10 }, // 0x5A 'Z'
|
|
||||||
{ 631, 5, 16, 6, 1, -12 }, // 0x5B '['
|
|
||||||
{ 641, 7, 16, 7, 0, -12 }, // 0x5C '\'
|
|
||||||
{ 655, 5, 16, 6, 0, -12 }, // 0x5D ']'
|
|
||||||
{ 665, 9, 7, 9, 0, -10 }, // 0x5E '^'
|
|
||||||
{ 673, 8, 2, 8, 0, 2 }, // 0x5F '_'
|
|
||||||
{ 675, 4, 4, 5, 1, -12 }, // 0x60 '`'
|
|
||||||
{ 677, 7, 8, 9, 1, -7 }, // 0x61 'a'
|
|
||||||
{ 684, 7, 12, 9, 1, -11 }, // 0x62 'b'
|
|
||||||
{ 695, 6, 8, 8, 1, -7 }, // 0x63 'c'
|
|
||||||
{ 701, 7, 12, 9, 1, -11 }, // 0x64 'd'
|
|
||||||
{ 712, 7, 8, 9, 1, -7 }, // 0x65 'e'
|
|
||||||
{ 719, 5, 12, 6, 1, -11 }, // 0x66 'f'
|
|
||||||
{ 727, 7, 11, 9, 1, -7 }, // 0x67 'g'
|
|
||||||
{ 737, 7, 12, 9, 1, -11 }, // 0x68 'h'
|
|
||||||
{ 748, 2, 12, 4, 1, -11 }, // 0x69 'i'
|
|
||||||
{ 751, 4, 15, 4, -1, -11 }, // 0x6A 'j'
|
|
||||||
{ 759, 8, 12, 9, 1, -11 }, // 0x6B 'k'
|
|
||||||
{ 771, 3, 12, 4, 1, -11 }, // 0x6C 'l'
|
|
||||||
{ 776, 12, 8, 14, 1, -7 }, // 0x6D 'm'
|
|
||||||
{ 788, 7, 8, 9, 1, -7 }, // 0x6E 'n'
|
|
||||||
{ 795, 8, 8, 10, 1, -7 }, // 0x6F 'o'
|
|
||||||
{ 803, 7, 11, 9, 1, -7 }, // 0x70 'p'
|
|
||||||
{ 813, 7, 11, 9, 1, -7 }, // 0x71 'q'
|
|
||||||
{ 823, 5, 8, 6, 1, -7 }, // 0x72 'r'
|
|
||||||
{ 828, 6, 8, 8, 1, -7 }, // 0x73 's'
|
|
||||||
{ 834, 5, 10, 7, 1, -9 }, // 0x74 't'
|
|
||||||
{ 841, 7, 8, 9, 1, -7 }, // 0x75 'u'
|
|
||||||
{ 848, 9, 8, 9, 0, -7 }, // 0x76 'v'
|
|
||||||
{ 857, 11, 8, 11, 0, -7 }, // 0x77 'w'
|
|
||||||
{ 868, 9, 8, 9, 0, -7 }, // 0x78 'x'
|
|
||||||
{ 877, 9, 11, 9, 0, -7 }, // 0x79 'y'
|
|
||||||
{ 890, 6, 8, 8, 1, -7 }, // 0x7A 'z'
|
|
||||||
{ 896, 5, 16, 5, 0, -12 }, // 0x7B '{'
|
|
||||||
{ 906, 2, 16, 4, 1, -12 }, // 0x7C '|'
|
|
||||||
{ 910, 5, 16, 5, 0, -12 }, // 0x7D '}'
|
|
||||||
{ 920, 8, 3, 9, 1, -5 } }; // 0x7E '~'
|
|
||||||
|
|
||||||
const GFXfont Ubuntu_Bold8pt7b PROGMEM = {
|
|
||||||
(uint8_t *)Ubuntu_Bold8pt7bBitmaps,
|
|
||||||
(GFXglyph *)Ubuntu_Bold8pt7bGlyphs,
|
|
||||||
0x20, 0x7E, 18 };
|
|
||||||
|
|
||||||
// Approx. 1595 bytes
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
6
lib/obp60task/debugging.txt
Normal file
6
lib/obp60task/debugging.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Debugging tool
|
||||||
|
##############
|
||||||
|
|
||||||
|
log.txt = text file with error messages from terminal console
|
||||||
|
|
||||||
|
tools/decoder.py -p ESP32S3 -t ~/.platformio/packages/toolchain-xtensa-esp32s3/ -e .pio/build/obp60_s3/firmware.elf log.txt
|
||||||
30
lib/obp60task/extra_task.py
Normal file
30
lib/obp60task/extra_task.py
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# PlatformIO extra script for obp60task
|
||||||
|
|
||||||
|
epdtype = "unknown"
|
||||||
|
pcbvers = "unknown"
|
||||||
|
for x in env["BUILD_FLAGS"]:
|
||||||
|
if x.startswith("-D HARDWARE_"):
|
||||||
|
pcbvers = x.split('_')[1]
|
||||||
|
if x.startswith("-D DISPLAY_"):
|
||||||
|
epdtype = x.split('_')[1]
|
||||||
|
|
||||||
|
propfilename = os.path.join(env["PROJECT_LIBDEPS_DIR"], env["PIOENV"], "GxEPD2/library.properties")
|
||||||
|
properties = {}
|
||||||
|
with open(propfilename, 'r') as file:
|
||||||
|
for line in file:
|
||||||
|
match = re.match(r'^([^=]+)=(.*)$', line)
|
||||||
|
if match:
|
||||||
|
key = match.group(1).strip()
|
||||||
|
value = match.group(2).strip()
|
||||||
|
properties[key] = value
|
||||||
|
|
||||||
|
gxepd2vers = "unknown"
|
||||||
|
try:
|
||||||
|
if properties["name"] == "GxEPD2":
|
||||||
|
gxepd2vers = properties["version"]
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
env["CPPDEFINES"].extend([("BOARD", env["BOARD"]), ("EPDTYPE", epdtype), ("PCBVERS", pcbvers), ("GXEPD2VERS", gxepd2vers)])
|
||||||
|
|
||||||
|
print("added hardware info to CPPDEFINES")
|
||||||
202
lib/obp60task/fonts/IBM8x8px.h
Normal file
202
lib/obp60task/fonts/IBM8x8px.h
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
const uint8_t IBM8x8pxBitmaps[] PROGMEM = {
|
||||||
|
0x00, /* 0x20 space */
|
||||||
|
0x6F, 0xF6, 0x60, 0x60, /* 0x21 exclam */
|
||||||
|
0xDE, 0xF6, /* 0x22 quotedbl */
|
||||||
|
0x6C, 0xDB, 0xFB, 0x6F, 0xED, 0x9B, 0x00, /* 0x23 numbersign */
|
||||||
|
0x31, 0xFC, 0x1E, 0x0F, 0xE3, 0x00, /* 0x24 dollar */
|
||||||
|
0xC7, 0x98, 0x61, 0x86, 0x78, 0xC0, /* 0x25 percent */
|
||||||
|
0x38, 0xD8, 0xE3, 0xBD, 0xD9, 0x9D, 0x80, /* 0x26 ampersand */
|
||||||
|
0x6F, 0x00, /* 0x27 quotesingle */
|
||||||
|
0x36, 0xCC, 0xC6, 0x30, /* 0x28 parenleft */
|
||||||
|
0xC6, 0x33, 0x36, 0xC0, /* 0x29 parenright */
|
||||||
|
0x66, 0x3C, 0xFF, 0x3C, 0x66, /* 0x2A asterisk */
|
||||||
|
0x30, 0xCF, 0xCC, 0x30, /* 0x2B plus */
|
||||||
|
0x6F, 0x00, /* 0x2C comma */
|
||||||
|
0xFC, /* 0x2D hyphen */
|
||||||
|
0xF0, /* 0x2E period */
|
||||||
|
0x06, 0x18, 0x61, 0x86, 0x18, 0x20, 0x00, /* 0x2F slash */
|
||||||
|
0x7D, 0x8F, 0x3E, 0xFF, 0x7C, 0xDF, 0x00, /* 0x30 zero */
|
||||||
|
0x31, 0xC3, 0x0C, 0x30, 0xCF, 0xC0, /* 0x31 one */
|
||||||
|
0x7B, 0x30, 0xCE, 0x63, 0x1F, 0xC0, /* 0x32 two */
|
||||||
|
0x7B, 0x30, 0xCE, 0x0F, 0x37, 0x80, /* 0x33 three */
|
||||||
|
0x1C, 0x79, 0xB6, 0x6F, 0xE1, 0x87, 0x80, /* 0x34 four */
|
||||||
|
0xFF, 0x0F, 0x83, 0x0F, 0x37, 0x80, /* 0x35 five */
|
||||||
|
0x39, 0x8C, 0x3E, 0xCF, 0x37, 0x80, /* 0x36 six */
|
||||||
|
0xFF, 0x30, 0xC6, 0x30, 0xC3, 0x00, /* 0x37 seven */
|
||||||
|
0x7B, 0x3C, 0xDE, 0xCF, 0x37, 0x80, /* 0x38 eight */
|
||||||
|
0x7B, 0x3C, 0xDF, 0x0C, 0x67, 0x00, /* 0x39 nine */
|
||||||
|
0xF0, 0xF0, /* 0x3A colon */
|
||||||
|
0x6C, 0x37, 0x80, /* 0x3B semicolon */
|
||||||
|
0x19, 0x99, 0x86, 0x18, 0x60, /* 0x3C less */
|
||||||
|
0xFC, 0x00, 0x3F, /* 0x3D equal */
|
||||||
|
0xC3, 0x0C, 0x33, 0x33, 0x00, /* 0x3E greater */
|
||||||
|
0x7B, 0x30, 0xC6, 0x30, 0x03, 0x00, /* 0x3F question */
|
||||||
|
0x7D, 0x8F, 0x7E, 0xFD, 0xF8, 0x1E, 0x00, /* 0x40 at */
|
||||||
|
0x31, 0xEC, 0xF3, 0xFF, 0x3C, 0xC0, /* 0x41 A */
|
||||||
|
0xFC, 0xCD, 0x9B, 0xE6, 0x6C, 0xFF, 0x00, /* 0x42 B */
|
||||||
|
0x3C, 0xCF, 0x06, 0x0C, 0x0C, 0xCF, 0x00, /* 0x43 C */
|
||||||
|
0xF8, 0xD9, 0x9B, 0x36, 0x6D, 0xBE, 0x00, /* 0x44 D */
|
||||||
|
0xFE, 0xC5, 0xA3, 0xC6, 0x8C, 0x7F, 0x80, /* 0x45 E */
|
||||||
|
0xFE, 0xC5, 0xA3, 0xC6, 0x8C, 0x3C, 0x00, /* 0x46 F */
|
||||||
|
0x3C, 0xCF, 0x06, 0x0C, 0xEC, 0xCF, 0x80, /* 0x47 G */
|
||||||
|
0xCF, 0x3C, 0xFF, 0xCF, 0x3C, 0xC0, /* 0x48 H */
|
||||||
|
0xF6, 0x66, 0x66, 0xF0, /* 0x49 I */
|
||||||
|
0x1E, 0x18, 0x30, 0x6C, 0xD9, 0x9E, 0x00, /* 0x4A J */
|
||||||
|
0xE6, 0xCD, 0xB3, 0xC6, 0xCC, 0xF9, 0x80, /* 0x4B K */
|
||||||
|
0xF0, 0xC1, 0x83, 0x06, 0x2C, 0xFF, 0x80, /* 0x4C L */
|
||||||
|
0xC7, 0xDF, 0xFF, 0xFD, 0x78, 0xF1, 0x80, /* 0x4D M */
|
||||||
|
0xC7, 0xCF, 0xDE, 0xFC, 0xF8, 0xF1, 0x80, /* 0x4E N */
|
||||||
|
0x38, 0xDB, 0x1E, 0x3C, 0x6D, 0x8E, 0x00, /* 0x4F O */
|
||||||
|
0xFC, 0xCD, 0x9B, 0xE6, 0x0C, 0x3C, 0x00, /* 0x50 P */
|
||||||
|
0x7B, 0x3C, 0xF3, 0xDD, 0xE1, 0xC0, /* 0x51 Q */
|
||||||
|
0xFC, 0xCD, 0x9B, 0xE6, 0xCC, 0xF9, 0x80, /* 0x52 R */
|
||||||
|
0x7B, 0x3E, 0x1C, 0x1F, 0x37, 0x80, /* 0x53 S */
|
||||||
|
0xFE, 0xD3, 0x0C, 0x30, 0xC7, 0x80, /* 0x54 T */
|
||||||
|
0xCF, 0x3C, 0xF3, 0xCF, 0x3F, 0xC0, /* 0x55 U */
|
||||||
|
0xCF, 0x3C, 0xF3, 0xCD, 0xE3, 0x00, /* 0x56 V */
|
||||||
|
0xC7, 0x8F, 0x1E, 0xBF, 0xFD, 0xF1, 0x80, /* 0x57 W */
|
||||||
|
0xC7, 0x8D, 0xB1, 0xC3, 0x8D, 0xB1, 0x80, /* 0x58 X */
|
||||||
|
0xCF, 0x3C, 0xDE, 0x30, 0xC7, 0x80, /* 0x59 Y */
|
||||||
|
0xFF, 0x8E, 0x30, 0xC3, 0x2C, 0xFF, 0x80, /* 0x5A Z */
|
||||||
|
0xFC, 0xCC, 0xCC, 0xF0, /* 0x5B bracketleft */
|
||||||
|
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, /* 0x5C backslash */
|
||||||
|
0xF3, 0x33, 0x33, 0xF0, /* 0x5D bracketright */
|
||||||
|
0x10, 0x71, 0xB6, 0x30, /* 0x5E asciicircum */
|
||||||
|
0xFF, /* 0x5F underscore */
|
||||||
|
0xD9, 0x80, /* 0x60 grave */
|
||||||
|
0x78, 0x19, 0xF6, 0x67, 0x60, /* 0x61 a */
|
||||||
|
0xE0, 0xC1, 0x83, 0xE6, 0x6C, 0xF7, 0x00, /* 0x62 b */
|
||||||
|
0x7B, 0x3C, 0x33, 0x78, /* 0x63 c */
|
||||||
|
0x1C, 0x18, 0x33, 0xEC, 0xD9, 0x9D, 0x80, /* 0x64 d */
|
||||||
|
0x7B, 0x3F, 0xF0, 0x78, /* 0x65 e */
|
||||||
|
0x39, 0xB6, 0x3C, 0x61, 0x8F, 0x00, /* 0x66 f */
|
||||||
|
0x77, 0x9B, 0x33, 0xE0, 0xDF, 0x00, /* 0x67 g */
|
||||||
|
0xE0, 0xC1, 0xB3, 0xB6, 0x6C, 0xF9, 0x80, /* 0x68 h */
|
||||||
|
0x60, 0xE6, 0x66, 0xF0, /* 0x69 i */
|
||||||
|
0x0C, 0x00, 0xC3, 0x0F, 0x3C, 0xDE, /* 0x6A j */
|
||||||
|
0xE0, 0xC1, 0x9B, 0x67, 0x8D, 0xB9, 0x80, /* 0x6B k */
|
||||||
|
0xE6, 0x66, 0x66, 0xF0, /* 0x6C l */
|
||||||
|
0xCD, 0xFF, 0xFE, 0xBC, 0x60, /* 0x6D m */
|
||||||
|
0xFB, 0x3C, 0xF3, 0xCC, /* 0x6E n */
|
||||||
|
0x7B, 0x3C, 0xF3, 0x78, /* 0x6F o */
|
||||||
|
0xDC, 0xCD, 0x9B, 0xE6, 0x1E, 0x00, /* 0x70 p */
|
||||||
|
0x77, 0x9B, 0x33, 0xE0, 0xC3, 0xC0, /* 0x71 q */
|
||||||
|
0xDC, 0xED, 0x9B, 0x0F, 0x00, /* 0x72 r */
|
||||||
|
0x7F, 0x07, 0x83, 0xF8, /* 0x73 s */
|
||||||
|
0x23, 0x3E, 0xC6, 0x34, 0xC0, /* 0x74 t */
|
||||||
|
0xCD, 0x9B, 0x36, 0x67, 0x60, /* 0x75 u */
|
||||||
|
0xCF, 0x3C, 0xDE, 0x30, /* 0x76 v */
|
||||||
|
0xC7, 0xAF, 0xFF, 0xF6, 0xC0, /* 0x77 w */
|
||||||
|
0xC6, 0xD8, 0xE3, 0x6C, 0x60, /* 0x78 x */
|
||||||
|
0xCF, 0x3C, 0xDF, 0x0F, 0xE0, /* 0x79 y */
|
||||||
|
0xFE, 0x63, 0x19, 0xFC, /* 0x7A z */
|
||||||
|
0x1C, 0xC3, 0x38, 0x30, 0xC1, 0xC0, /* 0x7B braceleft */
|
||||||
|
0xFC, 0xFC, /* 0x7C bar */
|
||||||
|
0xE0, 0xC3, 0x07, 0x30, 0xCE, 0x00, /* 0x7D braceright */
|
||||||
|
0x77, 0xB8, /* 0x7E asciitilde */
|
||||||
|
0x10, 0x71, 0xB6, 0x3C, 0x7F, 0xC0 /* 0x7F uni007F */
|
||||||
|
};
|
||||||
|
|
||||||
|
const GFXglyph IBM8x8pxGlyphs[] PROGMEM = {
|
||||||
|
{ 0, 1, 1, 2, 0, -1 }, /* 0x20 space */
|
||||||
|
{ 1, 4, 7, 5, 0, -7 }, /* 0x21 exclam */
|
||||||
|
{ 5, 5, 3, 6, 0, -7 }, /* 0x22 quotedbl */
|
||||||
|
{ 7, 7, 7, 8, 0, -7 }, /* 0x23 numbersign */
|
||||||
|
{ 14, 6, 7, 7, 0, -7 }, /* 0x24 dollar */
|
||||||
|
{ 20, 7, 6, 8, 0, -6 }, /* 0x25 percent */
|
||||||
|
{ 26, 7, 7, 8, 0, -7 }, /* 0x26 ampersand */
|
||||||
|
{ 33, 3, 3, 4, 0, -7 }, /* 0x27 quotesingle */
|
||||||
|
{ 35, 4, 7, 5, 0, -7 }, /* 0x28 parenleft */
|
||||||
|
{ 39, 4, 7, 5, 0, -7 }, /* 0x29 parenright */
|
||||||
|
{ 43, 8, 5, 9, 0, -6 }, /* 0x2A asterisk */
|
||||||
|
{ 48, 6, 5, 7, 0, -6 }, /* 0x2B plus */
|
||||||
|
{ 52, 3, 3, 4, 0, -2 }, /* 0x2C comma */
|
||||||
|
{ 54, 6, 1, 7, 0, -4 }, /* 0x2D hyphen */
|
||||||
|
{ 55, 2, 2, 3, 0, -2 }, /* 0x2E period */
|
||||||
|
{ 56, 7, 7, 8, 0, -7 }, /* 0x2F slash */
|
||||||
|
{ 63, 7, 7, 8, 0, -7 }, /* 0x30 zero */
|
||||||
|
{ 70, 6, 7, 7, 0, -7 }, /* 0x31 one */
|
||||||
|
{ 76, 6, 7, 7, 0, -7 }, /* 0x32 two */
|
||||||
|
{ 82, 6, 7, 7, 0, -7 }, /* 0x33 three */
|
||||||
|
{ 88, 7, 7, 8, 0, -7 }, /* 0x34 four */
|
||||||
|
{ 95, 6, 7, 7, 0, -7 }, /* 0x35 five */
|
||||||
|
{ 101, 6, 7, 7, 0, -7 }, /* 0x36 six */
|
||||||
|
{ 107, 6, 7, 7, 0, -7 }, /* 0x37 seven */
|
||||||
|
{ 113, 6, 7, 7, 0, -7 }, /* 0x38 eight */
|
||||||
|
{ 119, 6, 7, 7, 0, -7 }, /* 0x39 nine */
|
||||||
|
{ 125, 2, 6, 3, 0, -6 }, /* 0x3A colon */
|
||||||
|
{ 127, 3, 6, 4, 0, -6 }, /* 0x3B semicolon */
|
||||||
|
{ 130, 5, 7, 6, 0, -7 }, /* 0x3C less */
|
||||||
|
{ 135, 6, 4, 7, 0, -5 }, /* 0x3D equal */
|
||||||
|
{ 138, 5, 7, 6, 0, -7 }, /* 0x3E greater */
|
||||||
|
{ 143, 6, 7, 7, 0, -7 }, /* 0x3F question */
|
||||||
|
{ 149, 7, 7, 8, 0, -7 }, /* 0x40 at */
|
||||||
|
{ 156, 6, 7, 7, 0, -7 }, /* 0x41 A */
|
||||||
|
{ 162, 7, 7, 8, 0, -7 }, /* 0x42 B */
|
||||||
|
{ 169, 7, 7, 8, 0, -7 }, /* 0x43 C */
|
||||||
|
{ 176, 7, 7, 8, 0, -7 }, /* 0x44 D */
|
||||||
|
{ 183, 7, 7, 8, 0, -7 }, /* 0x45 E */
|
||||||
|
{ 190, 7, 7, 8, 0, -7 }, /* 0x46 F */
|
||||||
|
{ 197, 7, 7, 8, 0, -7 }, /* 0x47 G */
|
||||||
|
{ 204, 6, 7, 7, 0, -7 }, /* 0x48 H */
|
||||||
|
{ 210, 4, 7, 5, 0, -7 }, /* 0x49 I */
|
||||||
|
{ 214, 7, 7, 8, 0, -7 }, /* 0x4A J */
|
||||||
|
{ 221, 7, 7, 8, 0, -7 }, /* 0x4B K */
|
||||||
|
{ 228, 7, 7, 8, 0, -7 }, /* 0x4C L */
|
||||||
|
{ 235, 7, 7, 8, 0, -7 }, /* 0x4D M */
|
||||||
|
{ 242, 7, 7, 8, 0, -7 }, /* 0x4E N */
|
||||||
|
{ 249, 7, 7, 8, 0, -7 }, /* 0x4F O */
|
||||||
|
{ 256, 7, 7, 8, 0, -7 }, /* 0x50 P */
|
||||||
|
{ 263, 6, 7, 7, 0, -7 }, /* 0x51 Q */
|
||||||
|
{ 269, 7, 7, 8, 0, -7 }, /* 0x52 R */
|
||||||
|
{ 276, 6, 7, 7, 0, -7 }, /* 0x53 S */
|
||||||
|
{ 282, 6, 7, 7, 0, -7 }, /* 0x54 T */
|
||||||
|
{ 288, 6, 7, 7, 0, -7 }, /* 0x55 U */
|
||||||
|
{ 294, 6, 7, 7, 0, -7 }, /* 0x56 V */
|
||||||
|
{ 300, 7, 7, 8, 0, -7 }, /* 0x57 W */
|
||||||
|
{ 307, 7, 7, 8, 0, -7 }, /* 0x58 X */
|
||||||
|
{ 314, 6, 7, 7, 0, -7 }, /* 0x59 Y */
|
||||||
|
{ 320, 7, 7, 8, 0, -7 }, /* 0x5A Z */
|
||||||
|
{ 327, 4, 7, 5, 0, -7 }, /* 0x5B bracketleft */
|
||||||
|
{ 331, 7, 7, 8, 0, -7 }, /* 0x5C backslash */
|
||||||
|
{ 338, 4, 7, 5, 0, -7 }, /* 0x5D bracketright */
|
||||||
|
{ 342, 7, 4, 8, 0, -7 }, /* 0x5E asciicircum */
|
||||||
|
{ 346, 8, 1, 9, 0, 0 }, /* 0x5F underscore */
|
||||||
|
{ 347, 3, 3, 4, 0, -7 }, /* 0x60 grave */
|
||||||
|
{ 349, 7, 5, 8, 0, -5 }, /* 0x61 a */
|
||||||
|
{ 354, 7, 7, 8, 0, -7 }, /* 0x62 b */
|
||||||
|
{ 361, 6, 5, 7, 0, -5 }, /* 0x63 c */
|
||||||
|
{ 365, 7, 7, 8, 0, -7 }, /* 0x64 d */
|
||||||
|
{ 372, 6, 5, 7, 0, -5 }, /* 0x65 e */
|
||||||
|
{ 376, 6, 7, 7, 0, -7 }, /* 0x66 f */
|
||||||
|
{ 382, 7, 6, 8, 0, -5 }, /* 0x67 g */
|
||||||
|
{ 388, 7, 7, 8, 0, -7 }, /* 0x68 h */
|
||||||
|
{ 395, 4, 7, 5, 0, -7 }, /* 0x69 i */
|
||||||
|
{ 399, 6, 8, 7, 0, -7 }, /* 0x6A j */
|
||||||
|
{ 405, 7, 7, 8, 0, -7 }, /* 0x6B k */
|
||||||
|
{ 412, 4, 7, 5, 0, -7 }, /* 0x6C l */
|
||||||
|
{ 416, 7, 5, 8, 0, -5 }, /* 0x6D m */
|
||||||
|
{ 421, 6, 5, 7, 0, -5 }, /* 0x6E n */
|
||||||
|
{ 425, 6, 5, 7, 0, -5 }, /* 0x6F o */
|
||||||
|
{ 429, 7, 6, 8, 0, -5 }, /* 0x70 p */
|
||||||
|
{ 435, 7, 6, 8, 0, -5 }, /* 0x71 q */
|
||||||
|
{ 441, 7, 5, 8, 0, -5 }, /* 0x72 r */
|
||||||
|
{ 446, 6, 5, 7, 0, -5 }, /* 0x73 s */
|
||||||
|
{ 450, 5, 7, 6, 0, -7 }, /* 0x74 t */
|
||||||
|
{ 455, 7, 5, 8, 0, -5 }, /* 0x75 u */
|
||||||
|
{ 460, 6, 5, 7, 0, -5 }, /* 0x76 v */
|
||||||
|
{ 464, 7, 5, 8, 0, -5 }, /* 0x77 w */
|
||||||
|
{ 469, 7, 5, 8, 0, -5 }, /* 0x78 x */
|
||||||
|
{ 474, 6, 6, 7, 0, -5 }, /* 0x79 y */
|
||||||
|
{ 479, 6, 5, 7, 0, -5 }, /* 0x7A z */
|
||||||
|
{ 483, 6, 7, 7, 0, -7 }, /* 0x7B braceleft */
|
||||||
|
{ 489, 2, 7, 3, 0, -7 }, /* 0x7C bar */
|
||||||
|
{ 491, 6, 7, 7, 0, -7 }, /* 0x7D braceright */
|
||||||
|
{ 497, 7, 2, 8, 0, -7 }, /* 0x7E asciitilde */
|
||||||
|
{ 499, 7, 6, 8, 0, -6 } /* 0x7F uni007F */
|
||||||
|
};
|
||||||
|
|
||||||
|
const GFXfont IBM8x8px PROGMEM = {
|
||||||
|
(uint8_t *)IBM8x8pxBitmaps,
|
||||||
|
(GFXglyph *)IBM8x8pxGlyphs,
|
||||||
|
0x20, 0x7F, 8 };
|
||||||
485
lib/obp60task/fonts/Ubuntu_Bold10pt8b.h
Normal file
485
lib/obp60task/fonts/Ubuntu_Bold10pt8b.h
Normal file
@@ -0,0 +1,485 @@
|
|||||||
|
const uint8_t Ubuntu_Bold10pt8bBitmaps[] PROGMEM = {
|
||||||
|
0x00, 0xFF, 0xFF, 0xFF, 0xE3, 0xFF, 0xC0, 0xEF, 0xDF, 0xBF, 0x7E, 0xFD,
|
||||||
|
0xC0, 0x0E, 0xE0, 0xEE, 0x1D, 0xCF, 0xFF, 0xFF, 0xF1, 0xDC, 0x1D, 0xC3,
|
||||||
|
0xB8, 0xFF, 0xFF, 0xFF, 0x3B, 0x83, 0xB8, 0x77, 0x07, 0x70, 0x1C, 0x0E,
|
||||||
|
0x0F, 0xCF, 0xEE, 0x07, 0x03, 0x81, 0xFC, 0x7F, 0x0F, 0xC0, 0xE0, 0x74,
|
||||||
|
0x3F, 0xF9, 0xF8, 0x38, 0x1C, 0x00, 0x38, 0x38, 0x7C, 0x70, 0xC6, 0x70,
|
||||||
|
0xC6, 0xE0, 0xC6, 0xE0, 0xC7, 0xC0, 0x7D, 0xDC, 0x3B, 0xBE, 0x03, 0xE3,
|
||||||
|
0x07, 0x63, 0x07, 0x63, 0x0E, 0x63, 0x0E, 0x3E, 0x1C, 0x1C, 0x1E, 0x01,
|
||||||
|
0xF8, 0x1F, 0xE0, 0xE7, 0x07, 0x38, 0x1F, 0x80, 0xF8, 0x0F, 0xCE, 0xEF,
|
||||||
|
0x77, 0x3F, 0x38, 0xF9, 0xFF, 0xC7, 0xFF, 0x1F, 0xBC, 0xFF, 0xFF, 0xC0,
|
||||||
|
0x08, 0x73, 0x8E, 0x71, 0xCE, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x87, 0x1C,
|
||||||
|
0x38, 0xE1, 0xC2, 0x43, 0x87, 0x1C, 0x38, 0xE1, 0xC7, 0x1C, 0x71, 0xC7,
|
||||||
|
0x1C, 0x73, 0x8E, 0x71, 0xCE, 0x10, 0x1C, 0x0E, 0x17, 0x5F, 0xFF, 0xF9,
|
||||||
|
0xB1, 0xDC, 0x6C, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0x77, 0x77, 0xEE, 0xFF, 0xFF,
|
||||||
|
0xC0, 0x6F, 0xF6, 0x01, 0xC0, 0xE0, 0x38, 0x0E, 0x07, 0x01, 0xC0, 0x70,
|
||||||
|
0x38, 0x0E, 0x03, 0x81, 0xC0, 0x70, 0x1C, 0x0E, 0x03, 0x80, 0xE0, 0x70,
|
||||||
|
0x1C, 0x07, 0x03, 0x80, 0x1C, 0x3F, 0x9F, 0xDE, 0xFE, 0x3F, 0x1F, 0x8F,
|
||||||
|
0xC7, 0xE3, 0xF1, 0xFD, 0xEF, 0xE7, 0xF0, 0xE0, 0x0E, 0x3D, 0xFF, 0xF6,
|
||||||
|
0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC0, 0x3E, 0x7F, 0xBF,
|
||||||
|
0xEC, 0x70, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0xFF, 0xFF,
|
||||||
|
0xFC, 0x3C, 0x7F, 0x3F, 0xC8, 0xE0, 0x70, 0x30, 0xF0, 0x7E, 0x07, 0x81,
|
||||||
|
0xE0, 0xFF, 0xFF, 0xF3, 0xF0, 0x07, 0x07, 0x87, 0xC3, 0xE3, 0xF3, 0xB9,
|
||||||
|
0x9D, 0xCE, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0x70, 0x38, 0x3F, 0x1F, 0x8F,
|
||||||
|
0xC7, 0x03, 0x83, 0xF1, 0xFC, 0xFF, 0x07, 0x81, 0xC0, 0xFF, 0xFF, 0xF3,
|
||||||
|
0xE0, 0x07, 0x0F, 0x8F, 0xCF, 0x07, 0x07, 0xF3, 0xFD, 0xFF, 0xE3, 0xF1,
|
||||||
|
0xF8, 0xEF, 0xF7, 0xF1, 0xF0, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0x70,
|
||||||
|
0x70, 0x38, 0x38, 0x1C, 0x0E, 0x0E, 0x07, 0x03, 0x80, 0x3E, 0x3F, 0xBF,
|
||||||
|
0xFC, 0x7E, 0x3F, 0xB9, 0xF8, 0xFE, 0xE7, 0xF1, 0xF8, 0xFF, 0xF7, 0xF1,
|
||||||
|
0xF0, 0x3E, 0x3F, 0xBF, 0xDC, 0x7E, 0x3F, 0x1F, 0xFE, 0xFF, 0x3F, 0x83,
|
||||||
|
0xC3, 0xCF, 0xC7, 0xC3, 0x80, 0x6F, 0xF6, 0x00, 0x06, 0xFF, 0x60, 0x33,
|
||||||
|
0xDE, 0x60, 0x00, 0x00, 0x73, 0x9C, 0xEE, 0x70, 0x01, 0x87, 0xEF, 0xFF,
|
||||||
|
0xF8, 0xE0, 0x3F, 0x8F, 0xFC, 0x7E, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xE0,
|
||||||
|
0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x60, 0x3E, 0x3F, 0xE3, 0xF0, 0x38, 0xFF,
|
||||||
|
0xFE, 0xF8, 0x60, 0x00, 0x7C, 0xFE, 0xFF, 0x07, 0x07, 0x07, 0x0E, 0x1E,
|
||||||
|
0x3C, 0x38, 0x38, 0x00, 0x30, 0x78, 0x78, 0x30, 0x03, 0xF0, 0x07, 0xFE,
|
||||||
|
0x0F, 0x03, 0x86, 0x00, 0xE6, 0x1F, 0xB7, 0x3F, 0xCF, 0x3C, 0xE7, 0x9C,
|
||||||
|
0x73, 0xCE, 0x39, 0xE7, 0x1C, 0xF3, 0xCE, 0x5C, 0xFF, 0xE6, 0x3F, 0xE3,
|
||||||
|
0x80, 0x00, 0xF0, 0x00, 0x3F, 0xE0, 0x07, 0xF8, 0x00, 0x03, 0x80, 0x0F,
|
||||||
|
0x80, 0x1F, 0x00, 0x77, 0x00, 0xEE, 0x03, 0xDE, 0x07, 0x1C, 0x1E, 0x3C,
|
||||||
|
0x3F, 0xF8, 0x7F, 0xF1, 0xFF, 0xF3, 0x80, 0xE7, 0x01, 0xDC, 0x01, 0xC0,
|
||||||
|
0xFE, 0x3F, 0xCF, 0xFB, 0x8E, 0xE3, 0xBF, 0xCF, 0xF3, 0xFE, 0xE1, 0xF8,
|
||||||
|
0x7E, 0x1F, 0xFF, 0xFF, 0xBF, 0x80, 0x0F, 0xC7, 0xFD, 0xFF, 0xBC, 0x2F,
|
||||||
|
0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1E, 0x01, 0xE0, 0x3F, 0xF3, 0xFE,
|
||||||
|
0x1F, 0x80, 0xFF, 0x0F, 0xFC, 0xFF, 0xEE, 0x1E, 0xE0, 0xFE, 0x07, 0xE0,
|
||||||
|
0x7E, 0x07, 0xE0, 0x7E, 0x0F, 0xE1, 0xEF, 0xFE, 0xFF, 0xCF, 0xF0, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFC, 0x0E, 0x07, 0xFB, 0xFD, 0xFE, 0xE0, 0x70, 0x38, 0x1F,
|
||||||
|
0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xFE, 0xFE, 0xFE, 0xE0,
|
||||||
|
0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x0F, 0xC7, 0xFD, 0xFF, 0xBC, 0x2F, 0x01,
|
||||||
|
0xC0, 0x38, 0x07, 0x07, 0xE0, 0xFE, 0x1D, 0xE3, 0xBF, 0xF3, 0xFE, 0x1F,
|
||||||
|
0x80, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xC0, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xC0, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07,
|
||||||
|
0x03, 0x81, 0xD1, 0xEF, 0xFF, 0xF3, 0xF0, 0xE0, 0xFE, 0x1E, 0xE3, 0xCE,
|
||||||
|
0x78, 0xEF, 0x0F, 0xE0, 0xFC, 0x0F, 0xC0, 0xEE, 0x0E, 0x70, 0xE7, 0x8E,
|
||||||
|
0x3C, 0xE1, 0xEE, 0x0F, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81,
|
||||||
|
0xC0, 0xE0, 0x70, 0x38, 0x1F, 0xFF, 0xFF, 0xFC, 0x70, 0x1C, 0xF0, 0x79,
|
||||||
|
0xE0, 0xF3, 0xE3, 0xE7, 0xC7, 0xDD, 0x8D, 0xFB, 0xBB, 0xF3, 0x67, 0xE7,
|
||||||
|
0xCF, 0xCF, 0x9F, 0x8E, 0x3F, 0x1C, 0x7E, 0x00, 0xFC, 0x01, 0xC0, 0xE0,
|
||||||
|
0xFE, 0x1F, 0xC3, 0xFC, 0x7F, 0xCF, 0xD9, 0xFB, 0xBF, 0x3F, 0xE7, 0xFC,
|
||||||
|
0x7F, 0x87, 0xF0, 0xFE, 0x0F, 0xC1, 0xC0, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF,
|
||||||
|
0x9E, 0x1E, 0xF0, 0x3F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0,
|
||||||
|
0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0, 0x3F, 0x00, 0xFE, 0x3F, 0xEF, 0xFF,
|
||||||
|
0x87, 0xE1, 0xF8, 0x7F, 0xFF, 0xFE, 0xFE, 0x38, 0x0E, 0x03, 0x80, 0xE0,
|
||||||
|
0x38, 0x00, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF, 0x9E, 0x1E, 0xF0, 0x3F, 0x80,
|
||||||
|
0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F,
|
||||||
|
0xF0, 0x3F, 0x00, 0x3C, 0x00, 0x7E, 0x00, 0x78, 0xFE, 0x1F, 0xF3, 0xFF,
|
||||||
|
0x70, 0xEE, 0x1D, 0xC3, 0xBF, 0xF7, 0xFC, 0xFF, 0x1C, 0xF3, 0x8E, 0x70,
|
||||||
|
0xEE, 0x1D, 0xC1, 0xC0, 0x3F, 0x1F, 0xEF, 0xFB, 0x80, 0xE0, 0x3E, 0x07,
|
||||||
|
0xF0, 0x7E, 0x03, 0xC0, 0x74, 0x1F, 0xFF, 0xFF, 0x9F, 0xC0, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0x87, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0,
|
||||||
|
0x38, 0x07, 0x00, 0xE0, 0x1C, 0x00, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E,
|
||||||
|
0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0xC7, 0xBF, 0xE7, 0xFC,
|
||||||
|
0x3E, 0x00, 0xE0, 0x0E, 0xE0, 0x39, 0xC0, 0x71, 0xC1, 0xC3, 0x83, 0x87,
|
||||||
|
0x07, 0x07, 0x1C, 0x0E, 0x38, 0x0E, 0xE0, 0x1D, 0xC0, 0x1F, 0x00, 0x3E,
|
||||||
|
0x00, 0x7C, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xFC, 0x1C, 0x1D, 0xC3, 0x87,
|
||||||
|
0x38, 0x78, 0xE7, 0x1F, 0x1C, 0xE3, 0x63, 0x8E, 0x6C, 0xE1, 0xDD, 0xDC,
|
||||||
|
0x3B, 0xBB, 0x83, 0x63, 0x60, 0x7C, 0x7C, 0x0F, 0x8F, 0x81, 0xE0, 0xF0,
|
||||||
|
0x1C, 0x1C, 0x00, 0xF0, 0x3D, 0xE1, 0xE3, 0x87, 0x07, 0x38, 0x1F, 0xE0,
|
||||||
|
0x3F, 0x00, 0x78, 0x01, 0xE0, 0x0F, 0xC0, 0x7F, 0x81, 0xCE, 0x0E, 0x1C,
|
||||||
|
0x78, 0x7B, 0xC0, 0xF0, 0xE0, 0x3B, 0x83, 0x9C, 0x1C, 0x71, 0xC3, 0xDE,
|
||||||
|
0x0E, 0xE0, 0x3E, 0x01, 0xF0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00,
|
||||||
|
0x70, 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFC, 0x0E, 0x07, 0x03, 0x80, 0xE0,
|
||||||
|
0x70, 0x38, 0x1E, 0x07, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xCE,
|
||||||
|
0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0xFF, 0xF0, 0xE0, 0x1C,
|
||||||
|
0x07, 0x01, 0xC0, 0x38, 0x0E, 0x03, 0x80, 0x70, 0x1C, 0x07, 0x00, 0xE0,
|
||||||
|
0x38, 0x0E, 0x01, 0xC0, 0x70, 0x1C, 0x03, 0x80, 0xE0, 0x38, 0x07, 0xFF,
|
||||||
|
0xFE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x3F, 0xFF, 0xF0,
|
||||||
|
0x0E, 0x03, 0xE0, 0x7C, 0x1D, 0xC7, 0xBC, 0xE3, 0xB8, 0x3B, 0x06, 0xFF,
|
||||||
|
0xFF, 0xF0, 0x47, 0x1E, 0x20, 0x7E, 0x3F, 0x9F, 0xE0, 0x73, 0xFB, 0xFF,
|
||||||
|
0x8F, 0xC7, 0xFF, 0xBF, 0xCF, 0xE0, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0,
|
||||||
|
0x3F, 0xCF, 0xFB, 0xFE, 0xE3, 0xF8, 0x7E, 0x1F, 0x87, 0xE3, 0xFF, 0xEF,
|
||||||
|
0xFB, 0xF8, 0x1F, 0x3F, 0x7F, 0xF0, 0xE0, 0xE0, 0xE0, 0xF0, 0x7F, 0x7F,
|
||||||
|
0x1F, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC7, 0xF7, 0xFD, 0xFF, 0xF1,
|
||||||
|
0xF8, 0x7E, 0x1F, 0x87, 0xF1, 0xDF, 0xF7, 0xFC, 0x7F, 0x1F, 0x1F, 0xE7,
|
||||||
|
0xFF, 0x87, 0xFF, 0xFF, 0xFE, 0x03, 0xC0, 0x7F, 0x9F, 0xE1, 0xF8, 0x3F,
|
||||||
|
0x7E, 0xFE, 0xE0, 0xE0, 0xFE, 0xFE, 0xFE, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
|
||||||
|
0xE0, 0xE0, 0xE0, 0x1F, 0xDF, 0xF7, 0xFF, 0xC7, 0xE1, 0xF8, 0x7F, 0x1F,
|
||||||
|
0xFF, 0x7F, 0xCF, 0xF0, 0x1C, 0x0F, 0x7F, 0x9F, 0xE7, 0xE0, 0xE0, 0x38,
|
||||||
|
0x0E, 0x03, 0x80, 0xE0, 0x3F, 0xCF, 0xFB, 0xFF, 0xE3, 0xF8, 0x7E, 0x1F,
|
||||||
|
0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0x1C, 0x71, 0xC7, 0x00, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7,
|
||||||
|
0x1F, 0xFF, 0xBC, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC3, 0xB8,
|
||||||
|
0xE7, 0x38, 0xEE, 0x1F, 0x83, 0xF8, 0x77, 0x8E, 0x79, 0xC7, 0x38, 0x77,
|
||||||
|
0x07, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x7F, 0xE7, 0xFE,
|
||||||
|
0xF9, 0xFF, 0xFB, 0xFF, 0xFF, 0x1C, 0x7E, 0x38, 0xFC, 0x71, 0xF8, 0xE3,
|
||||||
|
0xF1, 0xC7, 0xE3, 0x8F, 0xC7, 0x1F, 0x8E, 0x38, 0xFF, 0x3F, 0xEF, 0xFF,
|
||||||
|
0x8F, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1C, 0x1E, 0x1F,
|
||||||
|
0xE7, 0xFB, 0xCF, 0xE1, 0xF8, 0x7E, 0x1F, 0xCF, 0x7F, 0x9F, 0xE1, 0xE0,
|
||||||
|
0xFE, 0x3F, 0xEF, 0xFB, 0x8F, 0xE1, 0xF8, 0x7E, 0x1F, 0x8F, 0xFF, 0xBF,
|
||||||
|
0xEF, 0xF3, 0x80, 0xE0, 0x38, 0x0E, 0x00, 0x1F, 0xDF, 0xF7, 0xFF, 0xC7,
|
||||||
|
0xE1, 0xF8, 0x7E, 0x1F, 0xC7, 0x7F, 0xDF, 0xF3, 0xFC, 0x07, 0x01, 0xC0,
|
||||||
|
0x70, 0x1C, 0x7F, 0xFF, 0xFF, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x80,
|
||||||
|
0x3E, 0xFE, 0xE0, 0xE0, 0xF8, 0x7E, 0x1F, 0x07, 0x87, 0xFF, 0xFC, 0xE1,
|
||||||
|
0xC3, 0x87, 0xFF, 0xFF, 0xF8, 0x70, 0xE1, 0xC3, 0x87, 0xF7, 0xE7, 0xC0,
|
||||||
|
0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0xC7, 0xFF, 0xDF,
|
||||||
|
0xF3, 0xFC, 0xE0, 0xFE, 0x1D, 0xC7, 0x38, 0xE7, 0xBC, 0x77, 0x0E, 0xE1,
|
||||||
|
0xFC, 0x1F, 0x03, 0xE0, 0x38, 0x00, 0xE3, 0x8F, 0xC7, 0x1D, 0x8E, 0x33,
|
||||||
|
0x9E, 0xE7, 0x7D, 0xCE, 0xDB, 0x8D, 0xB6, 0x1F, 0x7C, 0x3C, 0x78, 0x38,
|
||||||
|
0xE0, 0x71, 0xC0, 0xF1, 0xEF, 0x78, 0xEE, 0x1F, 0xC1, 0xF0, 0x1C, 0x07,
|
||||||
|
0xC1, 0xFC, 0x3B, 0x8F, 0x7B, 0xC7, 0x80, 0xE0, 0xFC, 0x1D, 0xC7, 0x38,
|
||||||
|
0xE7, 0x1C, 0x77, 0x0E, 0xE1, 0xFC, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x0F,
|
||||||
|
0xE1, 0xF8, 0x3E, 0x00, 0xFF, 0xFF, 0xFF, 0x0E, 0x1C, 0x38, 0x38, 0x70,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x0E, 0x3C, 0xF9, 0xC3, 0x87, 0x0E, 0x1C, 0x79, 0xE3,
|
||||||
|
0xC7, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x7C, 0xF8, 0x70, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xE1, 0xE3, 0xE1, 0xC3, 0x87, 0x0E, 0x1C,
|
||||||
|
0x3C, 0x3C, 0x79, 0xF3, 0x87, 0x0E, 0x1C, 0x39, 0xF3, 0xE7, 0x00, 0x30,
|
||||||
|
0x9F, 0x3F, 0xFF, 0x3E, 0x43, 0x00, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81,
|
||||||
|
0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x00, 0xFF, 0xF1,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF8, 0x1C, 0x1C, 0x1C, 0x3F, 0x7F, 0x7F, 0xF0, 0xE0,
|
||||||
|
0xE0, 0xF0, 0xFF, 0x7F, 0x3F, 0x1C, 0x1C, 0x1C, 0x0F, 0x87, 0xF3, 0xFC,
|
||||||
|
0xF0, 0x38, 0x0E, 0x0F, 0xF3, 0xFC, 0xFF, 0x0E, 0x03, 0x80, 0xFF, 0x3F,
|
||||||
|
0xDF, 0xF0, 0x40, 0xBF, 0xF7, 0xF9, 0xCE, 0x61, 0x98, 0x67, 0x39, 0xFE,
|
||||||
|
0xFF, 0xD0, 0x20, 0xE0, 0xEE, 0x39, 0xC7, 0x1D, 0xC3, 0xB8, 0x3E, 0x1F,
|
||||||
|
0xF3, 0xFE, 0x0E, 0x01, 0xC1, 0xFF, 0x3F, 0xE0, 0xE0, 0x1C, 0x00, 0xFF,
|
||||||
|
0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x3E, 0x7F, 0xFF, 0xE0, 0xE0,
|
||||||
|
0x7C, 0xFE, 0xEF, 0xE7, 0xE7, 0xF7, 0x7E, 0x1E, 0x07, 0x07, 0xFF, 0xFF,
|
||||||
|
0x7C, 0xEF, 0xDF, 0xB8, 0x0F, 0xC0, 0x7F, 0x83, 0x87, 0x18, 0x06, 0xE7,
|
||||||
|
0xDF, 0x3F, 0x3C, 0xC0, 0xF3, 0x03, 0xCF, 0xCF, 0x9F, 0x76, 0x01, 0x8E,
|
||||||
|
0x1C, 0x1F, 0xE0, 0x3F, 0x00, 0x7C, 0xFC, 0x19, 0xFF, 0xF8, 0xFF, 0xBF,
|
||||||
|
0x10, 0x8E, 0x77, 0xBD, 0xCE, 0xF7, 0x9C, 0xE7, 0xBC, 0xE7, 0x10, 0x80,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0xFF, 0xFF, 0xC0,
|
||||||
|
0x0F, 0xC0, 0x7F, 0x83, 0x87, 0x18, 0x06, 0xEF, 0x9F, 0x33, 0x3C, 0xFC,
|
||||||
|
0xF3, 0xE3, 0xCD, 0xCF, 0xB3, 0x76, 0x01, 0x8E, 0x1C, 0x1F, 0xE0, 0x3F,
|
||||||
|
0x00, 0xFF, 0xF0, 0x7B, 0xFC, 0xF3, 0xFD, 0xE0, 0x0E, 0x01, 0xC0, 0x38,
|
||||||
|
0x07, 0x0F, 0xFF, 0xFF, 0xFF, 0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00,
|
||||||
|
0x0F, 0xFF, 0xFF, 0xFF, 0xF8, 0x7B, 0xF0, 0xC7, 0x31, 0x8F, 0xFF, 0x7B,
|
||||||
|
0xF0, 0xCF, 0x3C, 0x3F, 0xFE, 0x11, 0xFC, 0x80, 0xE1, 0xF8, 0x7E, 0x1F,
|
||||||
|
0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE0,
|
||||||
|
0x38, 0x0E, 0x00, 0x1F, 0xF7, 0xFF, 0xFE, 0x7F, 0xE7, 0xFE, 0x7F, 0xE7,
|
||||||
|
0xFE, 0x77, 0xE7, 0x1E, 0x70, 0xE7, 0x0E, 0x70, 0xE7, 0x0E, 0x70, 0xE7,
|
||||||
|
0x0E, 0x70, 0xE7, 0x0E, 0x70, 0xE7, 0x6F, 0xF6, 0x63, 0xBF, 0x37, 0xFB,
|
||||||
|
0x33, 0x33, 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x42, 0x39,
|
||||||
|
0xCF, 0x79, 0xCE, 0x7B, 0xDC, 0xEF, 0x7B, 0x9C, 0x42, 0x00, 0x30, 0x30,
|
||||||
|
0x70, 0x70, 0xF0, 0x60, 0xB0, 0xE0, 0x31, 0xC0, 0x31, 0xC0, 0x33, 0x8E,
|
||||||
|
0x33, 0x9E, 0x07, 0x36, 0x07, 0x26, 0x0E, 0x7F, 0x0E, 0x7F, 0x1C, 0x06,
|
||||||
|
0x1C, 0x06, 0x30, 0x30, 0xE0, 0xE3, 0xC1, 0x85, 0x87, 0x03, 0x1C, 0x06,
|
||||||
|
0x38, 0x0C, 0xEF, 0x19, 0xFF, 0x07, 0x06, 0x0E, 0x1C, 0x38, 0x60, 0x71,
|
||||||
|
0x81, 0xC7, 0xE3, 0x8F, 0xC0, 0x78, 0x0C, 0x7E, 0x0E, 0x03, 0x06, 0x07,
|
||||||
|
0x87, 0x03, 0xC7, 0x00, 0x63, 0x83, 0xF3, 0x9D, 0xF1, 0xDE, 0x01, 0xDB,
|
||||||
|
0x00, 0xE9, 0x80, 0xEF, 0xE0, 0x77, 0xF0, 0x70, 0x30, 0x38, 0x18, 0x0C,
|
||||||
|
0x1E, 0x1E, 0x0C, 0x00, 0x1C, 0x1C, 0x3C, 0x78, 0x70, 0xE0, 0xE0, 0xFF,
|
||||||
|
0x7F, 0x3E, 0x02, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x04, 0x00, 0x00, 0x00,
|
||||||
|
0x70, 0x01, 0xF0, 0x03, 0xE0, 0x0E, 0xE0, 0x1D, 0xC0, 0x7B, 0xC0, 0xE3,
|
||||||
|
0x83, 0xC7, 0x87, 0xFF, 0x0F, 0xFE, 0x3F, 0xFE, 0x70, 0x1C, 0xE0, 0x3B,
|
||||||
|
0x80, 0x38, 0x00, 0x80, 0x03, 0x80, 0x1E, 0x00, 0x10, 0x00, 0x00, 0x00,
|
||||||
|
0x70, 0x01, 0xF0, 0x03, 0xE0, 0x0E, 0xE0, 0x1D, 0xC0, 0x7B, 0xC0, 0xE3,
|
||||||
|
0x83, 0xC7, 0x87, 0xFF, 0x0F, 0xFE, 0x3F, 0xFE, 0x70, 0x1C, 0xE0, 0x3B,
|
||||||
|
0x80, 0x38, 0x01, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x77, 0x00, 0x44, 0x00,
|
||||||
|
0x00, 0x00, 0xE0, 0x03, 0xE0, 0x07, 0xC0, 0x1D, 0xC0, 0x3B, 0x80, 0xF7,
|
||||||
|
0x81, 0xC7, 0x07, 0x8F, 0x0F, 0xFE, 0x1F, 0xFC, 0x7F, 0xFC, 0xE0, 0x39,
|
||||||
|
0xC0, 0x77, 0x00, 0x70, 0x06, 0x40, 0x1F, 0xC0, 0x13, 0x00, 0x00, 0x00,
|
||||||
|
0x38, 0x00, 0xF8, 0x01, 0xF0, 0x07, 0x70, 0x0E, 0xE0, 0x3D, 0xE0, 0x71,
|
||||||
|
0xC1, 0xE3, 0xC3, 0xFF, 0x87, 0xFF, 0x1F, 0xFF, 0x38, 0x0E, 0x70, 0x1D,
|
||||||
|
0xC0, 0x1C, 0x0E, 0xE0, 0x1D, 0xC0, 0x3B, 0x80, 0x00, 0x00, 0x38, 0x00,
|
||||||
|
0xF8, 0x01, 0xF0, 0x07, 0x70, 0x0E, 0xE0, 0x3D, 0xE0, 0x71, 0xC1, 0xE3,
|
||||||
|
0xC3, 0xFF, 0x87, 0xFF, 0x1F, 0xFF, 0x38, 0x0E, 0x70, 0x1D, 0xC0, 0x1C,
|
||||||
|
0x03, 0x80, 0x0D, 0x80, 0x1B, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x03,
|
||||||
|
0xF8, 0x07, 0x70, 0x0E, 0xE0, 0x38, 0xE0, 0x71, 0xC1, 0xE3, 0xC3, 0xFF,
|
||||||
|
0x87, 0xFF, 0x1F, 0xFF, 0x38, 0x0E, 0x70, 0x1D, 0xC0, 0x1C, 0x00, 0x7F,
|
||||||
|
0xE0, 0x1F, 0xFC, 0x07, 0xFF, 0x80, 0xFC, 0x00, 0x3B, 0x80, 0x0E, 0x7F,
|
||||||
|
0x81, 0xCF, 0xF0, 0x71, 0xFE, 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0xFF, 0xE0,
|
||||||
|
0x1C, 0x1F, 0xF7, 0x03, 0xFF, 0xC0, 0x7F, 0xC0, 0x0F, 0xC7, 0xFD, 0xFF,
|
||||||
|
0xBC, 0x2F, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1E, 0x01, 0xE0, 0x3F,
|
||||||
|
0xF3, 0xFE, 0x1F, 0x81, 0x80, 0x18, 0x0F, 0x01, 0xC0, 0x10, 0x1C, 0x07,
|
||||||
|
0x80, 0x80, 0x07, 0xFF, 0xFF, 0xFF, 0xE0, 0x70, 0x3F, 0xDF, 0xEF, 0xF7,
|
||||||
|
0x03, 0x81, 0xC0, 0xFF, 0xFF, 0xFF, 0xE0, 0x04, 0x07, 0x0F, 0x02, 0x00,
|
||||||
|
0x07, 0xFF, 0xFF, 0xFF, 0xE0, 0x70, 0x3F, 0xDF, 0xEF, 0xF7, 0x03, 0x81,
|
||||||
|
0xC0, 0xFF, 0xFF, 0xFF, 0xE0, 0x08, 0x0E, 0x0F, 0x8E, 0xE2, 0x20, 0x03,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF0, 0x38, 0x1F, 0xEF, 0xF7, 0xFB, 0x81, 0xC0, 0xE0,
|
||||||
|
0x7F, 0xFF, 0xFF, 0xF0, 0x77, 0x3B, 0x9D, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xC0, 0xE0, 0x7F, 0xBF, 0xDF, 0xEE, 0x07, 0x03, 0x81, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xC0, 0x47, 0x1E, 0x20, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73,
|
||||||
|
0x9C, 0x11, 0xFC, 0x80, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73,
|
||||||
|
0x9C, 0x10, 0x71, 0xF7, 0x74, 0x40, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3,
|
||||||
|
0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC0, 0xEF, 0xDF, 0xB8, 0x03, 0x87,
|
||||||
|
0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0x3F,
|
||||||
|
0xC0, 0xFF, 0xC3, 0xFF, 0x8E, 0x1E, 0x38, 0x3C, 0xE0, 0x7F, 0xF1, 0xFF,
|
||||||
|
0xC7, 0x38, 0x1C, 0xE0, 0xF3, 0x87, 0x8F, 0xFE, 0x3F, 0xF0, 0xFF, 0x00,
|
||||||
|
0x19, 0x07, 0xF0, 0x4C, 0x00, 0x0E, 0x0F, 0xE1, 0xFC, 0x3F, 0xC7, 0xFC,
|
||||||
|
0xFD, 0x9F, 0xBB, 0xF3, 0xFE, 0x7F, 0xC7, 0xF8, 0x7F, 0x0F, 0xE0, 0xFC,
|
||||||
|
0x1C, 0x04, 0x00, 0x38, 0x00, 0x78, 0x00, 0x40, 0x00, 0x00, 0x3F, 0x03,
|
||||||
|
0xFF, 0x1F, 0xFE, 0x78, 0x7B, 0xC0, 0xFE, 0x01, 0xF8, 0x07, 0xE0, 0x1F,
|
||||||
|
0x80, 0x7F, 0x03, 0xDE, 0x1E, 0x7F, 0xF8, 0xFF, 0xC0, 0xFC, 0x00, 0x00,
|
||||||
|
0x80, 0x07, 0x00, 0x78, 0x00, 0x80, 0x00, 0x00, 0x3F, 0x03, 0xFF, 0x1F,
|
||||||
|
0xFE, 0x78, 0x7B, 0xC0, 0xFE, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7F,
|
||||||
|
0x03, 0xDE, 0x1E, 0x7F, 0xF8, 0xFF, 0xC0, 0xFC, 0x00, 0x01, 0x00, 0x0E,
|
||||||
|
0x00, 0x7C, 0x03, 0xB8, 0x04, 0x40, 0x00, 0x00, 0xFC, 0x0F, 0xFC, 0x7F,
|
||||||
|
0xF9, 0xE1, 0xEF, 0x03, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xFC,
|
||||||
|
0x0F, 0x78, 0x79, 0xFF, 0xE3, 0xFF, 0x03, 0xF0, 0x06, 0x40, 0x3F, 0x80,
|
||||||
|
0x4C, 0x00, 0x00, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF, 0x9E, 0x1E, 0xF0, 0x3F,
|
||||||
|
0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE,
|
||||||
|
0x3F, 0xF0, 0x3F, 0x00, 0x1D, 0xC0, 0x77, 0x01, 0xDC, 0x00, 0x00, 0x0F,
|
||||||
|
0xC0, 0xFF, 0xC7, 0xFF, 0x9E, 0x1E, 0xF0, 0x3F, 0x80, 0x7E, 0x01, 0xF8,
|
||||||
|
0x07, 0xE0, 0x1F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0, 0x3F, 0x00,
|
||||||
|
0x41, 0x71, 0xDD, 0xC7, 0xC1, 0xC1, 0xF1, 0xDD, 0xC7, 0x41, 0x00, 0x00,
|
||||||
|
0x00, 0x3F, 0x63, 0xFF, 0x9F, 0xFE, 0x78, 0xFB, 0xC3, 0xFE, 0x1D, 0xF8,
|
||||||
|
0xE7, 0xE7, 0x1F, 0xB8, 0x7F, 0xC3, 0xDE, 0x1E, 0x7F, 0xF9, 0xFF, 0xC6,
|
||||||
|
0xFC, 0x00, 0x00, 0x10, 0x07, 0x00, 0x78, 0x02, 0x00, 0x01, 0xC1, 0xF8,
|
||||||
|
0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F,
|
||||||
|
0x8F, 0x7F, 0xCF, 0xF8, 0x7C, 0x00, 0x02, 0x00, 0xE0, 0x78, 0x04, 0x00,
|
||||||
|
0x01, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F,
|
||||||
|
0xC1, 0xF8, 0x3F, 0x8F, 0x7F, 0xCF, 0xF8, 0x7C, 0x00, 0x04, 0x01, 0xC0,
|
||||||
|
0x7C, 0x1D, 0xC1, 0x10, 0x00, 0x38, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83,
|
||||||
|
0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xF1, 0xEF, 0xF9, 0xFF, 0x0F,
|
||||||
|
0x80, 0x3B, 0x87, 0x70, 0xEE, 0x00, 0x0E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07,
|
||||||
|
0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xFC, 0x7B, 0xFE, 0x7F,
|
||||||
|
0xC3, 0xE0, 0x01, 0x00, 0x1C, 0x03, 0xC0, 0x08, 0x00, 0x00, 0x70, 0x1D,
|
||||||
|
0xC1, 0xCE, 0x0E, 0x38, 0xE1, 0xEF, 0x07, 0x70, 0x1F, 0x00, 0xF8, 0x03,
|
||||||
|
0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0xE0, 0x38, 0x0F,
|
||||||
|
0xE3, 0xFE, 0xFF, 0xF8, 0x7E, 0x1F, 0x87, 0xFF, 0xFF, 0xEF, 0xE3, 0x80,
|
||||||
|
0xE0, 0x38, 0x00, 0x3E, 0x0F, 0xE3, 0xFE, 0x71, 0xCE, 0x39, 0xCF, 0x39,
|
||||||
|
0xC7, 0x70, 0xEF, 0x1D, 0xF3, 0x8F, 0x70, 0x7E, 0x0F, 0xDF, 0xFB, 0xF7,
|
||||||
|
0x7C, 0x10, 0x1C, 0x07, 0x80, 0x80, 0x03, 0xF1, 0xFC, 0xFF, 0x03, 0x9F,
|
||||||
|
0xDF, 0xFC, 0x7E, 0x3F, 0xFD, 0xFE, 0x7F, 0x04, 0x07, 0x0F, 0x02, 0x00,
|
||||||
|
0x03, 0xF1, 0xFC, 0xFF, 0x03, 0x9F, 0xDF, 0xFC, 0x7E, 0x3F, 0xFD, 0xFE,
|
||||||
|
0x7F, 0x08, 0x0E, 0x0F, 0x8E, 0xE2, 0x20, 0x01, 0xF8, 0xFE, 0x7F, 0x81,
|
||||||
|
0xCF, 0xEF, 0xFE, 0x3F, 0x1F, 0xFE, 0xFF, 0x3F, 0x80, 0x32, 0x3F, 0x89,
|
||||||
|
0x80, 0x07, 0xE3, 0xF9, 0xFE, 0x07, 0x3F, 0xBF, 0xF8, 0xFC, 0x7F, 0xFB,
|
||||||
|
0xFC, 0xFE, 0x77, 0x3B, 0x9D, 0xC0, 0x07, 0xE3, 0xF9, 0xFE, 0x07, 0x3F,
|
||||||
|
0xBF, 0xF8, 0xFC, 0x7F, 0xFB, 0xFC, 0xFE, 0x1E, 0x1F, 0x8C, 0xC6, 0x63,
|
||||||
|
0xF0, 0xF1, 0xF8, 0xFE, 0x7F, 0x81, 0xCF, 0xEF, 0xFE, 0x3F, 0x1F, 0xFE,
|
||||||
|
0xFF, 0x3F, 0x80, 0x7E, 0x78, 0xFF, 0xF9, 0xFF, 0xF8, 0x1C, 0x73, 0xFF,
|
||||||
|
0xEF, 0xFF, 0xF8, 0xE0, 0x71, 0xE0, 0xFF, 0xFC, 0xFF, 0xF8, 0xF9, 0xF0,
|
||||||
|
0x1E, 0x7F, 0x7E, 0xF0, 0xE0, 0xE0, 0xE0, 0xF0, 0x7F, 0x3F, 0x0F, 0x0C,
|
||||||
|
0x0C, 0x3C, 0x38, 0x10, 0x0E, 0x01, 0xE0, 0x10, 0x00, 0x07, 0xC7, 0xF9,
|
||||||
|
0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0x80, 0xF0, 0x1F, 0xE7, 0xF8, 0x7E, 0x02,
|
||||||
|
0x01, 0xC1, 0xE0, 0x20, 0x00, 0x07, 0xC7, 0xF9, 0xFF, 0xE1, 0xFF, 0xFF,
|
||||||
|
0xFF, 0x80, 0xF0, 0x1F, 0xE7, 0xF8, 0x7E, 0x08, 0x07, 0x03, 0xE1, 0xDC,
|
||||||
|
0x22, 0x00, 0x01, 0xF1, 0xFE, 0x7F, 0xF8, 0x7F, 0xFF, 0xFF, 0xE0, 0x3C,
|
||||||
|
0x07, 0xF9, 0xFE, 0x1F, 0x80, 0x3B, 0x8E, 0xE3, 0xB8, 0x00, 0x1F, 0x1F,
|
||||||
|
0xE7, 0xFF, 0x87, 0xFF, 0xFF, 0xFE, 0x03, 0xC0, 0x7F, 0x9F, 0xE1, 0xF8,
|
||||||
|
0x47, 0x1E, 0x20, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x11, 0xFC,
|
||||||
|
0x80, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x10, 0x71, 0xF7, 0x74,
|
||||||
|
0x40, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0xEF,
|
||||||
|
0xDF, 0xB8, 0x03, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E,
|
||||||
|
0x00, 0x0C, 0x07, 0xB0, 0x7C, 0x7E, 0x0B, 0x80, 0x73, 0xFD, 0xFF, 0xFF,
|
||||||
|
0xFC, 0x7E, 0x1F, 0x87, 0xE3, 0x9F, 0xE7, 0xF0, 0x78, 0x19, 0x0F, 0xE1,
|
||||||
|
0x30, 0x00, 0xFF, 0x3F, 0xEF, 0xFF, 0x8F, 0xE1, 0xF8, 0x7E, 0x1F, 0x87,
|
||||||
|
0xE1, 0xF8, 0x7E, 0x1C, 0x10, 0x0E, 0x01, 0xE0, 0x10, 0x00, 0x07, 0x87,
|
||||||
|
0xF9, 0xFE, 0xF3, 0xF8, 0x7E, 0x1F, 0x87, 0xF3, 0xDF, 0xE7, 0xF8, 0x78,
|
||||||
|
0x02, 0x01, 0xC1, 0xE0, 0x20, 0x00, 0x07, 0x87, 0xF9, 0xFE, 0xF3, 0xF8,
|
||||||
|
0x7E, 0x1F, 0x87, 0xF3, 0xDF, 0xE7, 0xF8, 0x78, 0x08, 0x07, 0x03, 0xE1,
|
||||||
|
0xDC, 0x22, 0x00, 0x01, 0xE1, 0xFE, 0x7F, 0xBC, 0xFE, 0x1F, 0x87, 0xE1,
|
||||||
|
0xFC, 0xF7, 0xF9, 0xFE, 0x1E, 0x00, 0x19, 0x0F, 0xE1, 0x30, 0x00, 0x1E,
|
||||||
|
0x1F, 0xE7, 0xFB, 0xCF, 0xE1, 0xF8, 0x7E, 0x1F, 0xCF, 0x7F, 0x9F, 0xE1,
|
||||||
|
0xE0, 0x77, 0x1D, 0xC7, 0x70, 0x00, 0x1E, 0x1F, 0xE7, 0xFB, 0xCF, 0xE1,
|
||||||
|
0xF8, 0x7E, 0x1F, 0xCF, 0x7F, 0x9F, 0xE1, 0xE0, 0x1C, 0x0E, 0x07, 0x00,
|
||||||
|
0x0F, 0xFF, 0xFF, 0xFE, 0x00, 0x1C, 0x0E, 0x07, 0x00, 0x00, 0x07, 0xB7,
|
||||||
|
0xF9, 0xFE, 0xF7, 0xF9, 0xFE, 0xDF, 0xE7, 0xFB, 0xDF, 0xE7, 0xFB, 0x78,
|
||||||
|
0x00, 0x00, 0x10, 0x0E, 0x01, 0xE0, 0x10, 0x00, 0x38, 0x7E, 0x1F, 0x87,
|
||||||
|
0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xF1, 0xFF, 0xF7, 0xFC, 0xFF, 0x02, 0x01,
|
||||||
|
0xC1, 0xE0, 0x20, 0x00, 0x38, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F,
|
||||||
|
0x87, 0xF1, 0xFF, 0xF7, 0xFC, 0xFF, 0x04, 0x03, 0x81, 0xF0, 0xEE, 0x11,
|
||||||
|
0x00, 0x0E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xFC, 0x7F,
|
||||||
|
0xFD, 0xFF, 0x3F, 0xC0, 0x77, 0x1D, 0xC7, 0x70, 0x00, 0xE1, 0xF8, 0x7E,
|
||||||
|
0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0xC7, 0xFF, 0xDF, 0xF3, 0xFC, 0x01,
|
||||||
|
0x00, 0x70, 0x3C, 0x02, 0x00, 0x01, 0xC1, 0xF8, 0x3B, 0x8E, 0x71, 0xCE,
|
||||||
|
0x38, 0xEE, 0x1D, 0xC3, 0xF8, 0x3E, 0x07, 0xC0, 0xF8, 0x1E, 0x1F, 0xC3,
|
||||||
|
0xF0, 0x7C, 0x00, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x3F, 0x8F, 0xFB,
|
||||||
|
0xFE, 0xE3, 0xF8, 0x7E, 0x1F, 0x87, 0xE3, 0xFF, 0xEF, 0xFB, 0xFC, 0xE0,
|
||||||
|
0x38, 0x0E, 0x03, 0x80, 0x3B, 0x87, 0x70, 0xEE, 0x00, 0x0E, 0x0F, 0xC1,
|
||||||
|
0xDC, 0x73, 0x8E, 0x71, 0xC7, 0x70, 0xEE, 0x1F, 0xC1, 0xF0, 0x3E, 0x07,
|
||||||
|
0xC0, 0xF0, 0xFE, 0x1F, 0x83, 0xE0, 0x00 };
|
||||||
|
|
||||||
|
const GFXglyph Ubuntu_Bold10pt8bGlyphs[] PROGMEM = {
|
||||||
|
{ 0, 1, 1, 5, 0, 0 }, // 0x20 ' ' U+0020
|
||||||
|
{ 1, 3, 14, 5, 1, -13 }, // 0x21 '!' U+0021
|
||||||
|
{ 7, 7, 6, 9, 1, -14 }, // 0x22 '"' U+0022
|
||||||
|
{ 13, 12, 14, 14, 1, -13 }, // 0x23 '#' U+0023
|
||||||
|
{ 34, 9, 17, 11, 1, -14 }, // 0x24 '$' U+0024
|
||||||
|
{ 54, 16, 14, 18, 1, -13 }, // 0x25 '%' U+0025
|
||||||
|
{ 82, 13, 14, 14, 1, -13 }, // 0x26 '&' U+0026
|
||||||
|
{ 105, 3, 6, 5, 1, -14 }, // 0x27 ''' U+0027
|
||||||
|
{ 108, 6, 20, 7, 1, -15 }, // 0x28 '(' U+0028
|
||||||
|
{ 123, 6, 20, 7, 0, -15 }, // 0x29 ')' U+0029
|
||||||
|
{ 138, 9, 8, 10, 1, -13 }, // 0x2a '*' U+002A
|
||||||
|
{ 147, 11, 11, 13, 1, -11 }, // 0x2b '+' U+002B
|
||||||
|
{ 163, 4, 6, 5, 0, -2 }, // 0x2c ',' U+002C
|
||||||
|
{ 166, 6, 3, 8, 1, -7 }, // 0x2d '-' U+002D
|
||||||
|
{ 169, 4, 4, 6, 1, -3 }, // 0x2e '.' U+002E
|
||||||
|
{ 171, 10, 20, 9, -1, -15 }, // 0x2f '/' U+002F
|
||||||
|
{ 196, 9, 14, 11, 1, -13 }, // 0x30 '0' U+0030
|
||||||
|
{ 212, 7, 14, 11, 1, -13 }, // 0x31 '1' U+0031
|
||||||
|
{ 225, 9, 14, 11, 1, -13 }, // 0x32 '2' U+0032
|
||||||
|
{ 241, 9, 14, 11, 1, -13 }, // 0x33 '3' U+0033
|
||||||
|
{ 257, 9, 14, 11, 1, -13 }, // 0x34 '4' U+0034
|
||||||
|
{ 273, 9, 14, 11, 1, -13 }, // 0x35 '5' U+0035
|
||||||
|
{ 289, 9, 14, 11, 1, -13 }, // 0x36 '6' U+0036
|
||||||
|
{ 305, 9, 14, 11, 1, -13 }, // 0x37 '7' U+0037
|
||||||
|
{ 321, 9, 14, 11, 1, -13 }, // 0x38 '8' U+0038
|
||||||
|
{ 337, 9, 14, 11, 1, -13 }, // 0x39 '9' U+0039
|
||||||
|
{ 353, 4, 11, 6, 1, -10 }, // 0x3a ':' U+003A
|
||||||
|
{ 359, 5, 14, 6, 0, -10 }, // 0x3b ';' U+003B
|
||||||
|
{ 368, 10, 9, 11, 1, -9 }, // 0x3c '<' U+003C
|
||||||
|
{ 380, 9, 8, 11, 1, -9 }, // 0x3d '=' U+003D
|
||||||
|
{ 389, 9, 9, 11, 1, -9 }, // 0x3e '>' U+003E
|
||||||
|
{ 400, 8, 16, 9, 0, -15 }, // 0x3f '?' U+003F
|
||||||
|
{ 416, 17, 17, 19, 1, -13 }, // 0x40 '@' U+0040
|
||||||
|
{ 453, 15, 14, 15, 0, -13 }, // 0x41 'A' U+0041
|
||||||
|
{ 480, 10, 14, 13, 2, -13 }, // 0x42 'B' U+0042
|
||||||
|
{ 498, 11, 14, 13, 1, -13 }, // 0x43 'C' U+0043
|
||||||
|
{ 518, 12, 14, 15, 2, -13 }, // 0x44 'D' U+0044
|
||||||
|
{ 539, 9, 14, 12, 2, -13 }, // 0x45 'E' U+0045
|
||||||
|
{ 555, 8, 14, 11, 2, -13 }, // 0x46 'F' U+0046
|
||||||
|
{ 569, 11, 14, 14, 1, -13 }, // 0x47 'G' U+0047
|
||||||
|
{ 589, 11, 14, 15, 2, -13 }, // 0x48 'H' U+0048
|
||||||
|
{ 609, 3, 14, 7, 2, -13 }, // 0x49 'I' U+0049
|
||||||
|
{ 615, 9, 14, 11, 0, -13 }, // 0x4a 'J' U+004A
|
||||||
|
{ 631, 12, 14, 14, 2, -13 }, // 0x4b 'K' U+004B
|
||||||
|
{ 652, 9, 14, 11, 2, -13 }, // 0x4c 'L' U+004C
|
||||||
|
{ 668, 15, 14, 17, 1, -13 }, // 0x4d 'M' U+004D
|
||||||
|
{ 695, 11, 14, 15, 2, -13 }, // 0x4e 'N' U+004E
|
||||||
|
{ 715, 14, 14, 16, 1, -13 }, // 0x4f 'O' U+004F
|
||||||
|
{ 740, 10, 14, 13, 2, -13 }, // 0x50 'P' U+0050
|
||||||
|
{ 758, 14, 17, 16, 1, -13 }, // 0x51 'Q' U+0051
|
||||||
|
{ 788, 11, 14, 13, 2, -13 }, // 0x52 'R' U+0052
|
||||||
|
{ 808, 10, 14, 12, 1, -13 }, // 0x53 'S' U+0053
|
||||||
|
{ 826, 11, 14, 11, 0, -13 }, // 0x54 'T' U+0054
|
||||||
|
{ 846, 11, 14, 15, 2, -13 }, // 0x55 'U' U+0055
|
||||||
|
{ 866, 15, 14, 15, 0, -13 }, // 0x56 'V' U+0056
|
||||||
|
{ 893, 19, 14, 19, 0, -13 }, // 0x57 'W' U+0057
|
||||||
|
{ 927, 14, 14, 14, 0, -13 }, // 0x58 'X' U+0058
|
||||||
|
{ 952, 13, 14, 13, 0, -13 }, // 0x59 'Y' U+0059
|
||||||
|
{ 975, 10, 14, 12, 1, -13 }, // 0x5a 'Z' U+005A
|
||||||
|
{ 993, 5, 20, 7, 2, -15 }, // 0x5b '[' U+005B
|
||||||
|
{ 1006, 10, 20, 9, -1, -15 }, // 0x5c '\' U+005C
|
||||||
|
{ 1031, 5, 20, 7, 0, -15 }, // 0x5d ']' U+005D
|
||||||
|
{ 1044, 11, 8, 11, 0, -13 }, // 0x5e '^' U+005E
|
||||||
|
{ 1055, 10, 2, 10, 0, 3 }, // 0x5f '_' U+005F
|
||||||
|
{ 1058, 5, 4, 6, 1, -15 }, // 0x60 '`' U+0060
|
||||||
|
{ 1061, 9, 11, 11, 1, -10 }, // 0x61 'a' U+0061
|
||||||
|
{ 1074, 10, 16, 12, 1, -15 }, // 0x62 'b' U+0062
|
||||||
|
{ 1094, 8, 11, 10, 1, -10 }, // 0x63 'c' U+0063
|
||||||
|
{ 1105, 10, 16, 12, 1, -15 }, // 0x64 'd' U+0064
|
||||||
|
{ 1125, 10, 11, 12, 1, -10 }, // 0x65 'e' U+0065
|
||||||
|
{ 1139, 8, 16, 8, 1, -15 }, // 0x66 'f' U+0066
|
||||||
|
{ 1155, 10, 15, 12, 1, -10 }, // 0x67 'g' U+0067
|
||||||
|
{ 1174, 10, 16, 12, 1, -15 }, // 0x68 'h' U+0068
|
||||||
|
{ 1194, 3, 16, 5, 1, -15 }, // 0x69 'i' U+0069
|
||||||
|
{ 1200, 6, 20, 5, -2, -15 }, // 0x6a 'j' U+006A
|
||||||
|
{ 1215, 11, 16, 12, 1, -15 }, // 0x6b 'k' U+006B
|
||||||
|
{ 1237, 5, 16, 6, 1, -15 }, // 0x6c 'l' U+006C
|
||||||
|
{ 1247, 15, 11, 17, 1, -10 }, // 0x6d 'm' U+006D
|
||||||
|
{ 1268, 10, 11, 12, 1, -10 }, // 0x6e 'n' U+006E
|
||||||
|
{ 1282, 10, 11, 12, 1, -10 }, // 0x6f 'o' U+006F
|
||||||
|
{ 1296, 10, 15, 12, 1, -10 }, // 0x70 'p' U+0070
|
||||||
|
{ 1315, 10, 15, 12, 1, -10 }, // 0x71 'q' U+0071
|
||||||
|
{ 1334, 7, 11, 8, 1, -10 }, // 0x72 'r' U+0072
|
||||||
|
{ 1344, 8, 11, 10, 1, -10 }, // 0x73 's' U+0073
|
||||||
|
{ 1355, 7, 14, 9, 1, -13 }, // 0x74 't' U+0074
|
||||||
|
{ 1368, 10, 11, 12, 1, -10 }, // 0x75 'u' U+0075
|
||||||
|
{ 1382, 11, 11, 11, 0, -10 }, // 0x76 'v' U+0076
|
||||||
|
{ 1398, 15, 11, 15, 0, -10 }, // 0x77 'w' U+0077
|
||||||
|
{ 1419, 11, 11, 11, 0, -10 }, // 0x78 'x' U+0078
|
||||||
|
{ 1435, 11, 15, 11, 0, -10 }, // 0x79 'y' U+0079
|
||||||
|
{ 1456, 8, 11, 10, 1, -10 }, // 0x7a 'z' U+007A
|
||||||
|
{ 1467, 7, 20, 8, 1, -15 }, // 0x7b '{' U+007B
|
||||||
|
{ 1485, 3, 20, 7, 2, -15 }, // 0x7c '|' U+007C
|
||||||
|
{ 1493, 7, 20, 8, 0, -15 }, // 0x7d '}' U+007D
|
||||||
|
{ 1511, 10, 5, 11, 1, -8 }, // 0x7e '~' U+007E
|
||||||
|
{ 1518, 8, 15, 10, 1, -14 }, // 0x7f 'REPLACEMENT CHARACTER *' U+2370
|
||||||
|
{ 1533, 1, 1, 5, 0, 0 }, // 0x80 'NO-BREAK SPACE' U+00A0
|
||||||
|
{ 1534, 3, 15, 5, 1, -10 }, // 0x81 'INVERTED EXCLAMATION MARK' U+00A1
|
||||||
|
{ 1540, 8, 16, 11, 1, -13 }, // 0x82 'CENT SIGN' U+00A2
|
||||||
|
{ 1556, 10, 14, 11, 0, -13 }, // 0x83 'POUND SIGN' U+00A3
|
||||||
|
{ 1574, 10, 10, 11, 1, -11 }, // 0x84 'CURRENCY SIGN' U+00A4
|
||||||
|
{ 1587, 11, 14, 11, 0, -13 }, // 0x85 'YEN SIGN' U+00A5
|
||||||
|
{ 1607, 3, 20, 6, 2, -15 }, // 0x86 'BROKEN BAR' U+00A6
|
||||||
|
{ 1615, 8, 18, 10, 1, -13 }, // 0x87 'SECTION SIGN' U+00A7
|
||||||
|
{ 1633, 7, 3, 11, 2, -14 }, // 0x88 'DIAERESIS' U+00A8
|
||||||
|
{ 1636, 14, 14, 16, 1, -13 }, // 0x89 'COPYRIGHT SIGN' U+00A9
|
||||||
|
{ 1661, 7, 8, 8, 0, -13 }, // 0x8a 'FEMININE ORDINAL INDICATOR' U+00AA
|
||||||
|
{ 1668, 10, 9, 12, 0, -9 }, // 0x8b 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00AB
|
||||||
|
{ 1680, 9, 8, 11, 1, -8 }, // 0x8c 'NOT SIGN' U+00AC
|
||||||
|
{ 1689, 6, 3, 8, 1, -7 }, // 0x8d 'SOFT HYPHEN' U+00AD
|
||||||
|
{ 1692, 14, 14, 16, 1, -13 }, // 0x8e 'REGISTERED SIGN' U+00AE
|
||||||
|
{ 1717, 6, 2, 8, 1, -13 }, // 0x8f 'MACRON' U+00AF
|
||||||
|
{ 1719, 6, 6, 6, 0, -15 }, // 0x90 'DEGREE SIGN' U+00B0
|
||||||
|
{ 1724, 11, 15, 13, 1, -14 }, // 0x91 'PLUS-MINUS SIGN' U+00B1
|
||||||
|
{ 1745, 6, 8, 7, 0, -13 }, // 0x92 'SUPERSCRIPT TWO' U+00B2
|
||||||
|
{ 1751, 6, 8, 7, 0, -13 }, // 0x93 'SUPERSCRIPT THREE' U+00B3
|
||||||
|
{ 1757, 5, 4, 6, 0, -15 }, // 0x94 'ACUTE ACCENT' U+00B4
|
||||||
|
{ 1760, 10, 15, 12, 1, -10 }, // 0x95 'MICRO SIGN' U+00B5
|
||||||
|
{ 1779, 12, 18, 14, 1, -13 }, // 0x96 'PILCROW SIGN' U+00B6
|
||||||
|
{ 1806, 4, 4, 6, 1, -7 }, // 0x97 'MIDDLE DOT' U+00B7
|
||||||
|
{ 1808, 4, 4, 7, 1, 1 }, // 0x98 'CEDILLA' U+00B8
|
||||||
|
{ 1810, 4, 8, 7, 1, -13 }, // 0x99 'SUPERSCRIPT ONE' U+00B9
|
||||||
|
{ 1814, 8, 8, 10, 1, -13 }, // 0x9a 'MASCULINE ORDINAL INDICATOR' U+00BA
|
||||||
|
{ 1822, 10, 9, 12, 2, -9 }, // 0x9b 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00BB
|
||||||
|
{ 1834, 16, 14, 18, 1, -13 }, // 0x9c 'VULGAR FRACTION ONE QUARTER' U+00BC
|
||||||
|
{ 1862, 15, 14, 18, 1, -13 }, // 0x9d 'VULGAR FRACTION ONE HALF' U+00BD
|
||||||
|
{ 1889, 17, 14, 18, 0, -13 }, // 0x9e 'VULGAR FRACTION THREE QUARTERS' U+00BE
|
||||||
|
{ 1919, 8, 15, 9, 1, -10 }, // 0x9f 'INVERTED QUESTION MARK' U+00BF
|
||||||
|
{ 1934, 15, 19, 15, 0, -18 }, // 0xa0 'LATIN CAPITAL LETTER A WITH GRAVE' U+00C0
|
||||||
|
{ 1970, 15, 19, 15, 0, -18 }, // 0xa1 'LATIN CAPITAL LETTER A WITH ACUTE' U+00C1
|
||||||
|
{ 2006, 15, 20, 15, 0, -19 }, // 0xa2 'LATIN CAPITAL LETTER A WITH CIRCUMFLEX' U+00C2
|
||||||
|
{ 2044, 15, 18, 15, 0, -17 }, // 0xa3 'LATIN CAPITAL LETTER A WITH TILDE' U+00C3
|
||||||
|
{ 2078, 15, 18, 15, 0, -17 }, // 0xa4 'LATIN CAPITAL LETTER A WITH DIAERESIS' U+00C4
|
||||||
|
{ 2112, 15, 18, 15, 0, -17 }, // 0xa5 'LATIN CAPITAL LETTER A WITH RING ABOVE' U+00C5
|
||||||
|
{ 2146, 19, 14, 20, 0, -13 }, // 0xa6 'LATIN CAPITAL LETTER AE' U+00C6
|
||||||
|
{ 2180, 11, 18, 13, 1, -13 }, // 0xa7 'LATIN CAPITAL LETTER C WITH CEDILLA' U+00C7
|
||||||
|
{ 2205, 9, 19, 12, 2, -18 }, // 0xa8 'LATIN CAPITAL LETTER E WITH GRAVE' U+00C8
|
||||||
|
{ 2227, 9, 19, 12, 2, -18 }, // 0xa9 'LATIN CAPITAL LETTER E WITH ACUTE' U+00C9
|
||||||
|
{ 2249, 9, 20, 12, 2, -19 }, // 0xaa 'LATIN CAPITAL LETTER E WITH CIRCUMFLEX' U+00CA
|
||||||
|
{ 2272, 9, 18, 12, 2, -17 }, // 0xab 'LATIN CAPITAL LETTER E WITH DIAERESIS' U+00CB
|
||||||
|
{ 2293, 5, 19, 7, 1, -18 }, // 0xac 'LATIN CAPITAL LETTER I WITH GRAVE' U+00CC
|
||||||
|
{ 2305, 5, 19, 7, 1, -18 }, // 0xad 'LATIN CAPITAL LETTER I WITH ACUTE' U+00CD
|
||||||
|
{ 2317, 7, 20, 7, 0, -19 }, // 0xae 'LATIN CAPITAL LETTER I WITH CIRCUMFLEX' U+00CE
|
||||||
|
{ 2335, 7, 18, 7, 0, -17 }, // 0xaf 'LATIN CAPITAL LETTER I WITH DIAERESIS' U+00CF
|
||||||
|
{ 2351, 14, 14, 15, 0, -13 }, // 0xb0 'LATIN CAPITAL LETTER ETH' U+00D0
|
||||||
|
{ 2376, 11, 18, 15, 2, -17 }, // 0xb1 'LATIN CAPITAL LETTER N WITH TILDE' U+00D1
|
||||||
|
{ 2401, 14, 19, 16, 1, -18 }, // 0xb2 'LATIN CAPITAL LETTER O WITH GRAVE' U+00D2
|
||||||
|
{ 2435, 14, 19, 16, 1, -18 }, // 0xb3 'LATIN CAPITAL LETTER O WITH ACUTE' U+00D3
|
||||||
|
{ 2469, 14, 20, 16, 1, -19 }, // 0xb4 'LATIN CAPITAL LETTER O WITH CIRCUMFLEX' U+00D4
|
||||||
|
{ 2504, 14, 18, 16, 1, -17 }, // 0xb5 'LATIN CAPITAL LETTER O WITH TILDE' U+00D5
|
||||||
|
{ 2536, 14, 18, 16, 1, -17 }, // 0xb6 'LATIN CAPITAL LETTER O WITH DIAERESIS' U+00D6
|
||||||
|
{ 2568, 9, 9, 11, 1, -10 }, // 0xb7 'MULTIPLICATION SIGN' U+00D7
|
||||||
|
{ 2579, 14, 16, 16, 1, -14 }, // 0xb8 'LATIN CAPITAL LETTER O WITH STROKE' U+00D8
|
||||||
|
{ 2607, 11, 19, 15, 2, -18 }, // 0xb9 'LATIN CAPITAL LETTER U WITH GRAVE' U+00D9
|
||||||
|
{ 2634, 11, 19, 15, 2, -18 }, // 0xba 'LATIN CAPITAL LETTER U WITH ACUTE' U+00DA
|
||||||
|
{ 2661, 11, 20, 15, 2, -19 }, // 0xbb 'LATIN CAPITAL LETTER U WITH CIRCUMFLEX' U+00DB
|
||||||
|
{ 2689, 11, 18, 15, 2, -17 }, // 0xbc 'LATIN CAPITAL LETTER U WITH DIAERESIS' U+00DC
|
||||||
|
{ 2714, 13, 19, 13, 0, -18 }, // 0xbd 'LATIN CAPITAL LETTER Y WITH ACUTE' U+00DD
|
||||||
|
{ 2745, 10, 14, 13, 2, -13 }, // 0xbe 'LATIN CAPITAL LETTER THORN' U+00DE
|
||||||
|
{ 2763, 11, 16, 13, 1, -15 }, // 0xbf 'LATIN SMALL LETTER SHARP S' U+00DF
|
||||||
|
{ 2785, 9, 16, 11, 1, -15 }, // 0xc0 'LATIN SMALL LETTER A WITH GRAVE' U+00E0
|
||||||
|
{ 2803, 9, 16, 11, 1, -15 }, // 0xc1 'LATIN SMALL LETTER A WITH ACUTE' U+00E1
|
||||||
|
{ 2821, 9, 17, 11, 1, -16 }, // 0xc2 'LATIN SMALL LETTER A WITH CIRCUMFLEX' U+00E2
|
||||||
|
{ 2841, 9, 15, 11, 1, -14 }, // 0xc3 'LATIN SMALL LETTER A WITH TILDE' U+00E3
|
||||||
|
{ 2858, 9, 15, 11, 1, -14 }, // 0xc4 'LATIN SMALL LETTER A WITH DIAERESIS' U+00E4
|
||||||
|
{ 2875, 9, 17, 11, 1, -16 }, // 0xc5 'LATIN SMALL LETTER A WITH RING ABOVE' U+00E5
|
||||||
|
{ 2895, 15, 11, 17, 1, -10 }, // 0xc6 'LATIN SMALL LETTER AE' U+00E6
|
||||||
|
{ 2916, 8, 15, 10, 1, -10 }, // 0xc7 'LATIN SMALL LETTER C WITH CEDILLA' U+00E7
|
||||||
|
{ 2931, 10, 16, 12, 1, -15 }, // 0xc8 'LATIN SMALL LETTER E WITH GRAVE' U+00E8
|
||||||
|
{ 2951, 10, 16, 12, 1, -15 }, // 0xc9 'LATIN SMALL LETTER E WITH ACUTE' U+00E9
|
||||||
|
{ 2971, 10, 17, 12, 1, -16 }, // 0xca 'LATIN SMALL LETTER E WITH CIRCUMFLEX' U+00EA
|
||||||
|
{ 2993, 10, 15, 12, 1, -14 }, // 0xcb 'LATIN SMALL LETTER E WITH DIAERESIS' U+00EB
|
||||||
|
{ 3012, 5, 16, 5, 0, -15 }, // 0xcc 'LATIN SMALL LETTER I WITH GRAVE' U+00EC
|
||||||
|
{ 3022, 5, 16, 5, 0, -15 }, // 0xcd 'LATIN SMALL LETTER I WITH ACUTE' U+00ED
|
||||||
|
{ 3032, 7, 17, 5, -1, -16 }, // 0xce 'LATIN SMALL LETTER I WITH CIRCUMFLEX' U+00EE
|
||||||
|
{ 3047, 7, 15, 5, -1, -14 }, // 0xcf 'LATIN SMALL LETTER I WITH DIAERESIS' U+00EF
|
||||||
|
{ 3061, 10, 16, 12, 1, -15 }, // 0xd0 'LATIN SMALL LETTER ETH' U+00F0
|
||||||
|
{ 3081, 10, 15, 12, 1, -14 }, // 0xd1 'LATIN SMALL LETTER N WITH TILDE' U+00F1
|
||||||
|
{ 3100, 10, 16, 12, 1, -15 }, // 0xd2 'LATIN SMALL LETTER O WITH GRAVE' U+00F2
|
||||||
|
{ 3120, 10, 16, 12, 1, -15 }, // 0xd3 'LATIN SMALL LETTER O WITH ACUTE' U+00F3
|
||||||
|
{ 3140, 10, 17, 12, 1, -16 }, // 0xd4 'LATIN SMALL LETTER O WITH CIRCUMFLEX' U+00F4
|
||||||
|
{ 3162, 10, 15, 12, 1, -14 }, // 0xd5 'LATIN SMALL LETTER O WITH TILDE' U+00F5
|
||||||
|
{ 3181, 10, 15, 12, 1, -14 }, // 0xd6 'LATIN SMALL LETTER O WITH DIAERESIS' U+00F6
|
||||||
|
{ 3200, 9, 11, 11, 1, -10 }, // 0xd7 'DIVISION SIGN' U+00F7
|
||||||
|
{ 3213, 10, 13, 12, 1, -11 }, // 0xd8 'LATIN SMALL LETTER O WITH STROKE' U+00F8
|
||||||
|
{ 3230, 10, 16, 12, 1, -15 }, // 0xd9 'LATIN SMALL LETTER U WITH GRAVE' U+00F9
|
||||||
|
{ 3250, 10, 16, 12, 1, -15 }, // 0xda 'LATIN SMALL LETTER U WITH ACUTE' U+00FA
|
||||||
|
{ 3270, 10, 17, 12, 1, -16 }, // 0xdb 'LATIN SMALL LETTER U WITH CIRCUMFLEX' U+00FB
|
||||||
|
{ 3292, 10, 15, 12, 1, -14 }, // 0xdc 'LATIN SMALL LETTER U WITH DIAERESIS' U+00FC
|
||||||
|
{ 3311, 11, 20, 11, 0, -15 }, // 0xdd 'LATIN SMALL LETTER Y WITH ACUTE' U+00FD
|
||||||
|
{ 3339, 10, 20, 12, 1, -15 }, // 0xde 'LATIN SMALL LETTER THORN' U+00FE
|
||||||
|
{ 3364, 11, 19, 11, 0, -14 } }; // 0xdf 'LATIN SMALL LETTER Y WITH DIAERESIS' U+000FF
|
||||||
|
|
||||||
|
const GFXfont Ubuntu_Bold10pt8b PROGMEM = {
|
||||||
|
(uint8_t *)Ubuntu_Bold10pt8bBitmaps,
|
||||||
|
(GFXglyph *)Ubuntu_Bold10pt8bGlyphs,
|
||||||
|
0x20, 0xDF, 23 };
|
||||||
|
|
||||||
|
// Approx. 4742 bytes
|
||||||
611
lib/obp60task/fonts/Ubuntu_Bold12pt8b.h
Normal file
611
lib/obp60task/fonts/Ubuntu_Bold12pt8b.h
Normal file
@@ -0,0 +1,611 @@
|
|||||||
|
const uint8_t Ubuntu_Bold12pt8bBitmaps[] PROGMEM = {
|
||||||
|
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0x60, 0xF7, 0xFB,
|
||||||
|
0xFD, 0xFE, 0xFF, 0x7F, 0xBF, 0xDE, 0x0F, 0x3C, 0x1E, 0x78, 0x3C, 0xF0,
|
||||||
|
0xF3, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x3C, 0x3E, 0xF8, 0x79,
|
||||||
|
0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x9E, 0x1E, 0x78, 0x3C, 0xF0,
|
||||||
|
0x79, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xFC, 0x7F, 0xE7, 0xFE, 0xF0,
|
||||||
|
0x4F, 0x00, 0xF0, 0x0F, 0xF0, 0x7F, 0xC3, 0xFE, 0x07, 0xF0, 0x1F, 0x00,
|
||||||
|
0xF6, 0x0F, 0xFF, 0xEF, 0xFC, 0x7F, 0x80, 0xE0, 0x0E, 0x00, 0xE0, 0x3E,
|
||||||
|
0x0F, 0x07, 0xF0, 0xE0, 0xF7, 0x9E, 0x0E, 0x39, 0xC0, 0xE3, 0xBC, 0x0E,
|
||||||
|
0x3B, 0x80, 0xF7, 0xF8, 0x07, 0xF7, 0x00, 0x3E, 0xF7, 0xC0, 0x0E, 0xFE,
|
||||||
|
0x01, 0xFE, 0xF0, 0x1D, 0xC7, 0x03, 0xDC, 0x70, 0x39, 0xC7, 0x07, 0x9E,
|
||||||
|
0xF0, 0x70, 0xFE, 0x0F, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0xC0, 0x3F, 0xE0,
|
||||||
|
0x38, 0xE0, 0x38, 0xE0, 0x3D, 0xE0, 0x1F, 0xC0, 0x1F, 0x80, 0x3F, 0x9E,
|
||||||
|
0x7F, 0x9E, 0xF3, 0xDC, 0xF1, 0xFC, 0xF0, 0xF8, 0xF8, 0xF8, 0xFF, 0xFC,
|
||||||
|
0x7F, 0xFE, 0x1F, 0x9F, 0xFF, 0xFF, 0xFF, 0xF0, 0x08, 0x3C, 0xF1, 0xE7,
|
||||||
|
0x8F, 0x1E, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0x78, 0xF1,
|
||||||
|
0xE1, 0xE3, 0xC3, 0xC2, 0x00, 0x21, 0xE1, 0xE3, 0xC3, 0xC7, 0x8F, 0x0F,
|
||||||
|
0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x3C, 0x78, 0xF3, 0xC7, 0x9E,
|
||||||
|
0x08, 0x00, 0x0E, 0x01, 0xC1, 0x39, 0x7A, 0xFF, 0xFE, 0x1C, 0x06, 0xC1,
|
||||||
|
0xDC, 0x7B, 0xC2, 0x20, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0x7B, 0xDE, 0xF7, 0xFB,
|
||||||
|
0xCC, 0xFF, 0xFF, 0xF8, 0x6F, 0xF6, 0x00, 0xF0, 0x1F, 0x01, 0xE0, 0x1E,
|
||||||
|
0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x78, 0x07, 0x80, 0x78, 0x0F, 0x00, 0xF0,
|
||||||
|
0x0F, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x03, 0xC0, 0x3C, 0x07, 0x80,
|
||||||
|
0x78, 0x0F, 0x80, 0xF0, 0x00, 0x0F, 0x03, 0xFC, 0x7F, 0xE7, 0x9E, 0x70,
|
||||||
|
0xEF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0,
|
||||||
|
0xE7, 0x9E, 0x7F, 0xE3, 0xFC, 0x0F, 0x00, 0x07, 0x1F, 0x7F, 0xFF, 0xEF,
|
||||||
|
0x4F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
|
||||||
|
0x1F, 0x07, 0xFC, 0xFF, 0xE6, 0x3E, 0x01, 0xE0, 0x1E, 0x03, 0xE0, 0x3C,
|
||||||
|
0x07, 0x80, 0xF8, 0x3F, 0x03, 0xE0, 0x7C, 0x0F, 0x80, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xF0, 0x3E, 0x1F, 0xF3, 0xFF, 0x21, 0xE0, 0x3C, 0x07, 0x87, 0xE0,
|
||||||
|
0xF8, 0x1F, 0xC0, 0x78, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0xFF, 0xF7, 0xFC,
|
||||||
|
0x7F, 0x00, 0x03, 0xC0, 0x7C, 0x0F, 0xC0, 0xFC, 0x1F, 0xC3, 0xBC, 0x3B,
|
||||||
|
0xC7, 0x3C, 0x73, 0xCF, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3C, 0x03,
|
||||||
|
0xC0, 0x3C, 0x03, 0xC0, 0x3F, 0xE3, 0xFE, 0x3F, 0xE3, 0x80, 0x38, 0x07,
|
||||||
|
0x80, 0x7F, 0x07, 0xFC, 0x7F, 0xE0, 0x3F, 0x00, 0xF0, 0x0F, 0x00, 0xF0,
|
||||||
|
0x1F, 0xFF, 0xEF, 0xFC, 0x7F, 0x00, 0x01, 0xE0, 0xFE, 0x1F, 0xE3, 0xF0,
|
||||||
|
0x7C, 0x07, 0x80, 0xFF, 0x8F, 0xFE, 0xFF, 0xEF, 0x1F, 0xF0, 0xFF, 0x0F,
|
||||||
|
0xF0, 0xF7, 0x9F, 0x7F, 0xE3, 0xFC, 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xF0, 0x1E, 0x03, 0xE0, 0x7C, 0x07, 0x80, 0x78, 0x0F, 0x00, 0xF0, 0x1F,
|
||||||
|
0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x03, 0xC0, 0x3C, 0x00, 0x1F, 0x83,
|
||||||
|
0xFE, 0x7F, 0xEF, 0x9F, 0xF0, 0xFF, 0x0F, 0xF9, 0xF7, 0xFE, 0x3F, 0xC7,
|
||||||
|
0xFE, 0xF9, 0xFF, 0x0F, 0xF0, 0xFF, 0x8F, 0xFF, 0xE7, 0xFE, 0x1F, 0x80,
|
||||||
|
0x1F, 0x83, 0xFC, 0x7F, 0xEF, 0x9E, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x8F,
|
||||||
|
0x7F, 0xF7, 0xFF, 0x1F, 0xF0, 0x1E, 0x03, 0xE0, 0x7C, 0x7F, 0x87, 0xF0,
|
||||||
|
0x78, 0x00, 0x6F, 0xF6, 0x00, 0x00, 0x06, 0xFF, 0x60, 0x33, 0xDE, 0x60,
|
||||||
|
0x00, 0x00, 0x03, 0xDE, 0xF7, 0xBF, 0xDE, 0x60, 0x00, 0x60, 0x3E, 0x1F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x8F, 0x00, 0xFF, 0x8F, 0xFF, 0x1F, 0xF0, 0x3E, 0x00,
|
||||||
|
0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0x60, 0x07, 0xC0, 0xFF, 0x8F, 0xFF, 0x1F, 0xF0, 0x0F, 0x1F, 0xFF, 0xFF,
|
||||||
|
0xFF, 0x87, 0xC0, 0x60, 0x00, 0x3E, 0x3F, 0xEF, 0xF9, 0x0F, 0x03, 0xC0,
|
||||||
|
0xF0, 0x7C, 0x1E, 0x0F, 0x83, 0xC1, 0xE0, 0x78, 0x1C, 0x07, 0x00, 0x00,
|
||||||
|
0x30, 0x1E, 0x07, 0x80, 0xC0, 0x01, 0xFC, 0x00, 0x3F, 0xFC, 0x03, 0xFF,
|
||||||
|
0xF0, 0x7E, 0x07, 0xC3, 0xC0, 0x0F, 0x3C, 0x7E, 0x39, 0xC7, 0xF8, 0xFE,
|
||||||
|
0x7F, 0xC7, 0xE7, 0x8E, 0x3F, 0x38, 0x71, 0xF9, 0xC3, 0x8F, 0xCE, 0x1C,
|
||||||
|
0x7E, 0x78, 0xE7, 0x71, 0xFF, 0xF9, 0xCF, 0xFF, 0x8F, 0x1F, 0xF8, 0x3C,
|
||||||
|
0x00, 0x01, 0xF8, 0x00, 0x07, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x1F, 0xE0,
|
||||||
|
0x00, 0x03, 0xE0, 0x01, 0xF0, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x77, 0x00,
|
||||||
|
0x7B, 0xC0, 0x3D, 0xE0, 0x3C, 0x78, 0x1E, 0x3C, 0x0F, 0x1E, 0x0F, 0xFF,
|
||||||
|
0x87, 0xFF, 0xC3, 0xFF, 0xE3, 0xC0, 0x79, 0xE0, 0x3D, 0xF0, 0x1E, 0xF0,
|
||||||
|
0x07, 0x80, 0xFF, 0x87, 0xFF, 0x3F, 0xF9, 0xE3, 0xEF, 0x0F, 0x78, 0x7B,
|
||||||
|
0xC7, 0xDF, 0xFC, 0xFF, 0xE7, 0xFF, 0xBC, 0x3F, 0xE0, 0xFF, 0x07, 0xF8,
|
||||||
|
0x7F, 0xFF, 0xDF, 0xFC, 0xFF, 0xC0, 0x07, 0xF0, 0x7F, 0xF3, 0xFF, 0xDF,
|
||||||
|
0x82, 0x78, 0x03, 0xE0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F,
|
||||||
|
0x00, 0x3E, 0x00, 0x78, 0x01, 0xF0, 0x23, 0xFF, 0xC7, 0xFF, 0x07, 0xF0,
|
||||||
|
0xFF, 0x81, 0xFF, 0xE3, 0xFF, 0xE7, 0x87, 0xEF, 0x03, 0xDE, 0x07, 0xFC,
|
||||||
|
0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x81, 0xFF, 0x03,
|
||||||
|
0xDE, 0x1F, 0xBF, 0xFE, 0x7F, 0xF0, 0xFF, 0x80, 0xFF, 0xEF, 0xFE, 0xFF,
|
||||||
|
0xEF, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE, 0xF0,
|
||||||
|
0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0xFE, 0xFF, 0xDF, 0xFB,
|
||||||
|
0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x00, 0x07, 0xF0,
|
||||||
|
0x7F, 0xF3, 0xFF, 0xDF, 0x02, 0x78, 0x03, 0xE0, 0x0F, 0x00, 0x3C, 0x00,
|
||||||
|
0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFE, 0x0F, 0x78, 0x3D, 0xF0, 0xF3, 0xFF,
|
||||||
|
0xC7, 0xFF, 0x07, 0xF8, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0,
|
||||||
|
0x3F, 0xC0, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFC,
|
||||||
|
0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3C, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xE0, 0x3C, 0x07, 0x80,
|
||||||
|
0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0,
|
||||||
|
0x1E, 0x87, 0xDF, 0xF7, 0xFE, 0x3F, 0x00, 0xF0, 0xFF, 0xC7, 0xEF, 0x1F,
|
||||||
|
0x3C, 0xF8, 0xF7, 0xC3, 0xFE, 0x0F, 0xF0, 0x3F, 0x80, 0xFF, 0x03, 0xFC,
|
||||||
|
0x0F, 0x78, 0x3D, 0xF0, 0xF3, 0xE3, 0xC7, 0x8F, 0x1F, 0x3C, 0x3E, 0xF0,
|
||||||
|
0x7C, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
|
||||||
|
0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xF0, 0x7C, 0x03, 0xCF, 0x80, 0xF9, 0xF0, 0x1F, 0x3F, 0x07,
|
||||||
|
0xE7, 0xE0, 0xFC, 0xFE, 0x3F, 0xBD, 0xC7, 0x7F, 0xBD, 0xEF, 0xF3, 0xB9,
|
||||||
|
0xFE, 0x77, 0x3F, 0xCF, 0xE7, 0xF8, 0xF8, 0xFF, 0x1F, 0x1F, 0xE1, 0xC3,
|
||||||
|
0xFC, 0x38, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xE0, 0xF0, 0x3F, 0xE0, 0xFF,
|
||||||
|
0x83, 0xFF, 0x0F, 0xFE, 0x3F, 0xF8, 0xFF, 0x73, 0xFD, 0xCF, 0xF3, 0xBF,
|
||||||
|
0xCF, 0xFF, 0x1F, 0xFC, 0x3F, 0xF0, 0xFF, 0xC1, 0xFF, 0x07, 0xFC, 0x0F,
|
||||||
|
0xF0, 0x3C, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x8F, 0x83, 0xE7, 0x80,
|
||||||
|
0xF7, 0xC0, 0x7F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC,
|
||||||
|
0x01, 0xFF, 0x01, 0xF7, 0x80, 0xF3, 0xE0, 0xF8, 0xFF, 0xF8, 0x3F, 0xF8,
|
||||||
|
0x07, 0xF0, 0x00, 0xFF, 0x0F, 0xFC, 0xFF, 0xEF, 0x1F, 0xF0, 0xFF, 0x0F,
|
||||||
|
0xF0, 0xFF, 0x1F, 0xFF, 0xEF, 0xFC, 0xFF, 0x8F, 0x00, 0xF0, 0x0F, 0x00,
|
||||||
|
0xF0, 0x0F, 0x00, 0xF0, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x8F,
|
||||||
|
0x83, 0xE7, 0x80, 0xF7, 0xC0, 0x7F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07,
|
||||||
|
0xF8, 0x03, 0xFC, 0x01, 0xFF, 0x01, 0xF7, 0x80, 0xF3, 0xE0, 0xF8, 0xFF,
|
||||||
|
0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x1F, 0xE0,
|
||||||
|
0x07, 0xF0, 0x00, 0xF0, 0xFF, 0x83, 0xFF, 0x8F, 0xFF, 0x3C, 0x3E, 0xF0,
|
||||||
|
0x7B, 0xC1, 0xEF, 0x07, 0xBC, 0x3E, 0xFF, 0xF3, 0xFF, 0x8F, 0xFC, 0x3C,
|
||||||
|
0xF8, 0xF1, 0xF3, 0xC3, 0xCF, 0x0F, 0xBC, 0x1E, 0xF0, 0x7C, 0x1F, 0x87,
|
||||||
|
0xFE, 0x7F, 0xCF, 0x04, 0xF0, 0x0F, 0x00, 0xFC, 0x07, 0xF8, 0x3F, 0xC0,
|
||||||
|
0xFE, 0x01, 0xF0, 0x0F, 0x00, 0xF4, 0x1F, 0xFF, 0xEF, 0xFE, 0x3F, 0x80,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78,
|
||||||
|
0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E,
|
||||||
|
0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0,
|
||||||
|
0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F,
|
||||||
|
0xE0, 0xFF, 0x07, 0xBC, 0x79, 0xFF, 0xC7, 0xFC, 0x0F, 0x80, 0xF0, 0x07,
|
||||||
|
0xFC, 0x07, 0x9E, 0x03, 0xCF, 0x01, 0xE3, 0xC1, 0xE1, 0xE0, 0xF0, 0xF0,
|
||||||
|
0x78, 0x3C, 0x78, 0x1E, 0x3C, 0x0F, 0x1E, 0x03, 0xDE, 0x01, 0xEF, 0x00,
|
||||||
|
0xF7, 0x80, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, 0x03, 0xE0, 0x00, 0xF0,
|
||||||
|
0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xE0, 0xE0, 0xFB, 0xC3, 0xE1, 0xE7, 0x87,
|
||||||
|
0xC3, 0xCF, 0x0F, 0x87, 0x9E, 0x1F, 0x8F, 0x3C, 0x77, 0x3E, 0x7C, 0xEE,
|
||||||
|
0x7C, 0x7B, 0xDE, 0xF0, 0xF7, 0x1D, 0xE1, 0xEE, 0x3B, 0xC3, 0xFC, 0x7F,
|
||||||
|
0x83, 0xF0, 0x7E, 0x07, 0xE0, 0xFC, 0x0F, 0xC1, 0xF8, 0x1F, 0x01, 0xF0,
|
||||||
|
0xF8, 0x1F, 0x7C, 0x3E, 0x3C, 0x3C, 0x3E, 0x7C, 0x1F, 0xF8, 0x0F, 0xF0,
|
||||||
|
0x0F, 0xF0, 0x07, 0xE0, 0x03, 0xC0, 0x07, 0xE0, 0x0F, 0xF0, 0x0F, 0xF0,
|
||||||
|
0x1F, 0xF8, 0x3E, 0x7C, 0x3C, 0x3C, 0x7C, 0x3E, 0xF8, 0x1F, 0xF8, 0x1F,
|
||||||
|
0x78, 0x1E, 0x7C, 0x3E, 0x3C, 0x3C, 0x3E, 0x7C, 0x1F, 0xF8, 0x0F, 0xF0,
|
||||||
|
0x0F, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
|
||||||
|
0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFE, 0x03, 0xE0, 0x1E, 0x01, 0xF0, 0x1F, 0x00, 0xF0, 0x0F, 0x80, 0xF8,
|
||||||
|
0x07, 0x80, 0x7C, 0x07, 0xC0, 0x3E, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E,
|
||||||
|
0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0xFF, 0xFF, 0x80, 0xF0, 0x07, 0x80,
|
||||||
|
0x78, 0x07, 0x80, 0x3C, 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x1E, 0x01, 0xE0,
|
||||||
|
0x0F, 0x00, 0xF0, 0x0F, 0x00, 0x78, 0x07, 0x80, 0x78, 0x03, 0xC0, 0x3C,
|
||||||
|
0x03, 0xC0, 0x1E, 0x01, 0xE0, 0x1E, 0x00, 0xF0, 0xFF, 0xFF, 0xF8, 0xF1,
|
||||||
|
0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C,
|
||||||
|
0x78, 0xFF, 0xFF, 0xFF, 0x80, 0x07, 0x00, 0x7C, 0x03, 0xE0, 0x3F, 0x83,
|
||||||
|
0xDE, 0x1E, 0xF1, 0xE3, 0xCE, 0x0E, 0xF0, 0x79, 0x01, 0x00, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xF0, 0x23, 0xC7, 0x8F, 0x08, 0x7F, 0x1F, 0xE7, 0xFC, 0x0F,
|
||||||
|
0x03, 0xCF, 0xF7, 0xFF, 0xCF, 0xF3, 0xFC, 0xFF, 0xFD, 0xFF, 0x3F, 0x80,
|
||||||
|
0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0x8F, 0xFC,
|
||||||
|
0xFF, 0xEF, 0x1F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x1E,
|
||||||
|
0xFF, 0xEF, 0xFC, 0x7F, 0x00, 0x0F, 0xCF, 0xF7, 0xFD, 0xE0, 0xF0, 0x3C,
|
||||||
|
0x0F, 0x03, 0xC0, 0xF0, 0x1E, 0x17, 0xFC, 0xFF, 0x1F, 0x80, 0x00, 0xF0,
|
||||||
|
0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x1F, 0xF3, 0xFF, 0x7F, 0xFF,
|
||||||
|
0x8F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xF7, 0x8F, 0x7F, 0xF3,
|
||||||
|
0xFF, 0x0F, 0xE0, 0x0F, 0x83, 0xFC, 0x7F, 0xE7, 0x9E, 0xF0, 0xFF, 0x0F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x82, 0x7F, 0xE3, 0xFE, 0x0F, 0xC0, 0x1F,
|
||||||
|
0x3F, 0x9F, 0xDF, 0x0F, 0x07, 0x83, 0xFD, 0xFE, 0xFF, 0x78, 0x3C, 0x1E,
|
||||||
|
0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x00, 0x1F, 0xC7, 0xFD,
|
||||||
|
0xFF, 0xFC, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF9, 0xEF, 0xFD, 0xFF,
|
||||||
|
0x8F, 0xF0, 0x1E, 0x87, 0xDF, 0xF3, 0xFE, 0x7F, 0x00, 0xF0, 0x1E, 0x03,
|
||||||
|
0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3F, 0xE7, 0xFE, 0xFF, 0xDE, 0x7F, 0xC7,
|
||||||
|
0xF8, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0x80,
|
||||||
|
0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1E, 0x3C,
|
||||||
|
0x78, 0xF0, 0x00, 0x07, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F,
|
||||||
|
0x1E, 0x3C, 0x78, 0xFF, 0xFF, 0xBE, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
|
||||||
|
0x00, 0xF0, 0x0F, 0x00, 0xF1, 0xFF, 0x3E, 0xF7, 0xCF, 0xF8, 0xFF, 0x0F,
|
||||||
|
0xE0, 0xFF, 0x0F, 0xF8, 0xF7, 0x8F, 0x7C, 0xF3, 0xEF, 0x1E, 0xF1, 0xF0,
|
||||||
|
0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3E,
|
||||||
|
0xFD, 0xF3, 0xC0, 0x7F, 0x3F, 0x3F, 0xFF, 0xEF, 0xFF, 0xFB, 0xCF, 0x9F,
|
||||||
|
0xF1, 0xE3, 0xFC, 0x78, 0xFF, 0x1E, 0x3F, 0xC7, 0x8F, 0xF1, 0xE3, 0xFC,
|
||||||
|
0x78, 0xFF, 0x1E, 0x3F, 0xC7, 0x8F, 0xF1, 0xE3, 0xC0, 0x7F, 0x1F, 0xFB,
|
||||||
|
0xFF, 0x79, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7,
|
||||||
|
0xF8, 0xFF, 0x1E, 0x0F, 0x81, 0xFF, 0x1F, 0xFC, 0xF1, 0xEF, 0x07, 0xF8,
|
||||||
|
0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7B, 0xC7, 0x9F, 0xFC, 0x7F, 0xC0, 0xF8,
|
||||||
|
0x00, 0x7F, 0x0F, 0xFC, 0xFF, 0xEF, 0x1E, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF,
|
||||||
|
0x0F, 0xF0, 0xFF, 0x1F, 0xFF, 0xEF, 0xFC, 0xFF, 0x8F, 0x00, 0xF0, 0x0F,
|
||||||
|
0x00, 0xF0, 0x00, 0x0F, 0xF1, 0xFF, 0xDF, 0xFE, 0xF0, 0xFF, 0x87, 0xF8,
|
||||||
|
0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0xC3, 0xDF, 0xFE, 0x7F, 0xF1, 0xFF,
|
||||||
|
0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x3F, 0xFF, 0xFF, 0xFE, 0x0F,
|
||||||
|
0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x00, 0x1F, 0x9F,
|
||||||
|
0xEF, 0xFB, 0xC0, 0xF0, 0x3F, 0xE7, 0xFC, 0xFF, 0x03, 0xE0, 0xFF, 0xFF,
|
||||||
|
0xFE, 0xFE, 0x00, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0xF7, 0xFB, 0xFD, 0xE0,
|
||||||
|
0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0xC3, 0xFC, 0xFE, 0x3F, 0x00, 0xF1,
|
||||||
|
0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFF,
|
||||||
|
0x3D, 0xFF, 0xBF, 0xF1, 0xFC, 0xF0, 0x7F, 0xC7, 0xDE, 0x3C, 0xF1, 0xE7,
|
||||||
|
0x8F, 0x1E, 0xF0, 0xF7, 0x87, 0xBC, 0x1D, 0xC0, 0xFE, 0x07, 0xF0, 0x1F,
|
||||||
|
0x00, 0xF8, 0x00, 0xF0, 0xE1, 0xFE, 0x1C, 0x3D, 0xC7, 0xC7, 0x3C, 0xF9,
|
||||||
|
0xE7, 0x9F, 0x3C, 0xF7, 0xE7, 0x0E, 0xEE, 0xE1, 0xDD, 0xDC, 0x3F, 0x3F,
|
||||||
|
0x83, 0xE3, 0xE0, 0x7C, 0x7C, 0x0F, 0x07, 0x80, 0xE0, 0xE0, 0xF8, 0xFB,
|
||||||
|
0xC7, 0x8F, 0x78, 0x7B, 0xC1, 0xFC, 0x07, 0xC0, 0x1C, 0x01, 0xF0, 0x1F,
|
||||||
|
0xC1, 0xEF, 0x0F, 0x78, 0xFB, 0xEF, 0x8F, 0x80, 0xF0, 0x7F, 0xC7, 0xDE,
|
||||||
|
0x3C, 0xF1, 0xE7, 0x8F, 0x1E, 0xF0, 0xF7, 0x87, 0xBC, 0x1D, 0xC0, 0xFE,
|
||||||
|
0x07, 0xF0, 0x1F, 0x00, 0xF8, 0x0F, 0x83, 0xFC, 0x1F, 0xC0, 0xFC, 0x00,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFC, 0x3E, 0x0F, 0x87, 0xC3, 0xE0, 0xF8, 0x7C, 0x1F,
|
||||||
|
0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0x1F, 0x3F, 0x3C, 0x3C, 0x3C, 0x3C,
|
||||||
|
0x3C, 0x3C, 0x7C, 0xF8, 0xF0, 0xF8, 0x7C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C,
|
||||||
|
0x3C, 0x3F, 0x1F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xF8, 0xF0, 0xF8, 0xFC, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3E, 0x1F,
|
||||||
|
0x0F, 0x1F, 0x3E, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0xFC, 0xF8, 0xF0,
|
||||||
|
0x38, 0x27, 0xE7, 0xFF, 0xEE, 0x7E, 0x41, 0xC0, 0xFF, 0xE0, 0x18, 0x06,
|
||||||
|
0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80,
|
||||||
|
0x60, 0x18, 0x06, 0x01, 0x80, 0x7F, 0xF0, 0x00, 0x6F, 0xF6, 0x0F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x00, 0xE0, 0x1C, 0x07, 0xF3, 0xFE,
|
||||||
|
0xFF, 0x9E, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x3C, 0x17, 0xFE, 0x7F,
|
||||||
|
0xC3, 0xF8, 0x38, 0x07, 0x00, 0xE0, 0x07, 0xC3, 0xFC, 0x7F, 0x1F, 0x03,
|
||||||
|
0xC0, 0x78, 0x0F, 0x07, 0xFC, 0xFF, 0x9F, 0xF0, 0xF0, 0x1E, 0x03, 0xC0,
|
||||||
|
0x78, 0x0F, 0xFB, 0xFF, 0x7F, 0xE0, 0x60, 0xDF, 0xFF, 0xFF, 0xBF, 0xE7,
|
||||||
|
0x1C, 0xE3, 0x9C, 0x73, 0xFE, 0xFF, 0xEF, 0xF9, 0x83, 0x00, 0xF8, 0x7D,
|
||||||
|
0xE1, 0xE7, 0x87, 0x8F, 0x3C, 0x3C, 0xF0, 0x7F, 0x81, 0xFE, 0x03, 0xF0,
|
||||||
|
0x7F, 0xF9, 0xFF, 0xE0, 0x78, 0x01, 0xE0, 0x7F, 0xF9, 0xFF, 0xE0, 0x78,
|
||||||
|
0x01, 0xE0, 0x07, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0x9F, 0xFF, 0xFF, 0xC2, 0xF0, 0x3F, 0x07,
|
||||||
|
0xF1, 0xFE, 0xF7, 0xFC, 0xFF, 0x3F, 0xCF, 0xFB, 0xDF, 0xE3, 0xF8, 0x3F,
|
||||||
|
0x03, 0xD0, 0xFF, 0xFF, 0xFE, 0x7F, 0x00, 0x61, 0xBC, 0xFF, 0x3D, 0x86,
|
||||||
|
0x07, 0xF0, 0x0F, 0xFC, 0x0F, 0x07, 0x8E, 0x00, 0xE6, 0x3E, 0x37, 0x3F,
|
||||||
|
0x9F, 0x3C, 0x07, 0x9C, 0x03, 0xCE, 0x01, 0xE7, 0x00, 0xF3, 0xC0, 0x7C,
|
||||||
|
0xFE, 0x76, 0x3E, 0x33, 0x80, 0x38, 0xF0, 0x78, 0x3F, 0xF0, 0x03, 0xF0,
|
||||||
|
0x00, 0x7E, 0x7F, 0x07, 0x1F, 0x7F, 0xF7, 0xE7, 0xFF, 0x7F, 0x18, 0x61,
|
||||||
|
0xC7, 0x38, 0xE7, 0x9E, 0x71, 0xCF, 0x3C, 0x71, 0xC7, 0x9E, 0x38, 0xE1,
|
||||||
|
0xC7, 0x18, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x00, 0x70, 0x07,
|
||||||
|
0x00, 0x70, 0x07, 0x00, 0x70, 0xFF, 0xFF, 0xF8, 0x07, 0xF0, 0x0F, 0xFC,
|
||||||
|
0x0F, 0x07, 0x8E, 0x00, 0xE6, 0x7E, 0x37, 0x3F, 0xDF, 0x18, 0x67, 0x8C,
|
||||||
|
0x33, 0xC7, 0xF9, 0xE3, 0xF8, 0xF1, 0x8C, 0x7C, 0xC3, 0x76, 0x61, 0xB3,
|
||||||
|
0x80, 0x38, 0xF0, 0x78, 0x3F, 0xF0, 0x03, 0xF0, 0x00, 0xFF, 0xFF, 0x38,
|
||||||
|
0xFB, 0x1E, 0x3C, 0x6F, 0x8E, 0x00, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0x0F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xF8, 0x3E, 0xFF, 0x47, 0x07, 0x0F, 0x3E, 0x78, 0xF0, 0xFF,
|
||||||
|
0xFF, 0x7C, 0xFE, 0x0E, 0x0E, 0x3C, 0x3F, 0x07, 0x07, 0xFF, 0xFC, 0x10,
|
||||||
|
0xF7, 0xBC, 0x40, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1F, 0xE3, 0xFC,
|
||||||
|
0x7F, 0x8F, 0xF1, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFD, 0xE0, 0x3C, 0x07,
|
||||||
|
0x80, 0xF0, 0x00, 0x07, 0xF0, 0xFF, 0xF7, 0xFF, 0xFF, 0xE7, 0xFF, 0x9F,
|
||||||
|
0xFE, 0x7F, 0xF9, 0xFF, 0xE7, 0x7F, 0x9C, 0xFE, 0x70, 0xF9, 0xC1, 0xE7,
|
||||||
|
0x07, 0x9C, 0x1E, 0x70, 0x79, 0xC1, 0xE7, 0x07, 0x9C, 0x1E, 0x70, 0x79,
|
||||||
|
0xC1, 0xE7, 0x07, 0x9C, 0x6F, 0xF6, 0x30, 0xE1, 0xBE, 0xF8, 0x1D, 0xFF,
|
||||||
|
0xD7, 0x1C, 0x71, 0xC7, 0x1C, 0x70, 0x3E, 0x3F, 0xBD, 0xDC, 0x7E, 0x3F,
|
||||||
|
0x1F, 0x8F, 0xEF, 0x7F, 0x1F, 0x00, 0x61, 0x8F, 0x3C, 0x71, 0xC7, 0x9E,
|
||||||
|
0x38, 0xE3, 0xCF, 0x38, 0xE7, 0x9E, 0x71, 0xCF, 0x3C, 0x61, 0x80, 0x1C,
|
||||||
|
0x0F, 0x07, 0xC0, 0xE0, 0xFC, 0x1E, 0x05, 0xC1, 0xC0, 0x1C, 0x3C, 0x01,
|
||||||
|
0xC3, 0x80, 0x1C, 0x78, 0x01, 0xC7, 0x1E, 0x1C, 0xF3, 0xE1, 0xCE, 0x3E,
|
||||||
|
0x01, 0xE7, 0xE0, 0x1C, 0xEE, 0x03, 0xDC, 0xE0, 0x39, 0xFF, 0x07, 0x9F,
|
||||||
|
0xF0, 0x70, 0x0E, 0x0F, 0x00, 0xE0, 0x1C, 0x1E, 0x0F, 0x83, 0x83, 0xF0,
|
||||||
|
0xF0, 0x2E, 0x1C, 0x01, 0xC7, 0x80, 0x38, 0xE0, 0x07, 0x3C, 0x00, 0xE7,
|
||||||
|
0x3E, 0x1D, 0xFF, 0xE3, 0xB9, 0x1C, 0x0F, 0x03, 0x81, 0xC0, 0xF0, 0x78,
|
||||||
|
0x7C, 0x0E, 0x1E, 0x03, 0xC7, 0x80, 0x70, 0xFF, 0x1E, 0x1F, 0xE0, 0x7C,
|
||||||
|
0x07, 0x87, 0xF0, 0x38, 0x03, 0x83, 0xC0, 0x1C, 0x1C, 0x03, 0xC1, 0xE0,
|
||||||
|
0x1F, 0x8E, 0x00, 0x1C, 0xF0, 0x00, 0xE7, 0x1E, 0xFF, 0x79, 0xF7, 0xE3,
|
||||||
|
0x8F, 0x80, 0x3C, 0xFC, 0x01, 0xCE, 0xE0, 0x1E, 0xE7, 0x00, 0xE7, 0xFC,
|
||||||
|
0x0F, 0x3F, 0xE0, 0x70, 0x0E, 0x07, 0x80, 0x70, 0x0C, 0x07, 0x81, 0xE0,
|
||||||
|
0x30, 0x00, 0x03, 0x80, 0xE0, 0x78, 0x3C, 0x1F, 0x07, 0x83, 0xC0, 0xF0,
|
||||||
|
0x3C, 0x2F, 0xFD, 0xFF, 0x3F, 0x00, 0x01, 0x00, 0x03, 0xC0, 0x00, 0xF0,
|
||||||
|
0x00, 0x3C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x07,
|
||||||
|
0xF0, 0x03, 0xF8, 0x01, 0xDC, 0x01, 0xEF, 0x00, 0xF7, 0x80, 0xF1, 0xE0,
|
||||||
|
0x78, 0xF0, 0x3C, 0x78, 0x3F, 0xFE, 0x1F, 0xFF, 0x0F, 0xFF, 0x8F, 0x01,
|
||||||
|
0xE7, 0x80, 0xF7, 0xC0, 0x7B, 0xC0, 0x1E, 0x00, 0x80, 0x00, 0xF0, 0x00,
|
||||||
|
0xF0, 0x00, 0xF0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x07, 0xC0,
|
||||||
|
0x07, 0xF0, 0x03, 0xF8, 0x01, 0xDC, 0x01, 0xEF, 0x00, 0xF7, 0x80, 0xF1,
|
||||||
|
0xE0, 0x78, 0xF0, 0x3C, 0x78, 0x3F, 0xFE, 0x1F, 0xFF, 0x0F, 0xFF, 0x8F,
|
||||||
|
0x01, 0xE7, 0x80, 0xF7, 0xC0, 0x7B, 0xC0, 0x1E, 0x00, 0x80, 0x00, 0xE0,
|
||||||
|
0x00, 0xF8, 0x00, 0xEE, 0x00, 0x22, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x07,
|
||||||
|
0xC0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xDC, 0x01, 0xEF, 0x00, 0xF7, 0x80,
|
||||||
|
0xF1, 0xE0, 0x78, 0xF0, 0x3C, 0x78, 0x3F, 0xFE, 0x1F, 0xFF, 0x0F, 0xFF,
|
||||||
|
0x8F, 0x01, 0xE7, 0x80, 0xF7, 0xC0, 0x7B, 0xC0, 0x1E, 0x03, 0x10, 0x03,
|
||||||
|
0xFC, 0x03, 0xFC, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80,
|
||||||
|
0x07, 0xC0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xDC, 0x01, 0xEF, 0x00, 0xF7,
|
||||||
|
0x80, 0xF1, 0xE0, 0x78, 0xF0, 0x3C, 0x78, 0x3F, 0xFE, 0x1F, 0xFF, 0x0F,
|
||||||
|
0xFF, 0x8F, 0x01, 0xE7, 0x80, 0xF7, 0xC0, 0x7B, 0xC0, 0x1E, 0x0C, 0x30,
|
||||||
|
0x0F, 0x3C, 0x07, 0x9E, 0x01, 0x86, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x0F,
|
||||||
|
0x80, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xB8, 0x03, 0xDE, 0x01, 0xEF, 0x01,
|
||||||
|
0xE3, 0xC0, 0xF1, 0xE0, 0x78, 0xF0, 0x7F, 0xFC, 0x3F, 0xFE, 0x1F, 0xFF,
|
||||||
|
0x1E, 0x03, 0xCF, 0x01, 0xEF, 0x80, 0xF7, 0x80, 0x3C, 0x03, 0xE0, 0x03,
|
||||||
|
0xF8, 0x01, 0x8C, 0x00, 0xC6, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80,
|
||||||
|
0x0F, 0xE0, 0x07, 0x70, 0x07, 0xB8, 0x03, 0xDE, 0x01, 0xEF, 0x01, 0xE3,
|
||||||
|
0xC0, 0xF1, 0xE0, 0x78, 0xF0, 0x7F, 0xFC, 0x3F, 0xFE, 0x3F, 0xFF, 0x1E,
|
||||||
|
0x03, 0xCF, 0x01, 0xEF, 0x80, 0xF7, 0x80, 0x3C, 0x00, 0x7F, 0xFC, 0x01,
|
||||||
|
0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x0F, 0xF8, 0x00, 0x1E, 0xF0, 0x00, 0x7D,
|
||||||
|
0xE0, 0x00, 0xF3, 0xC0, 0x03, 0xE7, 0xFE, 0x07, 0x8F, 0xFC, 0x1F, 0x1F,
|
||||||
|
0xF8, 0x7F, 0xFC, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0x81, 0xE0,
|
||||||
|
0x1F, 0x03, 0xFF, 0xBC, 0x07, 0xFF, 0xF8, 0x0F, 0xFE, 0x07, 0xF0, 0x7F,
|
||||||
|
0xF3, 0xFF, 0xDF, 0x82, 0x78, 0x03, 0xE0, 0x0F, 0x00, 0x3C, 0x00, 0xF0,
|
||||||
|
0x03, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x78, 0x01, 0xF0, 0x23, 0xFF, 0xC7,
|
||||||
|
0xFF, 0x03, 0xF8, 0x07, 0x00, 0x1E, 0x00, 0x38, 0x03, 0xE0, 0x0F, 0x00,
|
||||||
|
0x04, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x01, 0x00, 0x00, 0xFF, 0xEF, 0xFE,
|
||||||
|
0xFF, 0xEF, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE,
|
||||||
|
0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x02,
|
||||||
|
0x00, 0x78, 0x0F, 0x01, 0xE0, 0x08, 0x00, 0x00, 0xFF, 0xEF, 0xFE, 0xFF,
|
||||||
|
0xEF, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE, 0xF0,
|
||||||
|
0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x04, 0x00,
|
||||||
|
0xE0, 0x1F, 0x03, 0xB8, 0x11, 0x00, 0x00, 0xFF, 0xEF, 0xFE, 0xFF, 0xEF,
|
||||||
|
0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE, 0xF0, 0x0F,
|
||||||
|
0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x30, 0xC7, 0x9E,
|
||||||
|
0x79, 0xE3, 0x0C, 0x00, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE, 0xF0, 0x0F, 0x00,
|
||||||
|
0xF0, 0x0F, 0x00, 0xFF, 0xEF, 0xFE, 0xFF, 0xEF, 0x00, 0xF0, 0x0F, 0x00,
|
||||||
|
0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x23, 0xC7, 0x8F, 0x08, 0x07, 0x9E,
|
||||||
|
0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x80,
|
||||||
|
0x10, 0xF7, 0xBC, 0x40, 0x07, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E,
|
||||||
|
0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x80, 0x10, 0x71, 0xF7, 0x74, 0x40, 0x1E,
|
||||||
|
0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7,
|
||||||
|
0x8F, 0x1E, 0x00, 0x61, 0xBC, 0xFF, 0x3D, 0x86, 0x00, 0x07, 0x81, 0xE0,
|
||||||
|
0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E,
|
||||||
|
0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x80, 0x3F, 0xE0, 0x1F, 0xFE, 0x0F,
|
||||||
|
0xFF, 0x87, 0x87, 0xE3, 0xC0, 0xF1, 0xE0, 0x7C, 0xF0, 0x1F, 0xFF, 0x0F,
|
||||||
|
0xFF, 0x87, 0xFF, 0xC3, 0xCF, 0x01, 0xE7, 0x81, 0xF3, 0xC0, 0xF1, 0xE1,
|
||||||
|
0xF8, 0xFF, 0xF8, 0x7F, 0xF0, 0x3F, 0xE0, 0x00, 0x06, 0x20, 0x3F, 0xC1,
|
||||||
|
0xFE, 0x02, 0x30, 0x00, 0x00, 0x00, 0x0F, 0x03, 0xFE, 0x0F, 0xF8, 0x3F,
|
||||||
|
0xF0, 0xFF, 0xE3, 0xFF, 0x8F, 0xF7, 0x3F, 0xDC, 0xFF, 0x3B, 0xFC, 0xFF,
|
||||||
|
0xF1, 0xFF, 0xC3, 0xFF, 0x0F, 0xFC, 0x1F, 0xF0, 0x7F, 0xC0, 0xFF, 0x03,
|
||||||
|
0xC0, 0x01, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x04, 0x00,
|
||||||
|
0x00, 0x00, 0x1F, 0xC0, 0x3F, 0xF8, 0x3F, 0xFE, 0x3E, 0x0F, 0x9E, 0x03,
|
||||||
|
0xDF, 0x01, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0,
|
||||||
|
0x07, 0xFC, 0x07, 0xDE, 0x03, 0xCF, 0x83, 0xE3, 0xFF, 0xE0, 0xFF, 0xE0,
|
||||||
|
0x1F, 0xC0, 0x00, 0x40, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x10,
|
||||||
|
0x00, 0x00, 0x00, 0x1F, 0xC0, 0x3F, 0xF8, 0x3F, 0xFE, 0x3E, 0x0F, 0x9E,
|
||||||
|
0x03, 0xDF, 0x01, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F,
|
||||||
|
0xF0, 0x07, 0xFC, 0x07, 0xDE, 0x03, 0xCF, 0x83, 0xE3, 0xFF, 0xE0, 0xFF,
|
||||||
|
0xE0, 0x1F, 0xC0, 0x00, 0x80, 0x00, 0xE0, 0x00, 0xF8, 0x00, 0xEE, 0x00,
|
||||||
|
0x22, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x3F, 0xF8, 0x3F, 0xFE, 0x3E, 0x0F,
|
||||||
|
0x9E, 0x03, 0xDF, 0x01, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0,
|
||||||
|
0x0F, 0xF0, 0x07, 0xFC, 0x07, 0xDE, 0x03, 0xCF, 0x83, 0xE3, 0xFF, 0xE0,
|
||||||
|
0xFF, 0xE0, 0x1F, 0xC0, 0x03, 0x10, 0x03, 0xFC, 0x03, 0xFC, 0x00, 0x8C,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x3F, 0xF8, 0x3F, 0xFE, 0x3E,
|
||||||
|
0x0F, 0x9E, 0x03, 0xDF, 0x01, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F,
|
||||||
|
0xE0, 0x0F, 0xF0, 0x07, 0xFC, 0x07, 0xDE, 0x03, 0xCF, 0x83, 0xE3, 0xFF,
|
||||||
|
0xE0, 0xFF, 0xE0, 0x1F, 0xC0, 0x0C, 0x30, 0x0F, 0x3C, 0x07, 0x9E, 0x01,
|
||||||
|
0x86, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x7F, 0xF0, 0x7F, 0xFC, 0x7C, 0x1F,
|
||||||
|
0x3C, 0x07, 0xBE, 0x03, 0xFE, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0,
|
||||||
|
0x1F, 0xE0, 0x0F, 0xF8, 0x0F, 0xBC, 0x07, 0x9F, 0x07, 0xC7, 0xFF, 0xC1,
|
||||||
|
0xFF, 0xC0, 0x3F, 0x80, 0x20, 0x47, 0x0E, 0xF9, 0xF7, 0xFE, 0x1F, 0x80,
|
||||||
|
0xF0, 0x1F, 0x83, 0xFC, 0xF9, 0xF7, 0x0E, 0x20, 0x40, 0x00, 0x02, 0x03,
|
||||||
|
0xFB, 0x87, 0xFF, 0xC7, 0xFF, 0xC7, 0xC3, 0xF3, 0xC1, 0xFB, 0xE1, 0xFF,
|
||||||
|
0xE1, 0xEF, 0xF0, 0xE7, 0xF8, 0xE3, 0xFC, 0xE1, 0xFE, 0xF0, 0xFF, 0xF0,
|
||||||
|
0xFB, 0xF0, 0x79, 0xF8, 0x7C, 0x7F, 0xFC, 0x7F, 0xFC, 0x3B, 0xF8, 0x08,
|
||||||
|
0x00, 0x00, 0x04, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x10, 0x00, 0x03,
|
||||||
|
0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8,
|
||||||
|
0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1E, 0xF1, 0xE7, 0xFF,
|
||||||
|
0x1F, 0xF0, 0x3E, 0x00, 0x01, 0x00, 0x1E, 0x01, 0xE0, 0x1E, 0x00, 0x40,
|
||||||
|
0x00, 0x03, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF,
|
||||||
|
0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1E, 0xF1,
|
||||||
|
0xE7, 0xFF, 0x1F, 0xF0, 0x3E, 0x00, 0x02, 0x00, 0x38, 0x03, 0xE0, 0x3B,
|
||||||
|
0x80, 0x88, 0x00, 0x03, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F,
|
||||||
|
0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC,
|
||||||
|
0x1E, 0xF1, 0xE7, 0xFF, 0x1F, 0xF0, 0x3E, 0x00, 0x30, 0xC3, 0xCF, 0x1E,
|
||||||
|
0x78, 0x61, 0x80, 0x00, 0x78, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83,
|
||||||
|
0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F,
|
||||||
|
0x83, 0xDE, 0x3C, 0xFF, 0xE3, 0xFE, 0x07, 0xC0, 0x00, 0x40, 0x00, 0xF0,
|
||||||
|
0x01, 0xE0, 0x03, 0xC0, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x78, 0x1E,
|
||||||
|
0x7C, 0x3E, 0x3C, 0x3C, 0x3E, 0x7C, 0x1F, 0xF8, 0x0F, 0xF0, 0x0F, 0xF0,
|
||||||
|
0x07, 0xE0, 0x07, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
|
||||||
|
0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xF0, 0x0F, 0x00, 0xFF, 0x8F, 0xFC,
|
||||||
|
0xFF, 0xEF, 0x1F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF1, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xCF, 0xF0, 0xF0, 0x0F, 0x00, 0xF0, 0x00, 0x1F, 0x03, 0xFC, 0x1F,
|
||||||
|
0xF1, 0xE7, 0x8F, 0x3C, 0x79, 0xE3, 0xCF, 0x1E, 0xF0, 0xF7, 0x87, 0xBC,
|
||||||
|
0x3D, 0xF1, 0xEF, 0xCF, 0x1F, 0x78, 0x7F, 0xC1, 0xFE, 0x8F, 0xF7, 0xFF,
|
||||||
|
0xBF, 0xBD, 0xF8, 0x08, 0x0F, 0x01, 0xE0, 0x3C, 0x02, 0x00, 0x07, 0xF1,
|
||||||
|
0xFE, 0x7F, 0xC0, 0xF0, 0x3C, 0xFF, 0x7F, 0xFC, 0xFF, 0x3F, 0xCF, 0xFF,
|
||||||
|
0xDF, 0xF3, 0xF8, 0x04, 0x03, 0xC1, 0xE0, 0xF0, 0x10, 0x00, 0x07, 0xF1,
|
||||||
|
0xFE, 0x7F, 0xC0, 0xF0, 0x3C, 0xFF, 0x7F, 0xFC, 0xFF, 0x3F, 0xCF, 0xFF,
|
||||||
|
0xDF, 0xF3, 0xF8, 0x08, 0x07, 0x03, 0xE1, 0xDC, 0x22, 0x00, 0x07, 0xF1,
|
||||||
|
0xFE, 0x7F, 0xC0, 0xF0, 0x3C, 0xFF, 0x7F, 0xFC, 0xFF, 0x3F, 0xCF, 0xFF,
|
||||||
|
0xDF, 0xF3, 0xF8, 0x18, 0x8F, 0xF7, 0xF8, 0x8C, 0x00, 0x00, 0x07, 0xF1,
|
||||||
|
0xFE, 0x7F, 0xC0, 0xF0, 0x3C, 0xFF, 0x7F, 0xFC, 0xFF, 0x3F, 0xCF, 0xFF,
|
||||||
|
0xDF, 0xF3, 0xF8, 0x61, 0xBC, 0xFF, 0x3D, 0x86, 0x00, 0x1F, 0xC7, 0xF9,
|
||||||
|
0xFF, 0x03, 0xC0, 0xF3, 0xFD, 0xFF, 0xF3, 0xFC, 0xFF, 0x3F, 0xFF, 0x7F,
|
||||||
|
0xCF, 0xE0, 0x1E, 0x0F, 0xC3, 0x30, 0xCC, 0x3F, 0x07, 0x80, 0x01, 0xFC,
|
||||||
|
0x7F, 0x9F, 0xF0, 0x3C, 0x0F, 0x3F, 0xDF, 0xFF, 0x3F, 0xCF, 0xF3, 0xFF,
|
||||||
|
0xF7, 0xFC, 0xFE, 0x3F, 0x8F, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x00, 0xFD,
|
||||||
|
0xF0, 0x0F, 0x1E, 0x3F, 0xE3, 0xDF, 0xFF, 0xFF, 0xC7, 0xFF, 0xF0, 0xF0,
|
||||||
|
0x1E, 0x0F, 0x0B, 0xFF, 0xFF, 0x3F, 0xFF, 0xE3, 0xF9, 0xF8, 0x0F, 0x8F,
|
||||||
|
0xF7, 0xF9, 0xE0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x1E, 0x17, 0xFC,
|
||||||
|
0xFF, 0x07, 0xC1, 0x80, 0x70, 0x1C, 0x1F, 0x07, 0x80, 0x04, 0x01, 0xE0,
|
||||||
|
0x0F, 0x00, 0x78, 0x01, 0x00, 0x00, 0x0F, 0x83, 0xFC, 0x7F, 0xE7, 0x9E,
|
||||||
|
0xF0, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x82, 0x7F, 0xE3, 0xFE,
|
||||||
|
0x0F, 0xC0, 0x02, 0x00, 0x78, 0x0F, 0x01, 0xE0, 0x08, 0x00, 0x00, 0x0F,
|
||||||
|
0x83, 0xFC, 0x7F, 0xE7, 0x9E, 0xF0, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0,
|
||||||
|
0x07, 0x82, 0x7F, 0xE3, 0xFE, 0x0F, 0xC0, 0x04, 0x00, 0xE0, 0x1F, 0x03,
|
||||||
|
0xB8, 0x11, 0x00, 0x00, 0x0F, 0x83, 0xFC, 0x7F, 0xE7, 0x9E, 0xF0, 0xFF,
|
||||||
|
0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x82, 0x7F, 0xE3, 0xFE, 0x0F, 0xC0,
|
||||||
|
0x30, 0xC7, 0x9E, 0x79, 0xE3, 0x0C, 0x00, 0x00, 0xF8, 0x3F, 0xC7, 0xFE,
|
||||||
|
0x79, 0xEF, 0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x78, 0x27, 0xFE,
|
||||||
|
0x3F, 0xE0, 0xFC, 0x23, 0xC7, 0x8F, 0x08, 0x07, 0x9E, 0x79, 0xE7, 0x9E,
|
||||||
|
0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x80, 0x10, 0xF7, 0xBC, 0x40, 0x07, 0x9E,
|
||||||
|
0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x80, 0x10, 0x71, 0xF7,
|
||||||
|
0x74, 0x40, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78,
|
||||||
|
0xF1, 0xE0, 0x61, 0xBC, 0xFF, 0x3D, 0x86, 0x00, 0x07, 0x81, 0xE0, 0x78,
|
||||||
|
0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07,
|
||||||
|
0x80, 0x02, 0x00, 0xF1, 0x07, 0xF0, 0x7F, 0x0F, 0xE0, 0x5E, 0x00, 0xE1,
|
||||||
|
0xFF, 0x3F, 0xF7, 0xFF, 0xF8, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF,
|
||||||
|
0x9E, 0x7F, 0xE3, 0xFC, 0x1F, 0x00, 0x18, 0x87, 0xF9, 0xFE, 0x11, 0x80,
|
||||||
|
0x00, 0x00, 0x1F, 0xC7, 0xFE, 0xFF, 0xDE, 0x7F, 0xC7, 0xF8, 0xFF, 0x1F,
|
||||||
|
0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0x80, 0x04, 0x00, 0xF0,
|
||||||
|
0x03, 0xC0, 0x0F, 0x00, 0x10, 0x00, 0x00, 0x3E, 0x07, 0xFC, 0x7F, 0xF3,
|
||||||
|
0xC7, 0xBC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xEF, 0x1E, 0x7F,
|
||||||
|
0xF1, 0xFF, 0x03, 0xE0, 0x01, 0x00, 0x1E, 0x01, 0xE0, 0x1E, 0x00, 0x40,
|
||||||
|
0x00, 0x00, 0x3E, 0x07, 0xFC, 0x7F, 0xF3, 0xC7, 0xBC, 0x1F, 0xE0, 0xFF,
|
||||||
|
0x07, 0xF8, 0x3F, 0xC1, 0xEF, 0x1E, 0x7F, 0xF1, 0xFF, 0x03, 0xE0, 0x02,
|
||||||
|
0x00, 0x38, 0x03, 0xE0, 0x3B, 0x80, 0x88, 0x00, 0x00, 0x3E, 0x07, 0xFC,
|
||||||
|
0x7F, 0xF3, 0xC7, 0xBC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xEF,
|
||||||
|
0x1E, 0x7F, 0xF1, 0xFF, 0x03, 0xE0, 0x0C, 0x40, 0xFF, 0x0F, 0xF0, 0x23,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x3E, 0x07, 0xFC, 0x7F, 0xF3, 0xC7, 0xBC, 0x1F,
|
||||||
|
0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xEF, 0x1E, 0x7F, 0xF1, 0xFF, 0x03,
|
||||||
|
0xE0, 0x30, 0xC3, 0xCF, 0x1E, 0x78, 0x61, 0x80, 0x00, 0x07, 0xC0, 0xFF,
|
||||||
|
0x8F, 0xFE, 0x78, 0xF7, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3D,
|
||||||
|
0xE3, 0xCF, 0xFE, 0x3F, 0xE0, 0x7C, 0x00, 0x06, 0x00, 0xF0, 0x0F, 0x00,
|
||||||
|
0x60, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x60, 0x0F, 0x00,
|
||||||
|
0xF0, 0x06, 0x00, 0x00, 0x00, 0x7D, 0xCF, 0xFC, 0xFF, 0xE7, 0x8F, 0x78,
|
||||||
|
0xFF, 0xCF, 0xFE, 0xEF, 0xFE, 0x7F, 0xE3, 0xDE, 0x3C, 0xFF, 0xE7, 0xFE,
|
||||||
|
0x77, 0xC0, 0x00, 0x00, 0x08, 0x07, 0x80, 0x78, 0x07, 0x80, 0x20, 0x00,
|
||||||
|
0x3C, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1F, 0xE3, 0xFC,
|
||||||
|
0x7F, 0xCF, 0x7F, 0xEF, 0xFC, 0x7F, 0x00, 0x02, 0x00, 0xF0, 0x3C, 0x0F,
|
||||||
|
0x00, 0x80, 0x00, 0x3C, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF,
|
||||||
|
0x1F, 0xE3, 0xFC, 0x7F, 0xCF, 0x7F, 0xEF, 0xFC, 0x7F, 0x00, 0x04, 0x01,
|
||||||
|
0xC0, 0x7C, 0x1D, 0xC1, 0x10, 0x00, 0x3C, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F,
|
||||||
|
0xC7, 0xF8, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0xCF, 0x7F, 0xEF, 0xFC, 0x7F,
|
||||||
|
0x00, 0x61, 0x9E, 0x7B, 0xCF, 0x30, 0xC0, 0x01, 0xE3, 0xFC, 0x7F, 0x8F,
|
||||||
|
0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1F, 0xE3, 0xFE, 0x7B, 0xFF, 0x7F,
|
||||||
|
0xE3, 0xF8, 0x00, 0x80, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0x20, 0x00, 0x03,
|
||||||
|
0xC1, 0xFF, 0x1F, 0x78, 0xF3, 0xC7, 0x9E, 0x3C, 0x7B, 0xC3, 0xDE, 0x1E,
|
||||||
|
0xF0, 0x77, 0x03, 0xF8, 0x1F, 0xC0, 0x7C, 0x03, 0xE0, 0x3E, 0x0F, 0xF0,
|
||||||
|
0x7F, 0x03, 0xF0, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
|
||||||
|
0x00, 0xFF, 0x0F, 0xFC, 0xFF, 0xEF, 0x1E, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF,
|
||||||
|
0x0F, 0xF0, 0xFF, 0x1F, 0xFF, 0xEF, 0xFC, 0xFF, 0x8F, 0x00, 0xF0, 0x0F,
|
||||||
|
0x00, 0xF0, 0x00, 0x18, 0x61, 0xE7, 0x8F, 0x3C, 0x30, 0xC0, 0x00, 0x78,
|
||||||
|
0x3F, 0xE3, 0xEF, 0x1E, 0x78, 0xF3, 0xC7, 0x8F, 0x78, 0x7B, 0xC3, 0xDE,
|
||||||
|
0x0E, 0xE0, 0x7F, 0x03, 0xF8, 0x0F, 0x80, 0x7C, 0x07, 0xC1, 0xFE, 0x0F,
|
||||||
|
0xE0, 0x7E, 0x00 };
|
||||||
|
|
||||||
|
const GFXglyph Ubuntu_Bold12pt8bGlyphs[] PROGMEM = {
|
||||||
|
{ 0, 1, 1, 6, 0, 0 }, // 0x20 ' ' U+0020
|
||||||
|
{ 1, 4, 17, 8, 2, -16 }, // 0x21 '!' U+0021
|
||||||
|
{ 10, 9, 7, 11, 1, -17 }, // 0x22 '"' U+0022
|
||||||
|
{ 18, 15, 17, 17, 1, -16 }, // 0x23 '#' U+0023
|
||||||
|
{ 50, 12, 22, 14, 1, -18 }, // 0x24 '$' U+0024
|
||||||
|
{ 83, 20, 17, 22, 1, -16 }, // 0x25 '%' U+0025
|
||||||
|
{ 126, 16, 17, 17, 1, -16 }, // 0x26 '&' U+0026
|
||||||
|
{ 160, 4, 7, 6, 1, -17 }, // 0x27 ''' U+0027
|
||||||
|
{ 164, 7, 23, 9, 2, -18 }, // 0x28 '(' U+0028
|
||||||
|
{ 185, 7, 23, 9, 0, -18 }, // 0x29 ')' U+0029
|
||||||
|
{ 206, 11, 10, 12, 1, -16 }, // 0x2a '*' U+002A
|
||||||
|
{ 220, 11, 11, 13, 1, -12 }, // 0x2b '+' U+002B
|
||||||
|
{ 236, 5, 8, 6, 0, -3 }, // 0x2c ',' U+002C
|
||||||
|
{ 241, 7, 3, 9, 1, -8 }, // 0x2d '-' U+002D
|
||||||
|
{ 244, 4, 4, 6, 1, -3 }, // 0x2e '.' U+002E
|
||||||
|
{ 246, 12, 23, 10, -1, -18 }, // 0x2f '/' U+002F
|
||||||
|
{ 281, 12, 17, 14, 1, -16 }, // 0x30 '0' U+0030
|
||||||
|
{ 307, 8, 17, 14, 2, -16 }, // 0x31 '1' U+0031
|
||||||
|
{ 324, 12, 17, 14, 1, -16 }, // 0x32 '2' U+0032
|
||||||
|
{ 350, 11, 17, 14, 1, -16 }, // 0x33 '3' U+0033
|
||||||
|
{ 374, 12, 17, 14, 1, -16 }, // 0x34 '4' U+0034
|
||||||
|
{ 400, 12, 17, 14, 1, -16 }, // 0x35 '5' U+0035
|
||||||
|
{ 426, 12, 17, 14, 1, -16 }, // 0x36 '6' U+0036
|
||||||
|
{ 452, 12, 17, 14, 1, -16 }, // 0x37 '7' U+0037
|
||||||
|
{ 478, 12, 17, 14, 1, -16 }, // 0x38 '8' U+0038
|
||||||
|
{ 504, 12, 17, 14, 1, -16 }, // 0x39 '9' U+0039
|
||||||
|
{ 530, 4, 13, 6, 1, -12 }, // 0x3a ':' U+003A
|
||||||
|
{ 537, 5, 17, 6, 0, -12 }, // 0x3b ';' U+003B
|
||||||
|
{ 548, 12, 11, 14, 1, -12 }, // 0x3c '<' U+003C
|
||||||
|
{ 565, 11, 8, 14, 2, -10 }, // 0x3d '=' U+003D
|
||||||
|
{ 576, 12, 11, 14, 1, -12 }, // 0x3e '>' U+003E
|
||||||
|
{ 593, 10, 19, 11, 0, -18 }, // 0x3f '?' U+003F
|
||||||
|
{ 617, 21, 21, 23, 1, -16 }, // 0x40 '@' U+0040
|
||||||
|
{ 673, 17, 17, 17, 0, -16 }, // 0x41 'A' U+0041
|
||||||
|
{ 710, 13, 17, 16, 2, -16 }, // 0x42 'B' U+0042
|
||||||
|
{ 738, 14, 17, 16, 1, -16 }, // 0x43 'C' U+0043
|
||||||
|
{ 768, 15, 17, 18, 2, -16 }, // 0x44 'D' U+0044
|
||||||
|
{ 800, 12, 17, 15, 2, -16 }, // 0x45 'E' U+0045
|
||||||
|
{ 826, 11, 17, 14, 2, -16 }, // 0x46 'F' U+0046
|
||||||
|
{ 850, 14, 17, 17, 1, -16 }, // 0x47 'G' U+0047
|
||||||
|
{ 880, 14, 17, 18, 2, -16 }, // 0x48 'H' U+0048
|
||||||
|
{ 910, 4, 17, 8, 2, -16 }, // 0x49 'I' U+0049
|
||||||
|
{ 919, 11, 17, 13, 0, -16 }, // 0x4a 'J' U+004A
|
||||||
|
{ 943, 14, 17, 16, 2, -16 }, // 0x4b 'K' U+004B
|
||||||
|
{ 973, 12, 17, 14, 2, -16 }, // 0x4c 'L' U+004C
|
||||||
|
{ 999, 19, 17, 21, 1, -16 }, // 0x4d 'M' U+004D
|
||||||
|
{ 1040, 14, 17, 18, 2, -16 }, // 0x4e 'N' U+004E
|
||||||
|
{ 1070, 17, 17, 19, 1, -16 }, // 0x4f 'O' U+004F
|
||||||
|
{ 1107, 12, 17, 15, 2, -16 }, // 0x50 'P' U+0050
|
||||||
|
{ 1133, 17, 22, 19, 1, -16 }, // 0x51 'Q' U+0051
|
||||||
|
{ 1180, 14, 17, 16, 2, -16 }, // 0x52 'R' U+0052
|
||||||
|
{ 1210, 12, 17, 14, 1, -16 }, // 0x53 'S' U+0053
|
||||||
|
{ 1236, 14, 17, 14, 0, -16 }, // 0x54 'T' U+0054
|
||||||
|
{ 1266, 13, 17, 17, 2, -16 }, // 0x55 'U' U+0055
|
||||||
|
{ 1294, 17, 17, 17, 0, -16 }, // 0x56 'V' U+0056
|
||||||
|
{ 1331, 23, 17, 23, 0, -16 }, // 0x57 'W' U+0057
|
||||||
|
{ 1380, 16, 17, 16, 0, -16 }, // 0x58 'X' U+0058
|
||||||
|
{ 1414, 16, 17, 16, 0, -16 }, // 0x59 'Y' U+0059
|
||||||
|
{ 1448, 13, 17, 15, 1, -16 }, // 0x5a 'Z' U+005A
|
||||||
|
{ 1476, 7, 23, 9, 2, -18 }, // 0x5b '[' U+005B
|
||||||
|
{ 1497, 12, 23, 10, -1, -18 }, // 0x5c '\' U+005C
|
||||||
|
{ 1532, 7, 23, 9, 0, -18 }, // 0x5d ']' U+005D
|
||||||
|
{ 1553, 13, 10, 13, 0, -16 }, // 0x5e '^' U+005E
|
||||||
|
{ 1570, 12, 3, 12, 0, 2 }, // 0x5f '_' U+005F
|
||||||
|
{ 1575, 6, 5, 7, 1, -18 }, // 0x60 '`' U+0060
|
||||||
|
{ 1579, 10, 13, 13, 1, -12 }, // 0x61 'a' U+0061
|
||||||
|
{ 1596, 12, 19, 15, 2, -18 }, // 0x62 'b' U+0062
|
||||||
|
{ 1625, 10, 13, 12, 1, -12 }, // 0x63 'c' U+0063
|
||||||
|
{ 1642, 12, 19, 15, 1, -18 }, // 0x64 'd' U+0064
|
||||||
|
{ 1671, 12, 13, 14, 1, -12 }, // 0x65 'e' U+0065
|
||||||
|
{ 1691, 9, 19, 10, 2, -18 }, // 0x66 'f' U+0066
|
||||||
|
{ 1713, 11, 17, 14, 1, -12 }, // 0x67 'g' U+0067
|
||||||
|
{ 1737, 11, 19, 15, 2, -18 }, // 0x68 'h' U+0068
|
||||||
|
{ 1764, 4, 19, 8, 2, -18 }, // 0x69 'i' U+0069
|
||||||
|
{ 1774, 7, 23, 6, -2, -18 }, // 0x6a 'j' U+006A
|
||||||
|
{ 1795, 12, 19, 14, 2, -18 }, // 0x6b 'k' U+006B
|
||||||
|
{ 1824, 6, 19, 8, 2, -18 }, // 0x6c 'l' U+006C
|
||||||
|
{ 1839, 18, 13, 22, 2, -12 }, // 0x6d 'm' U+006D
|
||||||
|
{ 1869, 11, 13, 15, 2, -12 }, // 0x6e 'n' U+006E
|
||||||
|
{ 1887, 13, 13, 15, 1, -12 }, // 0x6f 'o' U+006F
|
||||||
|
{ 1909, 12, 17, 15, 2, -12 }, // 0x70 'p' U+0070
|
||||||
|
{ 1935, 13, 17, 15, 1, -12 }, // 0x71 'q' U+0071
|
||||||
|
{ 1963, 9, 13, 11, 2, -12 }, // 0x72 'r' U+0072
|
||||||
|
{ 1978, 10, 13, 12, 1, -12 }, // 0x73 's' U+0073
|
||||||
|
{ 1995, 9, 17, 11, 2, -16 }, // 0x74 't' U+0074
|
||||||
|
{ 2015, 11, 13, 15, 2, -12 }, // 0x75 'u' U+0075
|
||||||
|
{ 2033, 13, 13, 13, 0, -12 }, // 0x76 'v' U+0076
|
||||||
|
{ 2055, 19, 13, 19, 0, -12 }, // 0x77 'w' U+0077
|
||||||
|
{ 2086, 13, 13, 13, 0, -12 }, // 0x78 'x' U+0078
|
||||||
|
{ 2108, 13, 17, 13, 0, -12 }, // 0x79 'y' U+0079
|
||||||
|
{ 2136, 10, 13, 12, 1, -12 }, // 0x7a 'z' U+007A
|
||||||
|
{ 2153, 8, 23, 9, 1, -18 }, // 0x7b '{' U+007B
|
||||||
|
{ 2176, 3, 23, 7, 2, -18 }, // 0x7c '|' U+007C
|
||||||
|
{ 2185, 8, 23, 9, 0, -18 }, // 0x7d '}' U+007D
|
||||||
|
{ 2208, 12, 5, 14, 1, -9 }, // 0x7e '~' U+007E
|
||||||
|
{ 2216, 10, 18, 12, 1, -17 }, // 0x7f 'REPLACEMENT CHARACTER *' U+2370
|
||||||
|
{ 2239, 1, 1, 6, 0, 0 }, // 0x80 'NO-BREAK SPACE' U+00A0
|
||||||
|
{ 2240, 4, 17, 8, 2, -12 }, // 0x81 'INVERTED EXCLAMATION MARK' U+00A1
|
||||||
|
{ 2249, 11, 18, 14, 1, -15 }, // 0x82 'CENT SIGN' U+00A2
|
||||||
|
{ 2274, 11, 17, 14, 1, -16 }, // 0x83 'POUND SIGN' U+00A3
|
||||||
|
{ 2298, 11, 11, 14, 1, -13 }, // 0x84 'CURRENCY SIGN' U+00A4
|
||||||
|
{ 2314, 14, 17, 14, 0, -16 }, // 0x85 'YEN SIGN' U+00A5
|
||||||
|
{ 2344, 4, 23, 7, 2, -18 }, // 0x86 'BROKEN BAR' U+00A6
|
||||||
|
{ 2356, 10, 21, 12, 1, -16 }, // 0x87 'SECTION SIGN' U+00A7
|
||||||
|
{ 2383, 10, 4, 13, 2, -17 }, // 0x88 'DIAERESIS' U+00A8
|
||||||
|
{ 2388, 17, 17, 19, 1, -16 }, // 0x89 'COPYRIGHT SIGN' U+00A9
|
||||||
|
{ 2425, 8, 9, 10, 1, -16 }, // 0x8a 'FEMININE ORDINAL INDICATOR' U+00AA
|
||||||
|
{ 2434, 12, 11, 14, 1, -11 }, // 0x8b 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00AB
|
||||||
|
{ 2451, 12, 9, 14, 1, -9 }, // 0x8c 'NOT SIGN' U+00AC
|
||||||
|
{ 2465, 7, 3, 9, 1, -8 }, // 0x8d 'SOFT HYPHEN' U+00AD
|
||||||
|
{ 2468, 17, 17, 19, 1, -16 }, // 0x8e 'REGISTERED SIGN' U+00AE
|
||||||
|
{ 2505, 8, 2, 9, 1, -16 }, // 0x8f 'MACRON' U+00AF
|
||||||
|
{ 2507, 7, 7, 8, 0, -17 }, // 0x90 'DEGREE SIGN' U+00B0
|
||||||
|
{ 2514, 11, 15, 13, 1, -14 }, // 0x91 'PLUS-MINUS SIGN' U+00B1
|
||||||
|
{ 2535, 8, 10, 9, 0, -16 }, // 0x92 'SUPERSCRIPT TWO' U+00B2
|
||||||
|
{ 2545, 8, 10, 9, 0, -16 }, // 0x93 'SUPERSCRIPT THREE' U+00B3
|
||||||
|
{ 2555, 6, 5, 7, 0, -18 }, // 0x94 'ACUTE ACCENT' U+00B4
|
||||||
|
{ 2559, 11, 17, 15, 2, -12 }, // 0x95 'MICRO SIGN' U+00B5
|
||||||
|
{ 2583, 14, 21, 17, 1, -16 }, // 0x96 'PILCROW SIGN' U+00B6
|
||||||
|
{ 2620, 4, 4, 6, 1, -8 }, // 0x97 'MIDDLE DOT' U+00B7
|
||||||
|
{ 2622, 6, 5, 8, 1, 1 }, // 0x98 'CEDILLA' U+00B8
|
||||||
|
{ 2626, 6, 10, 9, 1, -16 }, // 0x99 'SUPERSCRIPT ONE' U+00B9
|
||||||
|
{ 2634, 9, 10, 11, 1, -16 }, // 0x9a 'MASCULINE ORDINAL INDICATOR' U+00BA
|
||||||
|
{ 2646, 12, 11, 14, 1, -11 }, // 0x9b 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00BB
|
||||||
|
{ 2663, 20, 17, 21, 1, -16 }, // 0x9c 'VULGAR FRACTION ONE QUARTER' U+00BC
|
||||||
|
{ 2706, 19, 17, 21, 1, -16 }, // 0x9d 'VULGAR FRACTION ONE HALF' U+00BD
|
||||||
|
{ 2747, 21, 17, 21, 0, -16 }, // 0x9e 'VULGAR FRACTION THREE QUARTERS' U+00BE
|
||||||
|
{ 2792, 10, 17, 11, 1, -12 }, // 0x9f 'INVERTED QUESTION MARK' U+00BF
|
||||||
|
{ 2814, 17, 23, 17, 0, -22 }, // 0xa0 'LATIN CAPITAL LETTER A WITH GRAVE' U+00C0
|
||||||
|
{ 2863, 17, 23, 17, 0, -22 }, // 0xa1 'LATIN CAPITAL LETTER A WITH ACUTE' U+00C1
|
||||||
|
{ 2912, 17, 23, 17, 0, -22 }, // 0xa2 'LATIN CAPITAL LETTER A WITH CIRCUMFLEX' U+00C2
|
||||||
|
{ 2961, 17, 23, 17, 0, -22 }, // 0xa3 'LATIN CAPITAL LETTER A WITH TILDE' U+00C3
|
||||||
|
{ 3010, 17, 22, 17, 0, -21 }, // 0xa4 'LATIN CAPITAL LETTER A WITH DIAERESIS' U+00C4
|
||||||
|
{ 3057, 17, 22, 17, 0, -21 }, // 0xa5 'LATIN CAPITAL LETTER A WITH RING ABOVE' U+00C5
|
||||||
|
{ 3104, 23, 17, 24, 0, -16 }, // 0xa6 'LATIN CAPITAL LETTER AE' U+00C6
|
||||||
|
{ 3153, 14, 22, 16, 1, -16 }, // 0xa7 'LATIN CAPITAL LETTER C WITH CEDILLA' U+00C7
|
||||||
|
{ 3192, 12, 23, 15, 2, -22 }, // 0xa8 'LATIN CAPITAL LETTER E WITH GRAVE' U+00C8
|
||||||
|
{ 3227, 12, 23, 15, 2, -22 }, // 0xa9 'LATIN CAPITAL LETTER E WITH ACUTE' U+00C9
|
||||||
|
{ 3262, 12, 23, 15, 2, -22 }, // 0xaa 'LATIN CAPITAL LETTER E WITH CIRCUMFLEX' U+00CA
|
||||||
|
{ 3297, 12, 22, 15, 2, -21 }, // 0xab 'LATIN CAPITAL LETTER E WITH DIAERESIS' U+00CB
|
||||||
|
{ 3330, 6, 23, 8, 1, -22 }, // 0xac 'LATIN CAPITAL LETTER I WITH GRAVE' U+00CC
|
||||||
|
{ 3348, 6, 23, 8, 1, -22 }, // 0xad 'LATIN CAPITAL LETTER I WITH ACUTE' U+00CD
|
||||||
|
{ 3366, 7, 23, 8, 1, -22 }, // 0xae 'LATIN CAPITAL LETTER I WITH CIRCUMFLEX' U+00CE
|
||||||
|
{ 3387, 10, 22, 8, -1, -21 }, // 0xaf 'LATIN CAPITAL LETTER I WITH DIAERESIS' U+00CF
|
||||||
|
{ 3415, 17, 17, 18, 0, -16 }, // 0xb0 'LATIN CAPITAL LETTER ETH' U+00D0
|
||||||
|
{ 3452, 14, 23, 18, 2, -22 }, // 0xb1 'LATIN CAPITAL LETTER N WITH TILDE' U+00D1
|
||||||
|
{ 3493, 17, 23, 19, 1, -22 }, // 0xb2 'LATIN CAPITAL LETTER O WITH GRAVE' U+00D2
|
||||||
|
{ 3542, 17, 23, 19, 1, -22 }, // 0xb3 'LATIN CAPITAL LETTER O WITH ACUTE' U+00D3
|
||||||
|
{ 3591, 17, 23, 19, 1, -22 }, // 0xb4 'LATIN CAPITAL LETTER O WITH CIRCUMFLEX' U+00D4
|
||||||
|
{ 3640, 17, 23, 19, 1, -22 }, // 0xb5 'LATIN CAPITAL LETTER O WITH TILDE' U+00D5
|
||||||
|
{ 3689, 17, 22, 19, 1, -21 }, // 0xb6 'LATIN CAPITAL LETTER O WITH DIAERESIS' U+00D6
|
||||||
|
{ 3736, 12, 11, 14, 1, -12 }, // 0xb7 'MULTIPLICATION SIGN' U+00D7
|
||||||
|
{ 3753, 17, 19, 19, 1, -17 }, // 0xb8 'LATIN CAPITAL LETTER O WITH STROKE' U+00D8
|
||||||
|
{ 3794, 13, 23, 17, 2, -22 }, // 0xb9 'LATIN CAPITAL LETTER U WITH GRAVE' U+00D9
|
||||||
|
{ 3832, 13, 23, 17, 2, -22 }, // 0xba 'LATIN CAPITAL LETTER U WITH ACUTE' U+00DA
|
||||||
|
{ 3870, 13, 23, 17, 2, -22 }, // 0xbb 'LATIN CAPITAL LETTER U WITH CIRCUMFLEX' U+00DB
|
||||||
|
{ 3908, 13, 22, 17, 2, -21 }, // 0xbc 'LATIN CAPITAL LETTER U WITH DIAERESIS' U+00DC
|
||||||
|
{ 3944, 16, 23, 16, 0, -22 }, // 0xbd 'LATIN CAPITAL LETTER Y WITH ACUTE' U+00DD
|
||||||
|
{ 3990, 12, 17, 15, 2, -16 }, // 0xbe 'LATIN CAPITAL LETTER THORN' U+00DE
|
||||||
|
{ 4016, 13, 19, 16, 2, -18 }, // 0xbf 'LATIN SMALL LETTER SHARP S' U+00DF
|
||||||
|
{ 4047, 10, 19, 13, 1, -18 }, // 0xc0 'LATIN SMALL LETTER A WITH GRAVE' U+00E0
|
||||||
|
{ 4071, 10, 19, 13, 1, -18 }, // 0xc1 'LATIN SMALL LETTER A WITH ACUTE' U+00E1
|
||||||
|
{ 4095, 10, 19, 13, 1, -18 }, // 0xc2 'LATIN SMALL LETTER A WITH CIRCUMFLEX' U+00E2
|
||||||
|
{ 4119, 10, 19, 13, 1, -18 }, // 0xc3 'LATIN SMALL LETTER A WITH TILDE' U+00E3
|
||||||
|
{ 4143, 10, 18, 13, 1, -17 }, // 0xc4 'LATIN SMALL LETTER A WITH DIAERESIS' U+00E4
|
||||||
|
{ 4166, 10, 20, 13, 1, -19 }, // 0xc5 'LATIN SMALL LETTER A WITH RING ABOVE' U+00E5
|
||||||
|
{ 4191, 19, 13, 21, 1, -12 }, // 0xc6 'LATIN SMALL LETTER AE' U+00E6
|
||||||
|
{ 4222, 10, 18, 12, 1, -12 }, // 0xc7 'LATIN SMALL LETTER C WITH CEDILLA' U+00E7
|
||||||
|
{ 4245, 12, 19, 14, 1, -18 }, // 0xc8 'LATIN SMALL LETTER E WITH GRAVE' U+00E8
|
||||||
|
{ 4274, 12, 19, 14, 1, -18 }, // 0xc9 'LATIN SMALL LETTER E WITH ACUTE' U+00E9
|
||||||
|
{ 4303, 12, 19, 14, 1, -18 }, // 0xca 'LATIN SMALL LETTER E WITH CIRCUMFLEX' U+00EA
|
||||||
|
{ 4332, 12, 18, 14, 1, -17 }, // 0xcb 'LATIN SMALL LETTER E WITH DIAERESIS' U+00EB
|
||||||
|
{ 4359, 6, 19, 8, 1, -18 }, // 0xcc 'LATIN SMALL LETTER I WITH GRAVE' U+00EC
|
||||||
|
{ 4374, 6, 19, 8, 1, -18 }, // 0xcd 'LATIN SMALL LETTER I WITH ACUTE' U+00ED
|
||||||
|
{ 4389, 7, 19, 8, 1, -18 }, // 0xce 'LATIN SMALL LETTER I WITH CIRCUMFLEX' U+00EE
|
||||||
|
{ 4406, 10, 18, 8, -1, -17 }, // 0xcf 'LATIN SMALL LETTER I WITH DIAERESIS' U+00EF
|
||||||
|
{ 4429, 12, 19, 14, 1, -18 }, // 0xd0 'LATIN SMALL LETTER ETH' U+00F0
|
||||||
|
{ 4458, 11, 19, 15, 2, -18 }, // 0xd1 'LATIN SMALL LETTER N WITH TILDE' U+00F1
|
||||||
|
{ 4485, 13, 19, 15, 1, -18 }, // 0xd2 'LATIN SMALL LETTER O WITH GRAVE' U+00F2
|
||||||
|
{ 4516, 13, 19, 15, 1, -18 }, // 0xd3 'LATIN SMALL LETTER O WITH ACUTE' U+00F3
|
||||||
|
{ 4547, 13, 19, 15, 1, -18 }, // 0xd4 'LATIN SMALL LETTER O WITH CIRCUMFLEX' U+00F4
|
||||||
|
{ 4578, 13, 19, 15, 1, -18 }, // 0xd5 'LATIN SMALL LETTER O WITH TILDE' U+00F5
|
||||||
|
{ 4609, 13, 18, 15, 1, -17 }, // 0xd6 'LATIN SMALL LETTER O WITH DIAERESIS' U+00F6
|
||||||
|
{ 4639, 12, 13, 14, 1, -12 }, // 0xd7 'DIVISION SIGN' U+00F7
|
||||||
|
{ 4659, 13, 15, 15, 1, -13 }, // 0xd8 'LATIN SMALL LETTER O WITH STROKE' U+00F8
|
||||||
|
{ 4684, 11, 19, 15, 2, -18 }, // 0xd9 'LATIN SMALL LETTER U WITH GRAVE' U+00F9
|
||||||
|
{ 4711, 11, 19, 15, 2, -18 }, // 0xda 'LATIN SMALL LETTER U WITH ACUTE' U+00FA
|
||||||
|
{ 4738, 11, 19, 15, 2, -18 }, // 0xdb 'LATIN SMALL LETTER U WITH CIRCUMFLEX' U+00FB
|
||||||
|
{ 4765, 11, 18, 15, 2, -17 }, // 0xdc 'LATIN SMALL LETTER U WITH DIAERESIS' U+00FC
|
||||||
|
{ 4790, 13, 23, 13, 0, -18 }, // 0xdd 'LATIN SMALL LETTER Y WITH ACUTE' U+00FD
|
||||||
|
{ 4828, 12, 23, 15, 2, -18 }, // 0xde 'LATIN SMALL LETTER THORN' U+00FE
|
||||||
|
{ 4863, 13, 22, 13, 0, -17 } }; // 0xdf 'LATIN SMALL LETTER Y WITH DIAERESIS' U+000FF
|
||||||
|
|
||||||
|
const GFXfont Ubuntu_Bold12pt8b PROGMEM = {
|
||||||
|
(uint8_t *)Ubuntu_Bold12pt8bBitmaps,
|
||||||
|
(GFXglyph *)Ubuntu_Bold12pt8bGlyphs,
|
||||||
|
0x20, 0xDF, 27 };
|
||||||
|
|
||||||
|
// Approx. 6250 bytes
|
||||||
866
lib/obp60task/fonts/Ubuntu_Bold16pt8b.h
Normal file
866
lib/obp60task/fonts/Ubuntu_Bold16pt8b.h
Normal file
@@ -0,0 +1,866 @@
|
|||||||
|
const uint8_t Ubuntu_Bold16pt8bBitmaps[] PROGMEM = {
|
||||||
|
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x0E, 0xFF,
|
||||||
|
0xFF, 0xF7, 0x00, 0xF9, 0xFF, 0x9F, 0xF9, 0xFF, 0x9F, 0xF9, 0xFF, 0x9F,
|
||||||
|
0xF9, 0xFF, 0x1E, 0x70, 0xE0, 0x07, 0xCF, 0x81, 0xF3, 0xE0, 0x7D, 0xF8,
|
||||||
|
0x3E, 0x7C, 0x0F, 0x9F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xC7, 0xCF, 0x81, 0xF3, 0xE0, 0x7C, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0x7C, 0x0F, 0x9F, 0x07, 0xEF, 0x81,
|
||||||
|
0xF3, 0xE0, 0x7C, 0xF8, 0x00, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x07,
|
||||||
|
0xF8, 0x1F, 0xFE, 0x3F, 0xFE, 0x3F, 0xFC, 0x7E, 0x0C, 0x7C, 0x00, 0x7C,
|
||||||
|
0x00, 0x7E, 0x00, 0x7F, 0xE0, 0x3F, 0xF8, 0x1F, 0xFC, 0x0F, 0xFE, 0x01,
|
||||||
|
0xFF, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x1F, 0x70, 0x3F, 0x7F, 0xFE, 0xFF,
|
||||||
|
0xFE, 0xFF, 0xFC, 0x1F, 0xF0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03,
|
||||||
|
0xC0, 0x1F, 0x80, 0xF8, 0x0F, 0xF0, 0x3C, 0x07, 0xFE, 0x1F, 0x03, 0xE7,
|
||||||
|
0xC7, 0x80, 0xF0, 0xF3, 0xE0, 0x3C, 0x3C, 0xF0, 0x0F, 0x0F, 0x78, 0x03,
|
||||||
|
0xC3, 0xFE, 0x00, 0xF9, 0xFF, 0x00, 0x1F, 0xFF, 0xDF, 0x83, 0xFD, 0xEF,
|
||||||
|
0xF0, 0x7E, 0xFF, 0xFE, 0x00, 0x3F, 0xE7, 0xC0, 0x1F, 0xF0, 0xF0, 0x07,
|
||||||
|
0xBC, 0x3C, 0x03, 0xCF, 0x0F, 0x01, 0xF3, 0xC3, 0xC0, 0x78, 0xF9, 0xF0,
|
||||||
|
0x3E, 0x1F, 0xF8, 0x0F, 0x03, 0xFC, 0x07, 0xC0, 0x7E, 0x00, 0x07, 0xF0,
|
||||||
|
0x00, 0x7F, 0xE0, 0x07, 0xFF, 0x80, 0x7F, 0xFC, 0x03, 0xE3, 0xE0, 0x1F,
|
||||||
|
0x1F, 0x00, 0xFD, 0xF0, 0x03, 0xFF, 0x80, 0x1F, 0xF8, 0x00, 0xFF, 0x00,
|
||||||
|
0x0F, 0xFC, 0xF8, 0xFF, 0xF7, 0xC7, 0xDF, 0xBE, 0x7C, 0x7F, 0xE3, 0xE1,
|
||||||
|
0xFF, 0x1F, 0x07, 0xF0, 0xFC, 0x1F, 0x87, 0xFF, 0xFE, 0x1F, 0xFF, 0xF8,
|
||||||
|
0x7F, 0xFF, 0xE0, 0xFE, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x70,
|
||||||
|
0x04, 0x07, 0x87, 0xE3, 0xE3, 0xF1, 0xF1, 0xF8, 0xF8, 0x7C, 0x3E, 0x3E,
|
||||||
|
0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x07, 0xC3,
|
||||||
|
0xE1, 0xF0, 0xFC, 0x3E, 0x1F, 0x87, 0xC3, 0xF0, 0xF0, 0x20, 0x10, 0x3C,
|
||||||
|
0x3F, 0x0F, 0x87, 0xE1, 0xF0, 0xFC, 0x3E, 0x1F, 0x0F, 0x83, 0xE1, 0xF0,
|
||||||
|
0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF1, 0xF0, 0xF8, 0x7C,
|
||||||
|
0x7E, 0x3E, 0x3F, 0x1F, 0x1F, 0x87, 0x80, 0x80, 0x0F, 0x80, 0x7C, 0x1B,
|
||||||
|
0xCC, 0xEE, 0xEF, 0xFF, 0xFF, 0xFC, 0x1C, 0x03, 0xF8, 0x3D, 0xE3, 0xEF,
|
||||||
|
0x8E, 0x38, 0x11, 0x00, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07,
|
||||||
|
0x83, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x1E, 0x00, 0x78, 0x01,
|
||||||
|
0xE0, 0x07, 0x80, 0x1E, 0x00, 0x7D, 0xF7, 0xDF, 0x7D, 0xE7, 0xBE, 0xF1,
|
||||||
|
0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7B, 0xFF, 0xFF, 0xFD, 0xE0, 0x00,
|
||||||
|
0x3E, 0x00, 0xFC, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E,
|
||||||
|
0x00, 0xFC, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00,
|
||||||
|
0xFC, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00, 0xFC,
|
||||||
|
0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00, 0xFC, 0x01,
|
||||||
|
0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8,
|
||||||
|
0x3F, 0xFC, 0x3F, 0xFC, 0x7E, 0x7E, 0x7C, 0x3E, 0xF8, 0x1F, 0xF8, 0x1F,
|
||||||
|
0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F,
|
||||||
|
0xF8, 0x1F, 0x7C, 0x3E, 0x7E, 0x7E, 0x3F, 0xFC, 0x3F, 0xFC, 0x1F, 0xF8,
|
||||||
|
0x07, 0xE0, 0x03, 0xC1, 0xF1, 0xFD, 0xFF, 0xFF, 0xFF, 0xF7, 0x7D, 0x1F,
|
||||||
|
0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1,
|
||||||
|
0xF0, 0x7C, 0x1F, 0x07, 0xC0, 0x0F, 0xC0, 0x7F, 0xE3, 0xFF, 0xE7, 0xFF,
|
||||||
|
0xE7, 0x8F, 0xC4, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x03, 0xF0,
|
||||||
|
0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x3E,
|
||||||
|
0x00, 0xFF, 0xFD, 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xE0, 0x1F, 0xC0, 0xFF,
|
||||||
|
0xE3, 0xFF, 0xE3, 0xFF, 0xE6, 0x0F, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x7C,
|
||||||
|
0x1F, 0xF8, 0x3F, 0xC0, 0x7F, 0xE0, 0xFF, 0xE0, 0x0F, 0xE0, 0x07, 0xC0,
|
||||||
|
0x0F, 0x80, 0x1F, 0x60, 0x7F, 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xC3, 0xFC,
|
||||||
|
0x00, 0x00, 0x7C, 0x00, 0xFC, 0x01, 0xFC, 0x03, 0xFC, 0x07, 0xFC, 0x0F,
|
||||||
|
0xFC, 0x0F, 0x7C, 0x1E, 0x7C, 0x3E, 0x7C, 0x3C, 0x7C, 0x78, 0x7C, 0xF8,
|
||||||
|
0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7C, 0x00,
|
||||||
|
0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x3F, 0xFC, 0x7F, 0xF8, 0xFF,
|
||||||
|
0xF1, 0xFF, 0xE3, 0xC0, 0x07, 0x80, 0x1F, 0x00, 0x3F, 0xC0, 0x7F, 0xF0,
|
||||||
|
0xFF, 0xF1, 0xFF, 0xF0, 0x0F, 0xF0, 0x07, 0xE0, 0x07, 0xC0, 0x0F, 0x80,
|
||||||
|
0x1F, 0x40, 0x7F, 0xFF, 0xFB, 0xFF, 0xE7, 0xFF, 0x83, 0xFC, 0x00, 0x00,
|
||||||
|
0x3E, 0x01, 0xFE, 0x07, 0xFE, 0x0F, 0xFE, 0x1F, 0xE0, 0x3F, 0x00, 0x7E,
|
||||||
|
0x00, 0x7C, 0x00, 0xFF, 0xF0, 0xFF, 0xFC, 0xFF, 0xFE, 0xFF, 0xFE, 0xF8,
|
||||||
|
0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0x7C, 0x3F, 0x7F, 0xFE, 0x3F,
|
||||||
|
0xFC, 0x1F, 0xF8, 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xFC, 0x00, 0xF8, 0x01, 0xF8, 0x01,
|
||||||
|
0xF0, 0x01, 0xF0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x07, 0xC0, 0x07,
|
||||||
|
0xC0, 0x07, 0xC0, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F,
|
||||||
|
0xE0, 0x3F, 0xF8, 0x7F, 0xFC, 0xFF, 0xFE, 0xFC, 0x7E, 0xF8, 0x3E, 0xF8,
|
||||||
|
0x3E, 0xFC, 0x7C, 0x7F, 0xFC, 0x3F, 0xF0, 0x3F, 0xFC, 0x7F, 0xFE, 0xFC,
|
||||||
|
0x3E, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC, 0x3F, 0x7F, 0xFE, 0x7F,
|
||||||
|
0xFE, 0x3F, 0xFC, 0x07, 0xF0, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F,
|
||||||
|
0xFE, 0xFC, 0x3E, 0xF8, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC, 0x1F, 0x7F,
|
||||||
|
0xFF, 0x7F, 0xFF, 0x3F, 0xFF, 0x0F, 0xDF, 0x00, 0x3E, 0x00, 0x7E, 0x00,
|
||||||
|
0xFE, 0x03, 0xFC, 0x3F, 0xF8, 0x3F, 0xF0, 0x3F, 0xC0, 0x3E, 0x00, 0x7B,
|
||||||
|
0xFF, 0xFF, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0x78,
|
||||||
|
0x7B, 0xFF, 0xFF, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xF7, 0xDF,
|
||||||
|
0x7D, 0xE7, 0xBE, 0xF1, 0xC0, 0x00, 0x0C, 0x01, 0xF8, 0x3F, 0xFB, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xE0, 0x7C, 0x00, 0xFF, 0x81, 0xFF, 0xF3,
|
||||||
|
0xFF, 0xFB, 0xFF, 0xF0, 0xFF, 0xE0, 0x1F, 0x80, 0x03, 0x00, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x60, 0x01, 0xF0, 0x0F, 0xFC,
|
||||||
|
0x3F, 0xFE, 0xFF, 0xFC, 0xFF, 0xF0, 0x7F, 0xC0, 0x1F, 0x03, 0xFC, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xC1, 0xF0, 0x06, 0x00, 0x00, 0x3F, 0x8F,
|
||||||
|
0xFC, 0xFF, 0xE7, 0xFF, 0x63, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x03, 0xE0,
|
||||||
|
0x7E, 0x0F, 0xC0, 0xF8, 0x1F, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x00, 0x00,
|
||||||
|
0x00, 0x1E, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x01, 0xE0, 0x00, 0x7F,
|
||||||
|
0x80, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFF, 0xC0, 0x3F, 0x03, 0xF8, 0x1F,
|
||||||
|
0x00, 0x1F, 0x0F, 0x80, 0x03, 0xC3, 0xC1, 0xF8, 0x79, 0xE1, 0xFF, 0x1E,
|
||||||
|
0x78, 0xFF, 0xC7, 0xFE, 0x3C, 0xF0, 0xFF, 0x1E, 0x3C, 0x3F, 0xC7, 0x8F,
|
||||||
|
0x0F, 0xF1, 0xE3, 0xC3, 0xFC, 0x78, 0xF0, 0xFF, 0x1E, 0x3C, 0x3F, 0xC7,
|
||||||
|
0x8F, 0x0F, 0xF1, 0xE3, 0xC7, 0xBE, 0x3C, 0xF1, 0xE7, 0x8F, 0xFF, 0xF1,
|
||||||
|
0xE1, 0xFF, 0xF8, 0x3C, 0x3E, 0xF8, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00,
|
||||||
|
0x00, 0x3F, 0x80, 0x40, 0x07, 0xFF, 0xF0, 0x00, 0x7F, 0xFC, 0x00, 0x03,
|
||||||
|
0xFE, 0x00, 0x00, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x07, 0xFC,
|
||||||
|
0x00, 0x3F, 0xF0, 0x03, 0xEF, 0x80, 0x1F, 0x7E, 0x00, 0xFB, 0xF0, 0x0F,
|
||||||
|
0x8F, 0x80, 0x7C, 0x7E, 0x03, 0xE3, 0xF0, 0x3E, 0x0F, 0x81, 0xFF, 0xFC,
|
||||||
|
0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x7E, 0x03, 0xF3, 0xE0,
|
||||||
|
0x0F, 0x9F, 0x00, 0x7D, 0xF8, 0x03, 0xFF, 0x80, 0x0F, 0x80, 0xFF, 0xE0,
|
||||||
|
0x7F, 0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF, 0x83, 0xF7, 0xC0, 0xFB, 0xE0,
|
||||||
|
0x7D, 0xF0, 0x7E, 0xFF, 0xFE, 0x7F, 0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF,
|
||||||
|
0x81, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x1F, 0xFF, 0xFF,
|
||||||
|
0xBF, 0xFF, 0xDF, 0xFF, 0x87, 0xFF, 0x00, 0x01, 0xFC, 0x03, 0xFF, 0xC7,
|
||||||
|
0xFF, 0xE7, 0xFF, 0xE3, 0xF0, 0x33, 0xF0, 0x01, 0xF0, 0x01, 0xF0, 0x00,
|
||||||
|
0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0,
|
||||||
|
0x03, 0xF0, 0x00, 0xFC, 0x00, 0x7F, 0x03, 0x1F, 0xFF, 0x87, 0xFF, 0xE1,
|
||||||
|
0xFF, 0xF0, 0x3F, 0xC0, 0xFF, 0xE0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F,
|
||||||
|
0xFF, 0xCF, 0x83, 0xF9, 0xF0, 0x1F, 0xBE, 0x01, 0xF7, 0xC0, 0x1F, 0xF8,
|
||||||
|
0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0,
|
||||||
|
0x0F, 0xFE, 0x01, 0xF7, 0xC0, 0x7E, 0xF8, 0x3F, 0x9F, 0xFF, 0xF3, 0xFF,
|
||||||
|
0xFC, 0x7F, 0xFE, 0x0F, 0xFE, 0x00, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xFE, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFC,
|
||||||
|
0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0x00, 0x3E,
|
||||||
|
0x00, 0x7C, 0x00, 0xFF, 0xFD, 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xEF, 0x80,
|
||||||
|
0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07,
|
||||||
|
0xC0, 0x0F, 0x80, 0x00, 0x01, 0xFE, 0x01, 0xFF, 0xF1, 0xFF, 0xFC, 0xFF,
|
||||||
|
0xFE, 0x3F, 0x01, 0x9F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0x00,
|
||||||
|
0x3E, 0x00, 0x0F, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xF7,
|
||||||
|
0xC0, 0x7D, 0xF8, 0x1F, 0x7F, 0x07, 0xCF, 0xFF, 0xF1, 0xFF, 0xFC, 0x3F,
|
||||||
|
0xFF, 0x01, 0xFF, 0x00, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC,
|
||||||
|
0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xFF, 0xC0, 0x1F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xF0,
|
||||||
|
0x07, 0xFE, 0x00, 0xFF, 0xC0, 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0,
|
||||||
|
0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x7C, 0x01, 0xF0,
|
||||||
|
0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C,
|
||||||
|
0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F,
|
||||||
|
0x60, 0xFD, 0xFF, 0xEF, 0xFF, 0xBF, 0xFC, 0x3F, 0xC0, 0xF8, 0x1F, 0xDF,
|
||||||
|
0x07, 0xF3, 0xE1, 0xFC, 0x7C, 0x7F, 0x0F, 0x9F, 0xC1, 0xF7, 0xF0, 0x3F,
|
||||||
|
0xFC, 0x07, 0xFF, 0x00, 0xFF, 0xC0, 0x1F, 0xF0, 0x03, 0xFF, 0x00, 0x7F,
|
||||||
|
0xF0, 0x0F, 0xFF, 0x01, 0xF7, 0xE0, 0x3E, 0x7E, 0x07, 0xC7, 0xE0, 0xF8,
|
||||||
|
0x7E, 0x1F, 0x07, 0xE3, 0xE0, 0x7E, 0x7C, 0x0F, 0xEF, 0x80, 0xFE, 0xF8,
|
||||||
|
0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E,
|
||||||
|
0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F,
|
||||||
|
0x80, 0x3E, 0x00, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
|
||||||
|
0x3E, 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x3F, 0x00, 0xFC, 0x7F, 0x00, 0xFE,
|
||||||
|
0x7F, 0x80, 0xFE, 0x7F, 0x81, 0xFE, 0x7F, 0xC1, 0xFE, 0x7F, 0xC3, 0xFE,
|
||||||
|
0x7F, 0xE3, 0xFE, 0x7D, 0xE7, 0xBE, 0x79, 0xF7, 0x9E, 0x78, 0xF7, 0x9E,
|
||||||
|
0x78, 0xFF, 0x1E, 0xF8, 0x7F, 0x1E, 0xF8, 0x7E, 0x1F, 0xF8, 0x3E, 0x1F,
|
||||||
|
0xF8, 0x3E, 0x1F, 0xF8, 0x3C, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F,
|
||||||
|
0xF8, 0x00, 0x1F, 0xF8, 0x03, 0xFF, 0x80, 0x7F, 0xF8, 0x0F, 0xFF, 0x01,
|
||||||
|
0xFF, 0xF0, 0x3F, 0xFF, 0x07, 0xFF, 0xF0, 0xFF, 0xFF, 0x1F, 0xFB, 0xE3,
|
||||||
|
0xFF, 0x3E, 0x7F, 0xE3, 0xEF, 0xFC, 0x7F, 0xFF, 0x87, 0xFF, 0xF0, 0x7F,
|
||||||
|
0xFE, 0x07, 0xFF, 0xC0, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0xFF, 0xE0, 0x1F,
|
||||||
|
0xFC, 0x01, 0xFF, 0x80, 0x3E, 0x01, 0xF8, 0x00, 0xFF, 0xF0, 0x1F, 0xFF,
|
||||||
|
0x83, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xE0, 0x7E, 0x7C, 0x03, 0xEF, 0x80,
|
||||||
|
0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8,
|
||||||
|
0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x03, 0xE7, 0xE0, 0x7E, 0x7F, 0x0F, 0xE3,
|
||||||
|
0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xFC, 0x00, 0xFF, 0xE0,
|
||||||
|
0x7F, 0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF, 0x83, 0xFF, 0xC0, 0x7F, 0xE0,
|
||||||
|
0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x1F, 0xFF, 0xFF, 0xDF, 0xFF, 0xCF,
|
||||||
|
0xFF, 0xC7, 0xFF, 0x83, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00,
|
||||||
|
0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0xFF, 0xF0,
|
||||||
|
0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xE0, 0x7E, 0x7C, 0x03,
|
||||||
|
0xEF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80,
|
||||||
|
0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x03, 0xF7, 0xE0, 0x7E, 0x3F,
|
||||||
|
0x0F, 0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0xFF, 0xF0, 0x01, 0xFE, 0x00,
|
||||||
|
0x07, 0xC0, 0x00, 0x7F, 0x00, 0x03, 0xFE, 0x00, 0x1F, 0xE0, 0x00, 0xFC,
|
||||||
|
0x00, 0x03, 0xC0, 0xFF, 0xE0, 0x3F, 0xFF, 0x0F, 0xFF, 0xE3, 0xFF, 0xFC,
|
||||||
|
0xF8, 0x3F, 0xBE, 0x03, 0xEF, 0x80, 0xFB, 0xE0, 0x3E, 0xF8, 0x0F, 0xBE,
|
||||||
|
0x0F, 0xEF, 0xFF, 0xF3, 0xFF, 0xF8, 0xFF, 0xFC, 0x3F, 0xFE, 0x0F, 0x9F,
|
||||||
|
0xC3, 0xE3, 0xF0, 0xF8, 0x7E, 0x3E, 0x0F, 0xCF, 0x83, 0xFB, 0xE0, 0x7E,
|
||||||
|
0xF8, 0x0F, 0xC0, 0x07, 0xF0, 0x3F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFC, 0xFC,
|
||||||
|
0x0C, 0xF8, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0x7F, 0x80, 0x7F, 0xF0, 0x1F,
|
||||||
|
0xFC, 0x07, 0xFE, 0x00, 0xFF, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x1F, 0x70,
|
||||||
|
0x3F, 0x7F, 0xFF, 0xFF, 0xFE, 0xFF, 0xFC, 0x1F, 0xE0, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80,
|
||||||
|
0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E,
|
||||||
|
0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00,
|
||||||
|
0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80,
|
||||||
|
0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F,
|
||||||
|
0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE,
|
||||||
|
0x01, 0xFF, 0x80, 0x7F, 0xF0, 0x3F, 0x7E, 0x1F, 0x9F, 0xFF, 0xE3, 0xFF,
|
||||||
|
0xF0, 0x7F, 0xF8, 0x07, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xE0, 0x0F, 0x9F,
|
||||||
|
0x00, 0x7C, 0xFC, 0x03, 0xE3, 0xE0, 0x3E, 0x1F, 0x01, 0xF0, 0xFC, 0x1F,
|
||||||
|
0x83, 0xE0, 0xF8, 0x1F, 0x07, 0xC0, 0xFC, 0x7E, 0x07, 0xE3, 0xE0, 0x1F,
|
||||||
|
0x1F, 0x00, 0xFD, 0xF8, 0x07, 0xEF, 0x80, 0x1F, 0x7C, 0x00, 0xFF, 0xE0,
|
||||||
|
0x03, 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x1F,
|
||||||
|
0xC0, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x0F, 0xDF, 0x03, 0xE0,
|
||||||
|
0x7C, 0xF8, 0x1F, 0x03, 0xE7, 0xC1, 0xFC, 0x1F, 0x3E, 0x0F, 0xE0, 0xF8,
|
||||||
|
0xF0, 0x7F, 0x0F, 0x87, 0xC3, 0xF8, 0x7C, 0x3E, 0x3D, 0xE3, 0xE1, 0xF1,
|
||||||
|
0xEF, 0x1F, 0x07, 0x8F, 0x78, 0xF0, 0x3E, 0xFB, 0xEF, 0x81, 0xF7, 0x8F,
|
||||||
|
0x7C, 0x0F, 0xBC, 0x7B, 0xE0, 0x3D, 0xE3, 0xFE, 0x01, 0xFF, 0x1F, 0xF0,
|
||||||
|
0x0F, 0xF0, 0x7F, 0x80, 0x3F, 0x83, 0xF8, 0x01, 0xFC, 0x1F, 0xC0, 0x0F,
|
||||||
|
0xC0, 0x7E, 0x00, 0x3E, 0x03, 0xE0, 0x00, 0xFC, 0x01, 0xFB, 0xF0, 0x1F,
|
||||||
|
0x8F, 0xC1, 0xF8, 0x3E, 0x0F, 0x81, 0xF8, 0xFC, 0x07, 0xEF, 0xC0, 0x1F,
|
||||||
|
0xFC, 0x00, 0xFF, 0xE0, 0x03, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x3E, 0x00,
|
||||||
|
0x03, 0xF8, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0x80, 0x1F, 0xFC, 0x01, 0xFB,
|
||||||
|
0xF0, 0x1F, 0x8F, 0xC1, 0xF8, 0x3E, 0x0F, 0xC1, 0xF8, 0xFC, 0x07, 0xEF,
|
||||||
|
0xC0, 0x1F, 0x80, 0xFC, 0x01, 0xFB, 0xE0, 0x1F, 0x9F, 0x80, 0xFC, 0x7E,
|
||||||
|
0x0F, 0xC1, 0xF0, 0x7C, 0x0F, 0xC7, 0xE0, 0x3F, 0x7E, 0x01, 0xFB, 0xF0,
|
||||||
|
0x07, 0xFF, 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x0F,
|
||||||
|
0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00,
|
||||||
|
0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7F,
|
||||||
|
0xFF, 0xBF, 0xFF, 0xDF, 0xFF, 0xEF, 0xFF, 0xF0, 0x03, 0xF0, 0x03, 0xF0,
|
||||||
|
0x03, 0xF0, 0x03, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xFC,
|
||||||
|
0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8,
|
||||||
|
0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F,
|
||||||
|
0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF8, 0x01,
|
||||||
|
0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F,
|
||||||
|
0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF8,
|
||||||
|
0x01, 0xF0, 0x03, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x80,
|
||||||
|
0x1F, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF8, 0x01,
|
||||||
|
0xF0, 0x03, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1,
|
||||||
|
0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C,
|
||||||
|
0x1F, 0x07, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xC0, 0x01,
|
||||||
|
0xF0, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0x7B, 0xC0, 0x7D, 0xF0,
|
||||||
|
0x7C, 0x7C, 0x3C, 0x1E, 0x3E, 0x0F, 0xBE, 0x03, 0xEF, 0x01, 0xE1, 0x00,
|
||||||
|
0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0xE3, 0xE3,
|
||||||
|
0xE3, 0xE3, 0x82, 0x00, 0x1F, 0xE0, 0xFF, 0xC3, 0xFF, 0x8F, 0xFF, 0x00,
|
||||||
|
0xFC, 0x01, 0xF1, 0xFF, 0xDF, 0xFF, 0x7F, 0xFF, 0xF1, 0xFF, 0x87, 0xFE,
|
||||||
|
0x1F, 0xFF, 0xFD, 0xFF, 0xF7, 0xFF, 0xC7, 0xFE, 0x38, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xFB, 0xE0, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xFE, 0xF8, 0x3E, 0xF8, 0x3F,
|
||||||
|
0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x3F, 0xF8, 0x7E,
|
||||||
|
0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8, 0x3F, 0xE0, 0x03, 0xF8, 0x3F, 0xF3,
|
||||||
|
0xFF, 0xDF, 0xFE, 0x7E, 0x03, 0xF0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03,
|
||||||
|
0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x7F, 0xFC, 0xFF, 0xF1, 0xFF, 0xC1, 0xFE,
|
||||||
|
0x00, 0x07, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F,
|
||||||
|
0x00, 0x1F, 0x00, 0x1F, 0x07, 0xFF, 0x1F, 0xFF, 0x3F, 0xFF, 0x7F, 0xFF,
|
||||||
|
0x7C, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F,
|
||||||
|
0xFC, 0x1F, 0x7E, 0x1F, 0x7F, 0xFF, 0x3F, 0xFF, 0x1F, 0xFF, 0x07, 0xFC,
|
||||||
|
0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0x7C, 0x3F, 0xF8, 0x1F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x04,
|
||||||
|
0x7F, 0xFE, 0x3F, 0xFE, 0x1F, 0xFE, 0x07, 0xF8, 0x0F, 0xE3, 0xFF, 0x7F,
|
||||||
|
0xE7, 0xFE, 0xFC, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xFF, 0xEF, 0xFE, 0xFF,
|
||||||
|
0xEF, 0xFE, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8,
|
||||||
|
0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0x07, 0xF8, 0x3F, 0xFC,
|
||||||
|
0xFF, 0xFB, 0xFF, 0xF7, 0xC3, 0xFF, 0x87, 0xFE, 0x0F, 0xFC, 0x1F, 0xF8,
|
||||||
|
0x3F, 0xF0, 0x7F, 0xF0, 0xFB, 0xFF, 0xF7, 0xFF, 0xE7, 0xFF, 0xC3, 0xFF,
|
||||||
|
0x80, 0x1F, 0x00, 0x3E, 0x40, 0xFD, 0xFF, 0xF3, 0xFF, 0xE7, 0xFF, 0x07,
|
||||||
|
0xF8, 0x00, 0x38, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0,
|
||||||
|
0x0F, 0x80, 0x3E, 0x00, 0xFF, 0xE3, 0xFF, 0xCF, 0xFF, 0xBF, 0xFE, 0xF8,
|
||||||
|
0xFF, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE,
|
||||||
|
0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0x77, 0xFF, 0xF7, 0x00,
|
||||||
|
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07,
|
||||||
|
0x07, 0xC3, 0xE1, 0xF0, 0x70, 0x00, 0x00, 0x00, 0x0F, 0x87, 0xC3, 0xE1,
|
||||||
|
0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C,
|
||||||
|
0x3E, 0x1F, 0x0F, 0x8F, 0xFF, 0xFF, 0xEF, 0xE7, 0xE0, 0x38, 0x01, 0xF0,
|
||||||
|
0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00,
|
||||||
|
0xF8, 0x7F, 0xF1, 0xFB, 0xE7, 0xE7, 0xDF, 0x8F, 0xFF, 0x1F, 0xFC, 0x3F,
|
||||||
|
0xF0, 0x7F, 0xC0, 0xFF, 0xC1, 0xFF, 0xC3, 0xFF, 0xC7, 0xDF, 0x8F, 0x9F,
|
||||||
|
0x9F, 0x1F, 0xBE, 0x3F, 0x7C, 0x3F, 0x38, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
|
||||||
|
0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
|
||||||
|
0xF8, 0xFC, 0xFF, 0x7F, 0x7F, 0x1E, 0x3F, 0xC3, 0xF1, 0xFF, 0xFF, 0xF3,
|
||||||
|
0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0x8F, 0xC7, 0xFF, 0x0F, 0x87, 0xFE,
|
||||||
|
0x1F, 0x0F, 0xFC, 0x3E, 0x1F, 0xF8, 0x7C, 0x3F, 0xF0, 0xF8, 0x7F, 0xE1,
|
||||||
|
0xF0, 0xFF, 0xC3, 0xE1, 0xFF, 0x87, 0xC3, 0xFF, 0x0F, 0x87, 0xFE, 0x1F,
|
||||||
|
0x0F, 0xFC, 0x3E, 0x1F, 0x3F, 0xC3, 0xFF, 0xCF, 0xFF, 0xBF, 0xFE, 0xF8,
|
||||||
|
0xFF, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE,
|
||||||
|
0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0x07, 0xF0, 0x0F, 0xFE,
|
||||||
|
0x0F, 0xFF, 0x8F, 0xFF, 0xE7, 0xE3, 0xF7, 0xE0, 0xFF, 0xE0, 0x3F, 0xF0,
|
||||||
|
0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFF, 0x07, 0xEF, 0xC7, 0xE7, 0xFF, 0xF1,
|
||||||
|
0xFF, 0xF0, 0x7F, 0xF0, 0x0F, 0xE0, 0x3F, 0xE0, 0xFF, 0xF8, 0xFF, 0xFC,
|
||||||
|
0xFF, 0xFE, 0xF8, 0x7E, 0xF8, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F,
|
||||||
|
0xF8, 0x1F, 0xF8, 0x3F, 0xF8, 0x3E, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8,
|
||||||
|
0xFB, 0xF0, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0x03, 0xFE, 0x0F, 0xFF, 0xCF, 0xFF, 0xEF, 0xFF, 0xF7, 0xE0,
|
||||||
|
0xFF, 0xE0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFF,
|
||||||
|
0x03, 0xEF, 0xC1, 0xF7, 0xFF, 0xF9, 0xFF, 0xFC, 0x7F, 0xFE, 0x0F, 0xDF,
|
||||||
|
0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00,
|
||||||
|
0x7C, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x81, 0xF0, 0x3E, 0x07, 0xC0,
|
||||||
|
0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0x0F,
|
||||||
|
0xE1, 0xFF, 0x9F, 0xFD, 0xFF, 0xEF, 0x81, 0x7C, 0x03, 0xFF, 0xDF, 0xFE,
|
||||||
|
0x7F, 0xF9, 0xFF, 0xC0, 0x3F, 0x81, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0x8F,
|
||||||
|
0xF0, 0x38, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0xFE, 0xFF, 0xEF,
|
||||||
|
0xFE, 0xFF, 0xEF, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F,
|
||||||
|
0x80, 0xFC, 0x0F, 0xFE, 0x7F, 0xE3, 0xFF, 0x0F, 0xE0, 0xF8, 0x7F, 0xE1,
|
||||||
|
0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8,
|
||||||
|
0x7F, 0xE1, 0xFF, 0x87, 0xFF, 0x1F, 0x7F, 0xFD, 0xFF, 0xF3, 0xFF, 0xC3,
|
||||||
|
0xFC, 0xF8, 0x0F, 0xFE, 0x0F, 0xDF, 0x07, 0xCF, 0x83, 0xE7, 0xE3, 0xF1,
|
||||||
|
0xF1, 0xF0, 0xF8, 0xF8, 0x7E, 0xFC, 0x1F, 0x7C, 0x0F, 0xBE, 0x03, 0xFE,
|
||||||
|
0x01, 0xFF, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x07, 0xC0, 0xF8,
|
||||||
|
0x38, 0x1F, 0xF8, 0x3C, 0x1F, 0x7C, 0x7C, 0x3E, 0x7C, 0x7C, 0x3E, 0x7C,
|
||||||
|
0x7E, 0x3E, 0x3C, 0x7E, 0x3C, 0x3C, 0xFE, 0x3C, 0x3E, 0xEF, 0x7C, 0x1E,
|
||||||
|
0xEF, 0x78, 0x1E, 0xEF, 0x78, 0x1F, 0xE7, 0xF8, 0x0F, 0xC7, 0xF0, 0x0F,
|
||||||
|
0xC3, 0xF0, 0x0F, 0xC3, 0xF0, 0x07, 0x83, 0xE0, 0x07, 0x81, 0xE0, 0xFC,
|
||||||
|
0x1F, 0xBF, 0x1F, 0x8F, 0xDF, 0x87, 0xEF, 0xC1, 0xFF, 0xC0, 0x7F, 0xC0,
|
||||||
|
0x3F, 0xE0, 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xFC, 0x03, 0xFE, 0x03, 0xFF,
|
||||||
|
0x83, 0xF7, 0xE1, 0xFB, 0xF1, 0xF8, 0xFD, 0xF8, 0x3F, 0xF8, 0x0F, 0xFE,
|
||||||
|
0x0F, 0xDF, 0x07, 0xCF, 0x83, 0xE7, 0xE3, 0xF1, 0xF1, 0xF0, 0xF8, 0xF8,
|
||||||
|
0x7C, 0x78, 0x1F, 0x7C, 0x0F, 0xBE, 0x03, 0xDE, 0x01, 0xFF, 0x00, 0x7F,
|
||||||
|
0x00, 0x3F, 0x80, 0x0F, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x03, 0xE0, 0x1F,
|
||||||
|
0xF0, 0x1F, 0xF0, 0x0F, 0xF0, 0x03, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF8, 0x1F, 0xC0,
|
||||||
|
0xFE, 0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0x03, 0xE1, 0xFC, 0x3F, 0x8F, 0xF1, 0xF8, 0x3E, 0x07, 0xC0, 0xF8, 0x1F,
|
||||||
|
0x03, 0xE0, 0x7C, 0x0F, 0x83, 0xF1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x07,
|
||||||
|
0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xF0,
|
||||||
|
0x7F, 0x87, 0xF0, 0xFE, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x83,
|
||||||
|
0xF8, 0x7F, 0x83, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C,
|
||||||
|
0x0F, 0x81, 0xF8, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE3, 0xF0, 0x7C, 0x0F,
|
||||||
|
0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x07, 0xE3, 0xFC, 0x7F, 0x0F,
|
||||||
|
0xE1, 0xF0, 0x00, 0x1E, 0x06, 0x3F, 0x8F, 0x7F, 0xFF, 0xFF, 0xFE, 0xF1,
|
||||||
|
0xFC, 0x60, 0x78, 0xFF, 0xFF, 0xFF, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03,
|
||||||
|
0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03,
|
||||||
|
0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3F, 0xFF,
|
||||||
|
0xFF, 0xF0, 0x00, 0x77, 0xFF, 0xFF, 0xB8, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78,
|
||||||
|
0x03, 0xF8, 0x3F, 0xF3, 0xFF, 0xDF, 0xFE, 0x7E, 0x03, 0xF0, 0x0F, 0x80,
|
||||||
|
0x3E, 0x00, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x1F, 0xFF, 0x3F, 0xFC, 0x7F,
|
||||||
|
0xF0, 0x3F, 0x80, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x01, 0xFC,
|
||||||
|
0x0F, 0xFC, 0x3F, 0xF8, 0x7F, 0xE1, 0xF8, 0x43, 0xE0, 0x07, 0xC0, 0x0F,
|
||||||
|
0x80, 0x1F, 0x01, 0xFF, 0xE3, 0xFF, 0xC7, 0xFF, 0x8F, 0xFF, 0x03, 0xE0,
|
||||||
|
0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3F, 0xFC, 0xFF, 0xF9, 0xFF, 0xF3,
|
||||||
|
0xFF, 0xE0, 0x10, 0x04, 0x3C, 0x03, 0xBE, 0xFB, 0xEF, 0xFF, 0xE3, 0xFF,
|
||||||
|
0xE1, 0xF1, 0xF0, 0xF0, 0x78, 0x78, 0x3C, 0x3C, 0x1E, 0x1E, 0x0F, 0x0F,
|
||||||
|
0x8F, 0x87, 0xFF, 0xC7, 0xFF, 0xF7, 0xDF, 0x7D, 0xC0, 0x3C, 0x20, 0x08,
|
||||||
|
0xFC, 0x07, 0xEF, 0x80, 0xF9, 0xF8, 0x3F, 0x1F, 0x07, 0xC3, 0xF1, 0xF8,
|
||||||
|
0x3E, 0x7E, 0x07, 0xEF, 0x80, 0x7F, 0xF0, 0x07, 0xFC, 0x00, 0xFF, 0x80,
|
||||||
|
0xFF, 0xFE, 0x1F, 0xFF, 0xC3, 0xFF, 0xF8, 0x03, 0xE0, 0x00, 0x7C, 0x01,
|
||||||
|
0xFF, 0xFC, 0x3F, 0xFF, 0x87, 0xFF, 0xF0, 0x07, 0xC0, 0x00, 0xF8, 0x00,
|
||||||
|
0x1F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF0, 0x7F, 0xF3, 0xFF, 0xDF, 0xFE,
|
||||||
|
0x7C, 0x09, 0xF0, 0x07, 0xE0, 0x0F, 0xE0, 0x3F, 0xE0, 0xFF, 0xE7, 0xFF,
|
||||||
|
0xBE, 0x7F, 0xF8, 0xFF, 0xE1, 0xFF, 0xC7, 0xFF, 0x9E, 0x7F, 0xF0, 0xFF,
|
||||||
|
0xC1, 0xFF, 0x01, 0xFE, 0x01, 0xF8, 0x03, 0xE6, 0x0F, 0x9F, 0xFE, 0xFF,
|
||||||
|
0xF3, 0xFF, 0xC3, 0xFC, 0x00, 0x70, 0xEF, 0x9F, 0xF9, 0xFF, 0x9F, 0x70,
|
||||||
|
0xE0, 0x01, 0xFC, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3E, 0x0F, 0x83,
|
||||||
|
0xC0, 0x1E, 0x3C, 0x7E, 0x79, 0xC7, 0xF9, 0xDE, 0x7F, 0x8F, 0xE7, 0xC0,
|
||||||
|
0x3F, 0x3C, 0x01, 0xF9, 0xE0, 0x0F, 0xCF, 0x00, 0x7E, 0x78, 0x03, 0xF3,
|
||||||
|
0xE0, 0x1F, 0xCF, 0xF1, 0xEE, 0x3F, 0xCE, 0x78, 0xFC, 0xF1, 0xE0, 0x0F,
|
||||||
|
0x07, 0xC1, 0xF0, 0x1F, 0xFF, 0x00, 0x7F, 0xF0, 0x00, 0xFE, 0x00, 0x7F,
|
||||||
|
0x1F, 0xE7, 0xFC, 0x0F, 0x01, 0xCF, 0xF7, 0xFF, 0xC7, 0xE1, 0xF8, 0x7F,
|
||||||
|
0xFD, 0xFF, 0x3F, 0x80, 0x00, 0x00, 0x0E, 0x0E, 0x1F, 0x1F, 0x1E, 0x1E,
|
||||||
|
0x3E, 0x3E, 0x7C, 0x7C, 0x7C, 0x7C, 0xF8, 0xF8, 0x7C, 0x7C, 0x7C, 0x7C,
|
||||||
|
0x3E, 0x3E, 0x1E, 0x1E, 0x1F, 0x1F, 0x0E, 0x0E, 0x00, 0x00, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80,
|
||||||
|
0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
|
||||||
|
0x01, 0xFC, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3E, 0x0F, 0x83, 0xC0,
|
||||||
|
0x1E, 0x3C, 0x00, 0x79, 0xC7, 0xE1, 0xDE, 0x3F, 0xCF, 0xE1, 0xCE, 0x3F,
|
||||||
|
0x0E, 0x71, 0xF8, 0x73, 0x8F, 0xC3, 0xF8, 0x7E, 0x1F, 0xC3, 0xF0, 0xEE,
|
||||||
|
0x1F, 0xC7, 0x39, 0xEE, 0x39, 0xCE, 0x78, 0x00, 0xF1, 0xE0, 0x0F, 0x07,
|
||||||
|
0xC1, 0xF0, 0x1F, 0xFF, 0x00, 0x7F, 0xF0, 0x00, 0xFE, 0x00, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFC, 0x3E, 0x3F, 0xBF, 0xFC, 0x7E, 0x3F, 0x1F, 0xFE, 0xFE, 0x3E,
|
||||||
|
0x00, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x83, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80,
|
||||||
|
0x1E, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x3F,
|
||||||
|
0x3F, 0xEF, 0xFD, 0x87, 0x01, 0xC0, 0xF0, 0x78, 0x38, 0x1C, 0x0E, 0x07,
|
||||||
|
0xFD, 0xFF, 0x7F, 0xC0, 0x3C, 0x7F, 0x1F, 0xC8, 0xE0, 0x70, 0xF8, 0x7C,
|
||||||
|
0x3F, 0x03, 0x81, 0xFF, 0xFF, 0xE7, 0xE0, 0x08, 0x38, 0xFB, 0xEF, 0x8E,
|
||||||
|
0x08, 0x00, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1,
|
||||||
|
0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFF, 0x1F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E,
|
||||||
|
0x00, 0xF8, 0x03, 0xE0, 0x00, 0x00, 0xFE, 0x01, 0xFF, 0xFC, 0xFF, 0xFF,
|
||||||
|
0xBF, 0xFF, 0xF7, 0xFE, 0x3F, 0xFF, 0xC7, 0xFF, 0xF8, 0xFF, 0xFF, 0x1F,
|
||||||
|
0xFF, 0xE3, 0xFF, 0xFC, 0x7D, 0xFF, 0x8F, 0xBF, 0xF1, 0xF1, 0xFE, 0x3E,
|
||||||
|
0x0F, 0xC7, 0xC0, 0x78, 0xF8, 0x0F, 0x1F, 0x01, 0xE3, 0xE0, 0x3C, 0x7C,
|
||||||
|
0x07, 0x8F, 0x80, 0xF1, 0xF0, 0x1E, 0x3E, 0x03, 0xC7, 0xC0, 0x78, 0xF8,
|
||||||
|
0x0F, 0x1F, 0x01, 0xE3, 0xE0, 0x3C, 0x7C, 0x07, 0x8F, 0x80, 0xF1, 0xF0,
|
||||||
|
0x7B, 0xFF, 0xFF, 0xFD, 0xE0, 0x1E, 0x38, 0xF0, 0xF0, 0xEF, 0xDF, 0xBC,
|
||||||
|
0x0E, 0x3D, 0xFF, 0xF7, 0xE9, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE0,
|
||||||
|
0x1F, 0x83, 0xFC, 0x7F, 0xE7, 0x0E, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07,
|
||||||
|
0xE0, 0x77, 0x0E, 0x7F, 0xE3, 0xFC, 0x1F, 0x80, 0x00, 0x00, 0x78, 0x78,
|
||||||
|
0xF8, 0xF8, 0x7C, 0x7C, 0x7C, 0x7C, 0x3E, 0x3E, 0x3E, 0x3E, 0x1F, 0x1F,
|
||||||
|
0x3E, 0x3E, 0x3E, 0x3E, 0x7C, 0x7C, 0x7C, 0x7C, 0xF8, 0xF8, 0x78, 0x78,
|
||||||
|
0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x80, 0x3E, 0x07, 0xE0, 0x0F, 0x03,
|
||||||
|
0xF8, 0x07, 0xC0, 0x7E, 0x01, 0xE0, 0x13, 0x80, 0xF0, 0x00, 0xE0, 0x3C,
|
||||||
|
0x00, 0x38, 0x1E, 0x00, 0x0E, 0x07, 0x80, 0x03, 0x83, 0xC1, 0xE0, 0xE0,
|
||||||
|
0xF0, 0xF8, 0x38, 0x78, 0x3E, 0x0E, 0x1E, 0x1F, 0x80, 0x0F, 0x0E, 0xE0,
|
||||||
|
0x03, 0xC3, 0x38, 0x01, 0xE1, 0xFF, 0x00, 0x78, 0x7F, 0xC0, 0x3C, 0x1F,
|
||||||
|
0xF0, 0x0F, 0x00, 0x38, 0x07, 0x80, 0x0E, 0x03, 0xE0, 0x03, 0x80, 0xF0,
|
||||||
|
0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x80, 0x7C, 0x07, 0xE0, 0x1E, 0x03,
|
||||||
|
0xF8, 0x0F, 0x80, 0x7E, 0x03, 0xC0, 0x13, 0x81, 0xE0, 0x00, 0xE0, 0x78,
|
||||||
|
0x00, 0x38, 0x3C, 0x00, 0x0E, 0x0F, 0x00, 0x03, 0x87, 0x8F, 0xC0, 0xE1,
|
||||||
|
0xEF, 0xF8, 0x38, 0xF3, 0xFF, 0x0E, 0x3C, 0x61, 0xC0, 0x1E, 0x00, 0x70,
|
||||||
|
0x07, 0x80, 0x3C, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x0E, 0x00, 0x78, 0x07,
|
||||||
|
0x00, 0x1E, 0x03, 0x80, 0x0F, 0x01, 0xFF, 0x07, 0xC0, 0x7F, 0xC1, 0xE0,
|
||||||
|
0x1F, 0xF0, 0x3C, 0x00, 0x00, 0x7F, 0x00, 0x7C, 0x1F, 0xC0, 0x3C, 0x08,
|
||||||
|
0xE0, 0x3E, 0x00, 0x70, 0x1E, 0x00, 0xF8, 0x1E, 0x00, 0x7C, 0x0F, 0x00,
|
||||||
|
0x3F, 0x0F, 0x00, 0x03, 0x87, 0x80, 0x01, 0xC7, 0x87, 0xBF, 0xE3, 0xC7,
|
||||||
|
0xDF, 0xE3, 0xC3, 0xE7, 0xE1, 0xE3, 0xF0, 0x01, 0xE3, 0xB8, 0x00, 0xF1,
|
||||||
|
0x9C, 0x00, 0xF1, 0xFF, 0x00, 0x78, 0xFF, 0x80, 0x78, 0x7F, 0xC0, 0x3C,
|
||||||
|
0x01, 0xC0, 0x3C, 0x00, 0xE0, 0x3E, 0x00, 0x70, 0x1E, 0x00, 0x00, 0x07,
|
||||||
|
0x80, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0x78, 0x00, 0x00, 0x00, 0x07,
|
||||||
|
0x80, 0x78, 0x0F, 0x81, 0xF0, 0x3F, 0x07, 0xE0, 0x7C, 0x0F, 0x80, 0xF8,
|
||||||
|
0x0F, 0x86, 0xFF, 0xE7, 0xFF, 0x7F, 0xF1, 0xFC, 0x00, 0x40, 0x00, 0x07,
|
||||||
|
0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1C, 0x00,
|
||||||
|
0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x7F,
|
||||||
|
0x80, 0x03, 0xFC, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x00,
|
||||||
|
0xFB, 0xF0, 0x07, 0xDF, 0x80, 0x7C, 0x7C, 0x03, 0xE3, 0xF0, 0x1F, 0x1F,
|
||||||
|
0x81, 0xF0, 0x7C, 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x3F,
|
||||||
|
0xFF, 0xE3, 0xF0, 0x1F, 0x9F, 0x00, 0x7C, 0xF8, 0x03, 0xEF, 0xC0, 0x1F,
|
||||||
|
0xFC, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x01, 0xC0, 0x00, 0x1F, 0x00, 0x01,
|
||||||
|
0xF0, 0x00, 0x1F, 0x00, 0x00, 0x70, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x3F,
|
||||||
|
0xE0, 0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x00, 0xFB, 0xF0, 0x07, 0xDF, 0x80,
|
||||||
|
0x7C, 0x7C, 0x03, 0xE3, 0xF0, 0x1F, 0x1F, 0x81, 0xF0, 0x7C, 0x0F, 0xFF,
|
||||||
|
0xE0, 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x3F, 0xFF, 0xE3, 0xF0, 0x1F, 0x9F,
|
||||||
|
0x00, 0x7C, 0xF8, 0x03, 0xEF, 0xC0, 0x1F, 0xFC, 0x00, 0x7C, 0x00, 0x20,
|
||||||
|
0x00, 0x03, 0x80, 0x00, 0x3E, 0x00, 0x03, 0xF8, 0x00, 0x3D, 0xE0, 0x00,
|
||||||
|
0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x0F, 0xF0,
|
||||||
|
0x00, 0x7F, 0x80, 0x07, 0xFC, 0x00, 0x3F, 0xF0, 0x03, 0xEF, 0x80, 0x1F,
|
||||||
|
0x7E, 0x00, 0xFB, 0xF0, 0x0F, 0x8F, 0x80, 0x7C, 0x7E, 0x03, 0xE3, 0xF0,
|
||||||
|
0x3E, 0x0F, 0x81, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x87, 0xFF,
|
||||||
|
0xFC, 0x7E, 0x03, 0xF3, 0xE0, 0x0F, 0x9F, 0x00, 0x7D, 0xF8, 0x03, 0xFF,
|
||||||
|
0x80, 0x0F, 0x80, 0x01, 0xC6, 0x00, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x06,
|
||||||
|
0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80,
|
||||||
|
0x01, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x7D,
|
||||||
|
0xF0, 0x03, 0xEF, 0xC0, 0x1F, 0x7E, 0x01, 0xF1, 0xF0, 0x0F, 0x8F, 0xC0,
|
||||||
|
0x7C, 0x7E, 0x07, 0xC1, 0xF0, 0x3F, 0xFF, 0x83, 0xFF, 0xFE, 0x1F, 0xFF,
|
||||||
|
0xF0, 0xFF, 0xFF, 0x8F, 0xC0, 0x7E, 0x7C, 0x01, 0xF3, 0xE0, 0x0F, 0xBF,
|
||||||
|
0x00, 0x7F, 0xF0, 0x01, 0xF0, 0x07, 0x0E, 0x00, 0x7C, 0xF8, 0x03, 0xE7,
|
||||||
|
0xC0, 0x1F, 0x3E, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x07, 0xFC,
|
||||||
|
0x00, 0x3F, 0xF0, 0x03, 0xEF, 0x80, 0x1F, 0x7E, 0x00, 0xFB, 0xF0, 0x0F,
|
||||||
|
0x8F, 0x80, 0x7C, 0x7E, 0x03, 0xE3, 0xF0, 0x3E, 0x0F, 0x81, 0xFF, 0xFC,
|
||||||
|
0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x7E, 0x03, 0xF3, 0xE0,
|
||||||
|
0x0F, 0x9F, 0x00, 0x7D, 0xF8, 0x03, 0xFF, 0x80, 0x0F, 0x80, 0x00, 0x70,
|
||||||
|
0x00, 0x07, 0xC0, 0x00, 0x63, 0x00, 0x03, 0x18, 0x00, 0x18, 0xC0, 0x00,
|
||||||
|
0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x1F, 0xF8,
|
||||||
|
0x00, 0xFF, 0xC0, 0x0F, 0xBE, 0x00, 0x7D, 0xF8, 0x03, 0xEF, 0xC0, 0x3E,
|
||||||
|
0x3E, 0x01, 0xF1, 0xF8, 0x1F, 0x8F, 0xC0, 0xF8, 0x3E, 0x07, 0xFF, 0xF8,
|
||||||
|
0x7F, 0xFF, 0xC3, 0xFF, 0xFE, 0x1F, 0xFF, 0xF1, 0xF8, 0x0F, 0xCF, 0x80,
|
||||||
|
0x3E, 0x7C, 0x01, 0xF7, 0xE0, 0x0F, 0xFE, 0x00, 0x3E, 0x00, 0x0F, 0xFF,
|
||||||
|
0xF8, 0x00, 0x7F, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xFE,
|
||||||
|
0x00, 0x3F, 0xF0, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x0F, 0xDF, 0x00, 0x00,
|
||||||
|
0x3F, 0x7C, 0x00, 0x01, 0xF9, 0xFF, 0xF0, 0x07, 0xC7, 0xFF, 0xC0, 0x3F,
|
||||||
|
0x1F, 0xFF, 0x01, 0xF8, 0x7F, 0xFC, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xFF,
|
||||||
|
0xC0, 0x00, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x1F, 0x01, 0xF0,
|
||||||
|
0x00, 0xFC, 0x07, 0xFF, 0xF7, 0xE0, 0x1F, 0xFF, 0xDF, 0x80, 0x7F, 0xFF,
|
||||||
|
0xFC, 0x01, 0xFF, 0xFC, 0x01, 0xFC, 0x03, 0xFF, 0xC7, 0xFF, 0xE7, 0xFF,
|
||||||
|
0xE3, 0xF0, 0x33, 0xF0, 0x01, 0xF0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C,
|
||||||
|
0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xF0, 0x00,
|
||||||
|
0xFC, 0x00, 0x7F, 0x03, 0x1F, 0xFF, 0x87, 0xFF, 0xE1, 0xFF, 0xF0, 0x1F,
|
||||||
|
0xC0, 0x0F, 0x00, 0x07, 0x80, 0x00, 0xE0, 0x00, 0x70, 0x01, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0x02, 0x00, 0x07, 0x00, 0x0F, 0x80, 0x07, 0xC0,
|
||||||
|
0x03, 0xE0, 0x01, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x80, 0x01, 0xC0, 0x03, 0xE0, 0x07, 0xC0,
|
||||||
|
0x0F, 0x80, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x03, 0x80, 0x07, 0xC0, 0x0F, 0xE0,
|
||||||
|
0x1E, 0xF0, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xFE, 0xFF, 0xFE, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0x1C, 0x38, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x1C, 0x38,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xFE, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFC,
|
||||||
|
0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0x20, 0xE3, 0xE3, 0xE3, 0xE3, 0x82, 0x00, 0x00, 0xF9, 0xF3, 0xE7, 0xCF,
|
||||||
|
0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3,
|
||||||
|
0xE7, 0xCF, 0x80, 0x08, 0x38, 0xFB, 0xEF, 0x8E, 0x08, 0x00, 0x00, 0xF9,
|
||||||
|
0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E,
|
||||||
|
0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x80, 0x08, 0x0E, 0x0F, 0x8F, 0xEF, 0x7A,
|
||||||
|
0x08, 0x00, 0x00, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C,
|
||||||
|
0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F,
|
||||||
|
0x87, 0xC3, 0xE0, 0x70, 0xEF, 0x9F, 0xF9, 0xFF, 0x9F, 0x70, 0xE0, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0,
|
||||||
|
0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0,
|
||||||
|
0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x00, 0x1F,
|
||||||
|
0xFC, 0x00, 0x7F, 0xFE, 0x01, 0xFF, 0xFE, 0x07, 0xFF, 0xFC, 0x1F, 0x07,
|
||||||
|
0xF0, 0x7C, 0x07, 0xE1, 0xF0, 0x0F, 0x87, 0xC0, 0x1F, 0xFF, 0xF0, 0x7F,
|
||||||
|
0xFF, 0xC1, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, 0x1F, 0x1F, 0x00, 0x7C, 0x7C,
|
||||||
|
0x03, 0xF1, 0xF0, 0x0F, 0x87, 0xC0, 0x7E, 0x1F, 0x07, 0xF0, 0x7F, 0xFF,
|
||||||
|
0xC1, 0xFF, 0xFE, 0x07, 0xFF, 0xE0, 0x1F, 0xFC, 0x00, 0x03, 0x8C, 0x00,
|
||||||
|
0xFF, 0xC0, 0x3F, 0xF0, 0x03, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x07, 0xC0, 0x1F, 0xFC, 0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF,
|
||||||
|
0x81, 0xFF, 0xF8, 0x3F, 0xFF, 0x87, 0xFF, 0xF8, 0xFF, 0xDF, 0x1F, 0xF9,
|
||||||
|
0xF3, 0xFF, 0x1F, 0x7F, 0xE3, 0xFF, 0xFC, 0x3F, 0xFF, 0x83, 0xFF, 0xF0,
|
||||||
|
0x3F, 0xFE, 0x07, 0xFF, 0xC0, 0x7F, 0xF8, 0x07, 0xFF, 0x00, 0xFF, 0xE0,
|
||||||
|
0x0F, 0xFC, 0x01, 0xF0, 0x00, 0x80, 0x00, 0x1C, 0x00, 0x03, 0xE0, 0x00,
|
||||||
|
0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x1F, 0x80, 0x0F, 0xFF, 0x01, 0xFF, 0xF8, 0x3F, 0xFF,
|
||||||
|
0xC3, 0xF0, 0xFC, 0x7E, 0x07, 0xE7, 0xC0, 0x3E, 0xF8, 0x01, 0xFF, 0x80,
|
||||||
|
0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8,
|
||||||
|
0x01, 0xF7, 0xC0, 0x3E, 0x7E, 0x07, 0xE7, 0xF0, 0xFE, 0x3F, 0xFF, 0xC1,
|
||||||
|
0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x00, 0x03, 0x80,
|
||||||
|
0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x0E, 0x00, 0x00, 0x40,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x0F, 0xFF, 0x01, 0xFF,
|
||||||
|
0xF8, 0x3F, 0xFF, 0xC3, 0xF0, 0xFC, 0x7E, 0x07, 0xE7, 0xC0, 0x3E, 0xF8,
|
||||||
|
0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF,
|
||||||
|
0x80, 0x1F, 0xF8, 0x01, 0xF7, 0xC0, 0x3E, 0x7E, 0x07, 0xE7, 0xF0, 0xFE,
|
||||||
|
0x3F, 0xFF, 0xC1, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x1F, 0xC0, 0x00, 0x40,
|
||||||
|
0x00, 0x0E, 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x80, 0x07, 0xBC, 0x00, 0x20,
|
||||||
|
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0xFF, 0xF0, 0x1F,
|
||||||
|
0xFF, 0x83, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xE0, 0x7E, 0x7C, 0x03, 0xEF,
|
||||||
|
0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F,
|
||||||
|
0xF8, 0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x03, 0xE7, 0xE0, 0x7E, 0x7F, 0x0F,
|
||||||
|
0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xFC, 0x00, 0x01,
|
||||||
|
0xC6, 0x00, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0x31, 0xC0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x0F, 0xFF, 0x01, 0xFF, 0xF8,
|
||||||
|
0x3F, 0xFF, 0xC3, 0xF0, 0xFC, 0x7E, 0x07, 0xE7, 0xC0, 0x3E, 0xF8, 0x01,
|
||||||
|
0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80,
|
||||||
|
0x1F, 0xF8, 0x01, 0xF7, 0xC0, 0x3E, 0x7E, 0x07, 0xE7, 0xF0, 0xFE, 0x3F,
|
||||||
|
0xFF, 0xC1, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x1F, 0xC0, 0x07, 0x0E, 0x00,
|
||||||
|
0xF9, 0xF0, 0x0F, 0x9F, 0x00, 0xF9, 0xF0, 0x07, 0x0E, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0xFF, 0xF0, 0x1F, 0xFF,
|
||||||
|
0x83, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xE0, 0x7E, 0x7C, 0x03, 0xEF, 0x80,
|
||||||
|
0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8,
|
||||||
|
0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x03, 0xE7, 0xE0, 0x7E, 0x7F, 0x0F, 0xE3,
|
||||||
|
0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xFC, 0x00, 0x20, 0x11,
|
||||||
|
0xC0, 0xEF, 0x87, 0xDF, 0x3E, 0x3F, 0xF0, 0x7F, 0x80, 0xFC, 0x03, 0xF0,
|
||||||
|
0x1F, 0xE0, 0xFF, 0xC7, 0xCF, 0xBE, 0x1F, 0x70, 0x38, 0x80, 0x40, 0x00,
|
||||||
|
0x00, 0x80, 0x1F, 0x8C, 0x0F, 0xFF, 0xE1, 0xFF, 0xFC, 0x3F, 0xFF, 0xC3,
|
||||||
|
0xF0, 0xFC, 0x7E, 0x0F, 0xE7, 0xC1, 0xFE, 0xF8, 0x3D, 0xFF, 0x83, 0x9F,
|
||||||
|
0xF8, 0x79, 0xFF, 0x8F, 0x1F, 0xF9, 0xE1, 0xFF, 0xBC, 0x1F, 0xFB, 0xC1,
|
||||||
|
0xF7, 0xF8, 0x3E, 0x7F, 0x07, 0xE7, 0xF0, 0xFE, 0x3F, 0xFF, 0xC3, 0xFF,
|
||||||
|
0xF8, 0x7F, 0xFF, 0x07, 0x1F, 0xC0, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00,
|
||||||
|
0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x38, 0x00, 0x04,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F,
|
||||||
|
0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE,
|
||||||
|
0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80,
|
||||||
|
0x7F, 0xE0, 0x1F, 0xFC, 0x0F, 0xDF, 0x87, 0xE7, 0xFF, 0xF8, 0xFF, 0xFC,
|
||||||
|
0x1F, 0xFE, 0x01, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x0F, 0x80,
|
||||||
|
0x07, 0xC0, 0x03, 0xE0, 0x00, 0x70, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x3E, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01,
|
||||||
|
0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F,
|
||||||
|
0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xFC,
|
||||||
|
0x0F, 0xDF, 0x87, 0xE7, 0xFF, 0xF8, 0xFF, 0xFC, 0x1F, 0xFE, 0x01, 0xFE,
|
||||||
|
0x00, 0x00, 0x80, 0x00, 0x70, 0x00, 0x3E, 0x00, 0x1F, 0xC0, 0x0F, 0x78,
|
||||||
|
0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x07, 0xFE, 0x01, 0xFF,
|
||||||
|
0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0,
|
||||||
|
0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07,
|
||||||
|
0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xF0, 0x3F, 0x7E, 0x1F, 0x9F, 0xFF, 0xE3,
|
||||||
|
0xFF, 0xF0, 0x7F, 0xF8, 0x07, 0xF8, 0x00, 0x0E, 0x1C, 0x07, 0xCF, 0x81,
|
||||||
|
0xF3, 0xE0, 0x7C, 0xF8, 0x0E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07,
|
||||||
|
0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF,
|
||||||
|
0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xF0,
|
||||||
|
0x3F, 0x7E, 0x1F, 0x9F, 0xFF, 0xE3, 0xFF, 0xF0, 0x7F, 0xF8, 0x07, 0xF8,
|
||||||
|
0x00, 0x00, 0x08, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00,
|
||||||
|
0x0F, 0x80, 0x00, 0x38, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x07, 0xE0, 0x0F, 0xDF, 0x00, 0xFC, 0xFC, 0x07, 0xE3, 0xF0, 0x7E, 0x0F,
|
||||||
|
0x83, 0xE0, 0x7E, 0x3F, 0x01, 0xFB, 0xF0, 0x0F, 0xDF, 0x80, 0x3F, 0xF8,
|
||||||
|
0x00, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x1F, 0xC0, 0x00, 0x7C, 0x00, 0x03,
|
||||||
|
0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00,
|
||||||
|
0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x7C, 0x00,
|
||||||
|
0x3E, 0x00, 0x1F, 0xFE, 0x0F, 0xFF, 0xC7, 0xFF, 0xF3, 0xFF, 0xFD, 0xF0,
|
||||||
|
0x7F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x83, 0xFF,
|
||||||
|
0xFF, 0xFB, 0xFF, 0xF9, 0xFF, 0xF8, 0xFF, 0xF0, 0x7C, 0x00, 0x3E, 0x00,
|
||||||
|
0x1F, 0x00, 0x0F, 0x80, 0x00, 0x0F, 0xE0, 0x1F, 0xF8, 0x1F, 0xFE, 0x0F,
|
||||||
|
0xFF, 0x8F, 0xC7, 0xC7, 0xC3, 0xE3, 0xE1, 0xF1, 0xF0, 0xF8, 0xF8, 0xF8,
|
||||||
|
0x7C, 0x7C, 0x3E, 0x7C, 0x1F, 0x3E, 0x0F, 0x9F, 0x07, 0xCF, 0xE3, 0xE3,
|
||||||
|
0xF9, 0xF0, 0xFE, 0xF8, 0x1F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x21, 0xFF,
|
||||||
|
0x9F, 0xFF, 0xCF, 0xFB, 0xE7, 0xFD, 0xF3, 0xF8, 0x04, 0x00, 0x38, 0x01,
|
||||||
|
0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x7F, 0x83, 0xFF, 0x0F, 0xFE, 0x3F, 0xFC, 0x03, 0xF0, 0x07, 0xC7, 0xFF,
|
||||||
|
0x7F, 0xFD, 0xFF, 0xFF, 0xC7, 0xFE, 0x1F, 0xF8, 0x7F, 0xFF, 0xF7, 0xFF,
|
||||||
|
0xDF, 0xFF, 0x1F, 0xF8, 0x00, 0x80, 0x07, 0x00, 0x3E, 0x01, 0xF0, 0x0F,
|
||||||
|
0x80, 0x1C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x83, 0xFF, 0x0F,
|
||||||
|
0xFE, 0x3F, 0xFC, 0x03, 0xF0, 0x07, 0xC7, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF,
|
||||||
|
0xC7, 0xFE, 0x1F, 0xF8, 0x7F, 0xFF, 0xF7, 0xFF, 0xDF, 0xFF, 0x1F, 0xF8,
|
||||||
|
0x02, 0x00, 0x1C, 0x00, 0xF8, 0x07, 0xF0, 0x3D, 0xE0, 0x41, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1F, 0xE0, 0xFF, 0xC3, 0xFF, 0x8F, 0xFF, 0x00, 0xFC, 0x01,
|
||||||
|
0xF1, 0xFF, 0xDF, 0xFF, 0x7F, 0xFF, 0xF1, 0xFF, 0x87, 0xFE, 0x1F, 0xFF,
|
||||||
|
0xFD, 0xFF, 0xF7, 0xFF, 0xC7, 0xFE, 0x0E, 0x30, 0x7F, 0xE3, 0xFF, 0x06,
|
||||||
|
0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x3F, 0xF0, 0xFF, 0xE3,
|
||||||
|
0xFF, 0xC0, 0x3F, 0x00, 0x7C, 0x7F, 0xF7, 0xFF, 0xDF, 0xFF, 0xFC, 0x7F,
|
||||||
|
0xE1, 0xFF, 0x87, 0xFF, 0xFF, 0x7F, 0xFD, 0xFF, 0xF1, 0xFF, 0x80, 0x38,
|
||||||
|
0x71, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x1F, 0xE0, 0xFF, 0xC3, 0xFF, 0x8F, 0xFF, 0x00, 0xFC, 0x01, 0xF1,
|
||||||
|
0xFF, 0xDF, 0xFF, 0x7F, 0xFF, 0xF1, 0xFF, 0x87, 0xFE, 0x1F, 0xFF, 0xFD,
|
||||||
|
0xFF, 0xF7, 0xFF, 0xC7, 0xFE, 0x03, 0x80, 0x1F, 0x00, 0xC6, 0x03, 0x18,
|
||||||
|
0x0C, 0x60, 0x1F, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x83, 0xFF,
|
||||||
|
0x0F, 0xFE, 0x3F, 0xFC, 0x03, 0xF0, 0x07, 0xC7, 0xFF, 0x7F, 0xFD, 0xFF,
|
||||||
|
0xFF, 0xC7, 0xFE, 0x1F, 0xF8, 0x7F, 0xFF, 0xF7, 0xFF, 0xDF, 0xFF, 0x1F,
|
||||||
|
0xF8, 0x1F, 0xE1, 0xF8, 0x1F, 0xFB, 0xFF, 0x0F, 0xFF, 0xFF, 0xC7, 0xFF,
|
||||||
|
0xFF, 0xE2, 0x07, 0xF1, 0xF8, 0x01, 0xF0, 0x7C, 0x3F, 0xFF, 0xFE, 0x7F,
|
||||||
|
0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFE, 0x1F, 0x00, 0x3E, 0x0F, 0xC0, 0x1F,
|
||||||
|
0x83, 0xF0, 0x0F, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC,
|
||||||
|
0x1F, 0xC3, 0xF8, 0x03, 0xF8, 0x7F, 0xF3, 0xFF, 0x9F, 0xFE, 0x7E, 0x0B,
|
||||||
|
0xF0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x80,
|
||||||
|
0x3F, 0xFC, 0x7F, 0xF0, 0xFF, 0xC0, 0x7E, 0x03, 0xC0, 0x03, 0x80, 0x0E,
|
||||||
|
0x03, 0xF8, 0x0F, 0xC0, 0x3E, 0x00, 0x02, 0x00, 0x07, 0x00, 0x0F, 0x80,
|
||||||
|
0x07, 0xC0, 0x03, 0xE0, 0x01, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0x7C, 0x3F, 0xF8, 0x1F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x04,
|
||||||
|
0x7F, 0xFE, 0x3F, 0xFE, 0x1F, 0xFE, 0x07, 0xF8, 0x00, 0x40, 0x00, 0xE0,
|
||||||
|
0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x03, 0x80, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0x7C, 0x3F,
|
||||||
|
0xF8, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFC, 0x00,
|
||||||
|
0x7E, 0x04, 0x7F, 0xFE, 0x3F, 0xFE, 0x1F, 0xFE, 0x07, 0xF8, 0x01, 0x00,
|
||||||
|
0x03, 0x80, 0x07, 0xC0, 0x0F, 0xE0, 0x1E, 0xF0, 0x08, 0x20, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0x7C, 0x3F,
|
||||||
|
0xF8, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFC, 0x00,
|
||||||
|
0x7E, 0x04, 0x7F, 0xFE, 0x3F, 0xFE, 0x1F, 0xFE, 0x07, 0xF8, 0x1C, 0x38,
|
||||||
|
0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x1C, 0x38, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0x7C, 0x3F,
|
||||||
|
0xF8, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFC, 0x00,
|
||||||
|
0x7E, 0x04, 0x7F, 0xFE, 0x3F, 0xFE, 0x1F, 0xFE, 0x07, 0xF8, 0x20, 0xE3,
|
||||||
|
0xE3, 0xE3, 0xE3, 0x82, 0x00, 0x00, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E,
|
||||||
|
0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0x08, 0x38, 0xFB, 0xEF,
|
||||||
|
0x8E, 0x08, 0x00, 0x00, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9,
|
||||||
|
0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0x08, 0x0E, 0x0F, 0x8F, 0xEF, 0x7A,
|
||||||
|
0x08, 0x00, 0x00, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C,
|
||||||
|
0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x70, 0xEF, 0x9F,
|
||||||
|
0xF9, 0xFF, 0x9F, 0x70, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0xF8,
|
||||||
|
0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8,
|
||||||
|
0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x00, 0x80, 0x00,
|
||||||
|
0xF0, 0x00, 0xFC, 0x60, 0x3F, 0xF0, 0x0F, 0xF8, 0x1F, 0xF0, 0x0F, 0xF8,
|
||||||
|
0x07, 0x3E, 0x00, 0x1F, 0x03, 0xF7, 0x87, 0xFF, 0xE7, 0xFF, 0xF7, 0xFF,
|
||||||
|
0xFF, 0xE0, 0xFF, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE,
|
||||||
|
0x07, 0xCF, 0x87, 0xE7, 0xFF, 0xE1, 0xFF, 0xF0, 0x7F, 0xF0, 0x0F, 0xE0,
|
||||||
|
0x0E, 0x30, 0x7F, 0xE3, 0xFF, 0x06, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x0F, 0xF0, 0xFF, 0xF3, 0xFF, 0xEF, 0xFF, 0xBE, 0x3F, 0xF8, 0x7F, 0xE1,
|
||||||
|
0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8,
|
||||||
|
0x7F, 0xE1, 0xFF, 0x87, 0xC0, 0x01, 0x00, 0x01, 0xC0, 0x01, 0xF0, 0x00,
|
||||||
|
0x7C, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x03, 0xF8, 0x07, 0xFF, 0x07, 0xFF, 0xC7, 0xFF, 0xF3, 0xF1, 0xFB, 0xF0,
|
||||||
|
0x7F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x83, 0xF7,
|
||||||
|
0xE3, 0xF3, 0xFF, 0xF8, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x00,
|
||||||
|
0x40, 0x00, 0x70, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x1C, 0x00,
|
||||||
|
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x07, 0xFF, 0x07, 0xFF,
|
||||||
|
0xC7, 0xFF, 0xF3, 0xF1, 0xFB, 0xF0, 0x7F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC,
|
||||||
|
0x07, 0xFE, 0x03, 0xFF, 0x83, 0xF7, 0xE3, 0xF3, 0xFF, 0xF8, 0xFF, 0xF8,
|
||||||
|
0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0xE0, 0x00, 0xF8, 0x00,
|
||||||
|
0xFE, 0x00, 0xF7, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0,
|
||||||
|
0x0F, 0xFE, 0x0F, 0xFF, 0x8F, 0xFF, 0xE7, 0xE3, 0xF7, 0xE0, 0xFF, 0xE0,
|
||||||
|
0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFF, 0x07, 0xEF, 0xC7, 0xE7,
|
||||||
|
0xFF, 0xF1, 0xFF, 0xF0, 0x7F, 0xF0, 0x0F, 0xE0, 0x07, 0x18, 0x07, 0xFE,
|
||||||
|
0x07, 0xFE, 0x01, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F,
|
||||||
|
0xE0, 0x1F, 0xFC, 0x1F, 0xFF, 0x1F, 0xFF, 0xCF, 0xC7, 0xEF, 0xC1, 0xFF,
|
||||||
|
0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFE, 0x0F, 0xDF, 0x8F,
|
||||||
|
0xCF, 0xFF, 0xE3, 0xFF, 0xE0, 0xFF, 0xE0, 0x1F, 0xC0, 0x0E, 0x1C, 0x0F,
|
||||||
|
0x9F, 0x07, 0xCF, 0x83, 0xE7, 0xC0, 0xE1, 0xC0, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x8F, 0xFF, 0xE7, 0xE3,
|
||||||
|
0xF7, 0xE0, 0xFF, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFF,
|
||||||
|
0x07, 0xEF, 0xC7, 0xE7, 0xFF, 0xF1, 0xFF, 0xF0, 0x7F, 0xF0, 0x0F, 0xE0,
|
||||||
|
0x03, 0x80, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x38, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x70, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x07, 0x00, 0x00, 0x02,
|
||||||
|
0x03, 0xFB, 0x87, 0xFF, 0xC7, 0xFF, 0xC7, 0xFF, 0xF3, 0xF1, 0xFB, 0xF1,
|
||||||
|
0xFF, 0xF1, 0xFF, 0xF9, 0xEF, 0xFD, 0xE7, 0xFF, 0xE3, 0xFF, 0xE3, 0xF7,
|
||||||
|
0xE3, 0xF3, 0xFF, 0xF8, 0xFF, 0xF8, 0xFF, 0xF8, 0x77, 0xF0, 0x10, 0x00,
|
||||||
|
0x00, 0x04, 0x00, 0x38, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0E, 0x00,
|
||||||
|
0x10, 0x00, 0x00, 0x00, 0x03, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F,
|
||||||
|
0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F,
|
||||||
|
0xFC, 0x7D, 0xFF, 0xF7, 0xFF, 0xCF, 0xFF, 0x0F, 0xF0, 0x00, 0x80, 0x07,
|
||||||
|
0x00, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x1C, 0x00, 0x20, 0x00, 0x00, 0x00,
|
||||||
|
0x03, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE,
|
||||||
|
0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xFC, 0x7D, 0xFF, 0xF7,
|
||||||
|
0xFF, 0xCF, 0xFF, 0x0F, 0xF0, 0x01, 0x00, 0x0E, 0x00, 0x7C, 0x03, 0xF8,
|
||||||
|
0x1E, 0xF0, 0x20, 0x80, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0xE1, 0xFF, 0x87,
|
||||||
|
0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1,
|
||||||
|
0xFF, 0x87, 0xFF, 0x1F, 0x7F, 0xFD, 0xFF, 0xF3, 0xFF, 0xC3, 0xFC, 0x38,
|
||||||
|
0x71, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF,
|
||||||
|
0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFF, 0x1F, 0x7F, 0xFD,
|
||||||
|
0xFF, 0xF3, 0xFF, 0xC3, 0xFC, 0x00, 0x20, 0x00, 0x38, 0x00, 0x3E, 0x00,
|
||||||
|
0x3E, 0x00, 0x3E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x7C, 0x07, 0xFF, 0x07, 0xEF, 0x83, 0xE7, 0xC1, 0xF3, 0xF1, 0xF8, 0xF8,
|
||||||
|
0xF8, 0x7C, 0x7C, 0x3E, 0x3C, 0x0F, 0xBE, 0x07, 0xDF, 0x01, 0xEF, 0x00,
|
||||||
|
0xFF, 0x80, 0x3F, 0x80, 0x1F, 0xC0, 0x07, 0xE0, 0x03, 0xE0, 0x01, 0xF0,
|
||||||
|
0x01, 0xF0, 0x0F, 0xF8, 0x0F, 0xF8, 0x07, 0xF8, 0x01, 0xF0, 0x00, 0x38,
|
||||||
|
0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8,
|
||||||
|
0x00, 0xF8, 0x00, 0xFF, 0xE0, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xFE, 0xF8,
|
||||||
|
0x7E, 0xF8, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8,
|
||||||
|
0x3F, 0xF8, 0x3E, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8, 0xFB, 0xF0, 0xF8,
|
||||||
|
0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x0E,
|
||||||
|
0x1C, 0x0F, 0x9F, 0x07, 0xCF, 0x83, 0xE7, 0xC0, 0xE1, 0xC0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0xFE, 0x0F, 0xDF, 0x07, 0xCF, 0x83,
|
||||||
|
0xE7, 0xE3, 0xF1, 0xF1, 0xF0, 0xF8, 0xF8, 0x7C, 0x78, 0x1F, 0x7C, 0x0F,
|
||||||
|
0xBE, 0x03, 0xDE, 0x01, 0xFF, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x0F, 0xC0,
|
||||||
|
0x07, 0xC0, 0x03, 0xE0, 0x03, 0xE0, 0x1F, 0xF0, 0x1F, 0xF0, 0x0F, 0xF0,
|
||||||
|
0x03, 0xE0, 0x00 };
|
||||||
|
|
||||||
|
const GFXglyph Ubuntu_Bold16pt8bGlyphs[] PROGMEM = {
|
||||||
|
{ 0, 1, 1, 7, 0, 0 }, // 0x20 ' ' U+0020
|
||||||
|
{ 1, 5, 21, 9, 2, -20 }, // 0x21 '!' U+0021
|
||||||
|
{ 15, 12, 9, 14, 2, -23 }, // 0x22 '"' U+0022
|
||||||
|
{ 29, 18, 21, 22, 2, -20 }, // 0x23 '#' U+0023
|
||||||
|
{ 77, 16, 28, 18, 1, -23 }, // 0x24 '$' U+0024
|
||||||
|
{ 133, 26, 21, 28, 1, -20 }, // 0x25 '%' U+0025
|
||||||
|
{ 202, 21, 21, 22, 1, -20 }, // 0x26 '&' U+0026
|
||||||
|
{ 258, 5, 9, 9, 2, -23 }, // 0x27 ''' U+0027
|
||||||
|
{ 264, 9, 30, 11, 2, -23 }, // 0x28 '(' U+0028
|
||||||
|
{ 298, 9, 30, 11, 0, -23 }, // 0x29 ')' U+0029
|
||||||
|
{ 332, 13, 12, 16, 2, -20 }, // 0x2a '*' U+002A
|
||||||
|
{ 352, 14, 14, 18, 2, -15 }, // 0x2b '+' U+002B
|
||||||
|
{ 377, 6, 10, 8, 1, -4 }, // 0x2c ',' U+002C
|
||||||
|
{ 385, 9, 4, 11, 1, -10 }, // 0x2d '-' U+002D
|
||||||
|
{ 390, 6, 6, 8, 1, -5 }, // 0x2e '.' U+002E
|
||||||
|
{ 395, 15, 30, 14, -1, -23 }, // 0x2f '/' U+002F
|
||||||
|
{ 452, 16, 21, 18, 1, -20 }, // 0x30 '0' U+0030
|
||||||
|
{ 494, 10, 21, 18, 3, -20 }, // 0x31 '1' U+0031
|
||||||
|
{ 521, 15, 21, 18, 1, -20 }, // 0x32 '2' U+0032
|
||||||
|
{ 561, 15, 21, 18, 1, -20 }, // 0x33 '3' U+0033
|
||||||
|
{ 601, 16, 21, 18, 1, -20 }, // 0x34 '4' U+0034
|
||||||
|
{ 643, 15, 21, 18, 1, -20 }, // 0x35 '5' U+0035
|
||||||
|
{ 683, 16, 21, 18, 1, -20 }, // 0x36 '6' U+0036
|
||||||
|
{ 725, 16, 21, 18, 1, -20 }, // 0x37 '7' U+0037
|
||||||
|
{ 767, 16, 21, 18, 1, -20 }, // 0x38 '8' U+0038
|
||||||
|
{ 809, 16, 21, 18, 1, -20 }, // 0x39 '9' U+0039
|
||||||
|
{ 851, 6, 17, 8, 1, -16 }, // 0x3a ':' U+003A
|
||||||
|
{ 864, 6, 22, 8, 1, -16 }, // 0x3b ';' U+003B
|
||||||
|
{ 881, 15, 15, 18, 1, -16 }, // 0x3c '<' U+003C
|
||||||
|
{ 910, 15, 11, 18, 1, -14 }, // 0x3d '=' U+003D
|
||||||
|
{ 931, 14, 15, 18, 2, -16 }, // 0x3e '>' U+003E
|
||||||
|
{ 958, 12, 24, 14, 1, -23 }, // 0x3f '?' U+003F
|
||||||
|
{ 994, 26, 27, 30, 2, -21 }, // 0x40 '@' U+0040
|
||||||
|
{ 1082, 21, 21, 21, 0, -20 }, // 0x41 'A' U+0041
|
||||||
|
{ 1138, 17, 21, 21, 2, -20 }, // 0x42 'B' U+0042
|
||||||
|
{ 1183, 17, 21, 20, 2, -20 }, // 0x43 'C' U+0043
|
||||||
|
{ 1228, 19, 21, 23, 2, -20 }, // 0x44 'D' U+0044
|
||||||
|
{ 1278, 16, 21, 19, 2, -20 }, // 0x45 'E' U+0045
|
||||||
|
{ 1320, 15, 21, 18, 2, -20 }, // 0x46 'F' U+0046
|
||||||
|
{ 1360, 18, 21, 22, 2, -20 }, // 0x47 'G' U+0047
|
||||||
|
{ 1408, 19, 21, 23, 2, -20 }, // 0x48 'H' U+0048
|
||||||
|
{ 1458, 5, 21, 9, 2, -20 }, // 0x49 'I' U+0049
|
||||||
|
{ 1472, 14, 21, 16, 0, -20 }, // 0x4a 'J' U+004A
|
||||||
|
{ 1509, 19, 21, 21, 2, -20 }, // 0x4b 'K' U+004B
|
||||||
|
{ 1559, 14, 21, 17, 2, -20 }, // 0x4c 'L' U+004C
|
||||||
|
{ 1596, 24, 21, 28, 2, -20 }, // 0x4d 'M' U+004D
|
||||||
|
{ 1659, 19, 21, 23, 2, -20 }, // 0x4e 'N' U+004E
|
||||||
|
{ 1709, 20, 21, 24, 2, -20 }, // 0x4f 'O' U+004F
|
||||||
|
{ 1762, 17, 21, 20, 2, -20 }, // 0x50 'P' U+0050
|
||||||
|
{ 1807, 20, 27, 24, 2, -20 }, // 0x51 'Q' U+0051
|
||||||
|
{ 1875, 18, 21, 21, 2, -20 }, // 0x52 'R' U+0052
|
||||||
|
{ 1923, 16, 21, 18, 1, -20 }, // 0x53 'S' U+0053
|
||||||
|
{ 1965, 17, 21, 19, 1, -20 }, // 0x54 'T' U+0054
|
||||||
|
{ 2010, 18, 21, 22, 2, -20 }, // 0x55 'U' U+0055
|
||||||
|
{ 2058, 21, 21, 21, 0, -20 }, // 0x56 'V' U+0056
|
||||||
|
{ 2114, 29, 21, 31, 1, -20 }, // 0x57 'W' U+0057
|
||||||
|
{ 2191, 21, 21, 21, 0, -20 }, // 0x58 'X' U+0058
|
||||||
|
{ 2247, 21, 21, 21, 0, -20 }, // 0x59 'Y' U+0059
|
||||||
|
{ 2303, 17, 21, 19, 1, -20 }, // 0x5a 'Z' U+005A
|
||||||
|
{ 2348, 10, 30, 12, 2, -23 }, // 0x5b '[' U+005B
|
||||||
|
{ 2386, 15, 30, 14, -1, -23 }, // 0x5c '\' U+005C
|
||||||
|
{ 2443, 10, 30, 12, 0, -23 }, // 0x5d ']' U+005D
|
||||||
|
{ 2481, 17, 13, 19, 1, -21 }, // 0x5e '^' U+005E
|
||||||
|
{ 2509, 16, 4, 16, 0, 3 }, // 0x5f '_' U+005F
|
||||||
|
{ 2517, 7, 7, 9, 1, -24 }, // 0x60 '`' U+0060
|
||||||
|
{ 2524, 14, 16, 17, 1, -15 }, // 0x61 'a' U+0061
|
||||||
|
{ 2552, 16, 24, 19, 2, -23 }, // 0x62 'b' U+0062
|
||||||
|
{ 2600, 14, 16, 16, 1, -15 }, // 0x63 'c' U+0063
|
||||||
|
{ 2628, 16, 24, 19, 1, -23 }, // 0x64 'd' U+0064
|
||||||
|
{ 2676, 16, 16, 18, 1, -15 }, // 0x65 'e' U+0065
|
||||||
|
{ 2708, 12, 24, 14, 2, -23 }, // 0x66 'f' U+0066
|
||||||
|
{ 2744, 15, 22, 18, 1, -15 }, // 0x67 'g' U+0067
|
||||||
|
{ 2786, 14, 24, 18, 2, -23 }, // 0x68 'h' U+0068
|
||||||
|
{ 2828, 5, 24, 9, 2, -23 }, // 0x69 'i' U+0069
|
||||||
|
{ 2843, 9, 30, 9, -2, -23 }, // 0x6a 'j' U+006A
|
||||||
|
{ 2877, 15, 24, 18, 2, -23 }, // 0x6b 'k' U+006B
|
||||||
|
{ 2922, 8, 24, 10, 2, -23 }, // 0x6c 'l' U+006C
|
||||||
|
{ 2946, 23, 16, 27, 2, -15 }, // 0x6d 'm' U+006D
|
||||||
|
{ 2992, 14, 16, 18, 2, -15 }, // 0x6e 'n' U+006E
|
||||||
|
{ 3020, 17, 16, 19, 1, -15 }, // 0x6f 'o' U+006F
|
||||||
|
{ 3054, 16, 22, 19, 2, -15 }, // 0x70 'p' U+0070
|
||||||
|
{ 3098, 17, 22, 19, 1, -15 }, // 0x71 'q' U+0071
|
||||||
|
{ 3145, 11, 16, 13, 2, -15 }, // 0x72 'r' U+0072
|
||||||
|
{ 3167, 13, 16, 15, 1, -15 }, // 0x73 's' U+0073
|
||||||
|
{ 3193, 12, 21, 15, 2, -20 }, // 0x74 't' U+0074
|
||||||
|
{ 3225, 14, 16, 18, 2, -15 }, // 0x75 'u' U+0075
|
||||||
|
{ 3253, 17, 16, 17, 0, -15 }, // 0x76 'v' U+0076
|
||||||
|
{ 3287, 24, 16, 24, 0, -15 }, // 0x77 'w' U+0077
|
||||||
|
{ 3335, 17, 16, 17, 0, -15 }, // 0x78 'x' U+0078
|
||||||
|
{ 3369, 17, 22, 17, 0, -15 }, // 0x79 'y' U+0079
|
||||||
|
{ 3416, 14, 16, 16, 1, -15 }, // 0x7a 'z' U+007A
|
||||||
|
{ 3444, 11, 30, 12, 1, -23 }, // 0x7b '{' U+007B
|
||||||
|
{ 3486, 4, 30, 10, 3, -23 }, // 0x7c '|' U+007C
|
||||||
|
{ 3501, 11, 30, 12, 0, -23 }, // 0x7d '}' U+007D
|
||||||
|
{ 3543, 16, 6, 18, 1, -11 }, // 0x7e '~' U+007E
|
||||||
|
{ 3555, 12, 23, 16, 2, -22 }, // 0x7f 'REPLACEMENT CHARACTER *' U+2370
|
||||||
|
{ 3590, 1, 1, 7, 0, 0 }, // 0x80 'NO-BREAK SPACE' U+00A0
|
||||||
|
{ 3591, 5, 22, 9, 2, -15 }, // 0x81 'INVERTED EXCLAMATION MARK' U+00A1
|
||||||
|
{ 3605, 14, 23, 18, 1, -19 }, // 0x82 'CENT SIGN' U+00A2
|
||||||
|
{ 3646, 15, 21, 18, 1, -20 }, // 0x83 'POUND SIGN' U+00A3
|
||||||
|
{ 3686, 17, 16, 18, 0, -18 }, // 0x84 'CURRENCY SIGN' U+00A4
|
||||||
|
{ 3720, 19, 21, 19, 0, -20 }, // 0x85 'YEN SIGN' U+00A5
|
||||||
|
{ 3770, 4, 30, 9, 2, -23 }, // 0x86 'BROKEN BAR' U+00A6
|
||||||
|
{ 3785, 14, 27, 16, 1, -20 }, // 0x87 'SECTION SIGN' U+00A7
|
||||||
|
{ 3833, 12, 5, 17, 2, -23 }, // 0x88 'DIAERESIS' U+00A8
|
||||||
|
{ 3841, 21, 22, 25, 2, -21 }, // 0x89 'COPYRIGHT SIGN' U+00A9
|
||||||
|
{ 3899, 10, 13, 12, 1, -21 }, // 0x8a 'FEMININE ORDINAL INDICATOR' U+00AA
|
||||||
|
{ 3916, 16, 15, 19, 1, -15 }, // 0x8b 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00AB
|
||||||
|
{ 3946, 15, 11, 18, 2, -12 }, // 0x8c 'NOT SIGN' U+00AC
|
||||||
|
{ 3967, 9, 4, 11, 1, -10 }, // 0x8d 'SOFT HYPHEN' U+00AD
|
||||||
|
{ 3972, 21, 22, 25, 2, -21 }, // 0x8e 'REGISTERED SIGN' U+00AE
|
||||||
|
{ 4030, 10, 3, 12, 1, -21 }, // 0x8f 'MACRON' U+00AF
|
||||||
|
{ 4034, 9, 9, 11, 1, -23 }, // 0x90 'DEGREE SIGN' U+00B0
|
||||||
|
{ 4045, 14, 19, 18, 2, -18 }, // 0x91 'PLUS-MINUS SIGN' U+00B1
|
||||||
|
{ 4079, 10, 13, 11, 0, -21 }, // 0x92 'SUPERSCRIPT TWO' U+00B2
|
||||||
|
{ 4096, 9, 13, 11, 1, -21 }, // 0x93 'SUPERSCRIPT THREE' U+00B3
|
||||||
|
{ 4111, 7, 7, 9, 1, -24 }, // 0x94 'ACUTE ACCENT' U+00B4
|
||||||
|
{ 4118, 14, 22, 18, 2, -15 }, // 0x95 'MICRO SIGN' U+00B5
|
||||||
|
{ 4157, 19, 28, 22, 1, -21 }, // 0x96 'PILCROW SIGN' U+00B6
|
||||||
|
{ 4224, 6, 6, 8, 1, -12 }, // 0x97 'MIDDLE DOT' U+00B7
|
||||||
|
{ 4229, 7, 8, 10, 1, 0 }, // 0x98 'CEDILLA' U+00B8
|
||||||
|
{ 4236, 7, 13, 11, 1, -21 }, // 0x99 'SUPERSCRIPT ONE' U+00B9
|
||||||
|
{ 4248, 12, 13, 14, 1, -21 }, // 0x9a 'MASCULINE ORDINAL INDICATOR' U+00BA
|
||||||
|
{ 4268, 16, 15, 19, 1, -15 }, // 0x9b 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00BB
|
||||||
|
{ 4298, 26, 22, 27, 0, -21 }, // 0x9c 'VULGAR FRACTION ONE QUARTER' U+00BC
|
||||||
|
{ 4370, 26, 22, 27, 0, -21 }, // 0x9d 'VULGAR FRACTION ONE HALF' U+00BD
|
||||||
|
{ 4442, 25, 22, 27, 1, -21 }, // 0x9e 'VULGAR FRACTION THREE QUARTERS' U+00BE
|
||||||
|
{ 4511, 12, 22, 14, 1, -15 }, // 0x9f 'INVERTED QUESTION MARK' U+00BF
|
||||||
|
{ 4544, 21, 30, 21, 0, -29 }, // 0xa0 'LATIN CAPITAL LETTER A WITH GRAVE' U+00C0
|
||||||
|
{ 4623, 21, 30, 21, 0, -29 }, // 0xa1 'LATIN CAPITAL LETTER A WITH ACUTE' U+00C1
|
||||||
|
{ 4702, 21, 29, 21, 0, -28 }, // 0xa2 'LATIN CAPITAL LETTER A WITH CIRCUMFLEX' U+00C2
|
||||||
|
{ 4779, 21, 28, 21, 0, -27 }, // 0xa3 'LATIN CAPITAL LETTER A WITH TILDE' U+00C3
|
||||||
|
{ 4853, 21, 29, 21, 0, -28 }, // 0xa4 'LATIN CAPITAL LETTER A WITH DIAERESIS' U+00C4
|
||||||
|
{ 4930, 21, 27, 21, 0, -26 }, // 0xa5 'LATIN CAPITAL LETTER A WITH RING ABOVE' U+00C5
|
||||||
|
{ 5001, 30, 21, 31, 0, -20 }, // 0xa6 'LATIN CAPITAL LETTER AE' U+00C6
|
||||||
|
{ 5080, 17, 28, 20, 2, -20 }, // 0xa7 'LATIN CAPITAL LETTER C WITH CEDILLA' U+00C7
|
||||||
|
{ 5140, 16, 30, 19, 2, -29 }, // 0xa8 'LATIN CAPITAL LETTER E WITH GRAVE' U+00C8
|
||||||
|
{ 5200, 16, 30, 19, 2, -29 }, // 0xa9 'LATIN CAPITAL LETTER E WITH ACUTE' U+00C9
|
||||||
|
{ 5260, 16, 29, 19, 2, -28 }, // 0xaa 'LATIN CAPITAL LETTER E WITH CIRCUMFLEX' U+00CA
|
||||||
|
{ 5318, 16, 29, 19, 2, -28 }, // 0xab 'LATIN CAPITAL LETTER E WITH DIAERESIS' U+00CB
|
||||||
|
{ 5376, 7, 30, 9, 1, -29 }, // 0xac 'LATIN CAPITAL LETTER I WITH GRAVE' U+00CC
|
||||||
|
{ 5403, 7, 30, 9, 1, -29 }, // 0xad 'LATIN CAPITAL LETTER I WITH ACUTE' U+00CD
|
||||||
|
{ 5430, 9, 29, 9, 0, -28 }, // 0xae 'LATIN CAPITAL LETTER I WITH CIRCUMFLEX' U+00CE
|
||||||
|
{ 5463, 12, 29, 9, -1, -28 }, // 0xaf 'LATIN CAPITAL LETTER I WITH DIAERESIS' U+00CF
|
||||||
|
{ 5507, 22, 21, 23, -1, -20 }, // 0xb0 'LATIN CAPITAL LETTER ETH' U+00D0
|
||||||
|
{ 5565, 19, 28, 23, 2, -27 }, // 0xb1 'LATIN CAPITAL LETTER N WITH TILDE' U+00D1
|
||||||
|
{ 5632, 20, 30, 24, 2, -29 }, // 0xb2 'LATIN CAPITAL LETTER O WITH GRAVE' U+00D2
|
||||||
|
{ 5707, 20, 30, 24, 2, -29 }, // 0xb3 'LATIN CAPITAL LETTER O WITH ACUTE' U+00D3
|
||||||
|
{ 5782, 20, 29, 24, 2, -28 }, // 0xb4 'LATIN CAPITAL LETTER O WITH CIRCUMFLEX' U+00D4
|
||||||
|
{ 5855, 20, 28, 24, 2, -27 }, // 0xb5 'LATIN CAPITAL LETTER O WITH TILDE' U+00D5
|
||||||
|
{ 5925, 20, 29, 24, 2, -28 }, // 0xb6 'LATIN CAPITAL LETTER O WITH DIAERESIS' U+00D6
|
||||||
|
{ 5998, 14, 14, 18, 2, -15 }, // 0xb7 'MULTIPLICATION SIGN' U+00D7
|
||||||
|
{ 6023, 20, 23, 24, 2, -21 }, // 0xb8 'LATIN CAPITAL LETTER O WITH STROKE' U+00D8
|
||||||
|
{ 6081, 18, 30, 22, 2, -29 }, // 0xb9 'LATIN CAPITAL LETTER U WITH GRAVE' U+00D9
|
||||||
|
{ 6149, 18, 30, 22, 2, -29 }, // 0xba 'LATIN CAPITAL LETTER U WITH ACUTE' U+00DA
|
||||||
|
{ 6217, 18, 29, 22, 2, -28 }, // 0xbb 'LATIN CAPITAL LETTER U WITH CIRCUMFLEX' U+00DB
|
||||||
|
{ 6283, 18, 29, 22, 2, -28 }, // 0xbc 'LATIN CAPITAL LETTER U WITH DIAERESIS' U+00DC
|
||||||
|
{ 6349, 21, 30, 21, 0, -29 }, // 0xbd 'LATIN CAPITAL LETTER Y WITH ACUTE' U+00DD
|
||||||
|
{ 6428, 17, 21, 20, 2, -20 }, // 0xbe 'LATIN CAPITAL LETTER THORN' U+00DE
|
||||||
|
{ 6473, 17, 24, 20, 2, -23 }, // 0xbf 'LATIN SMALL LETTER SHARP S' U+00DF
|
||||||
|
{ 6524, 14, 25, 17, 1, -24 }, // 0xc0 'LATIN SMALL LETTER A WITH GRAVE' U+00E0
|
||||||
|
{ 6568, 14, 25, 17, 1, -24 }, // 0xc1 'LATIN SMALL LETTER A WITH ACUTE' U+00E1
|
||||||
|
{ 6612, 14, 24, 17, 1, -23 }, // 0xc2 'LATIN SMALL LETTER A WITH CIRCUMFLEX' U+00E2
|
||||||
|
{ 6654, 14, 23, 17, 1, -22 }, // 0xc3 'LATIN SMALL LETTER A WITH TILDE' U+00E3
|
||||||
|
{ 6695, 14, 24, 17, 1, -23 }, // 0xc4 'LATIN SMALL LETTER A WITH DIAERESIS' U+00E4
|
||||||
|
{ 6737, 14, 25, 17, 1, -24 }, // 0xc5 'LATIN SMALL LETTER A WITH RING ABOVE' U+00E5
|
||||||
|
{ 6781, 25, 16, 27, 1, -15 }, // 0xc6 'LATIN SMALL LETTER AE' U+00E6
|
||||||
|
{ 6831, 14, 22, 16, 1, -15 }, // 0xc7 'LATIN SMALL LETTER C WITH CEDILLA' U+00E7
|
||||||
|
{ 6870, 16, 25, 18, 1, -24 }, // 0xc8 'LATIN SMALL LETTER E WITH GRAVE' U+00E8
|
||||||
|
{ 6920, 16, 25, 18, 1, -24 }, // 0xc9 'LATIN SMALL LETTER E WITH ACUTE' U+00E9
|
||||||
|
{ 6970, 16, 24, 18, 1, -23 }, // 0xca 'LATIN SMALL LETTER E WITH CIRCUMFLEX' U+00EA
|
||||||
|
{ 7018, 16, 24, 18, 1, -23 }, // 0xcb 'LATIN SMALL LETTER E WITH DIAERESIS' U+00EB
|
||||||
|
{ 7066, 7, 25, 9, 1, -24 }, // 0xcc 'LATIN SMALL LETTER I WITH GRAVE' U+00EC
|
||||||
|
{ 7088, 7, 25, 9, 1, -24 }, // 0xcd 'LATIN SMALL LETTER I WITH ACUTE' U+00ED
|
||||||
|
{ 7110, 9, 24, 9, 0, -23 }, // 0xce 'LATIN SMALL LETTER I WITH CIRCUMFLEX' U+00EE
|
||||||
|
{ 7137, 12, 24, 9, -2, -23 }, // 0xcf 'LATIN SMALL LETTER I WITH DIAERESIS' U+00EF
|
||||||
|
{ 7173, 17, 24, 19, 1, -23 }, // 0xd0 'LATIN SMALL LETTER ETH' U+00F0
|
||||||
|
{ 7224, 14, 23, 18, 2, -22 }, // 0xd1 'LATIN SMALL LETTER N WITH TILDE' U+00F1
|
||||||
|
{ 7265, 17, 25, 19, 1, -24 }, // 0xd2 'LATIN SMALL LETTER O WITH GRAVE' U+00F2
|
||||||
|
{ 7319, 17, 25, 19, 1, -24 }, // 0xd3 'LATIN SMALL LETTER O WITH ACUTE' U+00F3
|
||||||
|
{ 7373, 17, 24, 19, 1, -23 }, // 0xd4 'LATIN SMALL LETTER O WITH CIRCUMFLEX' U+00F4
|
||||||
|
{ 7424, 17, 23, 19, 1, -22 }, // 0xd5 'LATIN SMALL LETTER O WITH TILDE' U+00F5
|
||||||
|
{ 7473, 17, 24, 19, 1, -23 }, // 0xd6 'LATIN SMALL LETTER O WITH DIAERESIS' U+00F6
|
||||||
|
{ 7524, 15, 18, 19, 2, -17 }, // 0xd7 'DIVISION SIGN' U+00F7
|
||||||
|
{ 7558, 17, 18, 19, 1, -16 }, // 0xd8 'LATIN SMALL LETTER O WITH STROKE' U+00F8
|
||||||
|
{ 7597, 14, 25, 18, 2, -24 }, // 0xd9 'LATIN SMALL LETTER U WITH GRAVE' U+00F9
|
||||||
|
{ 7641, 14, 25, 18, 2, -24 }, // 0xda 'LATIN SMALL LETTER U WITH ACUTE' U+00FA
|
||||||
|
{ 7685, 14, 24, 18, 2, -23 }, // 0xdb 'LATIN SMALL LETTER U WITH CIRCUMFLEX' U+00FB
|
||||||
|
{ 7727, 14, 24, 18, 2, -23 }, // 0xdc 'LATIN SMALL LETTER U WITH DIAERESIS' U+00FC
|
||||||
|
{ 7769, 17, 31, 17, 0, -24 }, // 0xdd 'LATIN SMALL LETTER Y WITH ACUTE' U+00FD
|
||||||
|
{ 7835, 16, 30, 19, 2, -23 }, // 0xde 'LATIN SMALL LETTER THORN' U+00FE
|
||||||
|
{ 7895, 17, 30, 17, 0, -23 } }; // 0xdf 'LATIN SMALL LETTER Y WITH DIAERESIS' U+000FF
|
||||||
|
|
||||||
|
const GFXfont Ubuntu_Bold16pt8b PROGMEM = {
|
||||||
|
(uint8_t *)Ubuntu_Bold16pt8bBitmaps,
|
||||||
|
(GFXglyph *)Ubuntu_Bold16pt8bGlyphs,
|
||||||
|
0x20, 0xDF, 36 };
|
||||||
|
|
||||||
|
// Approx. 9310 bytes
|
||||||
2955
lib/obp60task/fonts/Ubuntu_Bold32pt8b.h
Normal file
2955
lib/obp60task/fonts/Ubuntu_Bold32pt8b.h
Normal file
File diff suppressed because it is too large
Load Diff
377
lib/obp60task/fonts/Ubuntu_Bold8pt8b.h
Normal file
377
lib/obp60task/fonts/Ubuntu_Bold8pt8b.h
Normal file
@@ -0,0 +1,377 @@
|
|||||||
|
const uint8_t Ubuntu_Bold8pt8bBitmaps[] PROGMEM = {
|
||||||
|
0x00, 0xFF, 0xFC, 0xFC, 0xDE, 0xF7, 0xBD, 0x80, 0x1B, 0x0D, 0x87, 0xDF,
|
||||||
|
0xFF, 0xF9, 0xB3, 0xFF, 0xFF, 0x6C, 0x36, 0x1B, 0x00, 0x18, 0x30, 0xFF,
|
||||||
|
0xFC, 0x38, 0x1C, 0x1E, 0x0E, 0x0C, 0x1F, 0xF7, 0xC3, 0x06, 0x00, 0x78,
|
||||||
|
0x63, 0xF3, 0x0C, 0xCC, 0x33, 0x60, 0xCF, 0xFB, 0xFF, 0xF7, 0xFC, 0xC1,
|
||||||
|
0xB3, 0x0C, 0xCC, 0x33, 0xF1, 0x87, 0x80, 0x3C, 0x1F, 0x86, 0x61, 0x98,
|
||||||
|
0x3C, 0x1E, 0x6C, 0xDB, 0x1C, 0xC7, 0x3F, 0xE7, 0xDC, 0xFF, 0xC0, 0x13,
|
||||||
|
0x66, 0xCC, 0xCC, 0xCC, 0xCC, 0x66, 0x31, 0x8C, 0x66, 0x33, 0x33, 0x33,
|
||||||
|
0x33, 0x66, 0xC8, 0x39, 0xFF, 0xF8, 0x86, 0xDD, 0xD1, 0x00, 0x18, 0x18,
|
||||||
|
0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x6D, 0xEC, 0xFF, 0xC0, 0xFF, 0x80,
|
||||||
|
0x06, 0x1C, 0x30, 0x60, 0xC3, 0x06, 0x0C, 0x30, 0x60, 0xC3, 0x06, 0x0C,
|
||||||
|
0x38, 0x60, 0x38, 0xFB, 0xBE, 0x3C, 0x78, 0xF1, 0xE3, 0xEE, 0xF8, 0xE0,
|
||||||
|
0x1B, 0xFE, 0xB1, 0x8C, 0x63, 0x18, 0xC6, 0x7D, 0xFD, 0x18, 0x30, 0xE3,
|
||||||
|
0x8E, 0x38, 0xE1, 0xFF, 0xF8, 0x7D, 0xFC, 0x18, 0x33, 0xE7, 0x81, 0x83,
|
||||||
|
0x87, 0xFF, 0xE0, 0x06, 0x0E, 0x1E, 0x3E, 0x36, 0x66, 0xE6, 0xFF, 0xFF,
|
||||||
|
0x06, 0x06, 0x7E, 0xFD, 0x83, 0x0F, 0x9F, 0x83, 0x83, 0x07, 0xFB, 0xE0,
|
||||||
|
0x1C, 0x79, 0xC7, 0x0F, 0xDF, 0xF1, 0xE3, 0xC6, 0xF8, 0xE0, 0xFF, 0xFC,
|
||||||
|
0x30, 0xE1, 0x87, 0x0C, 0x18, 0x60, 0xC1, 0x80, 0x3C, 0xFF, 0x1E, 0x3E,
|
||||||
|
0xEF, 0xBF, 0xE3, 0xC7, 0xFD, 0xF0, 0x38, 0xFB, 0x1E, 0x3C, 0x7F, 0xDF,
|
||||||
|
0x87, 0x1C, 0xF1, 0xC0, 0xFF, 0x80, 0x3F, 0xE0, 0x77, 0x70, 0x00, 0x06,
|
||||||
|
0x66, 0xCC, 0x06, 0x3E, 0xF8, 0xC0, 0xF8, 0x3F, 0x06, 0xFF, 0xFF, 0x00,
|
||||||
|
0x00, 0xFF, 0xFF, 0x60, 0x7C, 0x1F, 0x03, 0x1F, 0xFC, 0x60, 0x7D, 0xFC,
|
||||||
|
0x18, 0x30, 0xC3, 0x0C, 0x18, 0x00, 0x70, 0xE1, 0xC0, 0x0F, 0xC0, 0x7F,
|
||||||
|
0xC3, 0x83, 0x98, 0x06, 0xE7, 0xCF, 0x3F, 0x3D, 0x8C, 0xF6, 0x33, 0xD8,
|
||||||
|
0xCF, 0xBF, 0xE6, 0x7F, 0x1E, 0x00, 0x3F, 0xC0, 0x3F, 0x00, 0x0E, 0x01,
|
||||||
|
0xC0, 0x7C, 0x0D, 0x83, 0xB8, 0x63, 0x0C, 0x63, 0xFE, 0x7F, 0xCC, 0x1B,
|
||||||
|
0x01, 0x80, 0xFC, 0x7F, 0xB0, 0xD8, 0x6F, 0xE7, 0xFB, 0x07, 0x83, 0xC3,
|
||||||
|
0xFF, 0xBF, 0x80, 0x1F, 0x1F, 0xD8, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80,
|
||||||
|
0x60, 0x3F, 0xC7, 0xC0, 0xFE, 0x3F, 0xCC, 0x3B, 0x07, 0xC0, 0xF0, 0x3C,
|
||||||
|
0x0F, 0x07, 0xC3, 0xBF, 0xCF, 0xE0, 0xFF, 0xFF, 0xC0, 0xC0, 0xFE, 0xFE,
|
||||||
|
0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0,
|
||||||
|
0xC0, 0xC0, 0xC0, 0xC0, 0x1F, 0x1F, 0xD8, 0x18, 0x0C, 0x06, 0x0F, 0x07,
|
||||||
|
0x83, 0x71, 0xBF, 0xC7, 0xE0, 0xC1, 0xE0, 0xF0, 0x78, 0x3F, 0xFF, 0xFF,
|
||||||
|
0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x60, 0xFF, 0xFF, 0xFC, 0x06, 0x0C, 0x18,
|
||||||
|
0x30, 0x60, 0xC1, 0x83, 0x07, 0xF9, 0xE0, 0xC1, 0xB0, 0xCC, 0x63, 0x30,
|
||||||
|
0xF8, 0x3C, 0x0D, 0x83, 0x30, 0xC6, 0x30, 0xCC, 0x18, 0xC0, 0xC0, 0xC0,
|
||||||
|
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0x60, 0x33, 0x83, 0x9C,
|
||||||
|
0x1C, 0xF1, 0xED, 0x8D, 0xEE, 0xEF, 0x36, 0x79, 0xF3, 0xC7, 0x1E, 0x38,
|
||||||
|
0xF0, 0x06, 0xC0, 0xF8, 0x3F, 0x0F, 0xE3, 0xDC, 0xF3, 0xBC, 0x7F, 0x0F,
|
||||||
|
0xC1, 0xF0, 0x7C, 0x0C, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80,
|
||||||
|
0xF0, 0x1F, 0x07, 0x71, 0xCF, 0xF8, 0x7C, 0x00, 0xFC, 0xFE, 0xC3, 0xC3,
|
||||||
|
0xC3, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0x1F, 0x07, 0xF1, 0xC7, 0x70,
|
||||||
|
0x7C, 0x07, 0x80, 0xF0, 0x1F, 0x07, 0x71, 0xCF, 0xF0, 0xF8, 0x07, 0x00,
|
||||||
|
0x7C, 0x07, 0x80, 0xFC, 0x7F, 0x30, 0xD8, 0x6C, 0x37, 0xF3, 0xE1, 0x98,
|
||||||
|
0xC6, 0x63, 0xB0, 0xE0, 0x3D, 0xFF, 0x06, 0x0F, 0x0F, 0x87, 0x83, 0x07,
|
||||||
|
0xFD, 0xF0, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
||||||
|
0x18, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xE3, 0xBF,
|
||||||
|
0x8F, 0x80, 0xC0, 0x6C, 0x19, 0x83, 0x38, 0xE3, 0x18, 0x63, 0x06, 0xC0,
|
||||||
|
0xD8, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0xC0, 0x07, 0x87, 0x0D, 0x8E, 0x33,
|
||||||
|
0x1C, 0x66, 0x6C, 0xC6, 0xDB, 0x0D, 0xB6, 0x1B, 0x6C, 0x1C, 0x70, 0x38,
|
||||||
|
0xE0, 0x71, 0xC0, 0xE0, 0xEC, 0x18, 0xC6, 0x0D, 0x80, 0xE0, 0x1C, 0x03,
|
||||||
|
0x80, 0xD8, 0x31, 0x8C, 0x1B, 0x83, 0x80, 0xC0, 0xD8, 0x67, 0x38, 0xCC,
|
||||||
|
0x1E, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0xFF, 0xFF, 0x06,
|
||||||
|
0x0C, 0x1C, 0x18, 0x30, 0x70, 0x60, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C, 0x63,
|
||||||
|
0x18, 0xC6, 0x31, 0x8C, 0x63, 0xFF, 0xC1, 0xC1, 0x83, 0x06, 0x06, 0x0C,
|
||||||
|
0x18, 0x18, 0x30, 0x60, 0x60, 0xC1, 0x83, 0x83, 0xFF, 0xC6, 0x31, 0x8C,
|
||||||
|
0x63, 0x18, 0xC6, 0x31, 0x8F, 0xFF, 0x08, 0x0E, 0x0F, 0x86, 0xC7, 0x77,
|
||||||
|
0x1D, 0x04, 0xFF, 0xFF, 0x4E, 0x72, 0x7C, 0xFC, 0x1B, 0xFF, 0xF8, 0xFF,
|
||||||
|
0xBF, 0xC1, 0x83, 0x06, 0x0F, 0x9F, 0xB3, 0xE3, 0xC7, 0x9F, 0xF7, 0xC0,
|
||||||
|
0x3D, 0xFE, 0x30, 0xC3, 0x87, 0xCF, 0x06, 0x0C, 0x18, 0x33, 0xEF, 0xF9,
|
||||||
|
0xE3, 0xC7, 0xCD, 0xF9, 0xF0, 0x38, 0xFB, 0x1F, 0xFF, 0xF8, 0x1F, 0x1E,
|
||||||
|
0x7F, 0xF1, 0x8F, 0xFF, 0x18, 0xC6, 0x31, 0x80, 0x3E, 0xFF, 0x9E, 0x3C,
|
||||||
|
0x7C, 0xDF, 0x9F, 0x06, 0xFB, 0xE0, 0xC1, 0x83, 0x06, 0x0F, 0xDF, 0xF1,
|
||||||
|
0xE3, 0xC7, 0x8F, 0x1E, 0x30, 0xFC, 0xFF, 0xFF, 0x33, 0x30, 0x33, 0x33,
|
||||||
|
0x33, 0x33, 0x3F, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC6, 0xCC, 0xD8, 0xF0,
|
||||||
|
0xD8, 0xCC, 0xC6, 0xC7, 0xDB, 0x6D, 0xB6, 0xDB, 0xB0, 0xFD, 0xEF, 0xFF,
|
||||||
|
0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xFD, 0xFF, 0x1E,
|
||||||
|
0x3C, 0x78, 0xF1, 0xE3, 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C,
|
||||||
|
0xF9, 0xFB, 0x3E, 0x3C, 0x79, 0xFF, 0x7C, 0xC1, 0x83, 0x00, 0x3E, 0xFF,
|
||||||
|
0x9E, 0x3C, 0x7C, 0xDF, 0xBF, 0x06, 0x0C, 0x18, 0xFF, 0xF1, 0x8C, 0x63,
|
||||||
|
0x18, 0x7F, 0xEC, 0x3E, 0x7C, 0x3F, 0xFE, 0xC6, 0x3F, 0xFC, 0x63, 0x18,
|
||||||
|
0xFB, 0xC0, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xFF, 0xBF, 0xC1, 0xB1, 0x98,
|
||||||
|
0xCE, 0xE3, 0x61, 0xF0, 0x70, 0x38, 0xC6, 0x79, 0xCD, 0xBB, 0x35, 0x66,
|
||||||
|
0xAC, 0x77, 0x0E, 0xE1, 0x8C, 0xE3, 0xBB, 0x8D, 0x83, 0x81, 0xC1, 0xB1,
|
||||||
|
0xDD, 0xC7, 0xE3, 0xB1, 0x98, 0xCE, 0xE3, 0x61, 0xF0, 0x70, 0x38, 0x18,
|
||||||
|
0x7C, 0x3C, 0x00, 0xFF, 0xF1, 0x8E, 0x71, 0x8F, 0xFF, 0x3B, 0xD8, 0xC6,
|
||||||
|
0x31, 0x98, 0xC3, 0x18, 0xC6, 0x31, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7,
|
||||||
|
0x8C, 0x63, 0x18, 0xC3, 0x19, 0x8C, 0x63, 0x1B, 0xDC, 0x73, 0xFF, 0xCE,
|
||||||
|
0xFE, 0x18, 0x61, 0x86, 0x18, 0x61, 0x86, 0x18, 0x7F, 0x00, 0xFC, 0xFF,
|
||||||
|
0xFC, 0x18, 0x63, 0xDF, 0xE3, 0x0C, 0x30, 0x7C, 0xF1, 0x86, 0x1F, 0x3F,
|
||||||
|
0x70, 0x60, 0x60, 0xFE, 0xFE, 0x60, 0x60, 0x7F, 0x7F, 0x42, 0xFF, 0x7E,
|
||||||
|
0x66, 0x66, 0x7E, 0xFF, 0x42, 0xC3, 0x66, 0x66, 0x3C, 0x3C, 0x7E, 0x7E,
|
||||||
|
0x18, 0x7E, 0x7E, 0x18, 0xFF, 0xF0, 0x0F, 0xFF, 0x7F, 0xFC, 0x38, 0x7B,
|
||||||
|
0xFC, 0xF3, 0xFD, 0xE1, 0xC3, 0xFF, 0xE0, 0xDE, 0xC0, 0x1F, 0x07, 0xF1,
|
||||||
|
0xC7, 0x77, 0x7D, 0xE7, 0xB0, 0xF7, 0x9F, 0x77, 0x71, 0xC7, 0xF0, 0x7C,
|
||||||
|
0x00, 0x70, 0xDF, 0xFD, 0xBC, 0x11, 0x1D, 0xDD, 0xDD, 0xC7, 0x71, 0xDC,
|
||||||
|
0x44, 0xFF, 0xFC, 0x18, 0x30, 0x60, 0xC0, 0xFF, 0xC0, 0x1F, 0x07, 0xF1,
|
||||||
|
0xC7, 0x7F, 0x7D, 0xB7, 0xBE, 0xF6, 0xDF, 0xDF, 0x71, 0xC7, 0xF0, 0x7C,
|
||||||
|
0x00, 0xFF, 0xC0, 0x7B, 0xFC, 0xF3, 0xFD, 0xE0, 0x18, 0x18, 0x18, 0xFF,
|
||||||
|
0xFF, 0x18, 0x18, 0x18, 0x00, 0xFF, 0xFF, 0xF0, 0xCE, 0xEE, 0x7C, 0xF8,
|
||||||
|
0xDC, 0x31, 0x8F, 0xC0, 0x27, 0xE4, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xFF,
|
||||||
|
0xFF, 0xC1, 0x83, 0x00, 0x7F, 0xFF, 0xFE, 0x7F, 0x3F, 0x9F, 0xCC, 0xE6,
|
||||||
|
0x33, 0x19, 0x8C, 0xC6, 0x63, 0x31, 0x98, 0xCC, 0xFF, 0x80, 0x47, 0xA0,
|
||||||
|
0x7F, 0x33, 0x33, 0x7B, 0x3C, 0xF3, 0xCD, 0xE0, 0x44, 0x77, 0x1D, 0xC7,
|
||||||
|
0x77, 0x77, 0x71, 0x10, 0x70, 0xC7, 0x8C, 0x0C, 0x60, 0x66, 0x03, 0x30,
|
||||||
|
0x1B, 0x38, 0x19, 0xC1, 0x9E, 0x0D, 0xB0, 0xCF, 0xC6, 0x0C, 0x71, 0x8F,
|
||||||
|
0x30, 0x33, 0x03, 0x60, 0x36, 0x03, 0xDE, 0x0C, 0x31, 0x87, 0x18, 0xE3,
|
||||||
|
0x1C, 0x31, 0xF0, 0xF8, 0x60, 0x63, 0x07, 0x0C, 0x06, 0x60, 0x19, 0x80,
|
||||||
|
0x6C, 0xEF, 0x33, 0x81, 0x9E, 0x06, 0xD8, 0x33, 0xF0, 0xC1, 0x80, 0x38,
|
||||||
|
0x70, 0xE0, 0x01, 0x87, 0x1C, 0x60, 0xC1, 0xFD, 0xF0, 0x08, 0x03, 0x80,
|
||||||
|
0x38, 0x02, 0x00, 0x00, 0x1C, 0x03, 0x80, 0xF8, 0x1B, 0x07, 0x70, 0xC6,
|
||||||
|
0x18, 0xC7, 0xFC, 0xFF, 0x98, 0x36, 0x03, 0x04, 0x01, 0xC0, 0x70, 0x04,
|
||||||
|
0x00, 0x00, 0x1C, 0x03, 0x80, 0xF8, 0x1B, 0x07, 0x70, 0xC6, 0x18, 0xC7,
|
||||||
|
0xFC, 0xFF, 0x98, 0x36, 0x03, 0x04, 0x01, 0xC0, 0x6C, 0x00, 0x00, 0xE0,
|
||||||
|
0x1C, 0x07, 0xC0, 0xD8, 0x3B, 0x86, 0x30, 0xC6, 0x3F, 0xE7, 0xFC, 0xC1,
|
||||||
|
0xB0, 0x18, 0x0C, 0x83, 0xF0, 0x4C, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x80,
|
||||||
|
0xF8, 0x1B, 0x07, 0x70, 0xC6, 0x18, 0xC7, 0xFC, 0xFF, 0x98, 0x36, 0x03,
|
||||||
|
0x1B, 0x03, 0x60, 0x00, 0x00, 0x00, 0xE0, 0x1C, 0x07, 0xC0, 0xD8, 0x3B,
|
||||||
|
0x86, 0x30, 0xC6, 0x3F, 0xE7, 0xFC, 0xC1, 0xB0, 0x18, 0x0E, 0x03, 0x60,
|
||||||
|
0x6C, 0x07, 0x00, 0xE0, 0x1C, 0x06, 0xC0, 0xD8, 0x3B, 0x86, 0x30, 0xC6,
|
||||||
|
0x3F, 0xE7, 0xFC, 0xC1, 0xB0, 0x18, 0x01, 0xFE, 0x07, 0xFC, 0x1F, 0x00,
|
||||||
|
0x36, 0x00, 0xCF, 0xC1, 0x9F, 0x87, 0xF0, 0x1F, 0xE0, 0x30, 0xC0, 0xC1,
|
||||||
|
0xFF, 0x83, 0xF8, 0x1F, 0x1F, 0xD8, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80,
|
||||||
|
0x60, 0x3F, 0xC7, 0xC1, 0x80, 0x60, 0xE0, 0x10, 0x38, 0x1C, 0x08, 0x00,
|
||||||
|
0xFF, 0xFF, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0x08,
|
||||||
|
0x1C, 0x38, 0x10, 0x00, 0xFF, 0xFF, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0,
|
||||||
|
0xC0, 0xFF, 0xFF, 0x10, 0x38, 0x6C, 0x00, 0xFF, 0xFF, 0xC0, 0xC0, 0xFE,
|
||||||
|
0xFE, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0x6C, 0x6C, 0x00, 0x00, 0xFF, 0xFF,
|
||||||
|
0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0x4E, 0x72, 0x06,
|
||||||
|
0x66, 0x66, 0x66, 0x66, 0x66, 0x27, 0xE4, 0x06, 0x66, 0x66, 0x66, 0x66,
|
||||||
|
0x66, 0x23, 0xB6, 0x06, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x80, 0xDE,
|
||||||
|
0xC0, 0x06, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x80, 0x7F, 0x0F, 0xF1,
|
||||||
|
0x87, 0x30, 0x7F, 0x87, 0xF0, 0xD8, 0x1B, 0x07, 0x61, 0xCF, 0xF1, 0xFC,
|
||||||
|
0x00, 0x19, 0x0F, 0xC2, 0x60, 0x00, 0x00, 0x30, 0x3E, 0x0F, 0xC3, 0xF8,
|
||||||
|
0xF7, 0x3C, 0xEF, 0x1F, 0xC3, 0xF0, 0x7C, 0x1F, 0x03, 0x08, 0x03, 0x80,
|
||||||
|
0x38, 0x02, 0x00, 0x00, 0x3E, 0x0F, 0xE3, 0x8E, 0xE0, 0xF8, 0x0F, 0x01,
|
||||||
|
0xE0, 0x3E, 0x0E, 0xE3, 0x9F, 0xF0, 0xF8, 0x02, 0x00, 0xE0, 0x38, 0x02,
|
||||||
|
0x00, 0x00, 0x3E, 0x0F, 0xE3, 0x8E, 0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3E,
|
||||||
|
0x0E, 0xE3, 0x9F, 0xF0, 0xF8, 0x04, 0x01, 0xC0, 0x6C, 0x00, 0x01, 0xF0,
|
||||||
|
0x7F, 0x1C, 0x77, 0x07, 0xC0, 0x78, 0x0F, 0x01, 0xF0, 0x77, 0x1C, 0xFF,
|
||||||
|
0x87, 0xC0, 0x0C, 0x83, 0xF0, 0x4C, 0x00, 0x00, 0x00, 0x3E, 0x0F, 0xE3,
|
||||||
|
0x8E, 0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3E, 0x0E, 0xE3, 0x9F, 0xF0, 0xF8,
|
||||||
|
0x1B, 0x03, 0x60, 0x00, 0x00, 0x01, 0xF0, 0x7F, 0x1C, 0x77, 0x07, 0xC0,
|
||||||
|
0x78, 0x0F, 0x01, 0xF0, 0x77, 0x1C, 0xFF, 0x87, 0xC0, 0x45, 0xDD, 0xF1,
|
||||||
|
0xC7, 0xDD, 0xD1, 0x00, 0x1F, 0xE7, 0xF9, 0x87, 0x61, 0xFC, 0x67, 0x9C,
|
||||||
|
0xF3, 0x1F, 0xC3, 0x70, 0xCF, 0xFB, 0x7C, 0x00, 0x00, 0x10, 0x1C, 0x07,
|
||||||
|
0x01, 0x00, 0x06, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1F,
|
||||||
|
0x1D, 0xFC, 0x7C, 0x04, 0x07, 0x07, 0x01, 0x00, 0x06, 0x0F, 0x07, 0x83,
|
||||||
|
0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1F, 0x1D, 0xFC, 0x7C, 0x08, 0x0E, 0x0D,
|
||||||
|
0x80, 0x0C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3E, 0x3B,
|
||||||
|
0xF8, 0xF8, 0x36, 0x1B, 0x00, 0x00, 0x0C, 0x1E, 0x0F, 0x07, 0x83, 0xC1,
|
||||||
|
0xE0, 0xF0, 0x78, 0x3E, 0x3B, 0xF8, 0xF8, 0x04, 0x03, 0x81, 0xC0, 0x20,
|
||||||
|
0x00, 0x30, 0x36, 0x19, 0xCE, 0x33, 0x07, 0x81, 0xE0, 0x30, 0x0C, 0x03,
|
||||||
|
0x00, 0xC0, 0x30, 0xC0, 0xC0, 0xFC, 0xFE, 0xC3, 0xC3, 0xC3, 0xFE, 0xFC,
|
||||||
|
0xC0, 0xC0, 0x3E, 0x3F, 0xB8, 0xD8, 0x6C, 0x66, 0x63, 0x39, 0x8E, 0xC1,
|
||||||
|
0xE0, 0xF3, 0xFB, 0xE0, 0x20, 0xE0, 0xE0, 0x80, 0x0F, 0x9F, 0x83, 0x7F,
|
||||||
|
0xFF, 0x1F, 0xF7, 0xE0, 0x08, 0x38, 0xE0, 0x80, 0x0F, 0x9F, 0x83, 0x7F,
|
||||||
|
0xFF, 0x1F, 0xF7, 0xE0, 0x10, 0x71, 0xB0, 0x07, 0xCF, 0xC1, 0xBF, 0xFF,
|
||||||
|
0x8F, 0xFB, 0xF0, 0x32, 0xFD, 0x30, 0x00, 0x0F, 0x9F, 0x83, 0x7F, 0xFF,
|
||||||
|
0x1F, 0xF7, 0xE0, 0x6C, 0xD8, 0x00, 0x07, 0xCF, 0xC1, 0xBF, 0xFF, 0x8F,
|
||||||
|
0xFB, 0xF0, 0x38, 0xD9, 0xB1, 0xC0, 0x0F, 0x9F, 0x83, 0x7F, 0xFF, 0x1F,
|
||||||
|
0xF7, 0xE0, 0x7D, 0xC7, 0xFE, 0x06, 0x37, 0xFF, 0xFF, 0xFC, 0x60, 0xFF,
|
||||||
|
0xE7, 0xDF, 0x3E, 0xFF, 0x86, 0x0C, 0x1C, 0x1F, 0x9F, 0x1C, 0x18, 0xE0,
|
||||||
|
0x20, 0xE0, 0xE0, 0x80, 0x07, 0x1F, 0x63, 0xFF, 0xFF, 0x03, 0xE3, 0xC0,
|
||||||
|
0x08, 0x38, 0xE0, 0x80, 0x07, 0x1F, 0x63, 0xFF, 0xFF, 0x03, 0xE3, 0xC0,
|
||||||
|
0x10, 0x71, 0xB0, 0x03, 0x8F, 0xB1, 0xFF, 0xFF, 0x81, 0xF1, 0xE0, 0x6C,
|
||||||
|
0xD8, 0x00, 0x03, 0x8F, 0xB1, 0xFF, 0xFF, 0x81, 0xF1, 0xE0, 0x4E, 0x72,
|
||||||
|
0x06, 0x66, 0x66, 0x66, 0x60, 0x27, 0xE4, 0x06, 0x66, 0x66, 0x66, 0x60,
|
||||||
|
0x23, 0xB6, 0x06, 0x31, 0x8C, 0x63, 0x18, 0xC0, 0xDE, 0xC0, 0x03, 0x18,
|
||||||
|
0xC6, 0x31, 0x8C, 0x60, 0x18, 0x1F, 0x1E, 0x06, 0x03, 0x3F, 0x7F, 0xC3,
|
||||||
|
0xC3, 0xC7, 0x7E, 0x3C, 0x65, 0xFA, 0x60, 0x00, 0x1F, 0xBF, 0xE3, 0xC7,
|
||||||
|
0x8F, 0x1E, 0x3C, 0x60, 0x10, 0x38, 0x1C, 0x08, 0x00, 0x3C, 0x7E, 0xE7,
|
||||||
|
0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x08, 0x1C, 0x38, 0x10, 0x00, 0x3C, 0x7E,
|
||||||
|
0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x10, 0x38, 0x6C, 0x00, 0x3C, 0x7E,
|
||||||
|
0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x32, 0x7E, 0x4C, 0x00, 0x00, 0x3C,
|
||||||
|
0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x6C, 0x6C, 0x00, 0x00, 0x3C,
|
||||||
|
0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x38, 0x70, 0xE0, 0x0F, 0xFF,
|
||||||
|
0xC0, 0x1C, 0x38, 0x70, 0x3F, 0x7E, 0xEF, 0xCB, 0xD3, 0xF7, 0x7E, 0xFC,
|
||||||
|
0x20, 0xE0, 0xE0, 0x80, 0x18, 0xF1, 0xE3, 0xC7, 0x8F, 0x1F, 0xF7, 0xE0,
|
||||||
|
0x08, 0x38, 0xE0, 0x80, 0x18, 0xF1, 0xE3, 0xC7, 0x8F, 0x1F, 0xF7, 0xE0,
|
||||||
|
0x10, 0x71, 0xB0, 0x0C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0xFB, 0xF0, 0x6C,
|
||||||
|
0xD8, 0x00, 0x0C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0xFB, 0xF0, 0x04, 0x07,
|
||||||
|
0x07, 0x01, 0x00, 0x07, 0x1D, 0x8C, 0xC6, 0x77, 0x1B, 0x0F, 0x83, 0x81,
|
||||||
|
0xC0, 0xC3, 0xE1, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0xFE, 0xC7, 0xC3,
|
||||||
|
0xC3, 0xC7, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0, 0x36, 0x1B, 0x00, 0x00, 0x0E,
|
||||||
|
0x3B, 0x19, 0x8C, 0xEE, 0x36, 0x1F, 0x07, 0x03, 0x81, 0x87, 0xC3, 0xC0 };
|
||||||
|
|
||||||
|
const GFXglyph Ubuntu_Bold8pt8bGlyphs[] PROGMEM = {
|
||||||
|
{ 0, 1, 1, 4, 0, 0 }, // 0x20 ' ' U+0020
|
||||||
|
{ 1, 2, 11, 4, 1, -10 }, // 0x21 '!' U+0021
|
||||||
|
{ 4, 5, 5, 7, 1, -11 }, // 0x22 '"' U+0022
|
||||||
|
{ 8, 9, 11, 11, 1, -10 }, // 0x23 '#' U+0023
|
||||||
|
{ 21, 7, 15, 9, 1, -12 }, // 0x24 '$' U+0024
|
||||||
|
{ 35, 14, 11, 16, 1, -10 }, // 0x25 '%' U+0025
|
||||||
|
{ 55, 10, 11, 11, 1, -10 }, // 0x26 '&' U+0026
|
||||||
|
{ 69, 2, 5, 4, 1, -11 }, // 0x27 ''' U+0027
|
||||||
|
{ 71, 4, 16, 6, 1, -12 }, // 0x28 '(' U+0028
|
||||||
|
{ 79, 4, 16, 6, 1, -12 }, // 0x29 ')' U+0029
|
||||||
|
{ 87, 7, 7, 8, 1, -10 }, // 0x2a '*' U+002A
|
||||||
|
{ 94, 8, 8, 10, 1, -8 }, // 0x2b '+' U+002B
|
||||||
|
{ 102, 3, 5, 4, 0, -1 }, // 0x2c ',' U+002C
|
||||||
|
{ 104, 5, 2, 7, 1, -5 }, // 0x2d '-' U+002D
|
||||||
|
{ 106, 3, 3, 5, 1, -2 }, // 0x2e '.' U+002E
|
||||||
|
{ 108, 7, 16, 7, 0, -12 }, // 0x2f '/' U+002F
|
||||||
|
{ 122, 7, 11, 9, 1, -10 }, // 0x30 '0' U+0030
|
||||||
|
{ 132, 5, 11, 9, 1, -10 }, // 0x31 '1' U+0031
|
||||||
|
{ 139, 7, 11, 9, 1, -10 }, // 0x32 '2' U+0032
|
||||||
|
{ 149, 7, 11, 9, 1, -10 }, // 0x33 '3' U+0033
|
||||||
|
{ 159, 8, 11, 9, 1, -10 }, // 0x34 '4' U+0034
|
||||||
|
{ 170, 7, 11, 9, 1, -10 }, // 0x35 '5' U+0035
|
||||||
|
{ 180, 7, 11, 9, 1, -10 }, // 0x36 '6' U+0036
|
||||||
|
{ 190, 7, 11, 9, 1, -10 }, // 0x37 '7' U+0037
|
||||||
|
{ 200, 7, 11, 9, 1, -10 }, // 0x38 '8' U+0038
|
||||||
|
{ 210, 7, 11, 9, 1, -10 }, // 0x39 '9' U+0039
|
||||||
|
{ 220, 3, 9, 5, 1, -8 }, // 0x3a ':' U+003A
|
||||||
|
{ 224, 4, 12, 5, 0, -8 }, // 0x3b ';' U+003B
|
||||||
|
{ 230, 8, 7, 9, 1, -7 }, // 0x3c '<' U+003C
|
||||||
|
{ 237, 8, 6, 10, 1, -7 }, // 0x3d '=' U+003D
|
||||||
|
{ 243, 8, 7, 9, 0, -7 }, // 0x3e '>' U+003E
|
||||||
|
{ 250, 7, 12, 7, 0, -11 }, // 0x3f '?' U+003F
|
||||||
|
{ 261, 14, 14, 16, 1, -10 }, // 0x40 '@' U+0040
|
||||||
|
{ 286, 11, 11, 11, 0, -10 }, // 0x41 'A' U+0041
|
||||||
|
{ 302, 9, 11, 11, 1, -10 }, // 0x42 'B' U+0042
|
||||||
|
{ 315, 9, 11, 11, 1, -10 }, // 0x43 'C' U+0043
|
||||||
|
{ 328, 10, 11, 12, 1, -10 }, // 0x44 'D' U+0044
|
||||||
|
{ 342, 8, 11, 10, 1, -10 }, // 0x45 'E' U+0045
|
||||||
|
{ 353, 8, 11, 9, 1, -10 }, // 0x46 'F' U+0046
|
||||||
|
{ 364, 9, 11, 11, 1, -10 }, // 0x47 'G' U+0047
|
||||||
|
{ 377, 9, 11, 11, 1, -10 }, // 0x48 'H' U+0048
|
||||||
|
{ 390, 2, 11, 4, 1, -10 }, // 0x49 'I' U+0049
|
||||||
|
{ 393, 7, 11, 8, 0, -10 }, // 0x4a 'J' U+004A
|
||||||
|
{ 403, 10, 11, 11, 1, -10 }, // 0x4b 'K' U+004B
|
||||||
|
{ 417, 8, 11, 9, 1, -10 }, // 0x4c 'L' U+004C
|
||||||
|
{ 428, 13, 11, 15, 1, -10 }, // 0x4d 'M' U+004D
|
||||||
|
{ 446, 10, 11, 12, 1, -10 }, // 0x4e 'N' U+004E
|
||||||
|
{ 460, 11, 11, 13, 1, -10 }, // 0x4f 'O' U+004F
|
||||||
|
{ 476, 8, 11, 10, 1, -10 }, // 0x50 'P' U+0050
|
||||||
|
{ 487, 11, 14, 13, 1, -10 }, // 0x51 'Q' U+0051
|
||||||
|
{ 507, 9, 11, 10, 1, -10 }, // 0x52 'R' U+0052
|
||||||
|
{ 520, 7, 11, 9, 1, -10 }, // 0x53 'S' U+0053
|
||||||
|
{ 530, 8, 11, 8, 0, -10 }, // 0x54 'T' U+0054
|
||||||
|
{ 541, 9, 11, 11, 1, -10 }, // 0x55 'U' U+0055
|
||||||
|
{ 554, 11, 11, 11, 0, -10 }, // 0x56 'V' U+0056
|
||||||
|
{ 570, 15, 11, 15, 0, -10 }, // 0x57 'W' U+0057
|
||||||
|
{ 591, 11, 11, 11, 0, -10 }, // 0x58 'X' U+0058
|
||||||
|
{ 607, 10, 11, 10, 0, -10 }, // 0x59 'Y' U+0059
|
||||||
|
{ 621, 8, 11, 10, 1, -10 }, // 0x5a 'Z' U+005A
|
||||||
|
{ 632, 5, 16, 6, 1, -12 }, // 0x5b '[' U+005B
|
||||||
|
{ 642, 7, 16, 7, 0, -12 }, // 0x5c '\' U+005C
|
||||||
|
{ 656, 5, 16, 6, 0, -12 }, // 0x5d ']' U+005D
|
||||||
|
{ 666, 9, 7, 9, 0, -10 }, // 0x5e '^' U+005E
|
||||||
|
{ 674, 8, 2, 8, 0, 2 }, // 0x5f '_' U+005F
|
||||||
|
{ 676, 4, 4, 5, 1, -12 }, // 0x60 '`' U+0060
|
||||||
|
{ 678, 7, 8, 9, 1, -7 }, // 0x61 'a' U+0061
|
||||||
|
{ 685, 7, 12, 9, 1, -11 }, // 0x62 'b' U+0062
|
||||||
|
{ 696, 6, 8, 8, 1, -7 }, // 0x63 'c' U+0063
|
||||||
|
{ 702, 7, 12, 9, 1, -11 }, // 0x64 'd' U+0064
|
||||||
|
{ 713, 7, 8, 9, 1, -7 }, // 0x65 'e' U+0065
|
||||||
|
{ 720, 5, 12, 6, 1, -11 }, // 0x66 'f' U+0066
|
||||||
|
{ 728, 7, 11, 9, 1, -7 }, // 0x67 'g' U+0067
|
||||||
|
{ 738, 7, 12, 9, 1, -11 }, // 0x68 'h' U+0068
|
||||||
|
{ 749, 2, 12, 4, 1, -11 }, // 0x69 'i' U+0069
|
||||||
|
{ 752, 4, 15, 4, -1, -11 }, // 0x6a 'j' U+006A
|
||||||
|
{ 760, 8, 12, 9, 1, -11 }, // 0x6b 'k' U+006B
|
||||||
|
{ 772, 3, 12, 4, 1, -11 }, // 0x6c 'l' U+006C
|
||||||
|
{ 777, 12, 8, 14, 1, -7 }, // 0x6d 'm' U+006D
|
||||||
|
{ 789, 7, 8, 9, 1, -7 }, // 0x6e 'n' U+006E
|
||||||
|
{ 796, 8, 8, 10, 1, -7 }, // 0x6f 'o' U+006F
|
||||||
|
{ 804, 7, 11, 9, 1, -7 }, // 0x70 'p' U+0070
|
||||||
|
{ 814, 7, 11, 9, 1, -7 }, // 0x71 'q' U+0071
|
||||||
|
{ 824, 5, 8, 6, 1, -7 }, // 0x72 'r' U+0072
|
||||||
|
{ 829, 6, 8, 8, 1, -7 }, // 0x73 's' U+0073
|
||||||
|
{ 835, 5, 10, 7, 1, -9 }, // 0x74 't' U+0074
|
||||||
|
{ 842, 7, 8, 9, 1, -7 }, // 0x75 'u' U+0075
|
||||||
|
{ 849, 9, 8, 9, 0, -7 }, // 0x76 'v' U+0076
|
||||||
|
{ 858, 11, 8, 11, 0, -7 }, // 0x77 'w' U+0077
|
||||||
|
{ 869, 9, 8, 9, 0, -7 }, // 0x78 'x' U+0078
|
||||||
|
{ 878, 9, 11, 9, 0, -7 }, // 0x79 'y' U+0079
|
||||||
|
{ 891, 6, 8, 8, 1, -7 }, // 0x7a 'z' U+007A
|
||||||
|
{ 897, 5, 16, 5, 0, -12 }, // 0x7b '{' U+007B
|
||||||
|
{ 907, 2, 16, 4, 1, -12 }, // 0x7c '|' U+007C
|
||||||
|
{ 911, 5, 16, 5, 0, -12 }, // 0x7d '}' U+007D
|
||||||
|
{ 921, 8, 3, 9, 1, -5 }, // 0x7e '~' U+007E
|
||||||
|
{ 924, 6, 12, 8, 1, -11 }, // 0x7f 'REPLACEMENT CHARACTER *' U+2370
|
||||||
|
{ 933, 1, 1, 4, 0, 0 }, // 0x80 'NO-BREAK SPACE' U+00A0
|
||||||
|
{ 934, 2, 11, 4, 1, -7 }, // 0x81 'INVERTED EXCLAMATION MARK' U+00A1
|
||||||
|
{ 937, 6, 12, 9, 1, -9 }, // 0x82 'CENT SIGN' U+00A2
|
||||||
|
{ 946, 8, 11, 9, 0, -10 }, // 0x83 'POUND SIGN' U+00A3
|
||||||
|
{ 957, 8, 8, 9, 0, -8 }, // 0x84 'CURRENCY SIGN' U+00A4
|
||||||
|
{ 965, 8, 11, 8, 0, -10 }, // 0x85 'YEN SIGN' U+00A5
|
||||||
|
{ 976, 2, 16, 5, 1, -12 }, // 0x86 'BROKEN BAR' U+00A6
|
||||||
|
{ 980, 6, 14, 8, 1, -10 }, // 0x87 'SECTION SIGN' U+00A7
|
||||||
|
{ 991, 5, 2, 9, 2, -11 }, // 0x88 'DIAERESIS' U+00A8
|
||||||
|
{ 993, 11, 11, 13, 1, -10 }, // 0x89 'COPYRIGHT SIGN' U+00A9
|
||||||
|
{ 1009, 5, 6, 6, 0, -10 }, // 0x8a 'FEMININE ORDINAL INDICATOR' U+00AA
|
||||||
|
{ 1013, 9, 7, 10, 0, -7 }, // 0x8b 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00AB
|
||||||
|
{ 1021, 7, 6, 9, 1, -6 }, // 0x8c 'NOT SIGN' U+00AC
|
||||||
|
{ 1027, 5, 2, 7, 1, -5 }, // 0x8d 'SOFT HYPHEN' U+00AD
|
||||||
|
{ 1029, 11, 11, 13, 1, -10 }, // 0x8e 'REGISTERED SIGN' U+00AE
|
||||||
|
{ 1045, 5, 2, 6, 0, -11 }, // 0x8f 'MACRON' U+00AF
|
||||||
|
{ 1047, 6, 6, 6, 0, -12 }, // 0x90 'DEGREE SIGN' U+00B0
|
||||||
|
{ 1052, 8, 11, 10, 1, -10 }, // 0x91 'PLUS-MINUS SIGN' U+00B1
|
||||||
|
{ 1063, 5, 6, 6, 0, -10 }, // 0x92 'SUPERSCRIPT TWO' U+00B2
|
||||||
|
{ 1067, 5, 7, 6, 0, -10 }, // 0x93 'SUPERSCRIPT THREE' U+00B3
|
||||||
|
{ 1072, 4, 4, 5, 0, -12 }, // 0x94 'ACUTE ACCENT' U+00B4
|
||||||
|
{ 1074, 7, 11, 9, 1, -7 }, // 0x95 'MICRO SIGN' U+00B5
|
||||||
|
{ 1084, 9, 14, 11, 1, -10 }, // 0x96 'PILCROW SIGN' U+00B6
|
||||||
|
{ 1100, 3, 3, 5, 1, -5 }, // 0x97 'MIDDLE DOT' U+00B7
|
||||||
|
{ 1102, 3, 4, 5, 1, 1 }, // 0x98 'CEDILLA' U+00B8
|
||||||
|
{ 1104, 4, 6, 6, 1, -10 }, // 0x99 'SUPERSCRIPT ONE' U+00B9
|
||||||
|
{ 1107, 6, 6, 8, 1, -10 }, // 0x9a 'MASCULINE ORDINAL INDICATOR' U+00BA
|
||||||
|
{ 1112, 9, 7, 10, 0, -7 }, // 0x9b 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00BB
|
||||||
|
{ 1120, 13, 11, 14, 1, -10 }, // 0x9c 'VULGAR FRACTION ONE QUARTER' U+00BC
|
||||||
|
{ 1138, 12, 11, 14, 1, -10 }, // 0x9d 'VULGAR FRACTION ONE HALF' U+00BD
|
||||||
|
{ 1155, 14, 11, 14, 0, -10 }, // 0x9e 'VULGAR FRACTION THREE QUARTERS' U+00BE
|
||||||
|
{ 1175, 7, 11, 7, 0, -7 }, // 0x9f 'INVERTED QUESTION MARK' U+00BF
|
||||||
|
{ 1185, 11, 16, 11, 0, -15 }, // 0xa0 'LATIN CAPITAL LETTER A WITH GRAVE' U+00C0
|
||||||
|
{ 1207, 11, 16, 11, 0, -15 }, // 0xa1 'LATIN CAPITAL LETTER A WITH ACUTE' U+00C1
|
||||||
|
{ 1229, 11, 15, 11, 0, -14 }, // 0xa2 'LATIN CAPITAL LETTER A WITH CIRCUMFLEX' U+00C2
|
||||||
|
{ 1250, 11, 16, 11, 0, -15 }, // 0xa3 'LATIN CAPITAL LETTER A WITH TILDE' U+00C3
|
||||||
|
{ 1272, 11, 15, 11, 0, -14 }, // 0xa4 'LATIN CAPITAL LETTER A WITH DIAERESIS' U+00C4
|
||||||
|
{ 1293, 11, 15, 11, 0, -14 }, // 0xa5 'LATIN CAPITAL LETTER A WITH RING ABOVE' U+00C5
|
||||||
|
{ 1314, 15, 11, 16, 0, -10 }, // 0xa6 'LATIN CAPITAL LETTER AE' U+00C6
|
||||||
|
{ 1335, 9, 14, 11, 1, -10 }, // 0xa7 'LATIN CAPITAL LETTER C WITH CEDILLA' U+00C7
|
||||||
|
{ 1351, 8, 16, 10, 1, -15 }, // 0xa8 'LATIN CAPITAL LETTER E WITH GRAVE' U+00C8
|
||||||
|
{ 1367, 8, 16, 10, 1, -15 }, // 0xa9 'LATIN CAPITAL LETTER E WITH ACUTE' U+00C9
|
||||||
|
{ 1383, 8, 15, 10, 1, -14 }, // 0xaa 'LATIN CAPITAL LETTER E WITH CIRCUMFLEX' U+00CA
|
||||||
|
{ 1398, 8, 15, 10, 1, -14 }, // 0xab 'LATIN CAPITAL LETTER E WITH DIAERESIS' U+00CB
|
||||||
|
{ 1413, 4, 16, 4, 0, -15 }, // 0xac 'LATIN CAPITAL LETTER I WITH GRAVE' U+00CC
|
||||||
|
{ 1421, 4, 16, 4, 0, -15 }, // 0xad 'LATIN CAPITAL LETTER I WITH ACUTE' U+00CD
|
||||||
|
{ 1429, 5, 15, 4, 0, -14 }, // 0xae 'LATIN CAPITAL LETTER I WITH CIRCUMFLEX' U+00CE
|
||||||
|
{ 1439, 5, 15, 4, 0, -14 }, // 0xaf 'LATIN CAPITAL LETTER I WITH DIAERESIS' U+00CF
|
||||||
|
{ 1449, 11, 11, 12, 0, -10 }, // 0xb0 'LATIN CAPITAL LETTER ETH' U+00D0
|
||||||
|
{ 1465, 10, 16, 12, 1, -15 }, // 0xb1 'LATIN CAPITAL LETTER N WITH TILDE' U+00D1
|
||||||
|
{ 1485, 11, 16, 13, 1, -15 }, // 0xb2 'LATIN CAPITAL LETTER O WITH GRAVE' U+00D2
|
||||||
|
{ 1507, 11, 16, 13, 1, -15 }, // 0xb3 'LATIN CAPITAL LETTER O WITH ACUTE' U+00D3
|
||||||
|
{ 1529, 11, 15, 13, 1, -14 }, // 0xb4 'LATIN CAPITAL LETTER O WITH CIRCUMFLEX' U+00D4
|
||||||
|
{ 1550, 11, 16, 13, 1, -15 }, // 0xb5 'LATIN CAPITAL LETTER O WITH TILDE' U+00D5
|
||||||
|
{ 1572, 11, 15, 13, 1, -14 }, // 0xb6 'LATIN CAPITAL LETTER O WITH DIAERESIS' U+00D6
|
||||||
|
{ 1593, 7, 7, 9, 1, -7 }, // 0xb7 'MULTIPLICATION SIGN' U+00D7
|
||||||
|
{ 1600, 11, 12, 13, 1, -10 }, // 0xb8 'LATIN CAPITAL LETTER O WITH STROKE' U+00D8
|
||||||
|
{ 1617, 9, 16, 11, 1, -15 }, // 0xb9 'LATIN CAPITAL LETTER U WITH GRAVE' U+00D9
|
||||||
|
{ 1635, 9, 16, 11, 1, -15 }, // 0xba 'LATIN CAPITAL LETTER U WITH ACUTE' U+00DA
|
||||||
|
{ 1653, 9, 15, 11, 1, -14 }, // 0xbb 'LATIN CAPITAL LETTER U WITH CIRCUMFLEX' U+00DB
|
||||||
|
{ 1670, 9, 15, 11, 1, -14 }, // 0xbc 'LATIN CAPITAL LETTER U WITH DIAERESIS' U+00DC
|
||||||
|
{ 1687, 10, 16, 10, 0, -15 }, // 0xbd 'LATIN CAPITAL LETTER Y WITH ACUTE' U+00DD
|
||||||
|
{ 1707, 8, 11, 10, 1, -10 }, // 0xbe 'LATIN CAPITAL LETTER THORN' U+00DE
|
||||||
|
{ 1718, 9, 12, 11, 1, -11 }, // 0xbf 'LATIN SMALL LETTER SHARP S' U+00DF
|
||||||
|
{ 1732, 7, 13, 9, 1, -12 }, // 0xc0 'LATIN SMALL LETTER A WITH GRAVE' U+00E0
|
||||||
|
{ 1744, 7, 13, 9, 1, -12 }, // 0xc1 'LATIN SMALL LETTER A WITH ACUTE' U+00E1
|
||||||
|
{ 1756, 7, 12, 9, 1, -11 }, // 0xc2 'LATIN SMALL LETTER A WITH CIRCUMFLEX' U+00E2
|
||||||
|
{ 1767, 7, 13, 9, 1, -12 }, // 0xc3 'LATIN SMALL LETTER A WITH TILDE' U+00E3
|
||||||
|
{ 1779, 7, 12, 9, 1, -11 }, // 0xc4 'LATIN SMALL LETTER A WITH DIAERESIS' U+00E4
|
||||||
|
{ 1790, 7, 13, 9, 1, -12 }, // 0xc5 'LATIN SMALL LETTER A WITH RING ABOVE' U+00E5
|
||||||
|
{ 1802, 12, 8, 14, 1, -7 }, // 0xc6 'LATIN SMALL LETTER AE' U+00E6
|
||||||
|
{ 1814, 7, 11, 8, 1, -7 }, // 0xc7 'LATIN SMALL LETTER C WITH CEDILLA' U+00E7
|
||||||
|
{ 1824, 7, 13, 9, 1, -12 }, // 0xc8 'LATIN SMALL LETTER E WITH GRAVE' U+00E8
|
||||||
|
{ 1836, 7, 13, 9, 1, -12 }, // 0xc9 'LATIN SMALL LETTER E WITH ACUTE' U+00E9
|
||||||
|
{ 1848, 7, 12, 9, 1, -11 }, // 0xca 'LATIN SMALL LETTER E WITH CIRCUMFLEX' U+00EA
|
||||||
|
{ 1859, 7, 12, 9, 1, -11 }, // 0xcb 'LATIN SMALL LETTER E WITH DIAERESIS' U+00EB
|
||||||
|
{ 1870, 4, 13, 4, 0, -12 }, // 0xcc 'LATIN SMALL LETTER I WITH GRAVE' U+00EC
|
||||||
|
{ 1877, 4, 13, 4, 0, -12 }, // 0xcd 'LATIN SMALL LETTER I WITH ACUTE' U+00ED
|
||||||
|
{ 1884, 5, 12, 4, 0, -11 }, // 0xce 'LATIN SMALL LETTER I WITH CIRCUMFLEX' U+00EE
|
||||||
|
{ 1892, 5, 12, 4, -1, -11 }, // 0xcf 'LATIN SMALL LETTER I WITH DIAERESIS' U+00EF
|
||||||
|
{ 1900, 8, 12, 10, 1, -11 }, // 0xd0 'LATIN SMALL LETTER ETH' U+00F0
|
||||||
|
{ 1912, 7, 13, 9, 1, -12 }, // 0xd1 'LATIN SMALL LETTER N WITH TILDE' U+00F1
|
||||||
|
{ 1924, 8, 13, 10, 1, -12 }, // 0xd2 'LATIN SMALL LETTER O WITH GRAVE' U+00F2
|
||||||
|
{ 1937, 8, 13, 10, 1, -12 }, // 0xd3 'LATIN SMALL LETTER O WITH ACUTE' U+00F3
|
||||||
|
{ 1950, 8, 12, 10, 1, -11 }, // 0xd4 'LATIN SMALL LETTER O WITH CIRCUMFLEX' U+00F4
|
||||||
|
{ 1962, 8, 13, 10, 1, -12 }, // 0xd5 'LATIN SMALL LETTER O WITH TILDE' U+00F5
|
||||||
|
{ 1975, 8, 12, 10, 1, -11 }, // 0xd6 'LATIN SMALL LETTER O WITH DIAERESIS' U+00F6
|
||||||
|
{ 1987, 7, 10, 9, 1, -9 }, // 0xd7 'DIVISION SIGN' U+00F7
|
||||||
|
{ 1996, 8, 8, 10, 1, -7 }, // 0xd8 'LATIN SMALL LETTER O WITH STROKE' U+00F8
|
||||||
|
{ 2004, 7, 13, 9, 1, -12 }, // 0xd9 'LATIN SMALL LETTER U WITH GRAVE' U+00F9
|
||||||
|
{ 2016, 7, 13, 9, 1, -12 }, // 0xda 'LATIN SMALL LETTER U WITH ACUTE' U+00FA
|
||||||
|
{ 2028, 7, 12, 9, 1, -11 }, // 0xdb 'LATIN SMALL LETTER U WITH CIRCUMFLEX' U+00FB
|
||||||
|
{ 2039, 7, 12, 9, 1, -11 }, // 0xdc 'LATIN SMALL LETTER U WITH DIAERESIS' U+00FC
|
||||||
|
{ 2050, 9, 16, 9, 0, -12 }, // 0xdd 'LATIN SMALL LETTER Y WITH ACUTE' U+00FD
|
||||||
|
{ 2068, 8, 15, 10, 1, -11 }, // 0xde 'LATIN SMALL LETTER THORN' U+00FE
|
||||||
|
{ 2083, 9, 15, 9, 0, -11 } }; // 0xdf 'LATIN SMALL LETTER Y WITH DIAERESIS' U+000FF
|
||||||
|
|
||||||
|
const GFXfont Ubuntu_Bold8pt8b PROGMEM = {
|
||||||
|
(uint8_t *)Ubuntu_Bold8pt8bBitmaps,
|
||||||
|
(GFXglyph *)Ubuntu_Bold8pt8bGlyphs,
|
||||||
|
0x20, 0xDF, 18 };
|
||||||
|
|
||||||
|
// Approx. 3451 bytes
|
||||||
@@ -1,131 +1,206 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# A tool to generate that part of config.json that deals with pages and fields.
|
|
||||||
#
|
|
||||||
#Usage: 1. modify this script (e.g.add a page, change number of fields, etc.)
|
|
||||||
# 2. Delete all lines from config.json from the curly backet before "name": "page1type" to o the end of the file (as of today, delete from line 917 to the end of the File)
|
|
||||||
# 3. run ./gen_set.py >> config.json
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
A tool to generate that part of config.json that deals with pages and fields.
|
||||||
|
|
||||||
|
Usage example:
|
||||||
|
|
||||||
|
1. Delete all lines from config.json from the curly backet before
|
||||||
|
"name": "page1type" to the end of the file
|
||||||
|
|
||||||
|
2. run ./gen_set.py -d obp60 -p 10 >> config.json
|
||||||
|
|
||||||
|
TODO Better handling of default pages
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import getopt
|
||||||
|
import re
|
||||||
import json
|
import json
|
||||||
|
|
||||||
# List of all pages and the number of parameters they expect.
|
__version__ = "0.3"
|
||||||
no_of_fields_per_page = {
|
|
||||||
"Wind": 0,
|
|
||||||
"XTETrack": 0,
|
|
||||||
"Battery2": 0,
|
|
||||||
"Battery": 0,
|
|
||||||
"BME280": 0,
|
|
||||||
"Clock": 0,
|
|
||||||
"Compass" : 0,
|
|
||||||
"DST810": 0,
|
|
||||||
"Fluid": 1,
|
|
||||||
"FourValues2": 4,
|
|
||||||
"FourValues": 4,
|
|
||||||
"Generator": 0,
|
|
||||||
"KeelPosition": 0,
|
|
||||||
"OneValue": 1,
|
|
||||||
"RollPitch": 2,
|
|
||||||
"RudderPosition": 0,
|
|
||||||
"SixValues" : 6,
|
|
||||||
"Solar": 0,
|
|
||||||
"ThreeValues": 3,
|
|
||||||
"TwoValues": 2,
|
|
||||||
"Voltage": 0,
|
|
||||||
"WhitePage": 0,
|
|
||||||
"WindRose": 0,
|
|
||||||
"WindRoseFlex": 6,
|
|
||||||
}
|
|
||||||
|
|
||||||
# No changes needed beyond this point
|
def detect_pages(filename):
|
||||||
# max number of pages supported by OBP60
|
# returns a dictionary with page name and the number of gui fields
|
||||||
no_of_pages = 10
|
pagefiles = []
|
||||||
# Default selection for each page
|
with open(filename, 'r') as fh:
|
||||||
default_pages = [
|
pattern = r'extern PageDescription\s*register(Page[^;\s]*)'
|
||||||
"Voltage",
|
for line in fh:
|
||||||
"WindRose",
|
if "extern PageDescription" in line:
|
||||||
"OneValue",
|
match = re.search(pattern, line)
|
||||||
"TwoValues",
|
if match:
|
||||||
"ThreeValues",
|
pagefiles.append(match.group(1))
|
||||||
"FourValues",
|
try:
|
||||||
"FourValues2",
|
pagefiles.remove('PageSystem')
|
||||||
"Clock",
|
except ValueError:
|
||||||
"RollPitch",
|
pass
|
||||||
"Battery2",
|
pagedata = {}
|
||||||
]
|
for pf in pagefiles:
|
||||||
numbers = [
|
filename = pf + ".cpp"
|
||||||
"one",
|
with open(filename, 'r') as fh:
|
||||||
"two",
|
content = fh.read()
|
||||||
"three",
|
pattern = r'PageDescription\s*?register' + pf + r'\s*\(\s*"([^"]+)".*?\n\s*(\d+)'
|
||||||
"four",
|
match = re.search(pattern, content, re.DOTALL)
|
||||||
"five",
|
if match:
|
||||||
"six",
|
pagedata[match.group(1)] = int(match.group(2))
|
||||||
"seven",
|
return pagedata
|
||||||
"eight",
|
|
||||||
"nine",
|
|
||||||
"ten",
|
|
||||||
]
|
|
||||||
pages = sorted(no_of_fields_per_page.keys())
|
|
||||||
max_no_of_fields_per_page = max(no_of_fields_per_page.values())
|
|
||||||
|
|
||||||
output = []
|
def get_default_page(pageno):
|
||||||
|
# Default selection for each page
|
||||||
|
default_pages = (
|
||||||
|
"Voltage",
|
||||||
|
"WindRose",
|
||||||
|
"OneValue",
|
||||||
|
"TwoValues",
|
||||||
|
"ThreeValues",
|
||||||
|
"FourValues",
|
||||||
|
"FourValues2",
|
||||||
|
"Clock",
|
||||||
|
"RollPitch",
|
||||||
|
"Battery2"
|
||||||
|
)
|
||||||
|
if pageno > len(default_pages):
|
||||||
|
return "OneValue"
|
||||||
|
return default_pages[pageno - 1]
|
||||||
|
|
||||||
for page_no in range(1, no_of_pages + 1):
|
def number_to_text(number):
|
||||||
page_data = {
|
if number < 0 or number > 99:
|
||||||
"name": f"page{page_no}type",
|
raise ValueError("Only numbers from 0 to 99 are allowed.")
|
||||||
"label": "Type",
|
numbers = ("zero", "one", "two", "three", "four", "five", "six", "seven",
|
||||||
"type": "list",
|
"eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
|
||||||
"default": default_pages[page_no - 1],
|
"fifteen", "sixteen", "seventeen", "eighteen", "nineteen")
|
||||||
"description": f"Type of page for page {page_no}",
|
tens = ("", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy",
|
||||||
"list": pages,
|
"eighty", "ninety")
|
||||||
"category": f"OBP60 Page {page_no}",
|
if number < 20:
|
||||||
"capabilities": {"obp60": "true"},
|
return numbers[number]
|
||||||
"condition": [{"visiblePages": vp} for vp in range(page_no, no_of_pages + 1)],
|
else:
|
||||||
#"fields": [],
|
q, r = divmod(number, 10)
|
||||||
}
|
return tens[q] + numbers[r]
|
||||||
output.append(page_data)
|
|
||||||
|
|
||||||
for field_no in range(1, max_no_of_fields_per_page + 1):
|
def create_json(device, no_of_pages, pagedata):
|
||||||
field_data = {
|
|
||||||
"name": f"page{page_no}value{field_no}",
|
pages = sorted(pagedata.keys())
|
||||||
"label": f"Field {field_no}",
|
max_no_of_fields_per_page = max(pagedata.values())
|
||||||
"type": "boatData",
|
|
||||||
"default": "",
|
output = []
|
||||||
"description": f"The display for field {numbers[field_no - 1]}",
|
|
||||||
"category": f"OBP60 Page {page_no}",
|
for page_no in range(1, no_of_pages + 1):
|
||||||
"capabilities": {"obp60": "true"},
|
|
||||||
"condition": [
|
category = f"{device.upper()} Page {page_no}"
|
||||||
{f"page{page_no}type": page}
|
capabilities = {device.lower(): "true"}
|
||||||
for page in pages
|
visiblepages = [str(vp) for vp in range(page_no, no_of_pages + 1)]
|
||||||
if no_of_fields_per_page[page] >= field_no
|
|
||||||
|
page_data = {
|
||||||
|
"name": f"page{page_no}type",
|
||||||
|
"label": "Type",
|
||||||
|
"type": "list",
|
||||||
|
"default": get_default_page(page_no),
|
||||||
|
"description": f"Type of page for page {page_no}",
|
||||||
|
"list": pages,
|
||||||
|
"category": category,
|
||||||
|
"capabilities": {device.lower(): "true"},
|
||||||
|
"condition": {
|
||||||
|
"visiblePages": visiblepages
|
||||||
|
},
|
||||||
|
#"fields": [],
|
||||||
|
}
|
||||||
|
output.append(page_data)
|
||||||
|
|
||||||
|
for field_no in range(1, max_no_of_fields_per_page + 1):
|
||||||
|
field_data = {
|
||||||
|
"name": f"page{page_no}value{field_no}",
|
||||||
|
"label": f"Field {field_no}",
|
||||||
|
"type": "boatData",
|
||||||
|
"default": "",
|
||||||
|
"description": "The display for field {}".format(number_to_text(field_no)),
|
||||||
|
"category": category,
|
||||||
|
"capabilities": capabilities,
|
||||||
|
"condition": {
|
||||||
|
f"page{page_no}type": [ p for p in pages if pagedata[p] >= field_no ]
|
||||||
|
,"visiblePages": visiblepages
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output.append(field_data)
|
||||||
|
|
||||||
|
fluid_data = {
|
||||||
|
"name": f"page{page_no}fluid",
|
||||||
|
"label": "Fluid type",
|
||||||
|
"type": "list",
|
||||||
|
"default": "0",
|
||||||
|
"list": [
|
||||||
|
{"l":"Fuel (0)","v":"0"},
|
||||||
|
{"l":"Water (1)","v":"1"},
|
||||||
|
{"l":"Gray Water (2)","v":"2"},
|
||||||
|
{"l":"Live Well (3)","v":"3"},
|
||||||
|
{"l":"Oil (4)","v":"4"},
|
||||||
|
{"l":"Black Water (5)","v":"5"},
|
||||||
|
{"l":"Fuel Gasoline (6)","v":"6"}
|
||||||
],
|
],
|
||||||
|
"description": "Fluid type in tank",
|
||||||
|
"category": category,
|
||||||
|
"capabilities": capabilities,
|
||||||
|
"condition": {
|
||||||
|
f"page{page_no}type": "Fluid",
|
||||||
|
"visiblePages": visiblepages
|
||||||
|
}
|
||||||
}
|
}
|
||||||
output.append(field_data)
|
output.append(fluid_data)
|
||||||
|
|
||||||
fluid_data ={
|
if device.upper() == 'OBP40':
|
||||||
"name": f"page{page_no}fluid",
|
windsource = {
|
||||||
"label": "Fluid type",
|
"name": f"page{page_no}wndsrc",
|
||||||
"type": "list",
|
"label": "Wind source",
|
||||||
"default": "0",
|
"type": "list",
|
||||||
"list": [
|
"default": "True wind",
|
||||||
{"l":"Fuel (0)","v":"0"},
|
"description": f"Wind source for page {page_no}: [true|apparent]",
|
||||||
{"l":"Water (1)","v":"1"},
|
"list": [
|
||||||
{"l":"Gray Water (2)","v":"2"},
|
"True wind",
|
||||||
{"l":"Live Well (3)","v":"3"},
|
"Apparant wind"
|
||||||
{"l":"Oil (4)","v":"4"},
|
],
|
||||||
{"l":"Black Water (5)","v":"5"},
|
"category": category,
|
||||||
{"l":"Fuel Gasoline (6)","v":"6"}
|
"capabilities": capabilities,
|
||||||
],
|
"condition": {
|
||||||
"description": "Fluid type in tank",
|
f"page{page_no}type": "WindPlot",
|
||||||
"category": f"OBP60 Page {page_no}",
|
"visiblePages": visiblepages
|
||||||
"capabilities": {
|
}
|
||||||
"obp60":"true"
|
}
|
||||||
},
|
output.append(windsource)
|
||||||
"condition":[{f"page{page_no}type":"Fluid"}]
|
|
||||||
}
|
|
||||||
output.append(fluid_data)
|
|
||||||
|
|
||||||
json_output = json.dumps(output, indent=4)
|
return json.dumps(output, indent=4)
|
||||||
# print omitting first and last line containing [ ] of JSON array
|
|
||||||
#print(json_output[1:-1])
|
def usage():
|
||||||
# print omitting first line containing [ of JSON array
|
print("{} v{}".format(os.path.basename(__file__), __version__))
|
||||||
print(json_output[1:])
|
print()
|
||||||
# print(",")
|
print("Command line options")
|
||||||
|
print(" -d --device device name to use e.g. obp60")
|
||||||
|
print(" -p --pages number of pages to create")
|
||||||
|
print(" -h show this help")
|
||||||
|
print()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
options, remainder = getopt.getopt(sys.argv[1:], 'd:p:', ['device=','--pages='])
|
||||||
|
except getopt.GetoptError as err:
|
||||||
|
print(err)
|
||||||
|
usage()
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
|
device = "obp60"
|
||||||
|
no_of_pages = 10
|
||||||
|
for opt, arg in options:
|
||||||
|
if opt in ('-d', '--device'):
|
||||||
|
device = arg
|
||||||
|
elif opt in ('-p', '--pages'):
|
||||||
|
no_of_pages = int(arg)
|
||||||
|
elif opt == '-h':
|
||||||
|
usage()
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
# automatic detect pages and number of fields from sourcecode
|
||||||
|
pagedata = detect_pages("obp60task.cpp")
|
||||||
|
|
||||||
|
json_output = create_json(device, no_of_pages, pagedata)
|
||||||
|
# print omitting first line containing [ of JSON array
|
||||||
|
print(json_output[1:])
|
||||||
|
|||||||
1253
lib/obp60task/images/OBP40_400x300.xbm
Normal file
1253
lib/obp60task/images/OBP40_400x300.xbm
Normal file
File diff suppressed because it is too large
Load Diff
1253
lib/obp60task/images/OBP60_400x300.xbm
Normal file
1253
lib/obp60task/images/OBP60_400x300.xbm
Normal file
File diff suppressed because it is too large
Load Diff
1253
lib/obp60task/images/OBP_400x300.xbm
Normal file
1253
lib/obp60task/images/OBP_400x300.xbm
Normal file
File diff suppressed because it is too large
Load Diff
14
lib/obp60task/index.js
Normal file
14
lib/obp60task/index.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
// Add a new register card in web configuration interface
|
||||||
|
// This is a Java Script!
|
||||||
|
(function(){
|
||||||
|
const api=window.esp32nmea2k;
|
||||||
|
if (! api) return;
|
||||||
|
const tabName="Screen";
|
||||||
|
api.registerListener((id, data) => {
|
||||||
|
// if (!data.testboard) return; //do nothing if we are not active
|
||||||
|
let page = api.addTabPage(tabName, "Screen");
|
||||||
|
api.addEl('button', '', page, 'Screenshot').addEventListener('click', function (ev) {
|
||||||
|
window.open('/api/user/OBP60Task/screenshot', 'screenshot');
|
||||||
|
})
|
||||||
|
}, api.EVENTS.init);
|
||||||
|
})();
|
||||||
@@ -13,17 +13,13 @@
|
|||||||
#include "OBP60Extensions.h" // Functions lib for extension board
|
#include "OBP60Extensions.h" // Functions lib for extension board
|
||||||
#include "OBP60Keypad.h" // Functions for keypad
|
#include "OBP60Keypad.h" // Functions for keypad
|
||||||
#include "BoatDataCalibration.h" // Functions lib for data instance calibration
|
#include "BoatDataCalibration.h" // Functions lib for data instance calibration
|
||||||
|
#include "OBPDataOperations.h" // Functions lib for data operations such as true wind calculation
|
||||||
|
|
||||||
#ifdef BOARD_OBP40S3
|
#ifdef BOARD_OBP40S3
|
||||||
#include "driver/rtc_io.h" // Needs for weakup from deep sleep
|
#include "driver/rtc_io.h" // Needs for weakup from deep sleep
|
||||||
#include <FS.h> // SD-Card access
|
|
||||||
#include <SD.h>
|
|
||||||
#include <SPI.h>
|
#include <SPI.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// True type character sets includes
|
|
||||||
// See OBP60ExtensionPort.cpp
|
|
||||||
|
|
||||||
// Pictures
|
// Pictures
|
||||||
//#include GxEPD_BitmapExamples // Example picture
|
//#include GxEPD_BitmapExamples // Example picture
|
||||||
#include "MFD_OBP60_400x300_sw.h" // MFD with logo
|
#include "MFD_OBP60_400x300_sw.h" // MFD with logo
|
||||||
@@ -32,7 +28,6 @@
|
|||||||
#include "OBP60QRWiFi.h" // Functions lib for WiFi QR code
|
#include "OBP60QRWiFi.h" // Functions lib for WiFi QR code
|
||||||
#include "OBPSensorTask.h" // Functions lib for sensor data
|
#include "OBPSensorTask.h" // Functions lib for sensor data
|
||||||
|
|
||||||
|
|
||||||
// Global vars
|
// Global vars
|
||||||
bool initComplete = false; // Initialization complete
|
bool initComplete = false; // Initialization complete
|
||||||
int taskRunCounter = 0; // Task couter for loop section
|
int taskRunCounter = 0; // Task couter for loop section
|
||||||
@@ -45,63 +40,23 @@ void OBP60Init(GwApi *api){
|
|||||||
GwConfigHandler *config = api->getConfig();
|
GwConfigHandler *config = api->getConfig();
|
||||||
|
|
||||||
// Set a new device name and hidden the original name in the main config
|
// Set a new device name and hidden the original name in the main config
|
||||||
String devicename = api->getConfig()->getConfigItem(api->getConfig()->deviceName,true)->asString();
|
String devicename = config->getConfigItem(config->deviceName, true)->asString();
|
||||||
api->getConfig()->setValue(GwConfigDefinitions::systemName, devicename, GwConfigInterface::ConfigType::HIDDEN);
|
config->setValue(GwConfigDefinitions::systemName, devicename, GwConfigInterface::ConfigType::HIDDEN);
|
||||||
|
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"obp60init running");
|
logger->prefix = devicename + ":";
|
||||||
|
logger->logDebug(GwLog::LOG,"obp60init running");
|
||||||
|
|
||||||
// Check I2C devices
|
// Check I2C devices
|
||||||
|
|
||||||
|
// Init power
|
||||||
|
String powermode = config->getConfigItem(config->powerMode,true)->asString();
|
||||||
|
logger->logDebug(GwLog::DEBUG, "Power Mode is: %s", powermode.c_str());
|
||||||
|
powerInit(powermode);
|
||||||
|
|
||||||
// Init hardware
|
// Init hardware
|
||||||
hardwareInit(api);
|
hardwareInit(api);
|
||||||
|
|
||||||
// Init power rail 5.0V
|
#ifdef BOARD_OBP40S3
|
||||||
String powermode = api->getConfig()->getConfigItem(api->getConfig()->powerMode,true)->asString();
|
|
||||||
api->getLogger()->logDebug(GwLog::DEBUG,"Power Mode is: %s", powermode.c_str());
|
|
||||||
if(powermode == "Max Power" || powermode == "Only 5.0V"){
|
|
||||||
#ifdef HARDWARE_V21
|
|
||||||
setPortPin(OBP_POWER_50, true); // Power on 5.0V rail
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
setPortPin(OBP_POWER_EPD, true);// Power on ePaper display
|
|
||||||
setPortPin(OBP_POWER_SD, true); // Power on SD card
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
#ifdef HARDWARE_V21
|
|
||||||
setPortPin(OBP_POWER_50, false); // Power off 5.0V rail
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
setPortPin(OBP_POWER_EPD, false);// Power off ePaper display
|
|
||||||
setPortPin(OBP_POWER_SD, false); // Power off SD card
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
bool sdcard = config->getBool(config->useSDCard);
|
|
||||||
if (sdcard) {
|
|
||||||
SPIClass SD_SPI = SPIClass(HSPI);
|
|
||||||
SD_SPI.begin(SD_SPI_CLK, SD_SPI_MISO, SD_SPI_MOSI);
|
|
||||||
if (SD.begin(SD_SPI_CS, SD_SPI, 80000000)) {
|
|
||||||
String sdtype = "unknown";
|
|
||||||
uint8_t cardType = SD.cardType();
|
|
||||||
switch (cardType) {
|
|
||||||
case CARD_MMC:
|
|
||||||
sdtype = "MMC";
|
|
||||||
break;
|
|
||||||
case CARD_SD:
|
|
||||||
sdtype = "SDSC";
|
|
||||||
break;
|
|
||||||
case CARD_SDHC:
|
|
||||||
sdtype = "SDHC";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
uint64_t cardSize = SD.cardSize() / (1024 * 1024);
|
|
||||||
LOG_DEBUG(GwLog::LOG,"SD card type %s of size %d MB detected", sdtype, cardSize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deep sleep wakeup configuration
|
// Deep sleep wakeup configuration
|
||||||
esp_sleep_enable_ext0_wakeup(OBP_WAKEWUP_PIN, 0); // 1 = High, 0 = Low
|
esp_sleep_enable_ext0_wakeup(OBP_WAKEWUP_PIN, 0); // 1 = High, 0 = Low
|
||||||
rtc_gpio_pullup_en(OBP_WAKEWUP_PIN); // Activate pullup resistor
|
rtc_gpio_pullup_en(OBP_WAKEWUP_PIN); // Activate pullup resistor
|
||||||
@@ -110,7 +65,7 @@ void OBP60Init(GwApi *api){
|
|||||||
|
|
||||||
// Settings for e-paper display
|
// Settings for e-paper display
|
||||||
String fastrefresh = api->getConfig()->getConfigItem(api->getConfig()->fastRefresh,true)->asString();
|
String fastrefresh = api->getConfig()->getConfigItem(api->getConfig()->fastRefresh,true)->asString();
|
||||||
api->getLogger()->logDebug(GwLog::DEBUG,"Fast Refresh Mode is: %s", fastrefresh.c_str());
|
logger->logDebug(GwLog::DEBUG, "Fast Refresh Mode is: %s", fastrefresh.c_str());
|
||||||
#ifdef DISPLAY_GDEY042T81
|
#ifdef DISPLAY_GDEY042T81
|
||||||
if(fastrefresh == "true"){
|
if(fastrefresh == "true"){
|
||||||
static const bool useFastFullUpdate = true; // Enable fast full display update only for GDEY042T81
|
static const bool useFastFullUpdate = true; // Enable fast full display update only for GDEY042T81
|
||||||
@@ -129,11 +84,11 @@ void OBP60Init(GwApi *api){
|
|||||||
|
|
||||||
// Get CPU speed
|
// Get CPU speed
|
||||||
int freq = getCpuFrequencyMhz();
|
int freq = getCpuFrequencyMhz();
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"CPU speed at boot: %i MHz", freq);
|
logger->logDebug(GwLog::LOG,"CPU speed at boot: %i MHz", freq);
|
||||||
|
|
||||||
// Settings for backlight
|
// Settings for backlight
|
||||||
String backlightMode = api->getConfig()->getConfigItem(api->getConfig()->backlight,true)->asString();
|
String backlightMode = api->getConfig()->getConfigItem(api->getConfig()->backlight,true)->asString();
|
||||||
api->getLogger()->logDebug(GwLog::DEBUG,"Backlight Mode is: %s", backlightMode.c_str());
|
logger->logDebug(GwLog::DEBUG,"Backlight Mode is: %s", backlightMode.c_str());
|
||||||
uint brightness = uint(api->getConfig()->getConfigItem(api->getConfig()->blBrightness,true)->asInt());
|
uint brightness = uint(api->getConfig()->getConfigItem(api->getConfig()->blBrightness,true)->asInt());
|
||||||
String backlightColor = api->getConfig()->getConfigItem(api->getConfig()->blColor,true)->asString();
|
String backlightColor = api->getConfig()->getConfigItem(api->getConfig()->blColor,true)->asString();
|
||||||
if(String(backlightMode) == "On"){
|
if(String(backlightMode) == "On"){
|
||||||
@@ -148,7 +103,7 @@ void OBP60Init(GwApi *api){
|
|||||||
|
|
||||||
// Settings flash LED mode
|
// Settings flash LED mode
|
||||||
String ledMode = api->getConfig()->getConfigItem(api->getConfig()->flashLED,true)->asString();
|
String ledMode = api->getConfig()->getConfigItem(api->getConfig()->flashLED,true)->asString();
|
||||||
api->getLogger()->logDebug(GwLog::DEBUG,"LED Mode is: %s", ledMode.c_str());
|
logger->logDebug(GwLog::DEBUG,"LED Mode is: %s", ledMode.c_str());
|
||||||
if(String(ledMode) == "Off"){
|
if(String(ledMode) == "Off"){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
}
|
}
|
||||||
@@ -166,8 +121,8 @@ void OBP60Init(GwApi *api){
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
int page0=0;
|
int page0=0;
|
||||||
QueueHandle_t queue;
|
QueueHandle_t queue;
|
||||||
GwLog* logger = NULL;
|
GwLog* logger = nullptr;
|
||||||
// GwApi* api = NULL;
|
// GwApi* api = nullptr;
|
||||||
uint sensitivity = 100;
|
uint sensitivity = 100;
|
||||||
bool use_syspage = true;
|
bool use_syspage = true;
|
||||||
} MyData;
|
} MyData;
|
||||||
@@ -192,45 +147,37 @@ void keyboardTask(void *param){
|
|||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
class BoatValueList{
|
// Scorgan: moved class declaration to header file <obp60task.h> to make class available to other functions
|
||||||
public:
|
// --- Class BoatValueList --------------
|
||||||
static const int MAXVALUES=100;
|
bool BoatValueList::addValueToList(GwApi::BoatValue *v){
|
||||||
//we create a list containing all our BoatValues
|
for (int i=0;i<numValues;i++){
|
||||||
//this is the list we later use to let the api fill all the values
|
if (allBoatValues[i] == v){
|
||||||
//additionally we put the necessary values into the paga data - see below
|
//already in list...
|
||||||
GwApi::BoatValue *allBoatValues[MAXVALUES];
|
return true;
|
||||||
int numValues=0;
|
|
||||||
|
|
||||||
bool addValueToList(GwApi::BoatValue *v){
|
|
||||||
for (int i=0;i<numValues;i++){
|
|
||||||
if (allBoatValues[i] == v){
|
|
||||||
//already in list...
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (numValues >= MAXVALUES) return false;
|
|
||||||
allBoatValues[numValues]=v;
|
|
||||||
numValues++;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
//helper to ensure that each BoatValue is only queried once
|
if (numValues >= MAXVALUES) return false;
|
||||||
GwApi::BoatValue *findValueOrCreate(String name){
|
allBoatValues[numValues]=v;
|
||||||
for (int i=0;i<numValues;i++){
|
numValues++;
|
||||||
if (allBoatValues[i]->getName() == name) {
|
return true;
|
||||||
return allBoatValues[i];
|
}
|
||||||
}
|
//helper to ensure that each BoatValue is only queried once
|
||||||
|
GwApi::BoatValue *BoatValueList::findValueOrCreate(String name){
|
||||||
|
for (int i=0;i<numValues;i++){
|
||||||
|
if (allBoatValues[i]->getName() == name) {
|
||||||
|
return allBoatValues[i];
|
||||||
}
|
}
|
||||||
GwApi::BoatValue *rt=new GwApi::BoatValue(name);
|
|
||||||
addValueToList(rt);
|
|
||||||
return rt;
|
|
||||||
}
|
}
|
||||||
};
|
GwApi::BoatValue *rt=new GwApi::BoatValue(name);
|
||||||
|
addValueToList(rt);
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
|
// --- Class BoatValueList --------------
|
||||||
|
|
||||||
//we want to have a list that has all our page definitions
|
//we want to have a list that has all our page definitions
|
||||||
//this way each page can easily be added here
|
//this way each page can easily be added here
|
||||||
//needs some minor tricks for the safe static initialization
|
//needs some minor tricks for the safe static initialization
|
||||||
typedef std::vector<PageDescription*> Pages;
|
typedef std::vector<PageDescription*> Pages;
|
||||||
//the page list class
|
|
||||||
class PageList{
|
class PageList{
|
||||||
public:
|
public:
|
||||||
Pages pages;
|
Pages pages;
|
||||||
@@ -275,10 +222,12 @@ void registerAllPages(PageList &list){
|
|||||||
list.add(®isterPageFourValues2);
|
list.add(®isterPageFourValues2);
|
||||||
extern PageDescription registerPageWind;
|
extern PageDescription registerPageWind;
|
||||||
list.add(®isterPageWind);
|
list.add(®isterPageWind);
|
||||||
|
extern PageDescription registerPageWindPlot;
|
||||||
|
list.add(®isterPageWindPlot);
|
||||||
extern PageDescription registerPageWindRose;
|
extern PageDescription registerPageWindRose;
|
||||||
list.add(®isterPageWindRose);
|
list.add(®isterPageWindRose);
|
||||||
extern PageDescription registerPageWindRoseFlex;
|
extern PageDescription registerPageWindRoseFlex;
|
||||||
list.add(®isterPageWindRoseFlex); //
|
list.add(®isterPageWindRoseFlex);
|
||||||
extern PageDescription registerPageVoltage;
|
extern PageDescription registerPageVoltage;
|
||||||
list.add(®isterPageVoltage);
|
list.add(®isterPageVoltage);
|
||||||
extern PageDescription registerPageDST810;
|
extern PageDescription registerPageDST810;
|
||||||
@@ -309,67 +258,69 @@ void registerAllPages(PageList &list){
|
|||||||
list.add(®isterPageXTETrack);
|
list.add(®isterPageXTETrack);
|
||||||
extern PageDescription registerPageFluid;
|
extern PageDescription registerPageFluid;
|
||||||
list.add(®isterPageFluid);
|
list.add(®isterPageFluid);
|
||||||
|
extern PageDescription registerPageSkyView;
|
||||||
|
list.add(®isterPageSkyView);
|
||||||
|
extern PageDescription registerPageAnchor;
|
||||||
|
list.add(®isterPageAnchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Undervoltage detection for shutdown display
|
// Undervoltage detection for shutdown display
|
||||||
void underVoltageDetection(GwApi *api, CommonData &common){
|
void underVoltageError(CommonData &common) {
|
||||||
// Read settings
|
#if defined VOLTAGE_SENSOR && defined LIPO_ACCU_1200
|
||||||
double voffset = (api->getConfig()->getConfigItem(api->getConfig()->vOffset,true)->asString()).toFloat();
|
// Switch off all power lines
|
||||||
double vslope = (api->getConfig()->getConfigItem(api->getConfig()->vSlope,true)->asString()).toFloat();
|
setPortPin(OBP_BACKLIGHT_LED, false); // Backlight Off
|
||||||
|
setFlashLED(false); // Flash LED Off
|
||||||
|
buzzer(TONE4, 20); // Buzzer tone 4kHz 20ms
|
||||||
|
// Shutdown EInk display
|
||||||
|
getdisplay().setFullWindow(); // Set full Refresh
|
||||||
|
//getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
getdisplay().fillScreen(common.bgcolor);// Clear screen
|
||||||
|
getdisplay().setTextColor(common.fgcolor);
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
|
getdisplay().setCursor(65, 150);
|
||||||
|
getdisplay().print("Undervoltage");
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
getdisplay().setCursor(65, 175);
|
||||||
|
getdisplay().print("Charge battery and restart system");
|
||||||
|
getdisplay().nextPage(); // Partial update
|
||||||
|
getdisplay().powerOff(); // Display power off
|
||||||
|
setPortPin(OBP_POWER_EPD, false); // Power off ePaper display
|
||||||
|
setPortPin(OBP_POWER_SD, false); // Power off SD card
|
||||||
|
#else
|
||||||
|
// Switch off all power lines
|
||||||
|
setPortPin(OBP_BACKLIGHT_LED, false); // Backlight Off
|
||||||
|
setFlashLED(false); // Flash LED Off
|
||||||
|
buzzer(TONE4, 20); // Buzzer tone 4kHz 20ms
|
||||||
|
setPortPin(OBP_POWER_50, false); // Power rail 5.0V Off
|
||||||
|
// Shutdown EInk display
|
||||||
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
getdisplay().fillScreen(common.bgcolor);// Clear screen
|
||||||
|
getdisplay().setTextColor(common.fgcolor);
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
|
getdisplay().setCursor(65, 150);
|
||||||
|
getdisplay().print("Undervoltage");
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
getdisplay().setCursor(65, 175);
|
||||||
|
getdisplay().print("To wake up repower system");
|
||||||
|
getdisplay().nextPage(); // Partial update
|
||||||
|
getdisplay().powerOff(); // Display power off
|
||||||
|
#endif
|
||||||
|
while (true) {
|
||||||
|
esp_deep_sleep_start(); // Deep Sleep without wakeup. Wakeup only after power cycle (restart).
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool underVoltageDetection(float voffset, float vslope) {
|
||||||
// Read supply voltage
|
// Read supply voltage
|
||||||
#if defined VOLTAGE_SENSOR && defined LIPO_ACCU_1200
|
#if defined VOLTAGE_SENSOR && defined LIPO_ACCU_1200
|
||||||
float actVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.53) * 2; // Vin = 1/2 for OBP40
|
float actVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.53) * 2; // Vin = 1/2 for OBP40
|
||||||
float minVoltage = 3.65; // Absolut minimum volatge for 3,7V LiPo accu
|
float minVoltage = 3.65; // Absolut minimum volatge for 3,7V LiPo accu
|
||||||
#else
|
#else
|
||||||
float actVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.17) * 20; // Vin = 1/20 for OBP60
|
float actVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.17) * 20; // Vin = 1/20 for OBP60
|
||||||
float minVoltage = MIN_VOLTAGE;
|
float minVoltage = MIN_VOLTAGE;
|
||||||
#endif
|
#endif
|
||||||
double calVoltage = actVoltage * vslope + voffset; // Calibration
|
float calVoltage = actVoltage * vslope + voffset; // Calibration
|
||||||
if(calVoltage < minVoltage){
|
return (calVoltage < minVoltage);
|
||||||
#if defined VOLTAGE_SENSOR && defined LIPO_ACCU_1200
|
|
||||||
// Switch off all power lines
|
|
||||||
setPortPin(OBP_BACKLIGHT_LED, false); // Backlight Off
|
|
||||||
setFlashLED(false); // Flash LED Off
|
|
||||||
buzzer(TONE4, 20); // Buzzer tone 4kHz 20ms
|
|
||||||
// Shutdown EInk display
|
|
||||||
getdisplay().setFullWindow(); // Set full Refresh
|
|
||||||
//getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
|
||||||
getdisplay().fillScreen(common.bgcolor);// Clear screen
|
|
||||||
getdisplay().setTextColor(common.fgcolor);
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
|
||||||
getdisplay().setCursor(65, 150);
|
|
||||||
getdisplay().print("Undervoltage");
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
|
||||||
getdisplay().setCursor(65, 175);
|
|
||||||
getdisplay().print("Charge battery and restart system");
|
|
||||||
getdisplay().nextPage(); // Partial update
|
|
||||||
getdisplay().powerOff(); // Display power off
|
|
||||||
setPortPin(OBP_POWER_EPD, false); // Power off ePaper display
|
|
||||||
setPortPin(OBP_POWER_SD, false); // Power off SD card
|
|
||||||
#else
|
|
||||||
// Switch off all power lines
|
|
||||||
setPortPin(OBP_BACKLIGHT_LED, false); // Backlight Off
|
|
||||||
setFlashLED(false); // Flash LED Off
|
|
||||||
buzzer(TONE4, 20); // Buzzer tone 4kHz 20ms
|
|
||||||
setPortPin(OBP_POWER_50, false); // Power rail 5.0V Off
|
|
||||||
// Shutdown EInk display
|
|
||||||
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
|
||||||
getdisplay().fillScreen(common.bgcolor);// Clear screen
|
|
||||||
getdisplay().setTextColor(common.fgcolor);
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
|
||||||
getdisplay().setCursor(65, 150);
|
|
||||||
getdisplay().print("Undervoltage");
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
|
||||||
getdisplay().setCursor(65, 175);
|
|
||||||
getdisplay().print("To wake up repower system");
|
|
||||||
getdisplay().nextPage(); // Partial update
|
|
||||||
getdisplay().powerOff(); // Display power off
|
|
||||||
#endif
|
|
||||||
// Stop system
|
|
||||||
while(true){
|
|
||||||
esp_deep_sleep_start(); // Deep Sleep without weakup. Weakup only after power cycle (restart).
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OBP60 Task
|
// OBP60 Task
|
||||||
@@ -421,7 +372,7 @@ void OBP60Task(GwApi *api){
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISPLAY_GDEY042T81
|
#ifdef DISPLAY_GDEY042T81
|
||||||
getdisplay().init(115200, true, 2, false); // Use this for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
||||||
#else
|
#else
|
||||||
getdisplay().init(115200); // Init for normal displays
|
getdisplay().init(115200); // Init for normal displays
|
||||||
#endif
|
#endif
|
||||||
@@ -482,6 +433,8 @@ void OBP60Task(GwApi *api){
|
|||||||
int lastPage=pageNumber;
|
int lastPage=pageNumber;
|
||||||
|
|
||||||
BoatValueList boatValues; //all the boat values for the api query
|
BoatValueList boatValues; //all the boat values for the api query
|
||||||
|
HstryBuf hstryBufList(1920); // Create ring buffers for history storage of some boat data (1920 seconds = 32 minutes)
|
||||||
|
WindUtils trueWind(&boatValues); // Create helper object for true wind calculation
|
||||||
//commonData.distanceformat=config->getString(xxx);
|
//commonData.distanceformat=config->getString(xxx);
|
||||||
//add all necessary data to common data
|
//add all necessary data to common data
|
||||||
|
|
||||||
@@ -505,6 +458,7 @@ void OBP60Task(GwApi *api){
|
|||||||
pages[i].page=description->creator(commonData);
|
pages[i].page=description->creator(commonData);
|
||||||
pages[i].parameters.pageName=pageType;
|
pages[i].parameters.pageName=pageType;
|
||||||
pages[i].parameters.pageNumber = i + 1;
|
pages[i].parameters.pageNumber = i + 1;
|
||||||
|
pages[i].parameters.api = api;
|
||||||
LOG_DEBUG(GwLog::DEBUG,"found page %s for number %d",pageType.c_str(),i);
|
LOG_DEBUG(GwLog::DEBUG,"found page %s for number %d",pageType.c_str(),i);
|
||||||
//fill in all the user defined parameters
|
//fill in all the user defined parameters
|
||||||
for (int uid=0;uid<description->userParam;uid++){
|
for (int uid=0;uid<description->userParam;uid++){
|
||||||
@@ -523,6 +477,8 @@ void OBP60Task(GwApi *api){
|
|||||||
LOG_DEBUG(GwLog::DEBUG,"added fixed value %s to page %d",value->getName().c_str(),i);
|
LOG_DEBUG(GwLog::DEBUG,"added fixed value %s to page %d",value->getName().c_str(),i);
|
||||||
pages[i].parameters.values.push_back(value);
|
pages[i].parameters.values.push_back(value);
|
||||||
}
|
}
|
||||||
|
// Add boat history data to page parameters
|
||||||
|
pages[i].parameters.boatHstry = &hstryBufList;
|
||||||
}
|
}
|
||||||
// add out of band system page (always available)
|
// add out of band system page (always available)
|
||||||
Page *syspage = allPages.pages[0]->creator(commonData);
|
Page *syspage = allPages.pages[0]->creator(commonData);
|
||||||
@@ -530,6 +486,13 @@ void OBP60Task(GwApi *api){
|
|||||||
// Read all calibration data settings from config
|
// Read all calibration data settings from config
|
||||||
calibrationData.readConfig(config, logger);
|
calibrationData.readConfig(config, logger);
|
||||||
|
|
||||||
|
// Check user settings for true wind calculation
|
||||||
|
bool calcTrueWnds = api->getConfig()->getBool(api->getConfig()->calcTrueWnds, false);
|
||||||
|
bool useSimuData = api->getConfig()->getBool(api->getConfig()->useSimuData, false);
|
||||||
|
|
||||||
|
// Initialize history buffer for certain boat data
|
||||||
|
hstryBufList.init(&boatValues, logger);
|
||||||
|
|
||||||
// Display screenshot handler for HTTP request
|
// Display screenshot handler for HTTP request
|
||||||
// http://192.168.15.1/api/user/OBP60Task/screenshot
|
// http://192.168.15.1/api/user/OBP60Task/screenshot
|
||||||
api->registerRequestHandler("screenshot", [api, &pageNumber, pages](AsyncWebServerRequest *request) {
|
api->registerRequestHandler("screenshot", [api, &pageNumber, pages](AsyncWebServerRequest *request) {
|
||||||
@@ -563,7 +526,9 @@ void OBP60Task(GwApi *api){
|
|||||||
commonData.backlight.brightness = 2.55 * uint(config->getConfigItem(config->blBrightness,true)->asInt());
|
commonData.backlight.brightness = 2.55 * uint(config->getConfigItem(config->blBrightness,true)->asInt());
|
||||||
commonData.powermode = api->getConfig()->getConfigItem(api->getConfig()->powerMode,true)->asString();
|
commonData.powermode = api->getConfig()->getConfigItem(api->getConfig()->powerMode,true)->asString();
|
||||||
|
|
||||||
bool uvoltage = api->getConfig()->getConfigItem(api->getConfig()->underVoltage,true)->asBoolean();
|
bool uvoltage = config->getConfigItem(config->underVoltage, true)->asBoolean();
|
||||||
|
float voffset = (config->getConfigItem(config->vOffset,true)->asString()).toFloat();
|
||||||
|
float vslope = (config->getConfigItem(config->vSlope,true)->asString()).toFloat();
|
||||||
String cpuspeed = api->getConfig()->getConfigItem(api->getConfig()->cpuSpeed,true)->asString();
|
String cpuspeed = api->getConfig()->getConfigItem(api->getConfig()->cpuSpeed,true)->asString();
|
||||||
uint hdopAccuracy = uint(api->getConfig()->getConfigItem(api->getConfig()->hdopAccuracy,true)->asInt());
|
uint hdopAccuracy = uint(api->getConfig()->getConfigItem(api->getConfig()->hdopAccuracy,true)->asInt());
|
||||||
|
|
||||||
@@ -571,7 +536,7 @@ void OBP60Task(GwApi *api){
|
|||||||
double homelon = commonData.config->getString(commonData.config->homeLON).toDouble();
|
double homelon = commonData.config->getString(commonData.config->homeLON).toDouble();
|
||||||
bool homevalid = homelat >= -180.0 and homelat <= 180 and homelon >= -90.0 and homelon <= 90.0;
|
bool homevalid = homelat >= -180.0 and homelat <= 180 and homelon >= -90.0 and homelon <= 90.0;
|
||||||
if (homevalid) {
|
if (homevalid) {
|
||||||
LOG_DEBUG(GwLog::LOG, "Home location set to %f : %f", homelat, homelon);
|
LOG_DEBUG(GwLog::LOG, "Home location set to lat=%f, lon=%f", homelat, homelon);
|
||||||
} else {
|
} else {
|
||||||
LOG_DEBUG(GwLog::LOG, "No valid home location found");
|
LOG_DEBUG(GwLog::LOG, "No valid home location found");
|
||||||
}
|
}
|
||||||
@@ -605,14 +570,18 @@ void OBP60Task(GwApi *api){
|
|||||||
//####################################################################################
|
//####################################################################################
|
||||||
|
|
||||||
bool systemPage = false;
|
bool systemPage = false;
|
||||||
|
bool systemPageNew = false;
|
||||||
Page *currentPage;
|
Page *currentPage;
|
||||||
while (true){
|
while (true){
|
||||||
delay(100); // Delay 100ms (loop time)
|
delay(100); // Delay 100ms (loop time)
|
||||||
bool keypressed = false;
|
bool keypressed = false;
|
||||||
|
|
||||||
// Undervoltage detection
|
// Undervoltage detection
|
||||||
if(uvoltage == true){
|
if (uvoltage == true) {
|
||||||
underVoltageDetection(api, commonData);
|
if (underVoltageDetection(voffset, vslope)) {
|
||||||
|
LOG_DEBUG(GwLog::ERROR, "Undervoltage detected, shutting down!");
|
||||||
|
underVoltageError(commonData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set CPU speed after boot after 1min
|
// Set CPU speed after boot after 1min
|
||||||
@@ -657,6 +626,7 @@ void OBP60Task(GwApi *api){
|
|||||||
systemPage = true; // System page is out of band
|
systemPage = true; // System page is out of band
|
||||||
syspage->setupKeys();
|
syspage->setupKeys();
|
||||||
keyboardMessage = 0;
|
keyboardMessage = 0;
|
||||||
|
systemPageNew = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
currentPage = pages[pageNumber].page;
|
currentPage = pages[pageNumber].page;
|
||||||
@@ -711,7 +681,7 @@ void OBP60Task(GwApi *api){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// #9 or #10 Refresh display after a new page after 4s waiting time and if refresh is disabled
|
// #9 or #10 Refresh display after a new page after 4s waiting time and if refresh is disabled
|
||||||
if(refreshmode == true && (keyboardMessage == 9 || keyboardMessage == 10)){
|
if(refreshmode == true && (keyboardMessage == 9 || keyboardMessage == 10 || keyboardMessage == 4 || keyboardMessage == 3)){
|
||||||
starttime4 = millis();
|
starttime4 = millis();
|
||||||
starttime2 = millis(); // Reset the timer for full display update
|
starttime2 = millis(); // Reset the timer for full display update
|
||||||
delayedDisplayUpdate = true;
|
delayedDisplayUpdate = true;
|
||||||
@@ -742,17 +712,28 @@ void OBP60Task(GwApi *api){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Full display update afer a new selected page and 4s wait time
|
// Full display update afer a new selected page and 8s wait time
|
||||||
if(millis() > starttime4 + 4000 && delayedDisplayUpdate == true){
|
if(millis() > starttime4 + 8000 && delayedDisplayUpdate == true){
|
||||||
starttime1 = millis();
|
starttime1 = millis();
|
||||||
starttime2 = millis();
|
starttime2 = millis();
|
||||||
getdisplay().setFullWindow(); // Set full update
|
getdisplay().setFullWindow(); // Set full update
|
||||||
getdisplay().nextPage();
|
if(fastrefresh == "true"){
|
||||||
if(fastrefresh == "false"){
|
getdisplay().nextPage(); // Full update
|
||||||
|
}
|
||||||
|
else{
|
||||||
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
||||||
|
#ifdef DISPLAY_GDEY042T81
|
||||||
|
getdisplay().hibernate(); // Set display in hybenate mode
|
||||||
|
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
||||||
|
#else
|
||||||
|
getdisplay().init(115200); // Init for normal displays
|
||||||
|
#endif
|
||||||
|
getdisplay().firstPage(); // Full update
|
||||||
getdisplay().nextPage(); // Full update
|
getdisplay().nextPage(); // Full update
|
||||||
getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
// getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
getdisplay().nextPage(); // Full update
|
// getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
||||||
|
// getdisplay().nextPage(); // Partial update
|
||||||
|
// getdisplay().nextPage(); // Partial update
|
||||||
}
|
}
|
||||||
delayedDisplayUpdate = false;
|
delayedDisplayUpdate = false;
|
||||||
}
|
}
|
||||||
@@ -764,12 +745,23 @@ void OBP60Task(GwApi *api){
|
|||||||
starttime2 = millis();
|
starttime2 = millis();
|
||||||
LOG_DEBUG(GwLog::DEBUG,"E-Ink full refresh first 5 min");
|
LOG_DEBUG(GwLog::DEBUG,"E-Ink full refresh first 5 min");
|
||||||
getdisplay().setFullWindow(); // Set full update
|
getdisplay().setFullWindow(); // Set full update
|
||||||
getdisplay().nextPage();
|
if(fastrefresh == "true"){
|
||||||
if(fastrefresh == "false"){
|
getdisplay().nextPage(); // Full update
|
||||||
|
}
|
||||||
|
else{
|
||||||
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
||||||
|
#ifdef DISPLAY_GDEY042T81
|
||||||
|
getdisplay().hibernate(); // Set display in hybenate mode
|
||||||
|
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
||||||
|
#else
|
||||||
|
getdisplay().init(115200); // Init for normal displays
|
||||||
|
#endif
|
||||||
|
getdisplay().firstPage(); // Full update
|
||||||
getdisplay().nextPage(); // Full update
|
getdisplay().nextPage(); // Full update
|
||||||
getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
// getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
getdisplay().nextPage(); // Full update
|
// getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
||||||
|
// getdisplay().nextPage(); // Partial update
|
||||||
|
// getdisplay().nextPage(); // Partial update
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -778,12 +770,23 @@ void OBP60Task(GwApi *api){
|
|||||||
starttime2 = millis();
|
starttime2 = millis();
|
||||||
LOG_DEBUG(GwLog::DEBUG,"E-Ink full refresh");
|
LOG_DEBUG(GwLog::DEBUG,"E-Ink full refresh");
|
||||||
getdisplay().setFullWindow(); // Set full update
|
getdisplay().setFullWindow(); // Set full update
|
||||||
getdisplay().nextPage();
|
if(fastrefresh == "true"){
|
||||||
if(fastrefresh == "false"){
|
getdisplay().nextPage(); // Full update
|
||||||
|
}
|
||||||
|
else{
|
||||||
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
||||||
|
#ifdef DISPLAY_GDEY042T81
|
||||||
|
getdisplay().hibernate(); // Set display in hybenate mode
|
||||||
|
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
||||||
|
#else
|
||||||
|
getdisplay().init(115200); // Init for normal displays
|
||||||
|
#endif
|
||||||
|
getdisplay().firstPage(); // Full update
|
||||||
getdisplay().nextPage(); // Full update
|
getdisplay().nextPage(); // Full update
|
||||||
getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
// getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
getdisplay().nextPage(); // Full update
|
// getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
||||||
|
// getdisplay().nextPage(); // Partial update
|
||||||
|
// getdisplay().nextPage(); // Partial update
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -802,6 +805,12 @@ void OBP60Task(GwApi *api){
|
|||||||
api->getBoatDataValues(boatValues.numValues,boatValues.allBoatValues);
|
api->getBoatDataValues(boatValues.numValues,boatValues.allBoatValues);
|
||||||
api->getStatus(commonData.status);
|
api->getStatus(commonData.status);
|
||||||
|
|
||||||
|
if (calcTrueWnds) {
|
||||||
|
trueWind.addTrueWind(api, &boatValues, logger);
|
||||||
|
}
|
||||||
|
// Handle history buffers for TWD, TWS for wind plot page and other usage
|
||||||
|
hstryBufList.handleHstryBuf(useSimuData);
|
||||||
|
|
||||||
// Clear display
|
// Clear display
|
||||||
// getdisplay().fillRect(0, 0, getdisplay().width(), getdisplay().height(), commonData.bgcolor);
|
// getdisplay().fillRect(0, 0, getdisplay().width(), getdisplay().height(), commonData.bgcolor);
|
||||||
getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
||||||
@@ -816,6 +825,11 @@ void OBP60Task(GwApi *api){
|
|||||||
if (systemPage) {
|
if (systemPage) {
|
||||||
displayFooter(commonData);
|
displayFooter(commonData);
|
||||||
PageData sysparams; // empty
|
PageData sysparams; // empty
|
||||||
|
sysparams.api = api;
|
||||||
|
if (systemPageNew) {
|
||||||
|
syspage->displayNew(sysparams);
|
||||||
|
systemPageNew = false;
|
||||||
|
}
|
||||||
syspage->displayPage(sysparams);
|
syspage->displayPage(sysparams);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -832,10 +846,11 @@ void OBP60Task(GwApi *api){
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if (lastPage != pageNumber){
|
if (lastPage != pageNumber){
|
||||||
if (hasFRAM) fram.write(FRAM_PAGE_NO, pageNumber); // remember page for device restart
|
pages[lastPage].page->leavePage(pages[lastPage].parameters); // call page cleanup code
|
||||||
|
if (hasFRAM) fram.write(FRAM_PAGE_NO, pageNumber); // remember new page for device restart
|
||||||
currentPage->setupKeys();
|
currentPage->setupKeys();
|
||||||
currentPage->displayNew(pages[pageNumber].parameters);
|
currentPage->displayNew(pages[pageNumber].parameters);
|
||||||
lastPage=pageNumber;
|
lastPage = pageNumber;
|
||||||
}
|
}
|
||||||
//call the page code
|
//call the page code
|
||||||
LOG_DEBUG(GwLog::DEBUG,"calling page %d",pageNumber);
|
LOG_DEBUG(GwLog::DEBUG,"calling page %d",pageNumber);
|
||||||
@@ -843,7 +858,16 @@ void OBP60Task(GwApi *api){
|
|||||||
if (pages[pageNumber].description && pages[pageNumber].description->header){
|
if (pages[pageNumber].description && pages[pageNumber].description->header){
|
||||||
displayFooter(commonData);
|
displayFooter(commonData);
|
||||||
}
|
}
|
||||||
currentPage->displayPage(pages[pageNumber].parameters);
|
int ret = currentPage->displayPage(pages[pageNumber].parameters);
|
||||||
|
if (commonData.alarm.active) {
|
||||||
|
displayAlarm(commonData);
|
||||||
|
}
|
||||||
|
if (ret & PAGE_UPDATE) {
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
}
|
||||||
|
if (ret & PAGE_HIBERNATE) {
|
||||||
|
getdisplay().hibernate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,5 +41,24 @@
|
|||||||
#ifdef BOARD_OBP40S3
|
#ifdef BOARD_OBP40S3
|
||||||
DECLARE_CAPABILITY(obp40,true)
|
DECLARE_CAPABILITY(obp40,true)
|
||||||
#endif
|
#endif
|
||||||
DECLARE_STRING_CAPABILITY(HELP_URL, "https://obp60-v2-docu.readthedocs.io/de/latest/"); // Link to help pages
|
#ifdef BOARD_OBP60S3
|
||||||
|
DECLARE_STRING_CAPABILITY(HELP_URL, "https://obp60-v2-docu.readthedocs.io/en/latest/"); // Link to help pages
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
DECLARE_STRING_CAPABILITY(HELP_URL, "https://obp40-v1-docu.readthedocs.io/en/latest/"); // Link to help pages
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class BoatValueList{
|
||||||
|
public:
|
||||||
|
static const int MAXVALUES=100;
|
||||||
|
//we create a list containing all our BoatValues
|
||||||
|
//this is the list we later use to let the api fill all the values
|
||||||
|
//additionally we put the necessary values into the paga data - see below
|
||||||
|
GwApi::BoatValue *allBoatValues[MAXVALUES];
|
||||||
|
int numValues=0;
|
||||||
|
|
||||||
|
bool addValueToList(GwApi::BoatValue *v);
|
||||||
|
//helper to ensure that each BoatValue is only queried once
|
||||||
|
GwApi::BoatValue *findValueOrCreate(String name);
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -40,19 +40,22 @@ lib_deps =
|
|||||||
paulstoffregen/OneWire@2.3.8
|
paulstoffregen/OneWire@2.3.8
|
||||||
milesburton/DallasTemperature@3.11.0
|
milesburton/DallasTemperature@3.11.0
|
||||||
signetica/SunRise@2.0.2
|
signetica/SunRise@2.0.2
|
||||||
adafruit/Adafruit FRAM I2C@^2.0.3
|
adafruit/Adafruit FRAM I2C@2.0.3
|
||||||
|
WifiClientSecure
|
||||||
|
HTTPClient
|
||||||
build_flags=
|
build_flags=
|
||||||
#https://thingpulse.com/usb-settings-for-logging-with-the-esp32-s3-in-platformio/?srsltid=AfmBOopGskbkr4GoeVkNlFaZXe_zXkLceKF6Rn-tmoXABCeAR2vWsdHL
|
#https://thingpulse.com/usb-settings-for-logging-with-the-esp32-s3-in-platformio/?srsltid=AfmBOopGskbkr4GoeVkNlFaZXe_zXkLceKF6Rn-tmoXABCeAR2vWsdHL
|
||||||
# -D CORE_DEBUG_LEVEL=1 #Debug level for CPU core via CDC (seral device)
|
# -D CORE_DEBUG_LEVEL=1 #Debug level for CPU core via CDC (serial device)
|
||||||
# -D TIME=$UNIX_TIME #Set PC time for RTC (only settable via VSC)
|
# -D TIME=$UNIX_TIME #Set PC time for RTC (only settable via VSC)
|
||||||
-D DISABLE_DIAGNOSTIC_OUTPUT #Disable diagnostic output for GxEPD2 lib
|
-D DISABLE_DIAGNOSTIC_OUTPUT #Disable diagnostic output for GxEPD2 lib
|
||||||
-D BOARD_OBP60S3 #Board OBP60 V2.1 with ESP32S3
|
-D BOARD_OBP60S3 #Board OBP60 V2.1 with ESP32S3
|
||||||
# -D HARDWARE_V20 #OBP60 hardware revision V2.0
|
# -D HARDWARE_V20 #OBP60 hardware revision V2.0
|
||||||
-D HARDWARE_V21 #OBP60 hardware revision V2.1
|
-D HARDWARE_V21 #OBP60 hardware revision V2.1
|
||||||
# -D DISPLAY_GDEW042T2 #old E-Ink display from Waveshare, R10 0.47 ohm
|
# -D DISPLAY_GDEW042T2 #old E-Ink display from GoodDisplay (Waveshare), R10 0.47 ohm - very good
|
||||||
-D DISPLAY_GDEY042T81 #new E-Ink display from Waveshare, R10 2.2 ohm
|
-D DISPLAY_GDEY042T81 #new E-Ink display from GoodDisplay (Waveshare), R10 2.2 ohm - good (contast lost by shunshine)
|
||||||
# -D DISPLAY_GYE042A87 #alternativ E-Ink display from Genyo Optical, R10 2.2 ohm
|
# -D DISPLAY_GYE042A87 #alternativ E-Ink display from Genyo Optical, R10 2.2 ohm - medium
|
||||||
# -D DISPLAY_SE0420NQ04 #alternativ E-Ink display from SID Technology, R10 2.2 ohm
|
# -D DISPLAY_SE0420NQ04 #alternativ E-Ink display from SID Technology, R10 2.2 ohm - bad (burn in effects)
|
||||||
|
# -D DISPLAY_ZJY400300-042CAAMFGN #alternativ E-Ink display from ZZE Technology, R10 2.2 ohm - very good
|
||||||
${env.build_flags}
|
${env.build_flags}
|
||||||
#CONFIG_ESP_TASK_WDT_TIMEOUT_S = 10 #Task Watchdog timeout period (seconds) [1...60] 5 default
|
#CONFIG_ESP_TASK_WDT_TIMEOUT_S = 10 #Task Watchdog timeout period (seconds) [1...60] 5 default
|
||||||
upload_port = /dev/ttyACM0 #OBP60 download via USB-C direct
|
upload_port = /dev/ttyACM0 #OBP60 download via USB-C direct
|
||||||
@@ -91,12 +94,15 @@ lib_deps =
|
|||||||
paulstoffregen/OneWire@2.3.8
|
paulstoffregen/OneWire@2.3.8
|
||||||
milesburton/DallasTemperature@3.11.0
|
milesburton/DallasTemperature@3.11.0
|
||||||
signetica/SunRise@2.0.2
|
signetica/SunRise@2.0.2
|
||||||
adafruit/Adafruit FRAM I2C@^2.0.3
|
adafruit/Adafruit FRAM I2C@2.0.3
|
||||||
|
WifiClientSecure
|
||||||
|
HTTPClient
|
||||||
build_flags=
|
build_flags=
|
||||||
-D DISABLE_DIAGNOSTIC_OUTPUT #Disable diagnostic output for GxEPD2 lib
|
-D DISABLE_DIAGNOSTIC_OUTPUT #Disable diagnostic output for GxEPD2 lib
|
||||||
-D BOARD_OBP40S3 #Board OBP40 with ESP32S3
|
-D BOARD_OBP40S3 #Board OBP40 with ESP32S3
|
||||||
-D HARDWARE_V10 #OBP40 hardware revision V1.0 SKU:DIE07300S V1.1 (CrowPanel 4.2)
|
-D HARDWARE_V10 #OBP40 hardware revision V1.0 SKU:DIE07300S V1.1 (CrowPanel 4.2)
|
||||||
-D DISPLAY_GDEY042T81 #new E-Ink display from Waveshare, R10 2.2 ohm
|
-D DISPLAY_GDEY042T81 #new E-Ink display from Good Display (Waveshare), R10 2.2 ohm - good (contast lost by shunshine)
|
||||||
|
#-D DISPLAY_ZJY400300-042CAAMFGN #alternativ E-Ink display from ZZE Technology, R10 2.2 ohm - very good
|
||||||
#-D LIPO_ACCU_1200 #Hardware extension, LiPo accu 3,7V 1200mAh
|
#-D LIPO_ACCU_1200 #Hardware extension, LiPo accu 3,7V 1200mAh
|
||||||
#-D VOLTAGE_SENSOR #Hardware extension, LiPo voltage sensor with two resistors
|
#-D VOLTAGE_SENSOR #Hardware extension, LiPo voltage sensor with two resistors
|
||||||
${env.build_flags}
|
${env.build_flags}
|
||||||
|
|||||||
Reference in New Issue
Block a user