mirror of
https://github.com/thooge/esp32-nmea2000-obp60.git
synced 2025-12-16 15:33:05 +01:00
Compare commits
13 Commits
extended
...
r20250120a
| Author | SHA1 | Date | |
|---|---|---|---|
| b728d6d643 | |||
| 10d1046c82 | |||
| 66d88a8486 | |||
| 2be67f1659 | |||
| 75e360a19d | |||
| b56c43767d | |||
| 9af781318f | |||
| 081a73d8f8 | |||
| ff867beb9d | |||
| 2fd11c72b6 | |||
| 235cfd1c9c | |||
| 16e7b80230 | |||
| 5f5c520714 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -6,4 +6,3 @@
|
|||||||
generated/*
|
generated/*
|
||||||
lib/generated
|
lib/generated
|
||||||
webinstall/token.php
|
webinstall/token.php
|
||||||
*~
|
|
||||||
|
|||||||
10
Readme.md
10
Readme.md
@@ -68,12 +68,12 @@ Initial Flash
|
|||||||
__Browser__
|
__Browser__
|
||||||
|
|
||||||
If you run a system with a modern Chrome or Edge Browser you can directly flash your device from within the browser.
|
If you run a system with a modern Chrome or Edge Browser you can directly flash your device from within the browser.
|
||||||
Just go to the [Flash Page](https://wellenvogel.de/software/esp32/install.html) and select the "Initial" flash for your Hardware. This will install the most current software to your device. If you are using a forked project (like OBP60) refer to the documentation of the fork. You can just install any flash binary from your local computer with the browser based installation using the "upload" button.<br>
|
Just go to the [Flash Page](https://wellenvogel.github.io/esp32-nmea2000/install.html) and select the "Initial" flash for your Hardware. This will install the most current software to your device.
|
||||||
If you are on Windows you will need to have the correct driver installed before (see below at [windows users](#windows) - only install the driver, not the flashtool).
|
If you are on Windows you will need to have the correct driver installed before (see below at [windows users](#windows) - only install the driver, not the flashtool).
|
||||||
|
|
||||||
You can also install an update from the flash page but normally it is easier to do this from the Web Gui of the device (see [below](#update)).
|
You can also install an update from the flash page but normally it is easier to do this from the Web Gui of the device (see [below](#update)).
|
||||||
|
|
||||||
The [Flash Page](https://wellenvogel.de/software/esp32/install.html) will also allow you to open a console window to your ESP32.
|
The [Flash Page](https://wellenvogel.github.io/esp32-nmea2000/install.html) will also allow you to open a console window to your ESP32.
|
||||||
|
|
||||||
__Tool based__
|
__Tool based__
|
||||||
|
|
||||||
@@ -170,12 +170,6 @@ For details refer to the [example description](lib/exampletask/Readme.md).
|
|||||||
|
|
||||||
Changelog
|
Changelog
|
||||||
---------
|
---------
|
||||||
[20250305](../../releases/tag/20250305)
|
|
||||||
*********
|
|
||||||
* better handling for reconnect to a raspberry pi after reset [#102](../../issues/102)
|
|
||||||
* introduce _custom_config_, _custom_js_, _custom_css_, refer to [extending the core](lib/exampletask/Readme.md) [#100](../../pull/100)
|
|
||||||
* create VWR [#103](../../issues/103)
|
|
||||||
|
|
||||||
[20241128](../../releases/tag/20241128)
|
[20241128](../../releases/tag/20241128)
|
||||||
*********
|
*********
|
||||||
* additional correction for: USB connection on S3 stops [#81](../../issues/81)
|
* additional correction for: USB connection on S3 stops [#81](../../issues/81)
|
||||||
|
|||||||
@@ -19,12 +19,12 @@
|
|||||||
"flash_mode": "qio",
|
"flash_mode": "qio",
|
||||||
"hwids": [
|
"hwids": [
|
||||||
[
|
[
|
||||||
"0x1A86",
|
"0x303A",
|
||||||
"0x7523"
|
"0x1001"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"mcu": "esp32s3",
|
"mcu": "esp32s3",
|
||||||
"variant": "obp40s3"
|
"variant": "obp60s3_light"
|
||||||
},
|
},
|
||||||
"connectivity": [
|
"connectivity": [
|
||||||
"bluetooth",
|
"bluetooth",
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
"arduino",
|
"arduino",
|
||||||
"espidf"
|
"espidf"
|
||||||
],
|
],
|
||||||
"name": "OBP40 ESP32-S3-N8R8 (8 MB QD, 8 MB PSRAM)",
|
"name": "OBP60 Light ESP32-S3-N8R8 (8 MB QD, 8 MB PSRAM)",
|
||||||
"upload": {
|
"upload": {
|
||||||
"flash_size": "8MB",
|
"flash_size": "8MB",
|
||||||
"maximum_ram_size": 327680,
|
"maximum_ram_size": 327680,
|
||||||
Binary file not shown.
Binary file not shown.
@@ -114,13 +114,12 @@ def mergeConfig(base,other):
|
|||||||
print("merge custom config {}".format(cname))
|
print("merge custom config {}".format(cname))
|
||||||
with open(cname,'rb') as ah:
|
with open(cname,'rb') as ah:
|
||||||
base += json.load(ah)
|
base += json.load(ah)
|
||||||
continue
|
continue
|
||||||
cname=os.path.join(bdir,"config.json")
|
cname=os.path.join(bdir,"config.json")
|
||||||
if os.path.exists(cname):
|
if os.path.exists(cname):
|
||||||
print("merge config %s"%cname)
|
print("merge config {}".format(cname))
|
||||||
with open(cname,'rb') as ah:
|
with open(cname,'rb') as ah:
|
||||||
merge=json.load(ah)
|
base += json.load(ah)
|
||||||
base=base+merge
|
|
||||||
return base
|
return base
|
||||||
|
|
||||||
def replaceTexts(data,replacements):
|
def replaceTexts(data,replacements):
|
||||||
@@ -205,11 +204,6 @@ def generateCfg(inFile,outFile,impl):
|
|||||||
secret="false";
|
secret="false";
|
||||||
if item.get('type') == 'password':
|
if item.get('type') == 'password':
|
||||||
secret="true"
|
secret="true"
|
||||||
"""
|
|
||||||
PSRAM Allocator TODO Tests
|
|
||||||
new (heap_caps_malloc(sizeof(GwConfigInterface), MALLOC_CAP_SPIRAM))
|
|
||||||
"""
|
|
||||||
#data+=" new (heap_caps_malloc(sizeof(GwConfigInterface), MALLOC_CAP_SPIRAM)) GwConfigInterface(%s,\"%s\",%s);\n"%(name,item.get('default'),secret)
|
|
||||||
data+=" new GwConfigInterface(%s,\"%s\",%s);\n"%(name,item.get('default'),secret)
|
data+=" new GwConfigInterface(%s,\"%s\",%s);\n"%(name,item.get('default'),secret)
|
||||||
data+='}\n'
|
data+='}\n'
|
||||||
writeFileIfChanged(outFile,data)
|
writeFileIfChanged(outFile,data)
|
||||||
@@ -506,12 +500,10 @@ def prebuild(env):
|
|||||||
genereateUserTasks(os.path.join(outPath(), TASK_INCLUDE))
|
genereateUserTasks(os.path.join(outPath(), TASK_INCLUDE))
|
||||||
generateFile(os.path.join(basePath(),XDR_FILE),os.path.join(outPath(),XDR_INCLUDE),generateXdrMappings)
|
generateFile(os.path.join(basePath(),XDR_FILE),os.path.join(outPath(),XDR_INCLUDE),generateXdrMappings)
|
||||||
generateFile(os.path.join(basePath(),GROVE_CONFIG_IN),os.path.join(outPath(),GROVE_CONFIG),generateGroveDefs,inMode='r')
|
generateFile(os.path.join(basePath(),GROVE_CONFIG_IN),os.path.join(outPath(),GROVE_CONFIG),generateGroveDefs,inMode='r')
|
||||||
version = "dev{}{}".format(datetime.now().strftime("%Y%m%d"), "-ext")
|
version="dev"+datetime.now().strftime("%Y%m%d")
|
||||||
env.Append(CPPDEFINES=[('GWDEVVERSION',version)])
|
env.Append(CPPDEFINES=[('GWDEVVERSION',version)])
|
||||||
|
|
||||||
def cleangenerated(source, target, env):
|
def cleangenerated(source, target, env):
|
||||||
# TODO source / target order?
|
|
||||||
print("CLEAN: {} - {}".format(source, target))
|
|
||||||
od=outPath()
|
od=outPath()
|
||||||
if os.path.isdir(od):
|
if os.path.isdir(od):
|
||||||
print("#cleaning up %s"%od)
|
print("#cleaning up %s"%od)
|
||||||
@@ -521,6 +513,7 @@ def cleangenerated(source, target, env):
|
|||||||
fn=os.path.join(od,f)
|
fn=os.path.join(od,f)
|
||||||
os.unlink(f)
|
os.unlink(f)
|
||||||
|
|
||||||
|
|
||||||
print("#prescript...")
|
print("#prescript...")
|
||||||
prebuild(env)
|
prebuild(env)
|
||||||
board="PLATFORM_BOARD_%s"%env["BOARD"].replace("-","_").upper()
|
board="PLATFORM_BOARD_%s"%env["BOARD"].replace("-","_").upper()
|
||||||
@@ -532,17 +525,3 @@ 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)
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
#define _GWAPI_H
|
#define _GWAPI_H
|
||||||
#include "GwMessage.h"
|
#include "GwMessage.h"
|
||||||
#include "N2kMsg.h"
|
#include "N2kMsg.h"
|
||||||
#include "Nmea2kTwai.h"
|
|
||||||
#include "NMEA0183Msg.h"
|
#include "NMEA0183Msg.h"
|
||||||
#include "GWConfig.h"
|
#include "GWConfig.h"
|
||||||
#include "GwBoatData.h"
|
#include "GwBoatData.h"
|
||||||
@@ -24,7 +23,6 @@ class GwApi{
|
|||||||
bool formatSet=false;
|
bool formatSet=false;
|
||||||
public:
|
public:
|
||||||
double value=0;
|
double value=0;
|
||||||
String svalue="";
|
|
||||||
bool valid=false;
|
bool valid=false;
|
||||||
int source=-1;
|
int source=-1;
|
||||||
bool changed=false; //will be set by getBoatDataValues
|
bool changed=false; //will be set by getBoatDataValues
|
||||||
@@ -224,7 +222,6 @@ class GwApi{
|
|||||||
* accessing boat data must only be executed from within the main thread
|
* accessing boat data must only be executed from within the main thread
|
||||||
* you need to use the request pattern as shown in GwExampleTask.cpp
|
* you need to use the request pattern as shown in GwExampleTask.cpp
|
||||||
*/
|
*/
|
||||||
virtual Nmea2kTwai *getNMEA2000()=0;
|
|
||||||
virtual GwBoatData *getBoatData()=0;
|
virtual GwBoatData *getBoatData()=0;
|
||||||
virtual ~GwApi(){}
|
virtual ~GwApi(){}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,6 +2,11 @@
|
|||||||
#include <GwJsonDocument.h>
|
#include <GwJsonDocument.h>
|
||||||
#include <ArduinoJson/Json/TextFormatter.hpp>
|
#include <ArduinoJson/Json/TextFormatter.hpp>
|
||||||
#include "GWConfig.h"
|
#include "GWConfig.h"
|
||||||
|
#define GWTYPE_DOUBLE 1
|
||||||
|
#define GWTYPE_UINT32 2
|
||||||
|
#define GWTYPE_UINT16 3
|
||||||
|
#define GWTYPE_INT16 4
|
||||||
|
#define GWTYPE_USER 100
|
||||||
|
|
||||||
class GwBoatItemTypes
|
class GwBoatItemTypes
|
||||||
{
|
{
|
||||||
@@ -10,9 +15,7 @@ public:
|
|||||||
static int getType(const uint16_t &x) { return GWTYPE_UINT16; }
|
static int getType(const uint16_t &x) { return GWTYPE_UINT16; }
|
||||||
static int getType(const int16_t &x) { return GWTYPE_INT16; }
|
static int getType(const int16_t &x) { return GWTYPE_INT16; }
|
||||||
static int getType(const double &x) { return GWTYPE_DOUBLE; }
|
static int getType(const double &x) { return GWTYPE_DOUBLE; }
|
||||||
static int getType(const String &x) { return GWTYPE_STRING; }
|
|
||||||
static int getType(const GwSatInfoList &x) { return GWTYPE_USER + 1; }
|
static int getType(const GwSatInfoList &x) { return GWTYPE_USER + 1; }
|
||||||
static int getType(const GwAisTargetList &x) { return GWTYPE_USER + 1; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
bool GwBoatItemBase::isValid(unsigned long now) const
|
bool GwBoatItemBase::isValid(unsigned long now) const
|
||||||
@@ -249,10 +252,6 @@ static void writeToString(GwTextWriter *writer, const int16_t &value)
|
|||||||
{
|
{
|
||||||
writer->writeInteger(value);
|
writer->writeInteger(value);
|
||||||
}
|
}
|
||||||
static void writeToString(GwTextWriter *writer, String value)
|
|
||||||
{
|
|
||||||
writer->writeString(value.c_str());
|
|
||||||
}
|
|
||||||
static void writeToString(GwTextWriter *writer, GwSatInfoList &value)
|
static void writeToString(GwTextWriter *writer, GwSatInfoList &value)
|
||||||
{
|
{
|
||||||
writer->writeInteger(value.getNumSats());
|
writer->writeInteger(value.getNumSats());
|
||||||
@@ -289,8 +288,6 @@ template class GwBoatItem<double>;
|
|||||||
template class GwBoatItem<uint32_t>;
|
template class GwBoatItem<uint32_t>;
|
||||||
template class GwBoatItem<uint16_t>;
|
template class GwBoatItem<uint16_t>;
|
||||||
template class GwBoatItem<int16_t>;
|
template class GwBoatItem<int16_t>;
|
||||||
template class GwBoatItem<String>;
|
|
||||||
|
|
||||||
void GwSatInfoList::houseKeeping(unsigned long ts)
|
void GwSatInfoList::houseKeeping(unsigned long ts)
|
||||||
{
|
{
|
||||||
if (ts == 0)
|
if (ts == 0)
|
||||||
@@ -304,7 +301,6 @@ void GwSatInfoList::houseKeeping(unsigned long ts)
|
|||||||
}),
|
}),
|
||||||
sats.end());
|
sats.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GwSatInfoList::update(GwSatInfo entry, unsigned long validTill)
|
void GwSatInfoList::update(GwSatInfo entry, unsigned long validTill)
|
||||||
{
|
{
|
||||||
entry.validTill = validTill;
|
entry.validTill = validTill;
|
||||||
@@ -347,63 +343,6 @@ void GwBoatDataSatList::toJsonDoc(GwJsonDocument *doc, unsigned long minTime)
|
|||||||
GwBoatItem<GwSatInfoList>::toJsonDoc(doc, minTime);
|
GwBoatItem<GwSatInfoList>::toJsonDoc(doc, minTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GwAisTargetList::houseKeeping(unsigned long ts)
|
|
||||||
{
|
|
||||||
if (ts == 0) {
|
|
||||||
ts = millis();
|
|
||||||
}
|
|
||||||
targets.erase(
|
|
||||||
std::remove_if(
|
|
||||||
targets.begin(),
|
|
||||||
targets.end(),
|
|
||||||
[ts, this](const GwAisTarget &target) {
|
|
||||||
return target.validTill < ts;
|
|
||||||
}
|
|
||||||
),
|
|
||||||
targets.end()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GwAisTargetList::update(GwAisTarget target, unsigned long validTill)
|
|
||||||
{
|
|
||||||
target.validTill = validTill;
|
|
||||||
for (auto it = targets.begin(); it != targets.end(); it++) {
|
|
||||||
if (it->mmsi == target.mmsi) {
|
|
||||||
*it = target;
|
|
||||||
houseKeeping();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
houseKeeping();
|
|
||||||
targets.push_back(target);
|
|
||||||
}
|
|
||||||
|
|
||||||
GwBoatDataAisList::GwBoatDataAisList(String name, String formatInfo, GwBoatItemBase::TOType toType, GwBoatItemMap *map) : GwBoatItem<GwAisTargetList>(name, formatInfo, toType, map) {}
|
|
||||||
|
|
||||||
bool GwBoatDataAisList::update(GwAisTarget target, int source)
|
|
||||||
{
|
|
||||||
unsigned long now = millis();
|
|
||||||
if (isValid(now))
|
|
||||||
{
|
|
||||||
//priority handling
|
|
||||||
//sources with lower ids will win
|
|
||||||
//and we will not overwrite their value
|
|
||||||
if (lastUpdateSource < source)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lastUpdateSource = source;
|
|
||||||
uls(now);
|
|
||||||
data.update(target, now+invalidTime);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
void GwBoatDataAisList::toJsonDoc(GwJsonDocument *doc, unsigned long minTime)
|
|
||||||
{
|
|
||||||
data.houseKeeping();
|
|
||||||
GwBoatItem<GwAisTargetList>::toJsonDoc(doc, minTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
GwBoatData::GwBoatData(GwLog *logger, GwConfigHandler *cfg)
|
GwBoatData::GwBoatData(GwLog *logger, GwConfigHandler *cfg)
|
||||||
{
|
{
|
||||||
this->logger = logger;
|
this->logger = logger;
|
||||||
@@ -554,11 +493,6 @@ double formatKnots(double cv)
|
|||||||
return cv * 3600.0 / 1852.0;
|
return cv * 3600.0 / 1852.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
double formatKmh(double cv)
|
|
||||||
{
|
|
||||||
return cv *3600.0 / 1000.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t mtr2nm(uint32_t m)
|
uint32_t mtr2nm(uint32_t m)
|
||||||
{
|
{
|
||||||
return m / 1852;
|
return m / 1852;
|
||||||
@@ -573,11 +507,6 @@ bool convertToJson(const GwSatInfoList &si, JsonVariant &variant)
|
|||||||
return variant.set(si.getNumSats());
|
return variant.set(si.getNumSats());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool convertToJson(const GwAisTargetList &si, JsonVariant &variant)
|
|
||||||
{
|
|
||||||
return variant.set(si.getNumTargets());
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _UNDEF
|
#ifdef _UNDEF
|
||||||
#include <ArduinoJson/Json/TextFormatter.hpp>
|
#include <ArduinoJson/Json/TextFormatter.hpp>
|
||||||
|
|
||||||
@@ -594,4 +523,4 @@ public:
|
|||||||
};
|
};
|
||||||
static XWriter xwriter;
|
static XWriter xwriter;
|
||||||
ARDUINOJSON_NAMESPACE::TextFormatter<XWriter> testWriter(xwriter);
|
ARDUINOJSON_NAMESPACE::TextFormatter<XWriter> testWriter(xwriter);
|
||||||
#endif
|
#endif
|
||||||
@@ -9,13 +9,6 @@
|
|||||||
#define GW_BOAT_VALUE_LEN 32
|
#define GW_BOAT_VALUE_LEN 32
|
||||||
#define GWSC(name) static constexpr const char* name=#name
|
#define GWSC(name) static constexpr const char* name=#name
|
||||||
|
|
||||||
#define GWTYPE_DOUBLE 1
|
|
||||||
#define GWTYPE_UINT32 2
|
|
||||||
#define GWTYPE_UINT16 3
|
|
||||||
#define GWTYPE_INT16 4
|
|
||||||
#define GWTYPE_STRING 5
|
|
||||||
#define GWTYPE_USER 100
|
|
||||||
|
|
||||||
//see https://github.com/wellenvogel/esp32-nmea2000/issues/44
|
//see https://github.com/wellenvogel/esp32-nmea2000/issues/44
|
||||||
//factor to convert from N2k/SI rad/s to current NMEA rad/min
|
//factor to convert from N2k/SI rad/s to current NMEA rad/min
|
||||||
#define ROT_WA_FACTOR 60
|
#define ROT_WA_FACTOR 60
|
||||||
@@ -65,7 +58,6 @@ class GwBoatItemBase{
|
|||||||
GWSC(formatRot);
|
GWSC(formatRot);
|
||||||
GWSC(formatDate);
|
GWSC(formatDate);
|
||||||
GWSC(formatTime);
|
GWSC(formatTime);
|
||||||
GWSC(formatName);
|
|
||||||
protected:
|
protected:
|
||||||
int type;
|
int type;
|
||||||
unsigned long lastSet=0;
|
unsigned long lastSet=0;
|
||||||
@@ -100,7 +92,6 @@ class GwBoatItemBase{
|
|||||||
virtual int getLastSource(){return lastUpdateSource;}
|
virtual int getLastSource(){return lastUpdateSource;}
|
||||||
virtual void refresh(unsigned long ts=0){uls(ts);}
|
virtual void refresh(unsigned long ts=0){uls(ts);}
|
||||||
virtual double getDoubleValue()=0;
|
virtual double getDoubleValue()=0;
|
||||||
virtual String getStringValue()=0;
|
|
||||||
String getName(){return name;}
|
String getName(){return name;}
|
||||||
const String & getFormat() const{return format;}
|
const String & getFormat() const{return format;}
|
||||||
virtual void setInvalidTime(GwConfigHandler *cfg);
|
virtual void setInvalidTime(GwConfigHandler *cfg);
|
||||||
@@ -129,17 +120,7 @@ template<class T> class GwBoatItem : public GwBoatItemBase{
|
|||||||
if (! isValid(millis())) return defaultv;
|
if (! isValid(millis())) return defaultv;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
virtual double getDoubleValue(){
|
virtual double getDoubleValue(){return (double)data;}
|
||||||
if constexpr (std::is_same<T, String>::value) {
|
|
||||||
return 0.0; // TODO any better ideas?
|
|
||||||
} else {
|
|
||||||
return (double)data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
virtual String getStringValue(){
|
|
||||||
return (String)data;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void fillString();
|
virtual void fillString();
|
||||||
virtual void toJsonDoc(GwJsonDocument *doc, unsigned long minTime);
|
virtual void toJsonDoc(GwJsonDocument *doc, unsigned long minTime);
|
||||||
virtual int getLastSource(){return lastUpdateSource;}
|
virtual int getLastSource(){return lastUpdateSource;}
|
||||||
@@ -148,7 +129,6 @@ double formatCourse(double cv);
|
|||||||
double formatDegToRad(double deg);
|
double formatDegToRad(double deg);
|
||||||
double formatWind(double cv);
|
double formatWind(double cv);
|
||||||
double formatKnots(double cv);
|
double formatKnots(double cv);
|
||||||
double formatKmh(double cv);
|
|
||||||
uint32_t mtr2nm(uint32_t m);
|
uint32_t mtr2nm(uint32_t m);
|
||||||
double mtr2nm(double m);
|
double mtr2nm(double m);
|
||||||
|
|
||||||
@@ -196,55 +176,6 @@ public:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class GwAisTarget {
|
|
||||||
public:
|
|
||||||
uint32_t mmsi;
|
|
||||||
char callsign[8];
|
|
||||||
char name[21];
|
|
||||||
uint8_t vesseltype;
|
|
||||||
double lat;
|
|
||||||
double lon;
|
|
||||||
float length;
|
|
||||||
float beam;
|
|
||||||
float sog;
|
|
||||||
float cog;
|
|
||||||
unsigned long validTill;
|
|
||||||
};
|
|
||||||
|
|
||||||
class GwAisTargetList {
|
|
||||||
public:
|
|
||||||
static const GwBoatItemBase::TOType toType=GwBoatItemBase::TOType::ais;
|
|
||||||
std::vector<GwAisTarget> targets;
|
|
||||||
void houseKeeping(unsigned long ts=0);
|
|
||||||
void update(GwAisTarget target, unsigned long validTill);
|
|
||||||
int getNumTargets() const {
|
|
||||||
return targets.size();
|
|
||||||
}
|
|
||||||
GwAisTarget *getAt(int idx){
|
|
||||||
if (idx >= 0 && idx < targets.size()) return &targets.at(idx);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
operator double(){ return getNumTargets();}
|
|
||||||
};
|
|
||||||
|
|
||||||
class GwBoatDataAisList : public GwBoatItem<GwAisTargetList> {
|
|
||||||
public:
|
|
||||||
GwBoatDataAisList(String name, String formatInfo, GwBoatItemBase::TOType toType, GwBoatItemMap *map = NULL);
|
|
||||||
bool update(GwAisTarget target, int source);
|
|
||||||
virtual void toJsonDoc(GwJsonDocument *doc, unsigned long minTime);
|
|
||||||
GwAisTarget *getAt(int idx) {
|
|
||||||
if (! isValid()) return NULL;
|
|
||||||
return data.getAt(idx);
|
|
||||||
}
|
|
||||||
int getNumTargets(){
|
|
||||||
if (! isValid()) return 0;
|
|
||||||
return data.getNumTargets();
|
|
||||||
}
|
|
||||||
virtual double getDoubleValue(){
|
|
||||||
return (double)(data.getNumTargets());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class GwBoatItemNameProvider
|
class GwBoatItemNameProvider
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -303,9 +234,7 @@ class GwBoatData{
|
|||||||
GWBOATDATA(double,XTE,formatXte) // cross track error
|
GWBOATDATA(double,XTE,formatXte) // cross track error
|
||||||
GWBOATDATA(double,WPLat,formatLatitude) // waypoint latitude
|
GWBOATDATA(double,WPLat,formatLatitude) // waypoint latitude
|
||||||
GWBOATDATA(double,WPLon,formatLongitude) // waypoint longitude
|
GWBOATDATA(double,WPLon,formatLongitude) // waypoint longitude
|
||||||
GWBOATDATA(String,WPName,formatName) // waypoint name
|
|
||||||
GWSPECBOATDATA(GwBoatDataSatList,SatInfo,GwSatInfoList::toType,formatFixed0);
|
GWSPECBOATDATA(GwBoatDataSatList,SatInfo,GwSatInfoList::toType,formatFixed0);
|
||||||
GWSPECBOATDATA(GwBoatDataAisList,AisTarget,GwAisTargetList::toType,formatFixed0);
|
|
||||||
public:
|
public:
|
||||||
GwBoatData(GwLog *logger, GwConfigHandler *cfg);
|
GwBoatData(GwLog *logger, GwConfigHandler *cfg);
|
||||||
~GwBoatData();
|
~GwBoatData();
|
||||||
@@ -322,4 +251,4 @@ class GwBoatData{
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -27,19 +27,18 @@ class DummyConfig : public GwConfigInterface{
|
|||||||
};
|
};
|
||||||
|
|
||||||
DummyConfig dummyConfig;
|
DummyConfig dummyConfig;
|
||||||
void GwConfigHandler::logConfig(int level) const
|
String GwConfigHandler::toString() const{
|
||||||
{
|
String rt;
|
||||||
if (!logger->isActive(level))
|
rt+="Config: ";
|
||||||
return;
|
for (int i=0;i<getNumConfig();i++){
|
||||||
for (int i = 0; i < getNumConfig(); i++)
|
rt+=configs[i]->getName();
|
||||||
{
|
rt+="=";
|
||||||
String v=configs[i]->asString();
|
rt+=configs[i]->asString();
|
||||||
bool isChanged=v != configs[i]->getDefault();
|
rt+=", ";
|
||||||
logger->logDebug(level, "Config[%s]%s='%s'", configs[i]->getName().c_str(),isChanged?"*":"", configs[i]->isSecret() ? "***" : configs[i]->asString().c_str());
|
}
|
||||||
if ((i%20) == 19) logger->flush();
|
return rt;
|
||||||
}
|
}
|
||||||
logger->flush();
|
|
||||||
}
|
|
||||||
String GwConfigHandler::toJson() const{
|
String GwConfigHandler::toJson() const{
|
||||||
String rt;
|
String rt;
|
||||||
int num=getNumConfig();
|
int num=getNumConfig();
|
||||||
@@ -81,9 +80,6 @@ GwConfigHandler::~GwConfigHandler(){
|
|||||||
bool GwConfigHandler::loadConfig(){
|
bool GwConfigHandler::loadConfig(){
|
||||||
prefs->begin(PREF_NAME,true);
|
prefs->begin(PREF_NAME,true);
|
||||||
for (int i=0;i<getNumConfig();i++){
|
for (int i=0;i<getNumConfig();i++){
|
||||||
if (!prefs->isKey(configs[i]->getName().c_str())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
String v=prefs->getString(configs[i]->getName().c_str(),configs[i]->getDefault());
|
String v=prefs->getString(configs[i]->getName().c_str(),configs[i]->getDefault());
|
||||||
configs[i]->value=v;
|
configs[i]->value=v;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class GwConfigHandler: public GwConfigDefinitions{
|
|||||||
void stopChanges();
|
void stopChanges();
|
||||||
bool updateValue(String name, String value);
|
bool updateValue(String name, String value);
|
||||||
bool reset();
|
bool reset();
|
||||||
void logConfig(int level) const;
|
String toString() const;
|
||||||
String toJson() const;
|
String toJson() const;
|
||||||
String getString(const String name,const String defaultv="") const;
|
String getString(const String name,const String defaultv="") const;
|
||||||
bool getBool(const String name,bool defaultv=false) const ;
|
bool getBool(const String name,bool defaultv=false) const ;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ Files
|
|||||||
* [platformio.ini](platformio.ini)<br>
|
* [platformio.ini](platformio.ini)<br>
|
||||||
This file is completely optional.
|
This file is completely optional.
|
||||||
You only need this if you want to
|
You only need this if you want to
|
||||||
extend the base configuration - we add a dummy library here and define additional build environments (boards)
|
extend the base configuration - we add a dummy library here and define one additional build environment (board)
|
||||||
* [GwExampleTask.h](GwExampleTask.h) the name of this include must match the name of the directory (ignoring case) with a "gw" in front. This file includes our special hardware definitions and registers our task at the core.<br>
|
* [GwExampleTask.h](GwExampleTask.h) the name of this include must match the name of the directory (ignoring case) with a "gw" in front. This file includes our special hardware definitions and registers our task at the core.<br>
|
||||||
This registration can be done statically using [DECLARE_USERTASK](https://github.com/wellenvogel/esp32-nmea2000/blob/9b955d135d74937a60f2926e8bfb9395585ff8cd/lib/api/GwApi.h#L202) in the header file. <br>
|
This registration can be done statically using [DECLARE_USERTASK](https://github.com/wellenvogel/esp32-nmea2000/blob/9b955d135d74937a60f2926e8bfb9395585ff8cd/lib/api/GwApi.h#L202) in the header file. <br>
|
||||||
As an alternative we just only register an [initialization function](https://github.com/wellenvogel/esp32-nmea2000/blob/9b955d135d74937a60f2926e8bfb9395585ff8cd/lib/exampletask/GwExampleTask.h#L19) using DECLARE_INITFUNCTION and later on register the task function itself via the [API](https://github.com/wellenvogel/esp32-nmea2000/blob/9b955d135d74937a60f2926e8bfb9395585ff8cd/lib/exampletask/GwExampleTask.cpp#L32).<br>
|
As an alternative we just only register an [initialization function](https://github.com/wellenvogel/esp32-nmea2000/blob/9b955d135d74937a60f2926e8bfb9395585ff8cd/lib/exampletask/GwExampleTask.h#L19) using DECLARE_INITFUNCTION and later on register the task function itself via the [API](https://github.com/wellenvogel/esp32-nmea2000/blob/9b955d135d74937a60f2926e8bfb9395585ff8cd/lib/exampletask/GwExampleTask.cpp#L32).<br>
|
||||||
@@ -28,13 +28,11 @@ Files
|
|||||||
|
|
||||||
* [GwExampleTaks.cpp](GwExampleTask.cpp) includes the implementation of our task. This tasks runs in an own thread - see the comments in the code.
|
* [GwExampleTaks.cpp](GwExampleTask.cpp) includes the implementation of our task. This tasks runs in an own thread - see the comments in the code.
|
||||||
We can have as many cpp (and header files) as we need to structure our code.
|
We can have as many cpp (and header files) as we need to structure our code.
|
||||||
* [config.json](exampleConfig.json)<br>
|
* [config.json](config.json)<br>
|
||||||
This file allows to add some config definitions that are needed for our task. For the possible options have a look at the global [config.json](../../web/config.json). Be careful not to overwrite config defitions from the global file. A good practice wood be to prefix the names of definitions with parts of the library name. Always put them in a separate category so that they do not interfere with the system ones.
|
This file allows to add some config definitions that are needed for our task. For the possible options have a look at the global [config.json](../../web/config.json). Be careful not to overwrite config defitions from the global file. A good practice wood be to prefix the names of definitions with parts of the library name. Always put them in a separate category so that they do not interfere with the system ones.
|
||||||
The defined config items can later be accessed in the code (see the example in [GwExampleTask.cpp](GwExampleTask.cpp)).<br>
|
The defined config items can later be accessed in the code (see the example in [GwExampleTask.cpp](GwExampleTask.cpp)).
|
||||||
|
|
||||||
Starting from Version 20250305 you should normally not use this file name any more as those configs would be added for all build environments. Instead define a parameter _custom_config_ in your [platformio.ini](platformio.ini) for the environments you would like to add some configurations for. This parameter accepts a list of file names (relative to the project root, separated by ,).
|
|
||||||
|
|
||||||
* [index.js](example.js)<br>
|
* [index.js](index.js)<br>
|
||||||
You can add javascript code that will contribute to the UI of the system. The WebUI provides a small API that allows you to "hook" into some functions to include your own parts of the UI. This includes adding new tabs, modifying/replacing the data display items, modifying the status display or accessing the config items.
|
You can add javascript code that will contribute to the UI of the system. The WebUI provides a small API that allows you to "hook" into some functions to include your own parts of the UI. This includes adding new tabs, modifying/replacing the data display items, modifying the status display or accessing the config items.
|
||||||
For the API refer to [../../web/index.js](../../web/index.js#L2001).
|
For the API refer to [../../web/index.js](../../web/index.js#L2001).
|
||||||
To start interacting just register for some events like api.EVENTS.init. You can check the capabilities you have defined to see if your task is active.
|
To start interacting just register for some events like api.EVENTS.init. You can check the capabilities you have defined to see if your task is active.
|
||||||
@@ -48,14 +46,10 @@ Files
|
|||||||
tools/testServer.py nnn http://x.x.x.x/api
|
tools/testServer.py nnn http://x.x.x.x/api
|
||||||
```
|
```
|
||||||
with nnn being the local port and x.x.x.x the address of a running system. Open `http://localhost:nnn` in your browser.<br>
|
with nnn being the local port and x.x.x.x the address of a running system. Open `http://localhost:nnn` in your browser.<br>
|
||||||
After a change just start the compilation and reload the page.<br>
|
After a change just start the compilation and reload the page.
|
||||||
|
|
||||||
Starting from Version 20250305 you should normally not use this file name any more as those js code would be added for all build environments. Instead define a parameter _custom_js_ in your [platformio.ini](platformio.ini) for the environments you would like to add the js code for. This parameter accepts a list of file names (relative to the project root, separated by ,). This will also allow you to skip the check for capabilities in your code.
|
|
||||||
|
|
||||||
* [index.css](index.css)<br>
|
* [index.css](index.css)<br>
|
||||||
You can add own css to influence the styling of the display.<br>
|
You can add own css to influence the styling of the display.
|
||||||
|
|
||||||
Starting from Version 20250305 you should normally not use this file name any more as those styles would be added for all build environments. Instead define a parameter _custom_css_ in your [platformio.ini](platformio.ini) for the environments you would like to add some styles for. This parameter accepts a list of file names (relative to the project root, separated by , or as multi line entry)
|
|
||||||
|
|
||||||
|
|
||||||
Interfaces
|
Interfaces
|
||||||
|
|||||||
@@ -10,9 +10,5 @@ lib_deps =
|
|||||||
build_flags=
|
build_flags=
|
||||||
-D BOARD_TEST
|
-D BOARD_TEST
|
||||||
${env.build_flags}
|
${env.build_flags}
|
||||||
custom_config=
|
|
||||||
lib/exampletask/exampleConfig.json
|
|
||||||
custom_js=lib/exampletask/example.js
|
|
||||||
custom_css=lib/exampletask/example.css
|
|
||||||
upload_port = /dev/esp32
|
upload_port = /dev/esp32
|
||||||
upload_protocol = esptool
|
upload_protocol = esptool
|
||||||
@@ -79,7 +79,7 @@ GwUpdate::GwUpdate(GwLog *log, GwWebServer *webserver, PasswordChecker ckr)
|
|||||||
}
|
}
|
||||||
if (!param->hasError())
|
if (!param->hasError())
|
||||||
{
|
{
|
||||||
const AsyncWebParameter *hash=request->getParam("_hash");
|
AsyncWebParameter *hash=request->getParam("_hash");
|
||||||
if (! hash){
|
if (! hash){
|
||||||
hash=request->getParam("_hash",true);
|
hash=request->getParam("_hash",true);
|
||||||
}
|
}
|
||||||
@@ -141,4 +141,4 @@ GwUpdate::GwUpdate(GwLog *log, GwWebServer *webserver, PasswordChecker ckr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -27,7 +27,7 @@ void sendEmbeddedFile(String name,String contentType,AsyncWebServerRequest *requ
|
|||||||
std::map<String,EmbeddedFile*>::iterator it=embeddedFiles.find(name);
|
std::map<String,EmbeddedFile*>::iterator it=embeddedFiles.find(name);
|
||||||
if (it != embeddedFiles.end()){
|
if (it != embeddedFiles.end()){
|
||||||
EmbeddedFile* found=it->second;
|
EmbeddedFile* found=it->second;
|
||||||
AsyncWebServerResponse *response=request->beginResponse(200, contentType, found->start, found->len);
|
AsyncWebServerResponse *response=request->beginResponse_P(200,contentType,found->start,found->len);
|
||||||
response->addHeader(F("Content-Encoding"), F("gzip"));
|
response->addHeader(F("Content-Encoding"), F("gzip"));
|
||||||
request->send(response);
|
request->send(response);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,6 @@ bool GwWifi::connectInternal(){
|
|||||||
if (wifiClient->asBoolean()){
|
if (wifiClient->asBoolean()){
|
||||||
clientIsConnected=false;
|
clientIsConnected=false;
|
||||||
LOG_DEBUG(GwLog::LOG,"creating wifiClient ssid=%s",wifiSSID->asString().c_str());
|
LOG_DEBUG(GwLog::LOG,"creating wifiClient ssid=%s",wifiSSID->asString().c_str());
|
||||||
WiFi.setAutoReconnect(false); //#102
|
|
||||||
wl_status_t rt=WiFi.begin(wifiSSID->asCString(),wifiPass->asCString());
|
wl_status_t rt=WiFi.begin(wifiSSID->asCString(),wifiPass->asCString());
|
||||||
LOG_DEBUG(GwLog::LOG,"wifiClient connect returns %d",(int)rt);
|
LOG_DEBUG(GwLog::LOG,"wifiClient connect returns %d",(int)rt);
|
||||||
lastConnectStart=millis();
|
lastConnectStart=millis();
|
||||||
@@ -93,8 +92,7 @@ bool GwWifi::connectInternal(){
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//#102: we should have a wifi connect retry being > 30s - with some headroom
|
#define RETRY_MILLIS 20000
|
||||||
#define RETRY_MILLIS 40000
|
|
||||||
void GwWifi::loop(){
|
void GwWifi::loop(){
|
||||||
if (wifiClient->asBoolean())
|
if (wifiClient->asBoolean())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -351,11 +351,10 @@ private:
|
|||||||
rmb.vmg
|
rmb.vmg
|
||||||
);
|
);
|
||||||
send(n2kMsg,msg.sourceId);
|
send(n2kMsg,msg.sourceId);
|
||||||
SetN2kRouteWPInfo(n2kMsg,sourceId,1,1,N2kdir_forward,"default");
|
SetN2kPGN129285(n2kMsg,sourceId,1,1,true,true,"default");
|
||||||
AppendN2kRouteWPInfo(n2kMsg,destinationId,rmb.destID,rmb.latitude,rmb.longitude);
|
AppendN2kPGN129285(n2kMsg,destinationId,rmb.destID,rmb.latitude,rmb.longitude);
|
||||||
send(n2kMsg,msg.sourceId);
|
send(n2kMsg,msg.sourceId);
|
||||||
}
|
}
|
||||||
boatData->WPName->update(String(rmb.destID), msg.sourceId);
|
|
||||||
}
|
}
|
||||||
void convertRMC(const SNMEA0183Msg &msg)
|
void convertRMC(const SNMEA0183Msg &msg)
|
||||||
{
|
{
|
||||||
@@ -639,8 +638,8 @@ private:
|
|||||||
for (int i=0;i< 3;i++){
|
for (int i=0;i< 3;i++){
|
||||||
if (msg.FieldLen(0)>0){
|
if (msg.FieldLen(0)>0){
|
||||||
Depth=atof(msg.Field(0));
|
Depth=atof(msg.Field(0));
|
||||||
char du=msg.Field(i+1)[0];
|
char dt=msg.Field(i+1)[0];
|
||||||
switch(du){
|
switch(dt){
|
||||||
case 'f':
|
case 'f':
|
||||||
Depth=Depth/mToFeet;
|
Depth=Depth/mToFeet;
|
||||||
break;
|
break;
|
||||||
@@ -663,9 +662,8 @@ private:
|
|||||||
//we can only send if we have a valid depth beloww tranducer
|
//we can only send if we have a valid depth beloww tranducer
|
||||||
//to compute the offset
|
//to compute the offset
|
||||||
if (! boatData->DBT->isValid()) return;
|
if (! boatData->DBT->isValid()) return;
|
||||||
double dbt=boatData->DBT->getData();
|
double offset=Depth-boatData->DBT->getData();
|
||||||
double offset=Depth-dbt;
|
if (offset >= 0 && dt == DBT){
|
||||||
if (offset >= 0 && dt == DBK){
|
|
||||||
logger->logDebug(GwLog::DEBUG, "strange DBK - more depth then transducer %s", msg.line);
|
logger->logDebug(GwLog::DEBUG, "strange DBK - more depth then transducer %s", msg.line);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -677,8 +675,8 @@ private:
|
|||||||
if (! boatData->DBS->update(Depth,msg.sourceId)) return;
|
if (! boatData->DBS->update(Depth,msg.sourceId)) return;
|
||||||
}
|
}
|
||||||
tN2kMsg n2kMsg;
|
tN2kMsg n2kMsg;
|
||||||
SetN2kWaterDepth(n2kMsg,1,dbt,offset); //on the N2K side we always have depth below transducer
|
SetN2kWaterDepth(n2kMsg,1,Depth,offset);
|
||||||
send(n2kMsg,msg.sourceId,(n2kMsg.PGN)+String((offset >=0)?1:0));
|
send(n2kMsg,msg.sourceId,(n2kMsg.PGN)+String((offset != N2kDoubleNA)?1:0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -267,29 +267,21 @@ private:
|
|||||||
double DepthBelowTransducer;
|
double DepthBelowTransducer;
|
||||||
double Offset;
|
double Offset;
|
||||||
double Range;
|
double Range;
|
||||||
|
double WaterDepth;
|
||||||
if (ParseN2kWaterDepth(N2kMsg, SID, DepthBelowTransducer, Offset, Range))
|
if (ParseN2kWaterDepth(N2kMsg, SID, DepthBelowTransducer, Offset, Range))
|
||||||
{
|
{
|
||||||
if (updateDouble(boatData->DBT, DepthBelowTransducer))
|
|
||||||
|
WaterDepth = DepthBelowTransducer + Offset;
|
||||||
|
updateDouble(boatData->DBS, WaterDepth);
|
||||||
|
updateDouble(boatData->DBT,DepthBelowTransducer);
|
||||||
|
tNMEA0183Msg NMEA0183Msg;
|
||||||
|
if (NMEA0183SetDPT(NMEA0183Msg, DepthBelowTransducer, Offset,talkerId))
|
||||||
{
|
{
|
||||||
tNMEA0183Msg NMEA0183Msg;
|
SendMessage(NMEA0183Msg);
|
||||||
bool offsetValid=true;
|
}
|
||||||
if (N2kIsNA(Offset)) {
|
if (NMEA0183SetDBx(NMEA0183Msg, DepthBelowTransducer, Offset,talkerId))
|
||||||
Offset=NMEA0183DoubleNA;
|
{
|
||||||
offsetValid=false;
|
SendMessage(NMEA0183Msg);
|
||||||
}
|
|
||||||
if (NMEA0183SetDPT(NMEA0183Msg, DepthBelowTransducer, Offset, talkerId))
|
|
||||||
{
|
|
||||||
SendMessage(NMEA0183Msg);
|
|
||||||
}
|
|
||||||
if (offsetValid)
|
|
||||||
{
|
|
||||||
double WaterDepth = DepthBelowTransducer + Offset;
|
|
||||||
updateDouble(boatData->DBS, WaterDepth);
|
|
||||||
}
|
|
||||||
if (NMEA0183SetDBx(NMEA0183Msg, DepthBelowTransducer, Offset, talkerId))
|
|
||||||
{
|
|
||||||
SendMessage(NMEA0183Msg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -536,31 +528,6 @@ private:
|
|||||||
{
|
{
|
||||||
SendMessage(NMEA0183Msg);
|
SendMessage(NMEA0183Msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shouldSend && NMEA0183Reference == NMEA0183Wind_Apparent)
|
|
||||||
{
|
|
||||||
double wa = formatCourse(WindAngle);
|
|
||||||
if (!NMEA0183Msg.Init("VWR", talkerId))
|
|
||||||
return;
|
|
||||||
if (!NMEA0183Msg.AddDoubleField(( wa > 180 ) ? 360-wa : wa))
|
|
||||||
return;
|
|
||||||
if (!NMEA0183Msg.AddStrField(( wa >= 0 && wa <= 180) ? 'R' : 'L'))
|
|
||||||
return;
|
|
||||||
if (!NMEA0183Msg.AddDoubleField(formatKnots(WindSpeed)))
|
|
||||||
return;
|
|
||||||
if (!NMEA0183Msg.AddStrField("N"))
|
|
||||||
return;
|
|
||||||
if (!NMEA0183Msg.AddDoubleField(WindSpeed))
|
|
||||||
return;
|
|
||||||
if (!NMEA0183Msg.AddStrField("M"))
|
|
||||||
return;
|
|
||||||
if (!NMEA0183Msg.AddDoubleField(formatKmh(WindSpeed)))
|
|
||||||
return;
|
|
||||||
if (!NMEA0183Msg.AddStrField("K"))
|
|
||||||
return;
|
|
||||||
|
|
||||||
SendMessage(NMEA0183Msg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if (WindReference == N2kWind_Apparent && boatData->SOG->isValid())
|
/* if (WindReference == N2kWind_Apparent && boatData->SOG->isValid())
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
#ifdef BOARD_OBP60S3
|
||||||
|
|
||||||
/****************************************************
|
/****************************************************
|
||||||
AMS 5600 class for Arduino platform
|
AMS 5600 class for Arduino platform
|
||||||
|
|||||||
@@ -1,190 +0,0 @@
|
|||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "BoatDataCalibration.h"
|
|
||||||
#include <cmath>
|
|
||||||
#include <math.h>
|
|
||||||
#include <unordered_map>
|
|
||||||
|
|
||||||
CalibrationDataList calibrationData;
|
|
||||||
std::unordered_map<std::string, TypeCalibData> CalibrationDataList::calibMap; // list of calibration data instances
|
|
||||||
|
|
||||||
void CalibrationDataList::readConfig(GwConfigHandler* config, GwLog* logger)
|
|
||||||
// Initial load of calibration data into internal list
|
|
||||||
// This method is called once at init phase of <obp60task> to read the configuration values
|
|
||||||
{
|
|
||||||
std::string instance;
|
|
||||||
double offset;
|
|
||||||
double slope;
|
|
||||||
double smooth;
|
|
||||||
|
|
||||||
String calInstance = "";
|
|
||||||
String calOffset = "";
|
|
||||||
String calSlope = "";
|
|
||||||
String calSmooth = "";
|
|
||||||
|
|
||||||
// Load user format configuration values
|
|
||||||
String lengthFormat = config->getString(config->lengthFormat); // [m|ft]
|
|
||||||
String distanceFormat = config->getString(config->distanceFormat); // [m|km|nm]
|
|
||||||
String speedFormat = config->getString(config->speedFormat); // [m/s|km/h|kn]
|
|
||||||
String windspeedFormat = config->getString(config->windspeedFormat); // [m/s|km/h|kn|bft]
|
|
||||||
String tempFormat = config->getString(config->tempFormat); // [K|C|F]
|
|
||||||
|
|
||||||
// Read calibration settings for data instances
|
|
||||||
for (int i = 0; i < MAX_CALIBRATION_DATA; i++) {
|
|
||||||
calInstance = "calInstance" + String(i + 1);
|
|
||||||
calOffset = "calOffset" + String(i + 1);
|
|
||||||
calSlope = "calSlope" + String(i + 1);
|
|
||||||
calSmooth = "calSmooth" + String(i + 1);
|
|
||||||
|
|
||||||
instance = std::string(config->getString(calInstance, "---").c_str());
|
|
||||||
if (instance == "---") {
|
|
||||||
logger->logDebug(GwLog::LOG, "no calibration data for instance no. %d", i + 1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
calibMap[instance] = { 0.0f, 1.0f, 1.0f, 0.0f, false };
|
|
||||||
offset = (config->getString(calOffset, "")).toFloat();
|
|
||||||
slope = (config->getString(calSlope, "")).toFloat();
|
|
||||||
smooth = (config->getString(calSmooth, "")).toInt(); // user input is int; further math is done with double
|
|
||||||
|
|
||||||
// Convert calibration values to internal standard formats
|
|
||||||
if (instance == "AWS" || instance == "TWS") {
|
|
||||||
if (windspeedFormat == "m/s") {
|
|
||||||
// No conversion needed
|
|
||||||
} else if (windspeedFormat == "km/h") {
|
|
||||||
offset /= 3.6; // Convert km/h to m/s
|
|
||||||
} else if (windspeedFormat == "kn") {
|
|
||||||
offset /= 1.94384; // Convert kn to m/s
|
|
||||||
} else if (windspeedFormat == "bft") {
|
|
||||||
offset *= 2 + (offset / 2); // Convert Bft to m/s (approx) -> to be improved
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (instance == "AWA" || instance == "COG" || instance == "TWA" || instance == "TWD" || instance == "HDM" || instance == "PRPOS" || instance == "RPOS") {
|
|
||||||
offset *= M_PI / 180; // Convert deg to rad
|
|
||||||
|
|
||||||
} else if (instance == "DBT") {
|
|
||||||
if (lengthFormat == "m") {
|
|
||||||
// No conversion needed
|
|
||||||
} else if (lengthFormat == "ft") {
|
|
||||||
offset /= 3.28084; // Convert ft to m
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (instance == "SOG" || instance == "STW") {
|
|
||||||
if (speedFormat == "m/s") {
|
|
||||||
// No conversion needed
|
|
||||||
} else if (speedFormat == "km/h") {
|
|
||||||
offset /= 3.6; // Convert km/h to m/s
|
|
||||||
} else if (speedFormat == "kn") {
|
|
||||||
offset /= 1.94384; // Convert kn to m/s
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (instance == "WTemp") {
|
|
||||||
if (tempFormat == "K" || tempFormat == "C") {
|
|
||||||
// No conversion needed
|
|
||||||
} else if (tempFormat == "F") {
|
|
||||||
offset *= 9.0 / 5.0; // Convert °F to K
|
|
||||||
slope *= 9.0 / 5.0; // Convert °F to K
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// transform smoothing factor from {0.01..10} to {0.3..0.95} and invert for exponential smoothing formula
|
|
||||||
if (smooth <= 0) {
|
|
||||||
smooth = 0;
|
|
||||||
} else {
|
|
||||||
if (smooth > 10) {
|
|
||||||
smooth = 10;
|
|
||||||
}
|
|
||||||
smooth = 0.3 + ((smooth - 0.01) * (0.95 - 0.3) / (10 - 0.01));
|
|
||||||
}
|
|
||||||
smooth = 1 - smooth;
|
|
||||||
|
|
||||||
calibMap[instance].offset = offset;
|
|
||||||
calibMap[instance].slope = slope;
|
|
||||||
calibMap[instance].smooth = smooth;
|
|
||||||
calibMap[instance].isCalibrated = false;
|
|
||||||
logger->logDebug(GwLog::LOG, "calibration data: %s, offset: %f, slope: %f, smoothing: %f", instance.c_str(),
|
|
||||||
calibMap[instance].offset, calibMap[instance].slope, calibMap[instance].smooth);
|
|
||||||
}
|
|
||||||
logger->logDebug(GwLog::LOG, "all calibration data read");
|
|
||||||
}
|
|
||||||
|
|
||||||
void CalibrationDataList::calibrateInstance(GwApi::BoatValue* boatDataValue, GwLog* logger)
|
|
||||||
// Method to calibrate the boat data value
|
|
||||||
{
|
|
||||||
std::string instance = boatDataValue->getName().c_str();
|
|
||||||
double offset = 0;
|
|
||||||
double slope = 1.0;
|
|
||||||
double dataValue = 0;
|
|
||||||
std::string format = "";
|
|
||||||
|
|
||||||
if (calibMap.find(instance) == calibMap.end()) {
|
|
||||||
logger->logDebug(GwLog::DEBUG, "BoatDataCalibration: %s not in calibration list", instance.c_str());
|
|
||||||
return;
|
|
||||||
} else if (!boatDataValue->valid) { // no valid boat data value, so we don't want to apply calibration data
|
|
||||||
calibMap[instance].isCalibrated = false;
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
offset = calibMap[instance].offset;
|
|
||||||
slope = calibMap[instance].slope;
|
|
||||||
dataValue = boatDataValue->value;
|
|
||||||
format = boatDataValue->getFormat().c_str();
|
|
||||||
logger->logDebug(GwLog::DEBUG, "BoatDataCalibration: %s: value: %f, format: %s", instance.c_str(), dataValue, format.c_str());
|
|
||||||
|
|
||||||
if (format == "formatWind") { // instance is of type angle
|
|
||||||
dataValue = (dataValue * slope) + offset;
|
|
||||||
dataValue = fmod(dataValue, 2 * M_PI);
|
|
||||||
if (dataValue > (M_PI)) {
|
|
||||||
dataValue -= (2 * M_PI);
|
|
||||||
} else if (dataValue < (M_PI * -1)) {
|
|
||||||
dataValue += (2 * M_PI);
|
|
||||||
}
|
|
||||||
} else if (format == "formatCourse") { // instance is of type direction
|
|
||||||
dataValue = (dataValue * slope) + offset;
|
|
||||||
dataValue = fmod(dataValue, 2 * M_PI);
|
|
||||||
if (dataValue < 0) {
|
|
||||||
dataValue += (2 * M_PI);
|
|
||||||
}
|
|
||||||
} else if (format == "kelvinToC") { // instance is of type temperature
|
|
||||||
dataValue = ((dataValue - 273.15) * slope) + offset + 273.15;
|
|
||||||
} else {
|
|
||||||
|
|
||||||
dataValue = (dataValue * slope) + offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
calibMap[instance].isCalibrated = true;
|
|
||||||
boatDataValue->value = dataValue;
|
|
||||||
|
|
||||||
calibrationData.smoothInstance(boatDataValue, logger); // smooth the boat data value
|
|
||||||
calibMap[instance].value = boatDataValue->value; // store the calibrated + smoothed value in the list
|
|
||||||
|
|
||||||
logger->logDebug(GwLog::DEBUG, "BoatDataCalibration: %s: Offset: %f, Slope: %f, Result: %f", instance.c_str(), offset, slope, calibMap[instance].value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CalibrationDataList::smoothInstance(GwApi::BoatValue* boatDataValue, GwLog* logger)
|
|
||||||
// Method to smoothen the boat data value
|
|
||||||
{
|
|
||||||
static std::unordered_map<std::string, double> lastValue; // array for last values of smoothed boat data values
|
|
||||||
|
|
||||||
std::string instance = boatDataValue->getName().c_str();
|
|
||||||
double oldValue = 0;
|
|
||||||
double dataValue = boatDataValue->value;
|
|
||||||
double smoothFactor = 0;
|
|
||||||
|
|
||||||
if (!boatDataValue->valid) { // no valid boat data value, so we don't want to smoothen value
|
|
||||||
return;
|
|
||||||
} else if (calibMap.find(instance) == calibMap.end()) {
|
|
||||||
logger->logDebug(GwLog::DEBUG, "BoatDataCalibration: smooth factor for %s not found in calibration list", instance.c_str());
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
smoothFactor = calibMap[instance].smooth;
|
|
||||||
|
|
||||||
if (lastValue.find(instance) != lastValue.end()) {
|
|
||||||
oldValue = lastValue[instance];
|
|
||||||
dataValue = oldValue + (smoothFactor * (dataValue - oldValue)); // exponential smoothing algorithm
|
|
||||||
}
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
// Functions lib for data instance calibration
|
|
||||||
|
|
||||||
#ifndef _BOATDATACALIBRATION_H
|
|
||||||
#define _BOATDATACALIBRATION_H
|
|
||||||
|
|
||||||
#include "GwApi.h"
|
|
||||||
#include <string>
|
|
||||||
#include <unordered_map>
|
|
||||||
|
|
||||||
#define MAX_CALIBRATION_DATA 3 // maximum number of calibration data instances
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
double offset; // calibration offset
|
|
||||||
double slope; // calibration slope
|
|
||||||
double smooth; // smoothing factor
|
|
||||||
double value; // calibrated data value
|
|
||||||
bool isCalibrated; // is data instance value calibrated?
|
|
||||||
} TypeCalibData;
|
|
||||||
|
|
||||||
class CalibrationDataList {
|
|
||||||
public:
|
|
||||||
static std::unordered_map<std::string, TypeCalibData> calibMap; // list of calibration data instances
|
|
||||||
|
|
||||||
void readConfig(GwConfigHandler* config, GwLog* logger);
|
|
||||||
void calibrateInstance(GwApi::BoatValue* boatDataValue, GwLog* logger);
|
|
||||||
void smoothInstance(GwApi::BoatValue* boatDataValue, GwLog* logger);
|
|
||||||
|
|
||||||
private:
|
|
||||||
};
|
|
||||||
|
|
||||||
extern CalibrationDataList calibrationData; // this list holds all calibration data
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,204 +0,0 @@
|
|||||||
/*
|
|
||||||
Menu system for online configuration
|
|
||||||
*/
|
|
||||||
#include "ConfigMenu.h"
|
|
||||||
|
|
||||||
ConfigMenuItem::ConfigMenuItem(String itemtype, String itemlabel, uint16_t itemval, String itemunit) {
|
|
||||||
if (! (itemtype == "int" or itemtype == "bool")) {
|
|
||||||
valtype = "int";
|
|
||||||
} else {
|
|
||||||
valtype = itemtype;
|
|
||||||
}
|
|
||||||
label = itemlabel;
|
|
||||||
min = 0;
|
|
||||||
max = std::numeric_limits<uint16_t>::max();
|
|
||||||
value = itemval;
|
|
||||||
unit = itemunit;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigMenuItem::setRange(uint16_t valmin, uint16_t valmax, std::vector<uint16_t> valsteps) {
|
|
||||||
min = valmin;
|
|
||||||
max = valmax;
|
|
||||||
steps = valsteps;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool ConfigMenuItem::checkRange(uint16_t checkval) {
|
|
||||||
return (checkval >= min) and (checkval <= max);
|
|
||||||
}
|
|
||||||
|
|
||||||
String ConfigMenuItem::getLabel() {
|
|
||||||
return label;
|
|
||||||
};
|
|
||||||
|
|
||||||
uint16_t ConfigMenuItem::getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ConfigMenuItem::setValue(uint16_t newval) {
|
|
||||||
if (valtype == "int") {
|
|
||||||
if (newval >= min and newval <= max) {
|
|
||||||
value = newval;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false; // out of range
|
|
||||||
} else if (valtype == "bool") {
|
|
||||||
value = (newval != 0) ? 1 : 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false; // invalid type
|
|
||||||
};
|
|
||||||
|
|
||||||
void ConfigMenuItem::incValue() {
|
|
||||||
// increase value by step
|
|
||||||
if (valtype == "int") {
|
|
||||||
if (value + step < max) {
|
|
||||||
value += step;
|
|
||||||
} else {
|
|
||||||
value = max;
|
|
||||||
}
|
|
||||||
} else if (valtype == "bool") {
|
|
||||||
value = !value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void ConfigMenuItem::decValue() {
|
|
||||||
// decrease value by step
|
|
||||||
if (valtype == "int") {
|
|
||||||
if (value - step > min) {
|
|
||||||
value -= step;
|
|
||||||
} else {
|
|
||||||
value = min;
|
|
||||||
}
|
|
||||||
} else if (valtype == "bool") {
|
|
||||||
value = !value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
String ConfigMenuItem::getUnit() {
|
|
||||||
return unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t ConfigMenuItem::getStep() {
|
|
||||||
return step;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigMenuItem::setStep(uint16_t newstep) {
|
|
||||||
if (std::find(steps.begin(), steps.end(), newstep) == steps.end()) {
|
|
||||||
return; // invalid step: not in list of possible steps
|
|
||||||
}
|
|
||||||
step = newstep;
|
|
||||||
}
|
|
||||||
|
|
||||||
int8_t ConfigMenuItem::getPos() {
|
|
||||||
return position;
|
|
||||||
};
|
|
||||||
|
|
||||||
void ConfigMenuItem::setPos(int8_t newpos) {
|
|
||||||
position = newpos;
|
|
||||||
};
|
|
||||||
|
|
||||||
String ConfigMenuItem::getType() {
|
|
||||||
return valtype;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigMenu::ConfigMenu(String menutitle, uint16_t menu_x, uint16_t menu_y) {
|
|
||||||
title = menutitle;
|
|
||||||
x = menu_x;
|
|
||||||
y = menu_y;
|
|
||||||
};
|
|
||||||
|
|
||||||
ConfigMenuItem* ConfigMenu::addItem(String key, String label, String valtype, uint16_t val, String valunit) {
|
|
||||||
if (items.find(key) != items.end()) {
|
|
||||||
// duplicate keys not allowed
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
ConfigMenuItem *itm = new ConfigMenuItem(valtype, label, val, valunit);
|
|
||||||
items.insert(std::pair<String, ConfigMenuItem*>(key, itm));
|
|
||||||
// Append key to index, index starting with 0
|
|
||||||
int8_t ix = items.size() - 1;
|
|
||||||
index[ix] = key;
|
|
||||||
itm->setPos(ix);
|
|
||||||
return itm;
|
|
||||||
};
|
|
||||||
|
|
||||||
void ConfigMenu::setItemDimension(uint16_t itemwidth, uint16_t itemheight) {
|
|
||||||
w = itemwidth;
|
|
||||||
h = itemheight;
|
|
||||||
};
|
|
||||||
|
|
||||||
void ConfigMenu::setItemActive(String key) {
|
|
||||||
if (items.find(key) != items.end()) {
|
|
||||||
activeitem = items[key]->getPos();
|
|
||||||
} else {
|
|
||||||
activeitem = -1;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
int8_t ConfigMenu::getActiveIndex() {
|
|
||||||
return activeitem;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigMenuItem* ConfigMenu::getActiveItem() {
|
|
||||||
if (activeitem < 0) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return items[index[activeitem]];
|
|
||||||
};
|
|
||||||
|
|
||||||
ConfigMenuItem* ConfigMenu::getItemByIndex(uint8_t ix) {
|
|
||||||
if (ix > index.size() - 1) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return items[index[ix]];
|
|
||||||
};
|
|
||||||
|
|
||||||
ConfigMenuItem* ConfigMenu::getItemByKey(String key) {
|
|
||||||
if (items.find(key) == items.end()) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return items[key];
|
|
||||||
};
|
|
||||||
|
|
||||||
uint8_t ConfigMenu::getItemCount() {
|
|
||||||
return items.size();
|
|
||||||
};
|
|
||||||
|
|
||||||
void ConfigMenu::goPrev() {
|
|
||||||
if (activeitem == 0) {
|
|
||||||
activeitem = items.size() - 1;
|
|
||||||
} else {
|
|
||||||
activeitem--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigMenu::goNext() {
|
|
||||||
if (activeitem == items.size() - 1) {
|
|
||||||
activeitem = 0;
|
|
||||||
} else {
|
|
||||||
activeitem++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Point ConfigMenu::getXY() {
|
|
||||||
return {static_cast<double>(x), static_cast<double>(y)};
|
|
||||||
}
|
|
||||||
|
|
||||||
Rect ConfigMenu::getRect() {
|
|
||||||
return {static_cast<double>(x), static_cast<double>(y),
|
|
||||||
static_cast<double>(w), static_cast<double>(h)};
|
|
||||||
}
|
|
||||||
|
|
||||||
Rect ConfigMenu::getItemRect(int8_t index) {
|
|
||||||
return {static_cast<double>(x), static_cast<double>(y + index * h),
|
|
||||||
static_cast<double>(w), static_cast<double>(h)};
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigMenu::setCallback(void (*callback)()) {
|
|
||||||
fptrCallback = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigMenu::storeValues() {
|
|
||||||
if (fptrCallback) {
|
|
||||||
fptrCallback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <vector>
|
|
||||||
#include <map>
|
|
||||||
#include "Graphics.h" // for Point and Rect
|
|
||||||
|
|
||||||
class ConfigMenuItem {
|
|
||||||
private:
|
|
||||||
String label;
|
|
||||||
uint16_t value;
|
|
||||||
String unit;
|
|
||||||
String valtype; // "int" | "bool"
|
|
||||||
uint16_t min;
|
|
||||||
uint16_t max;
|
|
||||||
std::vector<uint16_t> steps;
|
|
||||||
uint16_t step;
|
|
||||||
int8_t position; // counted fom 0
|
|
||||||
|
|
||||||
public:
|
|
||||||
ConfigMenuItem(String itemtype, String itemlabel, uint16_t itemval, String itemunit);
|
|
||||||
void setRange(uint16_t valmin, uint16_t valmax, std::vector<uint16_t> steps);
|
|
||||||
bool checkRange(uint16_t checkval);
|
|
||||||
String getLabel();
|
|
||||||
uint16_t getValue();
|
|
||||||
bool setValue(uint16_t newval);
|
|
||||||
void incValue();
|
|
||||||
void decValue();
|
|
||||||
String getUnit();
|
|
||||||
uint16_t getStep();
|
|
||||||
void setStep(uint16_t newstep);
|
|
||||||
int8_t getPos();
|
|
||||||
void setPos(int8_t newpos);
|
|
||||||
String getType();
|
|
||||||
};
|
|
||||||
|
|
||||||
class ConfigMenu {
|
|
||||||
private:
|
|
||||||
String title;
|
|
||||||
std::map <String,ConfigMenuItem*> items;
|
|
||||||
std::map <uint8_t,String> index;
|
|
||||||
int8_t activeitem = -1; // refers to position of item
|
|
||||||
uint16_t x;
|
|
||||||
uint16_t y;
|
|
||||||
uint16_t w;
|
|
||||||
uint16_t h;
|
|
||||||
void (*fptrCallback)();
|
|
||||||
|
|
||||||
public:
|
|
||||||
ConfigMenu(String title, uint16_t menu_x, uint16_t menu_y);
|
|
||||||
ConfigMenuItem* addItem(String key, String label, String valtype, uint16_t val, String valunit);
|
|
||||||
void setItemDimension(uint16_t itemwidth, uint16_t itemheight);
|
|
||||||
int8_t getActiveIndex();
|
|
||||||
void setItemActive(String key);
|
|
||||||
ConfigMenuItem* getActiveItem();
|
|
||||||
ConfigMenuItem* getItemByIndex(uint8_t index);
|
|
||||||
ConfigMenuItem* getItemByKey(String key);
|
|
||||||
uint8_t getItemCount();
|
|
||||||
void goPrev();
|
|
||||||
void goNext();
|
|
||||||
Point getXY();
|
|
||||||
Rect getRect();
|
|
||||||
Rect getItemRect(int8_t index);
|
|
||||||
void setCallback(void (*callback)());
|
|
||||||
void storeValues();
|
|
||||||
};
|
|
||||||
6
lib/obp60task/Create_new_pages.txt
Normal file
6
lib/obp60task/Create_new_pages.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Craete new page for OBP60
|
||||||
|
1. Create page under /lib/obp60task/PageXXXX.cpp
|
||||||
|
2. Set page name in PageXXXX.cpp on file name
|
||||||
|
3. Register new page in /lib/obp60task/obp60task.cpp line 242 (registerAllPages)
|
||||||
|
4. Add new page in /lib/obp60task/config.json for each page type or add new page to gen_set.py and run it to auto-generate the relevant section of config.json
|
||||||
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#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);
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#include <FreeRTOS.h>
|
#include <FreeRTOS.h>
|
||||||
#include "LedSpiTask.h"
|
#include "LedSpiTask.h"
|
||||||
#include "GwHardware.h"
|
#include "GwHardware.h"
|
||||||
@@ -15,30 +14,6 @@ https://controllerstech.com/ws2812-leds-using-spi/
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
String Color::toHex() {
|
|
||||||
char hexColor[8];
|
|
||||||
sprintf(hexColor, "#%02X%02X%02X", r, g, b);
|
|
||||||
return String(hexColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
String Color::toName() {
|
|
||||||
static std::map<int, String> const names = {
|
|
||||||
{0xff0000, "Red"},
|
|
||||||
{0x00ff00, "Green"},
|
|
||||||
{0x0000ff, "Blue",},
|
|
||||||
{0xff9900, "Orange"},
|
|
||||||
{0xffff00, "Yellow"},
|
|
||||||
{0x3366ff, "Aqua"},
|
|
||||||
{0xff0066, "Violet"},
|
|
||||||
{0xffffff, "White"}
|
|
||||||
};
|
|
||||||
int color = (r << 16) + (g << 8) + b;
|
|
||||||
auto it = names.find(color);
|
|
||||||
if (it == names.end()) {
|
|
||||||
return toHex();
|
|
||||||
}
|
|
||||||
return it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t mulcolor(uint8_t f1, uint8_t f2){
|
static uint8_t mulcolor(uint8_t f1, uint8_t f2){
|
||||||
uint16_t rt=f1;
|
uint16_t rt=f1;
|
||||||
@@ -84,12 +59,12 @@ static size_t ledsToBuffer(int numLeds,const Color *leds,uint8_t *buffer){
|
|||||||
bool prepareGpio(GwLog *logger, uint8_t pin){
|
bool prepareGpio(GwLog *logger, uint8_t pin){
|
||||||
esp_err_t err=gpio_set_direction((gpio_num_t)pin,GPIO_MODE_OUTPUT);
|
esp_err_t err=gpio_set_direction((gpio_num_t)pin,GPIO_MODE_OUTPUT);
|
||||||
if (err != ESP_OK){
|
if (err != ESP_OK){
|
||||||
logger->logDebug(GwLog::ERROR, "unable to set gpio mode for %d: %d", pin, (int)err);
|
LOG_DEBUG(GwLog::ERROR,"unable to set gpio mode for %d: %d",pin,(int)err);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
err=gpio_set_level((gpio_num_t)pin,0);
|
err=gpio_set_level((gpio_num_t)pin,0);
|
||||||
if (err != ESP_OK){
|
if (err != ESP_OK){
|
||||||
logger->logDebug(GwLog::ERROR, "unable to set gpio level for %d: %d", pin, (int)err);
|
LOG_DEBUG(GwLog::ERROR,"unable to set gpio level for %d: %d",pin,(int)err);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -115,8 +90,8 @@ bool prepareSpi(GwLog *logger,spi_host_device_t bus,spi_device_handle_t *device)
|
|||||||
};
|
};
|
||||||
esp_err_t err=spi_bus_initialize(bus,&buscfg,SPI_DMA_CH_AUTO);
|
esp_err_t err=spi_bus_initialize(bus,&buscfg,SPI_DMA_CH_AUTO);
|
||||||
if (err != ESP_OK){
|
if (err != ESP_OK){
|
||||||
logger->logDebug(GwLog::ERROR, "unable to initialize SPI bus %d,mosi=%d, error=%d",
|
LOG_DEBUG(GwLog::ERROR,"unable to initialize SPI bus %d,mosi=%d, error=%d",
|
||||||
(int)bus, -1, (int)err);
|
(int)bus,-1,(int)err);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
spi_device_interface_config_t devcfg = {
|
spi_device_interface_config_t devcfg = {
|
||||||
@@ -134,16 +109,16 @@ bool prepareSpi(GwLog *logger,spi_host_device_t bus,spi_device_handle_t *device)
|
|||||||
};
|
};
|
||||||
err=spi_bus_add_device(bus,&devcfg,device);
|
err=spi_bus_add_device(bus,&devcfg,device);
|
||||||
if (err != ESP_OK){
|
if (err != ESP_OK){
|
||||||
logger->logDebug(GwLog::ERROR, "unable to add device to SPI bus %d,mosi=%d, error=%d",
|
LOG_DEBUG(GwLog::ERROR,"unable to add device to SPI bus %d,mosi=%d, error=%d",
|
||||||
(int)bus, -1, (int)err);
|
(int)bus,-1,(int)err);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//slightly speed up the transactions
|
//slightly speed up the transactions
|
||||||
//as we are the only ones using the bus we can safely acquire it forever
|
//as we are the only ones using the bus we can safely acquire it forever
|
||||||
err=spi_device_acquire_bus(*device,portMAX_DELAY);
|
err=spi_device_acquire_bus(*device,portMAX_DELAY);
|
||||||
if (err != ESP_OK){
|
if (err != ESP_OK){
|
||||||
logger->logDebug(GwLog::ERROR,"unable to acquire SPI bus %d,mosi=%d, error=%d",
|
LOG_DEBUG(GwLog::ERROR,"unable to acquire SPI bus %d,mosi=%d, error=%d",
|
||||||
(int)bus, -1, (int)err);
|
(int)bus,-1,(int)err);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -173,7 +148,7 @@ bool sendToLeds(GwLog *logger, uint8_t pin, int numLeds, Color *leds, spi_host_d
|
|||||||
buffer = (uint8_t *)heap_caps_malloc(bufferSize, MALLOC_CAP_DMA|MALLOC_CAP_32BIT);
|
buffer = (uint8_t *)heap_caps_malloc(bufferSize, MALLOC_CAP_DMA|MALLOC_CAP_32BIT);
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
{
|
{
|
||||||
logger->logDebug(GwLog::ERROR, "unable to allocate %d bytes of DMA buffer", (int)bufferSize);
|
LOG_DEBUG(GwLog::ERROR, "unable to allocate %d bytes of DMA buffer", (int)bufferSize);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -194,12 +169,12 @@ bool sendToLeds(GwLog *logger, uint8_t pin, int numLeds, Color *leds, spi_host_d
|
|||||||
int64_t end = esp_timer_get_time();
|
int64_t end = esp_timer_get_time();
|
||||||
if (ret != ESP_OK)
|
if (ret != ESP_OK)
|
||||||
{
|
{
|
||||||
logger->logDebug(GwLog::ERROR, "unable to send led data: %d", (int)ret);
|
LOG_DEBUG(GwLog::ERROR, "unable to send led data: %d", (int)ret);
|
||||||
rv = false;
|
rv = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
logger->logDebug(GwLog::DEBUG, "successfully send led data for %d leds, %lld us", numLeds, end - now);
|
LOG_DEBUG(GwLog::DEBUG, "successfully send led data for %d leds, %lld us", numLeds, end - now);
|
||||||
}
|
}
|
||||||
if (ownsBuffer)
|
if (ownsBuffer)
|
||||||
{
|
{
|
||||||
@@ -212,10 +187,10 @@ bool sendToLeds(GwLog *logger, uint8_t pin, int numLeds, Color *leds, spi_host_d
|
|||||||
void handleSpiLeds(void *param){
|
void handleSpiLeds(void *param){
|
||||||
LedTaskData *taskData=(LedTaskData*)param;
|
LedTaskData *taskData=(LedTaskData*)param;
|
||||||
GwLog *logger=taskData->api->getLogger();
|
GwLog *logger=taskData->api->getLogger();
|
||||||
logger->logDebug(GwLog::ERROR, "spi led task initialized");
|
LOG_DEBUG(GwLog::ERROR,"spi led task initialized");
|
||||||
spi_host_device_t bus=SPI3_HOST;
|
spi_host_device_t bus=SPI3_HOST;
|
||||||
bool spiValid=false;
|
bool spiValid=false;
|
||||||
LOG_DEBUG(GwLog::ERROR, "SpiLed task started");
|
LOG_DEBUG(GwLog::ERROR,"SpiLed task started");
|
||||||
|
|
||||||
if (! prepareGpio(logger,OBP_FLASH_LED)){
|
if (! prepareGpio(logger,OBP_FLASH_LED)){
|
||||||
EXIT_TASK;
|
EXIT_TASK;
|
||||||
@@ -234,15 +209,15 @@ void handleSpiLeds(void *param){
|
|||||||
LedInterface newLeds=taskData->getLedData();
|
LedInterface newLeds=taskData->getLedData();
|
||||||
if (first || current.backlightChanged(newLeds) || current.flasChanged(newLeds)){
|
if (first || current.backlightChanged(newLeds) || current.flasChanged(newLeds)){
|
||||||
first=false;
|
first=false;
|
||||||
logger->logDebug(GwLog::ERROR, "handle SPI leds");
|
LOG_DEBUG(GwLog::ERROR,"handle SPI leds");
|
||||||
if (current.backlightChanged(newLeds) || first){
|
if (current.backlightChanged(newLeds) || first){
|
||||||
logger->logDebug(GwLog::ERROR, "setting backlight r=%02d,g=%02d,b=%02d",
|
LOG_DEBUG(GwLog::ERROR,"setting backlight r=%02d,g=%02d,b=%02d",
|
||||||
newLeds.backlight[0].r,newLeds.backlight[0].g,newLeds.backlight[0].b);
|
newLeds.backlight[0].r,newLeds.backlight[0].g,newLeds.backlight[0].b);
|
||||||
sendToLeds(logger,OBP_BACKLIGHT_LED,newLeds.backlightLen(),newLeds.backlight,bus,device);
|
sendToLeds(logger,OBP_BACKLIGHT_LED,newLeds.backlightLen(),newLeds.backlight,bus,device);
|
||||||
}
|
}
|
||||||
if (current.flasChanged(newLeds) || first){
|
if (current.flasChanged(newLeds) || first){
|
||||||
logger->logDebug(GwLog::ERROR, "setting flashr=%02d,g=%02d,b=%02d",
|
LOG_DEBUG(GwLog::ERROR,"setting flashr=%02d,g=%02d,b=%02d",
|
||||||
newLeds.flash[0].r,newLeds.flash[0].g,newLeds.flash[0].b);
|
newLeds.flash[0].r,newLeds.flash[0].g,newLeds.flash[0].b);
|
||||||
sendToLeds(logger,OBP_FLASH_LED,newLeds.flashLen(),newLeds.flash,bus,device);
|
sendToLeds(logger,OBP_FLASH_LED,newLeds.flashLen(),newLeds.flash,bus,device);
|
||||||
}
|
}
|
||||||
current=newLeds;
|
current=newLeds;
|
||||||
@@ -252,11 +227,6 @@ void handleSpiLeds(void *param){
|
|||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void createSpiLedTask(LedTaskData *param) {
|
void createSpiLedTask(LedTaskData *param){
|
||||||
TaskHandle_t xHandle = NULL;
|
xTaskCreate(handleSpiLeds,"handleLeds",4000,param,3,NULL);
|
||||||
GwLog *logger = param->api->getLogger();
|
}
|
||||||
esp_err_t err = xTaskCreate(handleSpiLeds, "handleLeds", configMINIMAL_STACK_SIZE + 2048, param, 3, &xHandle);
|
|
||||||
if (err != pdPASS) {
|
|
||||||
logger->logDebug(GwLog::ERROR, "Failed to create spiled task! (err=%d)", err);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -10,7 +10,7 @@ class Color{
|
|||||||
uint8_t g;
|
uint8_t g;
|
||||||
uint8_t b;
|
uint8_t b;
|
||||||
Color():r(0),g(0),b(0){}
|
Color():r(0),g(0),b(0){}
|
||||||
Color(uint8_t cr, uint8_t cg, uint8_t cb):
|
Color(uint8_t cr, uint8_t cg,uint8_t cb):
|
||||||
b(cb),g(cg),r(cr){}
|
b(cb),g(cg),r(cr){}
|
||||||
Color(const Color &o):b(o.b),g(o.g),r(o.r){}
|
Color(const Color &o):b(o.b),g(o.g),r(o.r){}
|
||||||
bool equal(const Color &o) const{
|
bool equal(const Color &o) const{
|
||||||
@@ -22,8 +22,6 @@ class Color{
|
|||||||
bool operator != (const Color &other) const{
|
bool operator != (const Color &other) const{
|
||||||
return ! equal(other);
|
return ! equal(other);
|
||||||
}
|
}
|
||||||
String toHex();
|
|
||||||
String toName();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static Color COLOR_GREEN=Color(0,255,0);
|
static Color COLOR_GREEN=Color(0,255,0);
|
||||||
|
|||||||
939
lib/obp60task/Logo_OBP_400x300_sw.h
Normal file
939
lib/obp60task/Logo_OBP_400x300_sw.h
Normal file
@@ -0,0 +1,939 @@
|
|||||||
|
const unsigned char gImage_Logo_OBP_400x300_sw[15000] = { /* 0X00,0X01,0X90,0X01,0X2C,0X01, */
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X40,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X01,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X01,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X3F,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X3F,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X7F,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0X00,0X03,0XFF,0XFF,0XF8,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X1F,0XFF,0XF8,0X00,0X00,0X00,0X07,0XFF,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X07,0XFF,0XF8,0X00,0X00,0X00,
|
||||||
|
0X03,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X0F,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X03,0XFF,0XF8,0X00,
|
||||||
|
0X00,0X00,0X01,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X1F,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0XFF,
|
||||||
|
0XF8,0X00,0X00,0X00,0X00,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFC,0X00,0X00,0X00,
|
||||||
|
0X00,0X7F,0XF8,0X00,0X00,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XF8,0X00,
|
||||||
|
0X00,0X00,0X00,0X7F,0XF8,0X00,0X00,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XF0,0X00,0X00,0X00,0X00,0X3F,0XF8,0X00,0X00,0X00,0X00,0X3F,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X1F,0XF8,0X00,0X1E,0X00,0X00,0X3F,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XE0,0X00,0X0F,0XC0,0X00,0X1F,0XF8,0X00,0X1F,0XE0,0X00,0X3F,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X3F,0XF0,0X00,0X0F,0XF8,0X00,0X1F,0XF0,
|
||||||
|
0X00,0X3F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X01,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X7F,0XF8,0X00,0X0F,0XF8,0X00,
|
||||||
|
0X1F,0XF8,0X00,0X3F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X03,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0XFF,0XFC,0X00,0X07,
|
||||||
|
0XF8,0X00,0X1F,0XF8,0X00,0X3F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0X80,0X01,0XFF,0XFE,
|
||||||
|
0X00,0X07,0XF8,0X00,0X1F,0XF8,0X00,0X3F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0X80,0X01,
|
||||||
|
0XFF,0XFE,0X00,0X07,0XF8,0X00,0X1F,0XF8,0X00,0X3F,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0X80,0X01,0XFF,0XFF,0X00,0X07,0XF8,0X00,0X1F,0XF8,0X00,0X3F,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0X80,0X03,0XFF,0XFF,0X00,0X03,0XF8,0X00,0X1F,0XF0,0X00,0X3F,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0X80,0X03,0XFF,0XFF,0X00,0X03,0XF8,0X00,0X1F,0XE0,0X00,0X3F,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0X00,0X03,0XFF,0XFF,0X00,0X03,0XF8,0X00,0X00,0X00,
|
||||||
|
0X00,0X3F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X7F,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0X00,0X03,0XFF,0XFF,0X00,0X03,0XF8,0X00,
|
||||||
|
0X00,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0X00,0X03,0XFF,0XFF,0X00,0X03,
|
||||||
|
0XF8,0X00,0X00,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0X00,0X03,0XFF,0XFF,
|
||||||
|
0X00,0X03,0XF8,0X00,0X00,0X00,0X00,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0X00,0X03,
|
||||||
|
0XFF,0XFF,0X00,0X03,0XF8,0X00,0X00,0X00,0X01,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0X00,0X03,0XFF,0XFF,0X00,0X03,0XF8,0X00,0X00,0X00,0X03,0XFF,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0X00,0X03,0XFF,0XFF,0X00,0X03,0XF8,0X00,0X00,0X00,0X07,0XFF,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0X00,0X03,0XFF,0XFF,0X00,0X03,0XF8,0X00,0X00,0X00,0X0F,0XFF,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0X80,0X03,0XFF,0XFF,0X00,0X03,0XF8,0X00,0X00,0X00,
|
||||||
|
0X7F,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,
|
||||||
|
0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0X80,0X03,0XFF,0XFF,0X00,0X07,0XF8,0X00,
|
||||||
|
0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X1F,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0X80,0X01,0XFF,0XFE,0X00,0X07,
|
||||||
|
0XF8,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0X80,0X01,0XFF,0XFE,
|
||||||
|
0X00,0X07,0XF8,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0X80,0X00,
|
||||||
|
0XFF,0XFC,0X00,0X07,0XF8,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XC0,0X00,0XFF,0XFC,0X00,0X0F,0XF8,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XC0,0X00,0X3F,0XF8,0X00,0X0F,0XF8,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XE0,0X00,0X1F,0XE0,0X00,0X1F,0XF8,0X00,0X1F,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X1F,0XF8,0X00,0X1F,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X3F,0XF8,0X00,
|
||||||
|
0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X07,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X3F,
|
||||||
|
0XF8,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XF8,0X00,0X00,0X00,
|
||||||
|
0X00,0X7F,0XF8,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFC,0X00,
|
||||||
|
0X00,0X00,0X00,0XFF,0XF8,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XFE,0X00,0X00,0X00,0X01,0XFF,0XF8,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XFF,0X80,0X00,0X00,0X03,0XFF,0XF8,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XFF,0XC0,0X00,0X00,0X0F,0XFF,0XF8,0X00,0X1F,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X3F,0XFF,0XF8,0X00,0X1F,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFE,0X00,0X01,0XFF,0XFF,0XF8,0X00,
|
||||||
|
0X3F,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X03,0XFE,0X00,0X1F,0XFF,0XF8,
|
||||||
|
0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X03,0XFE,0X00,0X0F,
|
||||||
|
0XFF,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X03,0XFE,
|
||||||
|
0X00,0X07,0XFF,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,
|
||||||
|
0X03,0XFE,0X00,0X03,0XFF,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,
|
||||||
|
0X00,0X00,0X03,0XFE,0X00,0X03,0XFF,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XC0,0X00,0X00,0X00,0X03,0XFE,0X00,0X01,0XFF,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XC0,0X00,0X00,0X00,0X03,0XFE,0X00,0X00,0XFF,0XF0,0X00,0X7F,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X03,0XFE,0X00,0X00,0XFF,0XF0,0X00,0X7F,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X03,0XFE,0X00,0X00,0X7F,0XF0,
|
||||||
|
0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X03,0XFE,0X00,0X00,
|
||||||
|
0X3F,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X01,0XFF,0XFF,0XFF,0XFE,
|
||||||
|
0X00,0X00,0X3F,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X01,0XFF,0XFF,
|
||||||
|
0XFF,0XFE,0X00,0X00,0X1F,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X01,
|
||||||
|
0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X0F,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XC0,0X01,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X0F,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XC0,0X01,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X07,0XF0,0X00,0X7F,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XC0,0X01,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X03,0XF0,0X00,0X7F,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X01,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X03,0XF0,
|
||||||
|
0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X07,0XFE,0X00,0X00,
|
||||||
|
0X01,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X07,0XFE,
|
||||||
|
0X00,0X00,0X00,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,
|
||||||
|
0X07,0XFE,0X00,0X00,0X00,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,
|
||||||
|
0X00,0X00,0X07,0XFE,0X00,0X00,0X00,0X70,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XC0,0X00,0X00,0X00,0X07,0XFE,0X00,0X00,0X00,0X30,0X00,0X7F,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XC0,0X00,0X00,0X00,0X07,0XFE,0X00,0X08,0X00,0X30,0X00,0X7F,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X07,0XFE,0X00,0X0C,0X00,0X10,0X00,0X7F,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X07,0XFE,0X00,0X0C,0X00,0X00,
|
||||||
|
0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X07,0XFE,0X00,0X0E,
|
||||||
|
0X00,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X01,0XFF,0XFF,0XFF,0XFE,
|
||||||
|
0X00,0X0F,0X00,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X01,0XFF,0XFF,
|
||||||
|
0XFF,0XFE,0X00,0X0F,0X00,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X01,
|
||||||
|
0XFF,0XFF,0XFF,0XFE,0X00,0X0F,0X80,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XC0,0X01,0XFF,0XFF,0XFF,0XFE,0X00,0X0F,0XC0,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XC0,0X01,0XFF,0XFF,0XFF,0XFE,0X00,0X0F,0XC0,0X00,0X00,0X7F,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XC0,0X01,0XFF,0XFF,0XFF,0XFE,0X00,0X0F,0XE0,0X00,0X00,0X7F,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X01,0XFF,0XFF,0XFF,0XFE,0X00,0X0F,0XF0,0X00,
|
||||||
|
0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X01,0XFF,0XFF,0XFF,0XFE,0X00,0X0F,
|
||||||
|
0XF8,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0XFF,0XFF,0XFF,0XFE,
|
||||||
|
0X00,0X0F,0XF8,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,
|
||||||
|
0X01,0XFE,0X00,0X0F,0XFC,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,
|
||||||
|
0X00,0X00,0X01,0XFE,0X00,0X0F,0XFE,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XC0,0X00,0X00,0X00,0X01,0XFE,0X00,0X0F,0XFE,0X00,0X00,0X7F,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XC0,0X00,0X00,0X00,0X01,0XFE,0X00,0X0F,0XFF,0X00,0X00,0X7F,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X01,0XFE,0X00,0X0F,0XFF,0X80,0X00,0X7F,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X01,0XFE,0X00,0X0F,0XFF,0X80,
|
||||||
|
0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X01,0XFE,0X00,0X0F,
|
||||||
|
0XFF,0XC0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X01,0XFE,
|
||||||
|
0X00,0X0F,0XFF,0XE0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,
|
||||||
|
0X01,0XFE,0X00,0X0F,0XFF,0XE0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XC0,0X00,
|
||||||
|
0X00,0X00,0X01,0XFE,0X00,0X1F,0XFF,0XF0,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,
|
||||||
|
0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0X80,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XC0,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,
|
||||||
|
0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X40,0X00,0X0F,0XFF,0XE0,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X7E,0X00,0X00,0X00,0X00,0X00,0X00,0X02,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X03,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XC0,0X00,0X0F,0XFF,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X7E,0X00,0X00,0X00,0X00,0X00,0X00,0X0E,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X07,0XC0,0X00,0X0F,
|
||||||
|
0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X7E,0X00,0X00,0X00,0X00,0X00,0X00,0X3E,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X0F,0XC0,
|
||||||
|
0X00,0X0F,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X7E,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X7E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X0F,0XC0,0X00,0X0F,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X7E,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XF8,0X1F,0XE0,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X0F,0XC0,0X00,0X0F,0XE0,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XF8,0X0F,0XE0,0X03,
|
||||||
|
0XE0,0X00,0X3F,0XE0,0X1F,0XC0,0X00,0X0F,0XE0,0X7F,0X00,0X0E,0X00,0X7E,0X00,0X00,
|
||||||
|
0X00,0X3F,0X00,0X01,0XFC,0X00,0XFE,0X00,0X3F,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XF8,0X0F,
|
||||||
|
0XC0,0X1F,0XFC,0X00,0XFF,0XF8,0X7F,0XFC,0X00,0X0F,0XE0,0X7F,0X1F,0X9F,0X83,0XFF,
|
||||||
|
0X80,0X7E,0X01,0XFF,0XE0,0X07,0XFF,0X03,0XFF,0XE0,0XFF,0XF0,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,
|
||||||
|
0XF8,0X1F,0XC0,0X3F,0XFE,0X03,0XFF,0XFC,0X7F,0XFC,0X00,0X0F,0XE0,0X7F,0X1F,0XFF,
|
||||||
|
0X07,0XFF,0XE0,0X7E,0X03,0XFF,0XF0,0X1F,0XFF,0XC3,0XFF,0XE1,0XFF,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X03,0XFF,0XFF,0X80,0X7F,0XFF,0X83,0XFF,0XFE,0X7F,0XFC,0X00,0X0F,0XE0,0XFF,
|
||||||
|
0X1F,0XFF,0X0F,0XFF,0XF0,0X7E,0X07,0XFF,0XF8,0X3F,0XFF,0XE3,0XFF,0XE3,0XFF,0XFC,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X03,0XFF,0XFF,0X00,0XFF,0XFF,0X87,0XF8,0XFE,0X7F,0XFC,0X00,0X0F,
|
||||||
|
0XFF,0XFE,0X1F,0XFE,0X1F,0XFF,0XF0,0X7E,0X0F,0XE3,0XF8,0X3F,0XFF,0XE3,0XFF,0XE3,
|
||||||
|
0XE1,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0X01,0XFE,0X3F,0XC7,0XF0,0X7E,0X1F,0XC0,
|
||||||
|
0X00,0X0F,0XFF,0XFE,0X1F,0XF2,0X1F,0XC3,0XF8,0X7E,0X0F,0XC1,0XFC,0X7F,0X87,0XF0,
|
||||||
|
0XFE,0X07,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XC1,0XFC,0X1F,0XC0,0X00,0XFE,
|
||||||
|
0X0F,0XC0,0X00,0X0F,0XFF,0XFC,0X1F,0XE0,0X3F,0X83,0XF8,0X7E,0X1F,0XC0,0XFC,0X7F,
|
||||||
|
0X03,0X80,0XFE,0X03,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XE1,0XFC,0X0F,0XC0,
|
||||||
|
0X07,0XFE,0X0F,0XC0,0X00,0X0F,0XFF,0XF8,0X1F,0XC0,0X3F,0X81,0XF8,0X7E,0X1F,0XC0,
|
||||||
|
0XFC,0X7E,0X00,0X00,0XFE,0X03,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XF8,0X0F,0XE1,0XF8,
|
||||||
|
0X0F,0XC0,0XFF,0XFE,0X0F,0XC0,0X00,0X0F,0XFF,0XE0,0X1F,0XC0,0X3F,0X81,0XF8,0X7E,
|
||||||
|
0X1F,0XFF,0XFE,0X7E,0X00,0X00,0XFE,0X01,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XF8,0X0F,
|
||||||
|
0XF1,0XF8,0X0F,0XC3,0XFF,0XFE,0X0F,0XC0,0X00,0X0F,0XE0,0X00,0X1F,0XC0,0X3F,0X01,
|
||||||
|
0XFC,0X7E,0X1F,0XFF,0XFE,0X7E,0X00,0X00,0XFE,0X00,0XFF,0XFC,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,
|
||||||
|
0XF8,0X0F,0XF1,0XF8,0X0F,0XC7,0XFC,0X7E,0X0F,0XC0,0X00,0X0F,0XE0,0X00,0X1F,0XC0,
|
||||||
|
0X3F,0X81,0XF8,0X7E,0X1F,0XFF,0XFE,0X7E,0X00,0X00,0XFE,0X00,0X3F,0XFC,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X03,0XF8,0X0F,0XF1,0XFC,0X1F,0XC7,0XF0,0X7E,0X0F,0XC0,0X00,0X0F,0XE0,0X00,
|
||||||
|
0X1F,0XC0,0X3F,0X81,0XF8,0X7E,0X1F,0XC0,0X00,0X7F,0X03,0XC0,0XFE,0X00,0X01,0XFE,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X03,0XFC,0X3F,0XF1,0XFC,0X1F,0XC7,0XE0,0X7E,0X0F,0XC0,0X00,0X0F,
|
||||||
|
0XE0,0X00,0X1F,0XC0,0X1F,0X83,0XF8,0X7E,0X1F,0XC0,0X00,0X7F,0X07,0XF0,0XFE,0X00,
|
||||||
|
0X60,0X7E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XE0,0XFF,0X3F,0X87,0XE0,0XFE,0X0F,0XFC,
|
||||||
|
0X00,0X0F,0XE0,0X00,0X1F,0XC0,0X1F,0XE7,0XF0,0X7E,0X0F,0XE1,0XFC,0X7F,0XCF,0XF0,
|
||||||
|
0X7F,0XC7,0XF0,0X7E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XE0,0XFF,0XFF,0X87,0XFF,0XFE,
|
||||||
|
0X0F,0XFC,0X00,0X0F,0XE0,0X00,0X1F,0XC0,0X0F,0XFF,0XF0,0X7E,0X0F,0XFF,0XF8,0X3F,
|
||||||
|
0XFF,0XE0,0X7F,0XC7,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XC0,0X7F,0XFF,0X07,
|
||||||
|
0XFF,0XFE,0X0F,0XFC,0X00,0X0F,0XE0,0X00,0X1F,0XC0,0X07,0XFF,0XE0,0X7E,0X07,0XFF,
|
||||||
|
0XF0,0X1F,0XFF,0XC0,0X7F,0XE3,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0X80,0X1F,
|
||||||
|
0XFE,0X03,0XFF,0X3F,0X07,0XFC,0X00,0X0F,0XE0,0X00,0X1F,0XC0,0X03,0XFF,0XC0,0X7E,
|
||||||
|
0X03,0XFF,0XE0,0X0F,0XFF,0X80,0X3F,0XE1,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XF8,
|
||||||
|
0X00,0X07,0XF8,0X00,0XFC,0X3F,0X03,0XFC,0X00,0X0F,0XE0,0X00,0X1F,0XC0,0X00,0XFF,
|
||||||
|
0X00,0X7E,0X00,0XFF,0X80,0X03,0XFE,0X00,0X1F,0XE0,0X7F,0XC0,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X03,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFC,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFC,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XE0,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,};
|
||||||
939
lib/obp60task/MFD_OBP60_400x300_sw.h
Normal file
939
lib/obp60task/MFD_OBP60_400x300_sw.h
Normal file
@@ -0,0 +1,939 @@
|
|||||||
|
const unsigned char gImage_MFD_OBP60_400x300_sw[15000] = { /* 0X00,0X01,0X90,0X01,0X2C,0X01, */
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XE0,0X3F,
|
||||||
|
0XC0,0X00,0X00,0X7E,0X00,0X40,0XFC,0X07,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X08,0X1F,0X80,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XE0,0X0F,0XC0,0X00,0X00,0X00,
|
||||||
|
0X00,0X1F,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,
|
||||||
|
0XF0,0X3F,0XC0,0X00,0X00,0X7E,0X01,0XC0,0XFC,0X1F,0XF0,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X38,0X1F,0X80,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XF8,0X0F,0XC0,0X00,
|
||||||
|
0X00,0X00,0X00,0X1F,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X1F,0XF0,0X7F,0XC0,0X00,0X00,0X7E,0X07,0XC0,0XFC,0X1F,0XF0,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0XF8,0X1F,0X80,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XFC,0X0F,
|
||||||
|
0XC0,0X00,0X00,0X00,0X00,0X1F,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X1F,0XF0,0X7F,0XC0,0X00,0X00,0X7E,0X0F,0XC0,0XFC,0X3F,0XE0,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X01,0XF8,0X1F,0X80,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,
|
||||||
|
0XFE,0X0F,0XC0,0X00,0X00,0X00,0X00,0X1F,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X1F,0XF0,0X7F,0XC0,0X00,0X00,0X7E,0X0F,0XC0,0X00,0X3F,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X07,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0X80,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XF8,0X7F,0XC0,0X00,0X00,0X7E,0X0F,0XC0,
|
||||||
|
0X00,0X3F,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XF8,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X07,0XF0,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0X80,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XF8,0XFF,0XC3,0XE0,0XF8,0X7E,
|
||||||
|
0X3F,0XF8,0XFC,0XFF,0XE7,0XC1,0XF0,0XF8,0XF8,0X01,0XFC,0X07,0XFF,0X1F,0X80,0X7F,
|
||||||
|
0X00,0XF8,0XF8,0X00,0X07,0XF0,0X7F,0X0F,0XC0,0X7F,0X80,0XF9,0XF0,0X1F,0X80,0XFF,
|
||||||
|
0X83,0XF0,0X3F,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0X78,0XF7,0XC3,0XE0,
|
||||||
|
0XF8,0X7E,0X3F,0XF8,0XFC,0XFF,0XE7,0XC1,0XF0,0XFB,0XFC,0X07,0XFF,0X07,0XFF,0X1F,
|
||||||
|
0X81,0XFF,0XC0,0XFB,0XFC,0X00,0X07,0XF0,0X3F,0X0F,0XC1,0XFF,0XE0,0XFB,0XFC,0X1F,
|
||||||
|
0X83,0XFF,0XE1,0XF8,0X3E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0X78,0XF7,
|
||||||
|
0XC3,0XE0,0XF8,0X7E,0X3F,0XF8,0XFC,0XFF,0XE7,0XC1,0XF0,0XFF,0XFE,0X0F,0XFF,0XC7,
|
||||||
|
0XFF,0X1F,0X83,0XFF,0XE0,0XFF,0XFE,0X00,0X07,0XF0,0X3F,0X0F,0XC3,0XFF,0XF0,0XFF,
|
||||||
|
0XFE,0X1F,0X87,0XFF,0XF1,0XF8,0X3E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,
|
||||||
|
0X7C,0XF7,0XC3,0XE0,0XF8,0X7E,0X3F,0XF8,0XFC,0XFF,0XE7,0XC1,0XF0,0XFF,0XFE,0X1F,
|
||||||
|
0XFF,0XC7,0XFF,0X1F,0X87,0XFF,0XF0,0XFF,0XFE,0X00,0X07,0XF0,0X3F,0X8F,0XC3,0XE3,
|
||||||
|
0XF0,0XFF,0XFE,0X1F,0X87,0XFF,0XF0,0XF8,0X7E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X1F,0X3D,0XE7,0XC3,0XE0,0XF8,0X7E,0X0F,0XC0,0XFC,0X3F,0X07,0XC1,0XF0,0XFF,
|
||||||
|
0XFE,0X1F,0X87,0XE1,0XF8,0X1F,0X87,0XE3,0XF0,0XFF,0XFE,0X00,0X07,0XF0,0X3F,0X8F,
|
||||||
|
0XC3,0XE1,0X80,0XFC,0X7F,0X1F,0X87,0XC1,0XF0,0XFC,0X7C,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X1F,0X3D,0XE7,0XC3,0XE0,0XF8,0X7E,0X0F,0XC0,0XFC,0X3F,0X07,0XC1,
|
||||||
|
0XF0,0XFC,0X7E,0X3F,0X07,0X01,0XF8,0X1F,0X8F,0XC1,0XF8,0XFC,0X7E,0X00,0X07,0XF0,
|
||||||
|
0X3F,0X8F,0XC3,0XFC,0X00,0XFC,0X3F,0X1F,0X80,0X07,0XF0,0X7C,0X7C,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X1F,0X3F,0XE7,0XC3,0XE0,0XF8,0X7E,0X0F,0XC0,0XFC,0X3F,
|
||||||
|
0X07,0XC1,0XF0,0XFC,0X3E,0X3F,0X00,0X01,0XF8,0X1F,0X8F,0XC1,0XF8,0XFC,0X3E,0X00,
|
||||||
|
0X07,0XF0,0X3F,0X0F,0XC3,0XFF,0XE0,0XF8,0X3F,0X1F,0X80,0X7F,0XF0,0X7C,0XF8,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0X3F,0XE7,0XC3,0XE0,0XF8,0X7E,0X0F,0XC0,
|
||||||
|
0XFC,0X3F,0X07,0XC1,0XF0,0XF8,0X3E,0X3F,0X00,0X01,0XF8,0X1F,0X8F,0XC1,0XF8,0XF8,
|
||||||
|
0X3E,0X00,0X07,0XF0,0X3F,0X0F,0XC1,0XFF,0XF0,0XF8,0X3F,0X1F,0X83,0XFF,0XF0,0X7C,
|
||||||
|
0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0X1F,0XC7,0XC3,0XE1,0XF8,0X7E,
|
||||||
|
0X0F,0XC0,0XFC,0X3F,0X07,0XC3,0XF0,0XF8,0X3E,0X3F,0X00,0X01,0XF8,0X1F,0X8F,0XC1,
|
||||||
|
0XF8,0XF8,0X3E,0X00,0X07,0XF0,0X3F,0X0F,0XC0,0X7F,0XF8,0XF8,0X3F,0X1F,0X87,0XF1,
|
||||||
|
0XF0,0X3E,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0X1F,0XC7,0XC3,0XF1,
|
||||||
|
0XF8,0X7E,0X0F,0XC0,0XFC,0X3F,0X07,0XE3,0XF0,0XF8,0X3E,0X3F,0X03,0X01,0XF8,0X1F,
|
||||||
|
0X8F,0XC1,0XF8,0XF8,0X3E,0X00,0X07,0XF0,0X7F,0X0F,0XC0,0X03,0XF8,0XFC,0X3F,0X1F,
|
||||||
|
0X8F,0XC1,0XF0,0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0X1F,0XC7,
|
||||||
|
0XC3,0XFF,0XF8,0X7E,0X0F,0XC0,0XFC,0X3F,0X07,0XFF,0XF0,0XF8,0X3E,0X1F,0X87,0XE1,
|
||||||
|
0XF8,0X1F,0X87,0XE3,0XF0,0XF8,0X3E,0X00,0X07,0XFF,0XFE,0X0F,0XC0,0XE0,0XF8,0XFC,
|
||||||
|
0X7F,0X1F,0X8F,0XC3,0XF0,0X1F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,
|
||||||
|
0X1F,0XC7,0XC3,0XFF,0XF8,0X7E,0X0F,0XF8,0XFC,0X3F,0X07,0XFF,0XF0,0XF8,0X3E,0X1F,
|
||||||
|
0XFF,0XC1,0XFF,0X1F,0X87,0XFF,0XF0,0XF8,0X3E,0X00,0X07,0XFF,0XFE,0X0F,0XC7,0XE1,
|
||||||
|
0XF8,0XFF,0XFE,0X1F,0X8F,0XFF,0XF0,0X1F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X1F,0X0F,0X87,0XC3,0XFF,0XF8,0X7E,0X0F,0XF8,0XFC,0X3F,0X07,0XFF,0XF0,0XF8,
|
||||||
|
0X3E,0X0F,0XFF,0XC1,0XFF,0X1F,0X83,0XFF,0XE0,0XF8,0X3E,0X00,0X07,0XFF,0XFC,0X0F,
|
||||||
|
0XC3,0XFF,0XF0,0XFF,0XFE,0X1F,0X8F,0XFF,0XF0,0X1F,0XE0,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X1F,0X0F,0X87,0XC1,0XFE,0XF8,0X7E,0X07,0XF8,0XFC,0X3F,0X03,0XFD,
|
||||||
|
0XF0,0XF8,0X3E,0X07,0XFF,0X80,0XFF,0X1F,0X81,0XFF,0XC0,0XF8,0X3E,0X00,0X07,0XFF,
|
||||||
|
0XF8,0X0F,0XC3,0XFF,0XE0,0XFF,0XFC,0X1F,0X87,0XFD,0XF0,0X0F,0XE0,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X1F,0X0F,0X87,0XC0,0XF8,0XF8,0X7E,0X03,0XF8,0XFC,0X3F,
|
||||||
|
0X01,0XF1,0XF0,0XF8,0X3E,0X01,0XFE,0X00,0X7F,0X1F,0X80,0X7F,0X00,0XF8,0X3E,0X00,
|
||||||
|
0X07,0XFF,0XC0,0X0F,0XC0,0X7F,0X80,0XF9,0XF0,0X1F,0X81,0XF0,0XF8,0X0F,0XC0,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XF8,0X00,0X00,0X00,0X00,0X00,0X0F,
|
||||||
|
0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XF8,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X0F,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XF8,0X00,0X00,
|
||||||
|
0X00,0X00,0X01,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XF8,
|
||||||
|
0X00,0X00,0X00,0X00,0X01,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0XF8,0X00,0X00,0X00,0X00,0X01,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0XF8,0X00,0X00,0X00,0X00,0X00,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XF8,0X01,0XFF,0XFC,0X03,0XFF,0XF0,0X00,0XFC,
|
||||||
|
0X00,0X3F,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFE,0X01,0XFF,0XFF,0X03,0XFF,0XFC,
|
||||||
|
0X03,0XFF,0X00,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0X81,0XFF,0XFF,0X83,
|
||||||
|
0XFF,0XFE,0X07,0XFF,0X81,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XC1,0XFF,
|
||||||
|
0XFF,0X83,0XFF,0XFE,0X0F,0XFF,0XC3,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,
|
||||||
|
0XC1,0XFF,0XFF,0XC3,0XFF,0XFE,0X1F,0X8F,0XC3,0XF1,0XF8,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,
|
||||||
|
0XFE,0X1F,0XE1,0XFC,0X1F,0XC3,0XF0,0X7F,0X1F,0X87,0X83,0XE0,0XF8,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X01,0XFC,0X0F,0XE1,0XFC,0X1F,0X83,0XF0,0X3F,0X1F,0X00,0X07,0XE0,0XF8,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X01,0XF8,0X07,0XE1,0XFC,0X1F,0X83,0XF0,0X3F,0X3F,0X3E,0X07,0XE0,
|
||||||
|
0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X03,0XF8,0X07,0XF1,0XFF,0XFF,0X03,0XF0,0X7F,0X3F,0X7F,
|
||||||
|
0X87,0XE0,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XF8,0X07,0XF1,0XFF,0XFE,0X03,0XFF,0XFE,
|
||||||
|
0X3F,0XFF,0XC7,0XE0,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XF8,0X07,0XF1,0XFF,0XFF,0X03,
|
||||||
|
0XFF,0XFE,0X3F,0XFF,0XC7,0XE0,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XF8,0X07,0XF1,0XFF,
|
||||||
|
0XFF,0X83,0XFF,0XFC,0X3F,0X87,0XE7,0XE0,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XF8,0X07,
|
||||||
|
0XF1,0XFF,0XFF,0XC3,0XFF,0XF8,0X3F,0X07,0XE7,0XE0,0XFC,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,
|
||||||
|
0XF8,0X07,0XE1,0XFC,0X0F,0XC3,0XFF,0XE0,0X3F,0X03,0XE7,0XE0,0XFC,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X01,0XFC,0X0F,0XE1,0XFC,0X0F,0XE3,0XF0,0X00,0X1F,0X03,0XE3,0XE0,0XFC,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X01,0XFE,0X1F,0XE1,0XFC,0X0F,0XE3,0XF0,0X00,0X1F,0X07,0XE3,0XE0,
|
||||||
|
0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XC1,0XFF,0XFF,0XC3,0XF0,0X00,0X1F,0X87,
|
||||||
|
0XE3,0XF1,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XC1,0XFF,0XFF,0XC3,0XF0,0X00,
|
||||||
|
0X0F,0XFF,0XC1,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0X81,0XFF,0XFF,0X83,
|
||||||
|
0XF0,0X00,0X07,0XFF,0X81,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFE,0X01,0XFF,
|
||||||
|
0XFF,0X83,0XF0,0X00,0X03,0XFF,0X00,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XF8,
|
||||||
|
0X01,0XFF,0XFC,0X03,0XF0,0X00,0X00,0XFC,0X00,0X3F,0X80,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X40,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XC0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XC0,0X07,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC0,0X07,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XC0,0X07,
|
||||||
|
0XFF,0XFC,0X07,0XFF,0X00,0X07,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,
|
||||||
|
0XC0,0X07,0XFF,0XE0,0X00,0XFF,0X00,0X00,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X0F,0XC0,0X07,0XFF,0XC0,0X00,0X7F,0X00,0X00,0X7F,0XF0,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X1F,0XC0,0X07,0XFF,0X80,0X00,0X3F,0X00,0X00,0X3F,0XF0,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X1F,0XC0,0X07,0XFF,0X00,0X00,0X1F,0X00,0X00,0X1F,0XF0,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XC0,0X07,0XFE,0X00,0XC0,0X0F,0X01,0XE0,
|
||||||
|
0X1F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XC0,0X07,0XFE,0X03,0XF0,0X0F,
|
||||||
|
0X01,0XF0,0X1F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XC0,0X07,0XFC,0X03,
|
||||||
|
0XF8,0X0F,0X01,0XF0,0X1F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XC0,0X07,
|
||||||
|
0XFC,0X07,0XF8,0X07,0X01,0XF0,0X1F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,
|
||||||
|
0XC0,0X07,0XFC,0X07,0XFC,0X07,0X01,0XE0,0X1F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X03,0XFF,0XC0,0X07,0XFC,0X07,0XFC,0X07,0X00,0X00,0X3F,0XF0,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X03,0XFF,0XC0,0X07,0XFC,0X07,0XFC,0X07,0X00,0X00,0X3F,0XF0,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X07,0XFF,0XC0,0X07,0XFC,0X07,0XFC,0X07,0X00,0X00,0X7F,0XF0,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XC0,0X07,0XFC,0X07,0XFC,0X07,0X00,0X00,
|
||||||
|
0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XC0,0X07,0XFC,0X07,0XF8,0X07,
|
||||||
|
0X01,0XDF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XC0,0X07,0XFC,0X07,
|
||||||
|
0XF8,0X0F,0X01,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XC0,0X07,
|
||||||
|
0XFE,0X03,0XF8,0X0F,0X01,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,
|
||||||
|
0XC0,0X07,0XFE,0X00,0XE0,0X0F,0X01,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X7F,0XFF,0XC0,0X07,0XFF,0X00,0X00,0X1F,0X01,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0XFF,0XFF,0XC0,0X07,0XFF,0X00,0X00,0X3F,0X01,0XFF,0XFF,0XF0,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X01,0XFF,0XFF,0XC0,0X07,0XFF,0X80,0X00,0X7F,0X01,0XFF,0XFF,0XF0,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XC0,0X07,0XFF,0XE0,0X00,0XFF,0X01,0XFF,
|
||||||
|
0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XC0,0X07,0XFF,0XF8,0X03,0XFF,
|
||||||
|
0X01,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XC0,0X07,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XC0,0X07,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,
|
||||||
|
0XC0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,
|
||||||
|
0XFF,0XFF,0XC0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X3F,0XFF,0XFF,0XC0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X3F,0XFF,0XFF,0XC0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XC0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XC0,0X07,0XFE,0X00,0X00,0X78,
|
||||||
|
0X0F,0XF0,0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XC0,0X07,0XFE,0X00,
|
||||||
|
0X00,0X78,0X07,0XF0,0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XC0,0X07,
|
||||||
|
0XFE,0X00,0X00,0X78,0X07,0XF0,0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,
|
||||||
|
0XC0,0X07,0XFE,0X00,0X00,0X78,0X03,0XF0,0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,
|
||||||
|
0XFF,0XFF,0XC0,0X07,0XFE,0X00,0X00,0X78,0X01,0XF0,0X3F,0XF0,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X07,0XFF,0XFF,0XFF,0XC0,0X07,0XFE,0X03,0XFF,0XF8,0X01,0XF0,0X3F,0XF0,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XC0,0X07,0XFE,0X03,0XFF,0XF8,0X00,0XF0,0X3F,0XF0,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XC0,0X07,0XFE,0X03,0XFF,0XF8,0X00,0X70,
|
||||||
|
0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XC0,0X07,0XFE,0X00,0X00,0XF8,
|
||||||
|
0X00,0X70,0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0XC0,0X07,0XFE,0X00,
|
||||||
|
0X00,0XF8,0X00,0X30,0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFF,0XC0,0X07,
|
||||||
|
0XFE,0X00,0X00,0XF8,0X00,0X10,0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFF,
|
||||||
|
0XC0,0X07,0XFE,0X00,0X00,0XF8,0X00,0X10,0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XC0,0X07,0XFE,0X00,0X00,0XF8,0X08,0X00,0X3F,0XF0,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XC0,0X07,0XFE,0X03,0XFF,0XF8,0X0C,0X00,0X3F,0XF0,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XC0,0X07,0XFE,0X03,0XFF,0XF8,0X0E,0X00,0X3F,0XF0,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XC0,0X07,0XFE,0X03,0XFF,0XF8,0X0E,0X00,
|
||||||
|
0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XC0,0X07,0XFE,0X03,0XFF,0XF8,
|
||||||
|
0X0F,0X00,0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XC0,0X07,0XFE,0X00,
|
||||||
|
0X00,0X78,0X0F,0X80,0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XC0,0X07,
|
||||||
|
0XFE,0X00,0X00,0X78,0X0F,0X80,0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XC0,0X07,0XFE,0X00,0X00,0X78,0X0F,0XC0,0X3F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XC0,0X07,0XFE,0X00,0X00,0X78,0X0F,0XE0,0X3F,0XF0,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XC0,0X07,0XFE,0X00,0X00,0X78,0X0F,0XE0,0X3F,0XF0,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XC0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X07,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X07,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X07,
|
||||||
|
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,
|
||||||
|
0XC0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,
|
||||||
|
0XFF,0XFF,0XC0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XF8,0X00,0X00,0X00,0X20,0X0F,0XE0,
|
||||||
|
0X00,0X00,0X38,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFC,0X00,0X00,0X00,0X60,
|
||||||
|
0X0F,0XF8,0X00,0X00,0X38,0X00,0X00,0X01,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFE,0X00,0X00,
|
||||||
|
0X00,0XE0,0X0F,0XF8,0X00,0X00,0X00,0X00,0X00,0X03,0X80,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0X0E,
|
||||||
|
0X06,0X00,0XC0,0XE0,0X0E,0X3C,0X08,0X38,0X00,0X18,0X03,0X03,0X81,0XC0,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X07,0X1E,0X1F,0X87,0XFB,0XF8,0X0E,0X3C,0XDC,0XFE,0X38,0X7F,0X0F,0XE7,0XE7,0XF0,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X07,0XFC,0X3F,0XCF,0X3B,0XF8,0X0F,0XF8,0XF9,0XFF,0X38,0XE7,0X1F,0XE7,
|
||||||
|
0XE6,0X38,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X07,0XFE,0X78,0XE0,0X38,0XE0,0X0F,0XF8,0XE1,0XC7,0X39,0XE3,
|
||||||
|
0XBC,0X03,0X87,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X07,0X0E,0X70,0XE3,0XF8,0XE0,0X0F,0XE0,0XE1,0XC7,
|
||||||
|
0X39,0XFF,0XB8,0X03,0X87,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0X0F,0X70,0XEF,0X38,0XE0,0X0E,0X00,
|
||||||
|
0XE1,0XC7,0X39,0XFF,0XB8,0X03,0X81,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0X1E,0X39,0XEE,0X38,0XE0,
|
||||||
|
0X0E,0X00,0XE1,0XC7,0X38,0XE0,0X3C,0XF3,0X80,0X38,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFE,0X3F,0XCF,
|
||||||
|
0XF8,0XF0,0X0E,0X00,0XE0,0XFF,0X38,0XFF,0X1F,0XE3,0XEF,0X78,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFC,
|
||||||
|
0X1F,0X87,0XD8,0XF8,0X0E,0X00,0XE0,0X7C,0X38,0X7E,0X0F,0XC1,0XE7,0XF0,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X38,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X78,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XF8,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X20,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
|
||||||
|
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,};
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <PCF8574.h> // Driver for PCF8574 output modul from Horter
|
#include <PCF8574.h> // Driver for PCF8574 output modul from Horter
|
||||||
@@ -12,20 +11,18 @@
|
|||||||
#include "imglib.h"
|
#include "imglib.h"
|
||||||
|
|
||||||
// Character sets
|
// Character sets
|
||||||
#include "fonts/DSEG7Classic-BoldItalic16pt7b.h"
|
#include "Ubuntu_Bold8pt7b.h"
|
||||||
#include "fonts/DSEG7Classic-BoldItalic20pt7b.h"
|
#include "Ubuntu_Bold10pt7b.h"
|
||||||
#include "fonts/DSEG7Classic-BoldItalic26pt7b.h"
|
#include "Ubuntu_Bold12pt7b.h"
|
||||||
#include "fonts/DSEG7Classic-BoldItalic30pt7b.h"
|
#include "Ubuntu_Bold16pt7b.h"
|
||||||
#include "fonts/DSEG7Classic-BoldItalic42pt7b.h"
|
#include "Ubuntu_Bold20pt7b.h"
|
||||||
#include "fonts/DSEG7Classic-BoldItalic60pt7b.h"
|
#include "Ubuntu_Bold32pt7b.h"
|
||||||
#include "fonts/Ubuntu_Bold8pt8b.h"
|
#include "DSEG7Classic-BoldItalic16pt7b.h"
|
||||||
#include "fonts/Ubuntu_Bold10pt8b.h"
|
#include "DSEG7Classic-BoldItalic20pt7b.h"
|
||||||
#include "fonts/Ubuntu_Bold12pt8b.h"
|
#include "DSEG7Classic-BoldItalic30pt7b.h"
|
||||||
#include "fonts/Ubuntu_Bold16pt8b.h"
|
#include "DSEG7Classic-BoldItalic42pt7b.h"
|
||||||
#include "fonts/Ubuntu_Bold20pt8b.h"
|
#include "DSEG7Classic-BoldItalic60pt7b.h"
|
||||||
#include "fonts/Ubuntu_Bold32pt8b.h"
|
#include "Atari16px8b.h" // Key label font
|
||||||
#include "fonts/Atari16px8b.h" // Key label font
|
|
||||||
#include "fonts/Atari6px8b.h" // Very small (6x6) font
|
|
||||||
|
|
||||||
// E-Ink Display
|
// E-Ink Display
|
||||||
#define GxEPD_WIDTH 400 // Display width
|
#define GxEPD_WIDTH 400 // Display width
|
||||||
@@ -34,20 +31,30 @@
|
|||||||
#ifdef DISPLAY_GDEW042T2
|
#ifdef DISPLAY_GDEW042T2
|
||||||
// Set display type and SPI pins for display
|
// Set display type and SPI pins for display
|
||||||
GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(OBP_SPI_CS, OBP_SPI_DC, OBP_SPI_RST, OBP_SPI_BUSY)); // GDEW042T2 400x300, UC8176 (IL0398)
|
GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(OBP_SPI_CS, OBP_SPI_DC, OBP_SPI_RST, OBP_SPI_BUSY)); // GDEW042T2 400x300, UC8176 (IL0398)
|
||||||
|
// Export display in new funktion
|
||||||
|
GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> & getdisplay(){return display;}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISPLAY_GDEY042T81
|
#ifdef DISPLAY_GDEY042T81
|
||||||
// Set display type and SPI pins for display
|
// Set display type and SPI pins for display
|
||||||
GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> display(GxEPD2_420_GDEY042T81(OBP_SPI_CS, OBP_SPI_DC, OBP_SPI_RST, OBP_SPI_BUSY)); // GDEW042T2 400x300, UC8176 (IL0398)
|
GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> display(GxEPD2_420_GDEY042T81(OBP_SPI_CS, OBP_SPI_DC, OBP_SPI_RST, OBP_SPI_BUSY)); // GDEW042T2 400x300, UC8176 (IL0398)
|
||||||
|
// Export display in new funktion
|
||||||
|
GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> & getdisplay(){return display;}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISPLAY_GYE042A87
|
#ifdef DISPLAY_GYE042A87
|
||||||
// Set display type and SPI pins for display
|
// Set display type and SPI pins for display
|
||||||
GxEPD2_BW<GxEPD2_420_GYE042A87, GxEPD2_420_GYE042A87::HEIGHT> display(GxEPD2_420_GYE042A87(OBP_SPI_CS, OBP_SPI_DC, OBP_SPI_RST, OBP_SPI_BUSY)); // GDEW042T2 400x300, UC8176 (IL0398)
|
GxEPD2_BW<GxEPD2_420_GYE042A87, GxEPD2_420_GYE042A87::HEIGHT> display(GxEPD2_420_GYE042A87(OBP_SPI_CS, OBP_SPI_DC, OBP_SPI_RST, OBP_SPI_BUSY)); // GDEW042T2 400x300, UC8176 (IL0398)
|
||||||
|
// Export display in new funktion
|
||||||
|
GxEPD2_BW<GxEPD2_420_GYE042A87, GxEPD2_420_GYE042A87::HEIGHT> & getdisplay(){return display;}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISPLAY_SE0420NQ04
|
#ifdef DISPLAY_SE0420NQ04
|
||||||
// Set display type and SPI pins for display
|
// Set display type and SPI pins for display
|
||||||
GxEPD2_BW<GxEPD2_420_SE0420NQ04, GxEPD2_420_SE0420NQ04::HEIGHT> display(GxEPD2_420_SE0420NQ04(OBP_SPI_CS, OBP_SPI_DC, OBP_SPI_RST, OBP_SPI_BUSY)); // GDEW042T2 400x300, UC8176 (IL0398)
|
GxEPD2_BW<GxEPD2_420_SE0420NQ04, GxEPD2_420_SE0420NQ04::HEIGHT> display(GxEPD2_420_SE0420NQ04(OBP_SPI_CS, OBP_SPI_DC, OBP_SPI_RST, OBP_SPI_BUSY)); // GDEW042T2 400x300, UC8176 (IL0398)
|
||||||
|
// Export display in new funktion
|
||||||
|
GxEPD2_BW<GxEPD2_420_SE0420NQ04, GxEPD2_420_SE0420NQ04::HEIGHT> & getdisplay(){return display;}
|
||||||
#endif
|
#endif
|
||||||
gxepd2display *epd = &display;
|
|
||||||
|
|
||||||
// Horter I2C moduls
|
// Horter I2C moduls
|
||||||
PCF8574 pcf8574_Out(PCF8574_I2C_ADDR1); // First digital output modul PCF8574 from Horter
|
PCF8574 pcf8574_Out(PCF8574_I2C_ADDR1); // First digital output modul PCF8574 from Horter
|
||||||
@@ -56,40 +63,27 @@ 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 heartbeat = false; // Heartbeat indicator with two different states
|
|
||||||
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
|
||||||
bool statusBacklightLED = false;// Actual status of flash LED on/off
|
bool statusBacklightLED = false;// Actual status of flash LED on/off
|
||||||
|
|
||||||
int uvDuration = 0; // Under voltage duration in n x 100ms
|
int uvDuration = 0; // Under voltage duration in n x 100ms
|
||||||
|
|
||||||
RTC_DATA_ATTR uint8_t RTC_lastpage; // Remember last page while deep sleeping
|
|
||||||
|
|
||||||
|
|
||||||
LedTaskData *ledTaskData=nullptr;
|
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 as defined
|
Wire.setClock(I2C_SPEED); // Set I2C clock on 10 kHz
|
||||||
if(pcf8574_Out.begin()){ // Initialize PCF8574
|
if(pcf8574_Out.begin()){ // Initialize PCF8574
|
||||||
pcf8574_Out.write8(255); // Clear all outputs
|
pcf8574_Out.write8(255); // Clear all outputs
|
||||||
}
|
}
|
||||||
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
|
||||||
logger->logDebug(GwLog::LOG, "Delaying I2C init for 250ms due to cold boot");
|
api->getLogger()->logDebug(GwLog::LOG,"Delaying I2C init for 250ms due to cold boot");
|
||||||
delay(250);
|
delay(250);
|
||||||
}
|
}
|
||||||
// FRAM (e.g. MB85RC256V)
|
// FRAM (e.g. MB85RC256V)
|
||||||
@@ -101,88 +95,11 @@ 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);
|
||||||
logger->logDebug(GwLog::LOG, "FRAM detected: 0x%04x/0x%04x (counter=%d)", manufacturerID, productID, framcounter);
|
api->getLogger()->logDebug(GwLog::LOG,"FRAM detected: 0x%04x/0x%04x (counter=%d)", manufacturerID, productID, framcounter);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
hasFRAM = false;
|
hasFRAM = false;
|
||||||
logger->logDebug(GwLog::LOG, "NO FRAM detected");
|
api->getLogger()->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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,61 +118,6 @@ void startLedTask(GwApi *api){
|
|||||||
createSpiLedTask(ledTaskData);
|
createSpiLedTask(ledTaskData);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t getLastPage() {
|
|
||||||
return RTC_lastpage;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
void deepSleep(CommonData &common){
|
|
||||||
RTC_lastpage = common.data.actpage - 1;
|
|
||||||
// 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
|
|
||||||
epd->setFullWindow(); // Set full Refresh
|
|
||||||
epd->fillScreen(common.bgcolor); // Clear screen
|
|
||||||
epd->setTextColor(common.fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
|
||||||
epd->setCursor(85, 150);
|
|
||||||
epd->print("Sleep Mode");
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(65, 175);
|
|
||||||
epd->print("To wake up press key and wait 5s");
|
|
||||||
epd->nextPage(); // Update display contents
|
|
||||||
epd->powerOff(); // Display power off
|
|
||||||
setPortPin(OBP_POWER_50, false); // Power off ePaper display
|
|
||||||
// Stop system
|
|
||||||
esp_deep_sleep_start(); // Deep Sleep with weakup via touch pin
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
// Deep sleep funktion
|
|
||||||
void deepSleep(CommonData &common){
|
|
||||||
RTC_lastpage = common.data.actpage - 1;
|
|
||||||
// Switch off all power lines
|
|
||||||
setPortPin(OBP_BACKLIGHT_LED, false); // Backlight Off
|
|
||||||
setFlashLED(false); // Flash LED Off
|
|
||||||
// Shutdown EInk display
|
|
||||||
epd->setFullWindow(); // Set full Refresh
|
|
||||||
//epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
|
||||||
epd->fillScreen(common.bgcolor); // Clear screen
|
|
||||||
epd->setTextColor(common.fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
|
||||||
epd->setCursor(85, 150);
|
|
||||||
epd->print("Sleep Mode");
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(65, 175);
|
|
||||||
epd->print("To wake up press wheel and wait 5s");
|
|
||||||
epd->nextPage(); // Partial update
|
|
||||||
epd->powerOff(); // Display power off
|
|
||||||
setPortPin(OBP_POWER_EPD, false); // Power off ePaper display
|
|
||||||
setPortPin(OBP_POWER_SD, false); // Power off SD card
|
|
||||||
// Stop system
|
|
||||||
esp_deep_sleep_start(); // Deep Sleep with weakup via GPIO pin
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Valid colors see hue
|
// Valid colors see hue
|
||||||
Color colorMapping(const String &colorString){
|
Color colorMapping(const String &colorString){
|
||||||
Color color = COLOR_RED;
|
Color color = COLOR_RED;
|
||||||
@@ -293,31 +155,31 @@ void setBacklightLED(uint brightness, const Color &color){
|
|||||||
ledTaskData->setLedData(current);
|
ledTaskData->setLedData(current);
|
||||||
}
|
}
|
||||||
|
|
||||||
void toggleBacklightLED(uint brightness, const Color &color) {
|
void toggleBacklightLED(uint brightness, const Color &color){
|
||||||
if (ledTaskData == nullptr) return;
|
if (ledTaskData == nullptr) return;
|
||||||
statusBacklightLED = !statusBacklightLED;
|
statusBacklightLED = !statusBacklightLED;
|
||||||
Color nv = setBrightness(statusBacklightLED ? color : COLOR_BLACK, brightness);
|
Color nv=setBrightness(statusBacklightLED?color:COLOR_BLACK,brightness);
|
||||||
LedInterface current = ledTaskData->getLedData();
|
LedInterface current=ledTaskData->getLedData();
|
||||||
current.setBacklight(nv);
|
current.setBacklight(nv);
|
||||||
ledTaskData->setLedData(current);
|
ledTaskData->setLedData(current);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setFlashLED(bool status) {
|
void setFlashLED(bool status){
|
||||||
if (ledTaskData == nullptr) return;
|
if (ledTaskData == nullptr) return;
|
||||||
Color c = status ? COLOR_RED : COLOR_BLACK;
|
Color c=status?COLOR_RED:COLOR_BLACK;
|
||||||
LedInterface current = ledTaskData->getLedData();
|
LedInterface current=ledTaskData->getLedData();
|
||||||
current.setFlash(c);
|
current.setFlash(c);
|
||||||
ledTaskData->setLedData(current);
|
ledTaskData->setLedData(current);
|
||||||
}
|
}
|
||||||
|
|
||||||
void blinkingFlashLED() {
|
void blinkingFlashLED(){
|
||||||
if (blinkingLED == true) {
|
if(blinkingLED == true){
|
||||||
statusLED = !statusLED; // Toggle LED for each run
|
statusLED = !statusLED; // Toggle LED for each run
|
||||||
setFlashLED(statusLED);
|
setFlashLED(statusLED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setBlinkingLED(bool status) {
|
void setBlinkingLED(bool status){
|
||||||
blinkingLED = status;
|
blinkingLED = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -347,123 +209,70 @@ void setBuzzerPower(uint power){
|
|||||||
buzzerpower = power;
|
buzzerpower = power;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete xdr prefix from string and optional limit length
|
// Delete xdr prefix from string
|
||||||
String xdrDelete(String input, uint8_t maxlen) {
|
String xdrDelete(String input){
|
||||||
if (input.substring(0, 3) == "xdr") {
|
if(input.substring(0,3) == "xdr"){
|
||||||
input = input.substring(3, input.length());
|
input = input.substring(3, input.length());
|
||||||
}
|
}
|
||||||
if (maxlen > 0) {
|
|
||||||
return input.substring(0, maxlen);
|
|
||||||
}
|
|
||||||
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) {
|
||||||
epd->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);
|
||||||
epd->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++) {
|
|
||||||
epd->drawLine(points[i].x, points[i].y, points[i+1].x, points[i+1].y, color);
|
|
||||||
}
|
|
||||||
// close path
|
|
||||||
epd->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;
|
||||||
uint16_t w, h;
|
uint16_t w, h;
|
||||||
epd->getTextBounds(text, 0, 150, &x1, &y1, &w, &h);
|
getdisplay().getTextBounds(text, 0, 150, &x1, &y1, &w, &h);
|
||||||
epd->setCursor(cx - w / 2, cy + h / 2);
|
getdisplay().setCursor(cx - w / 2, cy + h / 2);
|
||||||
epd->print(text);
|
getdisplay().print(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw right aligned text
|
// Draw right aligned text
|
||||||
void drawTextRalign(int16_t x, int16_t y, String text) {
|
void drawTextRalign(int16_t x, int16_t y, String text) {
|
||||||
int16_t x1, y1;
|
int16_t x1, y1;
|
||||||
uint16_t w, h;
|
uint16_t w, h;
|
||||||
epd->getTextBounds(text, 0, 150, &x1, &y1, &w, &h);
|
getdisplay().getTextBounds(text, 0, 150, &x1, &y1, &w, &h);
|
||||||
epd->setCursor(x - w, y);
|
getdisplay().setCursor(x - w, y);
|
||||||
epd->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) {
|
|
||||||
epd->fillRect(box.x, box.y, box.w, box.h, fg);
|
|
||||||
epd->setTextColor(bg);
|
|
||||||
} else {
|
|
||||||
if (border) {
|
|
||||||
epd->fillRect(box.x + 1, box.y + 1, box.w - 2, box.h - 2, bg);
|
|
||||||
epd->drawRect(box.x, box.y, box.w, box.h, fg);
|
|
||||||
}
|
|
||||||
epd->setTextColor(fg);
|
|
||||||
}
|
|
||||||
uint16_t border_offset = box.h / 4; // 25% of box height
|
|
||||||
epd->setCursor(box.x + border_offset, box.y + box.h - border_offset);
|
|
||||||
epd->print(text);
|
|
||||||
epd->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){
|
||||||
epd->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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show a triangle for trend direction low (x, y is the left edge)
|
// Show a triangle for trend direction low (x, y is the left edge)
|
||||||
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){
|
||||||
epd->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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show header informations
|
// Show header informations
|
||||||
void displayHeader(CommonData &commonData, bool symbolmode, GwApi::BoatValue *date, GwApi::BoatValue *time, GwApi::BoatValue *hdop){
|
void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatValue *time, GwApi::BoatValue *hdop){
|
||||||
|
|
||||||
|
static bool heartbeat = false;
|
||||||
static unsigned long usbRxOld = 0;
|
static unsigned long usbRxOld = 0;
|
||||||
static unsigned long usbTxOld = 0;
|
static unsigned long usbTxOld = 0;
|
||||||
static unsigned long serRxOld = 0;
|
static unsigned long serRxOld = 0;
|
||||||
@@ -474,66 +283,36 @@ void displayHeader(CommonData &commonData, bool symbolmode, GwApi::BoatValue *da
|
|||||||
static unsigned long tcpClTxOld = 0;
|
static unsigned long tcpClTxOld = 0;
|
||||||
static unsigned long n2kRxOld = 0;
|
static unsigned long n2kRxOld = 0;
|
||||||
static unsigned long n2kTxOld = 0;
|
static unsigned long n2kTxOld = 0;
|
||||||
|
int textcolor = GxEPD_BLACK;
|
||||||
|
|
||||||
uint16_t symbol_x = 2;
|
|
||||||
static const uint16_t symbol_offset = 20;
|
|
||||||
|
|
||||||
// TODO invert and get rid of the if
|
|
||||||
if(commonData.config->getBool(commonData.config->statusLine) == true){
|
if(commonData.config->getBool(commonData.config->statusLine) == true){
|
||||||
|
|
||||||
|
// Header separator line (optional)
|
||||||
|
// getdisplay().drawLine(0, 19, 399, 19, commonData.fgcolor);
|
||||||
|
|
||||||
// Show status info
|
// Show status info
|
||||||
epd->setTextColor(commonData.fgcolor);
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(0, 15);
|
getdisplay().setCursor(0, 15);
|
||||||
if (commonData.status.wifiApOn) {
|
if(commonData.status.wifiApOn){
|
||||||
if (symbolmode) {
|
getdisplay().print(" AP ");
|
||||||
epd->drawXBitmap(symbol_x, 1, iconmap["AP"], icon_width, icon_height, commonData.fgcolor);
|
|
||||||
symbol_x += symbol_offset;
|
|
||||||
} else {
|
|
||||||
epd->print(" AP ");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// If receive new telegram data then display bus name
|
// If receive new telegram data then display bus name
|
||||||
if(commonData.status.tcpClRx != tcpClRxOld || commonData.status.tcpClTx != tcpClTxOld || commonData.status.tcpSerRx != tcpSerRxOld || commonData.status.tcpSerTx != tcpSerTxOld){
|
if(commonData.status.tcpClRx != tcpClRxOld || commonData.status.tcpClTx != tcpClTxOld || commonData.status.tcpSerRx != tcpSerRxOld || commonData.status.tcpSerTx != tcpSerTxOld){
|
||||||
if (symbolmode) {
|
getdisplay().print("TCP ");
|
||||||
epd->drawXBitmap(symbol_x, 1, iconmap["TCP"], icon_width, icon_height, commonData.fgcolor);
|
|
||||||
symbol_x += symbol_offset;
|
|
||||||
} else {
|
|
||||||
epd->print("TCP ");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(commonData.status.n2kRx != n2kRxOld || commonData.status.n2kTx != n2kTxOld){
|
if(commonData.status.n2kRx != n2kRxOld || commonData.status.n2kTx != n2kTxOld){
|
||||||
if (symbolmode) {
|
getdisplay().print("N2K ");
|
||||||
epd->drawXBitmap(symbol_x, 1, iconmap["N2K"], icon_width, icon_height, commonData.fgcolor);
|
|
||||||
symbol_x += symbol_offset;
|
|
||||||
} else {
|
|
||||||
epd->print("N2K ");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(commonData.status.serRx != serRxOld || commonData.status.serTx != serTxOld){
|
if(commonData.status.serRx != serRxOld || commonData.status.serTx != serTxOld){
|
||||||
if (symbolmode) {
|
getdisplay().print("183 ");
|
||||||
epd->drawXBitmap(symbol_x, 1, iconmap["0183"], icon_width, icon_height, commonData.fgcolor);
|
|
||||||
symbol_x += symbol_offset;
|
|
||||||
} else {
|
|
||||||
epd->print("183 ");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(commonData.status.usbRx != usbRxOld || commonData.status.usbTx != usbTxOld){
|
if(commonData.status.usbRx != usbRxOld || commonData.status.usbTx != usbTxOld){
|
||||||
if (symbolmode) {
|
getdisplay().print("USB ");
|
||||||
epd->drawXBitmap(symbol_x, 1, iconmap["USB"], icon_width, icon_height, commonData.fgcolor);
|
|
||||||
symbol_x += symbol_offset;
|
|
||||||
} else {
|
|
||||||
epd->print("USB ");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
double gpshdop = commonData.fmt->formatValue(hdop, commonData).value;
|
double gpshdop = formatValue(hdop, commonData).value;
|
||||||
if(commonData.config->getString(commonData.config->useGPS) != "off" && gpshdop <= commonData.config->getInt(commonData.config->hdopAccuracy) && hdop->valid == true){
|
if(commonData.config->getString(commonData.config->useGPS) != "off" && gpshdop <= commonData.config->getInt(commonData.config->hdopAccuracy) && hdop->valid == true){
|
||||||
if (symbolmode) {
|
getdisplay().print("GPS");
|
||||||
epd->drawXBitmap(symbol_x, 1, iconmap["GPS"], icon_width, icon_height, commonData.fgcolor);
|
|
||||||
symbol_x += symbol_offset;
|
|
||||||
} else {
|
|
||||||
epd->print("GPS");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Save old telegram counter
|
// Save old telegram counter
|
||||||
tcpClRxOld = commonData.status.tcpClRx;
|
tcpClRxOld = commonData.status.tcpClRx;
|
||||||
@@ -550,95 +329,54 @@ void displayHeader(CommonData &commonData, bool symbolmode, GwApi::BoatValue *da
|
|||||||
#ifdef HARDWARE_V21
|
#ifdef HARDWARE_V21
|
||||||
// Display key lock status
|
// Display key lock status
|
||||||
if (commonData.keylock) {
|
if (commonData.keylock) {
|
||||||
epd->drawXBitmap(170, 1, lock_bits, icon_width, icon_height, commonData.fgcolor);
|
getdisplay().drawXBitmap(170, 1, lock_bits, icon_width, icon_height, commonData.fgcolor);
|
||||||
} else {
|
} else {
|
||||||
epd->drawXBitmap(166, 1, swipe_bits, swipe_width, swipe_height, commonData.fgcolor);
|
getdisplay().drawXBitmap(166, 1, swipe_bits, swipe_width, swipe_height, commonData.fgcolor);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef LIPO_ACCU_1200
|
|
||||||
if (commonData.data.BatteryChargeStatus == 1) {
|
|
||||||
epd->drawXBitmap(170, 1, battery_loading_bits, battery_width, battery_height, commonData.fgcolor);
|
|
||||||
} else {
|
|
||||||
#ifdef VOLTAGE_SENSOR
|
|
||||||
if (commonData.data.batteryLevelLiPo < 10) {
|
|
||||||
epd->drawXBitmap(170, 1, battery_0_bits, battery_width, battery_height, commonData.fgcolor);
|
|
||||||
} else if (commonData.data.batteryLevelLiPo < 25) {
|
|
||||||
epd->drawXBitmap(170, 1, battery_25_bits, battery_width, battery_height, commonData.fgcolor);
|
|
||||||
} else if (commonData.data.batteryLevelLiPo < 50) {
|
|
||||||
epd->drawXBitmap(170, 1, battery_50_bits, battery_width, battery_height, commonData.fgcolor);
|
|
||||||
} else if (commonData.data.batteryLevelLiPo < 75) {
|
|
||||||
epd->drawXBitmap(170, 1, battery_75_bits, battery_width, battery_height, commonData.fgcolor);
|
|
||||||
} else {
|
|
||||||
epd->drawXBitmap(170, 1, battery_100_bits, battery_width, battery_height, commonData.fgcolor);
|
|
||||||
}
|
|
||||||
#endif // VOLTAGE_SENSOR
|
|
||||||
}
|
|
||||||
#endif // LIPO_ACCU_1200
|
|
||||||
|
|
||||||
// Heartbeat as page number
|
// Heartbeat as dot
|
||||||
if (heartbeat) {
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
epd->setTextColor(commonData.bgcolor);
|
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
||||||
epd->fillRect(201, 0, 23, 19, commonData.fgcolor);
|
getdisplay().setCursor(205, 14);
|
||||||
} else {
|
getdisplay().print(heartbeat ? "." : " ");
|
||||||
epd->setTextColor(commonData.fgcolor);
|
heartbeat = !heartbeat;
|
||||||
epd->drawRect(201, 0, 23, 19, commonData.fgcolor);
|
|
||||||
}
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
drawTextCenter(211, 9, String(commonData.data.actpage));
|
|
||||||
heartbeat = !heartbeat;
|
|
||||||
|
|
||||||
// Date and time
|
// Date and time
|
||||||
fmtDate fmttype = commonData.fmt->getDateFormat(commonData.config->getString(commonData.config->dateFormat));
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
String timesource = commonData.config->getString(commonData.config->timeSource);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
double tz = commonData.config->getString(commonData.config->timeZone).toDouble();
|
getdisplay().setCursor(230, 15);
|
||||||
epd->setTextColor(commonData.fgcolor);
|
// Show date and time if date present
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
if(date->valid == true){
|
||||||
epd->setCursor(230, 15);
|
String acttime = formatValue(time, commonData).svalue;
|
||||||
if (timesource == "RTC" or timesource == "iRTC") {
|
acttime = acttime.substring(0, 5);
|
||||||
// TODO take DST into account
|
String actdate = formatValue(date, commonData).svalue;
|
||||||
if (commonData.data.rtcValid) {
|
getdisplay().print(acttime);
|
||||||
time_t tv = mktime(&commonData.data.rtcTime) + (int)(tz * 3600);
|
getdisplay().print(" ");
|
||||||
struct tm *local_tm = localtime(&tv);
|
getdisplay().print(actdate);
|
||||||
epd->print(formatTime(fmtTime::MMHH, local_tm->tm_hour, local_tm->tm_min, 0));
|
getdisplay().print(" ");
|
||||||
epd->print(" ");
|
if(commonData.config->getInt(commonData.config->timeZone) == 0){
|
||||||
epd->print(formatDate(fmttype, local_tm->tm_year + 1900, local_tm->tm_mon + 1, local_tm->tm_mday));
|
getdisplay().print("UTC");
|
||||||
epd->print(" ");
|
|
||||||
epd->print(tz == 0 ? "UTC" : "LOT");
|
|
||||||
} else {
|
|
||||||
drawTextRalign(396, 15, "RTC invalid");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (timesource == "GPS") {
|
|
||||||
// Show date and time if date present
|
|
||||||
if(date->valid == true){
|
|
||||||
String acttime = commonData.fmt->formatValue(time, commonData).svalue;
|
|
||||||
acttime = acttime.substring(0, 5);
|
|
||||||
String actdate = commonData.fmt->formatValue(date, commonData).svalue;
|
|
||||||
epd->print(acttime);
|
|
||||||
epd->print(" ");
|
|
||||||
epd->print(actdate);
|
|
||||||
epd->print(" ");
|
|
||||||
epd->print(tz == 0 ? "UTC" : "LOT");
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(commonData.config->getBool(commonData.config->useSimuData) == true){
|
getdisplay().print("LOT");
|
||||||
epd->print("12:00 01.01.2024 LOT");
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
drawTextRalign(396, 15, "No GPS data");
|
if(commonData.config->getBool(commonData.config->useSimuData) == true){
|
||||||
}
|
getdisplay().print("12:00 01.01.2024 LOT");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print("No GPS data");
|
||||||
}
|
}
|
||||||
} // timesource == "GPS"
|
|
||||||
else {
|
|
||||||
epd->print("No time source");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayFooter(CommonData &commonData) {
|
void displayFooter(CommonData &commonData) {
|
||||||
|
|
||||||
epd->setFont(&Atari16px);
|
getdisplay().setFont(&Atari16px);
|
||||||
epd->setTextColor(commonData.fgcolor);
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
|
|
||||||
#ifdef HARDWARE_V21
|
#ifdef HARDWARE_V21
|
||||||
// Frame around key icon area
|
// Frame around key icon area
|
||||||
@@ -646,16 +384,17 @@ void displayFooter(CommonData &commonData) {
|
|||||||
// horizontal elements
|
// horizontal elements
|
||||||
const uint16_t top = 280;
|
const uint16_t top = 280;
|
||||||
const uint16_t bottom = 299;
|
const uint16_t bottom = 299;
|
||||||
// horizontal stub lines
|
getdisplay().drawLine(commonData.keydata[0].x, top, commonData.keydata[0].x+10, top, commonData.fgcolor);
|
||||||
epd->drawLine(commonData.keydata[0].x, top, commonData.keydata[0].x+10, top, commonData.fgcolor);
|
getdisplay().drawLine(commonData.keydata[1].x-10, top, commonData.keydata[1].x+10, top, commonData.fgcolor);
|
||||||
for (int i = 1; i <= 5; i++) {
|
getdisplay().drawLine(commonData.keydata[2].x-10, top, commonData.keydata[2].x+10, top, commonData.fgcolor);
|
||||||
epd->drawLine(commonData.keydata[i].x-10, top, commonData.keydata[i].x+10, top, commonData.fgcolor);
|
getdisplay().drawLine(commonData.keydata[4].x-10, top, commonData.keydata[4].x+10, top, commonData.fgcolor);
|
||||||
}
|
getdisplay().drawLine(commonData.keydata[5].x-10, top, commonData.keydata[5].x+10, top, commonData.fgcolor);
|
||||||
epd->drawLine(commonData.keydata[5].x + commonData.keydata[5].w - 10, top, commonData.keydata[5].x + commonData.keydata[5].w + 1, top, commonData.fgcolor);
|
getdisplay().drawLine(commonData.keydata[5].x + commonData.keydata[5].w - 10, top, commonData.keydata[5].x + commonData.keydata[5].w + 1, top, commonData.fgcolor);
|
||||||
// vertical key separators
|
// vertical key separators
|
||||||
for (int i = 0; i <= 4; i++) {
|
getdisplay().drawLine(commonData.keydata[0].x + commonData.keydata[0].w, top, commonData.keydata[0].x + commonData.keydata[0].w, bottom, commonData.fgcolor);
|
||||||
epd->drawLine(commonData.keydata[i].x + commonData.keydata[i].w, top, commonData.keydata[i].x + commonData.keydata[i].w, bottom, commonData.fgcolor);
|
getdisplay().drawLine(commonData.keydata[1].x + commonData.keydata[1].w, top, commonData.keydata[1].x + commonData.keydata[1].w, bottom, commonData.fgcolor);
|
||||||
}
|
getdisplay().drawLine(commonData.keydata[3].x + commonData.keydata[3].w, top, commonData.keydata[3].x + commonData.keydata[3].w, bottom, commonData.fgcolor);
|
||||||
|
getdisplay().drawLine(commonData.keydata[4].x + commonData.keydata[4].w, top, commonData.keydata[4].x + commonData.keydata[4].w, bottom, commonData.fgcolor);
|
||||||
for (int i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
uint16_t x, y;
|
uint16_t x, y;
|
||||||
if (commonData.keydata[i].label.length() > 0) {
|
if (commonData.keydata[i].label.length() > 0) {
|
||||||
@@ -665,7 +404,7 @@ void displayFooter(CommonData &commonData) {
|
|||||||
if (iconmap.find(icon_name) != iconmap.end()) {
|
if (iconmap.find(icon_name) != iconmap.end()) {
|
||||||
x = commonData.keydata[i].x + (commonData.keydata[i].w - icon_width) / 2;
|
x = commonData.keydata[i].x + (commonData.keydata[i].w - icon_width) / 2;
|
||||||
y = commonData.keydata[i].y + (commonData.keydata[i].h - icon_height) / 2;
|
y = commonData.keydata[i].y + (commonData.keydata[i].h - icon_height) / 2;
|
||||||
epd->drawXBitmap(x, y, iconmap[icon_name], icon_width, icon_height, commonData.fgcolor);
|
getdisplay().drawXBitmap(x, y, iconmap[icon_name], icon_width, icon_height, commonData.fgcolor);
|
||||||
} else {
|
} else {
|
||||||
// icon is missing, use name instead
|
// icon is missing, use name instead
|
||||||
x = commonData.keydata[i].x + commonData.keydata[i].w / 2;
|
x = commonData.keydata[i].x + commonData.keydata[i].w / 2;
|
||||||
@@ -679,12 +418,15 @@ void displayFooter(CommonData &commonData) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Current page number in a small box
|
||||||
|
getdisplay().drawRect(190, 280, 23, 19, commonData.fgcolor);
|
||||||
|
drawTextCenter(200, 289, String(commonData.data.actpage));
|
||||||
} else {
|
} else {
|
||||||
epd->setCursor(65, 295);
|
getdisplay().setCursor(65, 295);
|
||||||
epd->print("Press 1 and 6 fast to unlock keys");
|
getdisplay().print("Press 1 and 6 fast to unlock keys");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef BOARD_OBP40S3
|
#ifdef HARDWARE_LIGHT
|
||||||
// grapical page indicator
|
// grapical page indicator
|
||||||
static const uint16_t r = 5;
|
static const uint16_t r = 5;
|
||||||
static const uint16_t space = 4;
|
static const uint16_t space = 4;
|
||||||
@@ -692,68 +434,17 @@ void displayFooter(CommonData &commonData) {
|
|||||||
uint16_t x0 = (GxEPD_WIDTH - w) / 2 + r * 2;
|
uint16_t x0 = (GxEPD_WIDTH - w) / 2 + r * 2;
|
||||||
for (int i = 0; i < commonData.data.maxpage; i++) {
|
for (int i = 0; i < commonData.data.maxpage; i++) {
|
||||||
if (i == (commonData.data.actpage - 1)) {
|
if (i == (commonData.data.actpage - 1)) {
|
||||||
epd->fillCircle(x0 + i * (r * 2 + space), 290, r, commonData.fgcolor);
|
getdisplay().fillCircle(x0 + i * (r * 2 + space), 290, r, commonData.fgcolor);
|
||||||
} else {
|
} else {
|
||||||
epd->drawCircle(x0 + i * (r * 2 + space), 290, r, commonData.fgcolor);
|
getdisplay().drawCircle(x0 + i * (r * 2 + space), 290, r, commonData.fgcolor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// key indicators
|
|
||||||
// left side = top key "menu"
|
|
||||||
epd->drawLine(0, 280, 10, 280, commonData.fgcolor);
|
|
||||||
epd->drawLine(55, 280, 65, 280, commonData.fgcolor);
|
|
||||||
epd->drawLine(65, 280, 65, 299, commonData.fgcolor);
|
|
||||||
drawTextCenter(33, 291, commonData.keydata[0].label);
|
|
||||||
// right side = bottom key "exit"
|
|
||||||
epd->drawLine(390, 280, 399, 280, commonData.fgcolor);
|
|
||||||
epd->drawLine(335, 280, 345, 280, commonData.fgcolor);
|
|
||||||
epd->drawLine(335, 280, 335, 399, commonData.fgcolor);
|
|
||||||
drawTextCenter(366, 291, commonData.keydata[1].label);
|
|
||||||
#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;
|
|
||||||
|
|
||||||
epd->setFont(&Atari16px);
|
|
||||||
epd->setTextColor(commonData.fgcolor);
|
|
||||||
|
|
||||||
// overlay
|
|
||||||
epd->drawRect(x, y, w, h, commonData.fgcolor);
|
|
||||||
epd->fillRect(x + 1, y + 1, w - 1, h - 1, commonData.bgcolor);
|
|
||||||
epd->drawRect(x + 3, y + 3, w - 5, h - 5, commonData.fgcolor);
|
|
||||||
|
|
||||||
// exclamation icon in left top corner
|
|
||||||
epd->drawXBitmap(x + 16, y + 16, exclamation_bits, exclamation_width, exclamation_height, commonData.fgcolor);
|
|
||||||
|
|
||||||
// title
|
|
||||||
epd->setCursor(x + 64, y + 30);
|
|
||||||
epd->print("A L A R M");
|
|
||||||
epd->setCursor(x + 64, y + 48);
|
|
||||||
epd->print("#" + commonData.alarm.id);
|
|
||||||
epd->print(" from ");
|
|
||||||
epd->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) {
|
|
||||||
epd->setCursor(x + 16, y + 80 + n);
|
|
||||||
epd->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(GwApi *api, double time, double date, double latitude, double longitude, double timezone){
|
||||||
|
GwLog *logger=api->getLogger();
|
||||||
SunData returnset;
|
SunData returnset;
|
||||||
SunRise sr;
|
SunRise sr;
|
||||||
int secPerHour = 3600;
|
int secPerHour = 3600;
|
||||||
@@ -767,7 +458,8 @@ SunData calcSunsetSunrise(double time, double date, double latitude, double long
|
|||||||
if (!isnan(time) && !isnan(date) && !isnan(latitude) && !isnan(longitude) && !isnan(timezone)) {
|
if (!isnan(time) && !isnan(date) && !isnan(latitude) && !isnan(longitude) && !isnan(timezone)) {
|
||||||
|
|
||||||
// Calculate local epoch
|
// Calculate local epoch
|
||||||
t = (date * secPerYear) + time;
|
t = (date * secPerYear) + time;
|
||||||
|
// api->getLogger()->logDebug(GwLog::DEBUG,"... calcSun: Lat %f, Lon %f, at: %d ", latitude, longitude, t);
|
||||||
sr.calculate(latitude, longitude, t); // LAT, LON, EPOCH
|
sr.calculate(latitude, longitude, t); // LAT, LON, EPOCH
|
||||||
// Sunrise
|
// Sunrise
|
||||||
if (sr.hasRise) {
|
if (sr.hasRise) {
|
||||||
@@ -790,37 +482,6 @@ SunData calcSunsetSunrise(double time, double date, double latitude, double long
|
|||||||
return returnset;
|
return returnset;
|
||||||
}
|
}
|
||||||
|
|
||||||
SunData calcSunsetSunriseRTC(struct tm *rtctime, double latitude, double longitude, float timezone) {
|
|
||||||
SunData returnset;
|
|
||||||
SunRise sr;
|
|
||||||
const int secPerHour = 3600;
|
|
||||||
const int secPerYear = 86400;
|
|
||||||
sr.hasRise = false;
|
|
||||||
sr.hasSet = false;
|
|
||||||
time_t t = mktime(rtctime) + timezone * 3600;;
|
|
||||||
time_t sunR = 0;
|
|
||||||
time_t sunS = 0;
|
|
||||||
|
|
||||||
sr.calculate(latitude, longitude, t); // LAT, LON, EPOCH
|
|
||||||
// Sunrise
|
|
||||||
if (sr.hasRise) {
|
|
||||||
sunR = (sr.riseTime + int(timezone * secPerHour) + 30) % secPerYear; // add 30 seconds: round to minutes
|
|
||||||
returnset.sunriseHour = int (sunR / secPerHour);
|
|
||||||
returnset.sunriseMinute = int((sunR - returnset.sunriseHour * secPerHour) / 60);
|
|
||||||
}
|
|
||||||
// Sunset
|
|
||||||
if (sr.hasSet) {
|
|
||||||
sunS = (sr.setTime + int(timezone * secPerHour) + 30) % secPerYear; // add 30 seconds: round to minutes
|
|
||||||
returnset.sunsetHour = int (sunS / secPerHour);
|
|
||||||
returnset.sunsetMinute = int((sunS - returnset.sunsetHour * secPerHour) / 60);
|
|
||||||
}
|
|
||||||
// Sun control (return value by sun on sky = false, sun down = true)
|
|
||||||
if ((t >= sr.riseTime) && (t <= sr.setTime))
|
|
||||||
returnset.sunDown = false;
|
|
||||||
else returnset.sunDown = true;
|
|
||||||
return returnset;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Battery graphic with fill level
|
// Battery graphic with fill level
|
||||||
void batteryGraphic(uint x, uint y, float percent, int pcolor, int bcolor){
|
void batteryGraphic(uint x, uint y, float percent, int pcolor, int bcolor){
|
||||||
// Show battery
|
// Show battery
|
||||||
@@ -836,20 +497,20 @@ void batteryGraphic(uint x, uint y, float percent, int pcolor, int bcolor){
|
|||||||
}
|
}
|
||||||
// Battery corpus 100x80 with fill level
|
// Battery corpus 100x80 with fill level
|
||||||
int level = int((100.0 - percent) * (80-(2*t)) / 100.0);
|
int level = int((100.0 - percent) * (80-(2*t)) / 100.0);
|
||||||
epd->fillRect(xb, yb, 100, 80, pcolor);
|
getdisplay().fillRect(xb, yb, 100, 80, pcolor);
|
||||||
if(percent < 99){
|
if(percent < 99){
|
||||||
epd->fillRect(xb+t, yb+t, 100-(2*t), level, bcolor);
|
getdisplay().fillRect(xb+t, yb+t, 100-(2*t), level, bcolor);
|
||||||
}
|
}
|
||||||
// Plus pol 20x15
|
// Plus pol 20x15
|
||||||
int xp = xb + 20;
|
int xp = xb + 20;
|
||||||
int yp = yb - 15 + t;
|
int yp = yb - 15 + t;
|
||||||
epd->fillRect(xp, yp, 20, 15, pcolor);
|
getdisplay().fillRect(xp, yp, 20, 15, pcolor);
|
||||||
epd->fillRect(xp+t, yp+t, 20-(2*t), 15-(2*t), bcolor);
|
getdisplay().fillRect(xp+t, yp+t, 20-(2*t), 15-(2*t), bcolor);
|
||||||
// Minus pol 20x15
|
// Minus pol 20x15
|
||||||
int xm = xb + 60;
|
int xm = xb + 60;
|
||||||
int ym = yb -15 + t;
|
int ym = yb -15 + t;
|
||||||
epd->fillRect(xm, ym, 20, 15, pcolor);
|
getdisplay().fillRect(xm, ym, 20, 15, pcolor);
|
||||||
epd->fillRect(xm+t, ym+t, 20-(2*t), 15-(2*t), bcolor);
|
getdisplay().fillRect(xm+t, ym+t, 20-(2*t), 15-(2*t), bcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Solar graphic with fill level
|
// Solar graphic with fill level
|
||||||
@@ -861,17 +522,17 @@ void solarGraphic(uint x, uint y, int pcolor, int bcolor){
|
|||||||
int percent = 0;
|
int percent = 0;
|
||||||
// Solar corpus 100x80
|
// Solar corpus 100x80
|
||||||
int level = int((100.0 - percent) * (80-(2*t)) / 100.0);
|
int level = int((100.0 - percent) * (80-(2*t)) / 100.0);
|
||||||
epd->fillRect(xb, yb, 100, 80, pcolor);
|
getdisplay().fillRect(xb, yb, 100, 80, pcolor);
|
||||||
if(percent < 99){
|
if(percent < 99){
|
||||||
epd->fillRect(xb+t, yb+t, 100-(2*t), level, bcolor);
|
getdisplay().fillRect(xb+t, yb+t, 100-(2*t), level, bcolor);
|
||||||
}
|
}
|
||||||
// Draw horizontel lines
|
// Draw horizontel lines
|
||||||
epd->fillRect(xb, yb+28-t, 100, t, pcolor);
|
getdisplay().fillRect(xb, yb+28-t, 100, t, pcolor);
|
||||||
epd->fillRect(xb, yb+54-t, 100, t, pcolor);
|
getdisplay().fillRect(xb, yb+54-t, 100, t, pcolor);
|
||||||
// Draw vertical lines
|
// Draw vertical lines
|
||||||
epd->fillRect(xb+19+t, yb, t, 80, pcolor);
|
getdisplay().fillRect(xb+19+t, yb, t, 80, pcolor);
|
||||||
epd->fillRect(xb+39+2*t, yb, t, 80, pcolor);
|
getdisplay().fillRect(xb+39+2*t, yb, t, 80, pcolor);
|
||||||
epd->fillRect(xb+59+3*t, yb, t, 80, pcolor);
|
getdisplay().fillRect(xb+59+3*t, yb, t, 80, pcolor);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -883,13 +544,13 @@ void generatorGraphic(uint x, uint y, int pcolor, int bcolor){
|
|||||||
int t = 4; // Line thickness
|
int t = 4; // Line thickness
|
||||||
|
|
||||||
// Generator corpus with radius 45
|
// Generator corpus with radius 45
|
||||||
epd->fillCircle(xb, yb, 45, pcolor);
|
getdisplay().fillCircle(xb, yb, 45, pcolor);
|
||||||
epd->fillCircle(xb, yb, 41, bcolor);
|
getdisplay().fillCircle(xb, yb, 41, bcolor);
|
||||||
// Insert G
|
// Insert G
|
||||||
epd->setTextColor(pcolor);
|
getdisplay().setTextColor(pcolor);
|
||||||
epd->setFont(&Ubuntu_Bold32pt8b);
|
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
||||||
epd->setCursor(xb-22, yb+20);
|
getdisplay().setCursor(xb-22, yb+20);
|
||||||
epd->print("G");
|
getdisplay().print("G");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function to handle HTTP image request
|
// Function to handle HTTP image request
|
||||||
@@ -903,7 +564,7 @@ void doImageRequest(GwApi *api, int *pageno, const PageStruct pages[MAX_PAGE_NUM
|
|||||||
|
|
||||||
logger->logDebug(GwLog::LOG,"handle image request [%s]: %s", imgformat, filename);
|
logger->logDebug(GwLog::LOG,"handle image request [%s]: %s", imgformat, filename);
|
||||||
|
|
||||||
uint8_t *fb = epd->getBuffer(); // EPD framebuffer
|
uint8_t *fb = getdisplay().getBuffer(); // EPD framebuffer
|
||||||
std::vector<uint8_t> imageBuffer; // image in webserver transferbuffer
|
std::vector<uint8_t> imageBuffer; // image in webserver transferbuffer
|
||||||
String mimetype;
|
String mimetype;
|
||||||
|
|
||||||
@@ -926,7 +587,7 @@ void doImageRequest(GwApi *api, int *pageno, const PageStruct pages[MAX_PAGE_NUM
|
|||||||
createPBM(fb, &imageBuffer, GxEPD_WIDTH, GxEPD_HEIGHT);
|
createPBM(fb, &imageBuffer, GxEPD_WIDTH, GxEPD_HEIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
AsyncWebServerResponse *response = request->beginResponse(200, mimetype, (const uint8_t*)imageBuffer.data(), imageBuffer.size());
|
AsyncWebServerResponse *response = request->beginResponse_P(200, mimetype, (const uint8_t*)imageBuffer.data(), imageBuffer.size());
|
||||||
response->addHeader("Content-Disposition", "inline; filename=" + filename);
|
response->addHeader("Content-Disposition", "inline; filename=" + filename);
|
||||||
request->send(response);
|
request->send(response);
|
||||||
|
|
||||||
|
|||||||
@@ -1,30 +1,19 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#ifndef _OBP60EXTENSIONPORT_H
|
#ifndef _OBP60EXTENSIONPORT_H
|
||||||
#define _OBP60EXTENSIONPORT_H
|
#define _OBP60EXTENSIONPORT_H
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "OBP60Hardware.h"
|
#include "OBP60Hardware.h"
|
||||||
#include "OBP60Formatter.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
|
||||||
#define FRAM_SYSTEM_MODE 0x009
|
|
||||||
// Voltage page
|
// Voltage page
|
||||||
#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
|
||||||
@@ -34,58 +23,46 @@
|
|||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
extern bool heartbeat;
|
|
||||||
|
|
||||||
// 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_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 Atari6px;
|
|
||||||
|
|
||||||
// Global functions
|
// Global functions
|
||||||
#ifdef DISPLAY_GDEW042T2
|
#ifdef DISPLAY_GDEW042T2
|
||||||
typedef GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> gxepd2display;
|
GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> & getdisplay();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISPLAY_GDEY042T81
|
#ifdef DISPLAY_GDEY042T81
|
||||||
typedef GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> gxepd2display;
|
GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> & getdisplay();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISPLAY_GYE042A87
|
#ifdef DISPLAY_GYE042A87
|
||||||
typedef GxEPD2_BW<GxEPD2_420_GYE042A87, GxEPD2_420_GYE042A87::HEIGHT> gxepd2display;
|
GxEPD2_BW<GxEPD2_420_GYE042A87, GxEPD2_420_GYE042A87::HEIGHT> & getdisplay();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISPLAY_SE0420NQ04
|
#ifdef DISPLAY_SE0420NQ04
|
||||||
typedef GxEPD2_BW<GxEPD2_420_SE0420NQ04, GxEPD2_420_SE0420NQ04::HEIGHT> gxepd2display;
|
GxEPD2_BW<GxEPD2_420_SE0420NQ04, GxEPD2_420_SE0420NQ04::HEIGHT> & getdisplay();
|
||||||
#endif
|
#endif
|
||||||
extern gxepd2display *epd;
|
|
||||||
|
|
||||||
// Page display return values
|
|
||||||
#define PAGE_OK 0 // all ok, do nothing
|
|
||||||
#define PAGE_UPDATE 1 // page wants display to update
|
|
||||||
#define PAGE_HIBERNATE 2 // page wants displey to hibernate
|
|
||||||
|
|
||||||
|
struct Point {
|
||||||
|
double x;
|
||||||
|
double y;
|
||||||
|
};
|
||||||
|
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);
|
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
@@ -103,25 +80,22 @@ void setBlinkingLED(bool on); // Set blinking flash LED active
|
|||||||
void buzzer(uint frequency, uint duration); // Buzzer function
|
void buzzer(uint frequency, uint duration); // Buzzer function
|
||||||
void setBuzzerPower(uint power); // Set buzzer power
|
void setBuzzerPower(uint power); // Set buzzer power
|
||||||
|
|
||||||
String xdrDelete(String input, uint8_t maxlen = 0); // Delete xdr prefix from string and optional limit length
|
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, bool symbolmode, 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(GwApi *api, double time, double date, double latitude, double longitude, double timezone); // Calulate sunset and sunrise
|
||||||
SunData calcSunsetSunriseRTC(struct tm *rtctime, double latitude, double longitude, float timezone);
|
|
||||||
|
|
||||||
void batteryGraphic(uint x, uint y, float percent, int pcolor, int bcolor); // Battery graphic with fill level
|
void batteryGraphic(uint x, uint y, float percent, int pcolor, int bcolor); // Battery graphic with fill level
|
||||||
void solarGraphic(uint x, uint y, int pcolor, int bcolor); // Solar graphic
|
void solarGraphic(uint x, uint y, int pcolor, int bcolor); // Solar graphic with fill level
|
||||||
void generatorGraphic(uint x, uint y, int pcolor, int bcolor); // Generator graphic
|
void generatorGraphic(uint x, uint y, int pcolor, int bcolor); // Generator graphic with fill level
|
||||||
void startLedTask(GwApi *api);
|
void startLedTask(GwApi *api);
|
||||||
|
|
||||||
void doImageRequest(GwApi *api, int *pageno, const PageStruct pages[MAX_PAGE_NUMBER], AsyncWebServerRequest *request);
|
void doImageRequest(GwApi *api, int *pageno, const PageStruct pages[MAX_PAGE_NUMBER], AsyncWebServerRequest *request);
|
||||||
@@ -160,104 +134,26 @@ 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 };
|
||||||
|
|
||||||
// Header symbols
|
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 gps_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 };
|
||||||
|
|
||||||
static unsigned char nmea_bits[] PROGMEM = {
|
|
||||||
0x00, 0x00, 0x22, 0x21, 0x26, 0x33, 0x26, 0x33, 0x2a, 0x2d, 0x32, 0x2d,
|
|
||||||
0x32, 0x21, 0x22, 0x21, 0x00, 0x00, 0x3c, 0x0c, 0x04, 0x0c, 0x04, 0x12,
|
|
||||||
0x3c, 0x12, 0x04, 0x1e, 0x04, 0x21, 0x3c, 0x21 };
|
|
||||||
|
|
||||||
static unsigned char n2k_bits[] PROGMEM = {
|
|
||||||
0xe0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x02, 0x40, 0x32, 0x4c, 0x31, 0x8c,
|
|
||||||
0x01, 0x80, 0x81, 0x81, 0x81, 0x81, 0x01, 0x80, 0x31, 0x8c, 0x32, 0x4c,
|
|
||||||
0x02, 0x40, 0x04, 0x20, 0x98, 0x19, 0xe0, 0x07 };
|
|
||||||
|
|
||||||
static unsigned char tcp_bits[] PROGMEM = {
|
|
||||||
0x00, 0x00, 0xe0, 0x03, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0xe0, 0x03,
|
|
||||||
0x80, 0x00, 0x80, 0x00, 0xff, 0xff, 0x08, 0x10, 0x08, 0x10, 0x3e, 0x7c,
|
|
||||||
0x22, 0x44, 0x22, 0x44, 0x22, 0x44, 0x3e, 0x7c };
|
|
||||||
|
|
||||||
static unsigned char usb_bits[] PROGMEM = {
|
|
||||||
0x00, 0x00, 0x92, 0x39, 0x52, 0x4a, 0x52, 0x48, 0x92, 0x39, 0x12, 0x4a,
|
|
||||||
0x52, 0x4a, 0x8c, 0x39, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x04, 0x20,
|
|
||||||
0xf4, 0x2f, 0x04, 0x20, 0xf8, 0x1f, 0x00, 0x00 };
|
|
||||||
|
|
||||||
static unsigned char sdcard_bits[] PROGMEM = {
|
|
||||||
0xf8, 0x07, 0x0c, 0x08, 0x04, 0x08, 0xc4, 0x09, 0x24, 0x1a, 0xe4, 0x13,
|
|
||||||
0x04, 0x20, 0x24, 0x21, 0xa4, 0x12, 0x44, 0x12, 0x04, 0x20, 0x04, 0x20,
|
|
||||||
0xc4, 0x23, 0x34, 0x2c, 0xd8, 0x1b, 0x00, 0x00 };
|
|
||||||
|
|
||||||
static unsigned char bluetooth_bits[] PROGMEM = {
|
|
||||||
0x00, 0x00, 0x22, 0x21, 0x26, 0x33, 0x26, 0x33, 0x2a, 0x2d, 0x32, 0x2d,
|
|
||||||
0x32, 0x21, 0x22, 0x21, 0x00, 0x00, 0x3c, 0x0c, 0x04, 0x0c, 0x04, 0x12,
|
|
||||||
0x3c, 0x12, 0x04, 0x1e, 0x04, 0x21, 0x3c, 0x21 };
|
|
||||||
|
|
||||||
static std::map<String, unsigned char *> iconmap = {
|
static std::map<String, unsigned char *> iconmap = {
|
||||||
{"LEFT", left_bits},
|
{"LEFT", left_bits},
|
||||||
{"RIGHT", right_bits},
|
{"RIGHT", right_bits},
|
||||||
{"LOCK", lock_bits},
|
{"LOCK", lock_bits},
|
||||||
{"PLUS", plus_bits},
|
{"PLUS", plus_bits},
|
||||||
{"MINUS", minus_bits},
|
{"MINUS", minus_bits},
|
||||||
{"GPS", gps_bits},
|
{"DISH", dish_bits},
|
||||||
{"AP", ap_bits},
|
{"AP", ap_bits}
|
||||||
{"0183", nmea_bits},
|
|
||||||
{"N2K", n2k_bits},
|
|
||||||
{"TCP", tcp_bits},
|
|
||||||
{"USB", usb_bits},
|
|
||||||
{"SDCARD", sdcard_bits},
|
|
||||||
{"BLUE", bluetooth_bits}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Battery
|
|
||||||
#define battery_width 24
|
|
||||||
#define battery_height 16
|
|
||||||
|
|
||||||
static unsigned char battery_0_bits[] = {
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0xff, 0xff, 0x1f,
|
|
||||||
0x03, 0x00, 0x18, 0x03, 0x00, 0x78, 0x03, 0x00, 0xf8, 0x03, 0x00, 0xd8,
|
|
||||||
0x03, 0x00, 0xd8, 0x03, 0x00, 0xd8, 0x03, 0x00, 0xf8, 0x03, 0x00, 0x78,
|
|
||||||
0x03, 0x00, 0x18, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00 };
|
|
||||||
|
|
||||||
static unsigned char battery_25_bits[] = {
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0xff, 0xff, 0x1f,
|
|
||||||
0x03, 0x00, 0x18, 0x3b, 0x00, 0x78, 0x3b, 0x00, 0xf8, 0x3b, 0x00, 0xd8,
|
|
||||||
0x3b, 0x00, 0xd8, 0x3b, 0x00, 0xd8, 0x3b, 0x00, 0xf8, 0x3b, 0x00, 0x78,
|
|
||||||
0x03, 0x00, 0x18, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00 };
|
|
||||||
|
|
||||||
static unsigned char battery_50_bits[] = {
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0xff, 0xff, 0x1f,
|
|
||||||
0x03, 0x00, 0x18, 0xbb, 0x03, 0x78, 0xbb, 0x03, 0xf8, 0xbb, 0x03, 0xd8,
|
|
||||||
0xbb, 0x03, 0xd8, 0xbb, 0x03, 0xd8, 0xbb, 0x03, 0xf8, 0xbb, 0x03, 0x78,
|
|
||||||
0x03, 0x00, 0x18, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00 };
|
|
||||||
|
|
||||||
static unsigned char battery_75_bits[] = {
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0xff, 0xff, 0x1f,
|
|
||||||
0x03, 0x00, 0x18, 0xbb, 0x3b, 0x78, 0xbb, 0x3b, 0xf8, 0xbb, 0x3b, 0xd8,
|
|
||||||
0xbb, 0x3b, 0xd8, 0xbb, 0x3b, 0xd8, 0xbb, 0x3b, 0xf8, 0xbb, 0x3b, 0x78,
|
|
||||||
0x03, 0x00, 0x18, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00 };
|
|
||||||
|
|
||||||
static unsigned char battery_100_bits[] = {
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0xff, 0xff, 0x1f,
|
|
||||||
0x03, 0x00, 0x18, 0xbb, 0xbb, 0x7b, 0xbb, 0xbb, 0xfb, 0xbb, 0xbb, 0xdb,
|
|
||||||
0xbb, 0xbb, 0xdb, 0xbb, 0xbb, 0xdb, 0xbb, 0xbb, 0xfb, 0xbb, 0xbb, 0x7b,
|
|
||||||
0x03, 0x00, 0x18, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00 };
|
|
||||||
|
|
||||||
static unsigned char battery_loading_bits[] = {
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfe, 0xe4, 0x0f, 0xff, 0xec, 0x1f,
|
|
||||||
0x03, 0x08, 0x18, 0x03, 0x18, 0x78, 0x03, 0x30, 0xf8, 0x83, 0x3f, 0xd8,
|
|
||||||
0x03, 0x7f, 0xd8, 0x03, 0x03, 0xd8, 0x03, 0x06, 0xf8, 0x03, 0x04, 0x78,
|
|
||||||
0x03, 0x0c, 0x18, 0xff, 0xcb, 0x1f, 0xfe, 0xd3, 0x0f, 0x00, 0x10, 0x00 };
|
|
||||||
|
|
||||||
// Other symbols
|
// Other symbols
|
||||||
#define swipe_width 24
|
#define swipe_width 24
|
||||||
#define swipe_height 16
|
#define swipe_height 16
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,172 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#ifndef _OBP60FORMATTER_H
|
|
||||||
#define _OBP60FORMATTER_H
|
|
||||||
|
|
||||||
#include "GwApi.h"
|
|
||||||
#include "Pagedata.h"
|
|
||||||
#include <unordered_map>
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
XDR types
|
|
||||||
A Angular displacement
|
|
||||||
C Temperature
|
|
||||||
D Linear displacement
|
|
||||||
F Frequency
|
|
||||||
G Generic
|
|
||||||
H Humidity
|
|
||||||
I Current
|
|
||||||
L Salinity
|
|
||||||
N Force
|
|
||||||
P Pressure
|
|
||||||
R Flow
|
|
||||||
S Switch or valve
|
|
||||||
T Tachometer
|
|
||||||
U Voltage
|
|
||||||
V Volume
|
|
||||||
|
|
||||||
XDR units
|
|
||||||
A Ampere
|
|
||||||
B Bar
|
|
||||||
C Celsius
|
|
||||||
D Degrees
|
|
||||||
H Hertz
|
|
||||||
I Liter per second?
|
|
||||||
M Meter / Cubic meter
|
|
||||||
N Newton
|
|
||||||
P Percent
|
|
||||||
R RPM
|
|
||||||
V Volt
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
enum class fmtType {
|
|
||||||
// Formatter names as defined in BoatItemBase
|
|
||||||
COURSE,
|
|
||||||
KNOTS,
|
|
||||||
WIND,
|
|
||||||
LATITUDE,
|
|
||||||
LONGITUDE,
|
|
||||||
XTE,
|
|
||||||
FIXED0,
|
|
||||||
DEPTH,
|
|
||||||
DOP, // dilution of precision
|
|
||||||
ROT,
|
|
||||||
DATE,
|
|
||||||
TIME,
|
|
||||||
NAME,
|
|
||||||
|
|
||||||
kelvinToC, // TODO not a format but conversion
|
|
||||||
mtr2nm, // TODO not a format but conversion
|
|
||||||
|
|
||||||
// XDR Formatter names
|
|
||||||
XDR_PP, // pressure percent
|
|
||||||
XDR_PB, // pressure bar
|
|
||||||
XDR_UV, // voltage volt
|
|
||||||
XDR_IA, // current ampere
|
|
||||||
XDR_CK, // temperature kelvin
|
|
||||||
XDR_CC, // temperature celsius
|
|
||||||
XDR_HP, // humidity percent
|
|
||||||
XDR_VP, // volume percent
|
|
||||||
XDR_VM, // volume cubic meters
|
|
||||||
XDR_RI, // flow liter per second?
|
|
||||||
XDR_G, // generic
|
|
||||||
XDR_AP, // angle percent
|
|
||||||
XDR_AD, // angle degrees
|
|
||||||
XDR_TR // tachometer rpm
|
|
||||||
};
|
|
||||||
|
|
||||||
// Hint: String is not supported
|
|
||||||
static std::unordered_map<const char*, fmtType> formatMap PROGMEM = {
|
|
||||||
{"formatCourse", fmtType::COURSE},
|
|
||||||
{"formatKnots", fmtType::KNOTS},
|
|
||||||
{"formatWind", fmtType::WIND},
|
|
||||||
{"formatLatitude", fmtType::LATITUDE},
|
|
||||||
{"formatLongitude", fmtType::LONGITUDE},
|
|
||||||
{"formatXte", fmtType::XTE},
|
|
||||||
{"formatFixed0", fmtType::FIXED0},
|
|
||||||
{"formatDepth", fmtType::DEPTH},
|
|
||||||
{"formatDop", fmtType::DOP},
|
|
||||||
{"formatRot", fmtType::ROT},
|
|
||||||
{"formatDate", fmtType::DATE},
|
|
||||||
{"formatTime", fmtType::TIME},
|
|
||||||
{"formatName", fmtType::NAME},
|
|
||||||
{"kelvinToC", fmtType::kelvinToC},
|
|
||||||
{"mtr2nm", fmtType::mtr2nm},
|
|
||||||
{"formatXdr:P:P", fmtType::XDR_PP},
|
|
||||||
{"formatXdr:P:B", fmtType::XDR_PB},
|
|
||||||
{"formatXdr:U:V", fmtType::XDR_UV},
|
|
||||||
{"formatXdr:I:A", fmtType::XDR_IA},
|
|
||||||
{"formatXdr:C:K", fmtType::XDR_CK},
|
|
||||||
{"formatXdr:C:C", fmtType::XDR_CC},
|
|
||||||
{"formatXdr:H:P", fmtType::XDR_HP},
|
|
||||||
{"formatXdr:V:P", fmtType::XDR_VP},
|
|
||||||
{"formatXdr:V:M", fmtType::XDR_VM},
|
|
||||||
{"formatXdr:R:I", fmtType::XDR_RI},
|
|
||||||
{"formatXdr:G:", fmtType::XDR_G},
|
|
||||||
{"formatXdr:A:P", fmtType::XDR_AP},
|
|
||||||
{"formatXdr:A:D", fmtType::XDR_AD},
|
|
||||||
{"formatXdr:T:R", fmtType::XDR_TR}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Possible formats as scoped enums
|
|
||||||
enum class fmtDate {DE, GB, US, ISO};
|
|
||||||
enum class fmtTime {MMHH, MMHHSS};
|
|
||||||
enum class fmtLength {METER, FEET, FATHOM, CABLE};
|
|
||||||
enum class fmtDepth {METER, FEET, FATHOM};
|
|
||||||
enum class fmtWind {KMH, MS, KN, BFT};
|
|
||||||
enum class fmtCourse {DEG, RAD};
|
|
||||||
enum class fmtRot {DEGS, RADS};
|
|
||||||
enum class fmtXte {M, KM, NM, CABLE};
|
|
||||||
enum class fmtPress {PA, BAR};
|
|
||||||
enum class fmtTemp {KELVIN, CELSUIS, FAHRENHEIT};
|
|
||||||
|
|
||||||
// Conversion factors
|
|
||||||
#define CONV_M_FT 3.2808399 // meter too feet
|
|
||||||
#define CONV_M_FM 0.5468 // meter to fathom
|
|
||||||
#define CONV_M_CBL 0.0053961182483768 // meter to cable
|
|
||||||
#define CONV_CBL_FT 608 // cable to feet
|
|
||||||
#define CONV_FM_FT 6 // fathom to feet
|
|
||||||
|
|
||||||
// Structure for formatted boat values
|
|
||||||
typedef struct {
|
|
||||||
double value;
|
|
||||||
String svalue;
|
|
||||||
String unit;
|
|
||||||
} FormattedData;
|
|
||||||
|
|
||||||
// Formatter for boat values
|
|
||||||
class Formatter {
|
|
||||||
private:
|
|
||||||
String stimeZone = "0";
|
|
||||||
double timeZone = 0.0; // [UTC -14.00...+12.00]
|
|
||||||
String lengthFormat = "m"; // [m|ft]
|
|
||||||
String distanceFormat = "nm"; // [m|km|nm]
|
|
||||||
String speedFormat = "kn"; // [m/s|km/h|kn]
|
|
||||||
String windspeedFormat = "kn"; // [m/s|km/h|kn|bft]
|
|
||||||
String tempFormat = "C"; // [K|°C|°F]
|
|
||||||
String dateFormat = "ISO"; // [DE|GB|US|ISO]
|
|
||||||
fmtDate dateFmt;
|
|
||||||
bool usesimudata = false; // [on|off]
|
|
||||||
|
|
||||||
String precision = "2"; // [1|2]
|
|
||||||
const char* fmt_dec_1;
|
|
||||||
const char* fmt_dec_10;
|
|
||||||
const char* fmt_dec_100;
|
|
||||||
|
|
||||||
public:
|
|
||||||
Formatter(GwConfigHandler *config);
|
|
||||||
fmtType stringToFormat(const char* formatStr);
|
|
||||||
fmtDate getDateFormat(String sformat);
|
|
||||||
fmtTime getTimeFormat(String sformat);
|
|
||||||
FormattedData formatValue(GwApi::BoatValue *value, CommonData &commondata);
|
|
||||||
String placeholder = "---";
|
|
||||||
};
|
|
||||||
|
|
||||||
// Standard format functions without class and overhead
|
|
||||||
String formatDate(fmtDate fmttype, uint16_t year, uint8_t month, uint8_t day);
|
|
||||||
String formatTime(fmtTime fmttype, uint8_t hour, uint8_t minute, uint8_t second);
|
|
||||||
String formatLatitude(double lat);
|
|
||||||
String formatLongitude(double lon);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -76,13 +76,13 @@
|
|||||||
#define OBP_POWER_50 5 // 5.0V power rail
|
#define OBP_POWER_50 5 // 5.0V power rail
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Hardware configuration for OBP40
|
// Hardware configuration for OBP60 LIGHT
|
||||||
|
|
||||||
#ifdef BOARD_OBP40S3
|
#ifdef HARDWARE_LIGHT
|
||||||
// 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 100000UL // 100kHz clock speed on I2C bus
|
#define I2C_SPEED 10000UL // 10kHz 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 GPIO_NUM_10
|
#define SD_SPI_CS 10
|
||||||
#define SD_SPI_MOSI GPIO_NUM_40
|
#define SD_SPI_MOSI 40
|
||||||
#define SD_SPI_CLK GPIO_NUM_39
|
#define SD_SPI_CLK 39
|
||||||
#define SD_SPI_MISO GPIO_NUM_13
|
#define SD_SPI_MISO 13
|
||||||
|
|
||||||
// GPS (NEO-6M, NEO-M8N, ATGM336H)
|
// GPS (NEO-6M, NEO-M8N, ATGM336H)
|
||||||
#define OBP_GPS_RX 19
|
#define OBP_GPS_RX 19
|
||||||
@@ -149,17 +149,13 @@
|
|||||||
|
|
||||||
// Flash LED (1x WS2812B)
|
// Flash LED (1x WS2812B)
|
||||||
#define NUM_FLASH_LED 1 // Number of flash LED
|
#define NUM_FLASH_LED 1 // Number of flash LED
|
||||||
#define OBP_FLASH_LED 41 // GPIO port (power LED)
|
#define OBP_FLASH_LED 10 // GPIO port
|
||||||
// Backlight LEDs (6x WS2812B)
|
// Backlight LEDs (6x WS2812B)
|
||||||
#define NUM_BACKLIGHT_LED 6 // Number of Backlight LEDs
|
#define NUM_BACKLIGHT_LED 6 // Number of Backlight LEDs
|
||||||
#define OBP_BACKLIGHT_LED 41 // GPIO port (power LED)
|
#define OBP_BACKLIGHT_LED 40 // GPIO port
|
||||||
// Power Rail
|
// Power Rail
|
||||||
#define OBP_POWER_50 41 // Power LED
|
#define OBP_POWER_50 41 // Power LED
|
||||||
#define OBP_POWER_EPD 7 // ePaper power
|
#define OBP_POWER_EPD 7 // ePaper power
|
||||||
#define OBP_POWER_SD 42 // SD card power
|
#define OBP_POWER_SD 42 // SD card power
|
||||||
// Deep sleep wakeup
|
|
||||||
#define OBP_WAKEUP_LEVEL 0 // //1 = High, 0 = Low, depends on switch
|
|
||||||
#define OBP_WAKEWUP_PIN GPIO_NUM_5// Wakeup pin, same as CONF (wheel press)
|
|
||||||
// Must define as GPIO_NUM_X
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifndef _OBP60FUNCTIONS_H
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
#define _OBP60FUNCTIONS_H
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "OBP60Hardware.h"
|
#include "OBP60Hardware.h"
|
||||||
#include "OBP60Extensions.h" // for buzzer
|
|
||||||
#include "OBPKeyboardTask.h"
|
|
||||||
|
|
||||||
// Global vars
|
// Global vars
|
||||||
|
|
||||||
// Touch keypad over ESP32 touch sensor inputs
|
// Touch keypad over ESP32 touch sensor inputs
|
||||||
@@ -59,10 +58,10 @@ void initKeys(CommonData &commonData) {
|
|||||||
commonData.keydata[5].h = height;
|
commonData.keydata[5].h = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HARDWARE_V21
|
#ifdef HARDWARE_V21
|
||||||
// Keypad functions for original OBP60 hardware
|
// Keypad functions for original OBP60 hardware
|
||||||
int readKeypad(GwLog* logger, uint thSensitivity) {
|
int readKeypad(uint thSensitivity) {
|
||||||
|
|
||||||
// Touch sensor values
|
// Touch sensor values
|
||||||
// 35000 - Not touched
|
// 35000 - Not touched
|
||||||
// 50000 - Light toched with fingertip
|
// 50000 - Light toched with fingertip
|
||||||
@@ -111,14 +110,14 @@ int readKeypad(GwLog* logger, uint thSensitivity) {
|
|||||||
keypad[6] = 0;
|
keypad[6] = 0;
|
||||||
}
|
}
|
||||||
// Nothing touched
|
// Nothing touched
|
||||||
/* if(keypad[1] == 0 && keypad[2] == 0 && keypad[3] == 0 && keypad[4] == 0 && keypad[5] == 0 && keypad[6] == 0){
|
if(keypad[1] == 0 && keypad[2] == 0 && keypad[3] == 0 && keypad[4] == 0 && keypad[5] == 0 && keypad[6] == 0){
|
||||||
keypad[0] = 1;
|
keypad[0] = 1;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
keypad[0] = 0;
|
keypad[0] = 0;
|
||||||
} */
|
}
|
||||||
|
|
||||||
for (int i = 1; i <= 6; i++) {
|
for (int i = 0; i < 9; i++) {
|
||||||
if(i > 0){
|
if(i > 0){
|
||||||
// Convert keypad to keycode
|
// Convert keypad to keycode
|
||||||
if(keypad[i] == 1){
|
if(keypad[i] == 1){
|
||||||
@@ -142,13 +141,11 @@ int readKeypad(GwLog* logger, uint thSensitivity) {
|
|||||||
}
|
}
|
||||||
// Detect a very short keynumber (10ms)
|
// Detect a very short keynumber (10ms)
|
||||||
if (millis() > starttime + 10 && keycode == keycodeold && keylock == true) {
|
if (millis() > starttime + 10 && keycode == keycodeold && keylock == true) {
|
||||||
logger->logDebug(GwLog::LOG,"Very short 20ms key touch: %d", keycode);
|
|
||||||
|
|
||||||
// Process only valid keys
|
// Process only valid keys
|
||||||
if(keycode == 1 || keycode == 4 || keycode == 5 || keycode == 6){
|
if(keycode == 1 || keycode == 6){
|
||||||
keycode2 = keycode;
|
keycode2 = keycode;
|
||||||
}
|
}
|
||||||
// Clear by invalid keys
|
// Clear by unvalid keys
|
||||||
else{
|
else{
|
||||||
keycode2 = 0;
|
keycode2 = 0;
|
||||||
keycodeold2 = 0;
|
keycodeold2 = 0;
|
||||||
@@ -160,7 +157,6 @@ int readKeypad(GwLog* logger, uint thSensitivity) {
|
|||||||
}
|
}
|
||||||
// Detect a short keynumber (200ms)
|
// Detect a short keynumber (200ms)
|
||||||
if (keyoff == false && millis() > starttime + 200 && keycode == keycodeold && keylock == true) {
|
if (keyoff == false && millis() > starttime + 200 && keycode == keycodeold && keylock == true) {
|
||||||
logger->logDebug(GwLog::LOG,"Short 200ms key touch: %d", keycode);
|
|
||||||
keystatus = keycode;
|
keystatus = keycode;
|
||||||
keycode = 0;
|
keycode = 0;
|
||||||
keycodeold = 0;
|
keycodeold = 0;
|
||||||
@@ -172,21 +168,6 @@ int readKeypad(GwLog* logger, uint thSensitivity) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// System page with key 5 and 4 in fast series
|
|
||||||
if (keycode2 == 5 && keycodeold2 == 4) {
|
|
||||||
logger->logDebug(GwLog::LOG,"Keycode for system page");
|
|
||||||
keycode = 0;
|
|
||||||
keycodeold = 0;
|
|
||||||
keycode2 = 0;
|
|
||||||
keycodeold2 = 0;
|
|
||||||
keystatus = 12;
|
|
||||||
buzzer(TONE4, 50);
|
|
||||||
delay(30);
|
|
||||||
buzzer(TONE4, 50);
|
|
||||||
delay(30);
|
|
||||||
buzzer(TONE4, 50);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Key lock with key 1 and 6 or 6 and 1 in fast series
|
// Key lock with key 1 and 6 or 6 and 1 in fast series
|
||||||
if((keycode2 == 1 && keycodeold2 == 6) || (keycode2 == 6 && keycodeold2 == 1)) {
|
if((keycode2 == 1 && keycodeold2 == 6) || (keycode2 == 6 && keycodeold2 == 1)) {
|
||||||
keycode = 0;
|
keycode = 0;
|
||||||
@@ -234,35 +215,35 @@ int readKeypad(GwLog* logger, uint thSensitivity) {
|
|||||||
keycodeold2 = keycode2;
|
keycodeold2 = keycode2;
|
||||||
|
|
||||||
return keystatus;
|
return keystatus;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOARD_OBP40S3
|
#ifdef HARDWARE_LIGHT
|
||||||
int readSensorpads(){
|
int readSensorpads(){
|
||||||
// Read key code
|
// Read key code
|
||||||
if (digitalRead(UP) == LOW) {
|
if(digitalRead(UP) == LOW){
|
||||||
keycode = 10; // Left swipe
|
keycode = 10; // Left swipe
|
||||||
}
|
}
|
||||||
else if (digitalRead(DOWN) == LOW) {
|
else if(digitalRead(DOWN) == LOW){
|
||||||
keycode = 9; // Right swipe
|
keycode = 9; // Right swipe
|
||||||
}
|
}
|
||||||
else if (digitalRead(CONF) == LOW) {
|
else if(digitalRead(CONF) == LOW){
|
||||||
keycode = 3; // Key 3
|
keycode = 3; // Key 3
|
||||||
}
|
}
|
||||||
else if (digitalRead(MENUE) == LOW) {
|
else if(digitalRead(MENUE) == LOW){
|
||||||
keycode = 1; // Key 1
|
keycode = 1; // Key 1
|
||||||
}
|
}
|
||||||
else if (digitalRead(EXIT) == LOW) {
|
else if(digitalRead(EXIT) == LOW){
|
||||||
keycode = 2; // Key 2
|
keycode = 2; // Key 2
|
||||||
}
|
}
|
||||||
else {
|
else{
|
||||||
keycode = 0; // No key activ
|
keycode = 0; // No key activ
|
||||||
|
}
|
||||||
|
return keycode;
|
||||||
}
|
}
|
||||||
return keycode;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Keypad functions for OBP60 clone (thSensitivity is inactiv)
|
// Keypad functions for OBP60 clone (thSensitivity is inactiv)
|
||||||
int readKeypad(GwLog* logger, uint thSensitivity, bool use_syspage) {
|
int readKeypad(uint thSensitivity) {
|
||||||
pinMode(UP, INPUT);
|
pinMode(UP, INPUT);
|
||||||
pinMode(DOWN, INPUT);
|
pinMode(DOWN, INPUT);
|
||||||
pinMode(CONF, INPUT);
|
pinMode(CONF, INPUT);
|
||||||
@@ -274,68 +255,27 @@ int readKeypad(GwLog* logger, uint thSensitivity, bool use_syspage) {
|
|||||||
|
|
||||||
// Detect key
|
// Detect key
|
||||||
if (keycode > 0 ){
|
if (keycode > 0 ){
|
||||||
if(keycode != keycodeold){
|
if(keycode != keycodeold){
|
||||||
starttime = millis(); // Start key pressed
|
starttime = millis(); // Start key pressed
|
||||||
keycodeold = keycode;
|
keycodeold = keycode;
|
||||||
}
|
}
|
||||||
// If key pressed longer than 100ms
|
// If key pressed longer than 200ms
|
||||||
if(millis() > starttime + 100 && keycode == keycodeold) {
|
if(millis() > starttime + 200 && keycode == keycodeold) {
|
||||||
if (use_syspage and keycode == 3) {
|
keystatus = keycode;
|
||||||
keystatus = 12;
|
// Copy keycode
|
||||||
} else {
|
keycodeold = keycode;
|
||||||
keystatus = keycode;
|
while(readSensorpads() > 0){} // Wait for pad release
|
||||||
}
|
delay(keydelay);
|
||||||
// Copy keycode
|
}
|
||||||
keycodeold = keycode;
|
|
||||||
// 100% Task-CPU RLY?
|
|
||||||
while(readSensorpads() > 0){} // Wait for pad release
|
|
||||||
delay(keydelay);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else{
|
||||||
keycode = 0;
|
keycode = 0;
|
||||||
keycodeold = 0;
|
keycodeold = 0;
|
||||||
keystatus = 0;
|
keystatus = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return keystatus;
|
return keystatus;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void keyboardTask(void *param) {
|
|
||||||
|
|
||||||
// params needed:
|
|
||||||
// queue
|
|
||||||
// logger
|
|
||||||
// sensitivity
|
|
||||||
// use_syspage for deep sleep activation
|
|
||||||
|
|
||||||
KbTaskData *data = (KbTaskData *)param;
|
|
||||||
|
|
||||||
int keycode = 0;
|
|
||||||
data->logger->logDebug(GwLog::LOG, "Start keyboard task");
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
keycode = readKeypad(data->logger, data->sensitivity, data->use_syspage);
|
|
||||||
#else
|
|
||||||
keycode = readKeypad(data->logger, data->sensitivity);
|
|
||||||
#endif
|
|
||||||
//send a key event
|
|
||||||
if (keycode != 0) {
|
|
||||||
xQueueSend(data->queue, &keycode, 0);
|
|
||||||
data->logger->logDebug(GwLog::LOG,"kbtask: send keycode: %d", keycode);
|
|
||||||
}
|
|
||||||
delay(20); // 50Hz update rate (20ms)
|
|
||||||
}
|
|
||||||
vTaskDelete(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void createKeyboardTask(KbTaskData *param) {
|
|
||||||
TaskHandle_t xHandle = NULL;
|
|
||||||
if (xTaskCreate(keyboardTask, "keyboard", configMINIMAL_STACK_SIZE + 1024, param, configMAX_PRIORITIES-1, &xHandle) != pdPASS) {
|
|
||||||
param->logger->logDebug(GwLog::ERROR, "Failed to create keyboard task!");
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -26,20 +26,20 @@ void qrWiFi(String ssid, String passwd, uint16_t fgcolor, uint16_t bgcolor){
|
|||||||
// Each horizontal module
|
// Each horizontal module
|
||||||
for (uint8_t x = 0; x < qrcode.size; x++) {
|
for (uint8_t x = 0; x < qrcode.size; x++) {
|
||||||
if(qrcode_getModule(&qrcode, x, y)){
|
if(qrcode_getModule(&qrcode, x, y)){
|
||||||
epd->fillRect(box_x, box_y, box_s, box_s, fgcolor);
|
getdisplay().fillRect(box_x, box_y, box_s, box_s, fgcolor);
|
||||||
} else {
|
} else {
|
||||||
epd->fillRect(box_x, box_y, box_s, box_s, bgcolor);
|
getdisplay().fillRect(box_x, box_y, box_s, box_s, bgcolor);
|
||||||
}
|
}
|
||||||
box_x = box_x + box_s;
|
box_x = box_x + box_s;
|
||||||
}
|
}
|
||||||
box_y = box_y + box_s;
|
box_y = box_y + box_s;
|
||||||
box_x = init_x;
|
box_x = init_x;
|
||||||
}
|
}
|
||||||
epd->setFont(&Ubuntu_Bold32pt8b);
|
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
||||||
epd->setTextColor(fgcolor);
|
getdisplay().setTextColor(fgcolor);
|
||||||
epd->setCursor(140, 285);
|
getdisplay().setCursor(140, 285);
|
||||||
epd->print("WiFi");
|
getdisplay().print("WiFi");
|
||||||
epd->nextPage(); // Full Refresh
|
getdisplay().nextPage(); // Full Refresh
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,322 +0,0 @@
|
|||||||
#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 --------------
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
#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(960); // store 960 TWD values for 16 minutes history
|
|
||||||
hstryBufList.twsHstry->resize(960);
|
|
||||||
hstryBufList.awdHstry->resize(960);
|
|
||||||
hstryBufList.awsHstry->resize(960);
|
|
||||||
};
|
|
||||||
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);
|
|
||||||
};
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#pragma once
|
|
||||||
#include "GwLog.h"
|
|
||||||
#include "Pagedata.h"
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
QueueHandle_t queue;
|
|
||||||
GwLog* logger = nullptr;
|
|
||||||
uint sensitivity = 100;
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
bool use_syspage = true;
|
|
||||||
#endif
|
|
||||||
} KbTaskData;
|
|
||||||
|
|
||||||
void initKeys(CommonData &commonData);
|
|
||||||
void createKeyboardTask(KbTaskData *param);
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "GwSynchronized.h"
|
|
||||||
#include <algorithm>
|
|
||||||
#include <limits>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <vector>
|
|
||||||
#include "WString.h"
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
class RingBuffer {
|
|
||||||
private:
|
|
||||||
std::vector<T> buffer; // THE buffer vector
|
|
||||||
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"
|
|
||||||
@@ -1,423 +0,0 @@
|
|||||||
#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.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.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;
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
#include <Adafruit_Sensor.h> // Adafruit Lib for sensors
|
#include <Adafruit_Sensor.h> // Adafruit Lib for sensors
|
||||||
#include <Adafruit_BME280.h> // Adafruit Lib for BME280
|
#include <Adafruit_BME280.h> // Adafruit Lib for BME280
|
||||||
#include <Adafruit_BMP280.h> // Adafruit Lib for BMP280
|
#include <Adafruit_BMP280.h> // Adafruit Lib for BMP280
|
||||||
@@ -18,11 +17,9 @@
|
|||||||
#include "ObpNmea0183.h" // Check NMEA0183 sentence for uncorrect content
|
#include "ObpNmea0183.h" // Check NMEA0183 sentence for uncorrect content
|
||||||
#include "OBP60Extensions.h" // Lib for hardware extensions
|
#include "OBP60Extensions.h" // Lib for hardware extensions
|
||||||
#include "movingAvg.h" // Lib for moving average building
|
#include "movingAvg.h" // Lib for moving average building
|
||||||
#include "time.h" // For getting NTP time
|
|
||||||
#include <ESP32Time.h> // Internal ESP32 RTC clock
|
|
||||||
|
|
||||||
// Timer for hardware functions
|
// Timer for hardware functions
|
||||||
Ticker Timer1(blinkingFlashLED, 500); // Start Timer1 for flash LED all 500ms
|
Ticker Timer1(blinkingFlashLED, 500); // Satrt Timer1 for flash LED all 500ms
|
||||||
|
|
||||||
// Initialization for all sensors (RS232, I2C, 1Wire, IOs)
|
// Initialization for all sensors (RS232, I2C, 1Wire, IOs)
|
||||||
//####################################################################################
|
//####################################################################################
|
||||||
@@ -91,16 +88,8 @@ void sensorTask(void *param){
|
|||||||
double voffset = (api->getConfig()->getConfigItem(api->getConfig()->vOffset,true)->asString()).toFloat();
|
double voffset = (api->getConfig()->getConfigItem(api->getConfig()->vOffset,true)->asString()).toFloat();
|
||||||
double vslope = (api->getConfig()->getConfigItem(api->getConfig()->vSlope,true)->asString()).toFloat();
|
double vslope = (api->getConfig()->getConfigItem(api->getConfig()->vSlope,true)->asString()).toFloat();
|
||||||
if(String(powsensor1) == "off"){
|
if(String(powsensor1) == "off"){
|
||||||
#ifdef VOLTAGE_SENSOR
|
sensors.batteryVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.17) * 20; // Vin = 1/20
|
||||||
float rawVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.53) * 2; // Vin = 1/2 for OBP40
|
sensors.batteryVoltage = sensors.batteryVoltage * vslope + voffset; // Calibration
|
||||||
#else
|
|
||||||
float rawVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.17) * 20; // Vin = 1/20 for OBP60
|
|
||||||
#endif
|
|
||||||
sensors.batteryVoltage = rawVoltage * vslope + voffset; // Calibration
|
|
||||||
#ifdef LIPO_ACCU_1200
|
|
||||||
sensors.BatteryChargeStatus = 0; // Set to discharging
|
|
||||||
sensors.batteryLevelLiPo = 0; // Level 0...100%
|
|
||||||
#endif
|
|
||||||
sensors.batteryCurrent = 0;
|
sensors.batteryCurrent = 0;
|
||||||
sensors.batteryPower = 0;
|
sensors.batteryPower = 0;
|
||||||
// Fill average arrays with start values
|
// Fill average arrays with start values
|
||||||
@@ -153,7 +142,6 @@ void sensorTask(void *param){
|
|||||||
// ds1388.adjust(DateTime(__DATE__, __TIME__)); // Set date and time from PC file time
|
// ds1388.adjust(DateTime(__DATE__, __TIME__)); // Set date and time from PC file time
|
||||||
}
|
}
|
||||||
RTC_ready = true;
|
RTC_ready = true;
|
||||||
sensors.rtcValid = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -370,28 +358,6 @@ void sensorTask(void *param){
|
|||||||
GwApi::BoatValue *hdop=new GwApi::BoatValue(GwBoatData::_HDOP);
|
GwApi::BoatValue *hdop=new GwApi::BoatValue(GwBoatData::_HDOP);
|
||||||
GwApi::BoatValue *valueList[]={gpsdays, gpsseconds, hdop};
|
GwApi::BoatValue *valueList[]={gpsdays, gpsseconds, hdop};
|
||||||
|
|
||||||
// Internal RTC with NTP init
|
|
||||||
ESP32Time rtc(0);
|
|
||||||
if (api->getConfig()->getString(api->getConfig()->timeSource) == "iRTC") {
|
|
||||||
GwApi::Status status;
|
|
||||||
api->getStatus(status);
|
|
||||||
if (status.wifiClientConnected) {
|
|
||||||
const char *ntpServer = api->getConfig()->getCString(api->getConfig()->timeServer);
|
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"Fetching date and time from NTP server '%s'.", ntpServer);
|
|
||||||
configTime(0, 0, ntpServer); // get time in UTC
|
|
||||||
struct tm timeinfo;
|
|
||||||
if (getLocalTime(&timeinfo)) {
|
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"NTP time: %04d-%02d-%02d %02d:%02d:%02d UTC", timeinfo.tm_year+1900, timeinfo.tm_mon+1, timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
|
|
||||||
rtc.setTimeStruct(timeinfo);
|
|
||||||
sensors.rtcValid = true;
|
|
||||||
} else {
|
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"NTP time fetch failed!");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"Wifi client not connected, NTP not available.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sensor task loop runs with 100ms
|
// Sensor task loop runs with 100ms
|
||||||
//####################################################################################
|
//####################################################################################
|
||||||
|
|
||||||
@@ -454,126 +420,63 @@ void sensorTask(void *param){
|
|||||||
loopCounter++;
|
loopCounter++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get current RTC date and time all 500ms
|
// If GPS not ready or installed then send RTC time on bus all 500ms
|
||||||
if (millis() > starttime12 + 500) {
|
if(millis() > starttime12 + 500){
|
||||||
starttime12 = millis();
|
starttime12 = millis();
|
||||||
if (rtcOn == "DS1388" && RTC_ready) {
|
if((rtcOn == "DS1388" && RTC_ready == true && GPS_ready == false) || (rtcOn == "DS1388" && RTC_ready == true && GPS_ready == true && hdop->valid == false)){
|
||||||
DateTime dt = ds1388.now();
|
// Convert RTC time to Unix system time
|
||||||
sensors.rtcTime.tm_year = dt.year() - 1900; // Save values in SensorData
|
// https://de.wikipedia.org/wiki/Unixzeit
|
||||||
sensors.rtcTime.tm_mon = dt.month() - 1;
|
const short daysOfYear[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
|
||||||
sensors.rtcTime.tm_mday = dt.day();
|
long unixtime = ds1388.now().get();
|
||||||
sensors.rtcTime.tm_hour = dt.hour();
|
uint16_t year = ds1388.now().year();
|
||||||
sensors.rtcTime.tm_min = dt.minute();
|
uint8_t month = ds1388.now().month();
|
||||||
sensors.rtcTime.tm_sec = dt.second();
|
uint8_t hour = ds1388.now().hour();
|
||||||
sensors.rtcTime.tm_isdst = 0; // Not considering daylight saving time
|
uint8_t minute = ds1388.now().minute();
|
||||||
|
uint8_t second = ds1388.now().second();
|
||||||
// If GPS not ready or installed then send RTC time on bus
|
uint8_t day = ds1388.now().day();
|
||||||
// TODO If there are other time sources on the bus there should
|
uint16_t switchYear = ((year-1)-1968)/4 - ((year-1)-1900)/100 + ((year-1)-1600)/400;
|
||||||
// be a logic not to send or to send with lower frequency
|
long daysAt1970 = (year-1970)*365 + switchYear + daysOfYear[month-1] + day-1;
|
||||||
// or something totally different
|
// If switch year then add one day
|
||||||
if ((GPS_ready == false) || (GPS_ready == true && hdop->valid == false)) {
|
if ( (month>2) && (year%4==0 && (year%100!=0 || year%400==0)) ){
|
||||||
// TODO implement daysAt1970 and sysTime as methods of DateTime
|
daysAt1970 += 1;
|
||||||
const short daysOfYear[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
|
}
|
||||||
uint16_t switchYear = ((dt.year()-1)-1968)/4 - ((dt.year()-1)-1900)/100 + ((dt.year()-1)-1600)/400;
|
double sysTime = (hour * 3600) + (minute * 60) + second;
|
||||||
long daysAt1970 = (dt.year()-1970)*365 + switchYear + daysOfYear[dt.month()-1] + dt.day()-1;
|
if(!isnan(daysAt1970) && !isnan(sysTime)){
|
||||||
// If switch year then add one day
|
sensors.rtcYear = year; // Save values in SensorData
|
||||||
if ((dt.month() > 2) && (dt.year() % 4 == 0 && (dt.year() % 100 != 0 || dt.year() % 400 == 0))) {
|
sensors.rtcMonth = month;
|
||||||
daysAt1970 += 1;
|
sensors.rtcDay = day;
|
||||||
}
|
sensors.rtcHour = hour;
|
||||||
// N2K sysTime is double in n2klib
|
sensors.rtcMinute = minute;
|
||||||
double sysTime = (dt.hour() * 3600) + (dt.minute() * 60) + dt.second();
|
sensors.rtcSecond = second;
|
||||||
// WHY? isnan should always fail here
|
// api->getLogger()->logDebug(GwLog::LOG,"RTC time: %04d/%02d/%02d %02d:%02d:%02d",year, month, day, hour, minute, second);
|
||||||
//if(!isnan(daysAt1970) && !isnan(sysTime)){
|
// api->getLogger()->logDebug(GwLog::LOG,"Send PGN126992: %10d %10d",daysAt1970, (uint16_t)sysTime);
|
||||||
//api->getLogger()->logDebug(GwLog::LOG,"RTC time: %04d/%02d/%02d %02d:%02d:%02d",sensors.rtcTime.tm_year+1900,sensors.rtcTime.tm_mon, sensors.rtcTime.tm_mday, sensors.rtcTime.tm_hour, sensors.rtcTime.tm_min, sensors.rtcTime.tm_sec);
|
SetN2kPGN126992(N2kMsg,0,daysAt1970,sysTime,N2ktimes_LocalCrystalClock);
|
||||||
//api->getLogger()->logDebug(GwLog::LOG,"Send PGN126992: %10d %10d",daysAt1970, (uint16_t)sysTime);
|
api->sendN2kMessage(N2kMsg);
|
||||||
SetN2kPGN126992(N2kMsg,0,daysAt1970,sysTime,N2ktimes_LocalCrystalClock);
|
|
||||||
api->sendN2kMessage(N2kMsg);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
} else if (sensors.rtcValid) {
|
|
||||||
// use internal rtc feature
|
|
||||||
sensors.rtcTime = rtc.getTimeStruct();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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; // Default value
|
sensors.batteryVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.17) * 20; // Vin = 1/20
|
||||||
#ifdef BOARD_OBP40S3
|
sensors.batteryVoltage = sensors.batteryVoltage * vslope + voffset; // Calibration
|
||||||
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
|
|
||||||
sensors.batteryVoltage = rawVoltage * vslope + voffset; // Calibration
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
rawVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.17) * 20; // Vin = 1/20 for OBP60
|
|
||||||
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
|
||||||
sensors.batteryVoltage10 = batV.getAvg(10) / 100.0;
|
sensors.batteryVoltage10 = batV.getAvg(10) / 100.0;
|
||||||
sensors.batteryVoltage60 = batV.getAvg(60) / 100.0;
|
sensors.batteryVoltage60 = batV.getAvg(60) / 100.0;
|
||||||
sensors.batteryVoltage300 = batV.getAvg(300) / 100.0;
|
sensors.batteryVoltage300 = batV.getAvg(300) / 100.0;
|
||||||
#if BOARD_OBP40S3 && defined LIPO_ACCU_1200 && defined VOLTAGE_SENSOR
|
|
||||||
// Polynomfit for LiPo capacity calculation for 3,7V LiPo accus, 0...100%
|
|
||||||
sensors.batteryLevelLiPo = sensors.batteryVoltage60 * 203.8312 -738.1635;
|
|
||||||
// Limiter
|
|
||||||
if(sensors.batteryLevelLiPo > 100){
|
|
||||||
sensors.batteryLevelLiPo = 100;
|
|
||||||
}
|
|
||||||
if(sensors.batteryLevelLiPo < 0){
|
|
||||||
sensors.batteryLevelLiPo = 0;
|
|
||||||
}
|
|
||||||
// Charging detection
|
|
||||||
float deltaV = sensors.batteryVoltage - sensors.batteryVoltage10;
|
|
||||||
// Higher limits for lower voltages
|
|
||||||
if(sensors.batteryVoltage10 < 4.0){
|
|
||||||
if(deltaV > 0.045){
|
|
||||||
sensors.BatteryChargeStatus = 1; // Charging active
|
|
||||||
}
|
|
||||||
if(deltaV < -0.04){
|
|
||||||
sensors.BatteryChargeStatus = 0; // Discharging
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Lower limits for higher voltages
|
|
||||||
else{
|
|
||||||
if(deltaV > 0.03){
|
|
||||||
sensors.BatteryChargeStatus = 1; // Charging active
|
|
||||||
}
|
|
||||||
if(deltaV < -0.03){
|
|
||||||
sensors.BatteryChargeStatus = 0; // Discharging
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Charging stops by grater than 4,15V
|
|
||||||
if(sensors.batteryVoltage10 > 4.15){
|
|
||||||
sensors.BatteryChargeStatus = 0; // Discharging
|
|
||||||
}
|
|
||||||
// Send to NMEA200 bus as instance 10
|
|
||||||
if(!isnan(sensors.batteryVoltage)){
|
|
||||||
SetN2kDCBatStatus(N2kMsg, 10, sensors.batteryVoltage, N2kDoubleNA, N2kDoubleNA, 0);
|
|
||||||
api->sendN2kMessage(N2kMsg);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// Send to NMEA200 bus
|
// Send to NMEA200 bus
|
||||||
if(!isnan(sensors.batteryVoltage)){
|
if(!isnan(sensors.batteryVoltage)){
|
||||||
SetN2kDCBatStatus(N2kMsg, 0, sensors.batteryVoltage, N2kDoubleNA, N2kDoubleNA, 1);
|
SetN2kDCBatStatus(N2kMsg, 0, sensors.batteryVoltage, N2kDoubleNA, N2kDoubleNA, 1);
|
||||||
api->sendN2kMessage(N2kMsg);
|
api->sendN2kMessage(N2kMsg);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send data from environment sensor all 2s
|
// Send data from environment sensor all 2s
|
||||||
if(millis() > starttime6 + 2000){
|
if(millis() > starttime6 + 2000){
|
||||||
starttime6 = millis();
|
starttime6 = millis();
|
||||||
|
|
||||||
// DEBUG
|
|
||||||
UBaseType_t stackfree = uxTaskGetStackHighWaterMark(NULL);
|
|
||||||
api->getLogger()->logDebug(GwLog::LOG, "obpSensortask Stack=%d", stackfree);
|
|
||||||
|
|
||||||
unsigned char TempSource = 2; // Inside temperature
|
unsigned char TempSource = 2; // Inside temperature
|
||||||
unsigned char PressureSource = 0; // Atmospheric pressure
|
unsigned char PressureSource = 0; // Atmospheric pressure
|
||||||
unsigned char HumiditySource = 0; // Inside humidity
|
unsigned char HumiditySource = 0; // Inside humidity
|
||||||
@@ -791,12 +694,8 @@ void sensorTask(void *param){
|
|||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void createSensorTask(SharedData *shared) {
|
|
||||||
TaskHandle_t xHandle = NULL;
|
void createSensorTask(SharedData *shared){
|
||||||
GwLog *logger = shared->api->getLogger();
|
xTaskCreate(sensorTask,"readSensors",10000,shared,3,NULL);
|
||||||
esp_err_t err = xTaskCreate(sensorTask, "readSensors", configMINIMAL_STACK_SIZE + 8192, shared, 3, &xHandle);
|
|
||||||
if ( err != pdPASS) {
|
|
||||||
logger->logDebug(GwLog::ERROR, "Failed to create sensor task! (err=%d)", err);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "GwSynchronized.h"
|
#include "GwSynchronized.h"
|
||||||
#include "GwApi.h"
|
#include "GwApi.h"
|
||||||
|
|||||||
@@ -1,178 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
|
||||||
#include "OBP60Extensions.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
AIS Overview
|
|
||||||
- circle with certain range, e.g. 5nm
|
|
||||||
- AIS-Targets in range with speed and heading
|
|
||||||
- perhaps collision alarm
|
|
||||||
Data: LAT LON SOG HDT
|
|
||||||
|
|
||||||
Feature possibilities
|
|
||||||
- switch between North up / Heading up
|
|
||||||
- filter
|
|
||||||
- zoom
|
|
||||||
- special vessel symbols
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
class PageAIS : public Page
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
|
|
||||||
int scale = 5; // Radius of display circle in nautical miles
|
|
||||||
|
|
||||||
bool alarm = false;
|
|
||||||
bool alarm_enabled = false;
|
|
||||||
int alarm_range = 3;
|
|
||||||
|
|
||||||
char mode = 'N'; // (N)ormal, (C)onfig
|
|
||||||
|
|
||||||
void displayModeNormal(PageData &pageData) {
|
|
||||||
|
|
||||||
// TBD Boatvalues: ...
|
|
||||||
|
|
||||||
logger->logDebug(GwLog::DEBUG,"Drawing at PageAIS");
|
|
||||||
|
|
||||||
Point c = {200, 150}; // center = current boat position
|
|
||||||
uint16_t r = 125;
|
|
||||||
|
|
||||||
const std::vector<Point> pts_boat = { // polygon lines
|
|
||||||
{c.x - 5, c.y},
|
|
||||||
{c.x - 5, c.y - 10},
|
|
||||||
{c.x, c.y - 16},
|
|
||||||
{c.x + 5, c.y - 10},
|
|
||||||
{c.x + 5, c.y}
|
|
||||||
};
|
|
||||||
drawPoly(pts_boat, commonData->fgcolor);
|
|
||||||
|
|
||||||
// Title and corner value headings
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("AIS");
|
|
||||||
|
|
||||||
// zoom scale
|
|
||||||
epd->drawLine(c.x + 10, c.y, c.x + r - 4, c.y, commonData->fgcolor);
|
|
||||||
// arrow left
|
|
||||||
epd->drawLine(c.x + 10, c.y, c.x + 16, c.y - 4, commonData->fgcolor);
|
|
||||||
epd->drawLine(c.x + 10, c.y, c.x + 16, c.y + 4, commonData->fgcolor);
|
|
||||||
// arrow right
|
|
||||||
epd->drawLine(c.x + r - 4, c.y, c.x + r - 10, c.y - 4, commonData->fgcolor);
|
|
||||||
epd->drawLine(c.x + r - 4, c.y, c.x + r - 10, c.y + 4, commonData->fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
drawTextCenter(c.x + r / 2, c.y + 8, String(scale) + "nm");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeConfig() {
|
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("AIS configuration");
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
// TODO menu
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
PageAIS(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageAIS");
|
|
||||||
alarm_range = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupKeys(){
|
|
||||||
Page::setupKeys();
|
|
||||||
commonData->keydata[0].label = "MODE";
|
|
||||||
commonData->keydata[1].label = "ALARM";
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
int handleKey(int key){
|
|
||||||
if (key == 1) { // Switch between normal and config mode
|
|
||||||
if (mode == 'N') {
|
|
||||||
mode = 'C';
|
|
||||||
} else {
|
|
||||||
mode = 'N';
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 11) { // Code for keylock
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
int handleKey(int key) {
|
|
||||||
if (key == 1) { // Switch between normal and config mode
|
|
||||||
if (mode == 'N') {
|
|
||||||
mode = 'C';
|
|
||||||
} else {
|
|
||||||
mode = 'N';
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 11) { // Code for keylock
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// Clear optical warning
|
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData){
|
|
||||||
|
|
||||||
// Logging boat values
|
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageAIS; Mode=%c", mode);
|
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height());
|
|
||||||
|
|
||||||
if (mode == 'N') {
|
|
||||||
displayModeNormal(pageData);
|
|
||||||
} else if (mode == 'C') {
|
|
||||||
displayModeConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
static Page *createPage(CommonData &common){
|
|
||||||
return new PageAIS(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 registerPageAIS(
|
|
||||||
"AIS", // Page name
|
|
||||||
createPage, // Action
|
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
|
||||||
{"LAT", "LON", "SOG", "HDT"}, // Names of bus values undepends on selection in Web configuration (refer GwBoatData.h)
|
|
||||||
true // Show display header on/off
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,432 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
|
||||||
#include "OBP60Extensions.h"
|
|
||||||
#include "ConfigMenu.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
Anchor overview with additional associated data
|
|
||||||
This page is in experimental stage so be warned!
|
|
||||||
North is up.
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
This is the fist page to contain a configuration page with
|
|
||||||
data entry option.
|
|
||||||
Also it will make use of the new alarm function.
|
|
||||||
|
|
||||||
Data
|
|
||||||
Anchor position lat/lon
|
|
||||||
Depth at anchor position
|
|
||||||
Chain length used
|
|
||||||
Boat position current
|
|
||||||
Depth at boat position
|
|
||||||
Boat heading
|
|
||||||
Wind direction
|
|
||||||
Wind strength
|
|
||||||
Alarm j/n
|
|
||||||
Alarm radius
|
|
||||||
GPS position error
|
|
||||||
Timestamp while dropping anchor
|
|
||||||
|
|
||||||
Drop / raise function in device OBP40 has to be done inside
|
|
||||||
config mode because of limited number of buttons.
|
|
||||||
|
|
||||||
Save position in FRAM
|
|
||||||
Alarm: gps fix lost
|
|
||||||
switch unit feet/meter
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define anchor_width 16
|
|
||||||
#define anchor_height 16
|
|
||||||
static unsigned char anchor_bits[] = {
|
|
||||||
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:
|
|
||||||
String lengthformat;
|
|
||||||
|
|
||||||
int scale = 50; // Radius of display circle in meter
|
|
||||||
|
|
||||||
bool alarm = false;
|
|
||||||
bool alarm_enabled = false;
|
|
||||||
uint8_t alarm_range;
|
|
||||||
|
|
||||||
uint8_t chain_length;
|
|
||||||
uint8_t chain;
|
|
||||||
|
|
||||||
bool anchor_set = false;
|
|
||||||
double anchor_lat;
|
|
||||||
double anchor_lon;
|
|
||||||
double anchor_depth;
|
|
||||||
int anchor_ts; // time stamp anchor dropped
|
|
||||||
|
|
||||||
char mode = 'N'; // (N)ormal, (C)onfig
|
|
||||||
int8_t editmode = -1; // marker for menu/edit/set function
|
|
||||||
|
|
||||||
ConfigMenu *menu;
|
|
||||||
|
|
||||||
void displayModeNormal(PageData &pageData) {
|
|
||||||
|
|
||||||
// Boatvalues: DBS, HDT, AWS, AWD, LAT, LON, HDOP
|
|
||||||
GwApi::BoatValue *bv_dbs = pageData.values[0]; // DBS
|
|
||||||
String sval_dbs = commonData->fmt->formatValue(bv_dbs, *commonData).svalue;
|
|
||||||
String sunit_dbs = commonData->fmt->formatValue(bv_dbs, *commonData).unit;
|
|
||||||
GwApi::BoatValue *bv_hdt = pageData.values[1]; // HDT
|
|
||||||
String sval_hdt = commonData->fmt->formatValue(bv_hdt, *commonData).svalue;
|
|
||||||
GwApi::BoatValue *bv_aws = pageData.values[2]; // AWS
|
|
||||||
String sval_aws = commonData->fmt->formatValue(bv_aws, *commonData).svalue;
|
|
||||||
String sunit_aws = commonData->fmt->formatValue(bv_aws, *commonData).unit;
|
|
||||||
GwApi::BoatValue *bv_awd = pageData.values[3]; // AWD
|
|
||||||
String sval_awd = commonData->fmt->formatValue(bv_awd, *commonData).svalue;
|
|
||||||
GwApi::BoatValue *bv_lat = pageData.values[4]; // LAT
|
|
||||||
String sval_lat = commonData->fmt->formatValue(bv_lat, *commonData).svalue;
|
|
||||||
GwApi::BoatValue *bv_lon = pageData.values[5]; // LON
|
|
||||||
String sval_lon = commonData->fmt->formatValue(bv_lon, *commonData).svalue;
|
|
||||||
GwApi::BoatValue *bv_hdop = pageData.values[6]; // HDOP
|
|
||||||
String sval_hdop = commonData->fmt->formatValue(bv_hdop, *commonData).svalue;
|
|
||||||
String sunit_hdop = commonData->fmt->formatValue(bv_hdop, *commonData).unit;
|
|
||||||
|
|
||||||
logger->logDebug(GwLog::DEBUG, "Drawing at PageAnchor; DBS=%f, HDT=%f, AWS=%f", bv_dbs->value, bv_hdt->value, bv_aws->value);
|
|
||||||
|
|
||||||
Point c = {200, 150}; // center = anchor position
|
|
||||||
uint16_t r = 125;
|
|
||||||
|
|
||||||
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
|
|
||||||
//drawPoly(rotatePoints(c, pts, RadToDeg(value2)), commonData->fgcolor);
|
|
||||||
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
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("Anchor");
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold10pt8b);
|
|
||||||
epd->setCursor(8, 200);
|
|
||||||
epd->print("Depth");
|
|
||||||
drawTextRalign(392, 38, "Chain");
|
|
||||||
drawTextRalign(392, 200, "Wind");
|
|
||||||
|
|
||||||
// Units
|
|
||||||
epd->setCursor(8, 272);
|
|
||||||
epd->print(sunit_dbs);
|
|
||||||
drawTextRalign(392, 272, sunit_aws);
|
|
||||||
drawTextRalign(392, 100, lengthformat); // chain unit not implemented
|
|
||||||
|
|
||||||
// Corner values
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(8, 70);
|
|
||||||
epd->print("Alarm: ");
|
|
||||||
epd->print(alarm_enabled ? "On" : "Off");
|
|
||||||
|
|
||||||
epd->setCursor(8, 90);
|
|
||||||
epd->print("HDOP");
|
|
||||||
epd->setCursor(8, 106);
|
|
||||||
if (bv_hdop->valid) {
|
|
||||||
epd->print(round(bv_hdop->value), 0);
|
|
||||||
epd->print(sunit_hdop);
|
|
||||||
} else {
|
|
||||||
epd->print("n/a");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Values
|
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
|
||||||
// Current chain used
|
|
||||||
epd->setCursor(328, 85);
|
|
||||||
epd->print("27");
|
|
||||||
|
|
||||||
// Depth
|
|
||||||
epd->setCursor(8, 250);
|
|
||||||
epd->print(sval_dbs);
|
|
||||||
// Wind
|
|
||||||
epd->setCursor(328, 250);
|
|
||||||
epd->print(sval_aws);
|
|
||||||
|
|
||||||
epd->drawCircle(c.x, c.y, r, commonData->fgcolor);
|
|
||||||
epd->drawCircle(c.x, c.y, r + 1, commonData->fgcolor);
|
|
||||||
|
|
||||||
// zoom scale
|
|
||||||
epd->drawLine(c.x + 10, c.y, c.x + r - 4, c.y, commonData->fgcolor);
|
|
||||||
// arrow left
|
|
||||||
epd->drawLine(c.x + 10, c.y, c.x + 16, c.y - 4, commonData->fgcolor);
|
|
||||||
epd->drawLine(c.x + 10, c.y, c.x + 16, c.y + 4, commonData->fgcolor);
|
|
||||||
// arrow right
|
|
||||||
epd->drawLine(c.x + r - 4, c.y, c.x + r - 10, c.y - 4, commonData->fgcolor);
|
|
||||||
epd->drawLine(c.x + r - 4, c.y, c.x + r - 10, c.y + 4, commonData->fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
drawTextCenter(c.x + r / 2, c.y + 8, String(scale) + "m");
|
|
||||||
|
|
||||||
// alarm range circle
|
|
||||||
if (alarm_enabled) {
|
|
||||||
// alarm range in meter has to be smaller than the scale in meter
|
|
||||||
// r and r_range are pixel values
|
|
||||||
uint16_t r_range = int(alarm_range * r / scale);
|
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageAnchor; Alarm range = %d", r_range);
|
|
||||||
epd->drawCircle(c.x, c.y, r_range, commonData->fgcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
// draw anchor symbol (as bitmap)
|
|
||||||
epd->drawXBitmap(c.x - anchor_width / 2, c.y - anchor_height / 2,
|
|
||||||
anchor_bits, anchor_width, anchor_height, commonData->fgcolor);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeConfig() {
|
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("Anchor configuration");
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
// show lat/lon for anchor pos
|
|
||||||
// show lat/lon for boat pos
|
|
||||||
// show distance anchor <-> boat
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
for (int i = 0 ; i < menu->getItemCount(); i++) {
|
|
||||||
ConfigMenuItem *itm = menu->getItemByIndex(i);
|
|
||||||
if (!itm) {
|
|
||||||
logger->logDebug(GwLog::ERROR, "Menu item not found: %d", i);
|
|
||||||
} else {
|
|
||||||
Rect r = menu->getItemRect(i);
|
|
||||||
bool inverted = (i == menu->getActiveIndex());
|
|
||||||
drawTextBoxed(r, itm->getLabel(), commonData->fgcolor, commonData->bgcolor, inverted, false);
|
|
||||||
if (inverted and editmode > 0) {
|
|
||||||
// triangle as edit marker
|
|
||||||
epd->fillTriangle(r.x + r.w + 20, r.y, r.x + r.w + 30, r.y + r.h / 2, r.x + r.w + 20, r.y + r.h, commonData->fgcolor);
|
|
||||||
}
|
|
||||||
epd->setCursor(r.x + r.w + 40, r.y + r.h - 4);
|
|
||||||
if (itm->getType() == "int") {
|
|
||||||
epd->print(itm->getValue());
|
|
||||||
epd->print(itm->getUnit());
|
|
||||||
} else {
|
|
||||||
epd->print(itm->getValue() == 0 ? "No" : "Yes");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
PageAnchor(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageAnchor");
|
|
||||||
|
|
||||||
// preload configuration data
|
|
||||||
lengthformat = config->getString(config->lengthFormat);
|
|
||||||
chain_length = config->getInt(config->chainLength);
|
|
||||||
|
|
||||||
chain = 0;
|
|
||||||
anchor_set = false;
|
|
||||||
alarm_range = 30;
|
|
||||||
|
|
||||||
// Initialize config menu
|
|
||||||
menu = new ConfigMenu("Options", 40, 80);
|
|
||||||
menu->setItemDimension(150, 20);
|
|
||||||
|
|
||||||
ConfigMenuItem *newitem;
|
|
||||||
newitem = menu->addItem("chain", "Chain out", "int", 0, "m");
|
|
||||||
if (! newitem) {
|
|
||||||
// Demo: in case of failure exit here, should never be happen
|
|
||||||
logger->logDebug(GwLog::ERROR, "Menu item creation failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
newitem->setRange(0, 200, {1, 5, 10});
|
|
||||||
newitem = menu->addItem("chainmax", "Chain max", "int", chain_length, "m");
|
|
||||||
newitem->setRange(0, 200, {1, 5, 10});
|
|
||||||
newitem = menu->addItem("zoom", "Zoom", "int", 50, "m");
|
|
||||||
newitem->setRange(0, 200, {1, });
|
|
||||||
newitem = menu->addItem("range", "Alarm range", "int", 40, "m");
|
|
||||||
newitem->setRange(0, 200, {1, 5, 10});
|
|
||||||
newitem = menu->addItem("alat", "Adjust anchor lat.", "int", 0, "m");
|
|
||||||
newitem->setRange(0, 200, {1, 5, 10});
|
|
||||||
newitem = menu->addItem("alon", "Adjust anchor lon.", "int", 0, "m");
|
|
||||||
newitem->setRange(0, 200, {1, 5, 10});
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
// Intodruced here because of missing keys for OBP40
|
|
||||||
newitem = menu->addItem("anchor", "Anchor down", "bool", 0, "");
|
|
||||||
#endif
|
|
||||||
menu->setItemActive("zoom");
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupKeys(){
|
|
||||||
Page::setupKeys();
|
|
||||||
commonData->keydata[0].label = "MODE";
|
|
||||||
commonData->keydata[1].label = "ALARM";
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
int handleKey(int key){
|
|
||||||
if (key == 1) { // Switch between normal and config mode
|
|
||||||
if (mode == 'N') {
|
|
||||||
mode = 'C';
|
|
||||||
} else {
|
|
||||||
mode = 'N';
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (mode == 'N') {
|
|
||||||
if (key == 2) { // Toggle alarm
|
|
||||||
alarm_enabled = !alarm_enabled;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} else { // Config mode
|
|
||||||
if (key == 3) {
|
|
||||||
// menu down
|
|
||||||
menu->goNext();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 4) {
|
|
||||||
// menu up
|
|
||||||
menu->goPrev();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (key == 11) { // Code for keylock
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
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';
|
|
||||||
commonData->keydata[1].label = "ALARM";
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (mode == 'N') {
|
|
||||||
if (key == 2) { // Toggle alarm
|
|
||||||
alarm_enabled = !alarm_enabled;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} else { // Config mode
|
|
||||||
// TODO different code for OBP40 / OBP60
|
|
||||||
if (key == 9) {
|
|
||||||
// menu down
|
|
||||||
if (editmode > 0) {
|
|
||||||
// decrease item value
|
|
||||||
menu->getActiveItem()->decValue();
|
|
||||||
} else {
|
|
||||||
menu->goNext();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 10) {
|
|
||||||
// menu up or value up
|
|
||||||
if (editmode > 0) {
|
|
||||||
// increase item value
|
|
||||||
menu->getActiveItem()->incValue();
|
|
||||||
} else {
|
|
||||||
menu->goPrev();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 2) {
|
|
||||||
// enter / leave edit mode for current menu item
|
|
||||||
if (editmode > 0) {
|
|
||||||
commonData->keydata[1].label = "EDIT";
|
|
||||||
editmode = 0;
|
|
||||||
} else {
|
|
||||||
commonData->keydata[1].label = "SET";
|
|
||||||
editmode = 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (key == 11) { // Code for keylock
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void displayNew(PageData &pageData){
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// Clear optical warning
|
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData){
|
|
||||||
|
|
||||||
// Logging boat values
|
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageAnchor; Mode=%c", mode);
|
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->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
|
|
||||||
@@ -1,138 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
|
||||||
#include "OBP60Extensions.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
Autopilot
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
class PageAutopilot : public Page
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
char mode = 'N'; // (N)ormal, (C)onfig
|
|
||||||
|
|
||||||
void displayModeNormal(PageData &pageData) {
|
|
||||||
|
|
||||||
// TBD Boatvalues: ...
|
|
||||||
|
|
||||||
logger->logDebug(GwLog::DEBUG, "Drawing at PageAutopilot");
|
|
||||||
|
|
||||||
// Title and corner value headings
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("Autopilot");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeConfig() {
|
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("Autopilot configuration");
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
// TODO menu
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
PageAutopilot(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageAutopilot");
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupKeys() {
|
|
||||||
Page::setupKeys();
|
|
||||||
commonData->keydata[0].label = "MODE";
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
int handleKey(int key) {
|
|
||||||
if (key == 1) { // Switch between normal and config mode
|
|
||||||
if (mode == 'N') {
|
|
||||||
mode = 'C';
|
|
||||||
} else {
|
|
||||||
mode = 'N';
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 11) { // Code for keylock
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
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';
|
|
||||||
commonData->keydata[1].label = "ALARM";
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 11) { // Code for keylock
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void displayNew(PageData &pageData){
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// Clear optical warning
|
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData){
|
|
||||||
|
|
||||||
// Logging boat values
|
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageAutopilot; Mode=%c", mode);
|
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height());
|
|
||||||
|
|
||||||
if (mode == 'N') {
|
|
||||||
displayModeNormal(pageData);
|
|
||||||
} else if (mode == 'C') {
|
|
||||||
displayModeConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
static Page *createPage(CommonData &common){
|
|
||||||
return new PageAutopilot(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 registerPageAutopilot(
|
|
||||||
"Autopilot", // Page name
|
|
||||||
createPage, // Action
|
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
|
||||||
{}, // Names of bus values undepends on selection in Web configuration (refer GwBoatData.h)
|
|
||||||
false // Show display header on/off
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,26 +1,17 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
class PageBME280 : public Page
|
class PageBME280 : public Page
|
||||||
{
|
{
|
||||||
private:
|
public:
|
||||||
String tempformat;
|
PageBME280(CommonData &common){
|
||||||
String useenvsensor;
|
commonData = &common;
|
||||||
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageBME280");
|
||||||
public:
|
|
||||||
PageBME280(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageBME280");
|
|
||||||
|
|
||||||
// Get config data
|
|
||||||
tempformat = config->getString(config->tempFormat);
|
|
||||||
useenvsensor = config->getString(config->useEnvSensor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleKey(int key){
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -29,7 +20,9 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
int displayPage(PageData &pageData){
|
virtual void displayPage(PageData &pageData){
|
||||||
|
GwConfigHandler *config = commonData->config;
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
double value1 = 0;
|
double value1 = 0;
|
||||||
double value2 = 0;
|
double value2 = 0;
|
||||||
@@ -37,6 +30,13 @@ public:
|
|||||||
String svalue1 = "";
|
String svalue1 = "";
|
||||||
String svalue2 = "";
|
String svalue2 = "";
|
||||||
String svalue3 = "";
|
String svalue3 = "";
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String tempformat = config->getString(config->tempFormat);
|
||||||
|
bool simulation = config->getBool(config->useSimuData);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
String useenvsensor = config->getString(config->useEnvSensor);
|
||||||
|
|
||||||
// Get sensor values #1
|
// Get sensor values #1
|
||||||
String name1 = "Temp"; // Value name
|
String name1 = "Temp"; // Value name
|
||||||
@@ -48,7 +48,7 @@ public:
|
|||||||
value1 = 23.0 + float(random(0, 10)) / 10.0;
|
value1 = 23.0 + float(random(0, 10)) / 10.0;
|
||||||
}
|
}
|
||||||
// Display data when sensor activated
|
// Display data when sensor activated
|
||||||
if((useenvsensor == "BME280") or (useenvsensor == "BMP280") or (useenvsensor == "BMP180")){
|
if((String(useenvsensor) == "BME280") or (String(useenvsensor) == "BMP280")){
|
||||||
svalue1 = String(value1, 1); // Formatted value as string including unit conversion and switching decimal places
|
svalue1 = String(value1, 1); // Formatted value as string including unit conversion and switching decimal places
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -66,7 +66,7 @@ public:
|
|||||||
value2 = 43 + float(random(0, 4));
|
value2 = 43 + float(random(0, 4));
|
||||||
}
|
}
|
||||||
// Display data when sensor activated
|
// Display data when sensor activated
|
||||||
if(useenvsensor == "BME280"){
|
if(String(useenvsensor) == "BME280"){
|
||||||
svalue2 = String(value2, 0); // Formatted value as string including unit conversion and switching decimal places
|
svalue2 = String(value2, 0); // Formatted value as string including unit conversion and switching decimal places
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -84,7 +84,7 @@ public:
|
|||||||
value3 = 1006 + float(random(0, 5));
|
value3 = 1006 + float(random(0, 5));
|
||||||
}
|
}
|
||||||
// Display data when sensor activated
|
// Display data when sensor activated
|
||||||
if((useenvsensor == "BME280") or (useenvsensor == "BMP280") or (useenvsensor == "BMP180")){
|
if((String(useenvsensor) == "BME280") or (String(useenvsensor) == "BMP280")){
|
||||||
svalue3 = String(value3 / 100, 1); // Formatted value as string including unit conversion and switching decimal places
|
svalue3 = String(value3 / 100, 1); // Formatted value as string including unit conversion and switching decimal places
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -99,84 +99,86 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageBME280, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageBME280, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 55);
|
getdisplay().setCursor(20, 55);
|
||||||
epd->print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
epd->print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
epd->setCursor(180, 90);
|
getdisplay().setCursor(180, 90);
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
epd->print(svalue1); // Real value as formated string
|
getdisplay().print(svalue1); // Real value as formated string
|
||||||
|
|
||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 105, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 105, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 145);
|
getdisplay().setCursor(20, 145);
|
||||||
epd->print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
epd->print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
epd->setCursor(180, 180);
|
getdisplay().setCursor(180, 180);
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
epd->print(svalue2); // Real value as formated string
|
getdisplay().print(svalue2); // Real value as formated string
|
||||||
|
|
||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 195, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 195, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 235);
|
getdisplay().setCursor(20, 235);
|
||||||
epd->print(name3); // Page name
|
getdisplay().print(name3); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 270);
|
getdisplay().setCursor(20, 270);
|
||||||
epd->print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
epd->setCursor(140, 270);
|
getdisplay().setCursor(140, 270);
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
epd->print(svalue3); // Real value as formated string
|
getdisplay().print(svalue3); // Real value as formated string
|
||||||
|
|
||||||
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,238 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Barograph WIP
|
|
||||||
* - Zoom feature
|
|
||||||
* - Saves data in FRAM if available
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
|
||||||
#include "OBP60Extensions.h"
|
|
||||||
|
|
||||||
class PageBarograph : public Page
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
bool keylock = false;
|
|
||||||
bool has_fram = false;
|
|
||||||
String flashLED;
|
|
||||||
String useenvsensor;
|
|
||||||
|
|
||||||
char source = 'I'; // (I)nternal, e(X)ternal
|
|
||||||
const int series[5] = {75, 150, 300, 600, 900};
|
|
||||||
const int zoom[5] = {1, 2, 3, 6, 12};
|
|
||||||
int zoomindex = 4;
|
|
||||||
uint16_t data[336] = {0}; // current data to display
|
|
||||||
|
|
||||||
// y-axis
|
|
||||||
uint16_t vmin;
|
|
||||||
uint16_t vmax;
|
|
||||||
uint16_t scalemin = 1000;
|
|
||||||
uint16_t scalemax = 1020;
|
|
||||||
uint16_t scalestep = 5;
|
|
||||||
int hist1 = 0; // one hour trend
|
|
||||||
int hist3 = 0; // three hours trend
|
|
||||||
|
|
||||||
long refresh = 0; // millis
|
|
||||||
|
|
||||||
void loadData() {
|
|
||||||
// Transfer data from history to page buffer,
|
|
||||||
// set y-axis according to data
|
|
||||||
int i = zoom[zoomindex];
|
|
||||||
|
|
||||||
// get min and max values of measured data
|
|
||||||
vmin = data[0];
|
|
||||||
vmax = data[0];
|
|
||||||
for (int x = 0; x < 336; x++) {
|
|
||||||
if (data[x] != 0) {
|
|
||||||
if (data[x] < vmin) {
|
|
||||||
vmin = data[x];
|
|
||||||
} else if (data[x] > vmax) {
|
|
||||||
vmax = data[x];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// calculate y-axis scale
|
|
||||||
uint16_t diff = vmax - vmin;
|
|
||||||
if (diff < 20) {
|
|
||||||
scalestep = 5;
|
|
||||||
} else if (diff < 40) {
|
|
||||||
scalestep = 10;
|
|
||||||
} else {
|
|
||||||
scalestep = 15;
|
|
||||||
}
|
|
||||||
scalemin = vmin - (vmin % scalestep);
|
|
||||||
scalemax = vmax + scalestep - (vmax % scalestep);
|
|
||||||
|
|
||||||
// TODO implement history buffer
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
PageBarograph(CommonData &common): Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageBarograph");
|
|
||||||
|
|
||||||
// Get config data
|
|
||||||
useenvsensor = config->getString(common.config->useEnvSensor);
|
|
||||||
// possible values for internal sensor
|
|
||||||
static std::vector<String> sensorList = {
|
|
||||||
"BME280", "BMP280", "BMP180", "BMP085", "HTU21", "SHT21"
|
|
||||||
};
|
|
||||||
if (std::find(sensorList.begin(), sensorList.end(), useenvsensor) != sensorList.end()) {
|
|
||||||
source = 'I';
|
|
||||||
} else {
|
|
||||||
// "off" means user external data if available
|
|
||||||
source = 'X';
|
|
||||||
}
|
|
||||||
//common.logger->logDebug(GwLog::LOG,"Source=%s (%s)", source, useenvsensor);
|
|
||||||
loadData(); // initial load
|
|
||||||
}
|
|
||||||
|
|
||||||
int handleKey(int key) {
|
|
||||||
if (key == 1) {
|
|
||||||
// zoom in
|
|
||||||
if (zoomindex > 0) {
|
|
||||||
zoomindex -= 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 2) {
|
|
||||||
// zoom out
|
|
||||||
if (zoomindex < sizeof(zoom)) {
|
|
||||||
zoomindex += 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 11) {
|
|
||||||
keylock = !keylock;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// Clear optical warning
|
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
// Logging boat values
|
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageBarograph");
|
|
||||||
|
|
||||||
// Draw page
|
|
||||||
//***********************************************************
|
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
|
||||||
|
|
||||||
// Frames
|
|
||||||
epd->fillRect(0, 75, 400, 2, commonData->fgcolor); // fillRect: x, y, w, h
|
|
||||||
epd->fillRect(130, 20, 2, 55, commonData->fgcolor);
|
|
||||||
epd->fillRect(270, 20, 2, 55, commonData->fgcolor);
|
|
||||||
epd->fillRect(325, 20, 2, 55, commonData->fgcolor);
|
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
if (source == 'I') {
|
|
||||||
drawTextCenter(360, 40, useenvsensor);
|
|
||||||
} else {
|
|
||||||
drawTextCenter(360, 40, "ext.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Trend
|
|
||||||
drawTextCenter(295, 62, "0.0");
|
|
||||||
|
|
||||||
// Alarm placeholder
|
|
||||||
drawTextCenter(70, 62, "Alarm Off");
|
|
||||||
|
|
||||||
// Zoom
|
|
||||||
int datastep = series[zoomindex];
|
|
||||||
String fmt;
|
|
||||||
if (datastep > 120) {
|
|
||||||
if (datastep % 60 == 0) {
|
|
||||||
fmt = String(datastep / 60.0, 0) + " min";
|
|
||||||
} else {
|
|
||||||
fmt = String(datastep / 60.0, 1) + " min";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fmt = String(datastep) + " s";
|
|
||||||
}
|
|
||||||
drawTextCenter(360, 62, fmt);
|
|
||||||
|
|
||||||
// Current measurement
|
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
|
||||||
drawTextCenter(200, 40, String(commonData->data.airPressure / 100, 1));
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
drawTextCenter(200, 62, "hPa"); // Unit
|
|
||||||
|
|
||||||
// Diagram
|
|
||||||
const int xstep = 48; // x-axis-grid
|
|
||||||
const int x0 = 350; // origin
|
|
||||||
const int y0 = 270;
|
|
||||||
const int w = 7 * 48;
|
|
||||||
const int h = 180;
|
|
||||||
|
|
||||||
// epd->drawRect(x0 - w, y0 - h, w, h, commonData->fgcolor);
|
|
||||||
|
|
||||||
// x-axis are hours
|
|
||||||
for (int i = 1; i <= 6; i++) {
|
|
||||||
String label = String(-1 * zoom[zoomindex] * i);
|
|
||||||
epd->drawLine(x0 - i * xstep, y0, x0 - i * xstep, y0 - h, commonData->fgcolor);
|
|
||||||
drawTextCenter(x0 - i * xstep, y0 - 10, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
// y-axis
|
|
||||||
epd->drawLine(x0 + 5, y0, x0 + 5, y0 - h, commonData->fgcolor); // drawLine: x1, y1, x2, y2
|
|
||||||
epd->drawLine(x0 - w, y0, x0 - w, y0 - h, commonData->fgcolor);
|
|
||||||
epd->drawLine(x0 - w - 5, y0, x0 - w - 5, y0 - h, commonData->fgcolor);
|
|
||||||
epd->drawLine(x0, y0, x0, y0 - h, commonData->fgcolor);
|
|
||||||
|
|
||||||
int16_t dy = 9; // px for one hPa
|
|
||||||
int16_t y = y0;
|
|
||||||
int16_t ys = scalemin;
|
|
||||||
while (y >= y0 - h) {
|
|
||||||
if (y % scalestep == 0) {
|
|
||||||
// big step, show label and long line
|
|
||||||
epd->setCursor(x0 + 10, y + 5);
|
|
||||||
epd->print(String(ys));
|
|
||||||
epd->drawLine(x0 + 5, y, x0 - w - 5, y, commonData->fgcolor);
|
|
||||||
} else {
|
|
||||||
// small step, only short lines left and right
|
|
||||||
epd->drawLine(x0 + 5, y, x0, y, commonData->fgcolor);
|
|
||||||
epd->drawLine(x0 - w - 5, y, x0 - w, y, commonData->fgcolor);
|
|
||||||
}
|
|
||||||
y -= dy;
|
|
||||||
ys += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
static Page* createPage(CommonData &common){
|
|
||||||
return new PageBarograph(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 registerPageBarograph(
|
|
||||||
"Barograph", // Page name
|
|
||||||
createPage, // Action
|
|
||||||
0, // No bus values needed
|
|
||||||
true // Show display header on/off
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,30 +1,24 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
class PageBattery : public Page
|
class PageBattery : public Page
|
||||||
{
|
{
|
||||||
private:
|
int average = 0; // Average type [0...3], 0=off, 1=10s, 2=60s, 3=300s
|
||||||
String powsensor1;
|
|
||||||
int average = 0; // Average type [0...3], 0=off, 1=10s, 2=60s, 3=300s
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageBattery(CommonData &common) : Page(common)
|
PageBattery(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageBattery");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageBattery");
|
||||||
|
|
||||||
// Get config data
|
|
||||||
String powsensor1 = config->getString(config->usePowSensor1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupKeys(){
|
virtual void setupKeys(){
|
||||||
Page::setupKeys();
|
Page::setupKeys();
|
||||||
commonData->keydata[0].label = "AVG";
|
commonData->keydata[0].label = "AVG";
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleKey(int key){
|
virtual int handleKey(int key){
|
||||||
// Change average
|
// Change average
|
||||||
if(key == 1){
|
if(key == 1){
|
||||||
average ++;
|
average ++;
|
||||||
@@ -40,18 +34,10 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
#ifdef BOARD_OBP60S3
|
GwConfigHandler *config = commonData->config;
|
||||||
// Clear optical warning
|
GwLog *logger = commonData->logger;
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData){
|
|
||||||
|
|
||||||
// Old values for hold function
|
// Old values for hold function
|
||||||
double value1 = 0;
|
double value1 = 0;
|
||||||
static String svalue1old = "";
|
static String svalue1old = "";
|
||||||
@@ -62,7 +48,15 @@ public:
|
|||||||
double value3 = 0;
|
double value3 = 0;
|
||||||
static String svalue3old = "";
|
static String svalue3old = "";
|
||||||
static String unit3old = "";
|
static String unit3old = "";
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
// bool simulation = config->getBool(config->useSimuData);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
String powsensor1 = config->getString(config->usePowSensor1);
|
||||||
|
bool simulation = config->getBool(config->useSimuData);
|
||||||
|
|
||||||
// Get voltage value
|
// Get voltage value
|
||||||
String name1 = "VBat"; // Value name
|
String name1 = "VBat"; // Value name
|
||||||
if(String(powsensor1) == "INA219" || String(powsensor1) == "INA226"){
|
if(String(powsensor1) == "INA219" || String(powsensor1) == "INA226"){
|
||||||
@@ -151,144 +145,152 @@ public:
|
|||||||
String svalue3 = String(value3); // Formatted value as string including unit conversion and switching decimal places
|
String svalue3 = String(value3); // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit3 = "W"; // Unit of value
|
String unit3 = "W"; // Unit of value
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageBattery, %s: %f, %s: %f, %s: %f, Avg: %d", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, average);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageBattery, %s: %f, %s: %f, %s: %f, Avg: %d", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, average);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
// Show average settings
|
// Show average settings
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
switch (average) {
|
switch (average) {
|
||||||
case 0:
|
case 0:
|
||||||
epd->setCursor(60, 90);
|
getdisplay().setCursor(60, 90);
|
||||||
epd->print("Avg: 1s");
|
getdisplay().print("Avg: 1s");
|
||||||
epd->setCursor(60, 180);
|
getdisplay().setCursor(60, 180);
|
||||||
epd->print("Avg: 1s");
|
getdisplay().print("Avg: 1s");
|
||||||
epd->setCursor(60, 270);
|
getdisplay().setCursor(60, 270);
|
||||||
epd->print("Avg: 1s");
|
getdisplay().print("Avg: 1s");
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
epd->setCursor(60, 90);
|
getdisplay().setCursor(60, 90);
|
||||||
epd->print("Avg: 10s");
|
getdisplay().print("Avg: 10s");
|
||||||
epd->setCursor(60, 180);
|
getdisplay().setCursor(60, 180);
|
||||||
epd->print("Avg: 10s");
|
getdisplay().print("Avg: 10s");
|
||||||
epd->setCursor(60, 270);
|
getdisplay().setCursor(60, 270);
|
||||||
epd->print("Avg: 10s");
|
getdisplay().print("Avg: 10s");
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
epd->setCursor(60, 90);
|
getdisplay().setCursor(60, 90);
|
||||||
epd->print("Avg: 60s");
|
getdisplay().print("Avg: 60s");
|
||||||
epd->setCursor(60, 180);
|
getdisplay().setCursor(60, 180);
|
||||||
epd->print("Avg: 60s");
|
getdisplay().print("Avg: 60s");
|
||||||
epd->setCursor(60, 270);
|
getdisplay().setCursor(60, 270);
|
||||||
epd->print("Avg: 60s");
|
getdisplay().print("Avg: 60s");
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
epd->setCursor(60, 90);
|
getdisplay().setCursor(60, 90);
|
||||||
epd->print("Avg: 300s");
|
getdisplay().print("Avg: 300s");
|
||||||
epd->setCursor(60, 180);
|
getdisplay().setCursor(60, 180);
|
||||||
epd->print("Avg: 300s");
|
getdisplay().print("Avg: 300s");
|
||||||
epd->setCursor(60, 270);
|
getdisplay().setCursor(60, 270);
|
||||||
epd->print("Avg: 300s");
|
getdisplay().print("Avg: 300s");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
epd->setCursor(60, 90);
|
getdisplay().setCursor(60, 90);
|
||||||
epd->print("Avg: 1s");
|
getdisplay().print("Avg: 1s");
|
||||||
epd->setCursor(60, 180);
|
getdisplay().setCursor(60, 180);
|
||||||
epd->print("Avg: 1s");
|
getdisplay().print("Avg: 1s");
|
||||||
epd->setCursor(60, 270);
|
getdisplay().setCursor(60, 270);
|
||||||
epd->print("Avg: 1s");
|
getdisplay().print("Avg: 1s");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 55);
|
getdisplay().setCursor(20, 55);
|
||||||
epd->print(name1); // Value name
|
getdisplay().print(name1); // Value name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
epd->print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
|
|
||||||
// Show value
|
// Show value
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
epd->setCursor(180, 90);
|
getdisplay().setCursor(180, 90);
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(String(powsensor1) != "off"){
|
if(String(powsensor1) != "off"){
|
||||||
epd->print(value1,2); // Real value as formated string
|
getdisplay().print(value1,2); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(commonData->fmt->placeholder); // No sensor data (sensor is off)
|
getdisplay().print("---"); // No sensor data (sensor is off)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 105, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 105, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 145);
|
getdisplay().setCursor(20, 145);
|
||||||
epd->print(name2); // Value name
|
getdisplay().print(name2); // Value name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
epd->print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
|
|
||||||
// Show value
|
// Show value
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
epd->setCursor(180, 180);
|
getdisplay().setCursor(180, 180);
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(String(powsensor1) != "off"){
|
if(String(powsensor1) != "off"){
|
||||||
epd->print(value2,1); // Real value as formated string
|
getdisplay().print(value2,1); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(commonData->fmt->placeholder); // No sensor data (sensor is off)
|
getdisplay().print("---"); // No sensor data (sensor is off)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 195, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 195, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 235);
|
getdisplay().setCursor(20, 235);
|
||||||
epd->print(name3); // Value name
|
getdisplay().print(name3); // Value name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 270);
|
getdisplay().setCursor(20, 270);
|
||||||
epd->print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
|
|
||||||
// Show value
|
// Show value
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
epd->setCursor(180, 270);
|
getdisplay().setCursor(180, 270);
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(String(powsensor1) != "off"){
|
if(String(powsensor1) != "off"){
|
||||||
epd->print(value3,1); // Real value as formated string
|
getdisplay().print(value3,1); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(commonData->fmt->placeholder); // No sensor data (sensor is off)
|
getdisplay().print("---"); // No sensor data (sensor is off)
|
||||||
}
|
}
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
@@ -7,34 +6,23 @@
|
|||||||
|
|
||||||
class PageBattery2 : public Page
|
class PageBattery2 : public Page
|
||||||
{
|
{
|
||||||
private:
|
bool init = false; // Marker for init done
|
||||||
String batVoltage;
|
int average = 0; // Average type [0...3], 0=off, 1=10s, 2=60s, 3=300s
|
||||||
int batCapacity;
|
bool trend = true; // Trend indicator [0|1], 0=off, 1=on
|
||||||
String batType;
|
double raw = 0;
|
||||||
String powerSensor;
|
|
||||||
bool init = false; // Marker for init done
|
|
||||||
int average = 0; // Average type [0...3], 0=off, 1=10s, 2=60s, 3=300s
|
|
||||||
bool trend = true; // Trend indicator [0|1], 0=off, 1=on
|
|
||||||
double raw = 0;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageBattery2(CommonData &common) : Page(common)
|
PageBattery2(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageBattery2");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageBattery2");
|
||||||
|
|
||||||
// Get config data
|
|
||||||
batVoltage = config->getString(config->batteryVoltage);
|
|
||||||
batCapacity = config->getInt(config->batteryCapacity);
|
|
||||||
batType = config->getString(config->batteryType);
|
|
||||||
powerSensor = config->getString(config->usePowSensor1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupKeys(){
|
virtual void setupKeys(){
|
||||||
Page::setupKeys();
|
Page::setupKeys();
|
||||||
commonData->keydata[0].label = "AVG";
|
commonData->keydata[0].label = "AVG";
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleKey(int key) {
|
virtual int handleKey(int key){
|
||||||
// Change average
|
// Change average
|
||||||
if(key == 1){
|
if(key == 1){
|
||||||
average ++;
|
average ++;
|
||||||
@@ -56,7 +44,11 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
virtual void displayPage(PageData &pageData)
|
||||||
|
{
|
||||||
|
GwConfigHandler *config = commonData->config;
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
// Polynominal coefficients second order for battery energy level calculation
|
// Polynominal coefficients second order for battery energy level calculation
|
||||||
// index 0 = Pb, 1 = Gel, 2 = AGM, 3 = LiFePo4
|
// index 0 = Pb, 1 = Gel, 2 = AGM, 3 = LiFePo4
|
||||||
float x0[4] = {+3082.5178, +1656.1571, +1316.8766, +14986.9336}; // Offset
|
float x0[4] = {+3082.5178, +1656.1571, +1316.8766, +14986.9336}; // Offset
|
||||||
@@ -65,6 +57,16 @@ public:
|
|||||||
int batPercentage = 0; // Battery level
|
int batPercentage = 0; // Battery level
|
||||||
float batRange = 0; // Range in hours
|
float batRange = 0; // Range in hours
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String batVoltage = config->getString(config->batteryVoltage);
|
||||||
|
int batCapacity = config->getInt(config->batteryCapacity);
|
||||||
|
String batType = config->getString(config->batteryType);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
String powerSensor = config->getString(config->usePowSensor1);
|
||||||
|
|
||||||
double value1 = 0; // Battery voltage
|
double value1 = 0; // Battery voltage
|
||||||
double value2 = 0; // Battery current
|
double value2 = 0; // Battery current
|
||||||
double value3 = 0; // Battery power consumption
|
double value3 = 0; // Battery power consumption
|
||||||
@@ -140,133 +142,149 @@ public:
|
|||||||
if(batRange > 99) batRange = 99;
|
if(batRange > 99) batRange = 99;
|
||||||
|
|
||||||
// Optical warning by limit violation
|
// Optical warning by limit violation
|
||||||
if (flashLED == "Limit Violation") {
|
if(String(flashLED) == "Limit Violation"){
|
||||||
bool violation = false;
|
// Limits for Pb battery
|
||||||
if (batType == "Pb") {
|
if(String(batType) == "Pb" && (raw < 11.8 || raw > 14.8)){
|
||||||
violation = (raw < 11.8 || raw > 14.8);
|
|
||||||
} else if (batType == "Gel") {
|
|
||||||
violation = (raw < 11.8 || raw > 14.4);
|
|
||||||
} else if (batType == "AGM") {
|
|
||||||
violation = (raw < 11.8 || raw > 14.7);
|
|
||||||
} else if (batType == "LiFePo4") {
|
|
||||||
violation = (raw < 12.0 || raw > 14.6);
|
|
||||||
}
|
|
||||||
if (violation) {
|
|
||||||
setBlinkingLED(true);
|
setBlinkingLED(true);
|
||||||
} else {
|
}
|
||||||
|
if(String(batType) == "Pb" && (raw >= 11.8 && raw <= 14.8)){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
// Limits for Gel battery
|
||||||
|
if(String(batType) == "Gel" && (raw < 11.8 || raw > 14.4)){
|
||||||
|
setBlinkingLED(true);
|
||||||
|
}
|
||||||
|
if(String(batType) == "Gel" && (raw >= 11.8 && raw <= 14.4)){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
// Limits for AGM battery
|
||||||
|
if(String(batType) == "AGM" && (raw < 11.8 || raw > 14.7)){
|
||||||
|
setBlinkingLED(true);
|
||||||
|
}
|
||||||
|
if(String(batType) == "AGM" && (raw >= 11.8 && raw <= 14.7)){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
// Limits for LiFePo4 battery
|
||||||
|
if(String(batType) == "LiFePo4" && (raw < 12.0 || raw > 14.6)){
|
||||||
|
setBlinkingLED(true);
|
||||||
|
}
|
||||||
|
if(String(batType) == "LiFePo4" && (raw >= 12.0 && raw <= 14.6)){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
setFlashLED(false);
|
setFlashLED(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logging voltage value
|
// Logging voltage value
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageBattery2, Type:%s %s:=%f", batType.c_str(), name1.c_str(), raw);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageBattery2, Type:%s %s:=%f", batType.c_str(), name1.c_str(), raw);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
epd->print("Bat.");
|
getdisplay().print("Bat.");
|
||||||
|
|
||||||
// Show battery type
|
// Show battery type
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(90, 65);
|
getdisplay().setCursor(90, 65);
|
||||||
epd->print(batType);
|
getdisplay().print(batType);
|
||||||
|
|
||||||
// Show voltage type
|
// Show voltage type
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(10, 140);
|
getdisplay().setCursor(10, 140);
|
||||||
int bvoltage = 0;
|
int bvoltage = 0;
|
||||||
if(String(batVoltage) == "12V") bvoltage = 12;
|
if(String(batVoltage) == "12V") bvoltage = 12;
|
||||||
else bvoltage = 24;
|
else bvoltage = 24;
|
||||||
epd->print(bvoltage);
|
getdisplay().print(bvoltage);
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show battery capacity
|
// Show battery capacity
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(10, 200);
|
getdisplay().setCursor(10, 200);
|
||||||
if(batCapacity <= 999) epd->print(batCapacity, 0);
|
if(batCapacity <= 999) getdisplay().print(batCapacity, 0);
|
||||||
if(batCapacity > 999) epd->print(float(batCapacity/1000.0), 1);
|
if(batCapacity > 999) getdisplay().print(float(batCapacity/1000.0), 1);
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
if(batCapacity <= 999) epd->print("Ah");
|
if(batCapacity <= 999) getdisplay().print("Ah");
|
||||||
if(batCapacity > 999) epd->print("kAh");
|
if(batCapacity > 999) getdisplay().print("kAh");
|
||||||
|
|
||||||
// Show info
|
// Show info
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(10, 235);
|
getdisplay().setCursor(10, 235);
|
||||||
epd->print("Installed");
|
getdisplay().print("Installed");
|
||||||
epd->setCursor(10, 255);
|
getdisplay().setCursor(10, 255);
|
||||||
epd->print("Battery Type");
|
getdisplay().print("Battery Type");
|
||||||
|
|
||||||
// Show battery with fill level
|
// Show battery with fill level
|
||||||
batteryGraphic(150, 45, batPercentage, commonData->fgcolor, commonData->bgcolor);
|
batteryGraphic(150, 45, batPercentage, commonData->fgcolor, commonData->bgcolor);
|
||||||
|
|
||||||
// Show average settings
|
// Show average settings
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(150, 145);
|
getdisplay().setCursor(150, 145);
|
||||||
switch (average) {
|
switch (average) {
|
||||||
case 0:
|
case 0:
|
||||||
epd->print("Avg: 1s");
|
getdisplay().print("Avg: 1s");
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
epd->print("Avg: 10s");
|
getdisplay().print("Avg: 10s");
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
epd->print("Avg: 60s");
|
getdisplay().print("Avg: 60s");
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
epd->print("Avg: 300s");
|
getdisplay().print("Avg: 300s");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
epd->print("Avg: 1s");
|
getdisplay().print("Avg: 1s");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show fill level in percent
|
// Show fill level in percent
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(150, 200);
|
getdisplay().setCursor(150, 200);
|
||||||
epd->print(batPercentage);
|
getdisplay().print(batPercentage);
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->print("%");
|
getdisplay().print("%");
|
||||||
|
|
||||||
// Show time to full discharge
|
// Show time to full discharge
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(150, 260);
|
getdisplay().setCursor(150, 260);
|
||||||
if((powerSensor == "INA219" || powerSensor == "INA226") && simulation == false){
|
if((powerSensor == "INA219" || powerSensor == "INA226") && simulation == false){
|
||||||
if(batRange < 9.9) epd->print(batRange, 1);
|
if(batRange < 9.9) getdisplay().print(batRange, 1);
|
||||||
else epd->print(batRange, 0);
|
else getdisplay().print(batRange, 0);
|
||||||
}
|
}
|
||||||
else epd->print("--");
|
else getdisplay().print("--");
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->print("h");
|
getdisplay().print("h");
|
||||||
|
|
||||||
// Show sensor type info
|
// Show sensor type info
|
||||||
String i2cAddr = "";
|
String i2cAddr = "";
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(270, 60);
|
getdisplay().setCursor(270, 60);
|
||||||
if(powerSensor == "off") epd->print("Internal");
|
if(powerSensor == "off") getdisplay().print("Internal");
|
||||||
if(powerSensor == "INA219"){
|
if(powerSensor == "INA219"){
|
||||||
epd->print("INA219");
|
getdisplay().print("INA219");
|
||||||
}
|
}
|
||||||
if(powerSensor == "INA226"){
|
if(powerSensor == "INA226"){
|
||||||
epd->print("INA226");
|
getdisplay().print("INA226");
|
||||||
i2cAddr = " (0x" + String(INA226_I2C_ADDR1, HEX) + ")";
|
i2cAddr = " (0x" + String(INA226_I2C_ADDR1, HEX) + ")";
|
||||||
}
|
}
|
||||||
epd->print(i2cAddr);
|
getdisplay().print(i2cAddr);
|
||||||
epd->setCursor(270, 80);
|
getdisplay().setCursor(270, 80);
|
||||||
epd->print("Sensor Modul");
|
getdisplay().print("Sensor Modul");
|
||||||
|
|
||||||
// Reading bus data or using simulation data
|
// Reading bus data or using simulation data
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(260, 140);
|
getdisplay().setCursor(260, 140);
|
||||||
if(simulation == true){
|
if(simulation == true){
|
||||||
if(batVoltage == "12V"){
|
if(batVoltage == "12V"){
|
||||||
value1 = 12.0;
|
value1 = 12.0;
|
||||||
@@ -275,52 +293,49 @@ public:
|
|||||||
value1 = 24.0;
|
value1 = 24.0;
|
||||||
}
|
}
|
||||||
value1 += float(random(0, 5)) / 10; // Simulation data
|
value1 += float(random(0, 5)) / 10; // Simulation data
|
||||||
epd->print(value1,1);
|
getdisplay().print(value1,1);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Check for valid real data, display also if hold values activated
|
// Check for valid real data, display also if hold values activated
|
||||||
if(valid1 == true || holdvalues == true){
|
if(valid1 == true || holdvalues == true){
|
||||||
// Resolution switching
|
// Resolution switching
|
||||||
if(value1 <= 9.9) epd->print(value1, 2);
|
if(value1 <= 9.9) getdisplay().print(value1, 2);
|
||||||
if(value1 > 9.9 && value1 <= 99.9)epd->print(value1, 1);
|
if(value1 > 9.9 && value1 <= 99.9)getdisplay().print(value1, 1);
|
||||||
if(value1 > 99.9) epd->print(value1, 0);
|
if(value1 > 99.9) getdisplay().print(value1, 0);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(commonData->fmt->placeholder); // Missing bus data
|
getdisplay().print("---"); // Missing bus data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show actual current in A
|
// Show actual current in A
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(260, 200);
|
getdisplay().setCursor(260, 200);
|
||||||
if((powerSensor == "INA219" || powerSensor == "INA226") && simulation == false){
|
if((powerSensor == "INA219" || powerSensor == "INA226") && simulation == false){
|
||||||
if(value2 <= 9.9) epd->print(value2, 2);
|
if(value2 <= 9.9) getdisplay().print(value2, 2);
|
||||||
if(value2 > 9.9 && value2 <= 99.9)epd->print(value2, 1);
|
if(value2 > 9.9 && value2 <= 99.9)getdisplay().print(value2, 1);
|
||||||
if(value2 > 99.9) epd->print(value2, 0);
|
if(value2 > 99.9) getdisplay().print(value2, 0);
|
||||||
}
|
}
|
||||||
else {
|
else getdisplay().print("---");
|
||||||
epd->print(commonData->fmt->placeholder);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
}
|
getdisplay().print("A");
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
|
||||||
epd->print("A");
|
|
||||||
|
|
||||||
// Show actual consumption in W
|
// Show actual consumption in W
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(260, 260);
|
getdisplay().setCursor(260, 260);
|
||||||
if((powerSensor == "INA219" || powerSensor == "INA226") && simulation == false){
|
if((powerSensor == "INA219" || powerSensor == "INA226") && simulation == false){
|
||||||
if(value3 <= 9.9) epd->print(value3, 2);
|
if(value3 <= 9.9) getdisplay().print(value3, 2);
|
||||||
if(value3 > 9.9 && value3 <= 99.9)epd->print(value3, 1);
|
if(value3 > 9.9 && value3 <= 99.9)getdisplay().print(value3, 1);
|
||||||
if(value3 > 99.9) epd->print(value3, 0);
|
if(value3 > 99.9) getdisplay().print(value3, 0);
|
||||||
}
|
}
|
||||||
else {
|
else getdisplay().print("---");
|
||||||
epd->print(commonData->fmt->placeholder);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
}
|
getdisplay().print("W");
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
|
||||||
epd->print("W");
|
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,113 +1,30 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO mode: race timer: keys
|
|
||||||
* - prepare: set countdown to 5min
|
|
||||||
* reset: abort current countdown and start over with 5min preparation
|
|
||||||
* - 5min: key press
|
|
||||||
* - 4min: key press to sync
|
|
||||||
* - 1min: buzzer signal
|
|
||||||
* - start: buzzer signal for start
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
class PageClock : public Page
|
class PageClock : public Page
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
fmtDate dateformat;
|
|
||||||
int simtime;
|
|
||||||
bool keylock = false;
|
|
||||||
char source = 'R'; // time source (R)TC | (G)PS | (N)TP
|
|
||||||
char mode = 'A'; // display mode (A)nalog | (D)igital | race (T)imer
|
|
||||||
char tz = 'L'; // time zone (L)ocal | (U)TC
|
|
||||||
double timezone = 0; // there are timezones with non int offsets, e.g. 5.5 or 5.75
|
|
||||||
double homelat;
|
|
||||||
double homelon;
|
|
||||||
bool homevalid = false; // homelat and homelon are valid
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageClock(CommonData &common) : Page(common)
|
PageClock(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageClock");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageClock");
|
||||||
|
|
||||||
// Get config data
|
|
||||||
dateformat = common.fmt->getDateFormat(config->getString(config->dateFormat));
|
|
||||||
timezone = config->getString(config->timeZone).toDouble();
|
|
||||||
homelat = config->getString(config->homeLAT).toDouble();
|
|
||||||
homelon = config->getString(config->homeLON).toDouble();
|
|
||||||
homevalid = homelat >= -180.0 and homelat <= 180 and homelon >= -90.0 and homelon <= 90.0;
|
|
||||||
simtime = 38160; // time value 11:36
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// WIP time source
|
|
||||||
String use_rtc = config->getString(config->useRTC);
|
|
||||||
if (use_rtc == "off") {
|
|
||||||
source = 'G';
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupKeys(){
|
|
||||||
Page::setupKeys();
|
|
||||||
commonData->keydata[0].label = "SRC";
|
|
||||||
commonData->keydata[1].label = "MODE";
|
|
||||||
commonData->keydata[4].label = "TZ";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Key functions
|
// Key functions
|
||||||
int handleKey(int key){
|
virtual int handleKey(int key){
|
||||||
// Time source
|
// Code for keylock
|
||||||
if (key == 1) {
|
if(key == 11){
|
||||||
if (source == 'G') {
|
commonData->keylock = !commonData->keylock;
|
||||||
source = 'R';
|
|
||||||
} else {
|
|
||||||
source = 'G';
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 2) {
|
|
||||||
if (mode == 'A') {
|
|
||||||
mode = 'D';
|
|
||||||
} else if (mode == 'D') {
|
|
||||||
mode = 'T';
|
|
||||||
} else {
|
|
||||||
mode = 'A';
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// Time zone: Local / UTC
|
|
||||||
if (key == 5) {
|
|
||||||
if (tz == 'L') {
|
|
||||||
tz = 'U';
|
|
||||||
} else {
|
|
||||||
tz = 'L';
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Keylock function
|
|
||||||
if(key == 11){ // Code for keylock
|
|
||||||
keylock = !keylock; // Toggle keylock
|
|
||||||
return 0; // Commit the key
|
return 0; // Commit the key
|
||||||
}
|
}
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayPage(PageData &pageData)
|
||||||
#ifdef BOARD_OBP60S3
|
{
|
||||||
// Clear optical warning
|
GwConfigHandler *config = commonData->config;
|
||||||
if (flashLED == "Limit Violation") {
|
GwLog *logger = commonData->logger;
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
static String svalue1old = "";
|
static String svalue1old = "";
|
||||||
static String unit1old = "";
|
static String unit1old = "";
|
||||||
@@ -119,10 +36,18 @@ public:
|
|||||||
static String svalue5old = "";
|
static String svalue5old = "";
|
||||||
static String svalue6old = "";
|
static String svalue6old = "";
|
||||||
|
|
||||||
double value1 = 0; // GPS time
|
double value1 = 0;
|
||||||
double value2 = 0; // GPS date FIXME date defined as uint32_t!
|
double value2 = 0;
|
||||||
double value3 = 0; // HDOP
|
double value3 = 0;
|
||||||
bool gpsvalid = false;
|
|
||||||
|
// Get config data
|
||||||
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
String stimezone = config->getString(config->timeZone);
|
||||||
|
double timezone = stimezone.toDouble();
|
||||||
|
|
||||||
// Get boat values for GPS time
|
// Get boat values for GPS time
|
||||||
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)
|
||||||
@@ -132,13 +57,13 @@ public:
|
|||||||
value1 = bvalue1->value; // Value as double in SI unit
|
value1 = bvalue1->value; // Value as double in SI unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
value1 = simtime++; // Simulation data for time value 11:36 in seconds
|
value1 = 38160; // Simulation data for time value 11:36 in seconds
|
||||||
} // Other simulation data see OBP60Formatter.cpp
|
} // Other simulation data see OBP60Formater.cpp
|
||||||
bool valid1 = bvalue1->valid; // Valid information
|
bool valid1 = bvalue1->valid; // Valid information
|
||||||
String svalue1 = commonData->fmt->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 = commonData->fmt->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
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,10 +73,10 @@ public:
|
|||||||
name2 = name2.substring(0, 6); // String length limit for value name
|
name2 = name2.substring(0, 6); // String length limit for value name
|
||||||
value2 = bvalue2->value; // Value as double in SI unit
|
value2 = bvalue2->value; // Value as double in SI unit
|
||||||
bool valid2 = bvalue2->valid; // Valid information
|
bool valid2 = bvalue2->valid; // Valid information
|
||||||
String svalue2 = commonData->fmt->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 = commonData->fmt->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
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,135 +86,93 @@ public:
|
|||||||
name3 = name3.substring(0, 6); // String length limit for value name
|
name3 = name3.substring(0, 6); // String length limit for value name
|
||||||
value3 = bvalue3->value; // Value as double in SI unit
|
value3 = bvalue3->value; // Value as double in SI unit
|
||||||
bool valid3 = bvalue3->valid; // Valid information
|
bool valid3 = bvalue3->valid; // Valid information
|
||||||
String svalue3 = commonData->fmt->formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue3 = formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit3 = commonData->fmt->formatValue(bvalue3, *commonData).unit; // Unit of value
|
String unit3 = formatValue(bvalue3, *commonData).unit; // Unit of value
|
||||||
if(valid3 == true){
|
if(valid3 == true){
|
||||||
svalue3old = svalue3; // Save old value
|
svalue3old = svalue3; // Save old value
|
||||||
unit3old = unit3; // Save old unit
|
unit3old = unit3; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// GPS date and time are valid and can be used
|
|
||||||
gpsvalid = (valid1 && valid2 && valid3);
|
|
||||||
|
|
||||||
// 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);
|
||||||
setFlashLED(false);
|
setFlashLED(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
if (bvalue1 == NULL) return;
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageClock, %s:%f, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageClock, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
time_t tv = mktime(&commonData->data.rtcTime) + timezone * 3600;
|
|
||||||
struct tm *local_tm = localtime(&tv);
|
|
||||||
|
|
||||||
// Show values GPS date
|
// Show values GPS date
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
if (holdvalues == false) {
|
if(holdvalues == false) getdisplay().print(svalue2); // Value
|
||||||
if (source == 'G') {
|
else getdisplay().print(svalue2old);
|
||||||
// GPS value
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->print(svalue2);
|
getdisplay().setCursor(10, 95);
|
||||||
} else if (commonData->data.rtcValid) {
|
getdisplay().print("Date"); // Name
|
||||||
// RTC value
|
|
||||||
if (tz == 'L') {
|
|
||||||
epd->print(formatDate(dateformat, local_tm->tm_year + 1900, local_tm->tm_mon + 1, local_tm->tm_mday));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
epd->print(formatDate(dateformat, commonData->data.rtcTime.tm_year + 1900, commonData->data.rtcTime.tm_mon + 1, commonData->data.rtcTime.tm_mday));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
epd->print(commonData->fmt->placeholder);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
epd->print(svalue2old);
|
|
||||||
}
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(10, 95);
|
|
||||||
epd->print("Date"); // Name
|
|
||||||
|
|
||||||
// Horizintal separator left
|
// Horizintal separator left
|
||||||
epd->fillRect(0, 149, 60, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 149, 60, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// Show values GPS time
|
// Show values GPS time
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(10, 250);
|
getdisplay().setCursor(10, 250);
|
||||||
if (holdvalues == false) {
|
if(holdvalues == false) getdisplay().print(svalue1); // Value
|
||||||
if (source == 'G') {
|
else getdisplay().print(svalue1old);
|
||||||
epd->print(svalue1); // Value
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
}
|
getdisplay().setCursor(10, 220);
|
||||||
else if (commonData->data.rtcValid) {
|
getdisplay().print("Time"); // Name
|
||||||
if (tz == 'L') {
|
|
||||||
epd->print(formatTime(fmtTime::MMHHSS, local_tm->tm_hour, local_tm->tm_min, local_tm->tm_sec));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
epd->print(formatTime(fmtTime::MMHHSS, commonData->data.rtcTime.tm_hour, commonData->data.rtcTime.tm_min, commonData->data.rtcTime.tm_sec));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
epd->print(commonData->fmt->placeholder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
epd->print(svalue1old);
|
|
||||||
}
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(10, 220);
|
|
||||||
epd->print("Time"); // Name
|
|
||||||
|
|
||||||
// Show values sunrise
|
// Show values sunrise
|
||||||
String sunrise = commonData->fmt->placeholder;
|
String sunrise = "---";
|
||||||
if (((source == 'G') and gpsvalid) or (homevalid and commonData->data.rtcValid)) {
|
if(valid1 == true && valid2 == true && valid3 == true){
|
||||||
sunrise = String(commonData->sundata.sunriseHour) + ":" + String(commonData->sundata.sunriseMinute + 100).substring(1);
|
sunrise = String(commonData->sundata.sunriseHour) + ":" + String(commonData->sundata.sunriseMinute + 100).substring(1);
|
||||||
svalue5old = sunrise;
|
svalue5old = sunrise;
|
||||||
} else if (simulation) {
|
|
||||||
sunrise = String("06:42");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(335, 65);
|
getdisplay().setCursor(335, 65);
|
||||||
if(holdvalues == false) epd->print(sunrise); // Value
|
if(holdvalues == false) getdisplay().print(sunrise); // Value
|
||||||
else epd->print(svalue5old);
|
else getdisplay().print(svalue5old);
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(335, 95);
|
getdisplay().setCursor(335, 95);
|
||||||
epd->print("SunR"); // Name
|
getdisplay().print("SunR"); // Name
|
||||||
|
|
||||||
// Horizintal separator right
|
// Horizintal separator right
|
||||||
epd->fillRect(340, 149, 80, 3, commonData->fgcolor);
|
getdisplay().fillRect(340, 149, 80, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// Show values sunset
|
// Show values sunset
|
||||||
String sunset = commonData->fmt->placeholder;
|
String sunset = "---";
|
||||||
if (((source == 'G') and gpsvalid) or (homevalid and commonData->data.rtcValid)) {
|
if(valid1 == true && valid2 == true && valid3 == true){
|
||||||
sunset = String(commonData->sundata.sunsetHour) + ":" + String(commonData->sundata.sunsetMinute + 100).substring(1);
|
sunset = String(commonData->sundata.sunsetHour) + ":" + String(commonData->sundata.sunsetMinute + 100).substring(1);
|
||||||
svalue6old = sunset;
|
svalue6old = sunset;
|
||||||
} else if (simulation) {
|
|
||||||
sunset = String("21:03");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(335, 250);
|
getdisplay().setCursor(335, 250);
|
||||||
if(holdvalues == false) epd->print(sunset); // Value
|
if(holdvalues == false) getdisplay().print(sunset); // Value
|
||||||
else epd->print(svalue6old);
|
else getdisplay().print(svalue6old);
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(335, 220);
|
getdisplay().setCursor(335, 220);
|
||||||
epd->print("SunS"); // Name
|
getdisplay().print("SunS"); // Name
|
||||||
|
|
||||||
//*******************************************************************************************
|
//*******************************************************************************************
|
||||||
|
|
||||||
// Draw clock
|
// Draw clock
|
||||||
int rInstrument = 110; // Radius of clock
|
int rInstrument = 110; // Radius of clock
|
||||||
float pi = 3.141592;
|
float pi = 3.141592;
|
||||||
|
|
||||||
epd->fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
||||||
epd->fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
||||||
|
|
||||||
for(int i=0; i<360; i=i+1)
|
for(int i=0; i<360; i=i+1)
|
||||||
{
|
{
|
||||||
@@ -317,11 +200,11 @@ public:
|
|||||||
// Print text centered on position x, y
|
// Print text centered on position x, y
|
||||||
int16_t x1, y1; // Return values of getTextBounds
|
int16_t x1, y1; // Return values of getTextBounds
|
||||||
uint16_t w, h; // Return values of getTextBounds
|
uint16_t w, h; // Return values of getTextBounds
|
||||||
epd->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
|
||||||
epd->setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw sub scale with dots
|
// Draw sub scale with dots
|
||||||
@@ -330,7 +213,7 @@ public:
|
|||||||
if(i % 6 == 0){
|
if(i % 6 == 0){
|
||||||
float x1c = 200 + rInstrument*sin(i/180.0*pi);
|
float x1c = 200 + rInstrument*sin(i/180.0*pi);
|
||||||
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
||||||
epd->fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
getdisplay().fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
||||||
sinx=sin(i/180.0*pi);
|
sinx=sin(i/180.0*pi);
|
||||||
cosx=cos(i/180.0*pi);
|
cosx=cos(i/180.0*pi);
|
||||||
}
|
}
|
||||||
@@ -342,65 +225,40 @@ public:
|
|||||||
float xx2 = +dx;
|
float xx2 = +dx;
|
||||||
float yy1 = -(rInstrument-10);
|
float yy1 = -(rInstrument-10);
|
||||||
float yy2 = -(rInstrument+10);
|
float yy2 = -(rInstrument+10);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),commonData->fgcolor);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),
|
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),
|
||||||
200+(int)(cosx*xx2-sinx*yy2),150+(int)(sinx*xx2+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*xx2-sinx*yy2),150+(int)(sinx*xx2+cosx*yy2),commonData->fgcolor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print Unit in clock
|
// Print Unit in clock
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(175, 110);
|
getdisplay().setCursor(175, 110);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(tz == 'L' ? "LOT" : "UTC");
|
getdisplay().print(unit2); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit2old); // date unit
|
getdisplay().print(unit2old); // Unit
|
||||||
}
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(185, 190);
|
|
||||||
if (source == 'G') {
|
|
||||||
epd->print("GPS");
|
|
||||||
} else {
|
|
||||||
epd->print("RTC");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clock values
|
// Clock values
|
||||||
double hour = 0;
|
double hour = 0;
|
||||||
double minute = 0;
|
double minute = 0;
|
||||||
if (source == 'R') {
|
value1 = value1 + int(timezone*3600);
|
||||||
if (tz == 'L') {
|
if (value1 > 86400) {value1 = value1 - 86400;}
|
||||||
time_t tv = mktime(&commonData->data.rtcTime) + timezone * 3600;
|
if (value1 < 0) {value1 = value1 + 86400;}
|
||||||
struct tm *local_tm = localtime(&tv);
|
hour = (value1 / 3600.0);
|
||||||
minute = local_tm->tm_min;
|
if(hour > 12) hour = hour - 12.0;
|
||||||
hour = local_tm->tm_hour;
|
// minute = (hour - int(hour)) * 3600.0 / 60.0; // Analog minute pointer smooth moving
|
||||||
} else {
|
minute = int((hour - int(hour)) * 3600.0 / 60.0); // Jumping minute pointer from minute to minute
|
||||||
minute = commonData->data.rtcTime.tm_min;
|
LOG_DEBUG(GwLog::DEBUG,"... PageClock, value1: %f hour: %f minute:%f", value1, hour, minute);
|
||||||
hour = commonData->data.rtcTime.tm_hour;
|
|
||||||
}
|
|
||||||
hour += minute / 60;
|
|
||||||
} else {
|
|
||||||
if (tz == 'L') {
|
|
||||||
value1 += timezone * 3600;
|
|
||||||
}
|
|
||||||
if (value1 > 86400) {value1 -= 86400;}
|
|
||||||
if (value1 < 0) {value1 += 86400;}
|
|
||||||
hour = (value1 / 3600.0);
|
|
||||||
// minute = (hour - int(hour)) * 3600.0 / 60.0; // Analog minute pointer smooth moving
|
|
||||||
minute = int((hour - int(hour)) * 3600.0 / 60.0); // Jumping minute pointer from minute to minute
|
|
||||||
}
|
|
||||||
if (hour > 12) {
|
|
||||||
hour -= 12.0;
|
|
||||||
}
|
|
||||||
logger->logDebug(GwLog::DEBUG, "... PageClock, value1: %f hour: %f minute:%f", value1, hour, minute);
|
|
||||||
|
|
||||||
// Draw hour pointer
|
// Draw hour pointer
|
||||||
float startwidth = 8; // Start width of pointer
|
float startwidth = 8; // Start width of pointer
|
||||||
if(valid1 == true || (source == 'R' && commonData->data.rtcValid) || holdvalues == true || simulation == true){
|
if(valid1 == true || holdvalues == true || simulation == true){
|
||||||
float sinx=sin(hour * 30.0 * pi / 180); // Hour
|
float sinx=sin(hour * 30.0 * pi / 180); // Hour
|
||||||
float cosx=cos(hour * 30.0 * pi / 180);
|
float cosx=cos(hour * 30.0 * pi / 180);
|
||||||
// Normal pointer
|
// Normal pointer
|
||||||
@@ -408,8 +266,8 @@ public:
|
|||||||
float xx1 = -startwidth;
|
float xx1 = -startwidth;
|
||||||
float xx2 = startwidth;
|
float xx2 = startwidth;
|
||||||
float yy1 = -startwidth;
|
float yy1 = -startwidth;
|
||||||
float yy2 = -(rInstrument * 0.5);
|
float yy2 = -(rInstrument * 0.5);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
||||||
// Inverted pointer
|
// Inverted pointer
|
||||||
@@ -419,14 +277,14 @@ public:
|
|||||||
float ix2 = -endwidth;
|
float ix2 = -endwidth;
|
||||||
float iy1 = -(rInstrument * 0.5);
|
float iy1 = -(rInstrument * 0.5);
|
||||||
float iy2 = -endwidth;
|
float iy2 = -endwidth;
|
||||||
epd->fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
getdisplay().fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
||||||
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
||||||
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw minute pointer
|
// Draw minute pointer
|
||||||
startwidth = 8; // Start width of pointer
|
startwidth = 8; // Start width of pointer
|
||||||
if(valid1 == true || (source == 'R' && commonData->data.rtcValid) || holdvalues == true || simulation == true){
|
if(valid1 == true || holdvalues == true || simulation == true){
|
||||||
float sinx=sin(minute * 6.0 * pi / 180); // Minute
|
float sinx=sin(minute * 6.0 * pi / 180); // Minute
|
||||||
float cosx=cos(minute * 6.0 * pi / 180);
|
float cosx=cos(minute * 6.0 * pi / 180);
|
||||||
// Normal pointer
|
// Normal pointer
|
||||||
@@ -434,8 +292,8 @@ public:
|
|||||||
float xx1 = -startwidth;
|
float xx1 = -startwidth;
|
||||||
float xx2 = startwidth;
|
float xx2 = startwidth;
|
||||||
float yy1 = -startwidth;
|
float yy1 = -startwidth;
|
||||||
float yy2 = -(rInstrument - 15);
|
float yy2 = -(rInstrument - 15);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
||||||
// Inverted pointer
|
// Inverted pointer
|
||||||
@@ -445,16 +303,18 @@ public:
|
|||||||
float ix2 = -endwidth;
|
float ix2 = -endwidth;
|
||||||
float iy1 = -(rInstrument - 15);
|
float iy1 = -(rInstrument - 15);
|
||||||
float iy2 = -endwidth;
|
float iy2 = -endwidth;
|
||||||
epd->fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
getdisplay().fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
||||||
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
||||||
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Center circle
|
// Center circle
|
||||||
epd->fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
||||||
epd->fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
||||||
|
|
||||||
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,255 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
|
||||||
#include "OBP60Extensions.h"
|
|
||||||
|
|
||||||
// these constants have to match the declaration below in :
|
|
||||||
// PageDescription registerPageCompass(
|
|
||||||
// {"COG","HDT", "HDM"}, // Bus values we need in the page
|
|
||||||
const int HowManyValues = 6;
|
|
||||||
|
|
||||||
const int AverageValues = 4;
|
|
||||||
|
|
||||||
const int ShowHDM = 0;
|
|
||||||
const int ShowHDT = 1;
|
|
||||||
const int ShowCOG = 2;
|
|
||||||
const int ShowSTW = 3;
|
|
||||||
const int ShowSOG = 4;
|
|
||||||
const int ShowDBS = 5;
|
|
||||||
|
|
||||||
const int Compass_X0 = 200; // center point of compass band
|
|
||||||
const int Compass_Y0 = 220; // position of compass lines
|
|
||||||
const int Compass_LineLength = 22; // length of compass lines
|
|
||||||
const float Compass_LineDelta = 8.0;// compass band: 1deg = 5 Pixels, 10deg = 50 Pixels
|
|
||||||
|
|
||||||
class PageCompass : public Page
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
int WhichDataCompass = ShowHDM;
|
|
||||||
int WhichDataDisplay = ShowHDM;
|
|
||||||
|
|
||||||
public:
|
|
||||||
PageCompass(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageCompass");
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupKeys(){
|
|
||||||
Page::setupKeys();
|
|
||||||
commonData->keydata[0].label = "CMP";
|
|
||||||
commonData->keydata[1].label = "SRC";
|
|
||||||
}
|
|
||||||
|
|
||||||
int handleKey(int key){
|
|
||||||
// Code for keylock
|
|
||||||
if (key == 1) {
|
|
||||||
WhichDataCompass += 1;
|
|
||||||
if ( WhichDataCompass > ShowCOG)
|
|
||||||
WhichDataCompass = ShowHDM;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 2) {
|
|
||||||
WhichDataDisplay += 1;
|
|
||||||
if (WhichDataDisplay > ShowDBS)
|
|
||||||
WhichDataDisplay = ShowHDM;
|
|
||||||
}
|
|
||||||
if (key == 11) {
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0; // Commit the key
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// Clear optical warning
|
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
// Old values for hold function
|
|
||||||
static String OldDataText[HowManyValues] = {"", "", "","", "", ""};
|
|
||||||
static String OldDataUnits[HowManyValues] = {"", "", "","", "", ""};
|
|
||||||
|
|
||||||
GwApi::BoatValue *bvalue;
|
|
||||||
String DataName[HowManyValues];
|
|
||||||
double DataValue[HowManyValues];
|
|
||||||
bool DataValid[HowManyValues];
|
|
||||||
String DataText[HowManyValues];
|
|
||||||
String DataUnits[HowManyValues];
|
|
||||||
String DataFormat[HowManyValues];
|
|
||||||
FormattedData TheFormattedData;
|
|
||||||
|
|
||||||
for (int i = 0; i < HowManyValues; i++){
|
|
||||||
bvalue = pageData.values[i];
|
|
||||||
TheFormattedData = commonData->fmt->formatValue(bvalue, *commonData);
|
|
||||||
DataName[i] = xdrDelete(bvalue->getName());
|
|
||||||
DataName[i] = DataName[i].substring(0, 6); // String length limit for value name
|
|
||||||
DataUnits[i] = commonData->fmt->formatValue(bvalue, *commonData).unit;
|
|
||||||
DataText[i] = TheFormattedData.svalue; // Formatted value as string including unit conversion and switching decimal places
|
|
||||||
DataValue[i] = TheFormattedData.value; // Value as double in SI unit
|
|
||||||
DataValid[i] = bvalue->valid;
|
|
||||||
DataFormat[i] = bvalue->getFormat(); // Unit of value
|
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageCompass: %d %s %f %s %s", i, DataName[i], DataValue[i], DataFormat[i], DataText[i] );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bvalue == NULL) return PAGE_OK; // WTF why this statement?
|
|
||||||
|
|
||||||
//***********************************************************
|
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
|
|
||||||
// Horizontal line 2 pix top & bottom
|
|
||||||
// Print data on top half
|
|
||||||
epd->fillRect(0, 130, 400, 2, commonData->fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
|
||||||
epd->setCursor(10, 70);
|
|
||||||
epd->print(DataName[WhichDataDisplay]); // Page name
|
|
||||||
// Show unit
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(10, 120);
|
|
||||||
epd->print(DataUnits[WhichDataDisplay]);
|
|
||||||
epd->setCursor(190, 120);
|
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic42pt7b);
|
|
||||||
|
|
||||||
if(holdvalues == false){
|
|
||||||
epd->print(DataText[WhichDataDisplay]); // Real value as formated string
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
epd->print(OldDataText[WhichDataDisplay]); // Old value as formated string
|
|
||||||
}
|
|
||||||
if(DataValid[WhichDataDisplay] == true){
|
|
||||||
OldDataText[WhichDataDisplay] = DataText[WhichDataDisplay]; // Save the old value
|
|
||||||
OldDataUnits[WhichDataDisplay] = DataUnits[WhichDataDisplay]; // Save the old unit
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now draw compass band
|
|
||||||
// Get the data
|
|
||||||
double TheAngle = DataValue[WhichDataCompass];
|
|
||||||
static double AvgAngle = 0;
|
|
||||||
AvgAngle = ( AvgAngle * AverageValues + TheAngle ) / (AverageValues + 1 );
|
|
||||||
|
|
||||||
int TheTrend = round( ( TheAngle - AvgAngle) * 180.0 / M_PI );
|
|
||||||
|
|
||||||
static const int bsize = 30;
|
|
||||||
char buffer[bsize+1];
|
|
||||||
buffer[0]=0;
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
|
||||||
epd->setCursor(10, Compass_Y0-60);
|
|
||||||
epd->print(DataName[WhichDataCompass]); // Page name
|
|
||||||
|
|
||||||
|
|
||||||
// Draw compass base line and pointer
|
|
||||||
epd->fillRect(0, Compass_Y0, 400, 3, commonData->fgcolor);
|
|
||||||
epd->fillTriangle(Compass_X0,Compass_Y0-40,Compass_X0-10,Compass_Y0-80,Compass_X0+10,Compass_Y0-80,commonData->fgcolor);
|
|
||||||
// Draw trendlines
|
|
||||||
for ( int i = 1; i < abs(TheTrend) / 2; i++){
|
|
||||||
int x1;
|
|
||||||
if ( TheTrend < 0 )
|
|
||||||
x1 = Compass_X0 + 20 * i;
|
|
||||||
else
|
|
||||||
x1 = Compass_X0 - 20 * ( i + 1 );
|
|
||||||
|
|
||||||
epd->fillRect(x1, Compass_Y0 -55, 10, 6, commonData->fgcolor);
|
|
||||||
}
|
|
||||||
// Central line + satellite lines
|
|
||||||
double NextSector = round(TheAngle / ( M_PI / 9 )) * ( M_PI / 9 ); // Get the next 20degree value
|
|
||||||
double Offset = - ( NextSector - TheAngle); // Offest of the center line compared to TheAngle in Radian
|
|
||||||
|
|
||||||
int Delta_X = int ( Offset * 180.0 / M_PI * Compass_LineDelta );
|
|
||||||
for ( int i = 0; i <=4; i++ ){
|
|
||||||
int x0;
|
|
||||||
x0 = Compass_X0 + Delta_X + 2 * i * 5 * Compass_LineDelta;
|
|
||||||
epd->fillRect(x0-2, Compass_Y0 - 2 * Compass_LineLength, 5, 2 * Compass_LineLength, commonData->fgcolor);
|
|
||||||
x0 = Compass_X0 + Delta_X + ( 2 * i + 1 ) * 5 * Compass_LineDelta;
|
|
||||||
epd->fillRect(x0-1, Compass_Y0 - Compass_LineLength, 3, Compass_LineLength, commonData->fgcolor);
|
|
||||||
|
|
||||||
x0 = Compass_X0 + Delta_X - 2 * i * 5 * Compass_LineDelta;
|
|
||||||
epd->fillRect(x0-2, Compass_Y0 - 2 * Compass_LineLength, 5, 2 * Compass_LineLength, commonData->fgcolor);
|
|
||||||
x0 = Compass_X0 + Delta_X - ( 2 * i + 1 ) * 5 * Compass_LineDelta;
|
|
||||||
epd->fillRect(x0-1, Compass_Y0 - Compass_LineLength, 3, Compass_LineLength, commonData->fgcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
epd->fillRect(0, Compass_Y0, 400, 3, commonData->fgcolor);
|
|
||||||
// Add the numbers to the compass band
|
|
||||||
int x0;
|
|
||||||
float AngleToDisplay = NextSector * 180.0 / M_PI;
|
|
||||||
|
|
||||||
x0 = Compass_X0 + Delta_X;
|
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic16pt7b);
|
|
||||||
|
|
||||||
do {
|
|
||||||
epd->setCursor(x0 - 40, Compass_Y0 + 40);
|
|
||||||
snprintf(buffer,bsize,"%03.0f", AngleToDisplay);
|
|
||||||
epd->print(buffer);
|
|
||||||
AngleToDisplay += 20;
|
|
||||||
if ( AngleToDisplay >= 360.0 )
|
|
||||||
AngleToDisplay -= 360.0;
|
|
||||||
x0 -= 4 * 5 * Compass_LineDelta;
|
|
||||||
} while ( x0 >= 0 - 60 );
|
|
||||||
|
|
||||||
AngleToDisplay = NextSector * 180.0 / M_PI - 20;
|
|
||||||
if ( AngleToDisplay < 0 )
|
|
||||||
AngleToDisplay += 360.0;
|
|
||||||
|
|
||||||
x0 = Compass_X0 + Delta_X + 4 * 5 * Compass_LineDelta;
|
|
||||||
do {
|
|
||||||
epd->setCursor(x0 - 40, Compass_Y0 + 40);
|
|
||||||
snprintf(buffer,bsize,"%03.0f", AngleToDisplay);
|
|
||||||
// Quick and dirty way to prevent wrapping text in next line
|
|
||||||
if ( ( x0 - 40 ) > 380 )
|
|
||||||
buffer[0] = 0;
|
|
||||||
else if ( ( x0 - 40 ) > 355 )
|
|
||||||
buffer[1] = 0;
|
|
||||||
else if ( ( x0 - 40 ) > 325 )
|
|
||||||
buffer[2] = 0;
|
|
||||||
|
|
||||||
epd->print(buffer);
|
|
||||||
|
|
||||||
AngleToDisplay -= 20;
|
|
||||||
if ( AngleToDisplay < 0 )
|
|
||||||
AngleToDisplay += 360.0;
|
|
||||||
x0 += 4 * 5 * Compass_LineDelta;
|
|
||||||
} while (x0 < ( 400 - 20 -40 ) );
|
|
||||||
|
|
||||||
// static int x_test = 320;
|
|
||||||
// x_test += 2;
|
|
||||||
|
|
||||||
// snprintf(buffer,bsize,"%03d", x_test);
|
|
||||||
// epd->setCursor(x_test, Compass_Y0 - 60);
|
|
||||||
// epd->print(buffer);
|
|
||||||
// if ( x_test > 390)
|
|
||||||
// x_test = 320;
|
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
static Page *createPage(CommonData &common){
|
|
||||||
return new PageCompass(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 registerPageCompass(
|
|
||||||
"Compass", // Page name
|
|
||||||
createPage, // Action
|
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
|
||||||
{"HDM","HDT", "COG", "STW", "SOG", "DBS"}, // Bus values we need in the page
|
|
||||||
true // Show display header on/off
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,24 +1,17 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
class PageDST810 : public Page
|
class PageDST810 : public Page
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
String lengthformat;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageDST810(CommonData &common) : Page(common)
|
PageDST810(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageDST810");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageDST810");
|
||||||
|
|
||||||
// Get config data
|
|
||||||
lengthformat = config->getString(config->lengthFormat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleKey(int key) {
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -27,7 +20,9 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
|
GwConfigHandler *config = commonData->config;
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
// Old values for hold function
|
// Old values for hold function
|
||||||
static String svalue1old = "";
|
static String svalue1old = "";
|
||||||
@@ -39,14 +34,21 @@ public:
|
|||||||
static String svalue4old = "";
|
static String svalue4old = "";
|
||||||
static String unit4old = "";
|
static String unit4old = "";
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
// bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
// Get boat values #1
|
// Get boat values #1
|
||||||
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
|
||||||
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
|
||||||
String svalue1 = commonData->fmt->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 = commonData->fmt->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 (only one value by PageOneValue)
|
||||||
@@ -54,8 +56,8 @@ public:
|
|||||||
name2 = name2.substring(0, 6); // String length limit for value name
|
name2 = name2.substring(0, 6); // String length limit for value name
|
||||||
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
|
||||||
String svalue2 = commonData->fmt->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 = commonData->fmt->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]; // Second element in list (only one value by PageOneValue)
|
||||||
@@ -63,8 +65,8 @@ public:
|
|||||||
name3 = name3.substring(0, 6); // String length limit for value name
|
name3 = name3.substring(0, 6); // String length limit for value name
|
||||||
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
|
||||||
String svalue3 = commonData->fmt->formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue3 = formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit3 = commonData->fmt->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]; // Second element in list (only one value by PageOneValue)
|
||||||
@@ -72,8 +74,8 @@ public:
|
|||||||
name4 = name4.substring(0, 6); // String length limit for value name
|
name4 = name4.substring(0, 6); // String length limit for value name
|
||||||
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
|
||||||
String svalue4 = commonData->fmt->formatValue(bvalue4, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue4 = formatValue(bvalue4, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit4 = commonData->fmt->formatValue(bvalue4, *commonData).unit; // Unit of value
|
String unit4 = formatValue(bvalue4, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Optical warning by limit violation (unused)
|
// Optical warning by limit violation (unused)
|
||||||
if(String(flashLED) == "Limit Violation"){
|
if(String(flashLED) == "Limit Violation"){
|
||||||
@@ -82,44 +84,44 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
if (bvalue1 == NULL) return;
|
||||||
logger->logDebug(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
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 55);
|
getdisplay().setCursor(20, 55);
|
||||||
epd->print("Depth"); // Page name
|
getdisplay().print("Depth"); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit1old);
|
getdisplay().print(unit1old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set font
|
// Set font
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
epd->setCursor(180, 90);
|
getdisplay().setCursor(180, 90);
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue1); // Real value as formated string
|
getdisplay().print(svalue1); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue1old); // Old value as formated string
|
getdisplay().print(svalue1old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid1 == true){
|
if(valid1 == true){
|
||||||
svalue1old = svalue1; // Save the old value
|
svalue1old = svalue1; // Save the old value
|
||||||
@@ -129,35 +131,35 @@ public:
|
|||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 105, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 105, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 145);
|
getdisplay().setCursor(20, 145);
|
||||||
epd->print("Speed"); // Page name
|
getdisplay().print("Speed"); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit2old);
|
getdisplay().print(unit2old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setfont
|
// Setfont
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
epd->setCursor(180, 180);
|
getdisplay().setCursor(180, 180);
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue2); // Real value as formated string
|
getdisplay().print(svalue2); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue2old); // Old value as formated string
|
getdisplay().print(svalue2old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid2 == true){
|
if(valid2 == true){
|
||||||
svalue2old = svalue2; // Save the old value
|
svalue2old = svalue2; // Save the old value
|
||||||
@@ -167,35 +169,35 @@ public:
|
|||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 195, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 195, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 220);
|
getdisplay().setCursor(20, 220);
|
||||||
epd->print("Log"); // Page name
|
getdisplay().print("Log"); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(20, 240);
|
getdisplay().setCursor(20, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit3old);
|
getdisplay().print(unit3old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set font
|
// Set font
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(80, 270);
|
getdisplay().setCursor(80, 270);
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue3); // Real value as formated string
|
getdisplay().print(svalue3); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue3old); // Old value as formated string
|
getdisplay().print(svalue3old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid3 == true){
|
if(valid3 == true){
|
||||||
svalue3old = svalue3; // Save the old value
|
svalue3old = svalue3; // Save the old value
|
||||||
@@ -205,42 +207,44 @@ public:
|
|||||||
// ############### Vertical Line ################
|
// ############### Vertical Line ################
|
||||||
|
|
||||||
// Vertical line 3 pix
|
// Vertical line 3 pix
|
||||||
epd->fillRect(200, 195, 3, 75, commonData->fgcolor);
|
getdisplay().fillRect(200, 195, 3, 75, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 4 ################
|
// ############### Value 4 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(220, 220);
|
getdisplay().setCursor(220, 220);
|
||||||
epd->print("Temp"); // Page name
|
getdisplay().print("Temp"); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(220, 240);
|
getdisplay().setCursor(220, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit4); // Unit
|
getdisplay().print(unit4); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit4old);
|
getdisplay().print(unit4old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set font
|
// Set font
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(280, 270);
|
getdisplay().setCursor(280, 270);
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue4); // Real value as formated string
|
getdisplay().print(svalue4); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue4old); // Old value as formated string
|
getdisplay().print(svalue4old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid4 == true){
|
if(valid4 == true){
|
||||||
svalue4old = svalue4; // Save the old value
|
svalue4old = svalue4; // Save the old value
|
||||||
unit4old = unit4; // Save the old unit
|
unit4old = unit4; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,145 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
|
||||||
#include "OBP60Extensions.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
Electric propulsion
|
|
||||||
|
|
||||||
- Current, voltage, power
|
|
||||||
- 12, 24, 48 etc. Voltage
|
|
||||||
- rpm
|
|
||||||
- throttle position
|
|
||||||
- controller state
|
|
||||||
- error codes
|
|
||||||
- temperature engine, controller, batteries
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
class PageEPropulsion : public Page
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
char mode = 'N'; // (N)ormal, (C)onfig
|
|
||||||
|
|
||||||
void displayModeNormal(PageData &pageData) {
|
|
||||||
|
|
||||||
// TBD Boatvalues: ...
|
|
||||||
|
|
||||||
logger->logDebug(GwLog::DEBUG, "Drawing at PageEPropulsion");
|
|
||||||
|
|
||||||
// Title and corner value headings
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("Electric propulsion");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeConfig() {
|
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("EPropulsion configuration");
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
// TODO menu
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
PageEPropulsion(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG,"Instantiate PageEPropulsion");
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupKeys(){
|
|
||||||
Page::setupKeys();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
int handleKey(int key){
|
|
||||||
if (key == 1) { // Switch between normal and config mode
|
|
||||||
if (mode == 'N') {
|
|
||||||
mode = 'C';
|
|
||||||
} else {
|
|
||||||
mode = 'N';
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 11) { // Code for keylock
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
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';
|
|
||||||
commonData->keydata[1].label = "ALARM";
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 11) { // Code for keylock
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void displayNew(PageData &pageData){
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// Clear optical warning
|
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData){
|
|
||||||
|
|
||||||
// Logging boat values
|
|
||||||
logger->logDebug(GwLog::LOG,"Drawing at PageEPropulsion; Mode=%c", mode);
|
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height());
|
|
||||||
|
|
||||||
if (mode == 'N') {
|
|
||||||
displayModeNormal(pageData);
|
|
||||||
} else if (mode == 'C') {
|
|
||||||
displayModeConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
static Page *createPage(CommonData &common){
|
|
||||||
return new PageEPropulsion(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 registerPageEPropulsion(
|
|
||||||
"EPropulsion", // Page name
|
|
||||||
createPage, // Action
|
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
|
||||||
{}, // Names of bus values undepends on selection in Web configuration (refer GwBoatData.h)
|
|
||||||
true // Show display header on/off
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
@@ -67,22 +66,17 @@ static unsigned char fish_bits[] = {
|
|||||||
|
|
||||||
class PageFluid : public Page
|
class PageFluid : public Page
|
||||||
{
|
{
|
||||||
private:
|
bool holdvalues = false;
|
||||||
double simgoto;
|
|
||||||
double simval;
|
|
||||||
double simstep;
|
|
||||||
int fluidtype;
|
int fluidtype;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageFluid(CommonData &common) : Page(common)
|
PageFluid(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageFluid");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageFluid");
|
||||||
simval = double(random(0, 100));
|
holdvalues = common.config->getBool(common.config->holdvalues);
|
||||||
simgoto = double(random(0, 100));
|
|
||||||
simstep = (simgoto - simval) / 20.0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleKey(int key) {
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -91,57 +85,52 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayNew(PageData &pageData){
|
||||||
fluidtype = config->getInt("page" + String(pageData.pageNumber) + "fluid", 0);
|
fluidtype = commonData->config->getInt("page" + String(pageData.pageNumber) + "fluid", 0);
|
||||||
logger->logDebug(GwLog::LOG, "New PageFluid: fluidtype=%d", fluidtype);
|
commonData->logger->logDebug(GwLog::LOG,"New PageFluid: fluidtype=%d", fluidtype);
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// Clear optical warning
|
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
|
GwConfigHandler *config = commonData->config;
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
// Old values for hold function
|
// Old values for hold function
|
||||||
static double value1old;
|
static double value1old;
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
GwApi::BoatValue *bvalue1 = pageData.values[0];
|
GwApi::BoatValue *bvalue1 = pageData.values[0];
|
||||||
String name1 = bvalue1->getName();
|
String name1 = bvalue1->getName();
|
||||||
double fluidlevel = bvalue1->value;
|
if (holdvalues and bvalue1->valid) {
|
||||||
if (!simulation) {
|
value1old = bvalue1->value;
|
||||||
if (holdvalues and bvalue1->valid) {
|
|
||||||
value1old = bvalue1->value;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fluidlevel = simval;
|
|
||||||
simval += simstep;
|
|
||||||
if ((simgoto - simval) < 1.5 * simstep) {
|
|
||||||
simgoto = double(random(0, 100));
|
|
||||||
simstep = (simgoto - simval) / 20.0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageFluid: value=%f", bvalue1->value);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageFluid: value=%f", bvalue1->value);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height());
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height());
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// descriptions
|
// descriptions
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 60);
|
getdisplay().setCursor(20, 60);
|
||||||
epd->print("Fluid");
|
getdisplay().print("Fluid");
|
||||||
|
|
||||||
epd->setCursor(300, 60);
|
getdisplay().setCursor(300, 60);
|
||||||
epd->print(xdrDelete(name1).substring(0, 6));
|
getdisplay().print(xdrDelete(name1).substring(0, 6));
|
||||||
|
|
||||||
// analog instrument
|
// analog instrument
|
||||||
// scale from -120 to 120
|
// scale from -120 to 120
|
||||||
@@ -151,16 +140,16 @@ public:
|
|||||||
uint8_t r = 110;
|
uint8_t r = 110;
|
||||||
|
|
||||||
// circular frame
|
// circular frame
|
||||||
epd->drawCircle(c.x, c.y, r+5, commonData->fgcolor);
|
getdisplay().drawCircle(c.x, c.y, r+5, commonData->fgcolor);
|
||||||
epd->fillCircle(c.x, c.y, r+2, commonData->fgcolor);
|
getdisplay().fillCircle(c.x, c.y, r+2, commonData->fgcolor);
|
||||||
epd->fillCircle(c.x, c.y, r-1, commonData->bgcolor);
|
getdisplay().fillCircle(c.x, c.y, r-1, commonData->bgcolor);
|
||||||
// center of pointer as dot
|
// center of pointer as dot
|
||||||
epd->fillCircle(c.x, c.y, 8, commonData->fgcolor);
|
getdisplay().fillCircle(c.x, c.y, 8, commonData->fgcolor);
|
||||||
|
|
||||||
// value down centered
|
// value down centered
|
||||||
char buffer[6];
|
char buffer[6];
|
||||||
if (bvalue1->valid or simulation) {
|
if (bvalue1->valid) {
|
||||||
snprintf(buffer, 6, "%3.0f%%", fluidlevel);
|
snprintf(buffer, 6, "%3.0f%%", bvalue1->value);
|
||||||
} else {
|
} else {
|
||||||
strcpy(buffer, "---");
|
strcpy(buffer, "---");
|
||||||
}
|
}
|
||||||
@@ -169,32 +158,32 @@ public:
|
|||||||
// draw symbol (as bitmap)
|
// draw symbol (as bitmap)
|
||||||
switch (fluidtype) {
|
switch (fluidtype) {
|
||||||
case 0:
|
case 0:
|
||||||
epd->drawXBitmap(c.x-8, c.y-50, fuel_bits, fuel_width, fuel_height, commonData->fgcolor);
|
getdisplay().drawXBitmap(c.x-8, c.y-50, fuel_bits, fuel_width, fuel_height, commonData->fgcolor);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
epd->drawXBitmap(c.x-8, c.y-50, water_bits, water_width, water_height, commonData->fgcolor);
|
getdisplay().drawXBitmap(c.x-8, c.y-50, water_bits, water_width, water_height, commonData->fgcolor);
|
||||||
break;
|
break;
|
||||||
case 2: // gray water no symbol yet
|
case 2: // gray water no symbol yet
|
||||||
// epd->drawXBitmap(c.x-8, c.y-50, gray_bits, gray_width, gray_height, commonData->fgcolor);
|
// getdisplay().drawXBitmap(c.x-8, c.y-50, gray_bits, gray_width, gray_height, commonData->fgcolor);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
epd->drawXBitmap(c.x-8, c.y-50, fish_bits, fish_width, fish_height, commonData->fgcolor);
|
getdisplay().drawXBitmap(c.x-8, c.y-50, fish_bits, fish_width, fish_height, commonData->fgcolor);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
epd->drawXBitmap(c.x-8, c.y-50, oil_bits, oil_width, oil_height, commonData->fgcolor);
|
getdisplay().drawXBitmap(c.x-8, c.y-50, oil_bits, oil_width, oil_height, commonData->fgcolor);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
epd->drawXBitmap(c.x-8, c.y-50, waste_bits, waste_width, waste_height, commonData->fgcolor);
|
getdisplay().drawXBitmap(c.x-8, c.y-50, waste_bits, waste_width, waste_height, commonData->fgcolor);
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
epd->drawXBitmap(c.x-8, c.y-50, gasoline_bits, gasoline_width, gasoline_height, commonData->fgcolor);
|
getdisplay().drawXBitmap(c.x-8, c.y-50, gasoline_bits, gasoline_width, gasoline_height, commonData->fgcolor);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Point p, pr;
|
Point p, pr;
|
||||||
|
|
||||||
// scale texts
|
// scale texts
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
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);
|
||||||
@@ -203,7 +192,7 @@ public:
|
|||||||
drawTextCenter(pr.x, pr.y, "3/4");
|
drawTextCenter(pr.x, pr.y, "3/4");
|
||||||
|
|
||||||
// empty and full
|
// empty and full
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
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);
|
||||||
@@ -229,23 +218,25 @@ public:
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
p = rotatePoint(c, {c.x, c.y - r + 10}, angle);
|
p = rotatePoint(c, {c.x, c.y - r + 10}, angle);
|
||||||
epd->fillCircle(p.x, p.y, 3, commonData->fgcolor);
|
getdisplay().fillCircle(p.x, p.y, 3, commonData->fgcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// pointer
|
// pointer
|
||||||
if (bvalue1->valid or simulation) {
|
if (bvalue1->valid) {
|
||||||
pts = {
|
pts = {
|
||||||
{c.x - 1, c.y - (r - 20)},
|
{c.x - 1, c.y - (r - 20)},
|
||||||
{c.x + 1, c.y - (r - 20)},
|
{c.x + 1, c.y - (r - 20)},
|
||||||
{c.x + 6, c.y + 15},
|
{c.x + 6, c.y + 15},
|
||||||
{c.x - 6, c.y + 15}
|
{c.x - 6, c.y + 15}
|
||||||
};
|
};
|
||||||
fillPoly4(rotatePoints(c, pts, -120 + fluidlevel * 2.4), commonData->fgcolor);
|
fillPoly4(rotatePoints(c, pts, -120 + bvalue1->value * 2.4), commonData->fgcolor);
|
||||||
// Pointer axis is white
|
// Pointer axis is white
|
||||||
epd->fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +1,17 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
#include "BoatDataCalibration.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class PageFourValues : public Page
|
class PageFourValues : public Page
|
||||||
{
|
{
|
||||||
private:
|
public:
|
||||||
String lengthformat;
|
PageFourValues(CommonData &common){
|
||||||
|
commonData = &common;
|
||||||
public:
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageFourValues");
|
||||||
PageFourValues(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageFourValues");
|
|
||||||
|
|
||||||
// Get config data
|
|
||||||
lengthformat = config->getString(config->lengthFormat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleKey(int key){
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -31,17 +20,9 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
#ifdef BOARD_OBP60S3
|
GwConfigHandler *config = commonData->config;
|
||||||
// Clear optical warning
|
GwLog *logger = commonData->logger;
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData){
|
|
||||||
|
|
||||||
// Old values for hold function
|
// Old values for hold function
|
||||||
static String svalue1old = "";
|
static String svalue1old = "";
|
||||||
@@ -52,104 +33,105 @@ public:
|
|||||||
static String unit3old = "";
|
static String unit3old = "";
|
||||||
static String svalue4old = "";
|
static String svalue4old = "";
|
||||||
static String unit4old = "";
|
static String unit4old = "";
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
// bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
// Get boat values #1
|
// Get boat values #1
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue1 = commonData->fmt->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 = commonData->fmt->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
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list (only one value by PageOneValue)
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue2 = commonData->fmt->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 = commonData->fmt->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]; // Third element in list
|
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue)
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue3 = commonData->fmt->formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue3 = formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit3 = commonData->fmt->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]; // Fourth element in list
|
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Second element in list (only one value by PageOneValue)
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue4, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue4 = commonData->fmt->formatValue(bvalue4, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue4 = formatValue(bvalue4, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit4 = commonData->fmt->formatValue(bvalue4, *commonData).unit; // Unit of value
|
String unit4 = formatValue(bvalue4, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
if (bvalue1 == NULL) return;
|
||||||
logger->logDebug(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
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->setCursor(20, 45);
|
getdisplay().setCursor(20, 45);
|
||||||
epd->print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(20, 65);
|
getdisplay().setCursor(20, 65);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit1old);
|
getdisplay().print(unit1old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(120, 55);
|
getdisplay().setCursor(120, 55);
|
||||||
}
|
}
|
||||||
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(150, 58);
|
getdisplay().setCursor(150, 58);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(180, 65);
|
getdisplay().setCursor(180, 65);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue1); // Real value as formated string
|
getdisplay().print(svalue1); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue1old); // Old value as formated string
|
getdisplay().print(svalue1old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid1 == true){
|
if(valid1 == true){
|
||||||
svalue1old = svalue1; // Save the old value
|
svalue1old = svalue1; // Save the old value
|
||||||
@@ -159,45 +141,45 @@ public:
|
|||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 80, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 80, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->setCursor(20, 113);
|
getdisplay().setCursor(20, 113);
|
||||||
epd->print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(20, 133);
|
getdisplay().setCursor(20, 133);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit2old);
|
getdisplay().print(unit2old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(120, 123);
|
getdisplay().setCursor(120, 123);
|
||||||
}
|
}
|
||||||
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(150, 123);
|
getdisplay().setCursor(150, 123);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(180, 133);
|
getdisplay().setCursor(180, 133);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue2); // Real value as formated string
|
getdisplay().print(svalue2); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue2old); // Old value as formated string
|
getdisplay().print(svalue2old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid2 == true){
|
if(valid2 == true){
|
||||||
svalue2old = svalue2; // Save the old value
|
svalue2old = svalue2; // Save the old value
|
||||||
@@ -207,45 +189,45 @@ public:
|
|||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 146, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 146, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->setCursor(20, 181);
|
getdisplay().setCursor(20, 181);
|
||||||
epd->print(name3); // Page name
|
getdisplay().print(name3); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(20, 201);
|
getdisplay().setCursor(20, 201);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit3old);
|
getdisplay().print(unit3old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(120, 191);
|
getdisplay().setCursor(120, 191);
|
||||||
}
|
}
|
||||||
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(150, 191);
|
getdisplay().setCursor(150, 191);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(180, 201);
|
getdisplay().setCursor(180, 201);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue3); // Real value as formated string
|
getdisplay().print(svalue3); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue3old); // Old value as formated string
|
getdisplay().print(svalue3old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid3 == true){
|
if(valid3 == true){
|
||||||
svalue3old = svalue3; // Save the old value
|
svalue3old = svalue3; // Save the old value
|
||||||
@@ -255,58 +237,55 @@ public:
|
|||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 214, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 214, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 4 ################
|
// ############### Value 4 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->setCursor(20, 249);
|
getdisplay().setCursor(20, 249);
|
||||||
epd->print(name4); // Page name
|
getdisplay().print(name4); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(20, 269);
|
getdisplay().setCursor(20, 269);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit4); // Unit
|
getdisplay().print(unit4); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit4old);
|
getdisplay().print(unit4old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(120, 259);
|
getdisplay().setCursor(120, 259);
|
||||||
}
|
}
|
||||||
else if(bvalue4->getFormat() == "formatTime" || bvalue4->getFormat() == "formatDate"){
|
else if(bvalue4->getFormat() == "formatTime" || bvalue4->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(150, 259);
|
getdisplay().setCursor(150, 259);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(180, 269);
|
getdisplay().setCursor(180, 269);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue4); // Real value as formated string
|
getdisplay().print(svalue4); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue4old); // Old value as formated string
|
getdisplay().print(svalue4old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid4 == true){
|
if(valid4 == true){
|
||||||
svalue4old = svalue4; // Save the old value
|
svalue4old = svalue4; // Save the old value
|
||||||
unit4old = unit4; // Save the old unit
|
unit4old = unit4; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void leavePage(PageData &pageData) {
|
|
||||||
logger->logDebug(GwLog::LOG, "Leaving PageFourvalues");
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static Page *createPage(CommonData &common){
|
static Page *createPage(CommonData &common){
|
||||||
@@ -319,7 +298,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
|
||||||
|
|||||||
@@ -1,25 +1,17 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
#include "BoatDataCalibration.h"
|
|
||||||
|
|
||||||
class PageFourValues2 : public Page
|
class PageFourValues2 : public Page
|
||||||
{
|
{
|
||||||
private:
|
public:
|
||||||
String lengthformat;
|
PageFourValues2(CommonData &common){
|
||||||
|
commonData = &common;
|
||||||
public:
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageFourValues2");
|
||||||
PageFourValues2(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageFourValues2");
|
|
||||||
|
|
||||||
// Get config data
|
|
||||||
lengthformat = config->getString(config->lengthFormat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleKey(int key) {
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock; // Toggle keylock
|
commonData->keylock = !commonData->keylock; // Toggle keylock
|
||||||
@@ -28,17 +20,9 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
#ifdef BOARD_OBP60S3
|
GwConfigHandler *config = commonData->config;
|
||||||
// Clear optical warning
|
GwLog *logger = commonData->logger;
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
// Old values for hold function
|
// Old values for hold function
|
||||||
static String svalue1old = "";
|
static String svalue1old = "";
|
||||||
@@ -49,104 +33,105 @@ public:
|
|||||||
static String unit3old = "";
|
static String unit3old = "";
|
||||||
static String svalue4old = "";
|
static String svalue4old = "";
|
||||||
static String unit4old = "";
|
static String unit4old = "";
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
// bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
// Get boat values #1
|
// Get boat values #1
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue1 = commonData->fmt->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 = commonData->fmt->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 (only one value by PageOneValue)
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue2 = commonData->fmt->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 = commonData->fmt->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]; // Second element in list (only one value by PageOneValue)
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue3 = commonData->fmt->formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue3 = formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit3 = commonData->fmt->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]; // Second element in list (only one value by PageOneValue)
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue4, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue4 = commonData->fmt->formatValue(bvalue4, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue4 = formatValue(bvalue4, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit4 = commonData->fmt->formatValue(bvalue4, *commonData).unit; // Unit of value
|
String unit4 = formatValue(bvalue4, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
if (bvalue1 == NULL) return;
|
||||||
logger->logDebug(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
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 55);
|
getdisplay().setCursor(20, 55);
|
||||||
epd->print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit1old);
|
getdisplay().print(unit1old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(100, 90);
|
getdisplay().setCursor(100, 90);
|
||||||
}
|
}
|
||||||
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(180, 77);
|
getdisplay().setCursor(180, 77);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
epd->setCursor(180, 90);
|
getdisplay().setCursor(180, 90);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue1); // Real value as formated string
|
getdisplay().print(svalue1); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue1old); // Old value as formated string
|
getdisplay().print(svalue1old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid1 == true){
|
if(valid1 == true){
|
||||||
svalue1old = svalue1; // Save the old value
|
svalue1old = svalue1; // Save the old value
|
||||||
@@ -156,45 +141,45 @@ public:
|
|||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 105, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 105, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 145);
|
getdisplay().setCursor(20, 145);
|
||||||
epd->print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit2old);
|
getdisplay().print(unit2old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(100, 180);
|
getdisplay().setCursor(100, 180);
|
||||||
}
|
}
|
||||||
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(180, 158);
|
getdisplay().setCursor(180, 158);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
epd->setCursor(180, 180);
|
getdisplay().setCursor(180, 180);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue2); // Real value as formated string
|
getdisplay().print(svalue2); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue2old); // Old value as formated string
|
getdisplay().print(svalue2old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid2 == true){
|
if(valid2 == true){
|
||||||
svalue2old = svalue2; // Save the old value
|
svalue2old = svalue2; // Save the old value
|
||||||
@@ -204,45 +189,45 @@ public:
|
|||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 195, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 195, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 220);
|
getdisplay().setCursor(20, 220);
|
||||||
epd->print(name3); // Page name
|
getdisplay().print(name3); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(20, 240);
|
getdisplay().setCursor(20, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit3old);
|
getdisplay().print(unit3old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(50, 240);
|
getdisplay().setCursor(50, 240);
|
||||||
}
|
}
|
||||||
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(100, 240);
|
getdisplay().setCursor(100, 240);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(80, 270);
|
getdisplay().setCursor(80, 270);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue3); // Real value as formated string
|
getdisplay().print(svalue3); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue3old); // Old value as formated string
|
getdisplay().print(svalue3old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid3 == true){
|
if(valid3 == true){
|
||||||
svalue3old = svalue3; // Save the old value
|
svalue3old = svalue3; // Save the old value
|
||||||
@@ -252,52 +237,54 @@ public:
|
|||||||
// ############### Vertical Line ################
|
// ############### Vertical Line ################
|
||||||
|
|
||||||
// Vertical line 3 pix
|
// Vertical line 3 pix
|
||||||
epd->fillRect(200, 195, 3, 75, commonData->fgcolor);
|
getdisplay().fillRect(200, 195, 3, 75, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 4 ################
|
// ############### Value 4 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(220, 220);
|
getdisplay().setCursor(220, 220);
|
||||||
epd->print(name4); // Page name
|
getdisplay().print(name4); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(220, 240);
|
getdisplay().setCursor(220, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit4); // Unit
|
getdisplay().print(unit4); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit4old);
|
getdisplay().print(unit4old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(250, 240);
|
getdisplay().setCursor(250, 240);
|
||||||
}
|
}
|
||||||
else if(bvalue4->getFormat() == "formatTime" || bvalue4->getFormat() == "formatDate"){
|
else if(bvalue4->getFormat() == "formatTime" || bvalue4->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(300, 240);
|
getdisplay().setCursor(300, 240);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(280, 270);
|
getdisplay().setCursor(280, 270);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue4); // Real value as formated string
|
getdisplay().print(svalue4); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue4old); // Old value as formated string
|
getdisplay().print(svalue4old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid4 == true){
|
if(valid4 == true){
|
||||||
svalue4old = svalue4; // Save the old value
|
svalue4old = svalue4; // Save the old value
|
||||||
unit4old = unit4; // Save the old unit
|
unit4old = unit4; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
@@ -7,23 +6,12 @@
|
|||||||
|
|
||||||
class PageGenerator : public Page
|
class PageGenerator : public Page
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
String batVoltage;
|
|
||||||
int genPower;
|
|
||||||
String powerSensor;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageGenerator(CommonData &common) : Page(common)
|
PageGenerator(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageGenerator");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageGenerator");
|
||||||
|
|
||||||
// Get config data
|
|
||||||
batVoltage = config->getString(config->batteryVoltage);
|
|
||||||
genPower = config->getInt(config->genPower);
|
|
||||||
powerSensor = config->getString(config->usePowSensor3);
|
|
||||||
}
|
}
|
||||||
|
virtual int handleKey(int key){
|
||||||
int handleKey(int key){
|
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -32,8 +20,20 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
virtual void displayPage(PageData &pageData)
|
||||||
|
{
|
||||||
|
GwConfigHandler *config = commonData->config;
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String batVoltage = config->getString(config->batteryVoltage);
|
||||||
|
int genPower = config->getInt(config->genPower);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
String powerSensor = config->getString(config->usePowSensor3);
|
||||||
|
|
||||||
double value1 = 0; // Solar voltage
|
double value1 = 0; // Solar voltage
|
||||||
double value2 = 0; // Solar current
|
double value2 = 0; // Solar current
|
||||||
double value3 = 0; // Solar output power
|
double value3 = 0; // Solar output power
|
||||||
@@ -60,95 +60,100 @@ public:
|
|||||||
bool valid1 = true;
|
bool valid1 = true;
|
||||||
|
|
||||||
// Optical warning by limit violation
|
// Optical warning by limit violation
|
||||||
if (flashLED == "Limit Violation") {
|
if(String(flashLED) == "Limit Violation"){
|
||||||
// Over voltage?
|
// Over voltage
|
||||||
if (batVoltage == "12V") {
|
if(value1 > 14.8 && batVoltage == "12V"){
|
||||||
setBlinkingLED(value1 > 14.8);
|
setBlinkingLED(true);
|
||||||
} else if (batVoltage == "24V") {
|
}
|
||||||
setBlinkingLED(value1 > 29.6);
|
if(value1 <= 14.8 && batVoltage == "12V"){
|
||||||
} else {
|
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
}
|
}
|
||||||
|
if(value1 > 29.6 && batVoltage == "24V"){
|
||||||
|
setBlinkingLED(true);
|
||||||
|
}
|
||||||
|
if(value1 <= 29.6 && batVoltage == "24V"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logging voltage value
|
// Logging voltage value
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageGenerator, Type:%iW %s:=%f", genPower, name1.c_str(), value1);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageGenerator, Type:%iW %s:=%f", genPower, name1.c_str(), value1);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
epd->print("Power");
|
getdisplay().print("Power");
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(12, 82);
|
getdisplay().setCursor(12, 82);
|
||||||
epd->print("Generator");
|
getdisplay().print("Generator");
|
||||||
|
|
||||||
// Show voltage type
|
// Show voltage type
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(10, 140);
|
getdisplay().setCursor(10, 140);
|
||||||
int bvoltage = 0;
|
int bvoltage = 0;
|
||||||
if(String(batVoltage) == "12V") bvoltage = 12;
|
if(String(batVoltage) == "12V") bvoltage = 12;
|
||||||
else bvoltage = 24;
|
else bvoltage = 24;
|
||||||
epd->print(bvoltage);
|
getdisplay().print(bvoltage);
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show solar power
|
// Show solar power
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(10, 200);
|
getdisplay().setCursor(10, 200);
|
||||||
if(genPower <= 999) epd->print(genPower, 0);
|
if(genPower <= 999) getdisplay().print(genPower, 0);
|
||||||
if(genPower > 999) epd->print(float(genPower/1000.0), 1);
|
if(genPower > 999) getdisplay().print(float(genPower/1000.0), 1);
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
if(genPower <= 999) epd->print("W");
|
if(genPower <= 999) getdisplay().print("W");
|
||||||
if(genPower > 999) epd->print("kW");
|
if(genPower > 999) getdisplay().print("kW");
|
||||||
|
|
||||||
// Show info
|
// Show info
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(10, 235);
|
getdisplay().setCursor(10, 235);
|
||||||
epd->print("Installed");
|
getdisplay().print("Installed");
|
||||||
epd->setCursor(10, 255);
|
getdisplay().setCursor(10, 255);
|
||||||
epd->print("Power Modul");
|
getdisplay().print("Power Modul");
|
||||||
|
|
||||||
// Show generator
|
// Show generator
|
||||||
generatorGraphic(200, 95, commonData->fgcolor, commonData->bgcolor);
|
generatorGraphic(200, 95, commonData->fgcolor, commonData->bgcolor);
|
||||||
|
|
||||||
// Show load level in percent
|
// Show load level in percent
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(150, 200);
|
getdisplay().setCursor(150, 200);
|
||||||
epd->print(genPercentage);
|
getdisplay().print(genPercentage);
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->print("%");
|
getdisplay().print("%");
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(150, 235);
|
getdisplay().setCursor(150, 235);
|
||||||
epd->print("Load");
|
getdisplay().print("Load");
|
||||||
|
|
||||||
// Show sensor type info
|
// Show sensor type info
|
||||||
String i2cAddr = "";
|
String i2cAddr = "";
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(270, 60);
|
getdisplay().setCursor(270, 60);
|
||||||
if(powerSensor == "off") epd->print("Internal");
|
if(powerSensor == "off") getdisplay().print("Internal");
|
||||||
if(powerSensor == "INA219"){
|
if(powerSensor == "INA219"){
|
||||||
epd->print("INA219");
|
getdisplay().print("INA219");
|
||||||
i2cAddr = " (0x" + String(INA219_I2C_ADDR3, HEX) + ")";
|
i2cAddr = " (0x" + String(INA219_I2C_ADDR3, HEX) + ")";
|
||||||
}
|
}
|
||||||
if(powerSensor == "INA226"){
|
if(powerSensor == "INA226"){
|
||||||
epd->print("INA226");
|
getdisplay().print("INA226");
|
||||||
i2cAddr = " (0x" + String(INA226_I2C_ADDR3, HEX) + ")";
|
i2cAddr = " (0x" + String(INA226_I2C_ADDR3, HEX) + ")";
|
||||||
}
|
}
|
||||||
epd->print(i2cAddr);
|
getdisplay().print(i2cAddr);
|
||||||
epd->setCursor(270, 80);
|
getdisplay().setCursor(270, 80);
|
||||||
epd->print("Sensor Modul");
|
getdisplay().print("Sensor Modul");
|
||||||
|
|
||||||
// Reading bus data or using simulation data
|
// Reading bus data or using simulation data
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(260, 140);
|
getdisplay().setCursor(260, 140);
|
||||||
if(simulation == true){
|
if(simulation == true){
|
||||||
if(batVoltage == "12V"){
|
if(batVoltage == "12V"){
|
||||||
value1 = 12.0;
|
value1 = 12.0;
|
||||||
@@ -157,61 +162,49 @@ public:
|
|||||||
value1 = 24.0;
|
value1 = 24.0;
|
||||||
}
|
}
|
||||||
value1 += float(random(0, 5)) / 10; // Simulation data
|
value1 += float(random(0, 5)) / 10; // Simulation data
|
||||||
epd->print(value1,1);
|
getdisplay().print(value1,1);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Check for valid real data, display also if hold values activated
|
// Check for valid real data, display also if hold values activated
|
||||||
if(valid1 == true || holdvalues == true){
|
if(valid1 == true || holdvalues == true){
|
||||||
// Resolution switching
|
// Resolution switching
|
||||||
if(value1 <= 9.9) epd->print(value1, 2);
|
if(value1 <= 9.9) getdisplay().print(value1, 2);
|
||||||
if(value1 > 9.9 && value1 <= 99.9)epd->print(value1, 1);
|
if(value1 > 9.9 && value1 <= 99.9)getdisplay().print(value1, 1);
|
||||||
if(value1 > 99.9) epd->print(value1, 0);
|
if(value1 > 99.9) getdisplay().print(value1, 0);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(commonData->fmt->placeholder); // Missing bus data
|
getdisplay().print("---"); // Missing bus data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show actual current in A
|
// Show actual current in A
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(260, 200);
|
getdisplay().setCursor(260, 200);
|
||||||
if ((powerSensor == "INA219" || powerSensor == "INA226") && (simulation == false)) {
|
if((powerSensor == "INA219" || powerSensor == "INA226") && simulation == false){
|
||||||
// TODO use formatter for this?
|
if(value2 <= 9.9) getdisplay().print(value2, 2);
|
||||||
if (value2 <= 9.9) {
|
if(value2 > 9.9 && value2 <= 99.9)getdisplay().print(value2, 1);
|
||||||
epd->print(value2, 2);
|
if(value2 > 99.9) getdisplay().print(value2, 0);
|
||||||
} else if (value2 <= 99.9) {
|
|
||||||
epd->print(value2, 1);
|
|
||||||
} else {
|
|
||||||
epd->print(value2, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else getdisplay().print("---");
|
||||||
epd->print(commonData->fmt->placeholder);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
}
|
getdisplay().print("A");
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
|
||||||
epd->print("A");
|
|
||||||
|
|
||||||
// Show actual consumption in W
|
// Show actual consumption in W
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(260, 260);
|
getdisplay().setCursor(260, 260);
|
||||||
if ((powerSensor == "INA219" || powerSensor == "INA226") && (simulation == false)) {
|
if((powerSensor == "INA219" || powerSensor == "INA226") && simulation == false){
|
||||||
if(value3 <= 9.9) {
|
if(value3 <= 9.9) getdisplay().print(value3, 2);
|
||||||
epd->print(value3, 2);
|
if(value3 > 9.9 && value3 <= 99.9)getdisplay().print(value3, 1);
|
||||||
} else if (value3 <= 99.9) {
|
if(value3 > 99.9) getdisplay().print(value3, 0);
|
||||||
epd->print(value3, 1);
|
|
||||||
} else {
|
|
||||||
epd->print(value3, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else getdisplay().print("---");
|
||||||
epd->print(commonData->fmt->placeholder);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
}
|
getdisplay().print("W");
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
|
||||||
epd->print("W");
|
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,18 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
class PageKeelPosition : public Page
|
class PageKeelPosition : public Page
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
String lengthformat;
|
|
||||||
String rotsensor;
|
|
||||||
String rotfunction;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageKeelPosition(CommonData &common) : Page(common)
|
PageKeelPosition(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageKeelPosition");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageKeelPosition");
|
||||||
|
|
||||||
// Get config data
|
|
||||||
lengthformat = config->getString(config->lengthFormat);
|
|
||||||
rotsensor = config->getString(config->useRotSensor);
|
|
||||||
rotfunction = config->getString(config->rotFunction);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Key functions
|
// Key functions
|
||||||
int handleKey(int key){
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -32,21 +21,23 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayPage(PageData &pageData)
|
||||||
#ifdef BOARD_OBP60S3
|
{
|
||||||
// Clear optical warning
|
GwConfigHandler *config = commonData->config;
|
||||||
if (flashLED == "Limit Violation") {
|
GwLog *logger = commonData->logger;
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
double value1 = 0;
|
double value1 = 0;
|
||||||
double value1old = 0;
|
double value1old = 0;
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
String rotsensor = config->getString(config->useRotSensor);
|
||||||
|
String rotfunction = config->getString(config->rotFunction);
|
||||||
|
|
||||||
// Get boat values for Keel position
|
// Get boat values for Keel position
|
||||||
bool valid1 = commonData->data.validRotAngle; // Valid information
|
bool valid1 = commonData->data.validRotAngle; // Valid information
|
||||||
if(simulation == false && rotsensor == "AS5600" && rotfunction == "Keel"){
|
if(simulation == false && rotsensor == "AS5600" && rotfunction == "Keel"){
|
||||||
@@ -64,14 +55,20 @@ public:
|
|||||||
value1old = value1; // Save old value
|
value1old = value1; // Save old value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageKeelPosition, Keel:%f", value1);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageKeelPosition, Keel:%f", value1);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
//*******************************************************************************************
|
//*******************************************************************************************
|
||||||
|
|
||||||
@@ -79,9 +76,9 @@ public:
|
|||||||
int rInstrument = 110; // Radius of KeelPosition
|
int rInstrument = 110; // Radius of KeelPosition
|
||||||
float pi = 3.141592;
|
float pi = 3.141592;
|
||||||
|
|
||||||
epd->fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
||||||
epd->fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
||||||
epd->fillRect(0, 30, 400, 122, commonData->bgcolor); // Delete half top circle
|
getdisplay().fillRect(0, 30, 400, 122, commonData->bgcolor); // Delete half top circle
|
||||||
|
|
||||||
for(int i=90; i<=270; i=i+10)
|
for(int i=90; i<=270; i=i+10)
|
||||||
{
|
{
|
||||||
@@ -89,36 +86,37 @@ 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 30 : ii=" "; break;
|
case 0: ii=" "; break; // Use a blank for a empty scale value
|
||||||
case 60 : ii=" "; break;
|
case 30 : ii=" "; break;
|
||||||
case 90 : ii="45"; break;
|
case 60 : ii=" "; break;
|
||||||
case 120 : ii="30"; break;
|
case 90 : ii="45"; break;
|
||||||
case 150 : ii="15"; break;
|
case 120 : ii="30"; break;
|
||||||
case 180 : ii="0"; break;
|
case 150 : ii="15"; break;
|
||||||
case 210 : ii="15"; break;
|
case 180 : ii="0"; break;
|
||||||
case 240 : ii="30"; break;
|
case 210 : ii="15"; break;
|
||||||
case 270 : ii="45"; break;
|
case 240 : ii="30"; break;
|
||||||
case 300 : ii=" "; break;
|
case 270 : ii="45"; break;
|
||||||
case 330 : ii=" "; break;
|
case 300 : ii=" "; break;
|
||||||
default: break;
|
case 330 : ii=" "; break;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print text centered on position x, y
|
// Print text centered on position x, y
|
||||||
int16_t x1, y1; // Return values of getTextBounds
|
int16_t x1, y1; // Return values of getTextBounds
|
||||||
uint16_t w, h; // Return values of getTextBounds
|
uint16_t w, h; // Return values of getTextBounds
|
||||||
epd->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
|
||||||
epd->setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->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*pi);
|
||||||
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
||||||
epd->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*pi);
|
||||||
float cosx=cos(i/180.0*pi);
|
float cosx=cos(i/180.0*pi);
|
||||||
|
|
||||||
@@ -129,10 +127,10 @@ public:
|
|||||||
float xx2 = +dx;
|
float xx2 = +dx;
|
||||||
float yy1 = -(rInstrument-10);
|
float yy1 = -(rInstrument-10);
|
||||||
float yy2 = -(rInstrument+10);
|
float yy2 = -(rInstrument+10);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),commonData->fgcolor);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),
|
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),
|
||||||
200+(int)(cosx*xx2-sinx*yy2),150+(int)(sinx*xx2+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*xx2-sinx*yy2),150+(int)(sinx*xx2+cosx*yy2),commonData->fgcolor);
|
||||||
}
|
}
|
||||||
@@ -166,7 +164,7 @@ public:
|
|||||||
float xx2 = startwidth;
|
float xx2 = startwidth;
|
||||||
float yy1 = -startwidth;
|
float yy1 = -startwidth;
|
||||||
float yy2 = -(rInstrument * 0.6);
|
float yy2 = -(rInstrument * 0.6);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
||||||
// Inverted pointer
|
// Inverted pointer
|
||||||
@@ -176,39 +174,41 @@ public:
|
|||||||
float ix2 = -endwidth;
|
float ix2 = -endwidth;
|
||||||
float iy1 = -(rInstrument * 0.6);
|
float iy1 = -(rInstrument * 0.6);
|
||||||
float iy2 = -endwidth;
|
float iy2 = -endwidth;
|
||||||
epd->fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
getdisplay().fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
||||||
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
||||||
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
||||||
|
|
||||||
// Draw counterweight
|
// Draw counterweight
|
||||||
epd->fillCircle(200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2), 5, commonData->fgcolor);
|
getdisplay().fillCircle(200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2), 5, commonData->fgcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Center circle
|
// Center circle
|
||||||
epd->fillCircle(200, 140, startwidth + 22, commonData->bgcolor);
|
getdisplay().fillCircle(200, 140, startwidth + 22, commonData->bgcolor);
|
||||||
epd->fillCircle(200, 140, startwidth + 20, commonData->fgcolor); // Boat circle
|
getdisplay().fillCircle(200, 140, startwidth + 20, commonData->fgcolor); // Boat circle
|
||||||
epd->fillRect(200 - 30, 140 - 30, 2 * 30, 30, commonData->bgcolor); // Delete half top of boat circle
|
getdisplay().fillRect(200 - 30, 140 - 30, 2 * 30, 30, commonData->bgcolor); // Delete half top of boat circle
|
||||||
epd->fillRect(150, 150, 100, 4, commonData->fgcolor); // Water line
|
getdisplay().fillRect(150, 150, 100, 4, commonData->fgcolor); // Water line
|
||||||
|
|
||||||
// Print label
|
// Print label
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->setCursor(100, 70);
|
getdisplay().setCursor(100, 70);
|
||||||
epd->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
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(175, 110);
|
getdisplay().setCursor(175, 110);
|
||||||
epd->print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Print Unit of keel position
|
// Print Unit of keel position
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(145, 110);
|
getdisplay().setCursor(145, 110);
|
||||||
epd->print("No sensor data"); // Info missing sensor
|
getdisplay().print("No sensor data"); // Info missing sensor
|
||||||
}
|
}
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +1,17 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
#include "BoatDataCalibration.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class PageOneValue : public Page
|
class PageOneValue : public Page
|
||||||
{
|
{
|
||||||
private:
|
public:
|
||||||
String lengthformat;
|
PageOneValue(CommonData &common){
|
||||||
|
commonData = &common;
|
||||||
public:
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageOneValue");
|
||||||
PageOneValue(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageOneValue");
|
|
||||||
|
|
||||||
// Get config data
|
|
||||||
lengthformat = config->getString(config->lengthFormat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleKey(int key) {
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -31,88 +20,91 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
#ifdef BOARD_OBP60S3
|
GwConfigHandler *config = commonData->config;
|
||||||
// Clear optical warning
|
GwLog *logger = commonData->logger;
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
// Old values for hold function
|
// Old values for hold function
|
||||||
static String svalue1old = "";
|
static String svalue1old = "";
|
||||||
static String unit1old = "";
|
static String unit1old = "";
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
// bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
// Get boat values
|
// Get boat values
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue1 = commonData->fmt->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 = commonData->fmt->formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
if (bvalue1 == NULL) return;
|
||||||
logger->logDebug(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
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
/// Set display in partial refresh mode
|
/// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
epd->setFont(&Ubuntu_Bold32pt8b);
|
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
||||||
epd->setCursor(20, 100);
|
getdisplay().setCursor(20, 100);
|
||||||
epd->print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(270, 100);
|
getdisplay().setCursor(270, 100);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit1old);
|
getdisplay().print(unit1old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
}
|
}
|
||||||
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold32pt8b);
|
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
||||||
epd->setCursor(20, 200);
|
getdisplay().setCursor(20, 200);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic60pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic60pt7b);
|
||||||
epd->setCursor(20, 240);
|
getdisplay().setCursor(20, 240);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue1); // Real value as formated string
|
getdisplay().print(svalue1); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue1old); // Old value as formated string
|
getdisplay().print(svalue1old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid1 == true){
|
if(valid1 == true){
|
||||||
svalue1old = svalue1; // Save the old value
|
svalue1old = svalue1; // Save the old value
|
||||||
unit1old = unit1; // Save the old unit
|
unit1old = unit1; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,35 +1,18 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
class PageRollPitch : public Page
|
class PageRollPitch : public Page
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
String lengthformat;
|
|
||||||
int rolllimit;
|
|
||||||
String roffset;
|
|
||||||
double rolloffset;
|
|
||||||
String poffset;
|
|
||||||
double pitchoffset;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageRollPitch(CommonData &common) : Page(common)
|
PageRollPitch(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageRollPitch");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageRollPitch");
|
||||||
|
|
||||||
// Get config data
|
|
||||||
String lengthformat = config->getString(config->lengthFormat);
|
|
||||||
rolllimit = config->getInt(config->rollLimit);
|
|
||||||
roffset = config->getString(config->rollOffset);
|
|
||||||
rolloffset = roffset.toFloat() / 360 * (2 * M_PI);
|
|
||||||
poffset = config->getString(config->pitchOffset);
|
|
||||||
pitchoffset = poffset.toFloat() / 360 * (2 * M_PI);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Key functions
|
// Key functions
|
||||||
int handleKey(int key){
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -38,7 +21,9 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
|
GwConfigHandler *config = commonData->config;
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
double value1 = 0;
|
double value1 = 0;
|
||||||
double value2 = 0;
|
double value2 = 0;
|
||||||
@@ -47,6 +32,19 @@ public:
|
|||||||
String svalue2 = "";
|
String svalue2 = "";
|
||||||
String svalue2old = "";
|
String svalue2old = "";
|
||||||
|
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
int rolllimit = config->getInt(config->rollLimit);
|
||||||
|
String roffset = config->getString(config->rollOffset);
|
||||||
|
double rolloffset = roffset.toFloat()/360*(2*PI);
|
||||||
|
String poffset = config->getString(config->pitchOffset);
|
||||||
|
double pitchoffset = poffset.toFloat()/360*(2*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)
|
||||||
String name1 = xdrDelete(bvalue1->getName()); // Value name
|
String name1 = xdrDelete(bvalue1->getName()); // Value name
|
||||||
@@ -57,17 +55,17 @@ public:
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(simulation == true){
|
if(simulation == true){
|
||||||
value1 = (20 + float(random(0, 50)) / 10.0)/360*2*M_PI;
|
value1 = (20 + float(random(0, 50)) / 10.0)/360*2*PI;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
value1 = 0;
|
value1 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(value1/(2*M_PI)*360 > -10 && value1/(2*M_PI)*360 < 10){
|
if(value1/(2*PI)*360 > -10 && value1/(2*PI)*360 < 10){
|
||||||
svalue1 = String(value1/(2*M_PI)*360,1); // Convert raw value to string
|
svalue1 = String(value1/(2*PI)*360,1); // Convert raw value to string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
svalue1 = String(value1/(2*M_PI)*360,0);
|
svalue1 = String(value1/(2*PI)*360,0);
|
||||||
}
|
}
|
||||||
if(valid1 == true){
|
if(valid1 == true){
|
||||||
svalue1old = svalue1; // Save the old value
|
svalue1old = svalue1; // Save the old value
|
||||||
@@ -82,132 +80,134 @@ public:
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(simulation == true){
|
if(simulation == true){
|
||||||
value2 = (float(random(-5, 5)))/360*2*M_PI;
|
value2 = (float(random(-5, 5)))/360*2*PI;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
value2 = 0;
|
value2 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(value2/(2*PI)*360 > -10 && value2/(2*M_PI)*360 < 10){
|
if(value2/(2*PI)*360 > -10 && value2/(2*PI)*360 < 10){
|
||||||
svalue2 = String(value2/(2*M_PI)*360,1); // Convert raw value to string
|
svalue2 = String(value2/(2*PI)*360,1); // Convert raw value to string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
svalue2 = String(value2/(2*M_PI)*360,0);
|
svalue2 = String(value2/(2*PI)*360,0);
|
||||||
}
|
}
|
||||||
if(valid2 == true){
|
if(valid2 == true){
|
||||||
svalue2old = svalue2; // Save the old value
|
svalue2old = svalue2; // Save the old value
|
||||||
}
|
}
|
||||||
|
|
||||||
// Optical warning by limit violation
|
// Optical warning by limit violation
|
||||||
if (flashLED == "Limit Violation") {
|
if(String(flashLED) == "Limit Violation"){
|
||||||
// Limits for roll
|
// Limits for roll
|
||||||
if (value1*360/(2*M_PI) >= -1*rolllimit && value1*360/(2*M_PI) <= rolllimit) {
|
if(value1*360/(2*PI) >= -1*rolllimit && value1*360/(2*PI) <= rolllimit){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
setFlashLED(false);
|
setFlashLED(false);
|
||||||
} else {
|
}
|
||||||
|
else{
|
||||||
setBlinkingLED(true);
|
setBlinkingLED(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
if (bvalue1 == NULL) return;
|
||||||
logger->logDebug(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
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show roll limit
|
// Show roll limit
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
epd->print(rolllimit); // Value
|
getdisplay().print(rolllimit); // Value
|
||||||
//epd->print(svalue1); // Value
|
//getdisplay().print(svalue1); // Value
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(10, 95);
|
|
||||||
epd->print("Limit"); // Name
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(10, 115);
|
|
||||||
epd->print("DEG");
|
|
||||||
|
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
|
getdisplay().setCursor(10, 95);
|
||||||
|
getdisplay().print("Limit"); // Name
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
|
getdisplay().setCursor(10, 115);
|
||||||
|
getdisplay().print("DEG");
|
||||||
|
|
||||||
// Horizintal separator left
|
// Horizintal separator left
|
||||||
epd->fillRect(0, 149, 60, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 149, 60, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// Show roll value
|
// Show roll value
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(10, 270);
|
getdisplay().setCursor(10, 270);
|
||||||
if(holdvalues == false) epd->print(svalue1); // Value
|
if(holdvalues == false) getdisplay().print(svalue1); // Value
|
||||||
else epd->print(svalue1old);
|
else getdisplay().print(svalue1old);
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(10, 220);
|
getdisplay().setCursor(10, 220);
|
||||||
epd->print(name1); // Name
|
getdisplay().print(name1); // Name
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(10, 190);
|
getdisplay().setCursor(10, 190);
|
||||||
epd->print("Deg");
|
getdisplay().print("Deg");
|
||||||
|
|
||||||
// Horizintal separator right
|
// Horizintal separator right
|
||||||
epd->fillRect(340, 149, 80, 3, commonData->fgcolor);
|
getdisplay().fillRect(340, 149, 80, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// Show pitch value
|
// Show pitch value
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(295, 270);
|
getdisplay().setCursor(295, 270);
|
||||||
if(holdvalues == false) epd->print(svalue2); // Value
|
if(holdvalues == false) getdisplay().print(svalue2); // Value
|
||||||
else epd->print(svalue2old);
|
else getdisplay().print(svalue2old);
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(335, 220);
|
getdisplay().setCursor(335, 220);
|
||||||
epd->print(name2); // Name
|
getdisplay().print(name2); // Name
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(335, 190);
|
getdisplay().setCursor(335, 190);
|
||||||
epd->print("Deg");
|
getdisplay().print("Deg");
|
||||||
|
|
||||||
//*******************************************************************************************
|
//*******************************************************************************************
|
||||||
|
|
||||||
// Draw instrument
|
// Draw instrument
|
||||||
int rInstrument = 100; // Radius of instrument
|
int rInstrument = 100; // Radius of instrument
|
||||||
float pi = 3.141592;
|
float pi = 3.141592;
|
||||||
|
|
||||||
epd->fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
||||||
epd->fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
||||||
|
|
||||||
for(int i=0; i<360; i=i+10)
|
for(int i=0; i<360; i=i+10)
|
||||||
{
|
{
|
||||||
// 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*M_PI); // x-coordinate dots
|
float x = 200 + (rInstrument+25)*sin(i/180.0*pi); // x-coordinate dots
|
||||||
float y = 150 - (rInstrument+25)*cos(i/180.0*M_PI); // y-coordinate cots
|
float y = 150 - (rInstrument+25)*cos(i/180.0*pi); // y-coordinate cots
|
||||||
const char *ii = "";
|
const char *ii = "";
|
||||||
switch (i) {
|
switch (i)
|
||||||
case 0: ii="0"; break;
|
{
|
||||||
case 20 : ii="20"; break;
|
case 0: ii="0"; break;
|
||||||
case 40 : ii="40"; break;
|
case 20 : ii="20"; break;
|
||||||
case 60 : ii="60"; break;
|
case 40 : ii="40"; break;
|
||||||
case 300 : ii="60"; break;
|
case 60 : ii="60"; break;
|
||||||
case 320 : ii="40"; break;
|
case 300 : ii="60"; break;
|
||||||
case 340 : ii="20"; break;
|
case 320 : ii="40"; break;
|
||||||
default: break;
|
case 340 : ii="20"; break;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print text centered on position x, y
|
// Print text centered on position x, y
|
||||||
int16_t x1, y1; // Return values of getTextBounds
|
int16_t x1, y1; // Return values of getTextBounds
|
||||||
uint16_t w, h; // Return values of getTextBounds
|
uint16_t w, h; // Return values of getTextBounds
|
||||||
epd->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
|
||||||
epd->setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 20 == 0){
|
if(i % 20 == 0){
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw sub scale with dots
|
// Draw sub scale with dots
|
||||||
float x1c = 200 + rInstrument*sin(i/180.0*M_PI);
|
float x1c = 200 + rInstrument*sin(i/180.0*pi);
|
||||||
float y1c = 150 - rInstrument*cos(i/180.0*M_PI);
|
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
||||||
epd->fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
getdisplay().fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
||||||
float sinx=sin(i/180.0*M_PI);
|
float sinx=sin(i/180.0*pi);
|
||||||
float cosx=cos(i/180.0*M_PI);
|
float cosx=cos(i/180.0*pi);
|
||||||
|
|
||||||
// Draw sub scale with lines (two triangles)
|
// Draw sub scale with lines (two triangles)
|
||||||
if(i % 20 == 0){
|
if(i % 20 == 0){
|
||||||
@@ -216,10 +216,10 @@ public:
|
|||||||
float xx2 = +dx;
|
float xx2 = +dx;
|
||||||
float yy1 = -(rInstrument-10);
|
float yy1 = -(rInstrument-10);
|
||||||
float yy2 = -(rInstrument+10);
|
float yy2 = -(rInstrument+10);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),commonData->fgcolor);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),
|
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),
|
||||||
200+(int)(cosx*xx2-sinx*yy2),150+(int)(sinx*xx2+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*xx2-sinx*yy2),150+(int)(sinx*xx2+cosx*yy2),commonData->fgcolor);
|
||||||
}
|
}
|
||||||
@@ -229,18 +229,18 @@ 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 * M_PI ) - value1; // Mirror coordiante system for pointer, keel and boat
|
// value1 = (2 * 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 + M_PI);
|
float sinx=sin(value1 + pi);
|
||||||
float cosx=cos(value1 + M_PI);
|
float cosx=cos(value1 + 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;
|
||||||
float xx2 = startwidth;
|
float xx2 = startwidth;
|
||||||
float yy1 = -startwidth;
|
float yy1 = -startwidth;
|
||||||
float yy2 = -(rInstrument * 0.7);
|
float yy2 = -(rInstrument * 0.7);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
||||||
// Inverted pointer
|
// Inverted pointer
|
||||||
@@ -250,28 +250,28 @@ public:
|
|||||||
float ix2 = -endwidth;
|
float ix2 = -endwidth;
|
||||||
float iy1 = -(rInstrument * 0.7);
|
float iy1 = -(rInstrument * 0.7);
|
||||||
float iy2 = -endwidth;
|
float iy2 = -endwidth;
|
||||||
epd->fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
getdisplay().fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
||||||
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
||||||
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
||||||
|
|
||||||
// Draw counterweight
|
// Draw counterweight
|
||||||
epd->fillCircle(200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2), 5, commonData->fgcolor);
|
getdisplay().fillCircle(200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2), 5, commonData->fgcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Center circle
|
// Center circle
|
||||||
epd->fillCircle(200, 150, startwidth + 22, commonData->bgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 22, commonData->bgcolor);
|
||||||
epd->fillCircle(200, 150, startwidth + 20, commonData->fgcolor); // Boat circle
|
getdisplay().fillCircle(200, 150, startwidth + 20, commonData->fgcolor); // Boat circle
|
||||||
int x0 = 200;
|
int x0 = 200;
|
||||||
int y0 = 150;
|
int y0 = 150;
|
||||||
int x1 = x0 + 50*cos(value1);
|
int x1 = x0 + 50*cos(value1);
|
||||||
int y1 = y0 + 50*sin(value1);
|
int y1 = y0 + 50*sin(value1);
|
||||||
int x2 = x0 + 50*cos(value1 - pi/2);
|
int x2 = x0 + 50*cos(value1 - pi/2);
|
||||||
int y2 = y0 + 50*sin(value1 - pi/2);
|
int y2 = y0 + 50*sin(value1 - pi/2);
|
||||||
epd->fillTriangle(x0, y0, x1, y1, x2, y2, commonData->bgcolor); // Clear half top side of boat circle (right triangle)
|
getdisplay().fillTriangle(x0, y0, x1, y1, x2, y2, commonData->bgcolor); // Clear half top side of boat circle (right triangle)
|
||||||
x1 = x0 + 50*cos(value1 + pi);
|
x1 = x0 + 50*cos(value1 + pi);
|
||||||
y1 = y0 + 50*sin(value1 + pi);
|
y1 = y0 + 50*sin(value1 + pi);
|
||||||
epd->fillTriangle(x0, y0, x1, y1, x2, y2, commonData->bgcolor); // Clear half top side of boat circle (left triangle)
|
getdisplay().fillTriangle(x0, y0, x1, y1, x2, y2, commonData->bgcolor); // Clear half top side of boat circle (left triangle)
|
||||||
epd->fillRect(150, 160, 100, 4, commonData->fgcolor); // Water line
|
getdisplay().fillRect(150, 160, 100, 4, commonData->fgcolor); // Water line
|
||||||
|
|
||||||
// Draw roll pointer
|
// Draw roll pointer
|
||||||
startwidth = 4; // Start width of pointer
|
startwidth = 4; // Start width of pointer
|
||||||
@@ -283,8 +283,8 @@ public:
|
|||||||
float xx1 = -startwidth;
|
float xx1 = -startwidth;
|
||||||
float xx2 = startwidth;
|
float xx2 = startwidth;
|
||||||
float yy1 = -startwidth;
|
float yy1 = -startwidth;
|
||||||
float yy2 = -(rInstrument - 15);
|
float yy2 = -(rInstrument - 15);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
||||||
// Inverted pointer
|
// Inverted pointer
|
||||||
@@ -294,18 +294,20 @@ public:
|
|||||||
float ix2 = -endwidth;
|
float ix2 = -endwidth;
|
||||||
float iy1 = -(rInstrument - 15);
|
float iy1 = -(rInstrument - 15);
|
||||||
float iy2 = -endwidth;
|
float iy2 = -endwidth;
|
||||||
epd->fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
getdisplay().fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
||||||
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
||||||
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Print sensor info
|
// Print sensor info
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(145, 200);
|
getdisplay().setCursor(145, 200);
|
||||||
epd->print("No sensor data"); // Info missing sensor
|
getdisplay().print("No sensor data"); // Info missing sensor
|
||||||
}
|
}
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,18 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
#include "BoatDataCalibration.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class PageRudderPosition : public Page
|
class PageRudderPosition : public Page
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
String lengthformat;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageRudderPosition(CommonData &common) : Page(common)
|
PageRudderPosition(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageRudderPosition");
|
common.logger->logDebug(GwLog::LOG,"Show PageRudderPosition");
|
||||||
|
|
||||||
// Get config data
|
|
||||||
String lengthformat = config->getString(config->lengthFormat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Key functions
|
// Key functions
|
||||||
int handleKey(int key) {
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -32,64 +21,68 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
#ifdef BOARD_OBP60S3
|
GwConfigHandler *config = commonData->config;
|
||||||
// Clear optical warning
|
GwLog *logger = commonData->logger;
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
static String unit1old = "";
|
static String unit1old = "";
|
||||||
double value1 = 0.1;
|
double value1 = 0.1;
|
||||||
double value1old = 0.1;
|
double value1old = 0.1;
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
// Get boat values for rudder position
|
// Get boat values for rudder position
|
||||||
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list
|
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list
|
||||||
String name1 = bvalue1->getName().c_str(); // Value name
|
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
value1 = bvalue1->value; // Raw value without unit convertion
|
value1 = bvalue1->value; // Raw value without unit convertion
|
||||||
bool valid1 = bvalue1->valid; // Valid information
|
bool valid1 = bvalue1->valid; // Valid information
|
||||||
String svalue1 = commonData->fmt->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 = commonData->fmt->formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
|
if(valid1 == true){
|
||||||
if (valid1 == true) {
|
|
||||||
value1old = value1; // Save old value
|
value1old = value1; // Save old value
|
||||||
unit1old = unit1; // Save old unit
|
unit1old = unit1; // Save old unit
|
||||||
} else {
|
|
||||||
if (simulation == true) {
|
|
||||||
value1 = (3 + float(random(0, 50)) / 10.0) / 360 * 2 * M_PI;
|
|
||||||
unit1 = "Deg";
|
|
||||||
} else {
|
|
||||||
value1 = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log boat values
|
if(simulation == true){
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageRudderPosition, %s:%f", name1.c_str(), value1);
|
value1 = (3 + float(random(0, 50)) / 10.0)/360*2*PI;
|
||||||
|
unit1 = "Deg";
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
value1 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Logging boat values
|
||||||
|
if (bvalue1 == NULL) return;
|
||||||
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageRudderPosition, %s:%f", name1.c_str(), value1);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
//*******************************************************************************************
|
//*******************************************************************************************
|
||||||
|
|
||||||
// Draw RudderPosition
|
// Draw RudderPosition
|
||||||
int rInstrument = 110; // Radius of RudderPosition
|
int rInstrument = 110; // Radius of RudderPosition
|
||||||
const float pi = 3.141592;
|
float pi = 3.141592;
|
||||||
|
|
||||||
epd->fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
||||||
epd->fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
||||||
epd->fillRect(0, 30, 400, 122, commonData->bgcolor); // Delete half top circle
|
getdisplay().fillRect(0, 30, 400, 122, commonData->bgcolor); // Delete half top circle
|
||||||
|
|
||||||
for(int i=90; i<=270; i=i+10)
|
for(int i=90; i<=270; i=i+10)
|
||||||
{
|
{
|
||||||
@@ -97,50 +90,51 @@ 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 30 : ii=" "; break;
|
case 0: ii=" "; break; // Use a blank for a empty scale value
|
||||||
case 60 : ii=" "; break;
|
case 30 : ii=" "; break;
|
||||||
case 90 : ii="45"; break;
|
case 60 : ii=" "; break;
|
||||||
case 120 : ii="30"; break;
|
case 90 : ii="45"; break;
|
||||||
case 150 : ii="15"; break;
|
case 120 : ii="30"; break;
|
||||||
case 180 : ii="0"; break;
|
case 150 : ii="15"; break;
|
||||||
case 210 : ii="15"; break;
|
case 180 : ii="0"; break;
|
||||||
case 240 : ii="30"; break;
|
case 210 : ii="15"; break;
|
||||||
case 270 : ii="45"; break;
|
case 240 : ii="30"; break;
|
||||||
case 300 : ii=" "; break;
|
case 270 : ii="45"; break;
|
||||||
case 330 : ii=" "; break;
|
case 300 : ii=" "; break;
|
||||||
default: break;
|
case 330 : ii=" "; break;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print text centered on position x, y
|
// Print text centered on position x, y
|
||||||
int16_t x1, y1; // Return values of getTextBounds
|
int16_t x1, y1; // Return values of getTextBounds
|
||||||
uint16_t w, h; // Return values of getTextBounds
|
uint16_t w, h; // Return values of getTextBounds
|
||||||
epd->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
|
||||||
epd->setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->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*pi);
|
||||||
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
||||||
epd->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*pi);
|
||||||
float cosx=cos(i/180.0*pi);
|
float cosx=cos(i/180.0*pi);
|
||||||
|
|
||||||
// Draw sub scale with lines (two triangles)
|
// Draw sub scale with lines (two triangles)
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
float dx = 2; // Line thickness = 2*dx+1
|
float dx=2; // Line thickness = 2*dx+1
|
||||||
float xx1 = -dx;
|
float xx1 = -dx;
|
||||||
float xx2 = +dx;
|
float xx2 = +dx;
|
||||||
float yy1 = -(rInstrument-10);
|
float yy1 = -(rInstrument-10);
|
||||||
float yy2 = -(rInstrument+10);
|
float yy2 = -(rInstrument+10);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),commonData->fgcolor);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),
|
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),
|
||||||
200+(int)(cosx*xx2-sinx*yy2),150+(int)(sinx*xx2+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*xx2-sinx*yy2),150+(int)(sinx*xx2+cosx*yy2),commonData->fgcolor);
|
||||||
}
|
}
|
||||||
@@ -148,28 +142,28 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Print label
|
// Print label
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->setCursor(80, 70);
|
getdisplay().setCursor(80, 70);
|
||||||
epd->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){
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(175, 110);
|
getdisplay().setCursor(175, 110);
|
||||||
epd->print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(175, 110);
|
getdisplay().setCursor(175, 110);
|
||||||
epd->print(unit1old); // Unit
|
getdisplay().print(unit1old); // Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Print Unit of keel position
|
// Print Unit of keel position
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(145, 110);
|
getdisplay().setCursor(145, 110);
|
||||||
epd->print("No sensor data"); // Info missing sensor
|
getdisplay().print("No sensor data"); // Info missing sensor
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate rudder position
|
// Calculate rudder position
|
||||||
@@ -192,7 +186,7 @@ public:
|
|||||||
float xx2 = startwidth;
|
float xx2 = startwidth;
|
||||||
float yy1 = -startwidth;
|
float yy1 = -startwidth;
|
||||||
float yy2 = -(rInstrument * 0.5);
|
float yy2 = -(rInstrument * 0.5);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
||||||
// Inverted pointer
|
// Inverted pointer
|
||||||
@@ -202,16 +196,17 @@ public:
|
|||||||
float ix2 = -endwidth;
|
float ix2 = -endwidth;
|
||||||
float iy1 = -(rInstrument * 0.5);
|
float iy1 = -(rInstrument * 0.5);
|
||||||
float iy2 = -endwidth;
|
float iy2 = -endwidth;
|
||||||
epd->fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
getdisplay().fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
||||||
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
||||||
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Center circle
|
// Center circle
|
||||||
epd->fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
||||||
epd->fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,179 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
|
||||||
#include "OBP60Extensions.h"
|
|
||||||
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
#include "BoatDataCalibration.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const int SixValues_x1 = 5;
|
|
||||||
const int SixValues_DeltaX = 200;
|
|
||||||
|
|
||||||
const int SixValues_y1 = 23;
|
|
||||||
const int SixValues_DeltaY = 83;
|
|
||||||
|
|
||||||
const int HowManyValues = 6;
|
|
||||||
|
|
||||||
class PageSixValues : public Page
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
PageSixValues(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageSixValues");
|
|
||||||
}
|
|
||||||
|
|
||||||
int handleKey(int key) {
|
|
||||||
// Code for keylock
|
|
||||||
if(key == 11){
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0; // Commit the key
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// Clear optical warning
|
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
// Old values for hold function
|
|
||||||
static String OldDataText[HowManyValues] = {"", "", "", "", "", ""};
|
|
||||||
static String OldDataUnits[HowManyValues] = {"", "", "", "", "", ""};
|
|
||||||
|
|
||||||
// Get config data
|
|
||||||
String lengthformat = config->getString(config->lengthFormat);
|
|
||||||
// bool simulation = config->getBool(config->useSimuData);
|
|
||||||
bool holdvalues = config->getBool(config->holdvalues);
|
|
||||||
String flashLED = config->getString(config->flashLED);
|
|
||||||
String backlightMode = config->getString(config->backlight);
|
|
||||||
|
|
||||||
GwApi::BoatValue *bvalue;
|
|
||||||
String DataName[HowManyValues];
|
|
||||||
double DataValue[HowManyValues];
|
|
||||||
bool DataValid[HowManyValues];
|
|
||||||
String DataText[HowManyValues];
|
|
||||||
String DataUnits[HowManyValues];
|
|
||||||
String DataFormat[HowManyValues];
|
|
||||||
|
|
||||||
for (int i = 0; i < HowManyValues; i++){
|
|
||||||
bvalue = pageData.values[i];
|
|
||||||
DataName[i] = xdrDelete(bvalue->getName());
|
|
||||||
DataName[i] = DataName[i].substring(0, 6); // String length limit for value name
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
DataValue[i] = bvalue->value; // Value as double in SI unit
|
|
||||||
DataValid[i] = bvalue->valid;
|
|
||||||
DataText[i] = commonData->fmt->formatValue(bvalue, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
|
||||||
DataUnits[i] = commonData->fmt->formatValue(bvalue, *commonData).unit;
|
|
||||||
DataFormat[i] = bvalue->getFormat(); // Unit of value
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bvalue == NULL) return PAGE_OK; // WTF why this statement?
|
|
||||||
|
|
||||||
// Draw page
|
|
||||||
//***********************************************************
|
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
|
|
||||||
for (int i = 0; i < ( HowManyValues / 2 ); i++) {
|
|
||||||
if (i < (HowManyValues / 2) - 1) { // Don't draw horizontal line after last line of values -> standard design
|
|
||||||
// Horizontal line 3 pix
|
|
||||||
epd->fillRect(0, SixValues_y1+(i+1)*SixValues_DeltaY, 400, 3, commonData->fgcolor);
|
|
||||||
}
|
|
||||||
for (int j = 0; j < 2; j++) {
|
|
||||||
int ValueIndex = i * 2 + j;
|
|
||||||
int x0 = SixValues_x1 + j * SixValues_DeltaX;
|
|
||||||
int y0 = SixValues_y1 + i * SixValues_DeltaY;
|
|
||||||
LOG_DEBUG(GwLog::LOG, "Drawing at PageSixValue: %d %s %f %s", ValueIndex, DataName[ValueIndex], DataValue[ValueIndex], DataFormat[ValueIndex]);
|
|
||||||
|
|
||||||
// Show name
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(x0, y0+25);
|
|
||||||
epd->print(DataName[ValueIndex]); // Page name
|
|
||||||
|
|
||||||
// Show unit
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(x0, y0+72);
|
|
||||||
if (holdvalues == false) {
|
|
||||||
epd->print(DataUnits[ValueIndex]); // Unit
|
|
||||||
} else {
|
|
||||||
epd->print(OldDataUnits[ValueIndex]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Switch font if format for any values
|
|
||||||
if (DataFormat[ValueIndex] == "formatLatitude" || DataFormat[ValueIndex] == "formatLongitude") {
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(x0+10, y0+60);
|
|
||||||
}
|
|
||||||
else if (DataFormat[ValueIndex] == "formatTime" || DataFormat[ValueIndex] == "formatDate") {
|
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
|
||||||
epd->setCursor(x0+20,y0+55);
|
|
||||||
}
|
|
||||||
// pressure in hPa
|
|
||||||
else if (DataFormat[ValueIndex] == "formatXdr:P:P") {
|
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic26pt7b);
|
|
||||||
epd->setCursor(x0+5, y0+70);
|
|
||||||
}
|
|
||||||
// RPM
|
|
||||||
else if (DataFormat[ValueIndex] == "formatXdr:T:R") {
|
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic16pt7b);
|
|
||||||
epd->setCursor(x0+25, y0+70);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic26pt7b);
|
|
||||||
if (DataText[ValueIndex][0] == '-' ) {
|
|
||||||
epd->setCursor(x0+25, y0+70);
|
|
||||||
} else {
|
|
||||||
epd->setCursor(x0+65, y0+70);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show bus data
|
|
||||||
if (holdvalues == false) {
|
|
||||||
epd->print(DataText[ValueIndex]); // Real value as formated string
|
|
||||||
} else{
|
|
||||||
epd->print(OldDataText[ValueIndex]); // Old value as formated string
|
|
||||||
}
|
|
||||||
if (DataValid[ValueIndex] == true) {
|
|
||||||
OldDataText[ValueIndex] = DataText[ValueIndex]; // Save the old value
|
|
||||||
OldDataUnits[ValueIndex] = DataUnits[ValueIndex]; // Save the old unit
|
|
||||||
}
|
|
||||||
} // for j
|
|
||||||
// Vertical line 3 pix
|
|
||||||
epd->fillRect(SixValues_x1+SixValues_DeltaX-8, SixValues_y1+i*SixValues_DeltaY, 3, SixValues_DeltaY, commonData->fgcolor);
|
|
||||||
} // for i
|
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
static Page *createPage(CommonData &common){
|
|
||||||
return new PageSixValues(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 registerPageSixValues(
|
|
||||||
"SixValues", // Page name
|
|
||||||
createPage, // Action
|
|
||||||
6, // Number of bus values depends on selection in Web configuration
|
|
||||||
true // Show display header on/off
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,196 +0,0 @@
|
|||||||
// 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:
|
|
||||||
GwBoatData *bd;
|
|
||||||
|
|
||||||
public:
|
|
||||||
PageSkyView(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
// task name access is for example purpose only
|
|
||||||
TaskHandle_t currentTaskHandle = xTaskGetCurrentTaskHandle();
|
|
||||||
const char* taskName = pcTaskGetName(currentTaskHandle);
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageSkyView in task '%s'", taskName);
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
|
||||||
|
|
||||||
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
|
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
|
||||||
|
|
||||||
// current position
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
|
|
||||||
|
|
||||||
GwApi::BoatValue *bv_lat = pageData.values[0];
|
|
||||||
String sv_lat = commonData->fmt->formatValue(bv_lat, *commonData).svalue;
|
|
||||||
//epd->setCursor(300, 40);
|
|
||||||
//epd->print(sv_lat);
|
|
||||||
|
|
||||||
GwApi::BoatValue *bv_lon = pageData.values[1];
|
|
||||||
String sv_lon = commonData->fmt->formatValue(bv_lon, *commonData).svalue;
|
|
||||||
//epd->setCursor(300, 60);
|
|
||||||
//epd->print(sv_lon);
|
|
||||||
|
|
||||||
GwApi::BoatValue *bv_hdop = pageData.values[2];
|
|
||||||
String sv_hdop = commonData->fmt->formatValue(bv_hdop, *commonData).svalue;
|
|
||||||
//epd->setCursor(300, 80);
|
|
||||||
//epd->print(sv_hdop);
|
|
||||||
|
|
||||||
// sky view
|
|
||||||
Point c = {130, 148};
|
|
||||||
uint16_t r = 125;
|
|
||||||
uint16_t r1 = r / 2;
|
|
||||||
|
|
||||||
epd->fillCircle(c.x, c.y, r, commonData->bgcolor);
|
|
||||||
epd->drawCircle(c.x, c.y, r + 1, commonData->fgcolor);
|
|
||||||
epd->drawCircle(c.x, c.y, r + 2, commonData->fgcolor);
|
|
||||||
epd->drawCircle(c.x, c.y, r1, commonData->fgcolor);
|
|
||||||
|
|
||||||
// separation lines
|
|
||||||
epd->drawLine(c.x - r, c.y, c.x + r, c.y, commonData->fgcolor);
|
|
||||||
epd->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);
|
|
||||||
epd->drawLine(p1.x, p1.y, p2.x, p2.y, commonData->fgcolor);
|
|
||||||
p1 = rotatePoint(c, p, -45);
|
|
||||||
p2 = rotatePoint(c, p, -45 + 180);
|
|
||||||
epd->drawLine(p1.x, p1.y, p2.x, p2.y, commonData->fgcolor);
|
|
||||||
|
|
||||||
// directions
|
|
||||||
|
|
||||||
int16_t x1, y1;
|
|
||||||
uint16_t w, h;
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
|
|
||||||
epd->getTextBounds("N", 0, 150, &x1, &y1, &w, &h);
|
|
||||||
epd->setCursor(c.x - w / 2, c.y - r + h + 2);
|
|
||||||
epd->print("N");
|
|
||||||
|
|
||||||
epd->getTextBounds("S", 0, 150, &x1, &y1, &w, &h);
|
|
||||||
epd->setCursor(c.x - w / 2, c.y + r - 2);
|
|
||||||
epd->print("S");
|
|
||||||
|
|
||||||
epd->getTextBounds("E", 0, 150, &x1, &y1, &w, &h);
|
|
||||||
epd->setCursor(c.x + r - w - 2, c.y + h / 2);
|
|
||||||
epd->print("E");
|
|
||||||
|
|
||||||
epd->getTextBounds("W", 0, 150, &x1, &y1, &w, &h);
|
|
||||||
epd->setCursor(c.x - r + 2 , c.y + h / 2);
|
|
||||||
epd->print("W");
|
|
||||||
|
|
||||||
// show satellites in "map"
|
|
||||||
epd->setFont(&Atari6px);
|
|
||||||
for (int i = 0; i < nSat; i++) {
|
|
||||||
float arad = sats[i].Azimut * M_PI / 180.0;
|
|
||||||
float erad = sats[i].Elevation * M_PI / 180.0;
|
|
||||||
uint16_t x = c.x + sin(arad) * erad * r;
|
|
||||||
uint16_t y = c.y + cos(arad) * erad * r;
|
|
||||||
epd->drawRect(x-4, y-4, 8, 8, commonData->fgcolor);
|
|
||||||
// Add Sat number
|
|
||||||
epd->setCursor(x+5, y);
|
|
||||||
char buffer[3];
|
|
||||||
snprintf(buffer, 3, "%02d", static_cast<int>(sats[i].PRN));
|
|
||||||
epd->print(String(buffer));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Signal / Noise bars
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(325, 34);
|
|
||||||
epd->print("SNR");
|
|
||||||
epd->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;
|
|
||||||
epd->setCursor(276, y);
|
|
||||||
char buffer[3];
|
|
||||||
snprintf(buffer, 3, "%02d", static_cast<int>(sats[i].PRN));
|
|
||||||
epd->print(String(buffer));
|
|
||||||
epd->drawRect(305, y-12, 85, 14, commonData->fgcolor);
|
|
||||||
epd->setCursor(315, y);
|
|
||||||
// TODO SNR as number or as bar via mode key?
|
|
||||||
if (sats[i].SNR <= 100) {
|
|
||||||
// epd->print(sats[i].SNR);
|
|
||||||
epd->fillRect(307, y-10, int(81 * sats[i].SNR / 100.0), 10, commonData->fgcolor);
|
|
||||||
} else {
|
|
||||||
epd->print("n/a");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
{"LAT", "LON", "HDOP"}, // Bus values we need in the page
|
|
||||||
true // Show display header on/off
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
@@ -7,23 +6,12 @@
|
|||||||
|
|
||||||
class PageSolar : public Page
|
class PageSolar : public Page
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
String batVoltage;
|
|
||||||
int solPower;
|
|
||||||
String powerSensor;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageSolar(CommonData &common) : Page(common)
|
PageSolar(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageSolar");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageSolar");
|
||||||
|
|
||||||
// Get config data
|
|
||||||
String batVoltage = config->getString(config->batteryVoltage);
|
|
||||||
int solPower = config->getInt(config->solarPower);
|
|
||||||
String powerSensor = config->getString(config->usePowSensor2);
|
|
||||||
}
|
}
|
||||||
|
virtual int handleKey(int key){
|
||||||
int handleKey(int key){
|
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -32,8 +20,19 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
|
GwConfigHandler *config = commonData->config;
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String batVoltage = config->getString(config->batteryVoltage);
|
||||||
|
int solPower = config->getInt(config->solarPower);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
String powerSensor = config->getString(config->usePowSensor2);
|
||||||
|
|
||||||
double value1 = 0; // Solar voltage
|
double value1 = 0; // Solar voltage
|
||||||
double value2 = 0; // Solar current
|
double value2 = 0; // Solar current
|
||||||
double value3 = 0; // Solar output power
|
double value3 = 0; // Solar output power
|
||||||
@@ -59,93 +58,98 @@ public:
|
|||||||
|
|
||||||
bool valid1 = true;
|
bool valid1 = true;
|
||||||
|
|
||||||
// Optical warning by limit violation
|
// Optical warning by limit violation
|
||||||
if (flashLED == "Limit Violation") {
|
if(String(flashLED) == "Limit Violation"){
|
||||||
// Over voltage?
|
// Over voltage
|
||||||
if (batVoltage == "12V") {
|
if(value1 > 14.8 && batVoltage == "12V"){
|
||||||
setBlinkingLED(value1 > 14.8);
|
setBlinkingLED(true);
|
||||||
} else if (batVoltage == "24V") {
|
}
|
||||||
setBlinkingLED(value1 > 29.6);
|
if(value1 <= 14.8 && batVoltage == "12V"){
|
||||||
} else {
|
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
}
|
}
|
||||||
|
if(value1 > 29.6 && batVoltage == "24V"){
|
||||||
|
setBlinkingLED(true);
|
||||||
|
}
|
||||||
|
if(value1 <= 29.6 && batVoltage == "24V"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logging voltage value
|
// Logging voltage value
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageSolar, Type:%iW %s:=%f", solPower, name1.c_str(), value1);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageSolar, Type:%iW %s:=%f", solPower, name1.c_str(), value1);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
epd->print("Solar");
|
getdisplay().print("Solar");
|
||||||
|
|
||||||
// Show voltage type
|
// Show voltage type
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(10, 140);
|
getdisplay().setCursor(10, 140);
|
||||||
int bvoltage = 0;
|
int bvoltage = 0;
|
||||||
if(String(batVoltage) == "12V") bvoltage = 12;
|
if(String(batVoltage) == "12V") bvoltage = 12;
|
||||||
else bvoltage = 24;
|
else bvoltage = 24;
|
||||||
epd->print(bvoltage);
|
getdisplay().print(bvoltage);
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show solar power
|
// Show solar power
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(10, 200);
|
getdisplay().setCursor(10, 200);
|
||||||
if(solPower <= 999) epd->print(solPower, 0);
|
if(solPower <= 999) getdisplay().print(solPower, 0);
|
||||||
if(solPower > 999) epd->print(float(solPower/1000.0), 1);
|
if(solPower > 999) getdisplay().print(float(solPower/1000.0), 1);
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
if(solPower <= 999) epd->print("W");
|
if(solPower <= 999) getdisplay().print("W");
|
||||||
if(solPower > 999) epd->print("kW");
|
if(solPower > 999) getdisplay().print("kW");
|
||||||
|
|
||||||
// Show info
|
// Show info
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(10, 235);
|
getdisplay().setCursor(10, 235);
|
||||||
epd->print("Installed");
|
getdisplay().print("Installed");
|
||||||
epd->setCursor(10, 255);
|
getdisplay().setCursor(10, 255);
|
||||||
epd->print("Solar Modul");
|
getdisplay().print("Solar Modul");
|
||||||
|
|
||||||
// Show solar panel
|
// Show solar panel
|
||||||
solarGraphic(150, 45, commonData->fgcolor, commonData->bgcolor);
|
solarGraphic(150, 45, commonData->fgcolor, commonData->bgcolor);
|
||||||
|
|
||||||
// Show load level in percent
|
// Show load level in percent
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(150, 200);
|
getdisplay().setCursor(150, 200);
|
||||||
epd->print(solPercentage);
|
getdisplay().print(solPercentage);
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->print("%");
|
getdisplay().print("%");
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(150, 235);
|
getdisplay().setCursor(150, 235);
|
||||||
epd->print("Load");
|
getdisplay().print("Load");
|
||||||
|
|
||||||
// Show sensor type info
|
// Show sensor type info
|
||||||
String i2cAddr = "";
|
String i2cAddr = "";
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(270, 60);
|
getdisplay().setCursor(270, 60);
|
||||||
if(powerSensor == "off") epd->print("Internal");
|
if(powerSensor == "off") getdisplay().print("Internal");
|
||||||
if(powerSensor == "INA219"){
|
if(powerSensor == "INA219"){
|
||||||
epd->print("INA219");
|
getdisplay().print("INA219");
|
||||||
i2cAddr = " (0x" + String(INA219_I2C_ADDR2, HEX) + ")";
|
i2cAddr = " (0x" + String(INA219_I2C_ADDR2, HEX) + ")";
|
||||||
}
|
}
|
||||||
if(powerSensor == "INA226"){
|
if(powerSensor == "INA226"){
|
||||||
epd->print("INA226");
|
getdisplay().print("INA226");
|
||||||
i2cAddr = " (0x" + String(INA226_I2C_ADDR2, HEX) + ")";
|
i2cAddr = " (0x" + String(INA226_I2C_ADDR2, HEX) + ")";
|
||||||
}
|
}
|
||||||
epd->print(i2cAddr);
|
getdisplay().print(i2cAddr);
|
||||||
epd->setCursor(270, 80);
|
getdisplay().setCursor(270, 80);
|
||||||
epd->print("Sensor Modul");
|
getdisplay().print("Sensor Modul");
|
||||||
|
|
||||||
// Reading bus data or using simulation data
|
// Reading bus data or using simulation data
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(260, 140);
|
getdisplay().setCursor(260, 140);
|
||||||
if(simulation == true){
|
if(simulation == true){
|
||||||
if(batVoltage == "12V"){
|
if(batVoltage == "12V"){
|
||||||
value1 = 12.0;
|
value1 = 12.0;
|
||||||
@@ -154,64 +158,49 @@ public:
|
|||||||
value1 = 24.0;
|
value1 = 24.0;
|
||||||
}
|
}
|
||||||
value1 += float(random(0, 5)) / 10; // Simulation data
|
value1 += float(random(0, 5)) / 10; // Simulation data
|
||||||
epd->print(value1,1);
|
getdisplay().print(value1,1);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Check for valid real data, display also if hold values activated
|
// Check for valid real data, display also if hold values activated
|
||||||
if(valid1 == true || holdvalues == true){
|
if(valid1 == true || holdvalues == true){
|
||||||
// Resolution switching
|
// Resolution switching
|
||||||
if (value1 <= 9.9) {
|
if(value1 <= 9.9) getdisplay().print(value1, 2);
|
||||||
epd->print(value1, 2);
|
if(value1 > 9.9 && value1 <= 99.9)getdisplay().print(value1, 1);
|
||||||
} else if (value1 <= 99.9) {
|
if(value1 > 99.9) getdisplay().print(value1, 0);
|
||||||
epd->print(value1, 1);
|
|
||||||
} else {
|
|
||||||
epd->print(value1, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else{
|
||||||
epd->print(commonData->fmt->placeholder); // Missing bus data
|
getdisplay().print("---"); // Missing bus data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show actual current in A
|
// Show actual current in A
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(260, 200);
|
getdisplay().setCursor(260, 200);
|
||||||
if ((powerSensor == "INA219" || powerSensor == "INA226") && (simulation == false)) {
|
if((powerSensor == "INA219" || powerSensor == "INA226") && simulation == false){
|
||||||
if (value2 <= 9.9) {
|
if(value2 <= 9.9) getdisplay().print(value2, 2);
|
||||||
epd->print(value2, 2);
|
if(value2 > 9.9 && value2 <= 99.9)getdisplay().print(value2, 1);
|
||||||
} else if (value2 <= 99.9) {
|
if(value2 > 99.9) getdisplay().print(value2, 0);
|
||||||
epd->print(value2, 1);
|
|
||||||
} else {
|
|
||||||
epd->print(value2, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else getdisplay().print("---");
|
||||||
epd->print(commonData->fmt->placeholder);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
}
|
getdisplay().print("A");
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
|
||||||
epd->print("A");
|
|
||||||
|
|
||||||
// Show actual consumption in W
|
// Show actual consumption in W
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(260, 260);
|
getdisplay().setCursor(260, 260);
|
||||||
if ((powerSensor == "INA219" || powerSensor == "INA226") && (simulation == false)) {
|
if((powerSensor == "INA219" || powerSensor == "INA226") && simulation == false){
|
||||||
if (value3 <= 9.9) {
|
if(value3 <= 9.9) getdisplay().print(value3, 2);
|
||||||
epd->print(value3, 2);
|
if(value3 > 9.9 && value3 <= 99.9)getdisplay().print(value3, 1);
|
||||||
} else if (value3 <= 99.9) {
|
if(value3 > 99.9) getdisplay().print(value3, 0);
|
||||||
epd->print(value3, 1);
|
|
||||||
} else {
|
|
||||||
epd->print(value3, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else getdisplay().print("---");
|
||||||
epd->print(commonData->fmt->placeholder);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
}
|
getdisplay().print("W");
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
|
||||||
epd->print("W");
|
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,745 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Special system page, called directly with fast key sequence 5,4
|
|
||||||
* Out of normal page order.
|
|
||||||
* Consists of some sub-pages with following content:
|
|
||||||
* 1. Hard and software information
|
|
||||||
* 2. System settings
|
|
||||||
* 3. System configuration: running and NVRAM
|
|
||||||
* 4. NMEA2000 device list if NMEA2000 enabled
|
|
||||||
* 5. SD Card information if available
|
|
||||||
*
|
|
||||||
* TODO
|
|
||||||
* - setCpuFrequencyMhz(80|160|240);
|
|
||||||
* - Accesspoint / ! Änderung im Gatewaycode erforderlich?
|
|
||||||
* if (! isApActive()) {
|
|
||||||
* wifiSSID = config->getString(config->wifiSSID);
|
|
||||||
* wifiPass = config->getString(config->wifiPass);
|
|
||||||
* wifiSoftAP(wifiSSID, wifiPass);
|
|
||||||
* }
|
|
||||||
* - Power mode
|
|
||||||
* powerInit(powermode);
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
|
||||||
#include "OBP60Extensions.h"
|
|
||||||
#include "ConfigMenu.h"
|
|
||||||
#include "images/logo64.xbm"
|
|
||||||
#include <esp32/clk.h>
|
|
||||||
#include "qrcode.h"
|
|
||||||
#include "Nmea2kTwai.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)
|
|
||||||
|
|
||||||
#define N2K_INACTIVE_AGE 30000
|
|
||||||
|
|
||||||
class PageSystem : public Page
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
// NVRAM config options
|
|
||||||
String flashLED;
|
|
||||||
|
|
||||||
// Generic data access
|
|
||||||
|
|
||||||
uint64_t chipid;
|
|
||||||
bool use_sdcard;
|
|
||||||
String buzzer_mode;
|
|
||||||
uint8_t buzzer_power;
|
|
||||||
String cpuspeed;
|
|
||||||
String rtc_module;
|
|
||||||
String gps_module;
|
|
||||||
String env_module;
|
|
||||||
|
|
||||||
String batt_sensor;
|
|
||||||
String solar_sensor;
|
|
||||||
String gen_sensor;
|
|
||||||
String rot_sensor;
|
|
||||||
double homelat;
|
|
||||||
double homelon;
|
|
||||||
|
|
||||||
Nmea2kTwai *NMEA2000;
|
|
||||||
unsigned long n2kRxOld = 0; // to detect bus activity
|
|
||||||
unsigned long n2kTxOld = 0;
|
|
||||||
long n2k_ts = 0; // timestamp of last activity
|
|
||||||
bool n2k_active = false;
|
|
||||||
|
|
||||||
char mode = 'N'; // (N)ormal, (S)ettings, (C)onfiguration, (D)evice list, c(A)rd
|
|
||||||
int8_t editmode = -1; // marker for menu/edit/set function
|
|
||||||
|
|
||||||
ConfigMenu *menu;
|
|
||||||
|
|
||||||
void incMode() {
|
|
||||||
if (mode == 'N') { // Normal
|
|
||||||
mode = 'S';
|
|
||||||
} else if (mode == 'S') { // Settings
|
|
||||||
mode = 'C';
|
|
||||||
} else if (mode == 'C') { // Config
|
|
||||||
mode = 'D';
|
|
||||||
} else if (mode == 'D') { // Device list
|
|
||||||
if (hasSDCard) {
|
|
||||||
mode = 'A'; // SD-Card
|
|
||||||
} else {
|
|
||||||
mode = 'N';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mode = 'N';
|
|
||||||
}
|
|
||||||
if (hasFRAM) fram.write(FRAM_SYSTEM_MODE, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
void decMode() {
|
|
||||||
if (mode == 'N') {
|
|
||||||
if (hasSDCard) {
|
|
||||||
mode = 'A';
|
|
||||||
} else {
|
|
||||||
mode = 'D';
|
|
||||||
}
|
|
||||||
} else if (mode == 'S') { // Settings
|
|
||||||
mode = 'N';
|
|
||||||
} else if (mode == 'C') { // Config
|
|
||||||
mode = 'S';
|
|
||||||
} else if (mode == 'D') { // Device list
|
|
||||||
mode = 'C';
|
|
||||||
} else {
|
|
||||||
mode = 'D';
|
|
||||||
}
|
|
||||||
if (hasFRAM) fram.write(FRAM_SYSTEM_MODE, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeNormal() {
|
|
||||||
// Default system page view
|
|
||||||
|
|
||||||
uint16_t y0 = 155;
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("System information");
|
|
||||||
|
|
||||||
epd->drawXBitmap(320, 25, logo64_bits, logo64_width, logo64_height, commonData->fgcolor);
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
|
|
||||||
char ssid[13];
|
|
||||||
snprintf(ssid, 13, "%04X%08X", (uint16_t)(chipid >> 32), (uint32_t)chipid);
|
|
||||||
displayBarcode(String(ssid), 320, 200, 2);
|
|
||||||
epd->setCursor(8, 70);
|
|
||||||
epd->print(String("MCUDEVICE-") + String(ssid));
|
|
||||||
|
|
||||||
epd->setCursor(8, 95);
|
|
||||||
epd->print("Firmware version: ");
|
|
||||||
epd->setCursor(150, 95);
|
|
||||||
epd->print(VERSINFO);
|
|
||||||
|
|
||||||
epd->setCursor(8, 113);
|
|
||||||
epd->print("Board version: ");
|
|
||||||
epd->setCursor(150, 113);
|
|
||||||
epd->print(BOARDINFO);
|
|
||||||
epd->print(String(" HW ") + String(PCBINFO));
|
|
||||||
|
|
||||||
epd->setCursor(8, 131);
|
|
||||||
epd->print("Display version: ");
|
|
||||||
epd->setCursor(150, 131);
|
|
||||||
epd->print(DISPLAYINFO);
|
|
||||||
epd->print("; GxEPD2 v");
|
|
||||||
epd->print(GXEPD2INFO);
|
|
||||||
|
|
||||||
epd->setCursor(8, 265);
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
epd->print("Press STBY to enter deep sleep mode");
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
epd->print("Press wheel to enter deep sleep mode");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Flash memory size
|
|
||||||
uint32_t flash_size = ESP.getFlashChipSize();
|
|
||||||
epd->setCursor(8, y0);
|
|
||||||
epd->print("FLASH:");
|
|
||||||
epd->setCursor(90, y0);
|
|
||||||
epd->print(String(flash_size / 1024) + String(" kB"));
|
|
||||||
|
|
||||||
// PSRAM memory size
|
|
||||||
uint32_t psram_size = ESP.getPsramSize();
|
|
||||||
epd->setCursor(8, y0 + 16);
|
|
||||||
epd->print("PSRAM:");
|
|
||||||
epd->setCursor(90, y0 + 16);
|
|
||||||
epd->print(String(psram_size / 1024) + String(" kB"));
|
|
||||||
|
|
||||||
// FRAM available / status
|
|
||||||
epd->setCursor(8, y0 + 32);
|
|
||||||
epd->print("FRAM:");
|
|
||||||
epd->setCursor(90, y0 + 32);
|
|
||||||
epd->print(hasFRAM ? "available" : "not found");
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
// SD-Card
|
|
||||||
epd->setCursor(8, y0 + 48);
|
|
||||||
epd->print("SD-Card:");
|
|
||||||
epd->setCursor(90, y0 + 48);
|
|
||||||
if (hasSDCard) {
|
|
||||||
uint64_t cardsize = ((uint64_t) sdcard->csd.capacity) * sdcard->csd.sector_size / (1024 * 1024);
|
|
||||||
epd->printf("%llu MB", cardsize);
|
|
||||||
if (!use_sdcard) {
|
|
||||||
epd->print(" (disabled)");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
epd->print("off");
|
|
||||||
}
|
|
||||||
#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";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
epd->setCursor(8, y0 + 80);
|
|
||||||
epd->print("Uptime:");
|
|
||||||
epd->setCursor(90, y0 + 80);
|
|
||||||
epd->print(uptime);
|
|
||||||
epd->print(uptime_unit);
|
|
||||||
|
|
||||||
// CPU speed config / active
|
|
||||||
epd->setCursor(202, y0);
|
|
||||||
epd->print("CPU speed:");
|
|
||||||
epd->setCursor(300, y0);
|
|
||||||
epd->print(cpuspeed);
|
|
||||||
epd->print(" / ");
|
|
||||||
int cpu_freq = esp_clk_cpu_freq() / 1000000;
|
|
||||||
epd->print(String(cpu_freq));
|
|
||||||
|
|
||||||
// total RAM free
|
|
||||||
int Heap_free = esp_get_free_heap_size();
|
|
||||||
epd->setCursor(202, y0 + 16);
|
|
||||||
epd->print("Total free:");
|
|
||||||
epd->setCursor(300, y0 + 16);
|
|
||||||
epd->print(String(Heap_free));
|
|
||||||
|
|
||||||
// RAM free for task
|
|
||||||
UBaseType_t RAM_free = uxTaskGetStackHighWaterMark(NULL);
|
|
||||||
epd->setCursor(202, y0 + 32);
|
|
||||||
epd->print("Task free:");
|
|
||||||
epd->setCursor(300, y0 + 32);
|
|
||||||
epd->print(String(RAM_free));
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeConfig() {
|
|
||||||
// Configuration interface
|
|
||||||
|
|
||||||
uint16_t x0 = 16;
|
|
||||||
uint16_t y0 = 80;
|
|
||||||
uint16_t dy = 20;
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("System configuration");
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
|
|
||||||
/*epd->setCursor(x0, y0);
|
|
||||||
epd->print("CPU speed: 80 | 160 | 240");
|
|
||||||
epd->setCursor(x0, y0 + 1 * dy);
|
|
||||||
epd->print("Power mode: Max | 5V | Min");
|
|
||||||
epd->setCursor(x0, y0 + 2 * dy);
|
|
||||||
epd->print("Accesspoint: On | Off");
|
|
||||||
|
|
||||||
// TODO Change NVRAM-preferences settings here
|
|
||||||
epd->setCursor(x0, y0 + 4 * dy);
|
|
||||||
epd->print("Simulation: On | Off"); */
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
for (int i = 0 ; i < menu->getItemCount(); i++) {
|
|
||||||
ConfigMenuItem *itm = menu->getItemByIndex(i);
|
|
||||||
if (!itm) {
|
|
||||||
logger->logDebug(GwLog::ERROR, "Menu item not found: %d", i);
|
|
||||||
} else {
|
|
||||||
Rect r = menu->getItemRect(i);
|
|
||||||
bool inverted = (i == menu->getActiveIndex());
|
|
||||||
drawTextBoxed(r, itm->getLabel(), commonData->fgcolor, commonData->bgcolor, inverted, false);
|
|
||||||
if (inverted and editmode > 0) {
|
|
||||||
// triangle as edit marker
|
|
||||||
epd->fillTriangle(r.x + r.w + 20, r.y, r.x + r.w + 30, r.y + r.h / 2, r.x + r.w + 20, r.y + r.h, commonData->fgcolor);
|
|
||||||
}
|
|
||||||
epd->setCursor(r.x + r.w + 40, r.y + r.h - 4);
|
|
||||||
if (itm->getType() == "int") {
|
|
||||||
epd->print(itm->getValue());
|
|
||||||
epd->print(itm->getUnit());
|
|
||||||
} else {
|
|
||||||
epd->print(itm->getValue() == 0 ? "No" : "Yes");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeSettings() {
|
|
||||||
// View some of the current settings
|
|
||||||
|
|
||||||
const uint16_t x0 = 8;
|
|
||||||
const uint16_t y0 = 72;
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(x0, 48);
|
|
||||||
epd->print("System settings");
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
|
|
||||||
// left column
|
|
||||||
epd->setCursor(x0, y0);
|
|
||||||
epd->print("Simulation:");
|
|
||||||
epd->setCursor(120, y0);
|
|
||||||
epd->print(simulation ? "on" : "off");
|
|
||||||
|
|
||||||
epd->setCursor(x0, y0 + 16);
|
|
||||||
epd->print("Environment:");
|
|
||||||
epd->setCursor(120, y0 + 16);
|
|
||||||
epd->print(env_module);
|
|
||||||
|
|
||||||
epd->setCursor(x0, y0 + 32);
|
|
||||||
epd->print("Buzzer:");
|
|
||||||
epd->setCursor(120, y0 + 32);
|
|
||||||
epd->print(buzzer_mode);
|
|
||||||
|
|
||||||
epd->setCursor(x0, y0 + 64);
|
|
||||||
epd->print("GPS:");
|
|
||||||
epd->setCursor(120, y0 + 64);
|
|
||||||
epd->print(gps_module);
|
|
||||||
|
|
||||||
epd->setCursor(x0, y0 + 80);
|
|
||||||
epd->print("RTC:");
|
|
||||||
epd->setCursor(120, y0 + 80);
|
|
||||||
epd->print(rtc_module);
|
|
||||||
|
|
||||||
epd->setCursor(x0, y0 + 96);
|
|
||||||
epd->print("Wifi:");
|
|
||||||
epd->setCursor(120, y0 + 96);
|
|
||||||
epd->print(commonData->status.wifiApOn ? "on" : "off");
|
|
||||||
|
|
||||||
// Home location
|
|
||||||
epd->setCursor(x0, y0 + 128);
|
|
||||||
epd->print("Home Lat.:");
|
|
||||||
drawTextRalign(230, y0 + 128, formatLatitude(homelat));
|
|
||||||
epd->setCursor(x0, y0 + 144);
|
|
||||||
epd->print("Home Lon.:");
|
|
||||||
drawTextRalign(230, y0 + 144, formatLongitude(homelon));
|
|
||||||
|
|
||||||
// right column
|
|
||||||
epd->setCursor(202, y0);
|
|
||||||
epd->print("Batt. sensor:");
|
|
||||||
epd->setCursor(320, y0);
|
|
||||||
epd->print(batt_sensor);
|
|
||||||
|
|
||||||
// Solar sensor
|
|
||||||
epd->setCursor(202, y0 + 16);
|
|
||||||
epd->print("Solar sensor:");
|
|
||||||
epd->setCursor(320, y0 + 16);
|
|
||||||
epd->print(solar_sensor);
|
|
||||||
|
|
||||||
// Generator sensor
|
|
||||||
epd->setCursor(202, y0 + 32);
|
|
||||||
epd->print("Gen. sensor:");
|
|
||||||
epd->setCursor(320, y0 + 32);
|
|
||||||
epd->print(gen_sensor);
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// Backlight infos
|
|
||||||
epd->setCursor(202, y0 + 64);
|
|
||||||
epd->print("Backlight:");
|
|
||||||
epd->setCursor(320, y0 + 64);
|
|
||||||
epd->printf("%d%%", commonData->backlight.brightness);
|
|
||||||
// TODO test function with OBP60 device
|
|
||||||
epd->setCursor(202, y0 + 80);
|
|
||||||
epd->print("Bl color:");
|
|
||||||
epd->setCursor(320, y0 + 80);
|
|
||||||
epd->print(commonData->backlight.color.toName());
|
|
||||||
epd->setCursor(202, y0 + 96);
|
|
||||||
epd->print("Bl mode:");
|
|
||||||
epd->setCursor(320, y0 + 96);
|
|
||||||
epd->print(commonData->backlight.mode);
|
|
||||||
// TODO Buzzer mode and power
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Gyro sensor
|
|
||||||
// WIP / FEATURE
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeSDCard() {
|
|
||||||
// SD card info
|
|
||||||
uint16_t x0 = 20;
|
|
||||||
uint16_t y0 = 72;
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("SD card info");
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->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
|
|
||||||
epd->print("This mode is not indended to be reached!\n");
|
|
||||||
epd->print("There's nothing to see here. Move on.");
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
/* TODO identify card as OBP-Card:
|
|
||||||
magic.dat
|
|
||||||
version.dat
|
|
||||||
readme.txt
|
|
||||||
BAK/
|
|
||||||
CHARTS/
|
|
||||||
DATA/
|
|
||||||
IMAGES/
|
|
||||||
LOGS/
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Simple test for magic file in root
|
|
||||||
epd->setCursor(x0, y0 + 16);
|
|
||||||
const char* file_magic = MOUNT_POINT "/magic.dat";
|
|
||||||
logger->logDebug(GwLog::LOG, "Test magicfile: %s", file_magic);
|
|
||||||
struct stat st;
|
|
||||||
if (stat(file_magic, &st) == 0) {
|
|
||||||
epd->printf("Magicfile %s exists", file_magic);
|
|
||||||
} else {
|
|
||||||
epd->printf("Magicfile %s not found", file_magic);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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)) {
|
|
||||||
epd->setCursor(x0, y0 + 64 + dy);
|
|
||||||
epd->print(entry->d_name);
|
|
||||||
// type 1 is file, type 2 is dir
|
|
||||||
if (entry->d_type == 2) {
|
|
||||||
epd->print("/");
|
|
||||||
}
|
|
||||||
dy += 20;
|
|
||||||
logger->logDebug(GwLog::LOG, " %s type %d", entry->d_name, entry->d_type);
|
|
||||||
}
|
|
||||||
closedir(dir);
|
|
||||||
} else {
|
|
||||||
logger->logDebug(GwLog::LOG, "Failed to open root directory");
|
|
||||||
}
|
|
||||||
|
|
||||||
// try to load example pbm file
|
|
||||||
// TODO create PBM load function in imglib
|
|
||||||
String filepath = MOUNT_POINT "/IMAGES/icon-settings2.pbm";
|
|
||||||
const char* file_img = filepath.c_str();
|
|
||||||
FILE* fh = fopen(file_img, "r");
|
|
||||||
if (fh != NULL) {
|
|
||||||
logger->logDebug(GwLog::LOG, "Open file for reading: %s", file_img);
|
|
||||||
|
|
||||||
char magic[3];
|
|
||||||
char buffer[80];
|
|
||||||
|
|
||||||
// 2 Byte Magic: P1=ASCII, P4=Binary
|
|
||||||
fgets(magic, sizeof(magic), fh);
|
|
||||||
if (strcmp(magic, "P1") != 0) {
|
|
||||||
logger->logDebug(GwLog::LOG, "Not a valid PBM file of type P1 (%s)", magic);
|
|
||||||
} else {
|
|
||||||
uint16_t width = 0;
|
|
||||||
uint16_t height = 0;
|
|
||||||
while (fgets(buffer, sizeof(buffer), fh)) {
|
|
||||||
// logger->logDebug(GwLog::LOG, "%s", buffer);
|
|
||||||
if (buffer[0] == '#') {
|
|
||||||
continue; // skip comment
|
|
||||||
}
|
|
||||||
if (sscanf(buffer, "%d %d", &width, &height) == 2) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
logger->logDebug(GwLog::LOG, "Image: %dx%d", width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*size_t bytesRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, fh);
|
|
||||||
buffer[bytesRead] = '\0'; // Null-terminate the string
|
|
||||||
if (bytesRead > 0) {
|
|
||||||
logger->logDebug(GwLog::LOG, "Read %d bytes", bytesRead);
|
|
||||||
logger->logDebug(GwLog::LOG, ">%s<", buffer);
|
|
||||||
} */
|
|
||||||
|
|
||||||
/* WIP
|
|
||||||
// Read pixel data and pack into the buffer
|
|
||||||
for (int i = 0; i < width * height; i++) {
|
|
||||||
int pixel;
|
|
||||||
fscanf(file, "%d", &pixel);
|
|
||||||
|
|
||||||
// Calculate the byte index and bit position
|
|
||||||
int byteIndex = i / 8;
|
|
||||||
int bitPosition = 7 - (i % 8); // Store MSB first
|
|
||||||
|
|
||||||
// Set the corresponding bit in the byte
|
|
||||||
if (pixel == 1) {
|
|
||||||
buffer[byteIndex] |= (1 << bitPosition);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
fclose(fh);
|
|
||||||
// epd->drawXBitmap(20, 200, buffer, width, height, commonData.fgcolor);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeDevicelist(bool bus_active) {
|
|
||||||
// NMEA2000 device list
|
|
||||||
|
|
||||||
// TODO Check if NMEA2000 enabled globally
|
|
||||||
// if disabled this page should not be shown
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("NMEA2000 device list");
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(20, 80);
|
|
||||||
epd->print("RxD: ");
|
|
||||||
epd->print(String(commonData->status.n2kRx));
|
|
||||||
epd->setCursor(20, 100);
|
|
||||||
epd->print("TxD: ");
|
|
||||||
epd->print(String(commonData->status.n2kTx));
|
|
||||||
|
|
||||||
// show bus activity
|
|
||||||
epd->setCursor(20, 120);
|
|
||||||
epd->print("Bus: ");
|
|
||||||
epd->print(bus_active ? "active" : "inactive");
|
|
||||||
|
|
||||||
epd->setCursor(20, 140);
|
|
||||||
epd->printf("N2k source address: %d", NMEA2000->GetN2kSource());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void storeConfig() {
|
|
||||||
menu->storeValues();
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
PageSystem(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageSystem");
|
|
||||||
if (hasFRAM) {
|
|
||||||
mode = fram.read(FRAM_SYSTEM_MODE);
|
|
||||||
logger->logDebug(GwLog::LOG, "Loaded mode '%c' from FRAM", mode);
|
|
||||||
}
|
|
||||||
flashLED = config->getString(config->flashLED);
|
|
||||||
|
|
||||||
chipid = ESP.getEfuseMac();
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
use_sdcard = config->getBool(config->useSDCard);
|
|
||||||
#endif
|
|
||||||
buzzer_mode = config->getString(config->buzzerMode);
|
|
||||||
buzzer_mode.toLowerCase();
|
|
||||||
buzzer_power = config->getInt(config->buzzerPower);
|
|
||||||
cpuspeed = config->getString(config->cpuSpeed);
|
|
||||||
env_module = config->getString(config->useEnvSensor);
|
|
||||||
rtc_module = config->getString(config->useRTC);
|
|
||||||
gps_module = config->getString(config->useGPS);
|
|
||||||
batt_sensor = config->getString(config->usePowSensor1);
|
|
||||||
solar_sensor = config->getString(config->usePowSensor2);
|
|
||||||
gen_sensor = config->getString(config->usePowSensor3);
|
|
||||||
rot_sensor = config->getString(config->useRotSensor);
|
|
||||||
homelat = config->getString(config->homeLAT).toDouble();
|
|
||||||
homelon = config->getString(config->homeLON).toDouble();
|
|
||||||
|
|
||||||
// CPU speed: 80 | 160 | 240
|
|
||||||
// Power mode: Max | 5V | Min
|
|
||||||
// Accesspoint: On | Off
|
|
||||||
|
|
||||||
// TODO Change NVRAM-preferences settings here
|
|
||||||
// epd->setCursor(x0, y0 + 4 * dy);
|
|
||||||
// epd->print("Simulation: On | Off");
|
|
||||||
|
|
||||||
// Initialize config menu
|
|
||||||
menu = new ConfigMenu("Options", 40, 80);
|
|
||||||
menu->setItemDimension(150, 20);
|
|
||||||
|
|
||||||
ConfigMenuItem *newitem;
|
|
||||||
newitem = menu->addItem("accesspoint", "Accesspoint", "bool", 0, "");
|
|
||||||
newitem = menu->addItem("simulation", "Simulation", "on/off", 0, "");
|
|
||||||
menu->setItemActive("accesspoint");
|
|
||||||
|
|
||||||
// Create info-file if not exists
|
|
||||||
// TODO
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupKeys() {
|
|
||||||
commonData->keydata[0].label = "EXIT";
|
|
||||||
commonData->keydata[1].label = "MODE";
|
|
||||||
commonData->keydata[2].label = "";
|
|
||||||
commonData->keydata[3].label = "RST";
|
|
||||||
commonData->keydata[4].label = "STBY";
|
|
||||||
commonData->keydata[5].label = "ILUM";
|
|
||||||
}
|
|
||||||
|
|
||||||
int handleKey(int key) {
|
|
||||||
// do *NOT* handle key #1 this handled by obp60task as exit
|
|
||||||
// Switch display mode
|
|
||||||
logger->logDebug(GwLog::LOG, "System keyboard handler");
|
|
||||||
if (key == 2) {
|
|
||||||
incMode();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// grab cursor key to disable page navigation
|
|
||||||
if (key == 3) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// soft reset
|
|
||||||
if (key == 4) {
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
// standby / deep sleep
|
|
||||||
if (key == 5) {
|
|
||||||
logger->logDebug(GwLog::LOG, "System going into deep sleep mode...");
|
|
||||||
deepSleep(*commonData);
|
|
||||||
}
|
|
||||||
// Code for keylock
|
|
||||||
if (key == 11) {
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
// use cursor keys for local mode navigation
|
|
||||||
if (key == 9) {
|
|
||||||
incMode();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 10) {
|
|
||||||
decMode();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// standby / deep sleep
|
|
||||||
if (key == 12) {
|
|
||||||
logger->logDebug(GwLog::LOG, "System going into deep sleep mode...");
|
|
||||||
deepSleep(*commonData);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayBarcode(String serialno, uint16_t x, uint16_t y, uint16_t s) {
|
|
||||||
// Barcode with serial number
|
|
||||||
// x, y is top left corner
|
|
||||||
// s is pixel size of a single box
|
|
||||||
QRCode qrcode;
|
|
||||||
uint8_t qrcodeData[qrcode_getBufferSize(4)];
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
String prefix = "OBP40:SN:";
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
String prefix = "OBP60:SN:";
|
|
||||||
#endif
|
|
||||||
qrcode_initText(&qrcode, qrcodeData, 4, 0, (prefix + serialno).c_str());
|
|
||||||
int16_t x0 = x;
|
|
||||||
for (uint8_t j = 0; j < qrcode.size; j++) {
|
|
||||||
for (uint8_t i = 0; i < qrcode.size; i++) {
|
|
||||||
if (qrcode_getModule(&qrcode, i, j)) {
|
|
||||||
epd->fillRect(x, y, s, s, commonData->fgcolor);
|
|
||||||
}
|
|
||||||
x += s;
|
|
||||||
}
|
|
||||||
y += s;
|
|
||||||
x = x0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// Clear optical warning
|
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// Get references from API
|
|
||||||
logger->logDebug(GwLog::LOG, "New page display: PageSystem");
|
|
||||||
NMEA2000 = pageData.api->getNMEA2000();
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
// Logging page information
|
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageSystem, Mode=%c", mode);
|
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height());
|
|
||||||
|
|
||||||
// call current system page
|
|
||||||
switch (mode) {
|
|
||||||
case 'N':
|
|
||||||
displayModeNormal();
|
|
||||||
break;
|
|
||||||
case 'S':
|
|
||||||
displayModeSettings();
|
|
||||||
break;
|
|
||||||
case 'C':
|
|
||||||
displayModeConfig();
|
|
||||||
break;
|
|
||||||
case 'A':
|
|
||||||
displayModeSDCard();
|
|
||||||
break;
|
|
||||||
case 'D':
|
|
||||||
// check bus status
|
|
||||||
if (commonData->status.n2kRx != n2kRxOld || commonData->status.n2kTx != n2kTxOld) {
|
|
||||||
n2kRxOld = commonData->status.n2kRx;
|
|
||||||
n2kTxOld = commonData->status.n2kTx;
|
|
||||||
n2k_ts = millis();
|
|
||||||
} else {
|
|
||||||
n2k_active = (millis() - n2k_ts <= N2K_INACTIVE_AGE);
|
|
||||||
}
|
|
||||||
displayModeDevicelist(n2k_active);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update display
|
|
||||||
epd->nextPage(); // Partial update (fast)
|
|
||||||
return PAGE_OK;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
static Page* createPage(CommonData &common){
|
|
||||||
return new PageSystem(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 registerPageSystem(
|
|
||||||
"System", // Page name
|
|
||||||
createPage, // Action
|
|
||||||
0, // No bus values
|
|
||||||
true // Headers are anabled so far
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,28 +1,17 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
#include "BoatDataCalibration.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class PageThreeValues : public Page
|
class PageThreeValues : public Page
|
||||||
{
|
{
|
||||||
private:
|
public:
|
||||||
String lengthformat;
|
PageThreeValues(CommonData &common){
|
||||||
|
commonData = &common;
|
||||||
public:
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageThreeValue");
|
||||||
PageThreeValues(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageThreeValue");
|
|
||||||
|
|
||||||
// Get config data
|
|
||||||
lengthformat = config->getString(config->lengthFormat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleKey(int key){
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -31,17 +20,9 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
#ifdef BOARD_OBP60S3
|
GwConfigHandler *config = commonData->config;
|
||||||
// Clear optical warning
|
GwLog *logger = commonData->logger;
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
// Old values for hold function
|
// Old values for hold function
|
||||||
static String svalue1old = "";
|
static String svalue1old = "";
|
||||||
@@ -51,92 +32,94 @@ public:
|
|||||||
static String svalue3old = "";
|
static String svalue3old = "";
|
||||||
static String unit3old = "";
|
static String unit3old = "";
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
// bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
// Get boat values #1
|
// Get boat values #1
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue1 = commonData->fmt->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 = commonData->fmt->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
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list (only one value by PageOneValue)
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue2 = commonData->fmt->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 = commonData->fmt->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]; // Third element in list
|
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue)
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue3 = commonData->fmt->formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue3 = formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit3 = commonData->fmt->formatValue(bvalue3, *commonData).unit; // Unit of value
|
String unit3 = formatValue(bvalue3, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Log boat values
|
// Optical warning by limit violation (unused)
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageThreeValues, %s: %f, %s: %f, %s: %f",
|
if(String(flashLED) == "Limit Violation"){
|
||||||
name1.c_str(), value1,
|
setBlinkingLED(false);
|
||||||
name2.c_str(), value2,
|
setFlashLED(false);
|
||||||
name3.c_str(), value3);
|
}
|
||||||
|
|
||||||
|
// Logging boat values
|
||||||
|
if (bvalue1 == NULL) return;
|
||||||
|
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
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
/// Set display in partial refresh mode
|
/// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 55);
|
getdisplay().setCursor(20, 55);
|
||||||
epd->print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit1old);
|
getdisplay().print(unit1old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(50, 90);
|
getdisplay().setCursor(50, 90);
|
||||||
}
|
}
|
||||||
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(170, 68);
|
getdisplay().setCursor(170, 68);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
epd->setCursor(180, 90);
|
getdisplay().setCursor(180, 90);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue1); // Real value as formated string
|
getdisplay().print(svalue1); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue1old); // Old value as formated string
|
getdisplay().print(svalue1old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid1 == true){
|
if(valid1 == true){
|
||||||
svalue1old = svalue1; // Save the old value
|
svalue1old = svalue1; // Save the old value
|
||||||
@@ -146,45 +129,45 @@ public:
|
|||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 105, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 105, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 145);
|
getdisplay().setCursor(20, 145);
|
||||||
epd->print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit2old);
|
getdisplay().print(unit2old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(50, 180);
|
getdisplay().setCursor(50, 180);
|
||||||
}
|
}
|
||||||
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(170, 158);
|
getdisplay().setCursor(170, 158);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
epd->setCursor(180, 180);
|
getdisplay().setCursor(180, 180);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue2); // Real value as formated string
|
getdisplay().print(svalue2); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue2old); // Old value as formated string
|
getdisplay().print(svalue2old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid2 == true){
|
if(valid2 == true){
|
||||||
svalue2old = svalue2; // Save the old value
|
svalue2old = svalue2; // Save the old value
|
||||||
@@ -194,52 +177,53 @@ public:
|
|||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 195, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 195, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 235);
|
getdisplay().setCursor(20, 235);
|
||||||
epd->print(name3); // Page name
|
getdisplay().print(name3); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 270);
|
getdisplay().setCursor(20, 270);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit3old);
|
getdisplay().print(unit3old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(50, 270);
|
getdisplay().setCursor(50, 270);
|
||||||
}
|
}
|
||||||
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(170, 248);
|
getdisplay().setCursor(170, 248);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
epd->setCursor(180, 270);
|
getdisplay().setCursor(180, 270);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue3); // Real value as formated string
|
getdisplay().print(svalue3); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue3old); // Old value as formated string
|
getdisplay().print(svalue3old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid3 == true){
|
if(valid3 == true){
|
||||||
svalue3old = svalue3; // Save the old value
|
svalue3old = svalue3; // Save the old value
|
||||||
unit3old = unit3; // Save the old unit
|
unit3old = unit3; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,121 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
|
||||||
#include "OBP60Extensions.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
Tracker
|
|
||||||
- standalone with SD card backend
|
|
||||||
- standalone with server backend
|
|
||||||
- Regatta Hero integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
class PageTracker : public Page
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
|
|
||||||
char mode = 'N'; // (N)ormal, (C)onfig
|
|
||||||
|
|
||||||
void displayModeNormal(PageData &pageData) {
|
|
||||||
|
|
||||||
// TBD Boatvalues: ...
|
|
||||||
|
|
||||||
logger->logDebug(GwLog::DEBUG,"Drawing at PageTracker");
|
|
||||||
|
|
||||||
// Title
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("Tracker");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeConfig() {
|
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(8, 48);
|
|
||||||
epd->print("Tracker configuration");
|
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
// TODO
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
PageTracker(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageTracker");
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupKeys(){
|
|
||||||
Page::setupKeys();
|
|
||||||
commonData->keydata[0].label = "START";
|
|
||||||
commonData->keydata[1].label = "STOP";
|
|
||||||
}
|
|
||||||
|
|
||||||
int handleKey(int key){
|
|
||||||
if (key == 1) { // Switch between normal and config mode
|
|
||||||
if (mode == 'N') {
|
|
||||||
mode = 'C';
|
|
||||||
} else {
|
|
||||||
mode = 'N';
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
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
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData){
|
|
||||||
|
|
||||||
// Logging boat values
|
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageTracker; Mode=%c", mode);
|
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height());
|
|
||||||
|
|
||||||
if (mode == 'N') {
|
|
||||||
displayModeNormal(pageData);
|
|
||||||
} else if (mode == 'C') {
|
|
||||||
displayModeConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
static Page *createPage(CommonData &common){
|
|
||||||
return new PageTracker(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 registerPageTracker(
|
|
||||||
"Tracker", // Page name
|
|
||||||
createPage, // Action
|
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
|
||||||
{"LAT", "LON"}, // Names of bus values undepends on selection in Web configuration (refer GwBoatData.h)
|
|
||||||
true // Show display header on/off
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,28 +1,17 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
#include "BoatDataCalibration.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class PageTwoValues : public Page
|
class PageTwoValues : public Page
|
||||||
{
|
{
|
||||||
private:
|
public:
|
||||||
String lengthformat;
|
PageTwoValues(CommonData &common){
|
||||||
|
commonData = &common;
|
||||||
public:
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageTwoValue");
|
||||||
PageTwoValues(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageTwoValue");
|
|
||||||
|
|
||||||
// Get config data
|
|
||||||
lengthformat = config->getString(config->lengthFormat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleKey(int key){
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -31,17 +20,9 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
#ifdef BOARD_OBP60S3
|
GwConfigHandler *config = commonData->config;
|
||||||
// Clear optical warning
|
GwLog *logger = commonData->logger;
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
// Old values for hold function
|
// Old values for hold function
|
||||||
static String svalue1old = "";
|
static String svalue1old = "";
|
||||||
@@ -49,79 +30,85 @@ public:
|
|||||||
static String svalue2old = "";
|
static String svalue2old = "";
|
||||||
static String unit2old = "";
|
static String unit2old = "";
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
// bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
// Get boat values #1
|
// Get boat values #1
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue1 = commonData->fmt->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 = commonData->fmt->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
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list (only one value by PageOneValue)
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue2 = commonData->fmt->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 = commonData->fmt->formatValue(bvalue2, *commonData).unit; // Unit of value
|
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
if (bvalue1 == NULL) return;
|
||||||
logger->logDebug(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
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 80);
|
getdisplay().setCursor(20, 80);
|
||||||
epd->print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 130);
|
getdisplay().setCursor(20, 130);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit1old);
|
getdisplay().print(unit1old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(50, 130);
|
getdisplay().setCursor(50, 130);
|
||||||
}
|
}
|
||||||
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(170, 105);
|
getdisplay().setCursor(170, 105);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic42pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic42pt7b);
|
||||||
epd->setCursor(180, 130);
|
getdisplay().setCursor(180, 130);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue1); // Real value as formated string
|
getdisplay().print(svalue1); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue1old); // Old value as formated string
|
getdisplay().print(svalue1old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid1 == true){
|
if(valid1 == true){
|
||||||
svalue1old = svalue1; // Save the old value
|
svalue1old = svalue1; // Save the old value
|
||||||
@@ -131,52 +118,53 @@ public:
|
|||||||
// ############### Horizontal Line ################
|
// ############### Horizontal Line ################
|
||||||
|
|
||||||
// Horizontal line 3 pix
|
// Horizontal line 3 pix
|
||||||
epd->fillRect(0, 145, 400, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 145, 400, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 190);
|
getdisplay().setCursor(20, 190);
|
||||||
epd->print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(20, 240);
|
getdisplay().setCursor(20, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(unit2old);
|
getdisplay().print(unit2old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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"){
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(50, 240);
|
getdisplay().setCursor(50, 240);
|
||||||
}
|
}
|
||||||
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(170, 215);
|
getdisplay().setCursor(170, 215);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic42pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic42pt7b);
|
||||||
epd->setCursor(180, 240);
|
getdisplay().setCursor(180, 240);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show bus data
|
// Show bus data
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue2); // Real value as formated string
|
getdisplay().print(svalue2); // Real value as formated string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue2old); // Old value as formated string
|
getdisplay().print(svalue2old); // Old value as formated string
|
||||||
}
|
}
|
||||||
if(valid2 == true){
|
if(valid2 == true){
|
||||||
svalue2old = svalue2; // Save the old value
|
svalue2old = svalue2; // Save the old value
|
||||||
unit2old = unit2; // Save the old unit
|
unit2old = unit2; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
@@ -7,24 +6,16 @@
|
|||||||
|
|
||||||
class PageVoltage : public Page
|
class PageVoltage : public Page
|
||||||
{
|
{
|
||||||
private:
|
bool init = false; // Marker for init done
|
||||||
String batVoltage;
|
uint8_t average = 0; // Average type [0...3], 0=off, 1=10s, 2=60s, 3=300s
|
||||||
String batType;
|
bool trend = true; // Trend indicator [0|1], 0=off, 1=on
|
||||||
bool init = false; // Marker for init done
|
double raw = 0;
|
||||||
uint8_t average = 0; // Average type [0...3], 0=off, 1=10s, 2=60s, 3=300s
|
char mode = 'D'; // display mode (A)nalog | (D)igital
|
||||||
bool trend = true; // Trend indicator [0|1], 0=off, 1=on
|
|
||||||
double raw = 0;
|
|
||||||
char mode = 'D'; // display mode (A)nalog | (D)igital
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageVoltage(CommonData &common) : Page(common)
|
PageVoltage(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageVoltage");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageVoltage");
|
||||||
|
|
||||||
// Get config data
|
|
||||||
batVoltage = config->getString(config->batteryVoltage);
|
|
||||||
batType = config->getString(config->batteryType);
|
|
||||||
|
|
||||||
if (hasFRAM) {
|
if (hasFRAM) {
|
||||||
average = fram.read(FRAM_VOLTAGE_AVG);
|
average = fram.read(FRAM_VOLTAGE_AVG);
|
||||||
trend = fram.read(FRAM_VOLTAGE_TREND);
|
trend = fram.read(FRAM_VOLTAGE_TREND);
|
||||||
@@ -32,18 +23,14 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
~PageVoltage(){
|
virtual void setupKeys(){
|
||||||
logger->logDebug(GwLog::LOG, "Destroy PageVoltage");
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupKeys() {
|
|
||||||
Page::setupKeys();
|
Page::setupKeys();
|
||||||
commonData->keydata[0].label = "AVG";
|
commonData->keydata[0].label = "AVG";
|
||||||
commonData->keydata[1].label = "MODE";
|
commonData->keydata[1].label = "MODE";
|
||||||
commonData->keydata[4].label = "TRD";
|
commonData->keydata[4].label = "TRD";
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleKey(int key) {
|
virtual int handleKey(int key){
|
||||||
// Change average
|
// Change average
|
||||||
if(key == 1){
|
if(key == 1){
|
||||||
average ++;
|
average ++;
|
||||||
@@ -79,41 +66,51 @@ 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) {
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(x, y);
|
getdisplay().setCursor(x, y);
|
||||||
if (prefix) {
|
if (prefix) {
|
||||||
epd->print("Avg: ");
|
getdisplay().print("Avg: ");
|
||||||
}
|
}
|
||||||
switch (average) {
|
switch (average) {
|
||||||
case 0:
|
case 0:
|
||||||
epd->print("1s");
|
getdisplay().print("1s");
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
epd->print("10s");
|
getdisplay().print("10s");
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
epd->print("60s");
|
getdisplay().print("60s");
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
epd->print("300s");
|
getdisplay().print("300s");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
epd->print("1s");
|
getdisplay().print("1s");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void printVoltageSymbol(uint16_t x, uint16_t y, uint16_t color) {
|
void printVoltageSymbol(uint16_t x, uint16_t y, uint16_t color) {
|
||||||
epd->setFont(&Ubuntu_Bold16pt8b);
|
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
||||||
epd->setCursor(x, y);
|
getdisplay().setCursor(x, y);
|
||||||
epd->print("V");
|
getdisplay().print("V");
|
||||||
epd->fillRect(x, y + 6, 22, 3, color);
|
getdisplay().fillRect(x, y + 6, 22, 3, color);
|
||||||
epd->fillRect(x, y + 11, 6, 3, color);
|
getdisplay().fillRect(x, y + 11, 6, 3, color);
|
||||||
epd->fillRect(x + 8, y + 11, 6, 3, color);
|
getdisplay().fillRect(x + 8, y + 11, 6, 3, color);
|
||||||
epd->fillRect(x + 16, y + 11, 6, 3, color);
|
getdisplay().fillRect(x + 16, y + 11, 6, 3, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
|
GwConfigHandler *config = commonData->config;
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String batVoltage = config->getString(config->batteryVoltage);
|
||||||
|
String batType = config->getString(config->batteryType);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
double value1 = 0;
|
double value1 = 0;
|
||||||
double valueTrend = 0; // Average over 10 values
|
double valueTrend = 0; // Average over 10 values
|
||||||
@@ -154,76 +151,76 @@ public:
|
|||||||
bool valid1 = true;
|
bool valid1 = true;
|
||||||
|
|
||||||
// Optical warning by limit violation
|
// Optical warning by limit violation
|
||||||
if (flashLED == "Limit Violation") {
|
if(String(flashLED) == "Limit Violation"){
|
||||||
bool violation = false;
|
// Limits for Pb battery
|
||||||
if (batType == "Pb") {
|
if(String(batType) == "Pb" && (raw < 11.8 || raw > 14.8)){
|
||||||
violation = (raw < 11.8 || raw > 14.8);
|
|
||||||
} else if (batType == "Gel") {
|
|
||||||
violation = (raw < 11.8 || raw > 14.4);
|
|
||||||
} else if (batType == "AGM") {
|
|
||||||
violation = (raw < 11.8 || raw > 14.7);
|
|
||||||
} else if (batType == "LiFePo4") {
|
|
||||||
violation = (raw < 12.0 || raw > 14.6);
|
|
||||||
}
|
|
||||||
if (violation) {
|
|
||||||
setBlinkingLED(true);
|
setBlinkingLED(true);
|
||||||
} else {
|
}
|
||||||
|
if(String(batType) == "Pb" && (raw >= 11.8 && raw <= 14.8)){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
// Limits for Gel battery
|
||||||
|
if(String(batType) == "Gel" && (raw < 11.8 || raw > 14.4)){
|
||||||
|
setBlinkingLED(true);
|
||||||
|
}
|
||||||
|
if(String(batType) == "Gel" && (raw >= 11.8 && raw <= 14.4)){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
// Limits for AGM battery
|
||||||
|
if(String(batType) == "AGM" && (raw < 11.8 || raw > 14.7)){
|
||||||
|
setBlinkingLED(true);
|
||||||
|
}
|
||||||
|
if(String(batType) == "AGM" && (raw >= 11.8 && raw <= 14.7)){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
// Limits for LiFePo4 battery
|
||||||
|
if(String(batType) == "LiFePo4" && (raw < 12.0 || raw > 14.6)){
|
||||||
|
setBlinkingLED(true);
|
||||||
|
}
|
||||||
|
if(String(batType) == "LiFePo4" && (raw >= 12.0 && raw <= 14.6)){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
setFlashLED(false);
|
setFlashLED(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logging voltage value
|
// Logging voltage value
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageVoltage, Type:%s %s:=%f", batType, name1.c_str(), raw);
|
if (raw == 0) return;
|
||||||
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageVoltage, Type:%s %s:=%f", batType, name1.c_str(), raw);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
if (mode == 'D') {
|
if (mode == 'D') {
|
||||||
// Display mode digital
|
// Display mode digital
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
epd->setFont(&Ubuntu_Bold32pt8b);
|
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
||||||
epd->setCursor(20, 100);
|
getdisplay().setCursor(20, 100);
|
||||||
epd->print(name1); // Value name
|
getdisplay().print(name1); // Value name
|
||||||
|
|
||||||
#if defined BOARD_OBP40S3 && defined LIPO_ACCU_1200 && defined VOLTAGE_SENSOR
|
|
||||||
// Show charge status
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(185, 100);
|
|
||||||
if(commonData->data.BatteryChargeStatus == true){
|
|
||||||
epd->print("Charge");
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
epd->print("Discharge");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(270, 100);
|
getdisplay().setCursor(270, 100);
|
||||||
epd->print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show battery type
|
// Show battery type
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(295, 100);
|
getdisplay().setCursor(295, 100);
|
||||||
#ifdef BOARD_OBP60S3
|
getdisplay().print(batType);
|
||||||
epd->print(batType);
|
|
||||||
#endif
|
|
||||||
#if defined BOARD_OBP40S3 && defined LIPO_ACCU_1200 && defined VOLTAGE_SENSOR
|
|
||||||
epd->print("LiPo");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Show average settings
|
// Show average settings
|
||||||
printAvg(average, 320, 84, true);
|
printAvg(average, 320, 84, true);
|
||||||
|
|
||||||
// Reading bus data or using simulation data
|
// Reading bus data or using simulation data
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic60pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic60pt7b);
|
||||||
epd->setCursor(20, 240);
|
getdisplay().setCursor(20, 240);
|
||||||
if(simulation == true){
|
if(simulation == true){
|
||||||
if(batVoltage == "12V"){
|
if(batVoltage == "12V"){
|
||||||
value1 = 12.0;
|
value1 = 12.0;
|
||||||
@@ -232,30 +229,30 @@ public:
|
|||||||
value1 = 24.0;
|
value1 = 24.0;
|
||||||
}
|
}
|
||||||
value1 += float(random(0, 5)) / 10; // Simulation data
|
value1 += float(random(0, 5)) / 10; // Simulation data
|
||||||
epd->print(value1,1);
|
getdisplay().print(value1,1);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Check for valid real data, display also if hold values activated
|
// Check for valid real data, display also if hold values activated
|
||||||
if(valid1 == true || holdvalues == true){
|
if(valid1 == true || holdvalues == true){
|
||||||
// Resolution switching
|
// Resolution switching
|
||||||
if(value1 < 10){
|
if(value1 < 10){
|
||||||
epd->print(value1,2);
|
getdisplay().print(value1,2);
|
||||||
}
|
}
|
||||||
if(value1 >= 10 && value1 < 100){
|
if(value1 >= 10 && value1 < 100){
|
||||||
epd->print(value1,1);
|
getdisplay().print(value1,1);
|
||||||
}
|
}
|
||||||
if(value1 >= 100){
|
if(value1 >= 100){
|
||||||
epd->print(value1,0);
|
getdisplay().print(value1,0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(commonData->fmt->placeholder); // Missing bus data
|
getdisplay().print("---"); // Missing bus data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show trend indicator
|
// Show trend indicator
|
||||||
if(trend == true){
|
if(trend == true){
|
||||||
epd->fillRect(315, 183, 35, 4, commonData->fgcolor); // Draw separator
|
getdisplay().fillRect(315, 183, 35, 4, commonData->fgcolor); // Draw separator
|
||||||
if(int(raw * 10) > int(valueTrend * 10)){
|
if(int(raw * 10) > int(valueTrend * 10)){
|
||||||
displayTrendHigh(320, 174, 11, commonData->fgcolor); // Show high indicator
|
displayTrendHigh(320, 174, 11, commonData->fgcolor); // Show high indicator
|
||||||
}
|
}
|
||||||
@@ -276,9 +273,9 @@ public:
|
|||||||
std::vector<Point> pts;
|
std::vector<Point> pts;
|
||||||
|
|
||||||
// Instrument
|
// Instrument
|
||||||
epd->drawCircleHelper(c.x, c.y, r + 2, 0x01, commonData->fgcolor);
|
getdisplay().drawCircleHelper(c.x, c.y, r + 2, 0x01, commonData->fgcolor);
|
||||||
epd->drawCircleHelper(c.x, c.y, r + 1, 0x01, commonData->fgcolor);
|
getdisplay().drawCircleHelper(c.x, c.y, r + 1, 0x01, commonData->fgcolor);
|
||||||
epd->drawCircleHelper(c.x, c.y, r , 0x01, commonData->fgcolor);
|
getdisplay().drawCircleHelper(c.x, c.y, r , 0x01, commonData->fgcolor);
|
||||||
|
|
||||||
// Scale
|
// Scale
|
||||||
// angle to voltage scale mapping
|
// angle to voltage scale mapping
|
||||||
@@ -291,7 +288,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}
|
||||||
};
|
};
|
||||||
epd->setFont(&Ubuntu_Bold10pt8b);
|
getdisplay().setFont(&Ubuntu_Bold10pt7b);
|
||||||
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);
|
||||||
@@ -301,7 +298,7 @@ public:
|
|||||||
else {
|
else {
|
||||||
p1 = rotatePoint(c, {c.x - r, c.y}, angle);
|
p1 = rotatePoint(c, {c.x - r, c.y}, angle);
|
||||||
p2 = rotatePoint(c, {c.x - r + 6, c.y}, angle);
|
p2 = rotatePoint(c, {c.x - r + 6, c.y}, angle);
|
||||||
epd->drawLine(p1.x, p1.y, p2.x, p2.y, commonData->fgcolor);
|
getdisplay().drawLine(p1.x, p1.y, p2.x, p2.y, commonData->fgcolor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -341,36 +338,37 @@ public:
|
|||||||
fillPoly4(rotatePoints(c, pts, angle), commonData->fgcolor);
|
fillPoly4(rotatePoints(c, pts, angle), commonData->fgcolor);
|
||||||
|
|
||||||
// base
|
// base
|
||||||
epd->fillCircle(c.x, c.y, 7, commonData->fgcolor);
|
getdisplay().fillCircle(c.x, c.y, 7, commonData->fgcolor);
|
||||||
epd->fillCircle(c.x, c.y, 4, commonData->bgcolor);
|
getdisplay().fillCircle(c.x, c.y, 4, commonData->bgcolor);
|
||||||
|
|
||||||
// Symbol
|
// Symbol
|
||||||
printVoltageSymbol(40, 60, commonData->fgcolor);
|
printVoltageSymbol(40, 60, commonData->fgcolor);
|
||||||
|
|
||||||
// Additional information at right side
|
// Additional information at right side
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(300, 60);
|
getdisplay().setCursor(300, 60);
|
||||||
epd->print("Source:");
|
getdisplay().print("Source:");
|
||||||
epd->setCursor(300, 80);
|
getdisplay().setCursor(300, 80);
|
||||||
epd->print(name1);
|
getdisplay().print(name1);
|
||||||
|
|
||||||
epd->setCursor(300, 110);
|
getdisplay().setCursor(300, 110);
|
||||||
epd->print("Type:");
|
getdisplay().print("Type:");
|
||||||
epd->setCursor(300, 130);
|
getdisplay().setCursor(300, 130);
|
||||||
epd->print(batType);
|
getdisplay().print(batType);
|
||||||
|
|
||||||
epd->setCursor(300, 160);
|
getdisplay().setCursor(300, 160);
|
||||||
epd->print("Avg:");
|
getdisplay().print("Avg:");
|
||||||
printAvg(average, 300, 180, false);
|
printAvg(average, 300, 180, false);
|
||||||
|
|
||||||
// FRAM indicator
|
// FRAM indicator
|
||||||
if (hasFRAM) {
|
if (hasFRAM) {
|
||||||
epd->drawXBitmap(300, 240, fram_bits, icon_width, icon_height, commonData->fgcolor);
|
getdisplay().drawXBitmap(300, 240, fram_bits, icon_width, icon_height, commonData->fgcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -385,11 +383,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
|
||||||
|
|||||||
@@ -1,58 +1,31 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
#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
|
||||||
{
|
{
|
||||||
private:
|
public:
|
||||||
char mode = 'W'; // display mode (W)hite | (L)ogo | (M)FD logo
|
PageWhite(CommonData &common){
|
||||||
|
commonData = &common;
|
||||||
public:
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageWhite");
|
||||||
PageWhite(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageWhite");
|
|
||||||
refreshtime = 15000;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleKey(int key) {
|
virtual void displayPage(PageData &pageData){
|
||||||
// Change display mode
|
GwConfigHandler *config = commonData->config;
|
||||||
if (key == 1) {
|
GwLog *logger = commonData->logger;
|
||||||
if (mode == 'W') {
|
|
||||||
mode = 'L';
|
|
||||||
} else if (mode == 'L') {
|
|
||||||
mode = 'M';
|
|
||||||
} else {
|
|
||||||
mode = 'W';
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
// Get config data
|
||||||
#ifdef BOARD_OBP60S3
|
String flashLED = config->getString(config->flashLED);
|
||||||
// Clear optical warning
|
|
||||||
if (flashLED == "Limit Violation") {
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
setFlashLED(false);
|
setFlashLED(false);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageWhite");
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageWhite");
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
@@ -61,28 +34,11 @@ public:
|
|||||||
int bgcolor = GxEPD_WHITE;
|
int bgcolor = GxEPD_WHITE;
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
if (mode == 'W') {
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
epd->setFullWindow();
|
|
||||||
} else {
|
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mode == 'L') {
|
// Update display
|
||||||
epd->drawXBitmap(0, 0, OBP_400x300_bits, OBP_400x300_width, OBP_400x300_height, commonData->fgcolor);
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
} else if (mode == 'M') {
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
epd->drawXBitmap(0, 0, OBP60_400x300_bits, OBP60_400x300_width, OBP60_400x300_height, commonData->fgcolor);
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
epd->drawXBitmap(0, 0, OBP40_400x300_bits, OBP40_400x300_width, OBP40_400x300_height, commonData->fgcolor);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int ret = PAGE_UPDATE;
|
|
||||||
if (mode == 'W') {
|
|
||||||
ret |= PAGE_HIBERNATE;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,9 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
#include "N2kMessages.h"
|
#include "N2kMessages.h"
|
||||||
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
#include "BoatDataCalibration.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define front_width 120
|
#define front_width 120
|
||||||
#define front_height 162
|
#define front_height 162
|
||||||
static unsigned char front_bits[] PROGMEM = {
|
static unsigned char front_bits[] PROGMEM = {
|
||||||
@@ -218,21 +213,15 @@ static unsigned char front_bits[] PROGMEM = {
|
|||||||
|
|
||||||
class PageWind : public Page
|
class PageWind : public Page
|
||||||
{
|
{
|
||||||
private:
|
bool keylock = false; // Keylock
|
||||||
String lengthformat;
|
int8_t lp = 80; // Pointer length
|
||||||
bool keylock = false; // Keylock
|
char mode = 'N'; // page mode (N)ormal | (L)ens | e(X)ample
|
||||||
int8_t lp = 80; // Pointer length
|
char source = 'A'; // data source (A)pparent | (T)rue
|
||||||
char mode = 'N'; // page mode (N)ormal | (L)ens | e(X)ample
|
|
||||||
char source = 'A'; // data source (A)pparent | (T)rue
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageWind(CommonData &common) : Page(common)
|
PageWind(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageWind");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageWind");
|
||||||
|
|
||||||
// Get config data
|
|
||||||
lengthformat = config->getString(config->lengthFormat);
|
|
||||||
|
|
||||||
if (hasFRAM) {
|
if (hasFRAM) {
|
||||||
lp = fram.read(FRAM_WIND_SIZE);
|
lp = fram.read(FRAM_WIND_SIZE);
|
||||||
source = fram.read(FRAM_WIND_SRC);
|
source = fram.read(FRAM_WIND_SRC);
|
||||||
@@ -240,7 +229,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupKeys() {
|
virtual void setupKeys(){
|
||||||
Page::setupKeys();
|
Page::setupKeys();
|
||||||
commonData->keydata[0].label = "MODE";
|
commonData->keydata[0].label = "MODE";
|
||||||
if (mode == 'X') {
|
if (mode == 'X') {
|
||||||
@@ -252,7 +241,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Key functions
|
// Key functions
|
||||||
int handleKey(int key) {
|
virtual int handleKey(int key){
|
||||||
|
|
||||||
if(key == 1){ // Mode switch
|
if(key == 1){ // Mode switch
|
||||||
if(mode == 'N'){
|
if(mode == 'N'){
|
||||||
@@ -306,23 +295,23 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayPage(PageData &pageData)
|
||||||
#ifdef BOARD_OBP60S3
|
{
|
||||||
// Clear optical warning
|
GwConfigHandler *config = commonData->config;
|
||||||
if (flashLED == "Limit Violation") {
|
GwLog *logger = commonData->logger;
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
static String svalue1old = "";
|
static String svalue1old = "";
|
||||||
static String unit1old = "";
|
static String unit1old = "";
|
||||||
static String svalue2old = "";
|
static String svalue2old = "";
|
||||||
static String unit2old = "";
|
static String unit2old = "";
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
// bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
GwApi::BoatValue *bvalue1; // Value 1 for speed on top
|
GwApi::BoatValue *bvalue1; // Value 1 for speed on top
|
||||||
GwApi::BoatValue *bvalue2; // Value 2 for angle on bottom
|
GwApi::BoatValue *bvalue2; // Value 2 for angle on bottom
|
||||||
|
|
||||||
@@ -334,13 +323,10 @@ public:
|
|||||||
}
|
}
|
||||||
String name1 = bvalue1->getName().c_str(); // Value name
|
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue1 = commonData->fmt->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 = commonData->fmt->formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Get boat values for angle (AWD/TWD)
|
// Get boat values for angle (AWD/TWD)
|
||||||
if (source == 'A') {
|
if (source == 'A') {
|
||||||
@@ -350,73 +336,73 @@ public:
|
|||||||
}
|
}
|
||||||
String name2 = bvalue2->getName().c_str(); // Value name
|
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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) {
|
String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
value2 = 0.62731; // some random value
|
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
}
|
}
|
||||||
String svalue2 = commonData->fmt->formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
|
||||||
String unit2 = commonData->fmt->formatValue(bvalue2, *commonData).unit; // Unit of value
|
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
if (bvalue1 == NULL) return;
|
||||||
logger->logDebug(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
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
|
|
||||||
if (mode == 'X') {
|
if (mode == 'X') {
|
||||||
// Original example code with scaling circle
|
// Original example code with scaling circle
|
||||||
|
|
||||||
// Show values AWS/TWS
|
// Show values AWS/TWS
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 50);
|
getdisplay().setCursor(20, 50);
|
||||||
epd->print(name1); // Value name
|
getdisplay().print(name1); // Value name
|
||||||
epd->print(": ");
|
getdisplay().print(": ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue1); // Value
|
getdisplay().print(svalue1); // Value
|
||||||
epd->print(" ");
|
getdisplay().print(" ");
|
||||||
epd->print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue1old); // Value old
|
getdisplay().print(svalue1old); // Value old
|
||||||
epd->print(" ");
|
getdisplay().print(" ");
|
||||||
epd->print(unit1old); // Unit old
|
getdisplay().print(unit1old); // Unit old
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show values AWD/TWD
|
// Show values AWD/TWD
|
||||||
epd->setFont(&Ubuntu_Bold20pt8b);
|
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
||||||
epd->setCursor(20, 260);
|
getdisplay().setCursor(20, 260);
|
||||||
epd->print(name2); // Value name
|
getdisplay().print(name2); // Value name
|
||||||
epd->print(": ");
|
getdisplay().print(": ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
epd->print(svalue2); // Value
|
getdisplay().print(svalue2); // Value
|
||||||
epd->print(" ");
|
getdisplay().print(" ");
|
||||||
epd->print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(svalue2old); // Value old
|
getdisplay().print(svalue2old); // Value old
|
||||||
epd->print(" ");
|
getdisplay().print(" ");
|
||||||
epd->print(unit2old); // Unit old
|
getdisplay().print(unit2old); // Unit old
|
||||||
}
|
}
|
||||||
|
|
||||||
Point c = {200, 145};
|
Point c = {200, 145};
|
||||||
|
|
||||||
// Draw instrument
|
// Draw instrument
|
||||||
epd->fillCircle(c.x, c.y, lp + 5, commonData->fgcolor);
|
getdisplay().fillCircle(c.x, c.y, lp + 5, commonData->fgcolor);
|
||||||
epd->fillCircle(c.x, c.y, lp + 1, commonData->bgcolor);
|
getdisplay().fillCircle(c.x, c.y, lp + 1, commonData->bgcolor);
|
||||||
|
|
||||||
// Wind pointer
|
// Wind pointer
|
||||||
if (bvalue2->valid or simulation) {
|
if (bvalue2->valid) {
|
||||||
uint8_t lp0 = lp * 0.6; // effective pointer outside size
|
uint8_t lp0 = lp * 0.6; // effective pointer outside size
|
||||||
uint8_t lp1 = lp * 0.4; // effective pointer inside size
|
uint8_t lp1 = lp * 0.4; // effective pointer inside size
|
||||||
// zero position
|
// zero position
|
||||||
@@ -428,7 +414,7 @@ public:
|
|||||||
};
|
};
|
||||||
fillPoly4(rotatePoints(c, pts, RadToDeg(value2)), commonData->fgcolor);
|
fillPoly4(rotatePoints(c, pts, RadToDeg(value2)), commonData->fgcolor);
|
||||||
} else {
|
} else {
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
drawTextCenter(c.x, c.y, "no data");
|
drawTextCenter(c.x, c.y, "no data");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -446,7 +432,7 @@ public:
|
|||||||
};
|
};
|
||||||
int angle;
|
int angle;
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
|
|
||||||
// starbord
|
// starbord
|
||||||
// text with line
|
// text with line
|
||||||
@@ -461,7 +447,7 @@ public:
|
|||||||
for (int i = 30; i < 138; i += 6) {
|
for (int i = 30; i < 138; i += 6) {
|
||||||
if (i % 15 != 0) {
|
if (i % 15 != 0) {
|
||||||
p = rotatePoint(c, {c.x, c.y - r + 5}, i);
|
p = rotatePoint(c, {c.x, c.y - r + 5}, i);
|
||||||
epd->fillCircle(p.x, p.y, 2, commonData->fgcolor);
|
getdisplay().fillCircle(p.x, p.y, 2, commonData->fgcolor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -478,21 +464,21 @@ public:
|
|||||||
for (int i = 228; i < 330; i += 6) {
|
for (int i = 228; i < 330; i += 6) {
|
||||||
if (i % 15 != 0) {
|
if (i % 15 != 0) {
|
||||||
p = rotatePoint(c, {c.x, c.y - r + 5}, i);
|
p = rotatePoint(c, {c.x, c.y - r + 5}, i);
|
||||||
epd->fillCircle(p.x, p.y, 2, commonData->fgcolor);
|
getdisplay().fillCircle(p.x, p.y, 2, commonData->fgcolor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// data source
|
// data source
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(8, 50);
|
getdisplay().setCursor(8, 50);
|
||||||
if (source == 'A') {
|
if (source == 'A') {
|
||||||
epd->print("APP");
|
getdisplay().print("APP");
|
||||||
} else {
|
} else {
|
||||||
epd->print("TRUE");
|
getdisplay().print("TRUE");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wind pointer (angle)
|
// Wind pointer (angle)
|
||||||
if (bvalue2->valid or simulation) {
|
if (bvalue2->valid) {
|
||||||
float alpha = RadToDeg(value2);
|
float alpha = RadToDeg(value2);
|
||||||
bool port = (alpha > 180);
|
bool port = (alpha > 180);
|
||||||
if (port) {
|
if (port) {
|
||||||
@@ -508,7 +494,7 @@ public:
|
|||||||
alpha *= -1;
|
alpha *= -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
epd->fillCircle(c.x, c.y, 8, commonData->fgcolor);
|
getdisplay().fillCircle(c.x, c.y, 8, commonData->fgcolor);
|
||||||
pts = {
|
pts = {
|
||||||
{c.x - 1, c.y - (r - 20)},
|
{c.x - 1, c.y - (r - 20)},
|
||||||
{c.x + 1, c.y - (r - 20)},
|
{c.x + 1, c.y - (r - 20)},
|
||||||
@@ -516,39 +502,39 @@ public:
|
|||||||
{c.x - 6, c.y + 15}
|
{c.x - 6, c.y + 15}
|
||||||
};
|
};
|
||||||
fillPoly4(rotatePoints(c, pts, alpha), commonData->fgcolor);
|
fillPoly4(rotatePoints(c, pts, alpha), commonData->fgcolor);
|
||||||
epd->fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
||||||
} else {
|
} else {
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
drawTextCenter(c.x, c.y, "no data");
|
drawTextCenter(c.x, c.y, "no data");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wind speed as decimal number
|
// Wind speed as decimal number
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(150, 250);
|
getdisplay().setCursor(150, 250);
|
||||||
if (holdvalues == false) {
|
if (holdvalues == false) {
|
||||||
epd->print(svalue1);
|
getdisplay().print(svalue1);
|
||||||
} else {
|
} else {
|
||||||
epd->print(svalue1old);
|
getdisplay().print(svalue1old);
|
||||||
}
|
}
|
||||||
// unit
|
// unit
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(220, 265);
|
getdisplay().setCursor(220, 265);
|
||||||
epd->print("kts");
|
getdisplay().print("kts");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Normal mode
|
// Normal mode
|
||||||
|
|
||||||
// data source
|
// data source
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(8, 50);
|
getdisplay().setCursor(8, 50);
|
||||||
if (source == 'A') {
|
if (source == 'A') {
|
||||||
epd->print("APP");
|
getdisplay().print("APP");
|
||||||
} else {
|
} else {
|
||||||
epd->print("TRUE");
|
getdisplay().print("TRUE");
|
||||||
}
|
}
|
||||||
|
|
||||||
// draw ship front symbol (as bitmap)
|
// draw ship front symbol (as bitmap)
|
||||||
epd->drawXBitmap(140, 30, front_bits, front_width, front_height, commonData->fgcolor);
|
getdisplay().drawXBitmap(140, 30, front_bits, front_width, front_height, commonData->fgcolor);
|
||||||
|
|
||||||
Point c = {200, 155};
|
Point c = {200, 155};
|
||||||
uint16_t r = 150;
|
uint16_t r = 150;
|
||||||
@@ -573,7 +559,7 @@ public:
|
|||||||
for (int i = 30; i < 150; i += 10) {
|
for (int i = 30; i < 150; i += 10) {
|
||||||
if (i % 30 != 0) {
|
if (i % 30 != 0) {
|
||||||
p = rotatePoint(c, {c.x, c.y - r + 5}, i);
|
p = rotatePoint(c, {c.x, c.y - r + 5}, i);
|
||||||
epd->fillCircle(p.x, p.y, 3, commonData->fgcolor);
|
getdisplay().fillCircle(p.x, p.y, 3, commonData->fgcolor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -590,27 +576,27 @@ public:
|
|||||||
for (int i = 210; i < 340; i += 10) {
|
for (int i = 210; i < 340; i += 10) {
|
||||||
if (i % 30 != 0) {
|
if (i % 30 != 0) {
|
||||||
p = rotatePoint(c, {c.x, c.y - r + 5}, i);
|
p = rotatePoint(c, {c.x, c.y - r + 5}, i);
|
||||||
epd->fillCircle(p.x, p.y, 3, commonData->fgcolor);
|
getdisplay().fillCircle(p.x, p.y, 3, commonData->fgcolor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wind speed as decimal number
|
// Wind speed as decimal number
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(150, 250);
|
getdisplay().setCursor(150, 250);
|
||||||
if (holdvalues == false) {
|
if (holdvalues == false) {
|
||||||
epd->print(svalue1);
|
getdisplay().print(svalue1);
|
||||||
} else {
|
} else {
|
||||||
epd->print(svalue1old);
|
getdisplay().print(svalue1old);
|
||||||
}
|
}
|
||||||
// unit
|
// unit
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(220, 265);
|
getdisplay().setCursor(220, 265);
|
||||||
epd->print("kts");
|
getdisplay().print("kts");
|
||||||
|
|
||||||
// Wind pointer (angle)
|
// Wind pointer (angle)
|
||||||
if (bvalue2->valid or simulation) {
|
if (bvalue2->valid) {
|
||||||
float alpha = RadToDeg(value2);
|
float alpha = RadToDeg(value2);
|
||||||
epd->fillCircle(c.x, c.y, 8, commonData->fgcolor);
|
getdisplay().fillCircle(c.x, c.y, 8, commonData->fgcolor);
|
||||||
pts = {
|
pts = {
|
||||||
{c.x - 1, c.y - (r - 20)},
|
{c.x - 1, c.y - (r - 20)},
|
||||||
{c.x + 1, c.y - (r - 20)},
|
{c.x + 1, c.y - (r - 20)},
|
||||||
@@ -618,15 +604,17 @@ public:
|
|||||||
{c.x - 6, c.y + 15}
|
{c.x - 6, c.y + 15}
|
||||||
};
|
};
|
||||||
fillPoly4(rotatePoints(c, pts, alpha), commonData->fgcolor);
|
fillPoly4(rotatePoints(c, pts, alpha), commonData->fgcolor);
|
||||||
epd->fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
||||||
} else {
|
} else {
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
drawTextCenter(c.x, c.y, "no data");
|
drawTextCenter(c.x, c.y, "no data");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -641,11 +629,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
|
||||||
|
|||||||
@@ -1,519 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#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 {
|
|
||||||
private:
|
|
||||||
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) seconds for approx. 4, 8, 12, 16 min. history chart
|
|
||||||
|
|
||||||
public:
|
|
||||||
PageWindPlot(CommonData& common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageWindPlot");
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
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 {
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// Clear optical warning
|
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#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) {
|
|
||||||
|
|
||||||
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: 960 values for appox. 16 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
|
|
||||||
|
|
||||||
logger->logDebug(GwLog::LOG, "Display PageWindPlot");
|
|
||||||
ulong timer = millis();
|
|
||||||
|
|
||||||
if (!isInitialized) {
|
|
||||||
width = epd->width();
|
|
||||||
height = epd->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
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
logger->logDebug(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);
|
|
||||||
logger->logDebug(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);
|
|
||||||
logger->logDebug(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
|
|
||||||
epd->setPartialWindow(0, 0, width, height); // Set partial update
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
|
||||||
|
|
||||||
// chart lines
|
|
||||||
epd->fillRect(0, yOffset, width, 2, commonData->fgcolor);
|
|
||||||
epd->fillRect(xCenter, yOffset, 1, cHeight, commonData->fgcolor);
|
|
||||||
|
|
||||||
// chart labels
|
|
||||||
char sWndLbl[4]; // char buffer for Wind angle label
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(xCenter - 88, yOffset - 3);
|
|
||||||
epd->print(wdName); // Wind data name
|
|
||||||
snprintf(sWndLbl, 4, "%03d", (wndCenter < 0) ? (wndCenter + 360) : wndCenter);
|
|
||||||
drawTextCenter(xCenter, yOffset - 11, sWndLbl);
|
|
||||||
epd->drawCircle(xCenter + 25, yOffset - 17, 2, commonData->fgcolor); // <degree> symbol
|
|
||||||
epd->drawCircle(xCenter + 25, yOffset - 17, 3, commonData->fgcolor); // <degree> symbol
|
|
||||||
epd->setCursor(1, yOffset - 3);
|
|
||||||
snprintf(sWndLbl, 4, "%03d", (wndLeft < 0) ? (wndLeft + 360) : wndLeft);
|
|
||||||
epd->print(sWndLbl); // Wind left value
|
|
||||||
epd->drawCircle(46, yOffset - 17, 2, commonData->fgcolor); // <degree> symbol
|
|
||||||
epd->drawCircle(46, yOffset - 17, 3, commonData->fgcolor); // <degree> symbol
|
|
||||||
epd->setCursor(width - 50, yOffset - 3);
|
|
||||||
snprintf(sWndLbl, 4, "%03d", (wndRight < 0) ? (wndRight + 360) : wndRight);
|
|
||||||
epd->print(sWndLbl); // Wind right value
|
|
||||||
epd->drawCircle(width - 5, yOffset - 17, 2, commonData->fgcolor); // <degree> symbol
|
|
||||||
epd->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] && !simulation) {
|
|
||||||
// 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)
|
|
||||||
logger->logDebug(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;
|
|
||||||
epd->drawLine(prevX, prevY, xSplit, y, commonData->fgcolor);
|
|
||||||
epd->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
|
|
||||||
epd->drawLine(prevX, prevY, x, y, commonData->fgcolor);
|
|
||||||
epd->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;
|
|
||||||
logger->logDebug(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);
|
|
||||||
}
|
|
||||||
logger->logDebug(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 = commonData->fmt->formatValue(wsBVal, *commonData).svalue; // value (string)
|
|
||||||
wsUnit = commonData->fmt->formatValue(wsBVal, *commonData).unit; // Unit of value
|
|
||||||
epd->fillRect(xPosTws - 4, yPosTws - 38, 142, 44, commonData->bgcolor); // Clear area for TWS value
|
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic16pt7b);
|
|
||||||
epd->setCursor(xPosTws, yPosTws);
|
|
||||||
epd->print(swsValue); // Value
|
|
||||||
/* if (!wsBVal->valid) {
|
|
||||||
epd->print("--.-");
|
|
||||||
} else {
|
|
||||||
wsValue = wsValue / 10.0 * 1.94384; // Wind speed value in knots
|
|
||||||
if (wsValue < 10.0) {
|
|
||||||
epd->printf("!%3.1f", wsValue); // Value, round to 1 decimal
|
|
||||||
} else {
|
|
||||||
epd->printf("%4.1f", wsValue); // Value, round to 1 decimal
|
|
||||||
}
|
|
||||||
} */
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(xPosTws + 82, yPosTws - 14);
|
|
||||||
epd->print(wsName); // Name
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(xPosTws + 82, yPosTws + 1);
|
|
||||||
epd->print(wsUnit); // Unit
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// No valid data available
|
|
||||||
LOG_DEBUG(GwLog::LOG, "PageWindPlot: No valid data available");
|
|
||||||
epd->setFont(&Ubuntu_Bold10pt8b);
|
|
||||||
epd->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;
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
for (int i = 1; i <= 3; i++) {
|
|
||||||
yPos = yOffset + (i * 60);
|
|
||||||
epd->fillRect(0, yPos, width, 1, commonData->fgcolor);
|
|
||||||
epd->fillRect(0, yPos - 8, 24, 16, commonData->bgcolor); // Clear small area to remove potential chart lines
|
|
||||||
epd->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
|
|
||||||
}
|
|
||||||
epd->printf("%3d", chrtLbl); // Wind value label
|
|
||||||
}
|
|
||||||
|
|
||||||
logger->logDebug(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
|
|
||||||
@@ -1,30 +1,20 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
#include "BoatDataCalibration.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class PageWindRose : public Page
|
class PageWindRose : public Page
|
||||||
{
|
{
|
||||||
private:
|
int16_t lp = 80; // Pointer length
|
||||||
String lengthformat;
|
|
||||||
int16_t lp = 80; // Pointer length
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageWindRose(CommonData &common) : Page(common)
|
PageWindRose(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageWindRose");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageWindRose");
|
||||||
|
|
||||||
// Get config data
|
|
||||||
String lengthformat = config->getString(config->lengthFormat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Key functions
|
// Key functions
|
||||||
int handleKey(int key) {
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -33,179 +23,216 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
#ifdef BOARD_OBP60S3
|
GwConfigHandler *config = commonData->config;
|
||||||
// Clear optical warning
|
GwLog *logger = commonData->logger;
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
|
static String svalue1old = "";
|
||||||
|
static String unit1old = "";
|
||||||
|
static String svalue2old = "";
|
||||||
|
static String unit2old = "";
|
||||||
|
static String svalue3old = "";
|
||||||
|
static String unit3old = "";
|
||||||
|
static String svalue4old = "";
|
||||||
|
static String unit4old = "";
|
||||||
|
static String svalue5old = "";
|
||||||
|
static String unit5old = "";
|
||||||
|
static String svalue6old = "";
|
||||||
|
static String unit6old = "";
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
|
// Get boat values for AWA
|
||||||
|
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (only one value by PageOneValue)
|
||||||
|
String name1 = xdrDelete(bvalue1->getName()); // Value name
|
||||||
|
name1 = name1.substring(0, 6); // String length limit for value name
|
||||||
|
double value1 = bvalue1->value; // Value as double in SI unit
|
||||||
|
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 unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
|
if(valid1 == true){
|
||||||
|
svalue1old = svalue1; // Save old value
|
||||||
|
unit1old = unit1; // Save old unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get boat values for AWS
|
||||||
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // First element in list (only one value by PageOneValue)
|
||||||
|
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
||||||
|
name2 = name2.substring(0, 6); // String length limit for value name
|
||||||
|
double value2 = bvalue2->value; // Value as double in SI unit
|
||||||
|
bool valid2 = bvalue2->valid; // Valid information
|
||||||
|
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
|
||||||
|
if(valid2 == true){
|
||||||
|
svalue2old = svalue2; // Save old value
|
||||||
|
unit2old = unit2; // Save old unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get boat values TWD
|
||||||
|
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue)
|
||||||
|
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
||||||
|
name3 = name3.substring(0, 6); // String length limit for value name
|
||||||
|
double value3 = bvalue3->value; // Value as double in SI unit
|
||||||
|
bool valid3 = bvalue3->valid; // Valid information
|
||||||
|
String svalue3 = formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
|
String unit3 = formatValue(bvalue3, *commonData).unit; // Unit of value
|
||||||
|
if(valid3 == true){
|
||||||
|
svalue3old = svalue3; // Save old value
|
||||||
|
unit3old = unit3; // Save old unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get boat values TWS
|
||||||
|
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Second element in list (only one value by PageOneValue)
|
||||||
|
String name4 = xdrDelete(bvalue4->getName()); // Value name
|
||||||
|
name4 = name4.substring(0, 6); // String length limit for value name
|
||||||
|
double value4 = bvalue4->value; // Value as double in SI unit
|
||||||
|
bool valid4 = bvalue4->valid; // Valid information
|
||||||
|
String svalue4 = formatValue(bvalue4, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
|
String unit4 = formatValue(bvalue4, *commonData).unit; // Unit of value
|
||||||
|
if(valid4 == true){
|
||||||
|
svalue4old = svalue4; // Save old value
|
||||||
|
unit4old = unit4; // Save old unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get boat values DBT
|
||||||
|
GwApi::BoatValue *bvalue5 = pageData.values[4]; // Second element in list (only one value by PageOneValue)
|
||||||
|
String name5 = xdrDelete(bvalue5->getName()); // Value name
|
||||||
|
name5 = name5.substring(0, 6); // String length limit for value name
|
||||||
|
double value5 = bvalue5->value; // Value as double in SI unit
|
||||||
|
bool valid5 = bvalue5->valid; // Valid information
|
||||||
|
String svalue5 = formatValue(bvalue5, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
|
String unit5 = formatValue(bvalue5, *commonData).unit; // Unit of value
|
||||||
|
if(valid5 == true){
|
||||||
|
svalue5old = svalue5; // Save old value
|
||||||
|
unit5old = unit5; // Save old unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get boat values STW
|
||||||
|
GwApi::BoatValue *bvalue6 = pageData.values[5]; // Second element in list (only one value by PageOneValue)
|
||||||
|
String name6 = xdrDelete(bvalue6->getName()); // Value name
|
||||||
|
name6 = name6.substring(0, 6); // String length limit for value name
|
||||||
|
double value6 = bvalue6->value; // Value as double in SI unit
|
||||||
|
bool valid6 = bvalue6->valid; // Valid information
|
||||||
|
String svalue6 = formatValue(bvalue6, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
|
String unit6 = formatValue(bvalue6, *commonData).unit; // Unit of value
|
||||||
|
if(valid6 == true){
|
||||||
|
svalue6old = svalue6; // Save old value
|
||||||
|
unit6old = unit6; // Save old unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
setFlashLED(false);
|
setFlashLED(false);
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
// storage for hold valued
|
|
||||||
static FormattedData bvf_awa_old;
|
|
||||||
static FormattedData bvf_aws_old;
|
|
||||||
static FormattedData bvf_twd_old;
|
|
||||||
static FormattedData bvf_tws_old;
|
|
||||||
static FormattedData bvf_dbt_old;
|
|
||||||
static FormattedData bvf_stw_old;
|
|
||||||
|
|
||||||
// Get boat value for AWA
|
|
||||||
GwApi::BoatValue *bv_awa = pageData.values[0]; // First element in list
|
|
||||||
String name_awa = xdrDelete(bv_awa->getName(), 6); // get name without prefix and limit length
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bv_awa, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
FormattedData bvf_awa = commonData->fmt->formatValue(bv_awa, *commonData);
|
|
||||||
if (bv_awa->valid) { // Save formatted data for hold feature
|
|
||||||
bvf_awa_old = bvf_awa;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat value for AWS
|
// Logging boat values
|
||||||
GwApi::BoatValue *bv_aws = pageData.values[1]; // Second element in list
|
if (bvalue1 == NULL) return;
|
||||||
String name_aws = xdrDelete(bv_aws->getName(), 6); // get name without prefix and limit length
|
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);
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bv_aws, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
FormattedData bvf_aws = commonData->fmt->formatValue(bv_aws, *commonData);
|
|
||||||
if (bv_aws->valid) { // Save formatted data for hold feature
|
|
||||||
bvf_aws_old = bvf_aws;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get boat value for TWD
|
|
||||||
GwApi::BoatValue *bv_twd = pageData.values[2]; // Third element in list
|
|
||||||
String name_twd = xdrDelete(bv_twd->getName(), 6); // get name without prefix and limit length
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bv_twd, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
FormattedData bvf_twd = commonData->fmt->formatValue(bv_twd, *commonData);
|
|
||||||
if (bv_twd->valid) { // Save formatted data for hold feature
|
|
||||||
bvf_twd_old = bvf_twd;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get boat value for TWS
|
|
||||||
GwApi::BoatValue *bv_tws = pageData.values[3]; // Fourth element in list
|
|
||||||
String name_tws = xdrDelete(bv_tws->getName(), 6); // get name without prefix and limit length
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bv_tws, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
FormattedData bvf_tws = commonData->fmt->formatValue(bv_tws, *commonData);
|
|
||||||
if (bv_tws->valid) { // Save formatted data for hold feature
|
|
||||||
bvf_tws_old = bvf_tws;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get boat value for DBT
|
|
||||||
GwApi::BoatValue *bv_dbt = pageData.values[4]; // Fifth element in list
|
|
||||||
String name_dbt = xdrDelete(bv_dbt->getName(), 6); // get name without prefix and limit length
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bv_dbt, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
FormattedData bvf_dbt = commonData->fmt->formatValue(bv_dbt, *commonData);
|
|
||||||
if (bv_dbt->valid) { // Save formatted data for hold feature
|
|
||||||
bvf_dbt_old = bvf_dbt;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get boat value for STW
|
|
||||||
GwApi::BoatValue *bv_stw = pageData.values[5]; // Sixth element in list
|
|
||||||
String name_stw = xdrDelete(bv_stw->getName(), 6); // get name without prefix and limit length
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bv_stw, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
FormattedData bvf_stw = commonData->fmt->formatValue(bv_stw, *commonData);
|
|
||||||
if (bv_stw->valid) { // Save formatted data for hold feature
|
|
||||||
bvf_stw_old = bvf_stw;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Log boat values
|
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageWindRose, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f",
|
|
||||||
name_awa.c_str(), bv_awa->value,
|
|
||||||
name_aws.c_str(), bv_aws->value,
|
|
||||||
name_twd.c_str(), bv_twd->value,
|
|
||||||
name_tws.c_str(), bv_tws->value,
|
|
||||||
name_dbt.c_str(), bv_dbt->value,
|
|
||||||
name_stw.c_str(), bv_stw->value);
|
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
// *********************************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height());
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show values AWA
|
// Show values AWA
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
epd->print(holdvalues ? bvf_awa_old.value : bvf_awa.value);
|
getdisplay().print(svalue1); // Value
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(10, 95);
|
getdisplay().setCursor(10, 95);
|
||||||
epd->print(name_awa);
|
getdisplay().print(name1); // Name
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(10, 115);
|
getdisplay().setCursor(10, 115);
|
||||||
epd->print(" ");
|
getdisplay().print(" ");
|
||||||
epd->print(holdvalues ? bvf_awa_old.unit : bvf_awa.unit);
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(unit1); // Unit
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print(unit1old); // Unit
|
||||||
|
}
|
||||||
|
|
||||||
// Horizintal separator left
|
// Horizintal separator left
|
||||||
epd->fillRect(0, 149, 60, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 149, 60, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// Show values AWS
|
// Show values AWS
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(10, 270);
|
getdisplay().setCursor(10, 270);
|
||||||
epd->print(holdvalues ? bvf_aws_old.value : bvf_aws.value);
|
getdisplay().print(svalue2); // Value
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(10, 220);
|
getdisplay().setCursor(10, 220);
|
||||||
epd->print(name_aws);
|
getdisplay().print(name2); // Name
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(10, 190);
|
getdisplay().setCursor(10, 190);
|
||||||
epd->print(" ");
|
getdisplay().print(" ");
|
||||||
epd->print(holdvalues ? bvf_aws_old.unit : bvf_aws.unit);
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(unit2); // Unit
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print(unit2old); // Unit
|
||||||
|
}
|
||||||
|
|
||||||
// Show value TWD
|
// Show values TWD
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(295, 65);
|
getdisplay().setCursor(295, 65);
|
||||||
// TODO WTF? Der Formatter sollte das korrekt machen
|
if(valid3 == true){
|
||||||
if (bv_twd->valid) {
|
getdisplay().print(abs(value3 * 180 / PI), 0); // Value
|
||||||
epd->print(abs(bv_twd->value * 180 / PI), 0); // Value
|
|
||||||
}
|
}
|
||||||
else {
|
else{
|
||||||
epd->print(commonData->fmt->placeholder);
|
getdisplay().print("---"); // Value
|
||||||
|
}
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
|
getdisplay().setCursor(335, 95);
|
||||||
|
getdisplay().print(name3); // Name
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
|
getdisplay().setCursor(335, 115);
|
||||||
|
getdisplay().print(" ");
|
||||||
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(unit3); // Unit
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print(unit3old); // Unit
|
||||||
}
|
}
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(335, 95);
|
|
||||||
epd->print(name_twd); // Name
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(335, 115);
|
|
||||||
epd->print(" ");
|
|
||||||
epd->print(holdvalues ? bvf_twd_old.unit : bvf_twd.unit);
|
|
||||||
|
|
||||||
// Horizintal separator right
|
// Horizintal separator right
|
||||||
epd->fillRect(340, 149, 80, 3, commonData->fgcolor);
|
getdisplay().fillRect(340, 149, 80, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// Show values TWS
|
// Show values TWS
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(295, 270);
|
getdisplay().setCursor(295, 270);
|
||||||
epd->print(name_tws);
|
getdisplay().print(svalue4); // Value
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(335, 220);
|
getdisplay().setCursor(335, 220);
|
||||||
epd->print(holdvalues ? bvf_tws_old.value : bvf_tws.value);
|
getdisplay().print(name4); // Name
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(335, 190);
|
getdisplay().setCursor(335, 190);
|
||||||
epd->print(" ");
|
getdisplay().print(" ");
|
||||||
epd->print(holdvalues ? bvf_tws_old.unit : bvf_tws.unit);
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(unit4); // Unit
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print(unit4old); // Unit
|
||||||
|
}
|
||||||
|
|
||||||
// *********************************************************************
|
//*******************************************************************************************
|
||||||
|
|
||||||
// Draw wind rose
|
// Draw wind rose
|
||||||
int rInstrument = 110; // Radius of grafic instrument
|
int rInstrument = 110; // Radius of grafic instrument
|
||||||
float pi = 3.141592;
|
float pi = 3.141592;
|
||||||
|
|
||||||
epd->fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
||||||
epd->fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
||||||
epd->fillCircle(200, 150, rInstrument - 10, commonData->fgcolor); // Inner circle
|
getdisplay().fillCircle(200, 150, rInstrument - 10, commonData->fgcolor); // Inner circle
|
||||||
epd->fillCircle(200, 150, rInstrument - 13, commonData->bgcolor); // Inner circle
|
getdisplay().fillCircle(200, 150, rInstrument - 13, commonData->bgcolor); // Inner circle
|
||||||
|
|
||||||
for(int i=0; i<360; i=i+10)
|
for(int i=0; i<360; i=i+10)
|
||||||
{
|
{
|
||||||
@@ -213,36 +240,37 @@ 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="0"; break;
|
{
|
||||||
case 30 : ii="30"; break;
|
case 0: ii="0"; break;
|
||||||
case 60 : ii="60"; break;
|
case 30 : ii="30"; break;
|
||||||
case 90 : ii="90"; break;
|
case 60 : ii="60"; break;
|
||||||
case 120 : ii="120"; break;
|
case 90 : ii="90"; break;
|
||||||
case 150 : ii="150"; break;
|
case 120 : ii="120"; break;
|
||||||
case 180 : ii="180"; break;
|
case 150 : ii="150"; break;
|
||||||
case 210 : ii="210"; break;
|
case 180 : ii="180"; break;
|
||||||
case 240 : ii="240"; break;
|
case 210 : ii="210"; break;
|
||||||
case 270 : ii="270"; break;
|
case 240 : ii="240"; break;
|
||||||
case 300 : ii="300"; break;
|
case 270 : ii="270"; break;
|
||||||
case 330 : ii="330"; break;
|
case 300 : ii="300"; break;
|
||||||
default: break;
|
case 330 : ii="330"; break;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print text centered on position x, y
|
// Print text centered on position x, y
|
||||||
int16_t x1, y1; // Return values of getTextBounds
|
int16_t x1, y1; // Return values of getTextBounds
|
||||||
uint16_t w, h; // Return values of getTextBounds
|
uint16_t w, h; // Return values of getTextBounds
|
||||||
epd->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
|
||||||
epd->setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if (i % 30 == 0) {
|
if(i % 30 == 0){
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b); // TODO move out of loop
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->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*pi);
|
||||||
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
||||||
epd->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*pi);
|
||||||
float cosx=cos(i/180.0*pi);
|
float cosx=cos(i/180.0*pi);
|
||||||
|
|
||||||
@@ -253,10 +281,10 @@ public:
|
|||||||
float xx2 = +dx;
|
float xx2 = +dx;
|
||||||
float yy1 = -(rInstrument-10);
|
float yy1 = -(rInstrument-10);
|
||||||
float yy2 = -(rInstrument+10);
|
float yy2 = -(rInstrument+10);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),commonData->fgcolor);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),
|
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),
|
||||||
200+(int)(cosx*xx2-sinx*yy2),150+(int)(sinx*xx2+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*xx2-sinx*yy2),150+(int)(sinx*xx2+cosx*yy2),commonData->fgcolor);
|
||||||
}
|
}
|
||||||
@@ -264,16 +292,16 @@ public:
|
|||||||
|
|
||||||
// Draw wind pointer
|
// Draw wind pointer
|
||||||
float startwidth = 8; // Start width of pointer
|
float startwidth = 8; // Start width of pointer
|
||||||
if (bv_aws->valid || holdvalues || simulation) {
|
if(valid2 == true || holdvalues == true || simulation == true){
|
||||||
float sinx = sin(bv_awa->value); // Wind direction
|
float sinx=sin(value1); // Wind direction
|
||||||
float cosx = cos(bv_awa->value);
|
float cosx=cos(value1);
|
||||||
// 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;
|
||||||
float xx2 = startwidth;
|
float xx2 = startwidth;
|
||||||
float yy1 = -startwidth;
|
float yy1 = -startwidth;
|
||||||
float yy2 = -(rInstrument-15);
|
float yy2 = -(rInstrument-15);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
||||||
// Inverted pointer
|
// Inverted pointer
|
||||||
@@ -283,42 +311,48 @@ public:
|
|||||||
float ix2 = -endwidth;
|
float ix2 = -endwidth;
|
||||||
float iy1 = -(rInstrument-15);
|
float iy1 = -(rInstrument-15);
|
||||||
float iy2 = -endwidth;
|
float iy2 = -endwidth;
|
||||||
epd->fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
getdisplay().fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
||||||
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
||||||
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Center circle
|
// Center circle
|
||||||
epd->fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
||||||
epd->fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
||||||
|
|
||||||
// *********************************************************************
|
//*******************************************************************************************
|
||||||
|
|
||||||
// Show value DBT
|
// Show values DBT
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic16pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
epd->setCursor(160, 200);
|
getdisplay().setCursor(160, 200);
|
||||||
epd->print(holdvalues ? bvf_dbt_old.value : bvf_dbt.value);
|
getdisplay().print(svalue5); // Value
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(190, 215);
|
getdisplay().setCursor(190, 215);
|
||||||
epd->print(" ");
|
getdisplay().print(" ");
|
||||||
epd->print(holdvalues ? bvf_dbt_old.unit : bvf_dbt.unit);
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(unit5); // Unit
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print(unit5old); // Unit
|
||||||
|
}
|
||||||
|
|
||||||
// Show value STW
|
// Show values STW
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic16pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
epd->setCursor(160, 130);
|
getdisplay().setCursor(160, 130);
|
||||||
epd->print(holdvalues ? bvf_stw_old.value : bvf_stw.value);
|
getdisplay().print(svalue6); // Value
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(190, 90);
|
getdisplay().setCursor(190, 90);
|
||||||
epd->print(" ");
|
getdisplay().print(" ");
|
||||||
epd->print(holdvalues ? bvf_stw_old.unit : bvf_stw.unit);
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(unit6); // Unit
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print(unit6old); // Unit
|
||||||
|
}
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
};
|
};
|
||||||
|
|
||||||
void leavePage(PageData &pageData) {
|
|
||||||
logger->logDebug(GwLog::LOG, "Leaving PageWindRose");
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static Page *createPage(CommonData &common){
|
static Page *createPage(CommonData &common){
|
||||||
@@ -332,11 +366,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
|
||||||
|
|||||||
@@ -1,37 +1,20 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
#include "BoatDataCalibration.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class PageWindRoseFlex : public Page
|
class PageWindRoseFlex : public Page
|
||||||
{
|
{
|
||||||
private:
|
int16_t lp = 80; // Pointer length
|
||||||
String lengthformat;
|
|
||||||
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) : Page(common)
|
PageWindRoseFlex(CommonData &common){
|
||||||
{
|
commonData = &common;
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageWindRoseFlex");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageWindRoseFlex");
|
||||||
|
|
||||||
// Get config data
|
|
||||||
lengthformat = config->getString(config->lengthFormat);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupKeys() {
|
|
||||||
Page::setupKeys();
|
|
||||||
commonData->keydata[1].label = "SRC";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Key functions
|
// Key functions
|
||||||
int handleKey(int key) {
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -40,17 +23,9 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
#ifdef BOARD_OBP60S3
|
GwConfigHandler *config = commonData->config;
|
||||||
// Clear optical warning
|
GwLog *logger = commonData->logger;
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
static String svalue1old = "";
|
static String svalue1old = "";
|
||||||
static String unit1old = "";
|
static String unit1old = "";
|
||||||
@@ -65,237 +40,240 @@ public:
|
|||||||
static String svalue6old = "";
|
static String svalue6old = "";
|
||||||
static String unit6old = "";
|
static String unit6old = "";
|
||||||
|
|
||||||
GwApi::BoatValue *bvalue1; // Value 1 for angle
|
// Get config data
|
||||||
GwApi::BoatValue *bvalue2; // Value 2 for speed
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
|
bool simulation = config->getBool(config->useSimuData);
|
||||||
|
bool holdvalues = config->getBool(config->holdvalues);
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
// Get boat value for wind angle (AWA/TWA), shown by pointer
|
// Get boat values for AWA
|
||||||
if (source == 'A') {
|
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (only one value by PageOneValue)
|
||||||
bvalue1 = pageData.values[4];
|
String name1 = xdrDelete(bvalue1->getName()); // Value name
|
||||||
} 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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue1 = commonData->fmt->formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
value1 = formatValue(bvalue1, *commonData).value;// Format only nesaccery for simulation data for pointer
|
||||||
String unit1 = commonData->fmt->formatValue(bvalue1, *commonData).unit; // Unit of value
|
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
if (valid1 == true) {
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
|
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 value for wind speed (AWS/TWS), shown in top left corner
|
// Get boat values for AWS
|
||||||
if (source == 'A') {
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // First element in list (only one value by PageOneValue)
|
||||||
bvalue2 =pageData.values[5];
|
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
||||||
} 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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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) {
|
String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
value2 = 0.62731; // some random value
|
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
||||||
}
|
if(valid2 == true){
|
||||||
String svalue2 = commonData->fmt->formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
|
||||||
String unit2 = commonData->fmt->formatValue(bvalue2, *commonData).unit; // Unit of value
|
|
||||||
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 value for bottom left corner
|
// Get boat values TWD
|
||||||
GwApi::BoatValue *bvalue3 = pageData.values[0];
|
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue)
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue3 = commonData->fmt->formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue3 = formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit3 = commonData->fmt->formatValue(bvalue3, *commonData).unit; // Unit of value
|
String unit3 = formatValue(bvalue3, *commonData).unit; // Unit of value
|
||||||
if(valid3 == true){
|
if(valid3 == true){
|
||||||
svalue3old = svalue3; // Save old value
|
svalue3old = svalue3; // Save old value
|
||||||
unit3old = unit3; // Save old unit
|
unit3old = unit3; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat value for top right corner
|
// Get boat values TWS
|
||||||
GwApi::BoatValue *bvalue4 = pageData.values[1];
|
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Second element in list (only one value by PageOneValue)
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue4, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue4 = commonData->fmt->formatValue(bvalue4, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue4 = formatValue(bvalue4, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit4 = commonData->fmt->formatValue(bvalue4, *commonData).unit; // Unit of value
|
String unit4 = formatValue(bvalue4, *commonData).unit; // Unit of value
|
||||||
if(valid4 == true){
|
if(valid4 == true){
|
||||||
svalue4old = svalue4; // Save old value
|
svalue4old = svalue4; // Save old value
|
||||||
unit4old = unit4; // Save old unit
|
unit4old = unit4; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat value for bottom right corner
|
// Get boat values DBT
|
||||||
GwApi::BoatValue *bvalue5 = pageData.values[2];
|
GwApi::BoatValue *bvalue5 = pageData.values[4]; // Second element in list (only one value by PageOneValue)
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue5, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue5 = commonData->fmt->formatValue(bvalue5, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue5 = formatValue(bvalue5, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit5 = commonData->fmt->formatValue(bvalue5, *commonData).unit; // Unit of value
|
String unit5 = formatValue(bvalue5, *commonData).unit; // Unit of value
|
||||||
if(valid5 == true){
|
if(valid5 == true){
|
||||||
svalue5old = svalue5; // Save old value
|
svalue5old = svalue5; // Save old value
|
||||||
unit5old = unit5; // Save old unit
|
unit5old = unit5; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat value for center
|
// Get boat values STW
|
||||||
GwApi::BoatValue *bvalue6 = pageData.values[3];
|
GwApi::BoatValue *bvalue6 = pageData.values[5]; // Second element in list (only one value by PageOneValue)
|
||||||
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
|
||||||
#ifdef ENABLE_CALIBRATION
|
|
||||||
calibrationData.calibrateInstance(bvalue6, logger); // Check if boat data value is to be calibrated
|
|
||||||
#endif
|
|
||||||
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
|
||||||
String svalue6 = commonData->fmt->formatValue(bvalue6, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue6 = formatValue(bvalue6, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit6 = commonData->fmt->formatValue(bvalue6, *commonData).unit; // Unit of value
|
String unit6 = formatValue(bvalue6, *commonData).unit; // Unit of value
|
||||||
if(valid6 == true){
|
if(valid6 == true){
|
||||||
svalue6old = svalue6; // Save old value
|
svalue6old = svalue6; // Save old value
|
||||||
unit6old = unit6; // Save old unit
|
unit6old = unit6; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
if (bvalue1 == NULL) return;
|
||||||
logger->logDebug(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
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show AWS or TWS top left
|
// Show values AWA
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
epd->print(svalue2); // Value
|
getdisplay().print(svalue1); // Value
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(10, 95);
|
getdisplay().setCursor(10, 95);
|
||||||
epd->print(name2); // Name
|
getdisplay().print(name1); // Name
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(10, 115);
|
getdisplay().setCursor(10, 115);
|
||||||
epd->print(" ");
|
getdisplay().print(" ");
|
||||||
epd->print(holdvalues ? unit2old : unit2);
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(unit1); // Unit
|
||||||
// Horizintal separator left
|
|
||||||
epd->fillRect(0, 149, 60, 3, commonData->fgcolor);
|
|
||||||
|
|
||||||
// Show value 3 (=first user-configured parameter) at bottom left
|
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
|
||||||
epd->setCursor(10, 270);
|
|
||||||
epd->print(svalue3); // Value
|
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(10, 220);
|
|
||||||
epd->print(name3); // Name
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(10, 190);
|
|
||||||
epd->print(" ");
|
|
||||||
epd->print(holdvalues ? unit3old : unit3);
|
|
||||||
|
|
||||||
|
|
||||||
// Show value 4 (=second user-configured parameter) at top right
|
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
|
||||||
epd->setCursor(295, 65);
|
|
||||||
if(valid3 == true){
|
|
||||||
epd->print(svalue4); // Value
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
epd->print(commonData->fmt->placeholder);
|
getdisplay().print(unit1old); // Unit
|
||||||
}
|
}
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
epd->setCursor(335, 95);
|
|
||||||
epd->print(name4); // Name
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(335, 115);
|
|
||||||
epd->print(" ");
|
|
||||||
epd->print(holdvalues ? unit4old : unit4);
|
|
||||||
|
|
||||||
|
// Horizintal separator left
|
||||||
|
getdisplay().fillRect(0, 149, 60, 3, commonData->fgcolor);
|
||||||
|
|
||||||
|
// Show values AWS
|
||||||
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
|
getdisplay().setCursor(10, 270);
|
||||||
|
getdisplay().print(svalue2); // Value
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
|
getdisplay().setCursor(10, 220);
|
||||||
|
getdisplay().print(name2); // Name
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
|
getdisplay().setCursor(10, 190);
|
||||||
|
getdisplay().print(" ");
|
||||||
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(unit2); // Unit
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print(unit2old); // Unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show values TWD
|
||||||
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
|
getdisplay().setCursor(295, 65);
|
||||||
|
if(valid3 == true){
|
||||||
|
// getdisplay().print(abs(value3 * 180 / PI), 0); // Value
|
||||||
|
getdisplay().print(svalue3); // Value
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print("---"); // Value
|
||||||
|
}
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
|
getdisplay().setCursor(335, 95);
|
||||||
|
getdisplay().print(name3); // Name
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
|
getdisplay().setCursor(335, 115);
|
||||||
|
getdisplay().print(" ");
|
||||||
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(unit3); // Unit
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print(unit3old); // Unit
|
||||||
|
}
|
||||||
|
|
||||||
// Horizintal separator right
|
// Horizintal separator right
|
||||||
epd->fillRect(340, 149, 80, 3, commonData->fgcolor);
|
getdisplay().fillRect(340, 149, 80, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// Show value 5 (=third user-configured parameter) at bottom right
|
// Show values TWS
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
epd->setCursor(295, 270);
|
getdisplay().setCursor(295, 270);
|
||||||
epd->print(svalue5); // Value
|
getdisplay().print(svalue4); // Value
|
||||||
epd->setFont(&Ubuntu_Bold12pt8b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
epd->setCursor(335, 220);
|
getdisplay().setCursor(335, 220);
|
||||||
epd->print(name5); // Name
|
getdisplay().print(name4); // Name
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(335, 190);
|
getdisplay().setCursor(335, 190);
|
||||||
epd->print(" ");
|
getdisplay().print(" ");
|
||||||
epd->print(holdvalues ? unit5old : unit5);
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(unit4); // Unit
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print(unit4old); // Unit
|
||||||
|
}
|
||||||
|
|
||||||
//*******************************************************************************************
|
//*******************************************************************************************
|
||||||
|
|
||||||
// Draw wind rose
|
// Draw wind rose
|
||||||
int rInstrument = 110; // Radius of grafic instrument
|
int rInstrument = 110; // Radius of grafic instrument
|
||||||
|
float pi = 3.141592;
|
||||||
|
|
||||||
epd->fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
||||||
epd->fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
||||||
epd->fillCircle(200, 150, rInstrument - 10, commonData->fgcolor); // Inner circle
|
getdisplay().fillCircle(200, 150, rInstrument - 10, commonData->fgcolor); // Inner circle
|
||||||
epd->fillCircle(200, 150, rInstrument - 13, commonData->bgcolor); // Inner circle
|
getdisplay().fillCircle(200, 150, rInstrument - 13, commonData->bgcolor); // Inner circle
|
||||||
|
|
||||||
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*M_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*M_PI); // y-coordinate dots
|
float y = 150 - (rInstrument-30)*cos(i/180.0*pi); // y-coordinate dots
|
||||||
const char *ii = "";
|
const char *ii = "";
|
||||||
switch (i) {
|
switch (i)
|
||||||
case 0: ii="0"; break;
|
{
|
||||||
case 30 : ii="30"; break;
|
case 0: ii="0"; break;
|
||||||
case 60 : ii="60"; break;
|
case 30 : ii="30"; break;
|
||||||
case 90 : ii="90"; break;
|
case 60 : ii="60"; break;
|
||||||
case 120 : ii="120"; break;
|
case 90 : ii="90"; break;
|
||||||
case 150 : ii="150"; break;
|
case 120 : ii="120"; break;
|
||||||
case 180 : ii="180"; break;
|
case 150 : ii="150"; break;
|
||||||
case 210 : ii="210"; break;
|
case 180 : ii="180"; break;
|
||||||
case 240 : ii="240"; break;
|
case 210 : ii="210"; break;
|
||||||
case 270 : ii="270"; break;
|
case 240 : ii="240"; break;
|
||||||
case 300 : ii="300"; break;
|
case 270 : ii="270"; break;
|
||||||
case 330 : ii="330"; break;
|
case 300 : ii="300"; break;
|
||||||
default: break;
|
case 330 : ii="330"; break;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print text centered on position x, y
|
// Print text centered on position x, y
|
||||||
int16_t x1, y1; // Return values of getTextBounds
|
int16_t x1, y1; // Return values of getTextBounds
|
||||||
uint16_t w, h; // Return values of getTextBounds
|
uint16_t w, h; // Return values of getTextBounds
|
||||||
epd->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
|
||||||
epd->setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw sub scale with dots
|
// Draw sub scale with dots
|
||||||
float x1c = 200 + rInstrument*sin(i/180.0*M_PI);
|
float x1c = 200 + rInstrument*sin(i/180.0*pi);
|
||||||
float y1c = 150 - rInstrument*cos(i/180.0*M_PI);
|
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
||||||
epd->fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
getdisplay().fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
||||||
float sinx=sin(i/180.0*M_PI);
|
float sinx=sin(i/180.0*pi);
|
||||||
float cosx=cos(i/180.0*M_PI);
|
float cosx=cos(i/180.0*pi);
|
||||||
|
|
||||||
// Draw sub scale with lines (two triangles)
|
// Draw sub scale with lines (two triangles)
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
@@ -304,10 +282,10 @@ public:
|
|||||||
float xx2 = +dx;
|
float xx2 = +dx;
|
||||||
float yy1 = -(rInstrument-10);
|
float yy1 = -(rInstrument-10);
|
||||||
float yy2 = -(rInstrument+10);
|
float yy2 = -(rInstrument+10);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),commonData->fgcolor);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),
|
200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),
|
||||||
200+(int)(cosx*xx2-sinx*yy2),150+(int)(sinx*xx2+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*xx2-sinx*yy2),150+(int)(sinx*xx2+cosx*yy2),commonData->fgcolor);
|
||||||
}
|
}
|
||||||
@@ -323,8 +301,8 @@ public:
|
|||||||
float xx1 = -startwidth;
|
float xx1 = -startwidth;
|
||||||
float xx2 = startwidth;
|
float xx2 = startwidth;
|
||||||
float yy1 = -startwidth;
|
float yy1 = -startwidth;
|
||||||
float yy2 = -(rInstrument-15);
|
float yy2 = -(rInstrument-15);
|
||||||
epd->fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
getdisplay().fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1),
|
||||||
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1),
|
||||||
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),commonData->fgcolor);
|
||||||
// Inverted pointer
|
// Inverted pointer
|
||||||
@@ -334,52 +312,47 @@ public:
|
|||||||
float ix2 = -endwidth;
|
float ix2 = -endwidth;
|
||||||
float iy1 = -(rInstrument-15);
|
float iy1 = -(rInstrument-15);
|
||||||
float iy2 = -endwidth;
|
float iy2 = -endwidth;
|
||||||
epd->fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
getdisplay().fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1),
|
||||||
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1),
|
||||||
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),commonData->fgcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Center circle
|
// Center circle
|
||||||
epd->fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
||||||
epd->fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
||||||
|
|
||||||
//*******************************************************************************************
|
//*******************************************************************************************
|
||||||
|
|
||||||
// Show value6 (=fourth user-configured parameter) and ssource, so that they do not collide with the wind pointer
|
// Show values DBT
|
||||||
if (cos(value1) > 0) {
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
// pointer points upwards
|
getdisplay().setCursor(160, 200);
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic16pt7b);
|
getdisplay().print(svalue5); // Value
|
||||||
epd->setCursor(160, 200);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->print(svalue6); // Value
|
getdisplay().setCursor(190, 215);
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().print(" ");
|
||||||
epd->setCursor(190, 215);
|
if(holdvalues == false){
|
||||||
epd->print(" ");
|
getdisplay().print(unit5); // Unit
|
||||||
epd->print(holdvalues ? unit6old : unit6);
|
|
||||||
if (sin(value1) > 0) {
|
|
||||||
epd->setCursor(160, 130);
|
|
||||||
} else {
|
|
||||||
epd->setCursor(220, 130);
|
|
||||||
}
|
}
|
||||||
epd->print(ssource); // true or app.
|
else{
|
||||||
}
|
getdisplay().print(unit5old); // Unit
|
||||||
else {
|
|
||||||
// pointer points downwards
|
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic16pt7b);
|
|
||||||
epd->setCursor(160, 130);
|
|
||||||
epd->print(svalue6);
|
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
epd->setCursor(190, 90);
|
|
||||||
epd->print(" ");
|
|
||||||
epd->print(holdvalues ? unit6old : unit6);
|
|
||||||
if (sin(value1) > 0) {
|
|
||||||
epd->setCursor(160, 200);
|
|
||||||
} else {
|
|
||||||
epd->setCursor(220, 200);
|
|
||||||
}
|
}
|
||||||
epd->print(ssource); //true or app.
|
|
||||||
}
|
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Show values STW
|
||||||
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
|
getdisplay().setCursor(160, 130);
|
||||||
|
getdisplay().print(svalue6); // Value
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
|
getdisplay().setCursor(190, 90);
|
||||||
|
getdisplay().print(" ");
|
||||||
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(unit6); // Unit
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print(unit6old); // Unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -390,15 +363,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 (4 here)
|
* and we provide the number of user parameters we expect (0 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
|
||||||
4, // Number of bus values depends on selection in Web configuration
|
6, // Number of bus values depends on selection in Web configuration; was zero
|
||||||
{"AWA", "AWS", "TWA", "TWS"}, // fixed values we need in the page. They are inserted AFTER the web-configured values.
|
//{"AWA", "AWS", "COG", "SOG", "TWD", "TWS"}, // Bus values we need in the page, modified for WindRose2
|
||||||
true // Show display header on/off
|
true // Show display header on/off
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
#ifdef BOARD_OBP60S3
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
@@ -29,18 +28,10 @@ static unsigned char ship_bits[] PROGMEM = {
|
|||||||
|
|
||||||
class PageXTETrack : public Page
|
class PageXTETrack : public Page
|
||||||
{
|
{
|
||||||
private:
|
public:
|
||||||
String trackStep;
|
PageXTETrack(CommonData &common){
|
||||||
double seg_step;
|
commonData = &common;
|
||||||
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageXTETrack");
|
||||||
public:
|
|
||||||
PageXTETrack(CommonData &common) : Page(common)
|
|
||||||
{
|
|
||||||
logger->logDebug(GwLog::LOG, "Instantiate PageXTETrack");
|
|
||||||
|
|
||||||
// Get config data
|
|
||||||
String trackStep = config->getString(config->trackStep);
|
|
||||||
seg_step = trackStep.toDouble() * M_PI / 180;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawSegment(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1,
|
void drawSegment(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1,
|
||||||
@@ -49,18 +40,18 @@ public:
|
|||||||
if (fill == true) {
|
if (fill == true) {
|
||||||
// no primitive for quadrangular object
|
// no primitive for quadrangular object
|
||||||
// we create it from 2 triangles
|
// we create it from 2 triangles
|
||||||
epd->fillTriangle(x0, y0, x1, y1, x3, y3, color);
|
getdisplay().fillTriangle(x0, y0, x1, y1, x3, y3, color);
|
||||||
epd->fillTriangle(x1, y1, x2, y2, x3, y3, color);
|
getdisplay().fillTriangle(x1, y1, x2, y2, x3, y3, color);
|
||||||
} else {
|
} else {
|
||||||
// draw outline
|
// draw outline
|
||||||
epd->drawLine(x0, y0, x1, y1, color);
|
getdisplay().drawLine(x0, y0, x1, y1, color);
|
||||||
epd->drawLine(x1, y1, x2, y2, color);
|
getdisplay().drawLine(x1, y1, x2, y2, color);
|
||||||
epd->drawLine(x2, y2, x3, y3, color);
|
getdisplay().drawLine(x2, y2, x3, y3, color);
|
||||||
epd->drawLine(x3, y3, x0, y0, color);
|
getdisplay().drawLine(x3, y3, x0, y0, color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleKey(int key) {
|
virtual int handleKey(int key){
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -69,102 +60,100 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayNew(PageData &pageData) {
|
virtual void displayPage(PageData &pageData){
|
||||||
#ifdef BOARD_OBP60S3
|
GwConfigHandler *config = commonData->config;
|
||||||
// Clear optical warning
|
GwLog *logger = commonData->logger;
|
||||||
if (flashLED == "Limit Violation") {
|
|
||||||
|
// Get config data
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
|
String trackStep = config->getString(config->trackStep);
|
||||||
|
double seg_step = trackStep.toFloat() * PI / 180;
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
setFlashLED(false);
|
setFlashLED(false);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
logger->logDebug(GwLog::LOG, "Drawing at PageXTETrack");
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageXTETrack");
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
epd->setPartialWindow(0, 0, epd->width(), epd->height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
epd->setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// descriptions
|
// descriptions
|
||||||
epd->setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
epd->setCursor(50, 188);
|
getdisplay().setCursor(50, 188);
|
||||||
epd->print("Cross-track error");
|
getdisplay().print("Cross-track error");
|
||||||
epd->setCursor(270, 188);
|
getdisplay().setCursor(270, 188);
|
||||||
epd->print("Track");
|
getdisplay().print("Track");
|
||||||
epd->setCursor(45, 275);
|
getdisplay().setCursor(45, 275);
|
||||||
epd->print("Distance to waypoint");
|
getdisplay().print("Distance to waypoint");
|
||||||
epd->setCursor(260, 275);
|
getdisplay().setCursor(260, 275);
|
||||||
epd->print("Bearing");
|
getdisplay().print("Bearing");
|
||||||
|
|
||||||
// values
|
// values
|
||||||
epd->setFont(&DSEG7Classic_BoldItalic30pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic30pt7b);
|
||||||
|
|
||||||
int16_t x, y;
|
int16_t x, y;
|
||||||
uint16_t w, h;
|
uint16_t w, h;
|
||||||
|
|
||||||
GwApi::BoatValue *bv_xte = pageData.values[0]; // XTE
|
GwApi::BoatValue *bv_xte = pageData.values[0]; // XTE
|
||||||
String sval_xte = commonData->fmt->formatValue(bv_xte, *commonData).svalue;
|
String sval_xte = formatValue(bv_xte, *commonData).svalue;
|
||||||
epd->getTextBounds(sval_xte, 0, 0, &x, &y, &w, &h);
|
getdisplay().getTextBounds(sval_xte, 0, 0, &x, &y, &w, &h);
|
||||||
epd->setCursor(160-w, 170);
|
getdisplay().setCursor(160-w, 170);
|
||||||
epd->print(sval_xte);
|
getdisplay().print(sval_xte);
|
||||||
|
|
||||||
GwApi::BoatValue *bv_cog = pageData.values[1]; // COG
|
GwApi::BoatValue *bv_cog = pageData.values[1]; // COG
|
||||||
String sval_cog = commonData->fmt->formatValue(bv_cog, *commonData).svalue;
|
String sval_cog = formatValue(bv_cog, *commonData).svalue;
|
||||||
epd->getTextBounds(sval_cog, 0, 0, &x, &y, &w, &h);
|
getdisplay().getTextBounds(sval_cog, 0, 0, &x, &y, &w, &h);
|
||||||
epd->setCursor(360-w, 170);
|
getdisplay().setCursor(360-w, 170);
|
||||||
epd->print(sval_cog);
|
getdisplay().print(sval_cog);
|
||||||
|
|
||||||
GwApi::BoatValue *bv_dtw = pageData.values[2]; // DTW
|
GwApi::BoatValue *bv_dtw = pageData.values[2]; // DTW
|
||||||
String sval_dtw = commonData->fmt->formatValue(bv_dtw, *commonData).svalue;
|
String sval_dtw = formatValue(bv_dtw, *commonData).svalue;
|
||||||
epd->getTextBounds(sval_dtw, 0, 0, &x, &y, &w, &h);
|
getdisplay().getTextBounds(sval_dtw, 0, 0, &x, &y, &w, &h);
|
||||||
epd->setCursor(160-w, 257);
|
getdisplay().setCursor(160-w, 257);
|
||||||
epd->print(sval_dtw);
|
getdisplay().print(sval_dtw);
|
||||||
|
|
||||||
GwApi::BoatValue *bv_btw = pageData.values[3]; // BTW
|
GwApi::BoatValue *bv_btw = pageData.values[3]; // BTW
|
||||||
String sval_btw = commonData->fmt->formatValue(bv_btw, *commonData).svalue;
|
String sval_btw = formatValue(bv_btw, *commonData).svalue;
|
||||||
epd->getTextBounds(sval_btw, 0, 0, &x, &y, &w, &h);
|
getdisplay().getTextBounds(sval_btw, 0, 0, &x, &y, &w, &h);
|
||||||
epd->setCursor(360-w, 257);
|
getdisplay().setCursor(360-w, 257);
|
||||||
epd->print(sval_btw);
|
getdisplay().print(sval_btw);
|
||||||
|
|
||||||
GwApi::BoatValue *bv_wpname = pageData.values[4]; // WPName
|
|
||||||
|
|
||||||
bool valid = bv_cog->valid && bv_btw->valid;
|
bool valid = bv_cog->valid && bv_btw->valid;
|
||||||
|
|
||||||
// XTETrack view
|
// XTETrack view
|
||||||
|
|
||||||
// draw ship symbol (as bitmap)
|
// draw ship symbol (as bitmap)
|
||||||
epd->drawXBitmap(184, 68, ship_bits, ship_width, ship_height, commonData->fgcolor);
|
getdisplay().drawXBitmap(184, 68, ship_bits, ship_width, ship_height, commonData->fgcolor);
|
||||||
|
|
||||||
// draw next waypoint name
|
// draw next waypoint name
|
||||||
String sval_wpname = "no data";
|
String sval_wpname = "no data";
|
||||||
|
|
||||||
if (valid) {
|
if (valid) {
|
||||||
sval_wpname = bv_wpname->svalue;
|
sval_wpname = "Tonne 122";
|
||||||
}
|
}
|
||||||
|
|
||||||
epd->setFont(&Ubuntu_Bold10pt8b);
|
getdisplay().setFont(&Ubuntu_Bold10pt7b);
|
||||||
epd->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
|
||||||
// last resort: clip with ellipsis
|
// last resort: clip with ellipsis
|
||||||
epd->setCursor(200 - w / 2, 60);
|
getdisplay().setCursor(200 - w / 2, 60);
|
||||||
epd->print(sval_wpname);
|
getdisplay().print(sval_wpname);
|
||||||
|
|
||||||
// draw course segments
|
// draw course segments
|
||||||
|
|
||||||
double diff;
|
double diff = bv_cog->value - bv_btw->value;
|
||||||
if (!simulation) {
|
|
||||||
diff = bv_cog->value - bv_btw->value;
|
|
||||||
} else {
|
|
||||||
diff = 7.0;
|
|
||||||
}
|
|
||||||
if (diff < -180) {
|
if (diff < -180) {
|
||||||
diff += 360;
|
diff += 360;
|
||||||
} else if (diff > 180) {
|
} else if (diff > 180) {
|
||||||
@@ -208,7 +197,9 @@ public:
|
|||||||
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]);
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
// Update display
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -224,11 +215,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", "WPName"}, // 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
|
||||||
|
|||||||
@@ -1,24 +1,18 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "GwApi.h"
|
#include "GwApi.h"
|
||||||
#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)
|
||||||
@@ -37,8 +31,6 @@ typedef struct{
|
|||||||
double batteryVoltage300 = 0; // Sliding average over 300 values
|
double batteryVoltage300 = 0; // Sliding average over 300 values
|
||||||
double batteryCurrent300 = 0;
|
double batteryCurrent300 = 0;
|
||||||
double batteryPower300 = 0;
|
double batteryPower300 = 0;
|
||||||
double batteryLevelLiPo = 0; // Battery level for OBP40 LiPo accu
|
|
||||||
int BatteryChargeStatus = 0; // LiPo charge status: 0 = discharge, 1 = loading activ
|
|
||||||
double solarVoltage = 0;
|
double solarVoltage = 0;
|
||||||
double solarCurrent = 0;
|
double solarCurrent = 0;
|
||||||
double solarPower = 0;
|
double solarPower = 0;
|
||||||
@@ -49,10 +41,14 @@ typedef struct{
|
|||||||
double airHumidity = 0;
|
double airHumidity = 0;
|
||||||
double airPressure = 0;
|
double airPressure = 0;
|
||||||
double onewireTemp[8] = {0,0,0,0,0,0,0,0};
|
double onewireTemp[8] = {0,0,0,0,0,0,0,0};
|
||||||
double rotationAngle = 0; // Rotation angle in radiant
|
double rotationAngle = 0; // Rotation angle in radiant
|
||||||
bool validRotAngle = false; // Valid flag magnet present for rotation sensor
|
bool validRotAngle = false; // Valid flag magnet present for rotation sensor
|
||||||
struct tm rtcTime; // UTC time from internal RTC
|
int rtcYear = 0; // UTC time
|
||||||
bool rtcValid = false;
|
int rtcMonth = 0;
|
||||||
|
int rtcDay = 0;
|
||||||
|
int rtcHour = 0;
|
||||||
|
int rtcMinute = 0;
|
||||||
|
int rtcSecond = 0;
|
||||||
int sunsetHour = 0;
|
int sunsetHour = 0;
|
||||||
int sunsetMinute = 0;
|
int sunsetMinute = 0;
|
||||||
int sunriseHour = 0;
|
int sunriseHour = 0;
|
||||||
@@ -84,90 +80,39 @@ 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{
|
||||||
uint8_t id; // alarm-id e.g. 01..99 from NMEA0183
|
GwApi::Status status;
|
||||||
AlarmSource source;
|
GwLog *logger=NULL;
|
||||||
String message; // single line of plain text
|
GwConfigHandler *config=NULL;
|
||||||
bool active = false;
|
SensorData data;
|
||||||
uint8_t signal; // how to signal MESSAGE | LED | BUZZER
|
SunData sundata;
|
||||||
uint8_t length_sec; // seconds until alarm disappeares without user interaction
|
TouchKeyData keydata[6];
|
||||||
} AlarmData;
|
BacklightData backlight;
|
||||||
|
GwApi::BoatValue *time=NULL;
|
||||||
typedef struct{
|
GwApi::BoatValue *date=NULL;
|
||||||
int voltage = 0;
|
uint16_t fgcolor;
|
||||||
} AvgData;
|
uint16_t bgcolor;
|
||||||
|
bool keylock = false;
|
||||||
class Formatter; // forward declaration
|
|
||||||
typedef struct{
|
|
||||||
GwApi::Status status;
|
|
||||||
GwLog *logger = nullptr;
|
|
||||||
GwConfigHandler *config = nullptr;
|
|
||||||
Formatter *fmt = nullptr;
|
|
||||||
SensorData data;
|
|
||||||
SunData sundata;
|
|
||||||
TouchKeyData keydata[6];
|
|
||||||
BacklightData backlight;
|
|
||||||
AlarmData alarm;
|
|
||||||
AvgData avgdata;
|
|
||||||
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
|
||||||
class Page{
|
class Page{
|
||||||
protected:
|
protected:
|
||||||
// TODO Future: GwApi *api;
|
|
||||||
CommonData *commonData;
|
CommonData *commonData;
|
||||||
GwConfigHandler *config;
|
public:
|
||||||
GwLog *logger;
|
virtual void displayPage(PageData &pageData)=0;
|
||||||
bool simulation = false;
|
|
||||||
bool holdvalues = false;
|
|
||||||
String flashLED;
|
|
||||||
String backlightMode;
|
|
||||||
public:
|
|
||||||
Page(CommonData &common) {
|
|
||||||
commonData = &common;
|
|
||||||
config = commonData->config;
|
|
||||||
logger = commonData->logger;
|
|
||||||
// preload generic configuration data
|
|
||||||
simulation = config->getBool(config->useSimuData);
|
|
||||||
holdvalues = config->getBool(config->holdvalues);
|
|
||||||
flashLED = config->getString(config->flashLED);
|
|
||||||
backlightMode = config->getString(config->backlight);
|
|
||||||
}
|
|
||||||
int refreshtime = 1000;
|
|
||||||
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
|
|
||||||
commonData->keydata[0].label = "";
|
commonData->keydata[0].label = "";
|
||||||
commonData->keydata[1].label = "";
|
commonData->keydata[1].label = "";
|
||||||
commonData->keydata[2].label = "#LEFT";
|
commonData->keydata[2].label = "#LEFT";
|
||||||
commonData->keydata[3].label = "#RIGHT";
|
commonData->keydata[3].label = "#RIGHT";
|
||||||
commonData->keydata[4].label = "";
|
commonData->keydata[4].label = "";
|
||||||
if ((commonData->backlight.mode == KEY) && !(commonData->powermode == "Min Power")) {
|
if (commonData->backlight.mode == KEY) {
|
||||||
commonData->keydata[5].label = "ILUM";
|
commonData->keydata[5].label = "ILUM";
|
||||||
} else {
|
} else {
|
||||||
commonData->keydata[5].label = "";
|
commonData->keydata[5].label = "";
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
commonData->keydata[0].label = "";
|
|
||||||
commonData->keydata[1].label = "";
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
//return -1 if handled by the page
|
//return -1 if handled by the page
|
||||||
virtual int handleKey(int key){return key;}
|
virtual int handleKey(int key){return key;}
|
||||||
@@ -208,7 +153,18 @@ class PageDescription{
|
|||||||
|
|
||||||
class PageStruct{
|
class PageStruct{
|
||||||
public:
|
public:
|
||||||
Page *page = nullptr;
|
Page *page=NULL;
|
||||||
PageData parameters;
|
PageData parameters;
|
||||||
PageDescription *description = nullptr;
|
PageDescription *description=NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Structure for formated boat values
|
||||||
|
typedef struct{
|
||||||
|
double value;
|
||||||
|
String svalue;
|
||||||
|
String unit;
|
||||||
|
} FormatedData;
|
||||||
|
|
||||||
|
|
||||||
|
// Formater for boat values
|
||||||
|
FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata);
|
||||||
|
|||||||
@@ -1,97 +1,52 @@
|
|||||||
Development information
|
OBP40
|
||||||
=======================
|
=====
|
||||||
|
|
||||||
This file contains some hints concerning building the firmware as well as
|
Important information:
|
||||||
developing and debugging it.
|
|
||||||
|
|
||||||
Coding style
|
***************************************************
|
||||||
------------
|
THIS BRANCH IS NOT INTENDED TO MERGE INTO "master"!
|
||||||
WIP
|
***************************************************
|
||||||
Please format your new code the same as already existing code.
|
|
||||||
|
|
||||||
Some rules:
|
platformio.ini adapted to compile directly. For compile use matching
|
||||||
- Preprocessor directives go to column zero
|
environent:
|
||||||
- Identation is 4 spaces
|
pio run -e obp40
|
||||||
|
|
||||||
Git commands
|
for upload to device:
|
||||||
------------
|
pio run -e obp40 -t upload
|
||||||
Some useful commands are
|
|
||||||
|
|
||||||
git status
|
Differences to OBP60
|
||||||
git fetch upstream
|
--------------------
|
||||||
git diff --name-status upstream/master
|
|
||||||
git checkout upstream/master platformio.ini
|
|
||||||
|
|
||||||
# how to reset my Repo to match norbert's status
|
- no GPS
|
||||||
|
- no RTC
|
||||||
|
- no LEDs
|
||||||
|
- no environment sensor
|
||||||
|
- no key lock
|
||||||
|
- no swipe
|
||||||
|
- only 5 keys
|
||||||
|
|
||||||
git remote add upstream https://github.com/norbert-walter/esp32-nmea2000-obp60
|
+ SD card interface
|
||||||
git fetch upstream
|
|
||||||
git checkout master
|
|
||||||
git reset --hard upstream/master
|
|
||||||
git push origin master --force
|
|
||||||
|
|
||||||
|
|
||||||
New pages
|
GPIO assignments
|
||||||
---------
|
----------------
|
||||||
To create a new page for OBP60 the following steps are necessary:
|
|
||||||
|
|
||||||
1. Create a page under /lib/obp60task/PageXXXX.cpp. You can use a simple
|
NMEA0183
|
||||||
page e.g. PageOneValue.cpp as template
|
IO9 - RS485 TX
|
||||||
2. Set page name in PageXXXX.cpp on file name
|
IO14 - RS485 RX
|
||||||
3. Register new page in /lib/obp60task/obp60task.cpp in function
|
|
||||||
'registerAllPages'
|
|
||||||
4. Add new page in /lib/obp60task/config.json for each page type
|
|
||||||
or use gen_set.py to auto-generate the relevant section of
|
|
||||||
config.json. For further information on that read the comments
|
|
||||||
in gen_set.py.
|
|
||||||
5. Copy the changes in config.json to config_obp40.json and rename
|
|
||||||
strings accordingly. E.g. obp60 to obp40.
|
|
||||||
|
|
||||||
Using Gitpod
|
NMEA2000/CAN
|
||||||
------------
|
IO15 - CAN TX
|
||||||
|
IO16 - CAN RX
|
||||||
|
|
||||||
Warning: You have to register with gitpod!
|
|
||||||
|
|
||||||
Open web page:
|
Keyboard
|
||||||
https://gitpod.io/#https://github.com/norbert-walter/esp32-nmea2000-obp60/tree/master/lib/obp60task
|
--------
|
||||||
|
|
||||||
Input in terminal:
|
Keycode Key Function
|
||||||
cd /workspace/esp32-nmea2000-obp60
|
-------- ---------------- -------------------------
|
||||||
bash /workspace/esp32-nmea2000-obp60/lib/obp60task/run_installing_tools
|
1 Menu key Key 1 of OBP60 (left)
|
||||||
bash /workspace/esp32-nmea2000-obp60/lib/obp60task/run_obp60_s3
|
2 Exit key Key 2 of OBP60
|
||||||
bash /workspace/esp32-nmea2000-obp60/lib/obp60task/run_obp40_s3
|
3 Jog-Dial press
|
||||||
|
9 Jog-Dial down Next page
|
||||||
Compile result for OBP60:
|
10 Jog-Dial up Previous page
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/bootloader.bin
|
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/firmware.bin
|
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/partitions.bin
|
|
||||||
|
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/obp60_s3-all.bin
|
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/obp60_s3-dev<yyyymmdd>-all.bin
|
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/obp60_s3-dev<yyyymmdd>-update.bin
|
|
||||||
|
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/obp60_s3-all.bin, ready to flash to offset 0x0000
|
|
||||||
|
|
||||||
Compile result for OBP40 (CrowPanel 4.2):
|
|
||||||
|
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp40_s3/bootloader.bin
|
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp40_s3/firmware.bin
|
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp40_s3/partitions.bin
|
|
||||||
|
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp40_s3/obp40_s3-all.bin
|
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp40_s3/obp40_s3-dev<yyyymmdd>-all.bin
|
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp40_s3/obp40_s3-dev<yyyymmdd>-update.bin
|
|
||||||
|
|
||||||
/workspace/esp32-nmea2000-obp60/.pio/build/obp40_s3/obp40_s3-all.bin, ready to flash to offset 0x0000
|
|
||||||
|
|
||||||
Compilation issues
|
|
||||||
------------------
|
|
||||||
? Error while linking: "undefined reference to `registerPageXXX'"
|
|
||||||
: Check if the required page is enabled for current board/environment: #if defined ...
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
- fix unstable accesspoint availability
|
|
||||||
|
|
||||||
- page refresh after page change and not connected to key codes
|
|
||||||
|
|
||||||
- config: getFloat, getDouble
|
|
||||||
|
|
||||||
- dseg7 font to new version
|
|
||||||
|
|
||||||
- new pages: ais, autopilot, epropulsion
|
|
||||||
|
|
||||||
- automate config.json generation with extra_task.py
|
|
||||||
|
|
||||||
- extend boatdata: ais, waypoints, alarms
|
|
||||||
|
|
||||||
- page clock: sunrise / sunset in local time or UTC
|
|
||||||
|
|
||||||
- implement alerts
|
|
||||||
|
|
||||||
- implement formatter as class
|
|
||||||
232
lib/obp60task/Ubuntu_Bold10pt7b.h
Normal file
232
lib/obp60task/Ubuntu_Bold10pt7b.h
Normal file
@@ -0,0 +1,232 @@
|
|||||||
|
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
|
||||||
290
lib/obp60task/Ubuntu_Bold12pt7b.h
Normal file
290
lib/obp60task/Ubuntu_Bold12pt7b.h
Normal file
@@ -0,0 +1,290 @@
|
|||||||
|
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
|
||||||
402
lib/obp60task/Ubuntu_Bold16pt7b.h
Normal file
402
lib/obp60task/Ubuntu_Bold16pt7b.h
Normal file
@@ -0,0 +1,402 @@
|
|||||||
|
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
|
||||||
578
lib/obp60task/Ubuntu_Bold20pt7b.h
Normal file
578
lib/obp60task/Ubuntu_Bold20pt7b.h
Normal file
@@ -0,0 +1,578 @@
|
|||||||
|
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
|
||||||
1340
lib/obp60task/Ubuntu_Bold32pt7b.h
Normal file
1340
lib/obp60task/Ubuntu_Bold32pt7b.h
Normal file
File diff suppressed because it is too large
Load Diff
182
lib/obp60task/Ubuntu_Bold8pt7b.h
Normal file
182
lib/obp60task/Ubuntu_Bold8pt7b.h
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
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
|
||||||
20
lib/obp60task/Using_Gitpod.txt
Normal file
20
lib/obp60task/Using_Gitpod.txt
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
Using Gitpod
|
||||||
|
############
|
||||||
|
|
||||||
|
Open web page:
|
||||||
|
https://gitpod.io/#https://github.com/norbert-walter/esp32-nmea2000-obp60/tree/master/lib/obp60task
|
||||||
|
|
||||||
|
Input in terminal:
|
||||||
|
cd /workspace/esp32-nmea2000-obp60
|
||||||
|
bash /workspace/esp32-nmea2000-obp60/lib/obp60task/run
|
||||||
|
|
||||||
|
Compile result in:
|
||||||
|
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/obp60_s3-all.bin, ready to flash to offset 0x0000
|
||||||
|
|
||||||
|
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/bootloader.bin
|
||||||
|
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/firmware.bin
|
||||||
|
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/partitions.bin
|
||||||
|
|
||||||
|
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/obp60_s3-all.bin
|
||||||
|
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/obp60_s3-dev20231220-all.bin
|
||||||
|
/workspace/esp32-nmea2000-obp60/.pio/build/obp60_s3/obp60_s3-dev20231220-update.bin
|
||||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user