mirror of
https://github.com/thooge/esp32-nmea2000-obp60.git
synced 2025-12-28 21:23:07 +01:00
Compare commits
226 Commits
5192e77fab
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f838194f06 | ||
|
|
2deaf07ea4 | ||
|
|
142f6ca774 | ||
|
|
c6276cdcff | ||
|
|
213812ed14 | ||
|
|
b54acbae42 | ||
|
|
69367b91d7 | ||
|
|
6edf847958 | ||
|
|
fe78fb434b | ||
|
|
fc097b09fe | ||
|
|
a392d88445 | ||
|
|
f08a119f40 | ||
|
|
ae2b7047f5 | ||
|
|
eab7d74aef | ||
|
|
0f50b614eb | ||
|
|
1b55439135 | ||
|
|
625f9c087e | ||
|
|
3fa7ca5e99 | ||
|
|
9935cb54a6 | ||
|
|
b31addf852 | ||
|
|
a9007a6b6f | ||
|
|
0972f12b9e | ||
|
|
f8378c3a2b | ||
|
|
e02ca265ae | ||
|
|
16f9f9217d | ||
|
|
f77107616d | ||
|
|
942ca28ab5 | ||
|
|
a90689228d | ||
|
|
489ee7ed09 | ||
|
|
dd5f05922a | ||
|
|
469a81f87d | ||
|
|
81825370c0 | ||
|
|
bcc24ee99d | ||
|
|
470c0e5f4d | ||
|
|
9a792b49db | ||
| 8f851a4b61 | |||
|
|
f46a43d7fd | ||
| 84e99365f7 | |||
|
|
e5950f95fd | ||
|
|
d0076f336d | ||
|
|
d94c4bbbdb | ||
|
|
6ef7681a40 | ||
|
|
16b8a0dacd | ||
|
|
b3e2dea45b | ||
|
|
34a289048f | ||
|
|
df1bd498ae | ||
|
|
e5eee37b59 | ||
|
|
28b3cfba0b | ||
|
|
674a78b03c | ||
|
|
de448974d9 | ||
|
|
6b91400cfc | ||
|
|
be946440d3 | ||
|
|
ac86bfb304 | ||
|
|
d719c7260e | ||
|
|
1abcb158ec | ||
|
|
00ea413411 | ||
|
|
851149bae6 | ||
|
|
c6c2ad537a | ||
| 3eb2c8093e | |||
|
|
636b1596f5 | ||
|
|
a21ce00260 | ||
|
|
794cbf1c4f | ||
| 4f6079f418 | |||
|
|
a8f3fbb34d | ||
|
|
748867682c | ||
|
|
5b5e003836 | ||
|
|
07200ad701 | ||
|
|
371816f946 | ||
|
|
c8a7f14773 | ||
|
|
4a97768d0b | ||
|
|
e19bd0898d | ||
|
|
d130f7ff78 | ||
|
|
7c14577bbc | ||
|
|
ba94fddb80 | ||
|
|
8faead0a1a | ||
| bc9d139d19 | |||
|
|
a74ce9e553 | ||
| 779f557d47 | |||
|
|
4a273d2c93 | ||
|
|
9be1b864f4 | ||
|
|
bfc4337417 | ||
|
|
398b8e0d02 | ||
| 28a7e58e27 | |||
| eb51092b23 | |||
|
|
fb3af0bf83 | ||
|
|
539500e088 | ||
|
|
229106b04c | ||
|
|
eefa59a7c2 | ||
| 588008e370 | |||
| caf5572459 | |||
|
|
05f8b3ec65 | ||
|
|
351ef5d9fe | ||
|
|
e93193c3e0 | ||
| e367d15568 | |||
|
|
2773685db3 | ||
|
|
9953165dfe | ||
|
|
da451bee70 | ||
|
|
f79124eed3 | ||
|
|
33b5776421 | ||
|
|
2954a9a58b | ||
|
|
e6add8e6fc | ||
|
|
15bcd53350 | ||
|
|
938b566bfc | ||
|
|
fe2223839f | ||
|
|
c888804aef | ||
| d963153b35 | |||
|
|
4934fb1346 | ||
|
|
8150947cd6 | ||
| 1e7368db4d | |||
| 238e0fc79d | |||
|
|
34801d1e0e | ||
| 0afe629b38 | |||
|
|
ccc0d2b6c1 | ||
|
|
791fa10b01 | ||
|
|
c48c6a2e48 | ||
|
|
4110e3f812 | ||
|
|
bb99978177 | ||
|
|
85dee2a622 | ||
|
|
f2e069b768 | ||
|
|
71946248e2 | ||
|
|
91a3ac081f | ||
|
|
59cf52b5d2 | ||
|
|
60193fa3be | ||
|
|
7f954e702d | ||
| 7ca0a4d09a | |||
| 13abfe4c14 | |||
| 8e34fa936d | |||
|
|
6f4e9b625d | ||
| 4aefc99212 | |||
| fa4b563ff0 | |||
|
|
ae7130b86c | ||
|
|
7f9beb064a | ||
|
|
2095efbb01 | ||
|
|
d0e2fc1eac | ||
|
|
d1c620a858 | ||
|
|
07a1b2388e | ||
|
|
c614cae472 | ||
|
|
ec7e1a35e7 | ||
|
|
b82e94d716 | ||
|
|
a2c1c1042d | ||
|
|
77872fea4a | ||
|
|
8a069b9445 | ||
|
|
b3a9b9990f | ||
|
|
dc8b9e48d7 | ||
|
|
72ddeb3cfb | ||
|
|
2729ef9cb6 | ||
|
|
1f90cefbd6 | ||
|
|
9ada5be7cb | ||
|
|
03d8339170 | ||
|
|
73656e7d14 | ||
| c5a1244519 | |||
| 99c3470a22 | |||
|
|
bd9741d851 | ||
|
|
13c85adad2 | ||
| f5cf292804 | |||
| 77c05de4fc | |||
|
|
9b504469bc | ||
| 1bac5d8b16 | |||
| c7eafbf9b8 | |||
|
|
f0aba89301 | ||
|
|
fe095a9716 | ||
|
|
235188dfb2 | ||
|
|
aa70c34a96 | ||
|
|
62aef176d3 | ||
|
|
9f79a7d4bc | ||
|
|
bf4dff45b4 | ||
|
|
f153d82825 | ||
|
|
4b5aa7ff4b | ||
|
|
ebf6e62389 | ||
|
|
da06f3e791 | ||
|
|
7d66ec91da | ||
|
|
29706df6cd | ||
|
|
d6e3c7ad48 | ||
|
|
02712263d3 | ||
|
|
0c4fce0e25 | ||
|
|
4e6d52d197 | ||
|
|
f9cf73ae04 | ||
|
|
bf59cfbae8 | ||
|
|
214c10ff93 | ||
|
|
e72ece8452 | ||
|
|
fca7a47728 | ||
|
|
10951d7f13 | ||
|
|
6dbbd13ead | ||
|
|
fb89dca3be | ||
|
|
3d31fcf4ed | ||
|
|
2c348ca7fb | ||
|
|
6ca40aaa8f | ||
|
|
7ced07d2d9 | ||
|
|
583fbd0db8 | ||
|
|
1862bdc6ae | ||
|
|
c0f36ecdf4 | ||
|
|
2fb59fb118 | ||
|
|
13d6091ae8 | ||
|
|
a5494ccee4 | ||
|
|
e2270d8ed2 | ||
|
|
309d55cdb4 | ||
|
|
0ec2f93915 | ||
|
|
f8b86e67df | ||
|
|
0f0a096219 | ||
|
|
d094bfc32a | ||
|
|
0044fdd3b6 | ||
|
|
57684f77db | ||
|
|
d228f38461 | ||
|
|
417fe3db08 | ||
|
|
44c9e998c9 | ||
|
|
c02122f253 | ||
|
|
30ade0c07a | ||
|
|
38d370dcfb | ||
|
|
52a376c43a | ||
|
|
8c035c4ba1 | ||
|
|
036add6feb | ||
|
|
a1f00dde82 | ||
|
|
756064a362 | ||
|
|
b640d1adda | ||
|
|
c5cadce268 | ||
|
|
293b362ee4 | ||
|
|
98c8d44d2f | ||
|
|
24af837148 | ||
|
|
7c9b615526 | ||
|
|
c55bcc1f94 | ||
|
|
a1b8f06959 | ||
|
|
437b76897a | ||
|
|
2ab6a00883 | ||
|
|
5e41c64dd3 | ||
|
|
6a2c623ea0 | ||
|
|
d0256fd37c |
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.github.io/esp32-nmea2000/install.html) and select the "Initial" flash for your Hardware. This will install the most current software to your device.
|
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>
|
||||||
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.github.io/esp32-nmea2000/install.html) will also allow you to open a console window to your ESP32.
|
The [Flash Page](https://wellenvogel.de/software/esp32/install.html) will also allow you to open a console window to your ESP32.
|
||||||
|
|
||||||
__Tool based__
|
__Tool based__
|
||||||
|
|
||||||
@@ -170,6 +170,12 @@ 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)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -526,3 +526,17 @@ env.Append(
|
|||||||
)
|
)
|
||||||
#script does not run on clean yet - maybe in the future
|
#script does not run on clean yet - maybe in the future
|
||||||
env.AddPostAction("clean",cleangenerated)
|
env.AddPostAction("clean",cleangenerated)
|
||||||
|
|
||||||
|
#look for extra task scripts and include them here
|
||||||
|
for taskdir in userTaskDirs:
|
||||||
|
script = os.path.join(taskdir, "extra_task.py")
|
||||||
|
if os.path.isfile(script):
|
||||||
|
taskname = os.path.basename(os.path.normpath(taskdir))
|
||||||
|
print("#extra task script for '{}'".format(taskname))
|
||||||
|
with open(script) as fh:
|
||||||
|
try:
|
||||||
|
code = compile(fh.read(), taskname, 'exec')
|
||||||
|
except SyntaxError:
|
||||||
|
print("#ERROR: script does not compile")
|
||||||
|
continue
|
||||||
|
exec(code)
|
||||||
|
|||||||
542
extra_script.py.new
Normal file
542
extra_script.py.new
Normal file
@@ -0,0 +1,542 @@
|
|||||||
|
print("running extra...")
|
||||||
|
import gzip
|
||||||
|
import shutil
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import inspect
|
||||||
|
import json
|
||||||
|
import glob
|
||||||
|
from datetime import datetime
|
||||||
|
import re
|
||||||
|
import pprint
|
||||||
|
from platformio.project.config import ProjectConfig
|
||||||
|
from platformio.project.exception import InvalidProjectConfError
|
||||||
|
|
||||||
|
Import("env")
|
||||||
|
#print(env.Dump())
|
||||||
|
OWN_FILE="extra_script.py"
|
||||||
|
GEN_DIR='lib/generated'
|
||||||
|
CFG_FILE='web/config.json'
|
||||||
|
XDR_FILE='web/xdrconfig.json'
|
||||||
|
INDEXJS="index.js"
|
||||||
|
INDEXCSS="index.css"
|
||||||
|
CFG_INCLUDE='GwConfigDefinitions.h'
|
||||||
|
CFG_INCLUDE_IMPL='GwConfigDefImpl.h'
|
||||||
|
XDR_INCLUDE='GwXdrTypeMappings.h'
|
||||||
|
TASK_INCLUDE='GwUserTasks.h'
|
||||||
|
GROVE_CONFIG="GwM5GroveGen.h"
|
||||||
|
GROVE_CONFIG_IN="lib/hardware/GwM5Grove.in"
|
||||||
|
EMBEDDED_INCLUDE="GwEmbeddedFiles.h"
|
||||||
|
|
||||||
|
def getEmbeddedFiles(env):
|
||||||
|
rt=[]
|
||||||
|
efiles=env.GetProjectOption("board_build.embed_files")
|
||||||
|
for f in efiles.split("\n"):
|
||||||
|
if f == '':
|
||||||
|
continue
|
||||||
|
rt.append(f)
|
||||||
|
return rt
|
||||||
|
|
||||||
|
def basePath():
|
||||||
|
#see: https://stackoverflow.com/questions/16771894/python-nameerror-global-name-file-is-not-defined
|
||||||
|
return os.path.dirname(inspect.getfile(lambda: None))
|
||||||
|
|
||||||
|
def outPath():
|
||||||
|
return os.path.join(basePath(),GEN_DIR)
|
||||||
|
def checkDir():
|
||||||
|
dn=outPath()
|
||||||
|
if not os.path.exists(dn):
|
||||||
|
os.makedirs(dn)
|
||||||
|
if not os.path.isdir(dn):
|
||||||
|
print("unable to create %s"%dn)
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def isCurrent(infile,outfile):
|
||||||
|
if os.path.exists(outfile):
|
||||||
|
otime=os.path.getmtime(outfile)
|
||||||
|
itime=os.path.getmtime(infile)
|
||||||
|
if (otime >= itime):
|
||||||
|
own=os.path.join(basePath(),OWN_FILE)
|
||||||
|
if os.path.exists(own):
|
||||||
|
owntime=os.path.getmtime(own)
|
||||||
|
if owntime > otime:
|
||||||
|
return False
|
||||||
|
print("%s is newer then %s, no need to recreate"%(outfile,infile))
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
def compressFile(inFile,outfile):
|
||||||
|
if isCurrent(inFile,outfile):
|
||||||
|
return
|
||||||
|
print("compressing %s"%inFile)
|
||||||
|
with open(inFile, 'rb') as f_in:
|
||||||
|
with gzip.open(outfile, 'wb') as f_out:
|
||||||
|
shutil.copyfileobj(f_in, f_out)
|
||||||
|
|
||||||
|
def generateFile(infile,outfile,callback,inMode='rb',outMode='w'):
|
||||||
|
if isCurrent(infile,outfile):
|
||||||
|
return
|
||||||
|
print("creating %s"%outfile)
|
||||||
|
oh=None
|
||||||
|
with open(infile,inMode) as ch:
|
||||||
|
with open(outfile,outMode) as oh:
|
||||||
|
try:
|
||||||
|
callback(ch,oh,inFile=infile)
|
||||||
|
oh.close()
|
||||||
|
except Exception as e:
|
||||||
|
try:
|
||||||
|
oh.close()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
os.unlink(outfile)
|
||||||
|
raise
|
||||||
|
|
||||||
|
def writeFileIfChanged(fileName,data):
|
||||||
|
if os.path.exists(fileName):
|
||||||
|
with open(fileName,"r") as ih:
|
||||||
|
old=ih.read()
|
||||||
|
ih.close()
|
||||||
|
if old == data:
|
||||||
|
return False
|
||||||
|
print("#generating %s"%fileName)
|
||||||
|
with open(fileName,"w") as oh:
|
||||||
|
oh.write(data)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def mergeConfig(base,other):
|
||||||
|
try:
|
||||||
|
customconfig = env.GetProjectOption("custom_config")
|
||||||
|
except InvalidProjectConfError:
|
||||||
|
customconfig = None
|
||||||
|
for bdir in other:
|
||||||
|
if customconfig and os.path.exists(os.path.join(bdir,customconfig)):
|
||||||
|
cname=os.path.join(bdir,customconfig)
|
||||||
|
print("merge custom config {}".format(cname))
|
||||||
|
with open(cname,'rb') as ah:
|
||||||
|
base += json.load(ah)
|
||||||
|
continue
|
||||||
|
cname=os.path.join(bdir,"config.json")
|
||||||
|
if os.path.exists(cname):
|
||||||
|
print("merge config %s"%cname)
|
||||||
|
with open(cname,'rb') as ah:
|
||||||
|
merge=json.load(ah)
|
||||||
|
base=base+merge
|
||||||
|
return base
|
||||||
|
|
||||||
|
def replaceTexts(data,replacements):
|
||||||
|
if replacements is None:
|
||||||
|
return data
|
||||||
|
if isinstance(data,str):
|
||||||
|
for k,v in replacements.items():
|
||||||
|
data=data.replace("$"+k,str(v))
|
||||||
|
return data
|
||||||
|
if isinstance(data,list):
|
||||||
|
rt=[]
|
||||||
|
for e in data:
|
||||||
|
rt.append(replaceTexts(e,replacements))
|
||||||
|
return rt
|
||||||
|
if isinstance(data,dict):
|
||||||
|
rt={}
|
||||||
|
for k,v in data.items():
|
||||||
|
rt[replaceTexts(k,replacements)]=replaceTexts(v,replacements)
|
||||||
|
return rt
|
||||||
|
return data
|
||||||
|
def expandConfig(config):
|
||||||
|
rt=[]
|
||||||
|
for item in config:
|
||||||
|
type=item.get('type')
|
||||||
|
if type != 'array':
|
||||||
|
rt.append(item)
|
||||||
|
continue
|
||||||
|
replacements=item.get('replace')
|
||||||
|
children=item.get('children')
|
||||||
|
name=item.get('name')
|
||||||
|
if name is None:
|
||||||
|
name="#unknown#"
|
||||||
|
if not isinstance(replacements,list):
|
||||||
|
raise Exception("missing replacements at array %s"%name)
|
||||||
|
for replace in replacements:
|
||||||
|
if children is not None:
|
||||||
|
for c in children:
|
||||||
|
rt.append(replaceTexts(c,replace))
|
||||||
|
return rt
|
||||||
|
|
||||||
|
def generateMergedConfig(inFile,outFile,addDirs=[]):
|
||||||
|
if not os.path.exists(inFile):
|
||||||
|
raise Exception("unable to read cfg file %s"%inFile)
|
||||||
|
data=""
|
||||||
|
with open(inFile,'rb') as ch:
|
||||||
|
config=json.load(ch)
|
||||||
|
config=mergeConfig(config,addDirs)
|
||||||
|
config=expandConfig(config)
|
||||||
|
data=json.dumps(config,indent=2)
|
||||||
|
writeFileIfChanged(outFile,data)
|
||||||
|
|
||||||
|
def generateCfg(inFile,outFile,impl):
|
||||||
|
if not os.path.exists(inFile):
|
||||||
|
raise Exception("unable to read cfg file %s"%inFile)
|
||||||
|
data=""
|
||||||
|
with open(inFile,'rb') as ch:
|
||||||
|
config=json.load(ch)
|
||||||
|
data+="//generated from %s\n"%inFile
|
||||||
|
l=len(config)
|
||||||
|
idx=0
|
||||||
|
if not impl:
|
||||||
|
data+='#include "GwConfigItem.h"\n'
|
||||||
|
data+='class GwConfigDefinitions{\n'
|
||||||
|
data+=' public:\n'
|
||||||
|
data+=' int getNumConfig() const{return %d;}\n'%(l)
|
||||||
|
for item in config:
|
||||||
|
n=item.get('name')
|
||||||
|
if n is None:
|
||||||
|
continue
|
||||||
|
if len(n) > 15:
|
||||||
|
raise Exception("%s: config names must be max 15 caracters"%n)
|
||||||
|
data+=' static constexpr const char* %s="%s";\n'%(n,n)
|
||||||
|
data+="};\n"
|
||||||
|
else:
|
||||||
|
data+='void GwConfigHandler::populateConfigs(GwConfigInterface **config){\n'
|
||||||
|
for item in config:
|
||||||
|
name=item.get('name')
|
||||||
|
if name is None:
|
||||||
|
continue
|
||||||
|
data+=' configs[%d]='%(idx)
|
||||||
|
idx+=1
|
||||||
|
secret="false";
|
||||||
|
if item.get('type') == 'password':
|
||||||
|
secret="true"
|
||||||
|
data+=" new GwConfigInterface(%s,\"%s\",%s);\n"%(name,item.get('default'),secret)
|
||||||
|
data+='}\n'
|
||||||
|
writeFileIfChanged(outFile,data)
|
||||||
|
|
||||||
|
def labelFilter(label):
|
||||||
|
return re.sub("[^a-zA-Z0-9]","",re.sub("\([0-9]*\)","",label))
|
||||||
|
def generateXdrMappings(fp,oh,inFile=''):
|
||||||
|
jdoc=json.load(fp)
|
||||||
|
oh.write("static GwXDRTypeMapping* typeMappings[]={\n")
|
||||||
|
first=True
|
||||||
|
for cat in jdoc:
|
||||||
|
item=jdoc[cat]
|
||||||
|
cid=item.get('id')
|
||||||
|
if cid is None:
|
||||||
|
continue
|
||||||
|
tc=item.get('type')
|
||||||
|
if tc is not None:
|
||||||
|
if first:
|
||||||
|
first=False
|
||||||
|
else:
|
||||||
|
oh.write(",\n")
|
||||||
|
oh.write(" new GwXDRTypeMapping(%d,0,%d) /*%s*/"%(cid,tc,cat))
|
||||||
|
fields=item.get('fields')
|
||||||
|
if fields is None:
|
||||||
|
continue
|
||||||
|
idx=0
|
||||||
|
for fe in fields:
|
||||||
|
if not isinstance(fe,dict):
|
||||||
|
continue
|
||||||
|
tc=fe.get('t')
|
||||||
|
id=fe.get('v')
|
||||||
|
if id is None:
|
||||||
|
id=idx
|
||||||
|
idx+=1
|
||||||
|
l=fe.get('l') or ''
|
||||||
|
if tc is None or id is None:
|
||||||
|
continue
|
||||||
|
if first:
|
||||||
|
first=False
|
||||||
|
else:
|
||||||
|
oh.write(",\n")
|
||||||
|
oh.write(" new GwXDRTypeMapping(%d,%d,%d) /*%s:%s*/"%(cid,id,tc,cat,l))
|
||||||
|
oh.write("\n")
|
||||||
|
oh.write("};\n")
|
||||||
|
for cat in jdoc:
|
||||||
|
item=jdoc[cat]
|
||||||
|
cid=item.get('id')
|
||||||
|
if cid is None:
|
||||||
|
continue
|
||||||
|
selectors=item.get('selector')
|
||||||
|
if selectors is not None:
|
||||||
|
for selector in selectors:
|
||||||
|
label=selector.get('l')
|
||||||
|
value=selector.get('v')
|
||||||
|
if label is not None and value is not None:
|
||||||
|
label=labelFilter(label)
|
||||||
|
define=("GWXDRSEL_%s_%s"%(cat,label)).upper()
|
||||||
|
oh.write(" #define %s %s\n"%(define,value))
|
||||||
|
fields=item.get('fields')
|
||||||
|
if fields is not None:
|
||||||
|
idx=0
|
||||||
|
for field in fields:
|
||||||
|
v=field.get('v')
|
||||||
|
if v is None:
|
||||||
|
v=idx
|
||||||
|
else:
|
||||||
|
v=int(v)
|
||||||
|
label=field.get('l')
|
||||||
|
if v is not None and label is not None:
|
||||||
|
define=("GWXDRFIELD_%s_%s"%(cat,labelFilter(label))).upper();
|
||||||
|
oh.write(" #define %s %s\n"%(define,str(v)))
|
||||||
|
idx+=1
|
||||||
|
|
||||||
|
class Grove:
|
||||||
|
def __init__(self,name) -> None:
|
||||||
|
self.name=name
|
||||||
|
def _ss(self,z=False):
|
||||||
|
if z:
|
||||||
|
return self.name
|
||||||
|
return self.name if self.name != 'Z' else ''
|
||||||
|
def _suffix(self):
|
||||||
|
return '_'+self.name if self.name != 'Z' else ''
|
||||||
|
def replace(self,line):
|
||||||
|
if line is None:
|
||||||
|
return line
|
||||||
|
return line.replace('$G$',self._ss()).replace('$Z$',self._ss(True)).replace('$GS$',self._suffix())
|
||||||
|
def generateGroveDefs(inh,outh,inFile=''):
|
||||||
|
GROVES=[Grove('Z'),Grove('A'),Grove('B'),Grove('C')]
|
||||||
|
definition=[]
|
||||||
|
started=False
|
||||||
|
def writeConfig():
|
||||||
|
for grove in GROVES:
|
||||||
|
for cl in definition:
|
||||||
|
outh.write(grove.replace(cl))
|
||||||
|
|
||||||
|
for line in inh:
|
||||||
|
if re.match(" *#GROVE",line):
|
||||||
|
started=True
|
||||||
|
if len(definition) > 0:
|
||||||
|
writeConfig()
|
||||||
|
definition=[]
|
||||||
|
continue
|
||||||
|
if started:
|
||||||
|
definition.append(line)
|
||||||
|
if len(definition) > 0:
|
||||||
|
writeConfig()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
userTaskDirs=[]
|
||||||
|
|
||||||
|
def getUserTaskDirs():
|
||||||
|
rt=[]
|
||||||
|
taskdirs=glob.glob(os.path.join( basePath(),'lib','*task*'))
|
||||||
|
for task in taskdirs:
|
||||||
|
rt.append(task)
|
||||||
|
return rt
|
||||||
|
|
||||||
|
def checkAndAdd(file,names,ilist):
|
||||||
|
if not file.endswith('.h'):
|
||||||
|
return
|
||||||
|
match=False
|
||||||
|
for cmp in names:
|
||||||
|
#print("##check %s<->%s"%(f.lower(),cmp))
|
||||||
|
if file.lower() == cmp:
|
||||||
|
match=True
|
||||||
|
if not match:
|
||||||
|
return
|
||||||
|
ilist.append(file)
|
||||||
|
def genereateUserTasks(outfile):
|
||||||
|
includes=[]
|
||||||
|
for task in userTaskDirs:
|
||||||
|
#print("##taskdir=%s"%task)
|
||||||
|
base=os.path.basename(task)
|
||||||
|
includeNames=[base.lower()+".h",'gw'+base.lower()+'.h']
|
||||||
|
for f in os.listdir(task):
|
||||||
|
checkAndAdd(f,includeNames,includes)
|
||||||
|
includeData=""
|
||||||
|
for i in includes:
|
||||||
|
print("#task include %s"%i)
|
||||||
|
includeData+="#include <%s>\n"%i
|
||||||
|
writeFileIfChanged(outfile,includeData)
|
||||||
|
|
||||||
|
def generateEmbedded(elist,outFile):
|
||||||
|
content=""
|
||||||
|
for entry in elist:
|
||||||
|
content+="EMBED_GZ_FILE(\"%s\",%s,\"%s\");\n"%entry
|
||||||
|
writeFileIfChanged(outFile,content)
|
||||||
|
|
||||||
|
def getContentType(fn):
|
||||||
|
if (fn.endswith('.gz')):
|
||||||
|
fn=fn[0:-3]
|
||||||
|
if (fn.endswith('html')):
|
||||||
|
return "text/html"
|
||||||
|
if (fn.endswith('json')):
|
||||||
|
return "application/json"
|
||||||
|
if (fn.endswith('js')):
|
||||||
|
return "text/javascript"
|
||||||
|
if (fn.endswith('css')):
|
||||||
|
return "text/css"
|
||||||
|
return "application/octet-stream"
|
||||||
|
|
||||||
|
|
||||||
|
def getLibs():
|
||||||
|
base=os.path.join(basePath(),"lib")
|
||||||
|
rt=[]
|
||||||
|
for sd in os.listdir(base):
|
||||||
|
if sd == '..':
|
||||||
|
continue
|
||||||
|
if sd == '.':
|
||||||
|
continue
|
||||||
|
fn=os.path.join(base,sd)
|
||||||
|
if os.path.isdir(fn):
|
||||||
|
rt.append(sd)
|
||||||
|
EXTRAS=['generated']
|
||||||
|
for e in EXTRAS:
|
||||||
|
if not e in rt:
|
||||||
|
rt.append(e)
|
||||||
|
return rt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def joinFiles(target,pattern,dirlist):
|
||||||
|
flist=[]
|
||||||
|
for dir in dirlist:
|
||||||
|
fn=os.path.join(dir,pattern)
|
||||||
|
if os.path.exists(fn):
|
||||||
|
flist.append(fn)
|
||||||
|
current=False
|
||||||
|
if os.path.exists(target):
|
||||||
|
current=True
|
||||||
|
for f in flist:
|
||||||
|
if not isCurrent(f,target):
|
||||||
|
current=False
|
||||||
|
break
|
||||||
|
if current:
|
||||||
|
print("%s is up to date"%target)
|
||||||
|
return
|
||||||
|
print("creating %s"%target)
|
||||||
|
with gzip.open(target,"wb") as oh:
|
||||||
|
for fn in flist:
|
||||||
|
print("adding %s to %s"%(fn,target))
|
||||||
|
with open(fn,"rb") as rh:
|
||||||
|
shutil.copyfileobj(rh,oh)
|
||||||
|
|
||||||
|
|
||||||
|
OWNLIBS=getLibs()+["FS","WiFi"]
|
||||||
|
GLOBAL_INCLUDES=[]
|
||||||
|
|
||||||
|
def handleDeps(env):
|
||||||
|
#overwrite the GetProjectConfig
|
||||||
|
#to inject all our libs
|
||||||
|
oldGetProjectConfig=env.GetProjectConfig
|
||||||
|
def GetProjectConfigX(env):
|
||||||
|
rt=oldGetProjectConfig()
|
||||||
|
cenv="env:"+env['PIOENV']
|
||||||
|
libs=[]
|
||||||
|
for section,options in rt.as_tuple():
|
||||||
|
if section == cenv:
|
||||||
|
for key,values in options:
|
||||||
|
if key == 'lib_deps':
|
||||||
|
libs=values
|
||||||
|
|
||||||
|
mustUpdate=False
|
||||||
|
for lib in OWNLIBS:
|
||||||
|
if not lib in libs:
|
||||||
|
libs.append(lib)
|
||||||
|
mustUpdate=True
|
||||||
|
if mustUpdate:
|
||||||
|
update=[(cenv,[('lib_deps',libs)])]
|
||||||
|
rt.update(update)
|
||||||
|
return rt
|
||||||
|
env.AddMethod(GetProjectConfigX,"GetProjectConfig")
|
||||||
|
#store the list of all includes after we resolved
|
||||||
|
#the dependencies for our main project
|
||||||
|
#we will use them for all compilations afterwards
|
||||||
|
oldLibBuilder=env.ConfigureProjectLibBuilder
|
||||||
|
def ConfigureProjectLibBuilderX(env):
|
||||||
|
global GLOBAL_INCLUDES
|
||||||
|
project=oldLibBuilder()
|
||||||
|
#print("##ConfigureProjectLibBuilderX")
|
||||||
|
#pprint.pprint(project)
|
||||||
|
if project.depbuilders:
|
||||||
|
#print("##depbuilders %s"%",".join(map(lambda x: x.path,project.depbuilders)))
|
||||||
|
for db in project.depbuilders:
|
||||||
|
idirs=db.get_include_dirs()
|
||||||
|
for id in idirs:
|
||||||
|
if not id in GLOBAL_INCLUDES:
|
||||||
|
GLOBAL_INCLUDES.append(id)
|
||||||
|
return project
|
||||||
|
env.AddMethod(ConfigureProjectLibBuilderX,"ConfigureProjectLibBuilder")
|
||||||
|
def injectIncludes(env,node):
|
||||||
|
return env.Object(
|
||||||
|
node,
|
||||||
|
CPPPATH=env["CPPPATH"]+GLOBAL_INCLUDES
|
||||||
|
)
|
||||||
|
env.AddBuildMiddleware(injectIncludes)
|
||||||
|
|
||||||
|
|
||||||
|
def prebuild(env):
|
||||||
|
global userTaskDirs
|
||||||
|
print("#prebuild running")
|
||||||
|
if not checkDir():
|
||||||
|
sys.exit(1)
|
||||||
|
ldf_mode=env.GetProjectOption("lib_ldf_mode")
|
||||||
|
if ldf_mode == 'off':
|
||||||
|
print("##ldf off - own dependency handling")
|
||||||
|
handleDeps(env)
|
||||||
|
userTaskDirs=getUserTaskDirs()
|
||||||
|
mergedConfig=os.path.join(outPath(),os.path.basename(CFG_FILE))
|
||||||
|
generateMergedConfig(os.path.join(basePath(),CFG_FILE),mergedConfig,userTaskDirs)
|
||||||
|
compressFile(mergedConfig,mergedConfig+".gz")
|
||||||
|
generateCfg(mergedConfig,os.path.join(outPath(),CFG_INCLUDE),False)
|
||||||
|
generateCfg(mergedConfig,os.path.join(outPath(),CFG_INCLUDE_IMPL),True)
|
||||||
|
joinFiles(os.path.join(outPath(),INDEXJS+".gz"),INDEXJS,["web"]+userTaskDirs)
|
||||||
|
joinFiles(os.path.join(outPath(),INDEXCSS+".gz"),INDEXCSS,["web"]+userTaskDirs)
|
||||||
|
embedded=getEmbeddedFiles(env)
|
||||||
|
filedefs=[]
|
||||||
|
for ef in embedded:
|
||||||
|
print("#checking embedded file %s"%ef)
|
||||||
|
(dn,fn)=os.path.split(ef)
|
||||||
|
pureName=fn
|
||||||
|
if pureName.endswith('.gz'):
|
||||||
|
pureName=pureName[0:-3]
|
||||||
|
ct=getContentType(pureName)
|
||||||
|
usname=ef.replace('/','_').replace('.','_')
|
||||||
|
filedefs.append((pureName,usname,ct))
|
||||||
|
inFile=os.path.join(basePath(),"web",pureName)
|
||||||
|
if os.path.exists(inFile):
|
||||||
|
compressFile(inFile,ef)
|
||||||
|
else:
|
||||||
|
print("#WARNING: infile %s for %s not found"%(inFile,ef))
|
||||||
|
generateEmbedded(filedefs,os.path.join(outPath(),EMBEDDED_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(),GROVE_CONFIG_IN),os.path.join(outPath(),GROVE_CONFIG),generateGroveDefs,inMode='r')
|
||||||
|
version="dev"+datetime.now().strftime("%Y%m%d")
|
||||||
|
env.Append(CPPDEFINES=[('GWDEVVERSION',version)])
|
||||||
|
|
||||||
|
def cleangenerated(source, target, env):
|
||||||
|
od=outPath()
|
||||||
|
if os.path.isdir(od):
|
||||||
|
print("#cleaning up %s"%od)
|
||||||
|
for f in os.listdir(od):
|
||||||
|
if f == "." or f == "..":
|
||||||
|
continue
|
||||||
|
fn=os.path.join(od,f)
|
||||||
|
os.unlink(f)
|
||||||
|
|
||||||
|
|
||||||
|
print("#prescript...")
|
||||||
|
prebuild(env)
|
||||||
|
board="PLATFORM_BOARD_%s"%env["BOARD"].replace("-","_").upper()
|
||||||
|
print("Board=#%s#"%board)
|
||||||
|
print("BuildFlags=%s"%(" ".join(env["BUILD_FLAGS"])))
|
||||||
|
env.Append(
|
||||||
|
LINKFLAGS=[ "-u", "custom_app_desc" ],
|
||||||
|
CPPDEFINES=[(board,"1")]
|
||||||
|
)
|
||||||
|
#script does not run on clean yet - maybe in the future
|
||||||
|
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)
|
||||||
@@ -493,6 +493,11 @@ 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;
|
||||||
@@ -523,4 +528,4 @@ public:
|
|||||||
};
|
};
|
||||||
static XWriter xwriter;
|
static XWriter xwriter;
|
||||||
ARDUINOJSON_NAMESPACE::TextFormatter<XWriter> testWriter(xwriter);
|
ARDUINOJSON_NAMESPACE::TextFormatter<XWriter> testWriter(xwriter);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -129,6 +129,7 @@ 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);
|
||||||
|
|
||||||
@@ -251,4 +252,4 @@ class GwBoatData{
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -27,18 +27,19 @@ class DummyConfig : public GwConfigInterface{
|
|||||||
};
|
};
|
||||||
|
|
||||||
DummyConfig dummyConfig;
|
DummyConfig dummyConfig;
|
||||||
String GwConfigHandler::toString() const{
|
void GwConfigHandler::logConfig(int level) const
|
||||||
String rt;
|
{
|
||||||
rt+="Config: ";
|
if (!logger->isActive(level))
|
||||||
for (int i=0;i<getNumConfig();i++){
|
return;
|
||||||
rt+=configs[i]->getName();
|
for (int i = 0; i < getNumConfig(); i++)
|
||||||
rt+="=";
|
{
|
||||||
rt+=configs[i]->asString();
|
String v=configs[i]->asString();
|
||||||
rt+=", ";
|
bool isChanged=v != configs[i]->getDefault();
|
||||||
}
|
logger->logDebug(level, "Config[%s]%s='%s'", configs[i]->getName().c_str(),isChanged?"*":"", configs[i]->isSecret() ? "***" : configs[i]->asString().c_str());
|
||||||
return rt;
|
if ((i%20) == 19) logger->flush();
|
||||||
}
|
}
|
||||||
|
logger->flush();
|
||||||
|
}
|
||||||
String GwConfigHandler::toJson() const{
|
String GwConfigHandler::toJson() const{
|
||||||
String rt;
|
String rt;
|
||||||
int num=getNumConfig();
|
int num=getNumConfig();
|
||||||
@@ -80,6 +81,9 @@ 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();
|
||||||
String toString() const;
|
void logConfig(int level) 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 one additional build environment (board)
|
extend the base configuration - we add a dummy library here and define additional build environments (boards)
|
||||||
* [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,11 +28,13 @@ 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](config.json)<br>
|
* [config.json](exampleConfig.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)).
|
The defined config items can later be accessed in the code (see the example in [GwExampleTask.cpp](GwExampleTask.cpp)).<br>
|
||||||
|
|
||||||
|
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](index.js)<br>
|
* [index.js](example.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.
|
||||||
@@ -46,10 +48,14 @@ 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.
|
After a change just start the compilation and reload the page.<br>
|
||||||
|
|
||||||
|
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.
|
You can add own css to influence the styling of the display.<br>
|
||||||
|
|
||||||
|
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,5 +10,9 @@ 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
|
||||||
@@ -85,6 +85,7 @@ 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();
|
||||||
@@ -92,7 +93,8 @@ bool GwWifi::connectInternal(){
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#define RETRY_MILLIS 20000
|
//#102: we should have a wifi connect retry being > 30s - with some headroom
|
||||||
|
#define RETRY_MILLIS 40000
|
||||||
void GwWifi::loop(){
|
void GwWifi::loop(){
|
||||||
if (wifiClient->asBoolean())
|
if (wifiClient->asBoolean())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -351,8 +351,8 @@ private:
|
|||||||
rmb.vmg
|
rmb.vmg
|
||||||
);
|
);
|
||||||
send(n2kMsg,msg.sourceId);
|
send(n2kMsg,msg.sourceId);
|
||||||
SetN2kPGN129285(n2kMsg,sourceId,1,1,true,true,"default");
|
SetN2kRouteWPInfo(n2kMsg,sourceId,1,1,N2kdir_forward,"default");
|
||||||
AppendN2kPGN129285(n2kMsg,destinationId,rmb.destID,rmb.latitude,rmb.longitude);
|
AppendN2kRouteWPInfo(n2kMsg,destinationId,rmb.destID,rmb.latitude,rmb.longitude);
|
||||||
send(n2kMsg,msg.sourceId);
|
send(n2kMsg,msg.sourceId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -638,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 dt=msg.Field(i+1)[0];
|
char du=msg.Field(i+1)[0];
|
||||||
switch(dt){
|
switch(du){
|
||||||
case 'f':
|
case 'f':
|
||||||
Depth=Depth/mToFeet;
|
Depth=Depth/mToFeet;
|
||||||
break;
|
break;
|
||||||
@@ -662,8 +662,9 @@ 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 offset=Depth-boatData->DBT->getData();
|
double dbt=boatData->DBT->getData();
|
||||||
if (offset >= 0 && dt == DBT){
|
double offset=Depth-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;
|
||||||
}
|
}
|
||||||
@@ -675,8 +676,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,Depth,offset);
|
SetN2kWaterDepth(n2kMsg,1,dbt,offset); //on the N2K side we always have depth below transducer
|
||||||
send(n2kMsg,msg.sourceId,(n2kMsg.PGN)+String((offset != N2kDoubleNA)?1:0));
|
send(n2kMsg,msg.sourceId,(n2kMsg.PGN)+String((offset >=0)?1:0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -267,21 +267,29 @@ 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))
|
|
||||||
{
|
{
|
||||||
SendMessage(NMEA0183Msg);
|
tNMEA0183Msg NMEA0183Msg;
|
||||||
}
|
bool offsetValid=true;
|
||||||
if (NMEA0183SetDBx(NMEA0183Msg, DepthBelowTransducer, Offset,talkerId))
|
if (N2kIsNA(Offset)) {
|
||||||
{
|
Offset=NMEA0183DoubleNA;
|
||||||
SendMessage(NMEA0183Msg);
|
offsetValid=false;
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -528,6 +536,31 @@ 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())
|
||||||
|
|||||||
190
lib/obp60task/BoatDataCalibration.cpp
Normal file
190
lib/obp60task/BoatDataCalibration.cpp
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
#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 == "---") {
|
||||||
|
LOG_DEBUG(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;
|
||||||
|
LOG_DEBUG(GwLog::LOG, "calibration data: %s, offset: %f, slope: %f, smoothing: %f", instance.c_str(),
|
||||||
|
calibMap[instance].offset, calibMap[instance].slope, calibMap[instance].smooth);
|
||||||
|
}
|
||||||
|
LOG_DEBUG(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()) {
|
||||||
|
LOG_DEBUG(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();
|
||||||
|
LOG_DEBUG(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
|
||||||
|
|
||||||
|
LOG_DEBUG(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()) {
|
||||||
|
LOG_DEBUG(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
|
||||||
34
lib/obp60task/BoatDataCalibration.h
Normal file
34
lib/obp60task/BoatDataCalibration.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
// Functions lib for data instance calibration
|
||||||
|
|
||||||
|
#ifndef _BOATDATACALIBRATION_H
|
||||||
|
#define _BOATDATACALIBRATION_H
|
||||||
|
|
||||||
|
// #include "Pagedata.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
|
||||||
25
lib/obp60task/Graphics.cpp
Normal file
25
lib/obp60task/Graphics.cpp
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
Generic graphics functions
|
||||||
|
|
||||||
|
*/
|
||||||
|
#include <math.h>
|
||||||
|
#include "Graphics.h"
|
||||||
|
|
||||||
|
Point rotatePoint(const Point& origin, const Point& p, double angle) {
|
||||||
|
// rotate poind around origin by degrees
|
||||||
|
Point rotated;
|
||||||
|
double phi = angle * M_PI / 180.0;
|
||||||
|
double dx = p.x - origin.x;
|
||||||
|
double dy = p.y - origin.y;
|
||||||
|
rotated.x = origin.x + cos(phi) * dx - sin(phi) * dy;
|
||||||
|
rotated.y = origin.y + sin(phi) * dx + cos(phi) * dy;
|
||||||
|
return rotated;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<Point> rotatePoints(const Point& origin, const std::vector<Point>& pts, double angle) {
|
||||||
|
std::vector<Point> rotatedPoints;
|
||||||
|
for (const auto& p : pts) {
|
||||||
|
rotatedPoints.push_back(rotatePoint(origin, p, angle));
|
||||||
|
}
|
||||||
|
return rotatedPoints;
|
||||||
|
}
|
||||||
17
lib/obp60task/Graphics.h
Normal file
17
lib/obp60task/Graphics.h
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
struct Point {
|
||||||
|
double x;
|
||||||
|
double y;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Rect {
|
||||||
|
double x;
|
||||||
|
double y;
|
||||||
|
double w;
|
||||||
|
double h;
|
||||||
|
};
|
||||||
|
|
||||||
|
Point rotatePoint(const Point& origin, const Point& p, double angle);
|
||||||
|
std::vector<Point> rotatePoints(const Point& origin, const std::vector<Point>& pts, double angle);
|
||||||
14
lib/obp60task/ImageDecoder.cpp
Normal file
14
lib/obp60task/ImageDecoder.cpp
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#include "ImageDecoder.h"
|
||||||
|
#include <mbedtls/base64.h>
|
||||||
|
|
||||||
|
// Decoder for Base64 content
|
||||||
|
bool ImageDecoder::decodeBase64(const String& base64, uint8_t* outBuffer, size_t outSize, size_t& decodedSize) {
|
||||||
|
int ret = mbedtls_base64_decode(
|
||||||
|
outBuffer,
|
||||||
|
outSize,
|
||||||
|
&decodedSize,
|
||||||
|
(const unsigned char*)base64.c_str(),
|
||||||
|
base64.length()
|
||||||
|
);
|
||||||
|
return (ret == 0);
|
||||||
|
}
|
||||||
9
lib/obp60task/ImageDecoder.h
Normal file
9
lib/obp60task/ImageDecoder.h
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class ImageDecoder {
|
||||||
|
public:
|
||||||
|
bool decodeBase64(const String& base64, uint8_t* outBuffer, size_t outSize, size_t& decodedSize);
|
||||||
|
};
|
||||||
181
lib/obp60task/NetworkClient.cpp
Normal file
181
lib/obp60task/NetworkClient.cpp
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
#include "NetworkClient.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "puff.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
NetworkClient::NetworkClient(size_t reserveSize)
|
||||||
|
: _doc(reserveSize),
|
||||||
|
_valid(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skip GZIP Header an goto DEFLATE content
|
||||||
|
int NetworkClient::skipGzipHeader(const uint8_t* data, size_t len) {
|
||||||
|
if (len < 10) return -1;
|
||||||
|
|
||||||
|
if (data[0] != 0x1F || data[1] != 0x8B || data[2] != 8) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t pos = 10;
|
||||||
|
uint8_t flags = data[3];
|
||||||
|
|
||||||
|
if (flags & 4) {
|
||||||
|
if (pos + 2 > len) return -1;
|
||||||
|
uint16_t xlen = data[pos] | (data[pos+1] << 8);
|
||||||
|
pos += 2 + xlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & 8) {
|
||||||
|
while (pos < len && data[pos] != 0) pos++;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & 16) {
|
||||||
|
while (pos < len && data[pos] != 0) pos++;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & 2) pos += 2;
|
||||||
|
|
||||||
|
if (pos >= len) return -1;
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTP GET + GZIP Decompression (reading in chunks)
|
||||||
|
bool NetworkClient::httpGetGzip(const String& url, uint8_t*& outData, size_t& outLen) {
|
||||||
|
|
||||||
|
const size_t capacity = READLIMIT; // Read limit for data (can be adjusted in NetworkClient.h)
|
||||||
|
uint8_t* buffer = (uint8_t*)malloc(capacity);
|
||||||
|
|
||||||
|
if (!buffer) {
|
||||||
|
if (DEBUG) {Serial.println("Malloc failed (buffer");}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
HTTPClient http;
|
||||||
|
|
||||||
|
// Timeouts to prevent hanging connections
|
||||||
|
http.setConnectTimeout(CONNECTIONTIMEOUT); // Connect timeout in ms (can be adjusted in NetworkClient.h)
|
||||||
|
http.setTimeout(TCPREADTIMEOUT); // Read timeout in ms (can be adjusted in NetworkClient.h)
|
||||||
|
|
||||||
|
http.begin(url);
|
||||||
|
http.addHeader("Accept-Encoding", "gzip");
|
||||||
|
|
||||||
|
int code = http.GET();
|
||||||
|
if (code != HTTP_CODE_OK) {
|
||||||
|
Serial.printf("HTTP ERROR: %d\n", code);
|
||||||
|
|
||||||
|
// Hard reset HTTP + socket
|
||||||
|
WiFiClient* tmp = http.getStreamPtr();
|
||||||
|
if (tmp) tmp->stop(); // Force close TCP socket
|
||||||
|
http.end();
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
WiFiClient* stream = http.getStreamPtr();
|
||||||
|
|
||||||
|
size_t len = 0;
|
||||||
|
uint32_t lastData = millis();
|
||||||
|
const uint32_t READ_TIMEOUT = READDATATIMEOUT; // Timeout for reading data (can be adjusted in NetworkClient.h)
|
||||||
|
|
||||||
|
bool complete = false;
|
||||||
|
|
||||||
|
while (http.connected() && !complete) {
|
||||||
|
|
||||||
|
size_t avail = stream->available();
|
||||||
|
|
||||||
|
if (avail == 0) {
|
||||||
|
if (millis() - lastData > READ_TIMEOUT) {
|
||||||
|
Serial.println("TIMEOUT waiting for data!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
delay(1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len + avail > capacity)
|
||||||
|
avail = capacity - len;
|
||||||
|
|
||||||
|
int read = stream->readBytes(buffer + len, avail);
|
||||||
|
len += read;
|
||||||
|
lastData = millis();
|
||||||
|
|
||||||
|
if (DEBUG) {Serial.printf("Read chunk: %d (total: %d)\n", read, (int)len);}
|
||||||
|
|
||||||
|
if (len < 20) continue; // Not enough data for header
|
||||||
|
|
||||||
|
int headerOffset = skipGzipHeader(buffer, len);
|
||||||
|
if (headerOffset < 0) continue;
|
||||||
|
|
||||||
|
unsigned long testLen = len * 8; // Dynamic expansion
|
||||||
|
uint8_t* test = (uint8_t*)malloc(testLen);
|
||||||
|
|
||||||
|
if (!test) continue;
|
||||||
|
|
||||||
|
unsigned long srcLen = len - headerOffset;
|
||||||
|
|
||||||
|
int res = puff(test, &testLen, buffer + headerOffset, &srcLen);
|
||||||
|
if (res == 0) {
|
||||||
|
if (DEBUG) {Serial.printf("Decompress OK! Size: %lu bytes\n", testLen);}
|
||||||
|
outData = test;
|
||||||
|
outLen = testLen;
|
||||||
|
complete = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(test);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Added: Force-close connection in all cases to avoid stuck TCP sockets ---
|
||||||
|
if (stream) stream->stop();
|
||||||
|
|
||||||
|
http.end();
|
||||||
|
free(buffer);
|
||||||
|
|
||||||
|
if (!complete) {
|
||||||
|
Serial.println("Failed to complete decompress.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decompress JSON
|
||||||
|
bool NetworkClient::fetchAndDecompressJson(const String& url) {
|
||||||
|
|
||||||
|
_valid = false;
|
||||||
|
|
||||||
|
uint8_t* raw = nullptr;
|
||||||
|
size_t rawLen = 0;
|
||||||
|
|
||||||
|
if (!httpGetGzip(url, raw, rawLen)) {
|
||||||
|
Serial.println("GZIP download/decompress failed.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DeserializationError err = deserializeJson(_doc, raw, rawLen);
|
||||||
|
free(raw);
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
Serial.printf("JSON ERROR: %s\n", err.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DEBUG) {Serial.println("JSON OK!");}
|
||||||
|
_valid = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonDocument& NetworkClient::json() {
|
||||||
|
return _doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NetworkClient::isValid() const {
|
||||||
|
return _valid;
|
||||||
|
}
|
||||||
27
lib/obp60task/NetworkClient.h
Normal file
27
lib/obp60task/NetworkClient.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <HTTPClient.h>
|
||||||
|
|
||||||
|
#define DEBUG false // Debug flag for NetworkClient for more live information
|
||||||
|
#define READLIMIT 200000 // HTTP read limit in byte for gzip content (can be adjusted)
|
||||||
|
#define CONNECTIONTIMEOUT 3000 // Timeout in ms for HTTP connection
|
||||||
|
#define TCPREADTIMEOUT 2000 // Timeout in ms for read HTTP client stack
|
||||||
|
#define READDATATIMEOUT 2000 // Timeout in ms for read data
|
||||||
|
|
||||||
|
class NetworkClient {
|
||||||
|
public:
|
||||||
|
NetworkClient(size_t reserveSize = 0);
|
||||||
|
|
||||||
|
bool fetchAndDecompressJson(const String& url);
|
||||||
|
JsonDocument& json();
|
||||||
|
bool isValid() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
DynamicJsonDocument _doc;
|
||||||
|
bool _valid;
|
||||||
|
|
||||||
|
int skipGzipHeader(const uint8_t* data, size_t len);
|
||||||
|
bool httpGetGzip(const String& url, uint8_t*& outData, size_t& outLen);
|
||||||
|
};
|
||||||
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <PCF8574.h> // Driver for PCF8574 output modul from Horter
|
|
||||||
#include <Wire.h> // I2C
|
#include <Wire.h> // I2C
|
||||||
#include <RTClib.h> // Driver for DS1388 RTC
|
#include <RTClib.h> // Driver for DS1388 RTC
|
||||||
|
#include <PCF8574.h> // PCF8574 modules from Horter
|
||||||
#include "SunRise.h" // Lib for sunrise and sunset calculation
|
#include "SunRise.h" // Lib for sunrise and sunset calculation
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Hardware.h"
|
#include "OBP60Hardware.h"
|
||||||
@@ -11,25 +11,23 @@
|
|||||||
#include "imglib.h"
|
#include "imglib.h"
|
||||||
|
|
||||||
// Character sets
|
// Character sets
|
||||||
#include "Ubuntu_Bold8pt7b.h"
|
#include "fonts/DSEG7Classic-BoldItalic16pt7b.h"
|
||||||
#include "Ubuntu_Bold10pt7b.h"
|
#include "fonts/DSEG7Classic-BoldItalic20pt7b.h"
|
||||||
#include "Ubuntu_Bold12pt7b.h"
|
#include "fonts/DSEG7Classic-BoldItalic26pt7b.h"
|
||||||
#include "Ubuntu_Bold16pt7b.h"
|
#include "fonts/DSEG7Classic-BoldItalic30pt7b.h"
|
||||||
#include "Ubuntu_Bold20pt7b.h"
|
#include "fonts/DSEG7Classic-BoldItalic42pt7b.h"
|
||||||
#include "Ubuntu_Bold32pt7b.h"
|
#include "fonts/DSEG7Classic-BoldItalic60pt7b.h"
|
||||||
#include "DSEG7Classic-BoldItalic16pt7b.h"
|
#include "fonts/Ubuntu_Bold8pt8b.h"
|
||||||
#include "DSEG7Classic-BoldItalic20pt7b.h"
|
#include "fonts/Ubuntu_Bold10pt8b.h"
|
||||||
#include "DSEG7Classic-BoldItalic30pt7b.h"
|
#include "fonts/Ubuntu_Bold12pt8b.h"
|
||||||
#include "DSEG7Classic-BoldItalic42pt7b.h"
|
#include "fonts/Ubuntu_Bold16pt8b.h"
|
||||||
#include "DSEG7Classic-BoldItalic60pt7b.h"
|
#include "fonts/Ubuntu_Bold20pt8b.h"
|
||||||
#include "Atari16px8b.h" // Key label font
|
#include "fonts/Ubuntu_Bold32pt8b.h"
|
||||||
|
#include "fonts/Atari16px8b.h" // Key label font
|
||||||
#include "Ubuntu_Bold20pt8b.h"
|
#include "fonts/IBM8x8px.h"
|
||||||
|
|
||||||
// E-Ink Display
|
// E-Ink Display
|
||||||
#define GxEPD_WIDTH 400 // Display width
|
// Definition for e-paper width an height refer OBP60Hardware.h
|
||||||
#define GxEPD_HEIGHT 300 // Display height
|
|
||||||
|
|
||||||
#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)
|
||||||
@@ -65,6 +63,12 @@ PCF8574 pcf8574_Out(PCF8574_I2C_ADDR1); // First digital output modul PCF8574 fr
|
|||||||
Adafruit_FRAM_I2C fram;
|
Adafruit_FRAM_I2C fram;
|
||||||
bool hasFRAM = false;
|
bool hasFRAM = false;
|
||||||
|
|
||||||
|
// SD Card
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
sdmmc_card_t *sdcard;
|
||||||
|
#endif
|
||||||
|
bool hasSDCard = false;
|
||||||
|
|
||||||
// Global vars
|
// Global vars
|
||||||
bool blinkingLED = false; // Enable / disable blinking flash LED
|
bool blinkingLED = false; // Enable / disable blinking flash LED
|
||||||
bool statusLED = false; // Actual status of flash LED on/off
|
bool statusLED = false; // Actual status of flash LED on/off
|
||||||
@@ -79,16 +83,20 @@ LedTaskData *ledTaskData=nullptr;
|
|||||||
|
|
||||||
void hardwareInit(GwApi *api)
|
void hardwareInit(GwApi *api)
|
||||||
{
|
{
|
||||||
|
GwLog *logger = api->getLogger();
|
||||||
|
GwConfigHandler *config = api->getConfig();
|
||||||
|
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
// Init PCF8574 digital outputs
|
// Init PCF8574 digital outputs
|
||||||
Wire.setClock(I2C_SPEED); // Set I2C clock on 10 kHz
|
Wire.setClock(I2C_SPEED_LOW); // 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
|
||||||
}
|
}
|
||||||
|
Wire.setClock(I2C_SPEED); // Set I2C clock on 100 kHz
|
||||||
fram = Adafruit_FRAM_I2C();
|
fram = Adafruit_FRAM_I2C();
|
||||||
if (esp_reset_reason() == ESP_RST_POWERON) {
|
if (esp_reset_reason() == ESP_RST_POWERON) {
|
||||||
// help initialize FRAM
|
// help initialize FRAM
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"Delaying I2C init for 250ms due to cold boot");
|
logger->logDebug(GwLog::LOG, "Delaying I2C init for 250ms due to cold boot");
|
||||||
delay(250);
|
delay(250);
|
||||||
}
|
}
|
||||||
// FRAM (e.g. MB85RC256V)
|
// FRAM (e.g. MB85RC256V)
|
||||||
@@ -100,14 +108,100 @@ void hardwareInit(GwApi *api)
|
|||||||
// Boot counter
|
// Boot counter
|
||||||
uint8_t framcounter = fram.read(0x0000);
|
uint8_t framcounter = fram.read(0x0000);
|
||||||
fram.write(0x0000, framcounter+1);
|
fram.write(0x0000, framcounter+1);
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"FRAM detected: 0x%04x/0x%04x (counter=%d)", manufacturerID, productID, framcounter);
|
logger->logDebug(GwLog::LOG, "FRAM detected: 0x%04x/0x%04x (counter=%d)", manufacturerID, productID, framcounter);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
hasFRAM = false;
|
hasFRAM = false;
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"NO FRAM detected");
|
logger->logDebug(GwLog::LOG, "NO FRAM detected");
|
||||||
|
}
|
||||||
|
// SD Card
|
||||||
|
hasSDCard = false;
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
if (config->getBool(config->useSDCard)) {
|
||||||
|
esp_err_t ret;
|
||||||
|
sdmmc_host_t host = SDSPI_HOST_DEFAULT();
|
||||||
|
host.slot = SPI3_HOST;
|
||||||
|
logger->logDebug(GwLog::DEBUG, "SDSPI_HOST: max_freq_khz=%d" , host.max_freq_khz);
|
||||||
|
spi_bus_config_t bus_cfg = {
|
||||||
|
.mosi_io_num = SD_SPI_MOSI,
|
||||||
|
.miso_io_num = SD_SPI_MISO,
|
||||||
|
.sclk_io_num = SD_SPI_CLK,
|
||||||
|
.quadwp_io_num = -1,
|
||||||
|
.quadhd_io_num = -1,
|
||||||
|
.max_transfer_sz = 4000,
|
||||||
|
};
|
||||||
|
ret = spi_bus_initialize((spi_host_device_t) host.slot, &bus_cfg, SDSPI_DEFAULT_DMA);
|
||||||
|
if (ret != ESP_OK) {
|
||||||
|
logger->logDebug(GwLog::ERROR, "Failed to initialize SPI bus for SD card");
|
||||||
|
} else {
|
||||||
|
sdspi_device_config_t slot_config = SDSPI_DEVICE_CONFIG_DEFAULT();
|
||||||
|
slot_config.gpio_cs = SD_SPI_CS;
|
||||||
|
slot_config.host_id = (spi_host_device_t) host.slot;
|
||||||
|
esp_vfs_fat_sdmmc_mount_config_t mount_config = {
|
||||||
|
.format_if_mount_failed = false,
|
||||||
|
.max_files = 5,
|
||||||
|
.allocation_unit_size = 16 * 1024
|
||||||
|
};
|
||||||
|
ret = esp_vfs_fat_sdspi_mount(MOUNT_POINT, &host, &slot_config, &mount_config, &sdcard);
|
||||||
|
if (ret != ESP_OK) {
|
||||||
|
if (ret == ESP_FAIL) {
|
||||||
|
logger->logDebug(GwLog::ERROR, "Failed to mount SD card filesystem");
|
||||||
|
} else {
|
||||||
|
// ret == 263 could be not powered up yet
|
||||||
|
logger->logDebug(GwLog::ERROR, "Failed to initialize SD card (error #%d)", ret);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger->logDebug(GwLog::LOG, "SD card filesystem mounted at '%s'", MOUNT_POINT);
|
||||||
|
hasSDCard = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasSDCard) {
|
||||||
|
// read some stats
|
||||||
|
String features = "";
|
||||||
|
if (sdcard->is_mem) features += "MEM "; // Memory card
|
||||||
|
if (sdcard->is_sdio) features += "IO "; // IO Card
|
||||||
|
if (sdcard->is_mmc) features += "MMC "; // MMC Card
|
||||||
|
if (sdcard->is_ddr) features += "DDR ";
|
||||||
|
// if (sdcard->is_uhs1) features += "UHS-1 ";
|
||||||
|
// ext_csd. Extended information
|
||||||
|
// uint8_t rev, uint8_t power_class
|
||||||
|
logger->logDebug(GwLog::LOG, "SD card features: %s", features);
|
||||||
|
logger->logDebug(GwLog::LOG, "SD card size: %lluMB", ((uint64_t) sdcard->csd.capacity) * sdcard->csd.sector_size / (1024 * 1024));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void powerInit(String powermode) {
|
||||||
|
// Max Power | Only 5.0V | Min Power
|
||||||
|
if (powermode == "Max Power" || powermode == "Only 5.0V") {
|
||||||
|
#ifdef HARDWARE_V21
|
||||||
|
setPortPin(OBP_POWER_50, true); // Power on 5.0V rail
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
setPortPin(OBP_POWER_EPD, true);// Power on ePaper display
|
||||||
|
setPortPin(OBP_POWER_SD, true); // Power on SD card
|
||||||
|
#endif
|
||||||
|
} else { // Min Power
|
||||||
|
#ifdef HARDWARE_V21
|
||||||
|
setPortPin(OBP_POWER_50, false); // Power off 5.0V rail
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
setPortPin(OBP_POWER_EPD, false);// Power off ePaper display
|
||||||
|
setPortPin(OBP_POWER_SD, false); // Power off SD card
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setPCF8574PortPin(uint pin, uint8_t value){
|
||||||
|
Wire.setClock(I2C_SPEED_LOW); // Set I2C clock on 10 kHz
|
||||||
|
if(pcf8574_Out.begin()){ // Check available and initialize PCF8574
|
||||||
|
pcf8574_Out.write(pin, value); // Toggle pin
|
||||||
|
}
|
||||||
|
Wire.setClock(I2C_SPEED); // Set I2C clock on 100 kHz
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void setPortPin(uint pin, bool value){
|
void setPortPin(uint pin, bool value){
|
||||||
pinMode(pin, OUTPUT);
|
pinMode(pin, OUTPUT);
|
||||||
digitalWrite(pin, value);
|
digitalWrite(pin, value);
|
||||||
@@ -138,10 +232,10 @@ void deepSleep(CommonData &common){
|
|||||||
getdisplay().setFullWindow(); // Set full Refresh
|
getdisplay().setFullWindow(); // Set full Refresh
|
||||||
getdisplay().fillScreen(common.bgcolor); // Clear screen
|
getdisplay().fillScreen(common.bgcolor); // Clear screen
|
||||||
getdisplay().setTextColor(common.fgcolor);
|
getdisplay().setTextColor(common.fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(85, 150);
|
getdisplay().setCursor(85, 150);
|
||||||
getdisplay().print("Sleep Mode");
|
getdisplay().print("Sleep Mode");
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(65, 175);
|
getdisplay().setCursor(65, 175);
|
||||||
getdisplay().print("To wake up press key and wait 5s");
|
getdisplay().print("To wake up press key and wait 5s");
|
||||||
getdisplay().nextPage(); // Update display contents
|
getdisplay().nextPage(); // Update display contents
|
||||||
@@ -163,10 +257,10 @@ void deepSleep(CommonData &common){
|
|||||||
//getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
//getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
getdisplay().fillScreen(common.bgcolor); // Clear screen
|
getdisplay().fillScreen(common.bgcolor); // Clear screen
|
||||||
getdisplay().setTextColor(common.fgcolor);
|
getdisplay().setTextColor(common.fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(85, 150);
|
getdisplay().setCursor(85, 150);
|
||||||
getdisplay().print("Sleep Mode");
|
getdisplay().print("Sleep Mode");
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(65, 175);
|
getdisplay().setCursor(65, 175);
|
||||||
getdisplay().print("To wake up press wheel and wait 5s");
|
getdisplay().print("To wake up press wheel and wait 5s");
|
||||||
getdisplay().nextPage(); // Partial update
|
getdisplay().nextPage(); // Partial update
|
||||||
@@ -277,30 +371,63 @@ String xdrDelete(String input){
|
|||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
Point rotatePoint(const Point& origin, const Point& p, double angle) {
|
|
||||||
// rotate poind around origin by degrees
|
|
||||||
Point rotated;
|
|
||||||
double phi = angle * M_PI / 180.0;
|
|
||||||
double dx = p.x - origin.x;
|
|
||||||
double dy = p.y - origin.y;
|
|
||||||
rotated.x = origin.x + cos(phi) * dx - sin(phi) * dy;
|
|
||||||
rotated.y = origin.y + sin(phi) * dx + cos(phi) * dy;
|
|
||||||
return rotated;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<Point> rotatePoints(const Point& origin, const std::vector<Point>& pts, double angle) {
|
|
||||||
std::vector<Point> rotatedPoints;
|
|
||||||
for (const auto& p : pts) {
|
|
||||||
rotatedPoints.push_back(rotatePoint(origin, p, angle));
|
|
||||||
}
|
|
||||||
return rotatedPoints;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fillPoly4(const std::vector<Point>& p4, uint16_t color) {
|
void fillPoly4(const std::vector<Point>& p4, uint16_t color) {
|
||||||
getdisplay().fillTriangle(p4[0].x, p4[0].y, p4[1].x, p4[1].y, p4[2].x, p4[2].y, color);
|
getdisplay().fillTriangle(p4[0].x, p4[0].y, p4[1].x, p4[1].y, p4[2].x, p4[2].y, color);
|
||||||
getdisplay().fillTriangle(p4[0].x, p4[0].y, p4[2].x, p4[2].y, p4[3].x, p4[3].y, color);
|
getdisplay().fillTriangle(p4[0].x, p4[0].y, p4[2].x, p4[2].y, p4[3].x, p4[3].y, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawPoly(const std::vector<Point>& points, uint16_t color) {
|
||||||
|
size_t polysize = points.size();
|
||||||
|
for (size_t i = 0; i < polysize - 1; i++) {
|
||||||
|
getdisplay().drawLine(points[i].x, points[i].y, points[i+1].x, points[i+1].y, color);
|
||||||
|
}
|
||||||
|
// close path
|
||||||
|
getdisplay().drawLine(points[polysize-1].x, points[polysize-1].y, points[0].x, points[0].y, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Split string into words, whitespace separated
|
||||||
|
std::vector<String> split(const String &s) {
|
||||||
|
std::vector<String> words;
|
||||||
|
String word = "";
|
||||||
|
for (size_t i = 0; i < s.length(); i++) {
|
||||||
|
if (s[i] == ' ' || s[i] == '\t' || s[i] == '\r' || s[i] == '\n') {
|
||||||
|
if (word.length() > 0) {
|
||||||
|
words.push_back(word);
|
||||||
|
word = "";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
word += s[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (word.length() > 0) {
|
||||||
|
words.push_back(word);
|
||||||
|
}
|
||||||
|
return words;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wordwrap single line, monospaced font
|
||||||
|
std::vector<String> wordwrap(String &line, uint16_t maxwidth) {
|
||||||
|
std::vector<String> lines;
|
||||||
|
std::vector<String> words = split(line);
|
||||||
|
String currentLine = "";
|
||||||
|
for (const auto& word : words) {
|
||||||
|
if (currentLine.length() + word.length() + 1 > maxwidth) {
|
||||||
|
if (currentLine.length() > 0) {
|
||||||
|
lines.push_back(currentLine);
|
||||||
|
currentLine = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (currentLine.length() > 0) {
|
||||||
|
currentLine += " ";
|
||||||
|
}
|
||||||
|
currentLine += word;
|
||||||
|
}
|
||||||
|
if (currentLine.length() > 0) {
|
||||||
|
lines.push_back(currentLine);
|
||||||
|
}
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
|
||||||
// Draw centered text
|
// Draw centered text
|
||||||
void drawTextCenter(int16_t cx, int16_t cy, String text) {
|
void drawTextCenter(int16_t cx, int16_t cy, String text) {
|
||||||
int16_t x1, y1;
|
int16_t x1, y1;
|
||||||
@@ -319,6 +446,24 @@ void drawTextRalign(int16_t x, int16_t y, String text) {
|
|||||||
getdisplay().print(text);
|
getdisplay().print(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Draw text inside box, normal or inverted
|
||||||
|
void drawTextBoxed(Rect box, String text, uint16_t fg, uint16_t bg, bool inverted, bool border) {
|
||||||
|
if (inverted) {
|
||||||
|
getdisplay().fillRect(box.x, box.y, box.w, box.h, fg);
|
||||||
|
getdisplay().setTextColor(bg);
|
||||||
|
} else {
|
||||||
|
if (border) {
|
||||||
|
getdisplay().fillRect(box.x + 1, box.y + 1, box.w - 2, box.h - 2, bg);
|
||||||
|
getdisplay().drawRect(box.x, box.y, box.w, box.h, fg);
|
||||||
|
}
|
||||||
|
getdisplay().setTextColor(fg);
|
||||||
|
}
|
||||||
|
uint16_t border_offset = box.h / 4; // 25% of box height
|
||||||
|
getdisplay().setCursor(box.x + border_offset, box.y + box.h - border_offset);
|
||||||
|
getdisplay().print(text);
|
||||||
|
getdisplay().setTextColor(fg);
|
||||||
|
}
|
||||||
|
|
||||||
// Show a triangle for trend direction high (x, y is the left edge)
|
// Show a triangle for trend direction high (x, y is the left edge)
|
||||||
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color){
|
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color){
|
||||||
getdisplay().fillTriangle(x, y, x+size*2, y, x+size, y-size*2, color);
|
getdisplay().fillTriangle(x, y, x+size*2, y, x+size, y-size*2, color);
|
||||||
@@ -348,7 +493,7 @@ void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatVa
|
|||||||
|
|
||||||
// Show status info
|
// Show status info
|
||||||
getdisplay().setTextColor(commonData.fgcolor);
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(0, 15);
|
getdisplay().setCursor(0, 15);
|
||||||
if(commonData.status.wifiApOn){
|
if(commonData.status.wifiApOn){
|
||||||
getdisplay().print(" AP ");
|
getdisplay().print(" AP ");
|
||||||
@@ -418,7 +563,7 @@ void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatVa
|
|||||||
getdisplay().setTextColor(commonData.fgcolor);
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
getdisplay().drawRect(201, 0, 23, 19, commonData.fgcolor);
|
getdisplay().drawRect(201, 0, 23, 19, commonData.fgcolor);
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
drawTextCenter(211, 9, String(commonData.data.actpage));
|
drawTextCenter(211, 9, String(commonData.data.actpage));
|
||||||
heartbeat = !heartbeat;
|
heartbeat = !heartbeat;
|
||||||
|
|
||||||
@@ -427,7 +572,7 @@ void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatVa
|
|||||||
String timesource = commonData.config->getString(commonData.config->timeSource);
|
String timesource = commonData.config->getString(commonData.config->timeSource);
|
||||||
double tz = commonData.config->getString(commonData.config->timeZone).toDouble();
|
double tz = commonData.config->getString(commonData.config->timeZone).toDouble();
|
||||||
getdisplay().setTextColor(commonData.fgcolor);
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(230, 15);
|
getdisplay().setCursor(230, 15);
|
||||||
if (timesource == "RTC" or timesource == "iRTC") {
|
if (timesource == "RTC" or timesource == "iRTC") {
|
||||||
// TODO take DST into account
|
// TODO take DST into account
|
||||||
@@ -546,6 +691,47 @@ void displayFooter(CommonData &commonData) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Alarm overlay, to be drawn as very last draw operation
|
||||||
|
void displayAlarm(CommonData &commonData) {
|
||||||
|
|
||||||
|
const uint16_t x = 50; // overlay area
|
||||||
|
const uint16_t y = 100;
|
||||||
|
const uint16_t w = 300;
|
||||||
|
const uint16_t h = 150;
|
||||||
|
|
||||||
|
getdisplay().setFont(&Atari16px);
|
||||||
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
|
|
||||||
|
// overlay
|
||||||
|
getdisplay().drawRect(x, y, w, h, commonData.fgcolor);
|
||||||
|
getdisplay().fillRect(x + 1, y + 1, w - 1, h - 1, commonData.bgcolor);
|
||||||
|
getdisplay().drawRect(x + 3, y + 3, w - 5, h - 5, commonData.fgcolor);
|
||||||
|
|
||||||
|
// exclamation icon in left top corner
|
||||||
|
getdisplay().drawXBitmap(x + 16, y + 16, exclamation_bits, exclamation_width, exclamation_height, commonData.fgcolor);
|
||||||
|
|
||||||
|
// title
|
||||||
|
getdisplay().setCursor(x + 64, y + 30);
|
||||||
|
getdisplay().print("A L A R M");
|
||||||
|
getdisplay().setCursor(x + 64, y + 48);
|
||||||
|
getdisplay().print("#" + commonData.alarm.id);
|
||||||
|
getdisplay().print(" from ");
|
||||||
|
getdisplay().print(commonData.alarm.source);
|
||||||
|
|
||||||
|
// message, but maximum 4 lines
|
||||||
|
std::vector<String> lines = wordwrap (commonData.alarm.message, w - 16 - 8 / 8);
|
||||||
|
int n = 0;
|
||||||
|
for (const auto& l : lines) {
|
||||||
|
getdisplay().setCursor(x + 16, y + 80 + n);
|
||||||
|
getdisplay().print(l);
|
||||||
|
n += 16;
|
||||||
|
if (n > 64) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
drawTextCenter(x + w / 2, y + h - 16, "Press button 1 to dismiss alarm");
|
||||||
|
}
|
||||||
|
|
||||||
// Sunset und sunrise calculation
|
// Sunset und sunrise calculation
|
||||||
SunData calcSunsetSunrise(double time, double date, double latitude, double longitude, float timezone){
|
SunData calcSunsetSunrise(double time, double date, double latitude, double longitude, float timezone){
|
||||||
SunData returnset;
|
SunData returnset;
|
||||||
@@ -681,7 +867,7 @@ void generatorGraphic(uint x, uint y, int pcolor, int bcolor){
|
|||||||
getdisplay().fillCircle(xb, yb, 41, bcolor);
|
getdisplay().fillCircle(xb, yb, 41, bcolor);
|
||||||
// Insert G
|
// Insert G
|
||||||
getdisplay().setTextColor(pcolor);
|
getdisplay().setTextColor(pcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
getdisplay().setFont(&Ubuntu_Bold32pt8b);
|
||||||
getdisplay().setCursor(xb-22, yb+20);
|
getdisplay().setCursor(xb-22, yb+20);
|
||||||
getdisplay().print("G");
|
getdisplay().print("G");
|
||||||
}
|
}
|
||||||
@@ -727,4 +913,30 @@ void doImageRequest(GwApi *api, int *pageno, const PageStruct pages[MAX_PAGE_NUM
|
|||||||
imageBuffer.clear();
|
imageBuffer.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Calculate the distance between two Geo coordinates
|
||||||
|
double distanceBetweenCoordinates(double lat1, double lon1, double lat2, double lon2) {
|
||||||
|
// Grad → Radiant
|
||||||
|
double lat1Rad = lat1 * DEG_TO_RAD;
|
||||||
|
double lon1Rad = lon1 * DEG_TO_RAD;
|
||||||
|
double lat2Rad = lat2 * DEG_TO_RAD;
|
||||||
|
double lon2Rad = lon2 * DEG_TO_RAD;
|
||||||
|
|
||||||
|
// Differenzen
|
||||||
|
double dLat = lat2Rad - lat1Rad;
|
||||||
|
double dLon = lon2Rad - lon1Rad;
|
||||||
|
|
||||||
|
// Haversine-Formel
|
||||||
|
double a = sin(dLat / 2.0) * sin(dLat / 2.0) +
|
||||||
|
cos(lat1Rad) * cos(lat2Rad) *
|
||||||
|
sin(dLon / 2.0) * sin(dLon / 2.0);
|
||||||
|
|
||||||
|
double c = 2.0 * atan2(sqrt(a), sqrt(1.0 - a));
|
||||||
|
|
||||||
|
// Abstand in Metern
|
||||||
|
return double(EARTH_RADIUS) * c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,8 +4,16 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "OBP60Hardware.h"
|
#include "OBP60Hardware.h"
|
||||||
#include "LedSpiTask.h"
|
#include "LedSpiTask.h"
|
||||||
|
#include "Graphics.h"
|
||||||
#include <GxEPD2_BW.h> // E-paper lib V2
|
#include <GxEPD2_BW.h> // E-paper lib V2
|
||||||
#include <Adafruit_FRAM_I2C.h> // I2C FRAM
|
#include <Adafruit_FRAM_I2C.h> // I2C FRAM
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#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
|
||||||
@@ -15,6 +23,7 @@
|
|||||||
#define FRAM_VOLTAGE_AVG 0x000A
|
#define FRAM_VOLTAGE_AVG 0x000A
|
||||||
#define FRAM_VOLTAGE_TREND 0x000B
|
#define FRAM_VOLTAGE_TREND 0x000B
|
||||||
#define FRAM_VOLTAGE_MODE 0x000C
|
#define FRAM_VOLTAGE_MODE 0x000C
|
||||||
|
// Wind page
|
||||||
#define FRAM_WIND_SIZE 0x000D
|
#define FRAM_WIND_SIZE 0x000D
|
||||||
#define FRAM_WIND_SRC 0x000E
|
#define FRAM_WIND_SRC 0x000E
|
||||||
#define FRAM_WIND_MODE 0x000F
|
#define FRAM_WIND_MODE 0x000F
|
||||||
@@ -22,23 +31,31 @@
|
|||||||
#define FRAM_BAROGRAPH_START 0x0400
|
#define FRAM_BAROGRAPH_START 0x0400
|
||||||
#define FRAM_BAROGRAPH_END 0x13FF
|
#define FRAM_BAROGRAPH_END 0x13FF
|
||||||
|
|
||||||
|
#define PI 3.1415926535897932384626433832795
|
||||||
|
#define EARTH_RADIUS 6371000.0
|
||||||
|
|
||||||
extern Adafruit_FRAM_I2C fram;
|
extern Adafruit_FRAM_I2C fram;
|
||||||
extern bool hasFRAM;
|
extern bool hasFRAM;
|
||||||
|
extern bool hasSDCard;
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
extern sdmmc_card_t *sdcard;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Fonts declarations for display (#includes see OBP60Extensions.cpp)
|
// Fonts declarations for display (#includes see OBP60Extensions.cpp)
|
||||||
extern const GFXfont Ubuntu_Bold8pt7b;
|
|
||||||
extern const GFXfont Ubuntu_Bold10pt7b;
|
|
||||||
extern const GFXfont Ubuntu_Bold12pt7b;
|
|
||||||
extern const GFXfont Ubuntu_Bold16pt7b;
|
|
||||||
extern const GFXfont Ubuntu_Bold20pt7b;
|
|
||||||
extern const GFXfont Ubuntu_Bold20pt8b;
|
|
||||||
extern const GFXfont Ubuntu_Bold32pt7b;
|
|
||||||
extern const GFXfont DSEG7Classic_BoldItalic16pt7b;
|
extern const GFXfont DSEG7Classic_BoldItalic16pt7b;
|
||||||
extern const GFXfont DSEG7Classic_BoldItalic20pt7b;
|
extern const GFXfont DSEG7Classic_BoldItalic20pt7b;
|
||||||
|
extern const GFXfont DSEG7Classic_BoldItalic26pt7b;
|
||||||
extern const GFXfont DSEG7Classic_BoldItalic30pt7b;
|
extern const GFXfont DSEG7Classic_BoldItalic30pt7b;
|
||||||
extern const GFXfont DSEG7Classic_BoldItalic42pt7b;
|
extern const GFXfont DSEG7Classic_BoldItalic42pt7b;
|
||||||
extern const GFXfont DSEG7Classic_BoldItalic60pt7b;
|
extern const GFXfont DSEG7Classic_BoldItalic60pt7b;
|
||||||
|
extern const GFXfont Ubuntu_Bold8pt8b;
|
||||||
|
extern const GFXfont Ubuntu_Bold10pt8b;
|
||||||
|
extern const GFXfont Ubuntu_Bold12pt8b;
|
||||||
|
extern const GFXfont Ubuntu_Bold16pt8b;
|
||||||
|
extern const GFXfont Ubuntu_Bold20pt8b;
|
||||||
|
extern const GFXfont Ubuntu_Bold32pt8b;
|
||||||
extern const GFXfont Atari16px;
|
extern const GFXfont Atari16px;
|
||||||
|
extern const GFXfont IBM8x8px;
|
||||||
|
|
||||||
// Global functions
|
// Global functions
|
||||||
#ifdef DISPLAY_GDEW042T2
|
#ifdef DISPLAY_GDEW042T2
|
||||||
@@ -57,22 +74,23 @@ GxEPD2_BW<GxEPD2_420_GYE042A87, GxEPD2_420_GYE042A87::HEIGHT> & getdisplay();
|
|||||||
GxEPD2_BW<GxEPD2_420_SE0420NQ04, GxEPD2_420_SE0420NQ04::HEIGHT> & getdisplay();
|
GxEPD2_BW<GxEPD2_420_SE0420NQ04, GxEPD2_420_SE0420NQ04::HEIGHT> & getdisplay();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct Point {
|
// Page display return values
|
||||||
double x;
|
#define PAGE_OK 0 // all ok, do nothing
|
||||||
double y;
|
#define PAGE_UPDATE 1 // page wants display to update
|
||||||
};
|
#define PAGE_HIBERNATE 2 // page wants displey to hibernate
|
||||||
Point rotatePoint(const Point& origin, const Point& p, double angle);
|
|
||||||
std::vector<Point> rotatePoints(const Point& origin, const std::vector<Point>& pts, double angle);
|
|
||||||
void fillPoly4(const std::vector<Point>& p4, uint16_t color);
|
void fillPoly4(const std::vector<Point>& p4, uint16_t color);
|
||||||
|
void drawPoly(const std::vector<Point>& points, uint16_t color);
|
||||||
|
|
||||||
void deepSleep(CommonData &common);
|
void deepSleep(CommonData &common);
|
||||||
|
|
||||||
uint8_t getLastPage();
|
uint8_t getLastPage();
|
||||||
|
|
||||||
void hardwareInit(GwApi *api);
|
void hardwareInit(GwApi *api);
|
||||||
|
void powerInit(String powermode);
|
||||||
|
|
||||||
|
void setPCF8574PortPin(uint pin, uint8_t value);// Set PCF8574 port pin
|
||||||
void setPortPin(uint pin, bool value); // Set port pin for extension port
|
void setPortPin(uint pin, bool value); // Set port pin for extension port
|
||||||
|
|
||||||
void togglePortPin(uint pin); // Toggle extension port pin
|
void togglePortPin(uint pin); // Toggle extension port pin
|
||||||
|
|
||||||
Color colorMapping(const String &colorString); // Color mapping string to CHSV colors
|
Color colorMapping(const String &colorString); // Color mapping string to CHSV colors
|
||||||
@@ -91,12 +109,14 @@ String xdrDelete(String input); // Delete xdr prefix from string
|
|||||||
|
|
||||||
void drawTextCenter(int16_t cx, int16_t cy, String text);
|
void drawTextCenter(int16_t cx, int16_t cy, String text);
|
||||||
void drawTextRalign(int16_t x, int16_t y, String text);
|
void drawTextRalign(int16_t x, int16_t y, String text);
|
||||||
|
void drawTextBoxed(Rect box, String text, uint16_t fg, uint16_t bg, bool inverted, bool border);
|
||||||
|
|
||||||
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
||||||
void displayTrendLow(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
void displayTrendLow(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
||||||
|
|
||||||
void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatValue *time, GwApi::BoatValue *hdop); // Draw display header
|
void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatValue *time, GwApi::BoatValue *hdop); // Draw display header
|
||||||
void displayFooter(CommonData &commonData);
|
void displayFooter(CommonData &commonData);
|
||||||
|
void displayAlarm(CommonData &commonData);
|
||||||
|
|
||||||
SunData calcSunsetSunrise(double time, double date, double latitude, double longitude, float timezone); // Calulate sunset and sunrise
|
SunData calcSunsetSunrise(double time, double date, double latitude, double longitude, float timezone); // Calulate sunset and sunrise
|
||||||
SunData calcSunsetSunriseRTC(struct tm *rtctime, double latitude, double longitude, float timezone);
|
SunData calcSunsetSunriseRTC(struct tm *rtctime, double latitude, double longitude, float timezone);
|
||||||
@@ -142,12 +162,12 @@ static unsigned char fram_bits[] PROGMEM = {
|
|||||||
0xff, 0xff, 0xf8, 0x1f, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f,
|
0xff, 0xff, 0xf8, 0x1f, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f,
|
||||||
0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f };
|
0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f };
|
||||||
|
|
||||||
static unsigned char ap_bits[] = {
|
static unsigned char ap_bits[] PROGMEM = {
|
||||||
0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0xc2, 0x21, 0x30, 0x06, 0x08, 0x08,
|
0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0xc2, 0x21, 0x30, 0x06, 0x08, 0x08,
|
||||||
0xc0, 0x01, 0x20, 0x02, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x01, 0xc0, 0x01,
|
0xc0, 0x01, 0x20, 0x02, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x01, 0xc0, 0x01,
|
||||||
0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00 };
|
0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00 };
|
||||||
|
|
||||||
static unsigned char dish_bits[] PROGMEM= {
|
static unsigned char dish_bits[] PROGMEM = {
|
||||||
0x3c, 0x00, 0x42, 0x18, 0xfa, 0x1b, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x09,
|
0x3c, 0x00, 0x42, 0x18, 0xfa, 0x1b, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x09,
|
||||||
0x82, 0x08, 0x06, 0x0a, 0x0e, 0x1b, 0x9c, 0x2b, 0x38, 0x2b, 0x74, 0x20,
|
0x82, 0x08, 0x06, 0x0a, 0x0e, 0x1b, 0x9c, 0x2b, 0x38, 0x2b, 0x74, 0x20,
|
||||||
0xec, 0x1f, 0x1c, 0x00, 0xf4, 0x00, 0xfe, 0x03 };
|
0xec, 0x1f, 0x1c, 0x00, 0xf4, 0x00, 0xfe, 0x03 };
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,8 @@
|
|||||||
// Direction pin for RS485 NMEA0183
|
// Direction pin for RS485 NMEA0183
|
||||||
#define OBP_DIRECTION_PIN 18
|
#define OBP_DIRECTION_PIN 18
|
||||||
// I2C
|
// I2C
|
||||||
#define I2C_SPEED 10000UL // 10kHz clock speed on I2C bus
|
#define I2C_SPEED 10000UL // 100kHz clock speed on I2C bus
|
||||||
|
#define I2C_SPEED_LOW 1000UL // 10kHz clock speed on I2C bus for external bus
|
||||||
#define OBP_I2C_SDA 47
|
#define OBP_I2C_SDA 47
|
||||||
#define OBP_I2C_SCL 21
|
#define OBP_I2C_SCL 21
|
||||||
// DS1388 RTC
|
// DS1388 RTC
|
||||||
@@ -42,6 +43,8 @@
|
|||||||
#define OBP_SPI_DIN 48
|
#define OBP_SPI_DIN 48
|
||||||
#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)
|
||||||
|
#define GxEPD_WIDTH 400 // Display width
|
||||||
|
#define GxEPD_HEIGHT 300 // Display height
|
||||||
|
|
||||||
// GPS (NEO-6M, NEO-M8N, ATGM336H)
|
// GPS (NEO-6M, NEO-M8N, ATGM336H)
|
||||||
#define OBP_GPS_RX 2
|
#define OBP_GPS_RX 2
|
||||||
@@ -82,7 +85,8 @@
|
|||||||
// Direction pin for RS485 NMEA0183
|
// Direction pin for RS485 NMEA0183
|
||||||
#define OBP_DIRECTION_PIN 8
|
#define OBP_DIRECTION_PIN 8
|
||||||
// I2C
|
// I2C
|
||||||
#define I2C_SPEED 10000UL // 10kHz clock speed on I2C bus
|
#define I2C_SPEED 100000UL // 100kHz clock speed on I2C bus
|
||||||
|
#define I2C_SPEED_LOW 1000UL // 10kHz clock speed on I2C bus for external 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
|
||||||
@@ -119,11 +123,13 @@
|
|||||||
#define OBP_SPI_DIN 11
|
#define OBP_SPI_DIN 11
|
||||||
#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)
|
||||||
|
#define GxEPD_WIDTH 400 // Display width
|
||||||
|
#define GxEPD_HEIGHT 300 // Display height
|
||||||
// SPI SD-Card
|
// SPI SD-Card
|
||||||
#define SD_SPI_CS 10
|
#define SD_SPI_CS GPIO_NUM_10
|
||||||
#define SD_SPI_MOSI 40
|
#define SD_SPI_MOSI GPIO_NUM_40
|
||||||
#define SD_SPI_CLK 39
|
#define SD_SPI_CLK GPIO_NUM_39
|
||||||
#define SD_SPI_MISO 13
|
#define SD_SPI_MISO GPIO_NUM_13
|
||||||
|
|
||||||
// GPS (NEO-6M, NEO-M8N, ATGM336H)
|
// GPS (NEO-6M, NEO-M8N, ATGM336H)
|
||||||
#define OBP_GPS_RX 19
|
#define OBP_GPS_RX 19
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ void qrWiFi(String ssid, String passwd, uint16_t fgcolor, uint16_t bgcolor){
|
|||||||
box_y = box_y + box_s;
|
box_y = box_y + box_s;
|
||||||
box_x = init_x;
|
box_x = init_x;
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
getdisplay().setFont(&Ubuntu_Bold32pt8b);
|
||||||
getdisplay().setTextColor(fgcolor);
|
getdisplay().setTextColor(fgcolor);
|
||||||
getdisplay().setCursor(140, 285);
|
getdisplay().setCursor(140, 285);
|
||||||
getdisplay().print("WiFi");
|
getdisplay().print("WiFi");
|
||||||
|
|||||||
333
lib/obp60task/OBPDataOperations.cpp
Normal file
333
lib/obp60task/OBPDataOperations.cpp
Normal file
@@ -0,0 +1,333 @@
|
|||||||
|
#include "OBPDataOperations.h"
|
||||||
|
#include "BoatDataCalibration.h" // Functions lib for data instance calibration
|
||||||
|
#include <math.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 mltplr = 1000; // Multiplier which transforms original <double> value into buffer type format
|
||||||
|
double hstryMinVal = 0; // Minimum value for these history buffers
|
||||||
|
twdHstryMax = 2 * M_PI; // Max value for wind direction (TWD, AWD) in rad [0...2*PI]
|
||||||
|
twsHstryMax = 65; // Max value for wind speed (TWS, AWS) in m/s [0..65] (limit due to type capacity of buffer - shifted by <mltplr>)
|
||||||
|
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
|
||||||
|
mltplr = 10000; // Store 4 decimals for course data
|
||||||
|
hstryBufList.twdHstry->setMetaData("TWD", "formatCourse", hstryUpdFreq, mltplr, hstryMinVal, twdHstryMax);
|
||||||
|
hstryBufList.awdHstry->setMetaData("AWD", "formatCourse", hstryUpdFreq, mltplr, hstryMinVal, twdHstryMax);
|
||||||
|
mltplr = 1000; // Store 3 decimals for windspeed data
|
||||||
|
hstryBufList.twsHstry->setMetaData("TWS", "formatKnots", hstryUpdFreq, mltplr, hstryMinVal, twsHstryMax);
|
||||||
|
hstryBufList.awsHstry->setMetaData("AWS", "formatKnots", hstryUpdFreq, mltplr, 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 double twd, tws, 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) {
|
||||||
|
// if (!useSimuData) {
|
||||||
|
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 = calBVal->value;
|
||||||
|
if (twd >= twdHstryMin && twd <= twdHstryMax) {
|
||||||
|
hstryBufList.twdHstry->add(twd);
|
||||||
|
LOG_DEBUG(GwLog::DEBUG,"obp60task handleHstryBuf: calBVal.value %.2f, twd: %.2f, twdHstryMin: %.1f, twdHstryMax: %.2f", calBVal->value, twd, twdHstryMin, twdHstryMax);
|
||||||
|
}
|
||||||
|
delete calBVal;
|
||||||
|
calBVal = nullptr;
|
||||||
|
} else if (useSimuData) {
|
||||||
|
// } else {
|
||||||
|
twd += random(-20, 20);
|
||||||
|
twd += static_cast<double>(random(-349, 349) / 1000.0); // add up to +/- 20 degree in RAD
|
||||||
|
twd = WindUtils::to2PI(twd);
|
||||||
|
hstryBufList.twdHstry->add(twd);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = calBVal->value;
|
||||||
|
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 += static_cast<double>(random(-5000, 5000) / 1000.0); // add up to +/- 5 m/s TWS speed
|
||||||
|
tws = constrain(tws, 0, 40); // Limit TWS to [0..40] 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 = calBVal->value;
|
||||||
|
if (awd >= awdHstryMin && awd <= awdHstryMax) {
|
||||||
|
hstryBufList.awdHstry->add(awd);
|
||||||
|
}
|
||||||
|
delete calBVal;
|
||||||
|
calBVal = nullptr;
|
||||||
|
} else if (useSimuData) {
|
||||||
|
awd += static_cast<double>(random(-349, 349) / 1000.0); // add up to +/- 20 degree in RAD
|
||||||
|
awd = WindUtils::to2PI(awd);
|
||||||
|
hstryBufList.awdHstry->add(awd);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = calBVal->value;
|
||||||
|
if (aws >= awsHstryMin && aws <= awsHstryMax) {
|
||||||
|
hstryBufList.awsHstry->add(aws);
|
||||||
|
}
|
||||||
|
delete calBVal;
|
||||||
|
calBVal = nullptr;
|
||||||
|
} else if (useSimuData) {
|
||||||
|
aws += static_cast<double>(random(-5000, 5000) / 1000.0); // add up to +/- 5 m/s TWS speed
|
||||||
|
aws = constrain(aws, 0, 40); // Limit TWS to [0..40] m/s
|
||||||
|
hstryBufList.awsHstry->add(aws);
|
||||||
|
}
|
||||||
|
LOG_DEBUG(GwLog::DEBUG,"obp60task handleHstryBuf-End: Buffer twdHstry: %.3f, twsHstry: %.3f, awdHstry: %.3f, awsHstry: %.3f", hstryBufList.twdHstry->getLast(), hstryBufList.twsHstry->getLast(),
|
||||||
|
hstryBufList.awdHstry->getLast(),hstryBufList.awsHstry->getLast());
|
||||||
|
}
|
||||||
|
// --- Class HstryBuf ---------------
|
||||||
|
|
||||||
|
// --- Class WindUtils --------------
|
||||||
|
double WindUtils::to2PI(double a)
|
||||||
|
{
|
||||||
|
a = fmod(a, M_TWOPI);
|
||||||
|
if (a < 0.0) {
|
||||||
|
a += M_TWOPI;
|
||||||
|
}
|
||||||
|
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.0);
|
||||||
|
if (a < 0.0) {
|
||||||
|
a += 360.0;
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
double WindUtils::to180(double a)
|
||||||
|
{
|
||||||
|
a += 180.0;
|
||||||
|
a = to360(a);
|
||||||
|
a -= 180.0;
|
||||||
|
|
||||||
|
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 --------------
|
||||||
90
lib/obp60task/OBPDataOperations.h
Normal file
90
lib/obp60task/OBPDataOperations.h
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
// Function lib for history buffer handling, true wind calculation, and other operations on boat data
|
||||||
|
#pragma once
|
||||||
|
#include "OBPRingBuffer.h"
|
||||||
|
#include "obp60task.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
RingBuffer<uint16_t>* twdHstry;
|
||||||
|
RingBuffer<uint16_t>* twsHstry;
|
||||||
|
RingBuffer<uint16_t>* awdHstry;
|
||||||
|
RingBuffer<uint16_t>* awsHstry;
|
||||||
|
} tBoatHstryData; // Holds pointers to all history buffers for boat data
|
||||||
|
|
||||||
|
class HstryBuf {
|
||||||
|
private:
|
||||||
|
GwLog *logger;
|
||||||
|
|
||||||
|
RingBuffer<uint16_t> twdHstry; // Circular buffer to store true wind direction values
|
||||||
|
RingBuffer<uint16_t> twsHstry; // Circular buffer to store true wind speed values (TWS)
|
||||||
|
RingBuffer<uint16_t> awdHstry; // Circular buffer to store apparent wind direction values
|
||||||
|
RingBuffer<uint16_t> awsHstry; // Circular buffer to store apparent xwind speed values (AWS)
|
||||||
|
double twdHstryMin; // Min value for wind direction (TWD) in history buffer
|
||||||
|
double twdHstryMax; // Max value for wind direction (TWD) in history buffer
|
||||||
|
double twsHstryMin;
|
||||||
|
double twsHstryMax;
|
||||||
|
double awdHstryMin;
|
||||||
|
double awdHstryMax;
|
||||||
|
double awsHstryMin;
|
||||||
|
double awsHstryMax;
|
||||||
|
|
||||||
|
// boat values for buffers and for true wind calculation
|
||||||
|
GwApi::BoatValue *twdBVal, *twsBVal, *twaBVal, *awdBVal, *awsBVal;
|
||||||
|
GwApi::BoatValue *awaBVal, *hdtBVal, *hdmBVal, *varBVal, *cogBVal, *sogBVal;
|
||||||
|
|
||||||
|
public:
|
||||||
|
tBoatHstryData hstryBufList;
|
||||||
|
|
||||||
|
HstryBuf(){
|
||||||
|
hstryBufList = {&twdHstry, &twsHstry, &awdHstry, &awsHstry}; // Generate history buffers of zero size
|
||||||
|
};
|
||||||
|
|
||||||
|
HstryBuf(int size) {
|
||||||
|
hstryBufList = {&twdHstry, &twsHstry, &awdHstry, &awsHstry};
|
||||||
|
hstryBufList.twdHstry->resize(size); // store <size> xWD values for <size>/60 minutes history
|
||||||
|
hstryBufList.twsHstry->resize(size);
|
||||||
|
hstryBufList.awdHstry->resize(size);
|
||||||
|
hstryBufList.awsHstry->resize(size);
|
||||||
|
};
|
||||||
|
void init(BoatValueList* boatValues, GwLog *log);
|
||||||
|
void handleHstryBuf(bool useSimuData);
|
||||||
|
};
|
||||||
|
|
||||||
|
class WindUtils {
|
||||||
|
private:
|
||||||
|
GwApi::BoatValue *twdBVal, *twsBVal, *twaBVal;
|
||||||
|
GwApi::BoatValue *awaBVal, *awsBVal, *cogBVal, *stwBVal, *sogBVal, *hdtBVal, *hdmBVal, *varBVal;
|
||||||
|
static constexpr double DBL_MAX = std::numeric_limits<double>::max();
|
||||||
|
|
||||||
|
public:
|
||||||
|
WindUtils(BoatValueList* boatValues){
|
||||||
|
twdBVal = boatValues->findValueOrCreate("TWD");
|
||||||
|
twsBVal = boatValues->findValueOrCreate("TWS");
|
||||||
|
twaBVal = boatValues->findValueOrCreate("TWA");
|
||||||
|
awaBVal = boatValues->findValueOrCreate("AWA");
|
||||||
|
awsBVal = boatValues->findValueOrCreate("AWS");
|
||||||
|
cogBVal = boatValues->findValueOrCreate("COG");
|
||||||
|
stwBVal = boatValues->findValueOrCreate("STW");
|
||||||
|
sogBVal = boatValues->findValueOrCreate("SOG");
|
||||||
|
hdtBVal = boatValues->findValueOrCreate("HDT");
|
||||||
|
hdmBVal = boatValues->findValueOrCreate("HDM");
|
||||||
|
varBVal = boatValues->findValueOrCreate("VAR");
|
||||||
|
};
|
||||||
|
|
||||||
|
static double to2PI(double a);
|
||||||
|
static double toPI(double a);
|
||||||
|
static double to360(double a);
|
||||||
|
static double to180(double a);
|
||||||
|
void toCart(const double* phi, const double* r, double* x, double* y);
|
||||||
|
void toPol(const double* x, const double* y, double* phi, double* r);
|
||||||
|
void addPolar(const double* phi1, const double* r1,
|
||||||
|
const double* phi2, const double* r2,
|
||||||
|
double* phi, double* r);
|
||||||
|
void calcTwdSA(const double* AWA, const double* AWS,
|
||||||
|
const double* CTW, const double* STW, const double* HDT,
|
||||||
|
double* TWD, double* TWS, double* TWA);
|
||||||
|
static double calcHDT(const double* hdmVal, const double* varVal, const double* cogVal, const double* sogVal);
|
||||||
|
bool calcTrueWind(const double* awaVal, const double* awsVal,
|
||||||
|
const double* cogVal, const double* stwVal, const double* sogVal, const double* hdtVal,
|
||||||
|
const double* hdmVal, const double* varVal, double* twdVal, double* twsVal, double* twaVal);
|
||||||
|
bool addTrueWind(GwApi* api, BoatValueList* boatValues, GwLog *log);
|
||||||
|
};
|
||||||
98
lib/obp60task/OBPRingBuffer.h
Normal file
98
lib/obp60task/OBPRingBuffer.h
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "GwSynchronized.h"
|
||||||
|
#include <vector>
|
||||||
|
#include <WString.h>
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct PSRAMAllocator {
|
||||||
|
using value_type = T;
|
||||||
|
|
||||||
|
PSRAMAllocator() = default;
|
||||||
|
|
||||||
|
template <class U>
|
||||||
|
constexpr PSRAMAllocator(const PSRAMAllocator<U>&) noexcept { }
|
||||||
|
|
||||||
|
T* allocate(std::size_t n)
|
||||||
|
{
|
||||||
|
void* ptr = heap_caps_malloc(n * sizeof(T), MALLOC_CAP_SPIRAM);
|
||||||
|
if (!ptr) {
|
||||||
|
return nullptr;
|
||||||
|
} else {
|
||||||
|
return static_cast<T*>(ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void deallocate(T* p, std::size_t) noexcept
|
||||||
|
{
|
||||||
|
heap_caps_free(p);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T, class U>
|
||||||
|
bool operator==(const PSRAMAllocator<T>&, const PSRAMAllocator<U>&) { return true; }
|
||||||
|
|
||||||
|
template <class T, class U>
|
||||||
|
bool operator!=(const PSRAMAllocator<T>&, const PSRAMAllocator<U>&) { return false; }
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class RingBuffer {
|
||||||
|
private:
|
||||||
|
std::vector<T, PSRAMAllocator<T>> buffer; // THE buffer vector, allocated in PSRAM
|
||||||
|
size_t capacity;
|
||||||
|
size_t head; // Points to the next insertion position
|
||||||
|
size_t first; // Points to the first (oldest) valid element
|
||||||
|
size_t last; // Points to the last (newest) valid element
|
||||||
|
size_t count; // Number of valid elements currently in buffer
|
||||||
|
bool is_Full; // Indicates that all buffer elements are used and ringing is in use
|
||||||
|
T MIN_VAL; // lowest possible value of buffer of type <T>
|
||||||
|
T MAX_VAL; // highest possible value of buffer of type <T> -> indicates invalid value in buffer
|
||||||
|
double dblMIN_VAL, dblMAX_VAL; // MIN_VAL, MAX_VAL in double format
|
||||||
|
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
|
||||||
|
double mltplr; // Multiplier which transforms original <double> value into buffer type format
|
||||||
|
double smallest; // Value range of buffer: smallest value; needs to be => MIN_VAL
|
||||||
|
double 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, double multiplier, double minValue, double maxValue); // Set meta data for buffer
|
||||||
|
bool getMetaData(String& name, String& format, int& updateFrequency, double& multiplier, double& minValue, double& 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 double& value); // Add a new value to buffer
|
||||||
|
double get(size_t index) const; // Get value at specific position (0-based index from oldest to newest)
|
||||||
|
double getFirst() const; // Get the first (oldest) value in buffer
|
||||||
|
double getLast() const; // Get the last (newest) value in buffer
|
||||||
|
double getMin() const; // Get the lowest value in buffer
|
||||||
|
double getMin(size_t amount) const; // Get minimum value of the last <amount> values of buffer
|
||||||
|
double getMax() const; // Get the highest value in buffer
|
||||||
|
double getMax(size_t amount) const; // Get maximum value of the last <amount> values of buffer
|
||||||
|
double getMid() const; // Get mid value between <min> and <max> value in buffer
|
||||||
|
double getMid(size_t amount) const; // Get mid value between <min> and <max> value of the last <amount> values of buffer
|
||||||
|
double getMedian() const; // Get the median value in buffer
|
||||||
|
double 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
|
||||||
|
double getMinVal() const; // Get lowest possible value for buffer
|
||||||
|
double 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
|
||||||
|
double operator[](size_t index) const; // Operator[] for convenient access (same as get())
|
||||||
|
std::vector<double> getAllValues() const; // Get all current values in native buffer format as a vector
|
||||||
|
std::vector<double> getAllValues(size_t amount) const; // Get last <amount> values in native buffer format as a vector
|
||||||
|
};
|
||||||
|
|
||||||
|
#include "OBPRingBuffer.tpp"
|
||||||
462
lib/obp60task/OBPRingBuffer.tpp
Normal file
462
lib/obp60task/OBPRingBuffer.tpp
Normal file
@@ -0,0 +1,462 @@
|
|||||||
|
#include "OBPRingBuffer.h"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <limits>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void RingBuffer<T>::initCommon()
|
||||||
|
{
|
||||||
|
MIN_VAL = std::numeric_limits<T>::lowest();
|
||||||
|
MAX_VAL = std::numeric_limits<T>::max();
|
||||||
|
dblMIN_VAL = static_cast<double>(MIN_VAL);
|
||||||
|
dblMAX_VAL = static_cast<double>(MAX_VAL);
|
||||||
|
dataName = "";
|
||||||
|
dataFmt = "";
|
||||||
|
updFreq = -1;
|
||||||
|
mltplr = 1;
|
||||||
|
smallest = dblMIN_VAL;
|
||||||
|
largest = dblMAX_VAL;
|
||||||
|
bufLocker = xSemaphoreCreateMutex();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
RingBuffer<T>::RingBuffer()
|
||||||
|
: capacity(0)
|
||||||
|
, head(0)
|
||||||
|
, first(0)
|
||||||
|
, last(0)
|
||||||
|
, count(0)
|
||||||
|
, is_Full(false)
|
||||||
|
{
|
||||||
|
initCommon();
|
||||||
|
// <buffer> stays empty
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
RingBuffer<T>::RingBuffer(size_t size)
|
||||||
|
: capacity(size)
|
||||||
|
, head(0)
|
||||||
|
, first(0)
|
||||||
|
, last(0)
|
||||||
|
, count(0)
|
||||||
|
, is_Full(false)
|
||||||
|
{
|
||||||
|
initCommon();
|
||||||
|
|
||||||
|
buffer.reserve(size);
|
||||||
|
buffer.resize(size, MAX_VAL); // MAX_VAL indicate invalid values
|
||||||
|
}
|
||||||
|
|
||||||
|
// Specify meta data of buffer content
|
||||||
|
template <typename T>
|
||||||
|
void RingBuffer<T>::setMetaData(String name, String format, int updateFrequency, double multiplier, double minValue, double maxValue)
|
||||||
|
{
|
||||||
|
GWSYNCHRONIZED(&bufLocker);
|
||||||
|
dataName = name;
|
||||||
|
dataFmt = format;
|
||||||
|
updFreq = updateFrequency;
|
||||||
|
mltplr = multiplier;
|
||||||
|
smallest = std::max(dblMIN_VAL, minValue);
|
||||||
|
largest = std::min(dblMAX_VAL, maxValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get meta data of buffer content
|
||||||
|
template <typename T>
|
||||||
|
bool RingBuffer<T>::getMetaData(String& name, String& format, int& updateFrequency, double& multiplier, double& minValue, double& maxValue)
|
||||||
|
{
|
||||||
|
if (dataName == "" || dataFmt == "" || updFreq == -1) {
|
||||||
|
return false; // Meta data not set
|
||||||
|
}
|
||||||
|
|
||||||
|
GWSYNCHRONIZED(&bufLocker);
|
||||||
|
name = dataName;
|
||||||
|
format = dataFmt;
|
||||||
|
updateFrequency = updFreq;
|
||||||
|
multiplier = mltplr;
|
||||||
|
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 double& value)
|
||||||
|
{
|
||||||
|
GWSYNCHRONIZED(&bufLocker);
|
||||||
|
if (value < smallest || value > largest) {
|
||||||
|
buffer[head] = MAX_VAL; // Store MAX_VAL if value is out of range
|
||||||
|
} else {
|
||||||
|
buffer[head] = static_cast<T>(std::round(value * mltplr));
|
||||||
|
}
|
||||||
|
last = head;
|
||||||
|
|
||||||
|
if (is_Full) {
|
||||||
|
first = (first + 1) % capacity; // Move pointer to oldest element when overwriting
|
||||||
|
} else {
|
||||||
|
count++;
|
||||||
|
if (count == capacity) {
|
||||||
|
is_Full = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Serial.printf("Ringbuffer: value %.3f, multiplier: %.1f, buffer: %d\n", value, mltplr, buffer[head]);
|
||||||
|
head = (head + 1) % capacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get value at specific position (0-based index from oldest to newest)
|
||||||
|
template <typename T>
|
||||||
|
double RingBuffer<T>::get(size_t index) const
|
||||||
|
{
|
||||||
|
GWSYNCHRONIZED(&bufLocker);
|
||||||
|
if (isEmpty() || index < 0 || index >= count) {
|
||||||
|
return dblMAX_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t realIndex = (first + index) % capacity;
|
||||||
|
return static_cast<double>(buffer[realIndex] / mltplr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Operator[] for convenient access (same as get())
|
||||||
|
template <typename T>
|
||||||
|
double RingBuffer<T>::operator[](size_t index) const
|
||||||
|
{
|
||||||
|
return get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the first (oldest) value in the buffer
|
||||||
|
template <typename T>
|
||||||
|
double RingBuffer<T>::getFirst() const
|
||||||
|
{
|
||||||
|
if (isEmpty()) {
|
||||||
|
return dblMAX_VAL;
|
||||||
|
}
|
||||||
|
return get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the last (newest) value in the buffer
|
||||||
|
template <typename T>
|
||||||
|
double RingBuffer<T>::getLast() const
|
||||||
|
{
|
||||||
|
if (isEmpty()) {
|
||||||
|
return dblMAX_VAL;
|
||||||
|
}
|
||||||
|
return get(count - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the lowest value in the buffer
|
||||||
|
template <typename T>
|
||||||
|
double RingBuffer<T>::getMin() const
|
||||||
|
{
|
||||||
|
if (isEmpty()) {
|
||||||
|
return dblMAX_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
double minVal = dblMAX_VAL;
|
||||||
|
double value;
|
||||||
|
for (size_t i = 0; i < count; i++) {
|
||||||
|
value = get(i);
|
||||||
|
if (value < minVal && value != dblMAX_VAL) {
|
||||||
|
minVal = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return minVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get minimum value of the last <amount> values of buffer
|
||||||
|
template <typename T>
|
||||||
|
double RingBuffer<T>::getMin(size_t amount) const
|
||||||
|
{
|
||||||
|
if (isEmpty() || amount <= 0) {
|
||||||
|
return dblMAX_VAL;
|
||||||
|
}
|
||||||
|
if (amount > count)
|
||||||
|
amount = count;
|
||||||
|
|
||||||
|
double minVal = dblMAX_VAL;
|
||||||
|
double value;
|
||||||
|
for (size_t i = 0; i < amount; i++) {
|
||||||
|
value = get(count - 1 - i);
|
||||||
|
if (value < minVal && value != dblMAX_VAL) {
|
||||||
|
minVal = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return minVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the highest value in the buffer
|
||||||
|
template <typename T>
|
||||||
|
double RingBuffer<T>::getMax() const
|
||||||
|
{
|
||||||
|
if (isEmpty()) {
|
||||||
|
return dblMAX_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
double maxVal = dblMIN_VAL;
|
||||||
|
double value;
|
||||||
|
for (size_t i = 0; i < count; i++) {
|
||||||
|
value = get(i);
|
||||||
|
if (value > maxVal && value != dblMAX_VAL) {
|
||||||
|
maxVal = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (maxVal == dblMIN_VAL) { // no change of initial value -> buffer has only invalid values (MAX_VAL)
|
||||||
|
maxVal = dblMAX_VAL;
|
||||||
|
}
|
||||||
|
return maxVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get maximum value of the last <amount> values of buffer
|
||||||
|
template <typename T>
|
||||||
|
double RingBuffer<T>::getMax(size_t amount) const
|
||||||
|
{
|
||||||
|
if (isEmpty() || amount <= 0) {
|
||||||
|
return dblMAX_VAL;
|
||||||
|
}
|
||||||
|
if (amount > count)
|
||||||
|
amount = count;
|
||||||
|
|
||||||
|
double maxVal = dblMIN_VAL;
|
||||||
|
double value;
|
||||||
|
for (size_t i = 0; i < amount; i++) {
|
||||||
|
value = get(count - 1 - i);
|
||||||
|
if (value > maxVal && value != dblMAX_VAL) {
|
||||||
|
maxVal = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (maxVal == dblMIN_VAL) { // no change of initial value -> buffer has only invalid values (MAX_VAL)
|
||||||
|
maxVal = dblMAX_VAL;
|
||||||
|
}
|
||||||
|
return maxVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get mid value between <min> and <max> value in the buffer
|
||||||
|
template <typename T>
|
||||||
|
double RingBuffer<T>::getMid() const
|
||||||
|
{
|
||||||
|
if (isEmpty()) {
|
||||||
|
return dblMAX_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (getMin() + getMax()) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get mid value between <min> and <max> value of the last <amount> values of buffer
|
||||||
|
template <typename T>
|
||||||
|
double RingBuffer<T>::getMid(size_t amount) const
|
||||||
|
{
|
||||||
|
if (isEmpty() || amount <= 0) {
|
||||||
|
return dblMAX_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (amount > count)
|
||||||
|
amount = count;
|
||||||
|
|
||||||
|
return (getMin(amount) + getMax(amount)) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the median value in the buffer
|
||||||
|
template <typename T>
|
||||||
|
double RingBuffer<T>::getMedian() const
|
||||||
|
{
|
||||||
|
if (isEmpty()) {
|
||||||
|
return dblMAX_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 static_cast<double>(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 static_cast<double>((temp[count / 2 - 1] + temp[count / 2]) / 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the median value of the last <amount> values of buffer
|
||||||
|
template <typename T>
|
||||||
|
double RingBuffer<T>::getMedian(size_t amount) const
|
||||||
|
{
|
||||||
|
if (isEmpty() || amount <= 0) {
|
||||||
|
return dblMAX_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(count - 1 - i));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort to find median
|
||||||
|
std::sort(temp.begin(), temp.end());
|
||||||
|
|
||||||
|
if (amount % 2 == 1) {
|
||||||
|
// Odd number of elements
|
||||||
|
return static_cast<double>(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 static_cast<double>((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>
|
||||||
|
double RingBuffer<T>::getMinVal() const
|
||||||
|
{
|
||||||
|
return dblMIN_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get highest possible value for buffer; used for unset/invalid buffer data
|
||||||
|
template <typename T>
|
||||||
|
double RingBuffer<T>::getMaxVal() const
|
||||||
|
{
|
||||||
|
return dblMAX_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear buffer
|
||||||
|
template <typename T>
|
||||||
|
void RingBuffer<T>::clear()
|
||||||
|
{
|
||||||
|
GWSYNCHRONIZED(&bufLocker);
|
||||||
|
head = 0;
|
||||||
|
first = 0;
|
||||||
|
last = 0;
|
||||||
|
count = 0;
|
||||||
|
is_Full = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete buffer and set new size
|
||||||
|
template <typename T>
|
||||||
|
void RingBuffer<T>::resize(size_t newSize)
|
||||||
|
{
|
||||||
|
GWSYNCHRONIZED(&bufLocker);
|
||||||
|
capacity = newSize;
|
||||||
|
head = 0;
|
||||||
|
first = 0;
|
||||||
|
last = 0;
|
||||||
|
count = 0;
|
||||||
|
is_Full = false;
|
||||||
|
|
||||||
|
buffer.clear();
|
||||||
|
buffer.reserve(newSize);
|
||||||
|
buffer.resize(newSize, MAX_VAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get all current values in native buffer format as a vector
|
||||||
|
template <typename T>
|
||||||
|
std::vector<double> RingBuffer<T>::getAllValues() const
|
||||||
|
{
|
||||||
|
std::vector<double> result;
|
||||||
|
result.reserve(count);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < count; i++) {
|
||||||
|
result.push_back(get(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get last <amount> values in native buffer format as a vector
|
||||||
|
template <typename T>
|
||||||
|
std::vector<double> RingBuffer<T>::getAllValues(size_t amount) const
|
||||||
|
{
|
||||||
|
std::vector<double> result;
|
||||||
|
|
||||||
|
if (isEmpty() || amount <= 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (amount > count)
|
||||||
|
amount = count;
|
||||||
|
|
||||||
|
result.reserve(amount);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < amount; i++) {
|
||||||
|
result.push_back(get(count - 1 - i));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
@@ -498,19 +498,25 @@ void sensorTask(void *param){
|
|||||||
// Send supply voltage value all 1s
|
// Send supply voltage value all 1s
|
||||||
if(millis() > starttime5 + 1000 && String(powsensor1) == "off"){
|
if(millis() > starttime5 + 1000 && String(powsensor1) == "off"){
|
||||||
starttime5 = millis();
|
starttime5 = millis();
|
||||||
#ifdef VOLTAGE_SENSOR
|
float rawVoltage = 0; // Default value
|
||||||
float rawVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.53) * 2; // Vin = 1/2 for OBP40
|
#ifdef BOARD_OBP40S3
|
||||||
#else
|
sensors.batteryVoltage = 0; // If no sensor then zero voltage
|
||||||
float rawVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.17) * 20; // Vin = 1/20 for OBP60
|
|
||||||
#endif
|
#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
|
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 defined LIPO_ACCU_1200 && defined VOLTAGE_SENSOR
|
#if BOARD_OBP40S3 && defined LIPO_ACCU_1200 && defined VOLTAGE_SENSOR
|
||||||
// Polynomfit for LiPo capacity calculation for 3,7V LiPo accus, 0...100%
|
// Polynomfit for LiPo capacity calculation for 3,7V LiPo accus, 0...100%
|
||||||
sensors.batteryLevelLiPo = sensors.batteryVoltage60 * 203.8312 -738.1635;
|
sensors.batteryLevelLiPo = sensors.batteryVoltage60 * 203.8312 -738.1635;
|
||||||
// Limiter
|
// Limiter
|
||||||
|
|||||||
609
lib/obp60task/OBPcharts.cpp
Normal file
609
lib/obp60task/OBPcharts.cpp
Normal file
@@ -0,0 +1,609 @@
|
|||||||
|
// Function lib for display of boat data in various chart formats
|
||||||
|
#include "OBPcharts.h"
|
||||||
|
#include "OBP60Extensions.h"
|
||||||
|
#include "OBPRingBuffer.h"
|
||||||
|
|
||||||
|
// --- Class Chart ---------------
|
||||||
|
template <typename T>
|
||||||
|
Chart<T>::Chart(RingBuffer<T>& dataBuf, int8_t chrtDir, int8_t chrtSz, double dfltRng, CommonData& common, bool useSimuData)
|
||||||
|
: dataBuf(dataBuf)
|
||||||
|
, chrtDir(chrtDir)
|
||||||
|
, chrtSz(chrtSz)
|
||||||
|
, dfltRng(dfltRng)
|
||||||
|
, commonData(&common)
|
||||||
|
, useSimuData(useSimuData)
|
||||||
|
{
|
||||||
|
logger = commonData->logger;
|
||||||
|
fgColor = commonData->fgcolor;
|
||||||
|
bgColor = commonData->bgcolor;
|
||||||
|
|
||||||
|
// LOG_DEBUG(GwLog::DEBUG, "Chart Init: Chart::dataBuf: %p, passed dataBuf: %p", (void*)&this->dataBuf, (void*)&dataBuf);
|
||||||
|
dWidth = getdisplay().width();
|
||||||
|
dHeight = getdisplay().height();
|
||||||
|
|
||||||
|
if (chrtDir == 0) {
|
||||||
|
// horizontal chart timeline direction
|
||||||
|
timAxis = dWidth;
|
||||||
|
switch (chrtSz) {
|
||||||
|
case 0:
|
||||||
|
valAxis = dHeight - top - bottom;
|
||||||
|
cStart = { 0, top };
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
valAxis = (dHeight - top - bottom) / 2 - hGap;
|
||||||
|
cStart = { 0, top };
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
valAxis = (dHeight - top - bottom) / 2 - hGap;
|
||||||
|
cStart = { 0, top + (valAxis + hGap) + hGap };
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG_DEBUG(GwLog::ERROR, "displayChart: wrong init parameter");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (chrtDir == 1) {
|
||||||
|
// vertical chart timeline direction
|
||||||
|
timAxis = dHeight - top - bottom;
|
||||||
|
switch (chrtSz) {
|
||||||
|
case 0:
|
||||||
|
valAxis = dWidth;
|
||||||
|
cStart = { 0, top };
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
valAxis = dWidth / 2 - vGap - 1;
|
||||||
|
cStart = { 0, top };
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
valAxis = dWidth / 2 - vGap - 1;
|
||||||
|
cStart = { dWidth / 2 + vGap, top };
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG_DEBUG(GwLog::ERROR, "displayChart: wrong init parameter");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LOG_DEBUG(GwLog::ERROR, "displayChart: wrong init parameter");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dataBuf.getMetaData(dbName, dbFormat);
|
||||||
|
dbMIN_VAL = dataBuf.getMinVal();
|
||||||
|
dbMAX_VAL = dataBuf.getMaxVal();
|
||||||
|
bufSize = dataBuf.getCapacity();
|
||||||
|
|
||||||
|
if (dbFormat == "formatCourse" || dbFormat == "FormatWind" || dbFormat == "FormatRot") {
|
||||||
|
|
||||||
|
if (dbFormat == "FormatRot") {
|
||||||
|
chrtDataFmt = 2; // Chart is showing data of rotational <degree> format
|
||||||
|
} else {
|
||||||
|
chrtDataFmt = 1; // Chart is showing data of course / wind <degree> format
|
||||||
|
}
|
||||||
|
rngStep = M_TWOPI / 360.0 * 10.0; // +/-10 degrees on each end of chrtMid; we are calculating with SI values
|
||||||
|
|
||||||
|
} else {
|
||||||
|
chrtDataFmt = 0; // Chart is showing any other data format than <degree>
|
||||||
|
rngStep = 5.0; // +/- 10 for all other values (eg. m/s, m, K, mBar)
|
||||||
|
}
|
||||||
|
|
||||||
|
chrtMin = 0;
|
||||||
|
chrtMax = 0;
|
||||||
|
chrtMid = dbMAX_VAL;
|
||||||
|
chrtRng = dfltRng;
|
||||||
|
recalcRngCntr = true; // initialize <chrtMid> on first screen call
|
||||||
|
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "Chart Init: dWidth: %d, dHeight: %d, timAxis: %d, valAxis: %d, cStart {x,y}: %d, %d, dbname: %s, rngStep: %.4f", dWidth, dHeight, timAxis, valAxis, cStart.x, cStart.y, dbName, rngStep);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
Chart<T>::~Chart()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Perform all actions to draw chart
|
||||||
|
// Parameters are chart time interval, and the current boat data value to be printed
|
||||||
|
template <typename T>
|
||||||
|
void Chart<T>::showChrt(int8_t chrtIntv, GwApi::BoatValue currValue)
|
||||||
|
{
|
||||||
|
drawChrt(chrtIntv, currValue);
|
||||||
|
drawChrtTimeAxis(chrtIntv);
|
||||||
|
drawChrtValAxis();
|
||||||
|
|
||||||
|
if (bufDataValid) {
|
||||||
|
// uses BoatValue temp variable <currValue> to format latest buffer value
|
||||||
|
// doesn't work unfortunately when 'simulation data' is active, because OBP60Formatter generates own simulation value in that case
|
||||||
|
currValue.value = dataBuf.getLast();
|
||||||
|
currValue.valid = currValue.value != dbMAX_VAL;
|
||||||
|
Chart<T>::prntCurrValue(currValue);
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "Chart drawChrt: currValue-value: %.1f, Valid: %d, Name: %s, Address: %p", currValue.value, currValue.valid, currValue.getName(), (void*)&currValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw chart
|
||||||
|
template <typename T>
|
||||||
|
void Chart<T>::drawChrt(int8_t chrtIntv, GwApi::BoatValue& currValue)
|
||||||
|
{
|
||||||
|
double chrtVal; // Current data value
|
||||||
|
double chrtScl; // Scale for data values in pixels per value
|
||||||
|
static double chrtPrevVal; // Last data value in chart area
|
||||||
|
// bool bufDataValid = false; // Flag to indicate if buffer data is valid
|
||||||
|
static int numNoData; // Counter for multiple invalid data values in a row
|
||||||
|
|
||||||
|
int x, y; // x and y coordinates for drawing
|
||||||
|
static int prevX, prevY; // Last x and y coordinates for drawing
|
||||||
|
|
||||||
|
// Identify buffer size and buffer start position for chart
|
||||||
|
count = dataBuf.getCurrentSize();
|
||||||
|
currIdx = dataBuf.getLastIdx();
|
||||||
|
numAddedBufVals = (currIdx - lastAddedIdx + bufSize) % bufSize; // Number of values added to buffer since last display
|
||||||
|
|
||||||
|
if (chrtIntv != oldChrtIntv || count == 1) {
|
||||||
|
// new data interval selected by user; this is only x * 230 values instead of 240 seconds (4 minutes) per interval step
|
||||||
|
// intvBufSize = timAxis * chrtIntv; // obsolete
|
||||||
|
numBufVals = min(count, (timAxis - 60) * chrtIntv); // keep free or release 60 values on chart for plotting of new values
|
||||||
|
bufStart = max(0, count - numBufVals);
|
||||||
|
lastAddedIdx = currIdx;
|
||||||
|
oldChrtIntv = chrtIntv;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
numBufVals = numBufVals + numAddedBufVals;
|
||||||
|
lastAddedIdx = currIdx;
|
||||||
|
if (count == bufSize) {
|
||||||
|
bufStart = max(0, bufStart - numAddedBufVals);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
calcChrtBorders(chrtMid, chrtMin, chrtMax, chrtRng);
|
||||||
|
chrtScl = double(valAxis) / chrtRng; // Chart scale: pixels per value step
|
||||||
|
|
||||||
|
// Do we have valid buffer data?
|
||||||
|
if (dataBuf.getMax() == dbMAX_VAL) { // only <MAX_VAL> values in buffer -> no valid wind data available
|
||||||
|
bufDataValid = false;
|
||||||
|
} else if (!currValue.valid && !useSimuData) { // currently no valid boat data available and no simulation mode
|
||||||
|
numNoData++;
|
||||||
|
bufDataValid = true;
|
||||||
|
if (numNoData > 3) { // If more than 4 invalid values in a row, send message
|
||||||
|
bufDataValid = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
numNoData = 0; // reset data error counter
|
||||||
|
bufDataValid = true; // At least some wind data available
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw wind values in chart
|
||||||
|
//***********************************************************************
|
||||||
|
if (bufDataValid) {
|
||||||
|
for (int i = 0; i < (numBufVals / chrtIntv); i++) {
|
||||||
|
chrtVal = dataBuf.get(bufStart + (i * chrtIntv)); // show the latest wind values in buffer; keep 1st value constant in a rolling buffer
|
||||||
|
if (chrtVal == dbMAX_VAL) {
|
||||||
|
chrtPrevVal = dbMAX_VAL;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (chrtDir == 0) { // horizontal chart
|
||||||
|
x = cStart.x + i; // Position in chart area
|
||||||
|
if (chrtDataFmt == 0) {
|
||||||
|
y = cStart.y + static_cast<int>(((chrtVal - chrtMin) * chrtScl) + 0.5); // calculate chart point and round
|
||||||
|
} else { // degree type value
|
||||||
|
y = cStart.y + static_cast<int>((WindUtils::to2PI(chrtVal - chrtMin) * chrtScl) + 0.5); // calculate chart point and round
|
||||||
|
}
|
||||||
|
} else { // vertical chart
|
||||||
|
y = cStart.y + timAxis - i; // Position in chart area
|
||||||
|
if (chrtDataFmt == 0) {
|
||||||
|
x = cStart.x + static_cast<int>(((chrtVal - chrtMin) * chrtScl) + 0.5); // calculate chart point and round
|
||||||
|
} else { // degree type value
|
||||||
|
x = cStart.x + static_cast<int>((WindUtils::to2PI(chrtVal - chrtMin) * chrtScl) + 0.5); // calculate chart point and round
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (i >= (numBufVals / chrtIntv) - 5) // log chart data of 1 line (adjust for test purposes)
|
||||||
|
// LOG_DEBUG(GwLog::DEBUG, "PageWindPlot Chart: i: %d, chrtVal: %.4f, {x,y} {%d,%d}", i, chrtVal, x, y);
|
||||||
|
|
||||||
|
if ((i == 0) || (chrtPrevVal == dbMAX_VAL)) {
|
||||||
|
// just a dot for 1st chart point or after some invalid values
|
||||||
|
prevX = x;
|
||||||
|
prevY = y;
|
||||||
|
|
||||||
|
} else if (chrtDataFmt != 0) {
|
||||||
|
// cross borders check for degree values; shift values to [-PI..0..PI]; when crossing borders, range is 2x PI degrees
|
||||||
|
double normCurr = WindUtils::to2PI(chrtVal - chrtMin);
|
||||||
|
double normPrev = WindUtils::to2PI(chrtPrevVal - chrtMin);
|
||||||
|
// Check if pixel positions are far apart (crossing chart boundary); happens when one value is near chrtMax and the other near chrtMin
|
||||||
|
bool crossedBorders = std::abs(normCurr - normPrev) > (chrtRng / 2.0);
|
||||||
|
|
||||||
|
if (crossedBorders) { // If current value crosses chart borders compared to previous value, split line
|
||||||
|
// LOG_DEBUG(GwLog::DEBUG, "PageWindPlot Chart: crossedBorders: %d, chrtVal: %.2f, chrtPrevVal: %.2f", crossedBorders, chrtVal, chrtPrevVal);
|
||||||
|
bool wrappingFromHighToLow = normCurr < normPrev; // Determine which edge we're crossing
|
||||||
|
if (chrtDir == 0) {
|
||||||
|
int ySplit = wrappingFromHighToLow ? (cStart.y + valAxis) : cStart.y;
|
||||||
|
getdisplay().drawLine(prevX, prevY, x, ySplit, fgColor);
|
||||||
|
if (x != prevX) { // line with some horizontal trend
|
||||||
|
getdisplay().drawLine(prevX, prevY - 1, x, ySplit - 1, fgColor);
|
||||||
|
} else {
|
||||||
|
getdisplay().drawLine(prevX, prevY - 1, x - 1, ySplit, fgColor);
|
||||||
|
}
|
||||||
|
prevY = wrappingFromHighToLow ? cStart.y : (cStart.y + valAxis);
|
||||||
|
} else { // vertical chart
|
||||||
|
int xSplit = wrappingFromHighToLow ? (cStart.x + valAxis) : cStart.x;
|
||||||
|
getdisplay().drawLine(prevX, prevY, xSplit, y, fgColor);
|
||||||
|
getdisplay().drawLine(prevX, prevY - 1, ((xSplit != prevX) ? xSplit : xSplit - 1), ((xSplit != prevX) ? y - 1 : y), fgColor);
|
||||||
|
prevX = wrappingFromHighToLow ? cStart.x : (cStart.x + valAxis);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw line with 2 pixels width + make sure vertical lines are drawn correctly
|
||||||
|
if (chrtDir == 0 || x == prevX) { // horizontal chart & vertical line
|
||||||
|
// if (x == prevX) { // vertical line
|
||||||
|
getdisplay().drawLine(prevX, prevY, x, y, fgColor);
|
||||||
|
getdisplay().drawLine(prevX - 1, prevY, x - 1, y, fgColor);
|
||||||
|
} else if (chrtDir == 1 || x != prevX) { // vertical chart & line with some horizontal trend -> normal state
|
||||||
|
// } else { // line with some horizontal trend -> normal state
|
||||||
|
getdisplay().drawLine(prevX, prevY, x, y, fgColor);
|
||||||
|
getdisplay().drawLine(prevX, prevY - 1, x, y - 1, fgColor);
|
||||||
|
}
|
||||||
|
chrtPrevVal = chrtVal;
|
||||||
|
prevX = x;
|
||||||
|
prevY = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reaching chart area bottom end
|
||||||
|
if (i >= timAxis - 1) {
|
||||||
|
oldChrtIntv = 0; // force reset of buffer start and number of values to show in next display loop
|
||||||
|
|
||||||
|
if (chrtDataFmt == 1) { // degree of course or wind
|
||||||
|
recalcRngCntr = true;
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "PageWindPlot FreeTop: timAxis: %d, i: %d, bufStart: %d, numBufVals: %d, recalcRngCntr: %d", timAxis, i, bufStart, numBufVals, recalcRngCntr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// No valid data available
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold10pt8b);
|
||||||
|
|
||||||
|
int pX, pY;
|
||||||
|
if (chrtDir == 0) { // horizontal chart
|
||||||
|
pX = cStart.x + (timAxis / 2);
|
||||||
|
pY = cStart.y + (valAxis / 2) - 10;
|
||||||
|
} else { // vertical chart
|
||||||
|
pX = cStart.x + (valAxis / 2);
|
||||||
|
pY = cStart.y + (timAxis / 2) - 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
getdisplay().fillRect(pX - 33, pY - 10, 66, 24, bgColor); // Clear area for message
|
||||||
|
drawTextCenter(pX, pY, "No data");
|
||||||
|
LOG_DEBUG(GwLog::LOG, "PageWindPlot: No valid data available");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get maximum difference of last <amount> of dataBuf ringbuffer values to center chart
|
||||||
|
template <typename T>
|
||||||
|
double Chart<T>::getRng(double center, size_t amount)
|
||||||
|
{
|
||||||
|
size_t count = dataBuf.getCurrentSize();
|
||||||
|
|
||||||
|
if (dataBuf.isEmpty() || amount <= 0) {
|
||||||
|
return dbMAX_VAL;
|
||||||
|
}
|
||||||
|
if (amount > count)
|
||||||
|
amount = count;
|
||||||
|
|
||||||
|
double value = 0;
|
||||||
|
double range = 0;
|
||||||
|
double maxRng = dbMIN_VAL;
|
||||||
|
|
||||||
|
// Start from the newest value (last) and go backwards x times
|
||||||
|
for (size_t i = 0; i < amount; i++) {
|
||||||
|
value = dataBuf.get(count - 1 - i);
|
||||||
|
|
||||||
|
if (value == dbMAX_VAL) {
|
||||||
|
continue; // ignore invalid values
|
||||||
|
}
|
||||||
|
|
||||||
|
range = abs(fmod((value - center + (M_TWOPI + M_PI)), M_TWOPI) - M_PI);
|
||||||
|
if (range > maxRng)
|
||||||
|
maxRng = range;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maxRng > M_PI) {
|
||||||
|
maxRng = M_PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (maxRng != dbMIN_VAL ? maxRng : dbMAX_VAL); // Return range from <mid> to <max>
|
||||||
|
}
|
||||||
|
|
||||||
|
// check and adjust chart range and set range borders and range middle
|
||||||
|
template <typename T>
|
||||||
|
void Chart<T>::calcChrtBorders(double& rngMid, double& rngMin, double& rngMax, double& rng)
|
||||||
|
{
|
||||||
|
if (chrtDataFmt == 0) {
|
||||||
|
// Chart data is of any type but 'degree'
|
||||||
|
|
||||||
|
double oldRngMin = rngMin;
|
||||||
|
double oldRngMax = rngMax;
|
||||||
|
|
||||||
|
// Chart starts at lowest range value, but at least '0' or includes even negative values
|
||||||
|
double currMinVal = dataBuf.getMin(numBufVals);
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "calcChrtRange0a: currMinVal: %.1f, currMaxVal: %.1f, rngMin: %.1f, rngMid: %.1f, rngMax: %.1f, rng: %.1f, rngStep: %.1f, oldRngMin: %.1f, oldRngMax: %.1f, dfltRng: %.1f, numBufVals: %d",
|
||||||
|
currMinVal, dataBuf.getMax(numBufVals), rngMin, rngMid, rngMax, rng, rngStep, oldRngMin, oldRngMax, dfltRng, numBufVals);
|
||||||
|
|
||||||
|
if (currMinVal != dbMAX_VAL) { // current min value is valid
|
||||||
|
if (currMinVal > 0 && dbMIN_VAL == 0) { // Chart range starts at least at '0' or includes negative values
|
||||||
|
rngMin = 0;
|
||||||
|
} else if (currMinVal < oldRngMin || (oldRngMin < 0 && (currMinVal > (oldRngMin + rngStep)))) { // decrease rngMin if required or increase if lowest value is higher than old rngMin
|
||||||
|
rngMin = std::floor(currMinVal / rngStep) * rngStep;
|
||||||
|
}
|
||||||
|
} // otherwise keep rngMin unchanged
|
||||||
|
|
||||||
|
double currMaxVal = dataBuf.getMax(numBufVals);
|
||||||
|
if (currMaxVal != dbMAX_VAL) { // current max value is valid
|
||||||
|
if ((currMaxVal > oldRngMax) || (currMaxVal < (oldRngMax - rngStep))) { // increase rngMax if required or decrease if lowest value is lower than old rngMax
|
||||||
|
rngMax = std::ceil(currMaxVal / rngStep) * rngStep;
|
||||||
|
rngMax = std::max(rngMax, rngMin + dfltRng); // keep at least default chart range
|
||||||
|
}
|
||||||
|
} // otherwise keep rngMax unchanged
|
||||||
|
|
||||||
|
rngMid = (rngMin + rngMax) / 2.0;
|
||||||
|
rng = rngMax - rngMin;
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "calcChrtRange1a: currMinVal: %.1f, currMaxVal: %.1f, rngMin: %.1f, rngMid: %.1f, rngMax: %.1f, rng: %.1f, rngStep: %.1f, oldRngMin: %.1f, oldRngMax: %.1f, dfltRng: %.1f, numBufVals: %d",
|
||||||
|
currMinVal, currMaxVal, rngMin, rngMid, rngMax, rng, rngStep, oldRngMin, oldRngMax, dfltRng, numBufVals);
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (chrtDataFmt == 1) {
|
||||||
|
// Chart data is of type 'course' or 'wind'
|
||||||
|
|
||||||
|
if ((count == 1 && rngMid == 0) || rngMid == dbMAX_VAL) {
|
||||||
|
recalcRngCntr = true; // initialize <rngMid>
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set rngMid
|
||||||
|
if (recalcRngCntr) {
|
||||||
|
rngMid = dataBuf.getMid(numBufVals);
|
||||||
|
if (rngMid == dbMAX_VAL) {
|
||||||
|
rngMid = 0;
|
||||||
|
} else {
|
||||||
|
rngMid = std::round(rngMid / rngStep) * rngStep; // Set new center value; round to next <rngStep> value
|
||||||
|
|
||||||
|
// Check if range between 'min' and 'max' is > 180° or crosses '0'
|
||||||
|
rngMin = dataBuf.getMin(numBufVals);
|
||||||
|
rngMax = dataBuf.getMax(numBufVals);
|
||||||
|
rng = (rngMax >= rngMin ? rngMax - rngMin : M_TWOPI - rngMin + rngMax);
|
||||||
|
rng = max(rng, dfltRng); // keep at least default chart range
|
||||||
|
if (rng > M_PI) { // If wind range > 180°, adjust wndCenter to smaller wind range end
|
||||||
|
rngMid = WindUtils::to2PI(rngMid + M_PI);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
recalcRngCntr = false; // Reset flag for <rngMid> determination
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "calcChrtRange1b: rngMid: %.1f°, rngMin: %.1f°, rngMax: %.1f°, rng: %.1f°, rngStep: %.1f°", rngMid * RAD_TO_DEG, rngMin * RAD_TO_DEG, rngMax * RAD_TO_DEG,
|
||||||
|
rng * RAD_TO_DEG, rngStep * RAD_TO_DEG);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (chrtDataFmt == 2) {
|
||||||
|
// Chart data is of type 'rotation'; then we want to have <rndMid> always to be '0'
|
||||||
|
rngMid = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check and adjust range between left, center, and right chart limit
|
||||||
|
double halfRng = rng / 2.0; // we calculate with range between <rngMid> and edges
|
||||||
|
double diffRng = getRng(rngMid, numBufVals);
|
||||||
|
// LOG_DEBUG(GwLog::DEBUG, "calcChrtRange2: diffRng: %.1f°, halfRng: %.1f°", diffRng * RAD_TO_DEG, halfRng * RAD_TO_DEG);
|
||||||
|
diffRng = (diffRng == dbMAX_VAL ? 0 : std::ceil(diffRng / rngStep) * rngStep);
|
||||||
|
// LOG_DEBUG(GwLog::DEBUG, "calcChrtRange2: diffRng: %.1f°, halfRng: %.1f°", diffRng * RAD_TO_DEG, halfRng * RAD_TO_DEG);
|
||||||
|
|
||||||
|
if (diffRng > halfRng) {
|
||||||
|
halfRng = diffRng; // round to next <rngStep> value
|
||||||
|
} else if (diffRng + rngStep < halfRng) { // Reduce chart range for higher resolution if possible
|
||||||
|
halfRng = max(dfltRng / 2.0, diffRng);
|
||||||
|
}
|
||||||
|
|
||||||
|
rngMin = WindUtils::to2PI(rngMid - halfRng);
|
||||||
|
rngMax = (halfRng < M_PI ? rngMid + halfRng : rngMid + halfRng - (M_TWOPI / 360)); // if chart range is 360°, then make <rngMax> 1° smaller than <rngMin>
|
||||||
|
rngMax = WindUtils::to2PI(rngMax);
|
||||||
|
// LOG_DEBUG(GwLog::DEBUG, "calcChrtRange2: diffRng: %.1f°, halfRng: %.1f°", diffRng * RAD_TO_DEG, halfRng * RAD_TO_DEG);
|
||||||
|
|
||||||
|
rng = halfRng * 2.0;
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "calcChrtRange2b: rngMid: %.1f°, rngMin: %.1f°, rngMax: %.1f°, diffRng: %.1f°, rng: %.1f°, rngStep: %.1f°", rngMid * RAD_TO_DEG, rngMin * RAD_TO_DEG, rngMax * RAD_TO_DEG,
|
||||||
|
diffRng * RAD_TO_DEG, rng * RAD_TO_DEG, rngStep * RAD_TO_DEG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// chart time axis label + lines
|
||||||
|
template <typename T>
|
||||||
|
void Chart<T>::drawChrtTimeAxis(int8_t chrtIntv)
|
||||||
|
{
|
||||||
|
int timeRng;
|
||||||
|
float slots, intv, i;
|
||||||
|
char sTime[6];
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
getdisplay().setTextColor(fgColor);
|
||||||
|
|
||||||
|
if (chrtDir == 0) { // horizontal chart
|
||||||
|
getdisplay().fillRect(0, cStart.y, dWidth, 2, fgColor);
|
||||||
|
|
||||||
|
timeRng = chrtIntv * 4; // Chart time interval: [1] 4 min., [2] 8 min., [3] 12 min., [4] 16 min., [8] 32 min.
|
||||||
|
slots = timAxis / 80.0; // number of axis labels
|
||||||
|
intv = timeRng / slots; // minutes per chart axis interval
|
||||||
|
i = timeRng; // Chart axis label start at -32, -16, -12, ... minutes
|
||||||
|
|
||||||
|
for (int j = 0; j < timAxis - 30; j += 80) { // fill time axis with values but keep area free on right hand side for value label
|
||||||
|
// LOG_DEBUG(GwLog::DEBUG, "ChartTimeAxis: timAxis: %d, {x,y}: {%d,%d}, i: %.1f, j: %d, chrtIntv: %d, intv: %.1f, slots: %.1f", timAxis, cStart.x, cStart.y, i, j, chrtIntv, intv, slots);
|
||||||
|
|
||||||
|
// Format time label based on interval
|
||||||
|
if (chrtIntv < 3) {
|
||||||
|
snprintf(sTime, sizeof(sTime), "-%.1f", i);
|
||||||
|
} else {
|
||||||
|
snprintf(sTime, sizeof(sTime), "-%.0f", std::round(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw text with appropriate offset
|
||||||
|
// int tOffset = (j == 0) ? 13 : (chrtIntv < 3 ? -4 : -4);
|
||||||
|
int tOffset = j == 0 ? 13 : -4;
|
||||||
|
drawTextCenter(cStart.x + j + tOffset, cStart.y - 8, sTime);
|
||||||
|
getdisplay().drawLine(cStart.x + j, cStart.y, cStart.x + j, cStart.y + 5, fgColor); // draw short vertical time mark
|
||||||
|
|
||||||
|
i -= intv;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else { // vertical chart
|
||||||
|
timeRng = chrtIntv * 4; // chart time interval: [1] 4 min., [2] 8 min., [3] 12 min., [4] 16 min., [8] 32 min.
|
||||||
|
slots = timAxis / 75.0; // number of axis labels
|
||||||
|
intv = timeRng / slots; // minutes per chart axis interval
|
||||||
|
i = -intv; // chart axis label start at -32, -16, -12, ... minutes
|
||||||
|
|
||||||
|
for (int j = 75; j < (timAxis - 75); j += 75) { // don't print time label at upper and lower end of time axis
|
||||||
|
if (chrtIntv < 3) { // print 1 decimal if time range is single digit (4 or 8 minutes)
|
||||||
|
snprintf(sTime, sizeof(sTime), "%.1f", i);
|
||||||
|
} else {
|
||||||
|
snprintf(sTime, sizeof(sTime), "%.0f", std::floor(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
getdisplay().drawLine(cStart.x, cStart.y + j, cStart.x + valAxis, cStart.y + j, fgColor); // Grid line
|
||||||
|
|
||||||
|
if (chrtSz == 0) { // full size chart
|
||||||
|
getdisplay().fillRect(0, cStart.y + j - 9, 32, 15, bgColor); // clear small area to remove potential chart lines
|
||||||
|
getdisplay().setCursor((4 - strlen(sTime)) * 7, cStart.y + j + 3); // time value; print left screen; value right-formated
|
||||||
|
getdisplay().printf("%s", sTime); // Range value
|
||||||
|
} else if (chrtSz == 2) { // half size chart; right side
|
||||||
|
drawTextCenter(dWidth / 2, cStart.y + j, sTime); // time value; print mid screen
|
||||||
|
}
|
||||||
|
|
||||||
|
i -= intv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// chart value axis labels + lines
|
||||||
|
template <typename T>
|
||||||
|
void Chart<T>::drawChrtValAxis()
|
||||||
|
{
|
||||||
|
double slots;
|
||||||
|
int i, intv;
|
||||||
|
double cVal, cchrtRng, crngMin;
|
||||||
|
char sVal[6];
|
||||||
|
int sLen;
|
||||||
|
std::unique_ptr<GwApi::BoatValue> tmpBVal; // Temp variable to get formatted and converted data value from OBP60Formatter
|
||||||
|
tmpBVal = std::unique_ptr<GwApi::BoatValue>(new GwApi::BoatValue(dataBuf.getName()));
|
||||||
|
tmpBVal->setFormat(dataBuf.getFormat());
|
||||||
|
tmpBVal->valid = true;
|
||||||
|
|
||||||
|
if (chrtDir == 0) { // horizontal chart
|
||||||
|
slots = valAxis / 60.0; // number of axis labels
|
||||||
|
tmpBVal->value = chrtRng;
|
||||||
|
cchrtRng = formatValue(tmpBVal.get(), *commonData).cvalue; // value (converted)
|
||||||
|
intv = static_cast<int>(round(cchrtRng / slots));
|
||||||
|
i = intv;
|
||||||
|
|
||||||
|
if (chrtSz == 0) { // full size chart -> print multiple value lines
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
for (int j = 60; j < valAxis - 30; j += 60) {
|
||||||
|
getdisplay().drawLine(cStart.x, cStart.y + j, cStart.x + timAxis, cStart.y + j, fgColor);
|
||||||
|
|
||||||
|
getdisplay().fillRect(cStart.x, cStart.y + j - 11, 42, 21, bgColor); // Clear small area to remove potential chart lines
|
||||||
|
String sVal = String(i);
|
||||||
|
getdisplay().setCursor((3 - sVal.length()) * 10, cStart.y + j + 7); // value right-formated
|
||||||
|
getdisplay().printf("%s", sVal); // Range value
|
||||||
|
|
||||||
|
i += intv;
|
||||||
|
}
|
||||||
|
} else { // half size chart -> print just edge values + middle chart line
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold10pt8b);
|
||||||
|
|
||||||
|
tmpBVal->value = chrtMin;
|
||||||
|
cVal = formatValue(tmpBVal.get(), *commonData).cvalue; // value (converted)
|
||||||
|
sLen = snprintf(sVal, sizeof(sVal), "%.0f", round(cVal));
|
||||||
|
getdisplay().fillRect(cStart.x, cStart.y + 2, 42, 16, bgColor); // Clear small area to remove potential chart lines
|
||||||
|
getdisplay().setCursor(cStart.x + ((3 - sLen) * 10), cStart.y + 16);
|
||||||
|
getdisplay().printf("%s", sVal); // Range low end
|
||||||
|
|
||||||
|
tmpBVal->value = chrtMid;
|
||||||
|
cVal = formatValue(tmpBVal.get(), *commonData).cvalue; // value (converted)
|
||||||
|
sLen = snprintf(sVal, sizeof(sVal), "%.0f", round(cVal));
|
||||||
|
getdisplay().fillRect(cStart.x, cStart.y + (valAxis / 2) - 9, 42, 16, bgColor); // Clear small area to remove potential chart lines
|
||||||
|
getdisplay().setCursor(cStart.x + ((3 - sLen) * 10), cStart.y + (valAxis / 2) + 5);
|
||||||
|
getdisplay().printf("%s", sVal); // Range mid value
|
||||||
|
getdisplay().drawLine(cStart.x + 43, cStart.y + (valAxis / 2), cStart.x + timAxis, cStart.y + (valAxis / 2), fgColor);
|
||||||
|
|
||||||
|
tmpBVal->value = chrtMax;
|
||||||
|
cVal = formatValue(tmpBVal.get(), *commonData).cvalue; // value (converted)
|
||||||
|
sLen = snprintf(sVal, sizeof(sVal), "%.0f", round(cVal));
|
||||||
|
getdisplay().fillRect(cStart.x, cStart.y + valAxis - 16, 42, 16, bgColor); // Clear small area to remove potential chart lines
|
||||||
|
getdisplay().setCursor(cStart.x + ((3 - sLen) * 10), cStart.y + valAxis - 1);
|
||||||
|
getdisplay().printf("%s", sVal); // Range high end
|
||||||
|
getdisplay().drawLine(cStart.x + 43, cStart.y + valAxis, cStart.x + timAxis, cStart.y + valAxis, fgColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
drawTextRalign(cStart.x + timAxis, cStart.y - 3, dbName); // buffer data name
|
||||||
|
|
||||||
|
} else { // vertical chart
|
||||||
|
if (chrtSz == 0) { // full size chart -> use larger font
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
drawTextCenter(cStart.x + (valAxis / 4) + 25, cStart.y - 10, dbName); // buffer data name
|
||||||
|
} else {
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold10pt8b);
|
||||||
|
}
|
||||||
|
getdisplay().fillRect(cStart.x, top, valAxis, 2, fgColor); // top chart line
|
||||||
|
|
||||||
|
tmpBVal->value = chrtMin;
|
||||||
|
cVal = formatValue(tmpBVal.get(), *commonData).cvalue; // value (converted)
|
||||||
|
snprintf(sVal, sizeof(sVal), "%.0f", round(cVal));
|
||||||
|
getdisplay().setCursor(cStart.x, cStart.y - 2);
|
||||||
|
getdisplay().printf("%s", sVal); // Range low end
|
||||||
|
|
||||||
|
tmpBVal->value = chrtMid;
|
||||||
|
cVal = formatValue(tmpBVal.get(), *commonData).cvalue; // value (converted)
|
||||||
|
snprintf(sVal, sizeof(sVal), "%.0f", round(cVal));
|
||||||
|
drawTextCenter(cStart.x + (valAxis / 2), cStart.y - 10, sVal); // Range mid end
|
||||||
|
|
||||||
|
tmpBVal->value = chrtMax;
|
||||||
|
cVal = formatValue(tmpBVal.get(), *commonData).cvalue; // value (converted)
|
||||||
|
snprintf(sVal, sizeof(sVal), "%.0f", round(cVal));
|
||||||
|
drawTextRalign(cStart.x + valAxis - 2, cStart.y - 2, sVal); // Range high end
|
||||||
|
|
||||||
|
for (int j = 0; j <= valAxis + 2; j += ((valAxis + 2) / 2)) {
|
||||||
|
getdisplay().drawLine(cStart.x + j, cStart.y, cStart.x + j, cStart.y + timAxis, fgColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (chrtSz == 0) {
|
||||||
|
// getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
// drawTextCenter(cStart.x + (valAxis / 4) + 15, cStart.y - 11, dbName); // buffer data name
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print current data value
|
||||||
|
template <typename T>
|
||||||
|
void Chart<T>::prntCurrValue(GwApi::BoatValue& currValue)
|
||||||
|
{
|
||||||
|
const int xPosVal = (chrtDir == 0) ? cStart.x + (timAxis / 2) - 56 : cStart.x + 32;
|
||||||
|
const int yPosVal = (chrtDir == 0) ? cStart.y + valAxis - 7 : cStart.y + timAxis - 7;
|
||||||
|
|
||||||
|
FormattedData frmtDbData = formatValue(&currValue, *commonData);
|
||||||
|
double testdbValue = frmtDbData.value;
|
||||||
|
String sdbValue = frmtDbData.svalue; // value (string)
|
||||||
|
String dbUnit = frmtDbData.unit; // Unit of value
|
||||||
|
// LOG_DEBUG(GwLog::DEBUG, "Chart CurrValue: dbValue: %.2f, sdbValue: %s, fmrtDbValue: %.2f, dbFormat: %s, dbUnit: %s, Valid: %d, Name: %s, Address: %p", currValue.value, sdbValue,
|
||||||
|
// testdbValue, currValue.getFormat(), dbUnit, currValue.valid, currValue.getName(), currValue);
|
||||||
|
|
||||||
|
getdisplay().fillRect(xPosVal - 1, yPosVal - 34, 125, 41, bgColor); // Clear area for TWS value
|
||||||
|
getdisplay().drawRect(xPosVal, yPosVal - 33, 123, 39, fgColor); // Draw box for TWS value
|
||||||
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
|
getdisplay().setCursor(xPosVal + 1, yPosVal);
|
||||||
|
if (useSimuData) {
|
||||||
|
getdisplay().printf("%2.1f", currValue.value); // Value
|
||||||
|
} else {
|
||||||
|
getdisplay().print(sdbValue); // Value
|
||||||
|
}
|
||||||
|
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold10pt8b);
|
||||||
|
getdisplay().setCursor(xPosVal + 76, yPosVal - 17);
|
||||||
|
getdisplay().print(dbName); // Name
|
||||||
|
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
getdisplay().setCursor(xPosVal + 76, yPosVal + 0);
|
||||||
|
getdisplay().print(dbUnit); // Unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Explicitly instantiate class with required data types to avoid linker errors
|
||||||
|
template class Chart<uint16_t>;
|
||||||
|
// --- Class Chart ---------------
|
||||||
70
lib/obp60task/OBPcharts.h
Normal file
70
lib/obp60task/OBPcharts.h
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
// Function lib for display of boat data in various graphical chart formats
|
||||||
|
#pragma once
|
||||||
|
#include "Pagedata.h"
|
||||||
|
|
||||||
|
struct Pos {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
};
|
||||||
|
template <typename T> class RingBuffer;
|
||||||
|
class GwLog;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class Chart {
|
||||||
|
protected:
|
||||||
|
CommonData *commonData;
|
||||||
|
GwLog *logger;
|
||||||
|
|
||||||
|
RingBuffer<T> &dataBuf; // Buffer to display
|
||||||
|
int8_t chrtDir; // Chart timeline direction: [0] = horizontal, [1] = vertical
|
||||||
|
int8_t chrtSz; // Chart size: [0] = full size, [1] = half size left/top, [2] half size right/bottom
|
||||||
|
double dfltRng; // Default range of chart, e.g. 30 = [0..30]
|
||||||
|
uint16_t fgColor; // color code for any screen writing
|
||||||
|
uint16_t bgColor; // color code for screen background
|
||||||
|
bool useSimuData; // flag to indicate if simulation data is active
|
||||||
|
|
||||||
|
int top = 48; // display top header lines
|
||||||
|
int bottom = 22; // display bottom lines
|
||||||
|
int hGap = 11; // gap between 2 horizontal charts; actual gap is 2x <gap>
|
||||||
|
int vGap = 20; // gap between 2 vertical charts; actual gap is 2x <gap>
|
||||||
|
int xOffset = 33; // offset for horizontal axis (time/value), because of space for left vertical axis labeling
|
||||||
|
int yOffset = 10; // offset for vertical axis (time/value), because of space for top horizontal axis labeling
|
||||||
|
int dWidth; // Display width
|
||||||
|
int dHeight; // Display height
|
||||||
|
int timAxis, valAxis; // size of time and value chart axis
|
||||||
|
Pos cStart; // start point of chart area
|
||||||
|
double chrtRng; // Range of buffer values from min to max value
|
||||||
|
double chrtMin; // Range low end value
|
||||||
|
double chrtMax; // Range high end value
|
||||||
|
double chrtMid; // Range mid value
|
||||||
|
double rngStep; // Defines the step of adjustment (e.g. 10 m/s) for value axis range
|
||||||
|
bool recalcRngCntr = false; // Flag for re-calculation of mid value of chart for wind data types
|
||||||
|
|
||||||
|
String dbName, dbFormat; // Name and format of data buffer
|
||||||
|
int chrtDataFmt; // Data format of chart: [0] size values; [1] degree of course or wind; [2] rotational degrees
|
||||||
|
double dbMIN_VAL; // Lowest possible value of buffer of type <T>
|
||||||
|
double dbMAX_VAL; // Highest possible value of buffer of type <T>; indicates invalid value in buffer
|
||||||
|
size_t bufSize; // History buffer size: 1.920 values for 32 min. history chart
|
||||||
|
int count; // current size of buffer
|
||||||
|
int numBufVals; // number of wind values available for current interval selection
|
||||||
|
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
|
||||||
|
size_t lastIdx; // Last index of TWD history buffer
|
||||||
|
size_t lastAddedIdx = 0; // Last index of TWD history buffer when new data was added
|
||||||
|
bool bufDataValid = false; // Flag to indicate if buffer data is valid
|
||||||
|
int oldChrtIntv = 0; // remember recent user selection of data interval
|
||||||
|
|
||||||
|
void drawChrt(int8_t chrtIntv, GwApi::BoatValue& currValue); // Draw chart line
|
||||||
|
double getRng(double center, size_t amount); // Calculate range between chart center and edges
|
||||||
|
void calcChrtBorders(double& rngMid, double& rngMin, double& rngMax, double& rng); // Calculate chart points for value axis and return range between <min> and <max>
|
||||||
|
void drawChrtTimeAxis(int8_t chrtIntv); // Draw time axis of chart, value and lines
|
||||||
|
void drawChrtValAxis(); // Draw value axis of chart, value and lines
|
||||||
|
void prntCurrValue(GwApi::BoatValue& currValue); // Add current boat data value to chart
|
||||||
|
|
||||||
|
public:
|
||||||
|
Chart(RingBuffer<T>& dataBuf, int8_t chrtDir, int8_t chrtSz, double dfltRng, CommonData& common, bool useSimuData); // Chart object of data chart
|
||||||
|
~Chart();
|
||||||
|
void showChrt(int8_t chrtIntv, GwApi::BoatValue currValue); // Perform all actions to draw chart
|
||||||
|
|
||||||
|
};
|
||||||
@@ -20,7 +20,7 @@ class PageBME280 : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -112,12 +112,12 @@ class PageBME280 : public Page
|
|||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 55);
|
getdisplay().setCursor(20, 55);
|
||||||
getdisplay().print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
|
|
||||||
@@ -136,12 +136,12 @@ class PageBME280 : public Page
|
|||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 145);
|
getdisplay().setCursor(20, 145);
|
||||||
getdisplay().print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
|
|
||||||
@@ -160,12 +160,12 @@ class PageBME280 : public Page
|
|||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 235);
|
getdisplay().setCursor(20, 235);
|
||||||
getdisplay().print(name3); // Page name
|
getdisplay().print(name3); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 270);
|
getdisplay().setCursor(20, 270);
|
||||||
getdisplay().print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
|
|
||||||
@@ -176,9 +176,7 @@ class PageBME280 : public Page
|
|||||||
// Show bus data
|
// Show bus data
|
||||||
getdisplay().print(svalue3); // Real value as formated string
|
getdisplay().print(svalue3); // Real value as formated string
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
class PageBattery : public Page
|
class PageBattery : public Page
|
||||||
{
|
{
|
||||||
int average = 0; // Average type [0...3], 0=off, 1=10s, 2=60s, 3=300s
|
int average = 0; // Average type [0...3], 0=off, 1=10s, 2=60s, 3=300s
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageBattery(CommonData &common){
|
PageBattery(CommonData &common){
|
||||||
@@ -34,7 +34,7 @@ class PageBattery : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -162,7 +162,7 @@ class PageBattery : public Page
|
|||||||
|
|
||||||
// Show average settings
|
// Show average settings
|
||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
switch (average) {
|
switch (average) {
|
||||||
case 0:
|
case 0:
|
||||||
getdisplay().setCursor(60, 90);
|
getdisplay().setCursor(60, 90);
|
||||||
@@ -209,12 +209,12 @@ class PageBattery : public Page
|
|||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 55);
|
getdisplay().setCursor(20, 55);
|
||||||
getdisplay().print(name1); // Value name
|
getdisplay().print(name1); // Value name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
|
|
||||||
@@ -238,12 +238,12 @@ class PageBattery : public Page
|
|||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 145);
|
getdisplay().setCursor(20, 145);
|
||||||
getdisplay().print(name2); // Value name
|
getdisplay().print(name2); // Value name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
|
|
||||||
@@ -267,12 +267,12 @@ class PageBattery : public Page
|
|||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 235);
|
getdisplay().setCursor(20, 235);
|
||||||
getdisplay().print(name3); // Value name
|
getdisplay().print(name3); // Value name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 270);
|
getdisplay().setCursor(20, 270);
|
||||||
getdisplay().print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
|
|
||||||
@@ -288,9 +288,7 @@ class PageBattery : public Page
|
|||||||
getdisplay().print("---"); // No sensor data (sensor is off)
|
getdisplay().print("---"); // No sensor data (sensor is off)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData)
|
int displayPage(PageData &pageData)
|
||||||
{
|
{
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
@@ -189,12 +189,12 @@ public:
|
|||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
getdisplay().print("Bat.");
|
getdisplay().print("Bat.");
|
||||||
|
|
||||||
// Show battery type
|
// Show battery type
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(90, 65);
|
getdisplay().setCursor(90, 65);
|
||||||
getdisplay().print(batType);
|
getdisplay().print(batType);
|
||||||
|
|
||||||
@@ -205,7 +205,7 @@ public:
|
|||||||
if(String(batVoltage) == "12V") bvoltage = 12;
|
if(String(batVoltage) == "12V") bvoltage = 12;
|
||||||
else bvoltage = 24;
|
else bvoltage = 24;
|
||||||
getdisplay().print(bvoltage);
|
getdisplay().print(bvoltage);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show battery capacity
|
// Show battery capacity
|
||||||
@@ -213,12 +213,12 @@ public:
|
|||||||
getdisplay().setCursor(10, 200);
|
getdisplay().setCursor(10, 200);
|
||||||
if(batCapacity <= 999) getdisplay().print(batCapacity, 0);
|
if(batCapacity <= 999) getdisplay().print(batCapacity, 0);
|
||||||
if(batCapacity > 999) getdisplay().print(float(batCapacity/1000.0), 1);
|
if(batCapacity > 999) getdisplay().print(float(batCapacity/1000.0), 1);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
if(batCapacity <= 999) getdisplay().print("Ah");
|
if(batCapacity <= 999) getdisplay().print("Ah");
|
||||||
if(batCapacity > 999) getdisplay().print("kAh");
|
if(batCapacity > 999) getdisplay().print("kAh");
|
||||||
|
|
||||||
// Show info
|
// Show info
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 235);
|
getdisplay().setCursor(10, 235);
|
||||||
getdisplay().print("Installed");
|
getdisplay().print("Installed");
|
||||||
getdisplay().setCursor(10, 255);
|
getdisplay().setCursor(10, 255);
|
||||||
@@ -228,7 +228,7 @@ public:
|
|||||||
batteryGraphic(150, 45, batPercentage, commonData->fgcolor, commonData->bgcolor);
|
batteryGraphic(150, 45, batPercentage, commonData->fgcolor, commonData->bgcolor);
|
||||||
|
|
||||||
// Show average settings
|
// Show average settings
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(150, 145);
|
getdisplay().setCursor(150, 145);
|
||||||
switch (average) {
|
switch (average) {
|
||||||
case 0:
|
case 0:
|
||||||
@@ -252,7 +252,7 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(150, 200);
|
getdisplay().setCursor(150, 200);
|
||||||
getdisplay().print(batPercentage);
|
getdisplay().print(batPercentage);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("%");
|
getdisplay().print("%");
|
||||||
|
|
||||||
// Show time to full discharge
|
// Show time to full discharge
|
||||||
@@ -263,12 +263,12 @@ public:
|
|||||||
else getdisplay().print(batRange, 0);
|
else getdisplay().print(batRange, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("--");
|
else getdisplay().print("--");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("h");
|
getdisplay().print("h");
|
||||||
|
|
||||||
// Show sensor type info
|
// Show sensor type info
|
||||||
String i2cAddr = "";
|
String i2cAddr = "";
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(270, 60);
|
getdisplay().setCursor(270, 60);
|
||||||
if(powerSensor == "off") getdisplay().print("Internal");
|
if(powerSensor == "off") getdisplay().print("Internal");
|
||||||
if(powerSensor == "INA219"){
|
if(powerSensor == "INA219"){
|
||||||
@@ -307,7 +307,7 @@ public:
|
|||||||
getdisplay().print("---"); // Missing bus data
|
getdisplay().print("---"); // Missing bus data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show actual current in A
|
// Show actual current in A
|
||||||
@@ -319,7 +319,7 @@ public:
|
|||||||
if(value2 > 99.9) getdisplay().print(value2, 0);
|
if(value2 > 99.9) getdisplay().print(value2, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("---");
|
else getdisplay().print("---");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("A");
|
getdisplay().print("A");
|
||||||
|
|
||||||
// Show actual consumption in W
|
// Show actual consumption in W
|
||||||
@@ -331,11 +331,10 @@ public:
|
|||||||
if(value3 > 99.9) getdisplay().print(value3, 0);
|
if(value3 > 99.9) getdisplay().print(value3, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("---");
|
else getdisplay().print("---");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("W");
|
getdisplay().print("W");
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData)
|
int displayPage(PageData &pageData)
|
||||||
{
|
{
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
@@ -120,7 +120,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
value1 = simtime++; // Simulation data for time value 11:36 in seconds
|
value1 = simtime++; // Simulation data for time value 11:36 in seconds
|
||||||
} // Other simulation data see OBP60Formater.cpp
|
} // Other simulation data see OBP60Formatter.cpp
|
||||||
bool valid1 = bvalue1->valid; // Valid information
|
bool valid1 = bvalue1->valid; // Valid information
|
||||||
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
@@ -162,7 +162,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageClock, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageClock, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -177,7 +177,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
struct tm *local_tm = localtime(&tv);
|
struct tm *local_tm = localtime(&tv);
|
||||||
|
|
||||||
// Show values GPS date
|
// Show values GPS date
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
if (holdvalues == false) {
|
if (holdvalues == false) {
|
||||||
if (source == 'G') {
|
if (source == 'G') {
|
||||||
@@ -197,7 +197,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
} else {
|
} else {
|
||||||
getdisplay().print(svalue2old);
|
getdisplay().print(svalue2old);
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 95);
|
getdisplay().setCursor(10, 95);
|
||||||
getdisplay().print("Date"); // Name
|
getdisplay().print("Date"); // Name
|
||||||
|
|
||||||
@@ -205,7 +205,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
getdisplay().fillRect(0, 149, 60, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 149, 60, 3, commonData->fgcolor);
|
||||||
|
|
||||||
// Show values GPS time
|
// Show values GPS time
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 250);
|
getdisplay().setCursor(10, 250);
|
||||||
if (holdvalues == false) {
|
if (holdvalues == false) {
|
||||||
if (source == 'G') {
|
if (source == 'G') {
|
||||||
@@ -225,7 +225,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
else {
|
else {
|
||||||
getdisplay().print(svalue1old);
|
getdisplay().print(svalue1old);
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 220);
|
getdisplay().setCursor(10, 220);
|
||||||
getdisplay().print("Time"); // Name
|
getdisplay().print("Time"); // Name
|
||||||
|
|
||||||
@@ -238,11 +238,11 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
sunrise = String("06:42");
|
sunrise = String("06:42");
|
||||||
}
|
}
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 65);
|
getdisplay().setCursor(335, 65);
|
||||||
if(holdvalues == false) getdisplay().print(sunrise); // Value
|
if(holdvalues == false) getdisplay().print(sunrise); // Value
|
||||||
else getdisplay().print(svalue5old);
|
else getdisplay().print(svalue5old);
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(335, 95);
|
getdisplay().setCursor(335, 95);
|
||||||
getdisplay().print("SunR"); // Name
|
getdisplay().print("SunR"); // Name
|
||||||
|
|
||||||
@@ -258,11 +258,11 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
sunset = String("21:03");
|
sunset = String("21:03");
|
||||||
}
|
}
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 250);
|
getdisplay().setCursor(335, 250);
|
||||||
if(holdvalues == false) getdisplay().print(sunset); // Value
|
if(holdvalues == false) getdisplay().print(sunset); // Value
|
||||||
else getdisplay().print(svalue6old);
|
else getdisplay().print(svalue6old);
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(335, 220);
|
getdisplay().setCursor(335, 220);
|
||||||
getdisplay().print("SunS"); // Name
|
getdisplay().print("SunS"); // Name
|
||||||
|
|
||||||
@@ -304,7 +304,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
||||||
getdisplay().setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -336,7 +336,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Print Unit in clock
|
// Print Unit in clock
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(175, 110);
|
getdisplay().setCursor(175, 110);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(tz == 'L' ? "LOT" : "UTC");
|
getdisplay().print(tz == 'L' ? "LOT" : "UTC");
|
||||||
@@ -345,7 +345,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
getdisplay().print(unit2old); // date unit
|
getdisplay().print(unit2old); // date unit
|
||||||
}
|
}
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(185, 190);
|
getdisplay().setCursor(185, 190);
|
||||||
if (source == 'G') {
|
if (source == 'G') {
|
||||||
getdisplay().print("GPS");
|
getdisplay().print("GPS");
|
||||||
@@ -438,9 +438,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
||||||
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
260
lib/obp60task/PageCompass.cpp
Normal file
260
lib/obp60task/PageCompass.cpp
Normal file
@@ -0,0 +1,260 @@
|
|||||||
|
#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
|
||||||
|
{
|
||||||
|
int WhichDataCompass = ShowHDM;
|
||||||
|
int WhichDataDisplay = ShowHDM;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PageCompass(CommonData &common){
|
||||||
|
commonData = &common;
|
||||||
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageCompass");
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void setupKeys(){
|
||||||
|
Page::setupKeys();
|
||||||
|
commonData->keydata[0].label = "CMP";
|
||||||
|
commonData->keydata[1].label = "SRC";
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
int displayPage(PageData &pageData){
|
||||||
|
GwConfigHandler *config = commonData->config;
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
|
// 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];
|
||||||
|
FormattedData TheFormattedData;
|
||||||
|
|
||||||
|
for (int i = 0; i < HowManyValues; i++){
|
||||||
|
bvalue = pageData.values[i];
|
||||||
|
TheFormattedData = formatValue(bvalue, *commonData);
|
||||||
|
DataName[i] = xdrDelete(bvalue->getName());
|
||||||
|
DataName[i] = DataName[i].substring(0, 6); // String length limit for value name
|
||||||
|
DataUnits[i] = 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
|
||||||
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageCompass: %d %s %f %s %s", i, DataName[i], DataValue[i], DataFormat[i], DataText[i] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bvalue == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
|
|
||||||
|
//***********************************************************
|
||||||
|
|
||||||
|
// Set display in partial refresh mode
|
||||||
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
|
// Horizontal line 2 pix top & bottom
|
||||||
|
// Print data on top half
|
||||||
|
getdisplay().fillRect(0, 130, 400, 2, commonData->fgcolor);
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
|
getdisplay().setCursor(10, 70);
|
||||||
|
getdisplay().print(DataName[WhichDataDisplay]); // Page name
|
||||||
|
// Show unit
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().setCursor(10, 120);
|
||||||
|
getdisplay().print(DataUnits[WhichDataDisplay]);
|
||||||
|
getdisplay().setCursor(190, 120);
|
||||||
|
getdisplay().setFont(&DSEG7Classic_BoldItalic42pt7b);
|
||||||
|
|
||||||
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(DataText[WhichDataDisplay]); // Real value as formated string
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().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;
|
||||||
|
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
|
getdisplay().setCursor(10, Compass_Y0-60);
|
||||||
|
getdisplay().print(DataName[WhichDataCompass]); // Page name
|
||||||
|
|
||||||
|
|
||||||
|
// Draw compass base line and pointer
|
||||||
|
getdisplay().fillRect(0, Compass_Y0, 400, 3, commonData->fgcolor);
|
||||||
|
getdisplay().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 );
|
||||||
|
|
||||||
|
getdisplay().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;
|
||||||
|
getdisplay().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;
|
||||||
|
getdisplay().fillRect(x0-1, Compass_Y0 - Compass_LineLength, 3, Compass_LineLength, commonData->fgcolor);
|
||||||
|
|
||||||
|
x0 = Compass_X0 + Delta_X - 2 * i * 5 * Compass_LineDelta;
|
||||||
|
getdisplay().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;
|
||||||
|
getdisplay().fillRect(x0-1, Compass_Y0 - Compass_LineLength, 3, Compass_LineLength, commonData->fgcolor);
|
||||||
|
}
|
||||||
|
|
||||||
|
getdisplay().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;
|
||||||
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
|
|
||||||
|
do {
|
||||||
|
getdisplay().setCursor(x0 - 40, Compass_Y0 + 40);
|
||||||
|
snprintf(buffer,bsize,"%03.0f", AngleToDisplay);
|
||||||
|
getdisplay().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 {
|
||||||
|
getdisplay().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;
|
||||||
|
|
||||||
|
getdisplay().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);
|
||||||
|
// getdisplay().setCursor(x_test, Compass_Y0 - 60);
|
||||||
|
// getdisplay().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
|
||||||
@@ -20,7 +20,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageDST810, %s: %f, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageDST810, %s: %f, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -98,12 +98,12 @@ public:
|
|||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 55);
|
getdisplay().setCursor(20, 55);
|
||||||
getdisplay().print("Depth"); // Page name
|
getdisplay().print("Depth"); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
@@ -136,12 +136,12 @@ public:
|
|||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 145);
|
getdisplay().setCursor(20, 145);
|
||||||
getdisplay().print("Speed"); // Page name
|
getdisplay().print("Speed"); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
@@ -174,12 +174,12 @@ public:
|
|||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 220);
|
getdisplay().setCursor(20, 220);
|
||||||
getdisplay().print("Log"); // Page name
|
getdisplay().print("Log"); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 240);
|
getdisplay().setCursor(20, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
@@ -212,12 +212,12 @@ public:
|
|||||||
// ############### Value 4 ################
|
// ############### Value 4 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(220, 220);
|
getdisplay().setCursor(220, 220);
|
||||||
getdisplay().print("Temp"); // Page name
|
getdisplay().print("Temp"); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(220, 240);
|
getdisplay().setCursor(220, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit4); // Unit
|
getdisplay().print(unit4); // Unit
|
||||||
@@ -242,9 +242,7 @@ public:
|
|||||||
unit4old = unit4; // Save the old unit
|
unit4old = unit4; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
131
lib/obp60task/PageDigitalOut.cpp
Normal file
131
lib/obp60task/PageDigitalOut.cpp
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
|
|
||||||
|
#include <PCF8574.h> // PCF8574 modules from Horter
|
||||||
|
#include "Pagedata.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 PageDigitalOut : public Page
|
||||||
|
{
|
||||||
|
|
||||||
|
// Status values
|
||||||
|
bool button1 = false;
|
||||||
|
bool button2 = false;
|
||||||
|
bool button3 = false;
|
||||||
|
bool button4 = false;
|
||||||
|
bool button5 = false;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PageDigitalOut(CommonData &common){
|
||||||
|
commonData = &common;
|
||||||
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageDigitalOut");
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual int handleKey(int key){
|
||||||
|
// Code for keylock
|
||||||
|
if(key == 11){
|
||||||
|
commonData->keylock = !commonData->keylock;
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
// Code for button 1
|
||||||
|
if(key == 1){
|
||||||
|
button1 = !button1;
|
||||||
|
setPCF8574PortPin(0, button1 ? 0 : 1); // Attention! Inverse logic for PCF8574
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
// Code for button 2
|
||||||
|
if(key == 2){
|
||||||
|
button2 = !button2;
|
||||||
|
setPCF8574PortPin(1, button2 ? 0 : 1); // Attention! Inverse logic for PCF8574
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
// Code for button 3
|
||||||
|
if(key == 3){
|
||||||
|
button3 = !button3;
|
||||||
|
setPCF8574PortPin(2, button3 ? 0 : 1); // Attention! Inverse logic for PCF8574
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
// Code for button 4
|
||||||
|
if(key == 4){
|
||||||
|
button4 = !button4;
|
||||||
|
setPCF8574PortPin(3, button4 ? 0 : 1); // Attention! Inverse logic for PCF8574
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
// Code for button 5
|
||||||
|
if(key == 5){
|
||||||
|
button5 = !button5;
|
||||||
|
setPCF8574PortPin(4, button5 ? 0 : 1); // Attention! Inverse logic for PCF8574
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
int displayPage(PageData &pageData){
|
||||||
|
GwConfigHandler *config = commonData->config;
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Logging boat values
|
||||||
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageDigitalOut");
|
||||||
|
|
||||||
|
// Draw page
|
||||||
|
//***********************************************************
|
||||||
|
|
||||||
|
// Set display in partial refresh mode
|
||||||
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().fillRoundRect(200, 250 , 200, 25, 5, commonData->fgcolor); // Black rect
|
||||||
|
getdisplay().fillRoundRect(202, 252 , 196, 21, 5, commonData->bgcolor); // White rect
|
||||||
|
getdisplay().setCursor(210, 270);
|
||||||
|
getdisplay().print("Map server lost");
|
||||||
|
|
||||||
|
// Set botton labels
|
||||||
|
commonData->keydata[0].label = "BTN 1";
|
||||||
|
commonData->keydata[1].label = "BTN 2";
|
||||||
|
commonData->keydata[2].label = "BTN 3";
|
||||||
|
commonData->keydata[3].label = "BTN 4";
|
||||||
|
commonData->keydata[4].label = "BTN 5";
|
||||||
|
|
||||||
|
return PAGE_UPDATE;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
static Page* createPage(CommonData &common){
|
||||||
|
return new PageDigitalOut(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 registerPageDigitalOut(
|
||||||
|
"DigitalOut", // Page name
|
||||||
|
createPage, // Action
|
||||||
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
|
true // Show display header on/off
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -98,7 +98,7 @@ class PageFluid : public Page
|
|||||||
commonData->logger->logDebug(GwLog::LOG,"New PageFluid: fluidtype=%d", fluidtype);
|
commonData->logger->logDebug(GwLog::LOG,"New PageFluid: fluidtype=%d", fluidtype);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -143,7 +143,7 @@ class PageFluid : public Page
|
|||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// descriptions
|
// descriptions
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 60);
|
getdisplay().setCursor(20, 60);
|
||||||
getdisplay().print("Fluid");
|
getdisplay().print("Fluid");
|
||||||
|
|
||||||
@@ -201,7 +201,7 @@ class PageFluid : public Page
|
|||||||
Point p, pr;
|
Point p, pr;
|
||||||
|
|
||||||
// scale texts
|
// scale texts
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
p = {c.x, c.y - r + 30};
|
p = {c.x, c.y - r + 30};
|
||||||
drawTextCenter(p.x, p.y, "1/2");
|
drawTextCenter(p.x, p.y, "1/2");
|
||||||
pr = rotatePoint(c, p, -60);
|
pr = rotatePoint(c, p, -60);
|
||||||
@@ -210,7 +210,7 @@ class PageFluid : public Page
|
|||||||
drawTextCenter(pr.x, pr.y, "3/4");
|
drawTextCenter(pr.x, pr.y, "3/4");
|
||||||
|
|
||||||
// empty and full
|
// empty and full
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
p = rotatePoint(c, {c.x, c.y - r + 30}, -130);
|
p = rotatePoint(c, {c.x, c.y - r + 30}, -130);
|
||||||
drawTextCenter(p.x, p.y, "E");
|
drawTextCenter(p.x, p.y, "E");
|
||||||
p = rotatePoint(c, {c.x, c.y - r + 30}, 130);
|
p = rotatePoint(c, {c.x, c.y - r + 30}, 130);
|
||||||
@@ -252,9 +252,7 @@ class PageFluid : public Page
|
|||||||
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
#include "BoatDataCalibration.h"
|
||||||
|
|
||||||
class PageFourValues : public Page
|
class PageFourValues : public Page
|
||||||
{
|
{
|
||||||
@@ -20,7 +21,7 @@ class PageFourValues : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -45,33 +46,37 @@ class PageFourValues : public Page
|
|||||||
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
|
||||||
|
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
||||||
double value1 = bvalue1->value; // Value as double in SI unit
|
double value1 = bvalue1->value; // Value as double in SI unit
|
||||||
bool valid1 = bvalue1->valid; // Valid information
|
bool valid1 = bvalue1->valid; // Valid information
|
||||||
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Get boat values #2
|
// Get boat values #2
|
||||||
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list
|
||||||
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
||||||
name2 = name2.substring(0, 6); // String length limit for value name
|
name2 = name2.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
||||||
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 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Get boat values #3
|
// Get boat values #3
|
||||||
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Third element in list
|
||||||
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
||||||
name3 = name3.substring(0, 6); // String length limit for value name
|
name3 = name3.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
||||||
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 = 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 = formatValue(bvalue3, *commonData).unit; // Unit of value
|
String unit3 = formatValue(bvalue3, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Get boat values #4
|
// Get boat values #4
|
||||||
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Fourth element in list
|
||||||
String name4 = xdrDelete(bvalue4->getName()); // Value name
|
String name4 = xdrDelete(bvalue4->getName()); // Value name
|
||||||
name4 = name4.substring(0, 6); // String length limit for value name
|
name4 = name4.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue4, logger); // Check if boat data value is to be calibrated
|
||||||
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 = 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
|
||||||
@@ -84,7 +89,7 @@ class PageFourValues : public Page
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageFourValues, %s: %f, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageFourValues, %s: %f, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -98,12 +103,12 @@ class PageFourValues : public Page
|
|||||||
// ############### Value 1 ################
|
// ############### Value 1 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(20, 45);
|
getdisplay().setCursor(20, 45);
|
||||||
getdisplay().print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 65);
|
getdisplay().setCursor(20, 65);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
@@ -114,11 +119,11 @@ class PageFourValues : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue1->getFormat() == "formatLatitude" || bvalue1->getFormat() == "formatLongitude"){
|
if(bvalue1->getFormat() == "formatLatitude" || bvalue1->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(120, 55);
|
getdisplay().setCursor(120, 55);
|
||||||
}
|
}
|
||||||
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(150, 58);
|
getdisplay().setCursor(150, 58);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -146,12 +151,12 @@ class PageFourValues : public Page
|
|||||||
// ############### Value 2 ################
|
// ############### Value 2 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(20, 113);
|
getdisplay().setCursor(20, 113);
|
||||||
getdisplay().print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 133);
|
getdisplay().setCursor(20, 133);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
@@ -162,11 +167,11 @@ class PageFourValues : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue2->getFormat() == "formatLatitude" || bvalue2->getFormat() == "formatLongitude"){
|
if(bvalue2->getFormat() == "formatLatitude" || bvalue2->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(120, 123);
|
getdisplay().setCursor(120, 123);
|
||||||
}
|
}
|
||||||
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(150, 123);
|
getdisplay().setCursor(150, 123);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -194,12 +199,12 @@ class PageFourValues : public Page
|
|||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(20, 181);
|
getdisplay().setCursor(20, 181);
|
||||||
getdisplay().print(name3); // Page name
|
getdisplay().print(name3); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 201);
|
getdisplay().setCursor(20, 201);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
@@ -210,11 +215,11 @@ class PageFourValues : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue3->getFormat() == "formatLatitude" || bvalue3->getFormat() == "formatLongitude"){
|
if(bvalue3->getFormat() == "formatLatitude" || bvalue3->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(120, 191);
|
getdisplay().setCursor(120, 191);
|
||||||
}
|
}
|
||||||
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(150, 191);
|
getdisplay().setCursor(150, 191);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -242,12 +247,12 @@ class PageFourValues : public Page
|
|||||||
// ############### Value 4 ################
|
// ############### Value 4 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(20, 249);
|
getdisplay().setCursor(20, 249);
|
||||||
getdisplay().print(name4); // Page name
|
getdisplay().print(name4); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 269);
|
getdisplay().setCursor(20, 269);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit4); // Unit
|
getdisplay().print(unit4); // Unit
|
||||||
@@ -258,11 +263,11 @@ class PageFourValues : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue4->getFormat() == "formatLatitude" || bvalue4->getFormat() == "formatLongitude"){
|
if(bvalue4->getFormat() == "formatLatitude" || bvalue4->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(120, 259);
|
getdisplay().setCursor(120, 259);
|
||||||
}
|
}
|
||||||
else if(bvalue4->getFormat() == "formatTime" || bvalue4->getFormat() == "formatDate"){
|
else if(bvalue4->getFormat() == "formatTime" || bvalue4->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(150, 259);
|
getdisplay().setCursor(150, 259);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -282,9 +287,7 @@ class PageFourValues : public Page
|
|||||||
unit4old = unit4; // Save the old unit
|
unit4old = unit4; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -298,7 +301,7 @@ static Page *createPage(CommonData &common){
|
|||||||
* this will be number of BoatValue pointers in pageData.values
|
* this will be number of BoatValue pointers in pageData.values
|
||||||
*/
|
*/
|
||||||
PageDescription registerPageFourValues(
|
PageDescription registerPageFourValues(
|
||||||
"FourValues", // Page name
|
"FourValues", // Page name
|
||||||
createPage, // Action
|
createPage, // Action
|
||||||
4, // Number of bus values depends on selection in Web configuration
|
4, // Number of bus values depends on selection in Web configuration
|
||||||
true // Show display header on/off
|
true // Show display header on/off
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
#include "BoatDataCalibration.h"
|
||||||
|
|
||||||
class PageFourValues2 : public Page
|
class PageFourValues2 : public Page
|
||||||
{
|
{
|
||||||
@@ -20,7 +21,7 @@ class PageFourValues2 : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -45,6 +46,7 @@ class PageFourValues2 : public Page
|
|||||||
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
|
||||||
|
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
||||||
double value1 = bvalue1->value; // Value as double in SI unit
|
double value1 = bvalue1->value; // Value as double in SI unit
|
||||||
bool valid1 = bvalue1->valid; // Valid information
|
bool valid1 = bvalue1->valid; // Valid information
|
||||||
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
@@ -54,6 +56,7 @@ class PageFourValues2 : public Page
|
|||||||
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
|
||||||
|
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
||||||
double value2 = bvalue2->value; // Value as double in SI unit
|
double value2 = bvalue2->value; // Value as double in SI unit
|
||||||
bool valid2 = bvalue2->valid; // Valid information
|
bool valid2 = bvalue2->valid; // Valid information
|
||||||
String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
@@ -63,6 +66,7 @@ class PageFourValues2 : public Page
|
|||||||
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
|
||||||
|
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
||||||
double value3 = bvalue3->value; // Value as double in SI unit
|
double value3 = bvalue3->value; // Value as double in SI unit
|
||||||
bool valid3 = bvalue3->valid; // Valid information
|
bool valid3 = bvalue3->valid; // Valid information
|
||||||
String svalue3 = 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
|
||||||
@@ -72,6 +76,7 @@ class PageFourValues2 : public Page
|
|||||||
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
|
||||||
|
calibrationData.calibrateInstance(bvalue4, logger); // Check if boat data value is to be calibrated
|
||||||
double value4 = bvalue4->value; // Value as double in SI unit
|
double value4 = bvalue4->value; // Value as double in SI unit
|
||||||
bool valid4 = bvalue4->valid; // Valid information
|
bool valid4 = bvalue4->valid; // Valid information
|
||||||
String svalue4 = 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
|
||||||
@@ -84,7 +89,7 @@ class PageFourValues2 : public Page
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageFourValues2, %s: %f, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageFourValues2, %s: %f, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -103,7 +108,7 @@ class PageFourValues2 : public Page
|
|||||||
getdisplay().print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
@@ -114,11 +119,11 @@ class PageFourValues2 : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue1->getFormat() == "formatLatitude" || bvalue1->getFormat() == "formatLongitude"){
|
if(bvalue1->getFormat() == "formatLatitude" || bvalue1->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(100, 90);
|
getdisplay().setCursor(100, 90);
|
||||||
}
|
}
|
||||||
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(180, 77);
|
getdisplay().setCursor(180, 77);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -151,7 +156,7 @@ class PageFourValues2 : public Page
|
|||||||
getdisplay().print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
@@ -162,11 +167,11 @@ class PageFourValues2 : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue2->getFormat() == "formatLatitude" || bvalue2->getFormat() == "formatLongitude"){
|
if(bvalue2->getFormat() == "formatLatitude" || bvalue2->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(100, 180);
|
getdisplay().setCursor(100, 180);
|
||||||
}
|
}
|
||||||
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
else if(bvalue2->getFormat() == "formatTime" || bvalue2->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(180, 158);
|
getdisplay().setCursor(180, 158);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -194,12 +199,12 @@ class PageFourValues2 : public Page
|
|||||||
// ############### Value 3 ################
|
// ############### Value 3 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 220);
|
getdisplay().setCursor(20, 220);
|
||||||
getdisplay().print(name3); // Page name
|
getdisplay().print(name3); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 240);
|
getdisplay().setCursor(20, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
@@ -210,11 +215,11 @@ class PageFourValues2 : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue3->getFormat() == "formatLatitude" || bvalue3->getFormat() == "formatLongitude"){
|
if(bvalue3->getFormat() == "formatLatitude" || bvalue3->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(50, 240);
|
getdisplay().setCursor(50, 240);
|
||||||
}
|
}
|
||||||
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
else if(bvalue3->getFormat() == "formatTime" || bvalue3->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(100, 240);
|
getdisplay().setCursor(100, 240);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -242,12 +247,12 @@ class PageFourValues2 : public Page
|
|||||||
// ############### Value 4 ################
|
// ############### Value 4 ################
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(220, 220);
|
getdisplay().setCursor(220, 220);
|
||||||
getdisplay().print(name4); // Page name
|
getdisplay().print(name4); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(220, 240);
|
getdisplay().setCursor(220, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit4); // Unit
|
getdisplay().print(unit4); // Unit
|
||||||
@@ -258,11 +263,11 @@ class PageFourValues2 : public Page
|
|||||||
|
|
||||||
// Switch font if format for any values
|
// Switch font if format for any values
|
||||||
if(bvalue4->getFormat() == "formatLatitude" || bvalue4->getFormat() == "formatLongitude"){
|
if(bvalue4->getFormat() == "formatLatitude" || bvalue4->getFormat() == "formatLongitude"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(250, 240);
|
getdisplay().setCursor(250, 240);
|
||||||
}
|
}
|
||||||
else if(bvalue4->getFormat() == "formatTime" || bvalue4->getFormat() == "formatDate"){
|
else if(bvalue4->getFormat() == "formatTime" || bvalue4->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(300, 240);
|
getdisplay().setCursor(300, 240);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -282,9 +287,7 @@ class PageFourValues2 : public Page
|
|||||||
unit4old = unit4; // Save the old unit
|
unit4old = unit4; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData)
|
int displayPage(PageData &pageData)
|
||||||
{
|
{
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
@@ -88,10 +88,10 @@ public:
|
|||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
getdisplay().print("Power");
|
getdisplay().print("Power");
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(12, 82);
|
getdisplay().setCursor(12, 82);
|
||||||
getdisplay().print("Generator");
|
getdisplay().print("Generator");
|
||||||
|
|
||||||
@@ -102,7 +102,7 @@ public:
|
|||||||
if(String(batVoltage) == "12V") bvoltage = 12;
|
if(String(batVoltage) == "12V") bvoltage = 12;
|
||||||
else bvoltage = 24;
|
else bvoltage = 24;
|
||||||
getdisplay().print(bvoltage);
|
getdisplay().print(bvoltage);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show solar power
|
// Show solar power
|
||||||
@@ -110,12 +110,12 @@ public:
|
|||||||
getdisplay().setCursor(10, 200);
|
getdisplay().setCursor(10, 200);
|
||||||
if(genPower <= 999) getdisplay().print(genPower, 0);
|
if(genPower <= 999) getdisplay().print(genPower, 0);
|
||||||
if(genPower > 999) getdisplay().print(float(genPower/1000.0), 1);
|
if(genPower > 999) getdisplay().print(float(genPower/1000.0), 1);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
if(genPower <= 999) getdisplay().print("W");
|
if(genPower <= 999) getdisplay().print("W");
|
||||||
if(genPower > 999) getdisplay().print("kW");
|
if(genPower > 999) getdisplay().print("kW");
|
||||||
|
|
||||||
// Show info
|
// Show info
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 235);
|
getdisplay().setCursor(10, 235);
|
||||||
getdisplay().print("Installed");
|
getdisplay().print("Installed");
|
||||||
getdisplay().setCursor(10, 255);
|
getdisplay().setCursor(10, 255);
|
||||||
@@ -128,15 +128,15 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(150, 200);
|
getdisplay().setCursor(150, 200);
|
||||||
getdisplay().print(genPercentage);
|
getdisplay().print(genPercentage);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("%");
|
getdisplay().print("%");
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(150, 235);
|
getdisplay().setCursor(150, 235);
|
||||||
getdisplay().print("Load");
|
getdisplay().print("Load");
|
||||||
|
|
||||||
// Show sensor type info
|
// Show sensor type info
|
||||||
String i2cAddr = "";
|
String i2cAddr = "";
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(270, 60);
|
getdisplay().setCursor(270, 60);
|
||||||
if(powerSensor == "off") getdisplay().print("Internal");
|
if(powerSensor == "off") getdisplay().print("Internal");
|
||||||
if(powerSensor == "INA219"){
|
if(powerSensor == "INA219"){
|
||||||
@@ -176,7 +176,7 @@ public:
|
|||||||
getdisplay().print("---"); // Missing bus data
|
getdisplay().print("---"); // Missing bus data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show actual current in A
|
// Show actual current in A
|
||||||
@@ -188,7 +188,7 @@ public:
|
|||||||
if(value2 > 99.9) getdisplay().print(value2, 0);
|
if(value2 > 99.9) getdisplay().print(value2, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("---");
|
else getdisplay().print("---");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("A");
|
getdisplay().print("A");
|
||||||
|
|
||||||
// Show actual consumption in W
|
// Show actual consumption in W
|
||||||
@@ -200,11 +200,10 @@ public:
|
|||||||
if(value3 > 99.9) getdisplay().print(value3, 0);
|
if(value3 > 99.9) getdisplay().print(value3, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("---");
|
else getdisplay().print("---");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("W");
|
getdisplay().print("W");
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData)
|
int displayPage(PageData &pageData)
|
||||||
{
|
{
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
@@ -86,21 +86,20 @@ public:
|
|||||||
float x = 200 + (rInstrument-30)*sin(i/180.0*pi); // x-coordinate dots
|
float x = 200 + (rInstrument-30)*sin(i/180.0*pi); // x-coordinate dots
|
||||||
float y = 150 - (rInstrument-30)*cos(i/180.0*pi); // y-coordinate cots
|
float y = 150 - (rInstrument-30)*cos(i/180.0*pi); // y-coordinate cots
|
||||||
const char *ii = " ";
|
const char *ii = " ";
|
||||||
switch (i)
|
switch (i) {
|
||||||
{
|
case 0: ii=" "; break; // Use a blank for a empty scale value
|
||||||
case 0: ii=" "; break; // Use a blank for a empty scale value
|
case 30 : ii=" "; break;
|
||||||
case 30 : ii=" "; break;
|
case 60 : ii=" "; break;
|
||||||
case 60 : ii=" "; break;
|
case 90 : ii="45"; break;
|
||||||
case 90 : ii="45"; break;
|
case 120 : ii="30"; break;
|
||||||
case 120 : ii="30"; break;
|
case 150 : ii="15"; break;
|
||||||
case 150 : ii="15"; break;
|
case 180 : ii="0"; break;
|
||||||
case 180 : ii="0"; break;
|
case 210 : ii="15"; break;
|
||||||
case 210 : ii="15"; break;
|
case 240 : ii="30"; break;
|
||||||
case 240 : ii="30"; break;
|
case 270 : ii="45"; break;
|
||||||
case 270 : ii="45"; break;
|
case 300 : ii=" "; break;
|
||||||
case 300 : ii=" "; break;
|
case 330 : ii=" "; break;
|
||||||
case 330 : ii=" "; break;
|
default: break;
|
||||||
default: break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print text centered on position x, y
|
// Print text centered on position x, y
|
||||||
@@ -109,7 +108,7 @@ public:
|
|||||||
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
||||||
getdisplay().setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,26 +188,24 @@ public:
|
|||||||
getdisplay().fillRect(150, 150, 100, 4, commonData->fgcolor); // Water line
|
getdisplay().fillRect(150, 150, 100, 4, commonData->fgcolor); // Water line
|
||||||
|
|
||||||
// Print label
|
// Print label
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(100, 70);
|
getdisplay().setCursor(100, 70);
|
||||||
getdisplay().print("Keel Position"); // Label
|
getdisplay().print("Keel Position"); // Label
|
||||||
|
|
||||||
if((rotsensor == "AS5600" && rotfunction == "Keel" && (valid1 == true || holdvalues == true)) || simulation == true){
|
if((rotsensor == "AS5600" && rotfunction == "Keel" && (valid1 == true || holdvalues == true)) || simulation == true){
|
||||||
// Print Unit of keel position
|
// Print Unit of keel position
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(175, 110);
|
getdisplay().setCursor(175, 110);
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Print Unit of keel position
|
// Print Unit of keel position
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(145, 110);
|
getdisplay().setCursor(145, 110);
|
||||||
getdisplay().print("No sensor data"); // Info missing sensor
|
getdisplay().print("No sensor data"); // Info missing sensor
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
505
lib/obp60task/PageNavigation.cpp
Normal file
505
lib/obp60task/PageNavigation.cpp
Normal file
@@ -0,0 +1,505 @@
|
|||||||
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
|
|
||||||
|
#include "Pagedata.h"
|
||||||
|
#include "OBP60Extensions.h"
|
||||||
|
#include "NetworkClient.h" // Network connection
|
||||||
|
#include "ImageDecoder.h" // Image decoder for navigation map
|
||||||
|
|
||||||
|
#include "Logo_OBP_400x300_sw.h"
|
||||||
|
|
||||||
|
// Defines for reading of navigation map
|
||||||
|
#define JSON_BUFFER 30000 // Max buffer size for JSON content (30 kB picture + values)
|
||||||
|
NetworkClient net(JSON_BUFFER); // Define network client
|
||||||
|
ImageDecoder decoder; // Define image decoder
|
||||||
|
|
||||||
|
class PageNavigation : public Page
|
||||||
|
{
|
||||||
|
// Values for buttons
|
||||||
|
bool firstRun = true; // Detect the first page run
|
||||||
|
int zoom = 15; // Default zoom level
|
||||||
|
bool showValues = false; // Show values HDT, SOG, DBT in navigation map
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint8_t* imageBackupData = nullptr;
|
||||||
|
int imageBackupWidth = 0;
|
||||||
|
int imageBackupHeight = 0;
|
||||||
|
size_t imageBackupSize = 0;
|
||||||
|
bool hasImageBackup = false;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PageNavigation(CommonData &common){
|
||||||
|
commonData = &common;
|
||||||
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageNavigation");
|
||||||
|
imageBackupData = (uint8_t*)heap_caps_malloc((GxEPD_WIDTH * GxEPD_HEIGHT), MALLOC_CAP_SPIRAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual int handleKey(int key){
|
||||||
|
// Code for keylock
|
||||||
|
if(key == 11){
|
||||||
|
commonData->keylock = !commonData->keylock;
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
// Code for zoom -
|
||||||
|
if(key == 1){
|
||||||
|
zoom --; // Zoom -
|
||||||
|
if(zoom <7){
|
||||||
|
zoom = 7;
|
||||||
|
}
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
// Code for zoom -
|
||||||
|
if(key == 2){
|
||||||
|
zoom ++; // Zoom +
|
||||||
|
if(zoom >17){
|
||||||
|
zoom = 17;
|
||||||
|
}
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
if(key == 5){
|
||||||
|
showValues = !showValues; // Toggle show values
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
int displayPage(PageData &pageData){
|
||||||
|
GwConfigHandler *config = commonData->config;
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
|
// 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 mapsource = config->getString(config->mapsource);
|
||||||
|
String ipAddress = config->getString(config->ipAddress);
|
||||||
|
int localPort = config->getInt(config->localPort);
|
||||||
|
String mapType = config->getString(config->maptype);
|
||||||
|
int zoomLevel = config->getInt(config->zoomlevel);
|
||||||
|
bool grid = config->getBool(config->grid);
|
||||||
|
String orientation = config->getString(config->orientation);
|
||||||
|
int refreshDistance = config->getInt(config->refreshDistance);
|
||||||
|
bool showValuesMap = config->getBool(config->showvalues);
|
||||||
|
bool ownHeading = config->getBool(config->ownheading);
|
||||||
|
|
||||||
|
if(firstRun == true){
|
||||||
|
zoom = zoomLevel; // Over write zoom level with setup value
|
||||||
|
showValues = showValuesMap; // Over write showValues with setup value
|
||||||
|
firstRun = false; // Restet variable
|
||||||
|
}
|
||||||
|
|
||||||
|
// Local variables
|
||||||
|
String server = "norbert-walter.dnshome.de";
|
||||||
|
int port = 80;
|
||||||
|
int mType = 1;
|
||||||
|
int dType = 1;
|
||||||
|
int mapRot = 0;
|
||||||
|
int symbolRot = 0;
|
||||||
|
int mapGrid = 0;
|
||||||
|
|
||||||
|
|
||||||
|
// Old values for hold function
|
||||||
|
static double value1old = 0;
|
||||||
|
static String svalue1old = "";
|
||||||
|
static String unit1old = "";
|
||||||
|
static double value2old = 0;
|
||||||
|
static String svalue2old = "";
|
||||||
|
static String unit2old = "";
|
||||||
|
static double value3old = 0; // Deg
|
||||||
|
static String svalue3old = "";
|
||||||
|
static String unit3old = "";
|
||||||
|
static double value4old = 0;
|
||||||
|
static String svalue4old = "";
|
||||||
|
static String unit4old = "";
|
||||||
|
static double value5old = 0;
|
||||||
|
static String svalue5old = "";
|
||||||
|
static String unit5old = "";
|
||||||
|
static double value6old = 0;
|
||||||
|
static String svalue6old = "";
|
||||||
|
static String unit6old = "";
|
||||||
|
|
||||||
|
static double latitude = 0;
|
||||||
|
static double latitudeold = 0;
|
||||||
|
static double longitude = 0;
|
||||||
|
static double longitudeold = 0;
|
||||||
|
static double trueHeading = 0;
|
||||||
|
static double magneticHeading = 0;
|
||||||
|
static double speedOverGround = 0;
|
||||||
|
static double depthBelowTransducer = 0;
|
||||||
|
static int lostCounter = 0; // Counter for connection lost to the map server (increment by each page refresh)
|
||||||
|
int imgWidth = 0;
|
||||||
|
int imgHeight = 0;
|
||||||
|
|
||||||
|
// Get boat values #1 Latitude
|
||||||
|
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
|
||||||
|
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
|
||||||
|
|
||||||
|
// Get boat values #2 Longitude
|
||||||
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second 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
|
||||||
|
|
||||||
|
// Get boat values #3 HDT
|
||||||
|
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
|
||||||
|
|
||||||
|
// Get boat values #4 HDM
|
||||||
|
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
|
||||||
|
|
||||||
|
// Get boat values #5 SOG
|
||||||
|
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
|
||||||
|
|
||||||
|
// Get boat values #6 DBT
|
||||||
|
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
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Logging boat values
|
||||||
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageNavigation, %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);
|
||||||
|
|
||||||
|
// Set variables
|
||||||
|
//***********************************************************
|
||||||
|
|
||||||
|
// Latitude
|
||||||
|
if(valid1){
|
||||||
|
latitude = value1;
|
||||||
|
latitudeold = value1;
|
||||||
|
value3old = value1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
latitude = value1old;
|
||||||
|
}
|
||||||
|
// Longitude
|
||||||
|
if(valid2){
|
||||||
|
longitude = value2;
|
||||||
|
longitudeold = value2;
|
||||||
|
value2old = value2;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
longitude = value2old;
|
||||||
|
}
|
||||||
|
// HDT value (True Heading, GPS)
|
||||||
|
if(valid3){
|
||||||
|
trueHeading = (value3 * 360) / (2 * PI);
|
||||||
|
value3old = trueHeading;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
trueHeading = value3old;
|
||||||
|
}
|
||||||
|
// HDM value (Magnetic Heading)
|
||||||
|
if(valid4){
|
||||||
|
magneticHeading = (value4 * 360) / (2 * PI);
|
||||||
|
value4old = magneticHeading;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
speedOverGround = value4old;
|
||||||
|
}
|
||||||
|
// SOG value (Speed Over Ground)
|
||||||
|
if(valid5){
|
||||||
|
speedOverGround = value5;
|
||||||
|
value5old = value5;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
speedOverGround = value5old;
|
||||||
|
}
|
||||||
|
// DBT value (Depth Below Transducer)
|
||||||
|
if(valid6){
|
||||||
|
depthBelowTransducer = value6;
|
||||||
|
value6old = value6;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
depthBelowTransducer = value6old;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare config values for URL
|
||||||
|
//***********************************************************
|
||||||
|
|
||||||
|
// Server settings
|
||||||
|
if(mapsource == "OBP Service"){
|
||||||
|
server = "norbert-walter.dnshome.de";
|
||||||
|
port = 80;
|
||||||
|
}
|
||||||
|
else if(mapsource == "Local Service"){
|
||||||
|
server = String(ipAddress);
|
||||||
|
port = localPort;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
server = "norbert-walter.dnshome.de";
|
||||||
|
port = 80;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Type of navigation map
|
||||||
|
if(mapType == "Open Street Map"){
|
||||||
|
mType = 1; // Map type
|
||||||
|
dType = 1; // Dithering type
|
||||||
|
}
|
||||||
|
else if(mapType == "Google Street"){
|
||||||
|
mType = 3;
|
||||||
|
dType = 2;
|
||||||
|
}
|
||||||
|
else if(mapType == "Open Topo Map"){
|
||||||
|
mType = 5;
|
||||||
|
dType = 2;
|
||||||
|
}
|
||||||
|
else if(mapType == "Stadimaps Toner"){
|
||||||
|
mType = 7;
|
||||||
|
dType = 1;
|
||||||
|
}
|
||||||
|
else if(mapType == "Free Nautical Chart"){
|
||||||
|
mType = 9;
|
||||||
|
dType = 1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
mType = 1;
|
||||||
|
dType = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map grid on/off
|
||||||
|
if(grid == true){
|
||||||
|
mapGrid = 1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
mapGrid = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map orientation
|
||||||
|
if(orientation == "North Direction"){
|
||||||
|
mapRot = 0;
|
||||||
|
// If true heading available then use HDT oterwise HDM
|
||||||
|
if(valid3 == true){
|
||||||
|
symbolRot = trueHeading;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
symbolRot = magneticHeading;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(orientation == "Travel Direction"){
|
||||||
|
// If true heading available then use HDT oterwise HDM
|
||||||
|
if(valid3 == true){
|
||||||
|
mapRot = trueHeading;
|
||||||
|
symbolRot = trueHeading;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
mapRot = magneticHeading;
|
||||||
|
symbolRot = magneticHeading;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
mapRot = 0;
|
||||||
|
// If true heading available then use HDT oterwise HDM
|
||||||
|
if(valid3 == true){
|
||||||
|
symbolRot = trueHeading;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
symbolRot = magneticHeading;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load navigation map
|
||||||
|
//***********************************************************
|
||||||
|
|
||||||
|
// URL to OBP Maps Converter
|
||||||
|
// For more details see: https://github.com/norbert-walter/maps-converter
|
||||||
|
String url = String("http://") + server + ":" + port + // OBP Server
|
||||||
|
String("/get_image_json?") + // Service: Output B&W picture as JSON (Base64 + gzip)
|
||||||
|
"zoom=" + zoom + // Default zoom level: 15
|
||||||
|
"&lat=" + String(latitude, 6) + // Latitude
|
||||||
|
"&lon=" + String(longitude, 6) + // Longitude
|
||||||
|
"&mrot=" + mapRot + // Rotation angle navigation map in degree
|
||||||
|
"&mtype=" + mType + // Default Map: Open Street Map
|
||||||
|
"&dtype=" + dType + // Dithering type: Atkinson dithering
|
||||||
|
"&width=400" + // With navigation map
|
||||||
|
"&height=250" + // Height navigation map
|
||||||
|
"&cutout=0" + // No picture cutouts
|
||||||
|
"&tab=0" + // No tab size
|
||||||
|
"&border=2" + // Border line size: 2 pixel
|
||||||
|
"&symbol=2" + // Symbol: Triangle
|
||||||
|
"&srot=" + symbolRot + // Symbol rotation angle
|
||||||
|
"&ssize=15" + // Symbole size: 15 pixel
|
||||||
|
"&grid=" + mapGrid // Show grid: On
|
||||||
|
;
|
||||||
|
|
||||||
|
// Draw page
|
||||||
|
//***********************************************************
|
||||||
|
|
||||||
|
// ############### Draw Navigation Map ################
|
||||||
|
|
||||||
|
// Set display in partial refresh mode
|
||||||
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
|
// If a network connection to URL then load the navigation map
|
||||||
|
if (net.fetchAndDecompressJson(url)) {
|
||||||
|
|
||||||
|
auto& json = net.json(); // Extract JSON content
|
||||||
|
int numPix = json["number_pixels"] | 0; // Read number of pixels
|
||||||
|
imgWidth = json["width"] | 0; // Read width of image
|
||||||
|
imgHeight = json["height"] | 0; // Read height og image
|
||||||
|
|
||||||
|
const char* b64src = json["picture_base64"].as<const char*>(); // Read picture as Base64 content
|
||||||
|
size_t b64len = strlen(b64src); // Calculate length of Base64 content
|
||||||
|
// Copy Base64 content in PSRAM
|
||||||
|
char* b64 = (char*) heap_caps_malloc(b64len + 1, MALLOC_CAP_SPIRAM); // Allcate PSRAM for Base64 content
|
||||||
|
if (!b64) {
|
||||||
|
LOG_DEBUG(GwLog::ERROR,"Error PageNavigation: PSRAM alloc base64 failed");
|
||||||
|
return PAGE_UPDATE;
|
||||||
|
}
|
||||||
|
memcpy(b64, b64src, b64len + 1); // Copy Base64 content in PSRAM
|
||||||
|
|
||||||
|
// Set image buffer in PSRAM
|
||||||
|
//size_t imgSize = getdisplay().width() * getdisplay().height();
|
||||||
|
size_t imgSize = numPix; // Calculate image size
|
||||||
|
uint8_t* imageData = (uint8_t*) heap_caps_malloc(imgSize, MALLOC_CAP_SPIRAM); // Allocate PSRAM for image
|
||||||
|
if (!imageData) {
|
||||||
|
LOG_DEBUG(GwLog::ERROR,"Error PageNavigation: PPSRAM alloc image buffer failed");
|
||||||
|
free(b64);
|
||||||
|
return PAGE_UPDATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode Base64 content to image
|
||||||
|
size_t decodedSize = 0;
|
||||||
|
decoder.decodeBase64(b64, imageData, imgSize, decodedSize);
|
||||||
|
|
||||||
|
// Copy actual navigation man to ackup map
|
||||||
|
imageBackupWidth = imgWidth;
|
||||||
|
imageBackupHeight = imgHeight;
|
||||||
|
imageBackupSize = imgSize;
|
||||||
|
if (decodedSize > 0) {
|
||||||
|
memcpy(imageBackupData, imageData, decodedSize);
|
||||||
|
imageBackupSize = decodedSize;
|
||||||
|
}
|
||||||
|
hasImageBackup = true;
|
||||||
|
lostCounter = 0;
|
||||||
|
|
||||||
|
// Show image (navigation map)
|
||||||
|
getdisplay().drawBitmap(0, 25, imageData, imgWidth, imgHeight, commonData->fgcolor);
|
||||||
|
|
||||||
|
// Clean PSRAM
|
||||||
|
free(b64);
|
||||||
|
free(imageData);
|
||||||
|
}
|
||||||
|
// If no network connection then use backup navigation map
|
||||||
|
else{
|
||||||
|
// Show backup image (backup navigation map)
|
||||||
|
if (hasImageBackup) {
|
||||||
|
getdisplay().drawBitmap(0, 25, imageBackupData, imageBackupWidth, imageBackupHeight, commonData->fgcolor);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show info: Connection lost when 5 page refreshes has a connection lost to the map server
|
||||||
|
// Short connection losts are uncritical
|
||||||
|
if(lostCounter >= 5){
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().fillRect(200, 250 , 200, 25, commonData->fgcolor); // Black rect
|
||||||
|
getdisplay().fillRect(202, 252 , 196, 21, commonData->bgcolor); // White rect
|
||||||
|
getdisplay().setCursor(210, 270);
|
||||||
|
getdisplay().print("Map server lost");
|
||||||
|
}
|
||||||
|
|
||||||
|
lostCounter++; // Increment lost counter
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ############### Draw Values ################
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
|
||||||
|
// Show zoom level
|
||||||
|
getdisplay().fillRect(355, 25 , 45, 25, commonData->fgcolor); // Black rect
|
||||||
|
getdisplay().fillRect(357, 27 , 41, 21, commonData->bgcolor); // White rect
|
||||||
|
getdisplay().setCursor(364, 45);
|
||||||
|
getdisplay().print(zoom);
|
||||||
|
// If true heading available then use HDT oterwise HDM
|
||||||
|
if(showValues == true){
|
||||||
|
// Frame
|
||||||
|
getdisplay().fillRect(0, 25 , 130, 65, commonData->fgcolor); // Black rect
|
||||||
|
getdisplay().fillRect(2, 27 , 126, 61, commonData->bgcolor); // White rect
|
||||||
|
if(valid3 == true){
|
||||||
|
// HDT
|
||||||
|
getdisplay().setCursor(10, 45);
|
||||||
|
getdisplay().print(name3);
|
||||||
|
getdisplay().setCursor(70, 45);
|
||||||
|
getdisplay().print(svalue3);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
// HDM
|
||||||
|
getdisplay().setCursor(10, 45);
|
||||||
|
getdisplay().print(name4);
|
||||||
|
getdisplay().setCursor(70, 45);
|
||||||
|
getdisplay().print(svalue4);
|
||||||
|
}
|
||||||
|
// SOG
|
||||||
|
getdisplay().setCursor(10, 65);
|
||||||
|
getdisplay().print(name5);
|
||||||
|
getdisplay().setCursor(70, 65);
|
||||||
|
getdisplay().print(svalue5);
|
||||||
|
// DBT
|
||||||
|
getdisplay().setCursor(10, 85);
|
||||||
|
getdisplay().print(name6);
|
||||||
|
getdisplay().setCursor(70, 85);
|
||||||
|
getdisplay().print(svalue6);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set botton labels
|
||||||
|
commonData->keydata[0].label = "ZOOM -";
|
||||||
|
commonData->keydata[1].label = "ZOOM +";
|
||||||
|
commonData->keydata[4].label = "VALUES";
|
||||||
|
|
||||||
|
return PAGE_UPDATE;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
static Page *createPage(CommonData &common){
|
||||||
|
return new PageNavigation(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 registerPageNavigation(
|
||||||
|
"Navigation", // Page name
|
||||||
|
createPage, // Action
|
||||||
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
|
{"LAT","LON","HDT","HDM","SOG","DBT"}, // Bus values we need in the page
|
||||||
|
true // Show display header on/off
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
#include "BoatDataCalibration.h"
|
||||||
|
|
||||||
class PageOneValue : public Page
|
class PageOneValue : public Page
|
||||||
{
|
{
|
||||||
@@ -20,7 +21,7 @@ class PageOneValue : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -39,8 +40,9 @@ class PageOneValue : public Page
|
|||||||
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
|
||||||
|
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
||||||
double value1 = bvalue1->value; // Value as double in SI unit
|
double value1 = bvalue1->value; // Value as double in SI unit
|
||||||
bool valid1 = bvalue1->valid; // Valid information
|
bool valid1 = bvalue1->valid; // Valid information
|
||||||
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
@@ -51,7 +53,7 @@ class PageOneValue : public Page
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageOneValue, %s: %f", name1.c_str(), value1);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageOneValue, %s: %f", name1.c_str(), value1);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -62,7 +64,7 @@ class PageOneValue : public Page
|
|||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
getdisplay().setFont(&Ubuntu_Bold32pt8b);
|
||||||
getdisplay().setCursor(20, 100);
|
getdisplay().setCursor(20, 100);
|
||||||
getdisplay().print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
@@ -82,7 +84,7 @@ class PageOneValue : public Page
|
|||||||
getdisplay().setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
}
|
}
|
||||||
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
else if(bvalue1->getFormat() == "formatTime" || bvalue1->getFormat() == "formatDate"){
|
||||||
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
getdisplay().setFont(&Ubuntu_Bold32pt8b);
|
||||||
getdisplay().setCursor(20, 200);
|
getdisplay().setCursor(20, 200);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -102,9 +104,7 @@ class PageOneValue : public Page
|
|||||||
unit1old = unit1; // Save the old unit
|
unit1old = unit1; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -41,9 +41,9 @@ public:
|
|||||||
String backlightMode = config->getString(config->backlight);
|
String backlightMode = config->getString(config->backlight);
|
||||||
int rolllimit = config->getInt(config->rollLimit);
|
int rolllimit = config->getInt(config->rollLimit);
|
||||||
String roffset = config->getString(config->rollOffset);
|
String roffset = config->getString(config->rollOffset);
|
||||||
double rolloffset = roffset.toFloat()/360*(2*PI);
|
double rolloffset = roffset.toFloat()/360*(2*M_PI);
|
||||||
String poffset = config->getString(config->pitchOffset);
|
String poffset = config->getString(config->pitchOffset);
|
||||||
double pitchoffset = poffset.toFloat()/360*(2*PI);
|
double pitchoffset = poffset.toFloat()/360*(2*M_PI);
|
||||||
|
|
||||||
// Get boat values for roll
|
// Get boat values for roll
|
||||||
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (xdrRoll)
|
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (xdrRoll)
|
||||||
@@ -55,17 +55,17 @@ public:
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(simulation == true){
|
if(simulation == true){
|
||||||
value1 = (20 + float(random(0, 50)) / 10.0)/360*2*PI;
|
value1 = (20 + float(random(0, 50)) / 10.0)/360*2*M_PI;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
value1 = 0;
|
value1 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(value1/(2*PI)*360 > -10 && value1/(2*PI)*360 < 10){
|
if(value1/(2*M_PI)*360 > -10 && value1/(2*M_PI)*360 < 10){
|
||||||
svalue1 = String(value1/(2*PI)*360,1); // Convert raw value to string
|
svalue1 = String(value1/(2*M_PI)*360,1); // Convert raw value to string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
svalue1 = String(value1/(2*PI)*360,0);
|
svalue1 = String(value1/(2*M_PI)*360,0);
|
||||||
}
|
}
|
||||||
if(valid1 == true){
|
if(valid1 == true){
|
||||||
svalue1old = svalue1; // Save the old value
|
svalue1old = svalue1; // Save the old value
|
||||||
@@ -80,17 +80,17 @@ public:
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(simulation == true){
|
if(simulation == true){
|
||||||
value2 = (float(random(-5, 5)))/360*2*PI;
|
value2 = (float(random(-5, 5)))/360*2*M_PI;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
value2 = 0;
|
value2 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(value2/(2*PI)*360 > -10 && value2/(2*PI)*360 < 10){
|
if(value2/(2*PI)*360 > -10 && value2/(2*M_PI)*360 < 10){
|
||||||
svalue2 = String(value2/(2*PI)*360,1); // Convert raw value to string
|
svalue2 = String(value2/(2*M_PI)*360,1); // Convert raw value to string
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
svalue2 = String(value2/(2*PI)*360,0);
|
svalue2 = String(value2/(2*M_PI)*360,0);
|
||||||
}
|
}
|
||||||
if(valid2 == true){
|
if(valid2 == true){
|
||||||
svalue2old = svalue2; // Save the old value
|
svalue2old = svalue2; // Save the old value
|
||||||
@@ -99,7 +99,7 @@ public:
|
|||||||
// Optical warning by limit violation
|
// Optical warning by limit violation
|
||||||
if(String(flashLED) == "Limit Violation"){
|
if(String(flashLED) == "Limit Violation"){
|
||||||
// Limits for roll
|
// Limits for roll
|
||||||
if(value1*360/(2*PI) >= -1*rolllimit && value1*360/(2*PI) <= rolllimit){
|
if(value1*360/(2*M_PI) >= -1*rolllimit && value1*360/(2*M_PI) <= rolllimit){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
setFlashLED(false);
|
setFlashLED(false);
|
||||||
}
|
}
|
||||||
@@ -109,7 +109,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageRollPitch, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageRollPitch, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -126,13 +126,13 @@ public:
|
|||||||
getdisplay().print(rolllimit); // Value
|
getdisplay().print(rolllimit); // Value
|
||||||
//getdisplay().print(svalue1); // Value
|
//getdisplay().print(svalue1); // Value
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 95);
|
getdisplay().setCursor(10, 95);
|
||||||
getdisplay().print("Limit"); // Name
|
getdisplay().print("Limit"); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 115);
|
getdisplay().setCursor(10, 115);
|
||||||
getdisplay().print("DEG");
|
getdisplay().print("DEG");
|
||||||
|
|
||||||
// Horizintal separator left
|
// Horizintal separator left
|
||||||
getdisplay().fillRect(0, 149, 60, 3, commonData->fgcolor);
|
getdisplay().fillRect(0, 149, 60, 3, commonData->fgcolor);
|
||||||
|
|
||||||
@@ -141,10 +141,10 @@ public:
|
|||||||
getdisplay().setCursor(10, 270);
|
getdisplay().setCursor(10, 270);
|
||||||
if(holdvalues == false) getdisplay().print(svalue1); // Value
|
if(holdvalues == false) getdisplay().print(svalue1); // Value
|
||||||
else getdisplay().print(svalue1old);
|
else getdisplay().print(svalue1old);
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 220);
|
getdisplay().setCursor(10, 220);
|
||||||
getdisplay().print(name1); // Name
|
getdisplay().print(name1); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 190);
|
getdisplay().setCursor(10, 190);
|
||||||
getdisplay().print("Deg");
|
getdisplay().print("Deg");
|
||||||
|
|
||||||
@@ -156,15 +156,15 @@ public:
|
|||||||
getdisplay().setCursor(295, 270);
|
getdisplay().setCursor(295, 270);
|
||||||
if(holdvalues == false) getdisplay().print(svalue2); // Value
|
if(holdvalues == false) getdisplay().print(svalue2); // Value
|
||||||
else getdisplay().print(svalue2old);
|
else getdisplay().print(svalue2old);
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(335, 220);
|
getdisplay().setCursor(335, 220);
|
||||||
getdisplay().print(name2); // Name
|
getdisplay().print(name2); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 190);
|
getdisplay().setCursor(335, 190);
|
||||||
getdisplay().print("Deg");
|
getdisplay().print("Deg");
|
||||||
|
|
||||||
//*******************************************************************************************
|
//*******************************************************************************************
|
||||||
|
|
||||||
// Draw instrument
|
// Draw instrument
|
||||||
int rInstrument = 100; // Radius of instrument
|
int rInstrument = 100; // Radius of instrument
|
||||||
float pi = 3.141592;
|
float pi = 3.141592;
|
||||||
@@ -177,19 +177,18 @@ public:
|
|||||||
// Only scaling +/- 60 degrees
|
// Only scaling +/- 60 degrees
|
||||||
if((i >= 0 && i <= 60) || (i >= 300 && i <= 360)){
|
if((i >= 0 && i <= 60) || (i >= 300 && i <= 360)){
|
||||||
// Scaling values
|
// Scaling values
|
||||||
float x = 200 + (rInstrument+25)*sin(i/180.0*pi); // x-coordinate dots
|
float x = 200 + (rInstrument+25)*sin(i/180.0*M_PI); // x-coordinate dots
|
||||||
float y = 150 - (rInstrument+25)*cos(i/180.0*pi); // y-coordinate cots
|
float y = 150 - (rInstrument+25)*cos(i/180.0*M_PI); // y-coordinate cots
|
||||||
const char *ii = "";
|
const char *ii = "";
|
||||||
switch (i)
|
switch (i) {
|
||||||
{
|
case 0: ii="0"; break;
|
||||||
case 0: ii="0"; break;
|
case 20 : ii="20"; break;
|
||||||
case 20 : ii="20"; break;
|
case 40 : ii="40"; break;
|
||||||
case 40 : ii="40"; break;
|
case 60 : ii="60"; break;
|
||||||
case 60 : ii="60"; break;
|
case 300 : ii="60"; break;
|
||||||
case 300 : ii="60"; break;
|
case 320 : ii="40"; break;
|
||||||
case 320 : ii="40"; break;
|
case 340 : ii="20"; break;
|
||||||
case 340 : ii="20"; break;
|
default: break;
|
||||||
default: break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print text centered on position x, y
|
// Print text centered on position x, y
|
||||||
@@ -198,16 +197,16 @@ public:
|
|||||||
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
||||||
getdisplay().setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 20 == 0){
|
if(i % 20 == 0){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw sub scale with dots
|
// Draw sub scale with dots
|
||||||
float x1c = 200 + rInstrument*sin(i/180.0*pi);
|
float x1c = 200 + rInstrument*sin(i/180.0*M_PI);
|
||||||
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
float y1c = 150 - rInstrument*cos(i/180.0*M_PI);
|
||||||
getdisplay().fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
getdisplay().fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
||||||
float sinx=sin(i/180.0*pi);
|
float sinx=sin(i/180.0*M_PI);
|
||||||
float cosx=cos(i/180.0*pi);
|
float cosx=cos(i/180.0*M_PI);
|
||||||
|
|
||||||
// Draw sub scale with lines (two triangles)
|
// Draw sub scale with lines (two triangles)
|
||||||
if(i % 20 == 0){
|
if(i % 20 == 0){
|
||||||
@@ -229,17 +228,17 @@ public:
|
|||||||
// Draw mast position pointer
|
// Draw mast position pointer
|
||||||
float startwidth = 8; // Start width of pointer
|
float startwidth = 8; // Start width of pointer
|
||||||
|
|
||||||
// value1 = (2 * pi ) - value1; // Mirror coordiante system for pointer, keel and boat
|
// value1 = (2 * M_PI ) - value1; // Mirror coordiante system for pointer, keel and boat
|
||||||
|
|
||||||
if(valid1 == true || holdvalues == true || simulation == true){
|
if(valid1 == true || holdvalues == true || simulation == true){
|
||||||
float sinx=sin(value1 + pi);
|
float sinx=sin(value1 + M_PI);
|
||||||
float cosx=cos(value1 + pi);
|
float cosx=cos(value1 + M_PI);
|
||||||
// Normal pointer
|
// Normal pointer
|
||||||
// Pointer as triangle with center base 2*width
|
// Pointer as triangle with center base 2*width
|
||||||
float xx1 = -startwidth;
|
float xx1 = -startwidth;
|
||||||
float xx2 = startwidth;
|
float xx2 = startwidth;
|
||||||
float yy1 = -startwidth;
|
float yy1 = -startwidth;
|
||||||
float yy2 = -(rInstrument * 0.7);
|
float yy2 = -(rInstrument * 0.7);
|
||||||
getdisplay().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);
|
||||||
@@ -283,7 +282,7 @@ 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);
|
||||||
getdisplay().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);
|
||||||
@@ -300,14 +299,12 @@ public:
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Print sensor info
|
// Print sensor info
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(145, 200);
|
getdisplay().setCursor(145, 200);
|
||||||
getdisplay().print("No sensor data"); // Info missing sensor
|
getdisplay().print("No sensor data"); // Info missing sensor
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
#include "BoatDataCalibration.h"
|
||||||
|
|
||||||
class PageRudderPosition : public Page
|
class PageRudderPosition : public Page
|
||||||
{
|
{
|
||||||
@@ -21,7 +22,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -40,24 +41,25 @@ public:
|
|||||||
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
|
||||||
|
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
||||||
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 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
if(valid1 == true){
|
if(valid1 == true){
|
||||||
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*PI;
|
||||||
|
unit1 = "Deg";
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
value1 = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(simulation == true){
|
|
||||||
value1 = (3 + float(random(0, 50)) / 10.0)/360*2*PI;
|
|
||||||
unit1 = "Deg";
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
value1 = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 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);
|
||||||
@@ -65,7 +67,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageRudderPosition, %s:%f", name1.c_str(), value1);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageRudderPosition, %s:%f", name1.c_str(), value1);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -113,7 +115,7 @@ public:
|
|||||||
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
||||||
getdisplay().setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,26 +144,26 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Print label
|
// Print label
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(80, 70);
|
getdisplay().setCursor(80, 70);
|
||||||
getdisplay().print("Rudder Position"); // Label
|
getdisplay().print("Rudder Position"); // Label
|
||||||
|
|
||||||
// Print Unit in RudderPosition
|
// Print Unit in RudderPosition
|
||||||
if(valid1 == true || simulation == true){
|
if(valid1 == true || simulation == true){
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(175, 110);
|
getdisplay().setCursor(175, 110);
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(175, 110);
|
getdisplay().setCursor(175, 110);
|
||||||
getdisplay().print(unit1old); // Unit
|
getdisplay().print(unit1old); // Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Print Unit of keel position
|
// Print Unit of keel position
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(145, 110);
|
getdisplay().setCursor(145, 110);
|
||||||
getdisplay().print("No sensor data"); // Info missing sensor
|
getdisplay().print("No sensor data"); // Info missing sensor
|
||||||
}
|
}
|
||||||
@@ -205,8 +207,7 @@ public:
|
|||||||
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
||||||
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
172
lib/obp60task/PageSixValues.cpp
Normal file
172
lib/obp60task/PageSixValues.cpp
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
|
|
||||||
|
#include "Pagedata.h"
|
||||||
|
#include "OBP60Extensions.h"
|
||||||
|
#include "BoatDataCalibration.h"
|
||||||
|
|
||||||
|
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){
|
||||||
|
commonData = &common;
|
||||||
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageSixValues");
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual int handleKey(int key){
|
||||||
|
// Code for keylock
|
||||||
|
if(key == 11){
|
||||||
|
commonData->keylock = !commonData->keylock;
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
int displayPage(PageData &pageData){
|
||||||
|
GwConfigHandler *config = commonData->config;
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
|
|
||||||
|
// 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
|
||||||
|
calibrationData.calibrateInstance(bvalue, logger); // Check if boat data value is to be calibrated
|
||||||
|
DataValue[i] = bvalue->value; // Value as double in SI unit
|
||||||
|
DataValid[i] = bvalue->valid;
|
||||||
|
DataText[i] = formatValue(bvalue, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
|
DataUnits[i] = formatValue(bvalue, *commonData).unit;
|
||||||
|
DataFormat[i] = bvalue->getFormat(); // Unit of value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if(String(flashLED) == "Limit Violation"){
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bvalue == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
|
|
||||||
|
// Draw page
|
||||||
|
//***********************************************************
|
||||||
|
|
||||||
|
// Set display in partial refresh mode
|
||||||
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
getdisplay().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
|
||||||
|
getdisplay().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
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().setCursor(x0, y0+25);
|
||||||
|
getdisplay().print(DataName[ValueIndex]); // Page name
|
||||||
|
|
||||||
|
// Show unit
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
getdisplay().setCursor(x0, y0+72);
|
||||||
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(DataUnits[ValueIndex]); // Unit
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print(OldDataUnits[ValueIndex]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Switch font if format for any values
|
||||||
|
if(DataFormat[ValueIndex] == "formatLatitude" || DataFormat[ValueIndex] == "formatLongitude"){
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().setCursor(x0+10, y0+60);
|
||||||
|
}
|
||||||
|
else if(DataFormat[ValueIndex] == "formatTime" || DataFormat[ValueIndex] == "formatDate"){
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
|
getdisplay().setCursor(x0+20,y0+55);
|
||||||
|
}
|
||||||
|
// pressure in hPa
|
||||||
|
else if(DataFormat[ValueIndex] == "formatXdr:P:P"){
|
||||||
|
getdisplay().setFont(&DSEG7Classic_BoldItalic26pt7b);
|
||||||
|
getdisplay().setCursor(x0+5, y0+70);
|
||||||
|
}
|
||||||
|
// RPM
|
||||||
|
else if(DataFormat[ValueIndex] == "formatXdr:T:R"){
|
||||||
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
|
getdisplay().setCursor(x0+25, y0+70);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().setFont(&DSEG7Classic_BoldItalic26pt7b);
|
||||||
|
if ( DataText[ValueIndex][0] == '-' )
|
||||||
|
getdisplay().setCursor(x0+25, y0+70);
|
||||||
|
else
|
||||||
|
getdisplay().setCursor(x0+65, y0+70);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show bus data
|
||||||
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(DataText[ValueIndex]); // Real value as formated string
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Vertical line 3 pix
|
||||||
|
getdisplay().fillRect(SixValues_x1+SixValues_DeltaX-8, SixValues_y1+i*SixValues_DeltaY, 3, SixValues_DeltaY, commonData->fgcolor);
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
204
lib/obp60task/PageSkyView.cpp
Normal file
204
lib/obp60task/PageSkyView.cpp
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
|
|
||||||
|
#include "Pagedata.h"
|
||||||
|
#include "OBP60Extensions.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm> // for vector sorting
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SkyView / Satellites
|
||||||
|
*/
|
||||||
|
|
||||||
|
class PageSkyView : public Page
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
String flashLED;
|
||||||
|
GwBoatData *bd;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PageSkyView(CommonData &common)
|
||||||
|
{
|
||||||
|
commonData = &common;
|
||||||
|
|
||||||
|
// task name access is for example purpose only
|
||||||
|
TaskHandle_t currentTaskHandle = xTaskGetCurrentTaskHandle();
|
||||||
|
const char* taskName = pcTaskGetName(currentTaskHandle);
|
||||||
|
common.logger->logDebug(GwLog::LOG, "Instantiate PageSkyView in task '%s'", taskName);
|
||||||
|
|
||||||
|
flashLED = common.config->getString(common.config->flashLED);
|
||||||
|
}
|
||||||
|
|
||||||
|
int handleKey(int key) {
|
||||||
|
// return 0 to mark the key handled completely
|
||||||
|
// return the key to allow further action
|
||||||
|
if (key == 11) {
|
||||||
|
commonData->keylock = !commonData->keylock;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayNew(PageData &pageData) {
|
||||||
|
#ifdef BOARD_OBP60S3
|
||||||
|
// Clear optical warning
|
||||||
|
if (flashLED == "Limit Violation") {
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
bd = pageData.api->getBoatData();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Comparator function to sort by SNR
|
||||||
|
static bool compareBySNR(const GwSatInfo& a, const GwSatInfo& b) {
|
||||||
|
return a.SNR > b.SNR; // Sort in descending order
|
||||||
|
}
|
||||||
|
|
||||||
|
int displayPage(PageData &pageData) {
|
||||||
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
|
std::vector<GwSatInfo> sats;
|
||||||
|
int nSat = bd->SatInfo->getNumSats();
|
||||||
|
|
||||||
|
logger->logDebug(GwLog::LOG, "Drawing at PageSkyView, %d satellites", nSat);
|
||||||
|
|
||||||
|
for (int i = 0; i < nSat; i++) {
|
||||||
|
sats.push_back(*bd->SatInfo->getAt(i));
|
||||||
|
}
|
||||||
|
std::sort(sats.begin(), sats.end(), compareBySNR);
|
||||||
|
|
||||||
|
// Draw page
|
||||||
|
//***********************************************************
|
||||||
|
|
||||||
|
// Set display in partial refresh mode
|
||||||
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
|
// current position
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
|
||||||
|
// sky view
|
||||||
|
Point c = {130, 148};
|
||||||
|
uint16_t r = 120;
|
||||||
|
uint16_t r1 = r / 2;
|
||||||
|
|
||||||
|
getdisplay().fillCircle(c.x, c.y, r + 2, commonData->fgcolor);
|
||||||
|
getdisplay().fillCircle(c.x, c.y, r - 1, commonData->bgcolor);
|
||||||
|
getdisplay().drawCircle(c.x, c.y, r1, commonData->fgcolor);
|
||||||
|
|
||||||
|
// separation lines
|
||||||
|
getdisplay().drawLine(c.x - r, c.y, c.x + r, c.y, commonData->fgcolor);
|
||||||
|
getdisplay().drawLine(c.x, c.y - r, c.x, c.y + r, commonData->fgcolor);
|
||||||
|
Point p = {c.x, c.y - r};
|
||||||
|
Point p1, p2;
|
||||||
|
p1 = rotatePoint(c, p, 45);
|
||||||
|
p2 = rotatePoint(c, p, 45 + 180);
|
||||||
|
getdisplay().drawLine(p1.x, p1.y, p2.x, p2.y, commonData->fgcolor);
|
||||||
|
p1 = rotatePoint(c, p, -45);
|
||||||
|
p2 = rotatePoint(c, p, -45 + 180);
|
||||||
|
getdisplay().drawLine(p1.x, p1.y, p2.x, p2.y, commonData->fgcolor);
|
||||||
|
|
||||||
|
// directions
|
||||||
|
|
||||||
|
int16_t x1, y1;
|
||||||
|
uint16_t w, h;
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
|
||||||
|
getdisplay().getTextBounds("N", 0, 150, &x1, &y1, &w, &h);
|
||||||
|
getdisplay().setCursor(c.x - w / 2, c.y - r + h + 3);
|
||||||
|
getdisplay().print("N");
|
||||||
|
|
||||||
|
getdisplay().getTextBounds("S", 0, 150, &x1, &y1, &w, &h);
|
||||||
|
getdisplay().setCursor(c.x - w / 2, c.y + r - 3);
|
||||||
|
getdisplay().print("S");
|
||||||
|
|
||||||
|
getdisplay().getTextBounds("E", 0, 150, &x1, &y1, &w, &h);
|
||||||
|
getdisplay().setCursor(c.x + r - w - 3, c.y + h / 2);
|
||||||
|
getdisplay().print("E");
|
||||||
|
|
||||||
|
getdisplay().getTextBounds("W", 0, 150, &x1, &y1, &w, &h);
|
||||||
|
getdisplay().setCursor(c.x - r + 3 , c.y + h / 2);
|
||||||
|
getdisplay().print("W");
|
||||||
|
|
||||||
|
// show satellites in "map"
|
||||||
|
getdisplay().setFont(&IBM8x8px);
|
||||||
|
for (int i = 0; i < nSat; i++) {
|
||||||
|
float arad = (sats[i].Azimut * M_PI / 180.0) + M_PI;
|
||||||
|
float erad = sats[i].Elevation * M_PI / 180.0;
|
||||||
|
uint16_t x = c.x + sin(arad) * erad * r1;
|
||||||
|
uint16_t y = c.y + cos(arad) * erad * r1;
|
||||||
|
getdisplay().fillRect(x-4, y-4, 8, 8, commonData->fgcolor);
|
||||||
|
getdisplay().setCursor(x-7, y+12);
|
||||||
|
getdisplay().printf("%02d", static_cast<int>(sats[i].PRN));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Signal / Noise bars
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
getdisplay().setCursor(325, 34);
|
||||||
|
getdisplay().print("SNR");
|
||||||
|
// getdisplay().drawRect(270, 20, 125, 257, commonData->fgcolor);
|
||||||
|
int maxsat = std::min(nSat, 12);
|
||||||
|
for (int i = 0; i < maxsat; i++) {
|
||||||
|
uint16_t y = 29 + (i + 1) * 20;
|
||||||
|
getdisplay().setCursor(276, y);
|
||||||
|
char buffer[3];
|
||||||
|
snprintf(buffer, 3, "%02d", static_cast<int>(sats[i].PRN));
|
||||||
|
getdisplay().print(String(buffer));
|
||||||
|
getdisplay().drawRect(305, y-12, 85, 14, commonData->fgcolor);
|
||||||
|
getdisplay().setCursor(315, y);
|
||||||
|
// TODO SNR as number or as bar via mode key?
|
||||||
|
if (sats[i].SNR <= 100) {
|
||||||
|
// getdisplay().print(sats[i].SNR);
|
||||||
|
getdisplay().fillRect(307, y-10, int(81 * sats[i].SNR / 100.0), 10, commonData->fgcolor);
|
||||||
|
} else {
|
||||||
|
getdisplay().print("n/a");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show SatInfo and HDOP
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
|
||||||
|
getdisplay().setCursor(220, 34);
|
||||||
|
getdisplay().print("Sat:");
|
||||||
|
|
||||||
|
GwApi::BoatValue *bv_satinfo = pageData.values[0]; // SatInfo
|
||||||
|
String sval_satinfo = formatValue(bv_satinfo, *commonData).svalue;
|
||||||
|
getdisplay().setCursor(220, 49);
|
||||||
|
getdisplay().print(sval_satinfo);
|
||||||
|
|
||||||
|
getdisplay().setCursor(220, 254);
|
||||||
|
getdisplay().print("HDOP:");
|
||||||
|
|
||||||
|
GwApi::BoatValue *bv_hdop = pageData.values[1]; // HDOP
|
||||||
|
double hdop = formatValue(bv_hdop, *commonData).value * 4; // 4 is factor for UERE (translation in meter)
|
||||||
|
char sval_hdop[20];
|
||||||
|
dtostrf(hdop, 0, 1, sval_hdop); // Only one prefix
|
||||||
|
strcat(sval_hdop, "m");
|
||||||
|
getdisplay().setCursor(220, 269);
|
||||||
|
getdisplay().print(sval_hdop);
|
||||||
|
|
||||||
|
return PAGE_UPDATE;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
static Page* createPage(CommonData &common){
|
||||||
|
return new PageSkyView(common);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* with the code below we make this page known to the PageTask
|
||||||
|
* we give it a type (name) that can be selected in the config
|
||||||
|
* we define which function is to be called
|
||||||
|
* and we provide the number of user parameters we expect
|
||||||
|
* this will be number of BoatValue pointers in pageData.values
|
||||||
|
*/
|
||||||
|
PageDescription registerPageSkyView(
|
||||||
|
"SkyView", // Page name
|
||||||
|
createPage, // Action
|
||||||
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
|
{"SatInfo", "HDOP"}, // Bus values we need in the page
|
||||||
|
true // Show display header on/off
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -20,7 +20,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ public:
|
|||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
getdisplay().print("Solar");
|
getdisplay().print("Solar");
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ public:
|
|||||||
if(String(batVoltage) == "12V") bvoltage = 12;
|
if(String(batVoltage) == "12V") bvoltage = 12;
|
||||||
else bvoltage = 24;
|
else bvoltage = 24;
|
||||||
getdisplay().print(bvoltage);
|
getdisplay().print(bvoltage);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show solar power
|
// Show solar power
|
||||||
@@ -106,12 +106,12 @@ public:
|
|||||||
getdisplay().setCursor(10, 200);
|
getdisplay().setCursor(10, 200);
|
||||||
if(solPower <= 999) getdisplay().print(solPower, 0);
|
if(solPower <= 999) getdisplay().print(solPower, 0);
|
||||||
if(solPower > 999) getdisplay().print(float(solPower/1000.0), 1);
|
if(solPower > 999) getdisplay().print(float(solPower/1000.0), 1);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
if(solPower <= 999) getdisplay().print("W");
|
if(solPower <= 999) getdisplay().print("W");
|
||||||
if(solPower > 999) getdisplay().print("kW");
|
if(solPower > 999) getdisplay().print("kW");
|
||||||
|
|
||||||
// Show info
|
// Show info
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 235);
|
getdisplay().setCursor(10, 235);
|
||||||
getdisplay().print("Installed");
|
getdisplay().print("Installed");
|
||||||
getdisplay().setCursor(10, 255);
|
getdisplay().setCursor(10, 255);
|
||||||
@@ -124,15 +124,15 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(150, 200);
|
getdisplay().setCursor(150, 200);
|
||||||
getdisplay().print(solPercentage);
|
getdisplay().print(solPercentage);
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("%");
|
getdisplay().print("%");
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(150, 235);
|
getdisplay().setCursor(150, 235);
|
||||||
getdisplay().print("Load");
|
getdisplay().print("Load");
|
||||||
|
|
||||||
// Show sensor type info
|
// Show sensor type info
|
||||||
String i2cAddr = "";
|
String i2cAddr = "";
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(270, 60);
|
getdisplay().setCursor(270, 60);
|
||||||
if(powerSensor == "off") getdisplay().print("Internal");
|
if(powerSensor == "off") getdisplay().print("Internal");
|
||||||
if(powerSensor == "INA219"){
|
if(powerSensor == "INA219"){
|
||||||
@@ -172,7 +172,7 @@ public:
|
|||||||
getdisplay().print("---"); // Missing bus data
|
getdisplay().print("---"); // Missing bus data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show actual current in A
|
// Show actual current in A
|
||||||
@@ -184,7 +184,7 @@ public:
|
|||||||
if(value2 > 99.9) getdisplay().print(value2, 0);
|
if(value2 > 99.9) getdisplay().print(value2, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("---");
|
else getdisplay().print("---");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("A");
|
getdisplay().print("A");
|
||||||
|
|
||||||
// Show actual consumption in W
|
// Show actual consumption in W
|
||||||
@@ -196,11 +196,10 @@ public:
|
|||||||
if(value3 > 99.9) getdisplay().print(value3, 0);
|
if(value3 > 99.9) getdisplay().print(value3, 0);
|
||||||
}
|
}
|
||||||
else getdisplay().print("---");
|
else getdisplay().print("---");
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().print("W");
|
getdisplay().print("W");
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,32 +1,54 @@
|
|||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
#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. NMEA2000 device list
|
||||||
|
* 4. SD Card information if available
|
||||||
|
*/
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
#include "images/logo64.xbm"
|
#include "images/logo64.xbm"
|
||||||
#include <esp32/clk.h>
|
#include <esp32/clk.h>
|
||||||
#include "qrcode.h"
|
#include "qrcode.h"
|
||||||
|
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
#include "dirent.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define STRINGIZE_IMPL(x) #x
|
#define STRINGIZE_IMPL(x) #x
|
||||||
#define STRINGIZE(x) STRINGIZE_IMPL(x)
|
#define STRINGIZE(x) STRINGIZE_IMPL(x)
|
||||||
#define VERSINFO STRINGIZE(GWDEVVERSION)
|
#define VERSINFO STRINGIZE(GWDEVVERSION)
|
||||||
|
#define BOARDINFO STRINGIZE(BOARD)
|
||||||
/*
|
#define PCBINFO STRINGIZE(PCBVERS)
|
||||||
* Special system page, called directly with fast key sequence 5,4
|
#define DISPLAYINFO STRINGIZE(EPDTYPE)
|
||||||
* Out of normal page order.
|
#define GXEPD2INFO STRINGIZE(GXEPD2VERS)
|
||||||
*/
|
|
||||||
|
|
||||||
class PageSystem : public Page
|
class PageSystem : public Page
|
||||||
{
|
{
|
||||||
uint64_t chipid;
|
private:
|
||||||
bool simulation;
|
uint64_t chipid;
|
||||||
String buzzer_mode;
|
bool simulation;
|
||||||
uint8_t buzzer_power;
|
bool use_sdcard;
|
||||||
String cpuspeed;
|
String buzzer_mode;
|
||||||
String rtc_module;
|
uint8_t buzzer_power;
|
||||||
String gps_module;
|
String cpuspeed;
|
||||||
String env_module;
|
String rtc_module;
|
||||||
|
String gps_module;
|
||||||
|
String env_module;
|
||||||
|
|
||||||
char mode = 'N'; // (N)ormal, (D)evice list
|
String batt_sensor;
|
||||||
|
String solar_sensor;
|
||||||
|
String gen_sensor;
|
||||||
|
String rot_sensor;
|
||||||
|
double homelat;
|
||||||
|
double homelon;
|
||||||
|
|
||||||
|
char mode = 'N'; // (N)ormal, (S)ettings, (D)evice list, (C)ard
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageSystem(CommonData &common){
|
PageSystem(CommonData &common){
|
||||||
@@ -34,18 +56,29 @@ public:
|
|||||||
common.logger->logDebug(GwLog::LOG,"Instantiate PageSystem");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageSystem");
|
||||||
if (hasFRAM) {
|
if (hasFRAM) {
|
||||||
mode = fram.read(FRAM_SYSTEM_MODE);
|
mode = fram.read(FRAM_SYSTEM_MODE);
|
||||||
|
common.logger->logDebug(GwLog::DEBUG, "Loaded mode '%c' from FRAM", mode);
|
||||||
}
|
}
|
||||||
chipid = ESP.getEfuseMac();
|
chipid = ESP.getEfuseMac();
|
||||||
simulation = common.config->getBool(common.config->useSimuData);
|
simulation = common.config->getBool(common.config->useSimuData);
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
use_sdcard = common.config->getBool(common.config->useSDCard);
|
||||||
|
#endif
|
||||||
buzzer_mode = common.config->getString(common.config->buzzerMode);
|
buzzer_mode = common.config->getString(common.config->buzzerMode);
|
||||||
|
buzzer_mode.toLowerCase();
|
||||||
buzzer_power = common.config->getInt(common.config->buzzerPower);
|
buzzer_power = common.config->getInt(common.config->buzzerPower);
|
||||||
cpuspeed = common.config->getString(common.config->cpuSpeed);
|
cpuspeed = common.config->getString(common.config->cpuSpeed);
|
||||||
env_module = common.config->getString(common.config->useEnvSensor);
|
env_module = common.config->getString(common.config->useEnvSensor);
|
||||||
rtc_module = common.config->getString(common.config->useRTC);
|
rtc_module = common.config->getString(common.config->useRTC);
|
||||||
gps_module = common.config->getString(common.config->useGPS);
|
gps_module = common.config->getString(common.config->useGPS);
|
||||||
|
batt_sensor = common.config->getString(common.config->usePowSensor1);
|
||||||
|
solar_sensor = common.config->getString(common.config->usePowSensor2);
|
||||||
|
gen_sensor = common.config->getString(common.config->usePowSensor3);
|
||||||
|
rot_sensor = common.config->getString(common.config->useRotSensor);
|
||||||
|
homelat = common.config->getString(common.config->homeLAT).toDouble();
|
||||||
|
homelon = common.config->getString(common.config->homeLON).toDouble();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setupKeys(){
|
void setupKeys() {
|
||||||
commonData->keydata[0].label = "EXIT";
|
commonData->keydata[0].label = "EXIT";
|
||||||
commonData->keydata[1].label = "MODE";
|
commonData->keydata[1].label = "MODE";
|
||||||
commonData->keydata[2].label = "";
|
commonData->keydata[2].label = "";
|
||||||
@@ -54,13 +87,21 @@ public:
|
|||||||
commonData->keydata[5].label = "ILUM";
|
commonData->keydata[5].label = "ILUM";
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int handleKey(int key){
|
int handleKey(int key) {
|
||||||
// do *NOT* handle key #1 this handled by obp60task as exit
|
// do *NOT* handle key #1 this handled by obp60task as exit
|
||||||
// Switch display mode
|
// Switch display mode
|
||||||
commonData->logger->logDebug(GwLog::LOG, "System keyboard handler");
|
commonData->logger->logDebug(GwLog::LOG, "System keyboard handler");
|
||||||
if (key == 2) {
|
if (key == 2) {
|
||||||
if (mode == 'N') {
|
if (mode == 'N') {
|
||||||
|
mode = 'S';
|
||||||
|
} else if (mode == 'S') {
|
||||||
mode = 'D';
|
mode = 'D';
|
||||||
|
} else if (mode == 'D') {
|
||||||
|
if (hasSDCard) {
|
||||||
|
mode = 'C';
|
||||||
|
} else {
|
||||||
|
mode = 'N';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
mode = 'N';
|
mode = 'N';
|
||||||
}
|
}
|
||||||
@@ -78,7 +119,8 @@ public:
|
|||||||
}
|
}
|
||||||
// standby / deep sleep
|
// standby / deep sleep
|
||||||
if (key == 5) {
|
if (key == 5) {
|
||||||
deepSleep(*commonData);
|
commonData->logger->logDebug(GwLog::LOG, "System going into deep sleep mode...");
|
||||||
|
deepSleep(*commonData);
|
||||||
}
|
}
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if (key == 11) {
|
if (key == 11) {
|
||||||
@@ -93,6 +135,7 @@ public:
|
|||||||
}
|
}
|
||||||
// standby / deep sleep
|
// standby / deep sleep
|
||||||
if (key == 12) {
|
if (key == 12) {
|
||||||
|
commonData->logger->logDebug(GwLog::LOG, "System going into deep sleep mode...");
|
||||||
deepSleep(*commonData);
|
deepSleep(*commonData);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -105,12 +148,12 @@ public:
|
|||||||
// s is pixel size of a single box
|
// s is pixel size of a single box
|
||||||
QRCode qrcode;
|
QRCode qrcode;
|
||||||
uint8_t qrcodeData[qrcode_getBufferSize(4)];
|
uint8_t qrcodeData[qrcode_getBufferSize(4)];
|
||||||
#ifdef BOARD_OBP40S3
|
#ifdef BOARD_OBP40S3
|
||||||
String prefix = "OBP40:SN:";
|
String prefix = "OBP40:SN:";
|
||||||
#endif
|
#endif
|
||||||
#ifdef BOARD_OBP60S3
|
#ifdef BOARD_OBP60S3
|
||||||
String prefix = "OBP60:SN:";
|
String prefix = "OBP60:SN:";
|
||||||
#endif
|
#endif
|
||||||
qrcode_initText(&qrcode, qrcodeData, 4, 0, (prefix + serialno).c_str());
|
qrcode_initText(&qrcode, qrcodeData, 4, 0, (prefix + serialno).c_str());
|
||||||
int16_t x0 = x;
|
int16_t x0 = x;
|
||||||
for (uint8_t j = 0; j < qrcode.size; j++) {
|
for (uint8_t j = 0; j < qrcode.size; j++) {
|
||||||
@@ -125,7 +168,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -139,109 +182,285 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageSystem");
|
logger->logDebug(GwLog::LOG, "Drawing at PageSystem, Mode=%c", mode);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
|
|
||||||
const uint16_t y0 = 120; // data table starts here
|
uint16_t x0 = 8; // left column
|
||||||
|
uint16_t y0 = 48; // data table starts here
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
if (mode == 'N') {
|
if (mode == 'N') {
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
|
||||||
getdisplay().setCursor(8, 50);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().setCursor(8, 48);
|
||||||
getdisplay().print("System Information");
|
getdisplay().print("System Information");
|
||||||
|
|
||||||
getdisplay().drawXBitmap(320, 25, logo64_bits, logo64_width, logo64_height, commonData->fgcolor);
|
getdisplay().drawXBitmap(320, 25, logo64_bits, logo64_width, logo64_height, commonData->fgcolor);
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
y0 = 155;
|
||||||
|
|
||||||
char ssid[13];
|
char ssid[13];
|
||||||
snprintf(ssid, 13, "%04X%08X", (uint16_t)(chipid >> 32), (uint32_t)chipid);
|
snprintf(ssid, 13, "%04X%08X", (uint16_t)(chipid >> 32), (uint32_t)chipid);
|
||||||
displayBarcode(String(ssid), 320, 200, 2);
|
displayBarcode(String(ssid), 320, 200, 2);
|
||||||
getdisplay().setCursor(8, 70);
|
getdisplay().setCursor(8, 70);
|
||||||
getdisplay().print(String("MUDEVICE-") + String(ssid));
|
getdisplay().print(String("MCUDEVICE-") + String(ssid));
|
||||||
|
|
||||||
getdisplay().setCursor(8, 90);
|
getdisplay().setCursor(8, 95);
|
||||||
getdisplay().print("Firmware Version: ");
|
getdisplay().print("Firmware version: ");
|
||||||
|
getdisplay().setCursor(150, 95);
|
||||||
getdisplay().print(VERSINFO);
|
getdisplay().print(VERSINFO);
|
||||||
|
|
||||||
|
getdisplay().setCursor(8, 113);
|
||||||
|
getdisplay().print("Board version: ");
|
||||||
|
getdisplay().setCursor(150, 113);
|
||||||
|
getdisplay().print(BOARDINFO);
|
||||||
|
getdisplay().print(String(" HW ") + String(PCBINFO));
|
||||||
|
|
||||||
|
getdisplay().setCursor(8, 131);
|
||||||
|
getdisplay().print("Display version: ");
|
||||||
|
getdisplay().setCursor(150, 131);
|
||||||
|
getdisplay().print(DISPLAYINFO);
|
||||||
|
getdisplay().print("; GxEPD2 v");
|
||||||
|
getdisplay().print(GXEPD2INFO);
|
||||||
|
|
||||||
getdisplay().setCursor(8, 265);
|
getdisplay().setCursor(8, 265);
|
||||||
#ifdef BOARD_OBP60S3
|
#ifdef BOARD_OBP60S3
|
||||||
getdisplay().print("Press STBY to enter deep sleep mode");
|
getdisplay().print("Press STBY to enter deep sleep mode");
|
||||||
#endif
|
#endif
|
||||||
#ifdef BOARD_OBP40S3
|
#ifdef BOARD_OBP40S3
|
||||||
getdisplay().print("Press wheel to enter deep sleep mode");
|
getdisplay().print("Press wheel to enter deep sleep mode");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
getdisplay().setCursor(2, y0);
|
// Flash memory size
|
||||||
getdisplay().print("Simulation:");
|
uint32_t flash_size = ESP.getFlashChipSize();
|
||||||
getdisplay().setCursor(120, y0);
|
getdisplay().setCursor(8, y0);
|
||||||
getdisplay().print(simulation ? "on" : "off");
|
getdisplay().print("FLASH:");
|
||||||
|
getdisplay().setCursor(90, y0);
|
||||||
|
getdisplay().print(String(flash_size / 1024) + String(" kB"));
|
||||||
|
|
||||||
getdisplay().setCursor(2, y0 + 16);
|
// PSRAM memory size
|
||||||
getdisplay().print("Environment:");
|
uint32_t psram_size = ESP.getPsramSize();
|
||||||
getdisplay().setCursor(120, y0 + 16);
|
getdisplay().setCursor(8, y0 + 16);
|
||||||
getdisplay().print(env_module);
|
getdisplay().print("PSRAM:");
|
||||||
|
getdisplay().setCursor(90, y0 + 16);
|
||||||
// total RAM free
|
getdisplay().print(String(psram_size / 1024) + String(" kB"));
|
||||||
int Heap_free = esp_get_free_heap_size();
|
|
||||||
getdisplay().setCursor(202, y0);
|
|
||||||
getdisplay().print("Total free:");
|
|
||||||
getdisplay().setCursor(300, y0);
|
|
||||||
getdisplay().print(String(Heap_free));
|
|
||||||
|
|
||||||
getdisplay().setCursor(2, y0 + 32);
|
|
||||||
getdisplay().print("Buzzer:");
|
|
||||||
getdisplay().setCursor(120, y0 + 32);
|
|
||||||
getdisplay().print(buzzer_mode);
|
|
||||||
|
|
||||||
// RAM free for task
|
|
||||||
int RAM_free = uxTaskGetStackHighWaterMark(NULL);
|
|
||||||
getdisplay().setCursor(202, y0 + 16);
|
|
||||||
getdisplay().print("Task free:");
|
|
||||||
getdisplay().setCursor(300, y0 + 16);
|
|
||||||
getdisplay().print(String(RAM_free));
|
|
||||||
|
|
||||||
// FRAM available / status
|
// FRAM available / status
|
||||||
getdisplay().setCursor(202, y0 + 32);
|
getdisplay().setCursor(8, y0 + 32);
|
||||||
getdisplay().print("FRAM:");
|
getdisplay().print("FRAM:");
|
||||||
getdisplay().setCursor(300, y0 + 32);
|
getdisplay().setCursor(90, y0 + 32);
|
||||||
getdisplay().print(hasFRAM ? "available" : "not found");
|
getdisplay().print(hasFRAM ? "available" : "not found");
|
||||||
|
|
||||||
getdisplay().setCursor(202, y0 + 64);
|
#ifdef BOARD_OBP40S3
|
||||||
|
// SD-Card
|
||||||
|
getdisplay().setCursor(8, y0 + 48);
|
||||||
|
getdisplay().print("SD-Card:");
|
||||||
|
getdisplay().setCursor(90, y0 + 48);
|
||||||
|
if (hasSDCard) {
|
||||||
|
uint64_t cardsize = ((uint64_t) sdcard->csd.capacity) * sdcard->csd.sector_size / (1024 * 1024);
|
||||||
|
getdisplay().printf("%llu MB", cardsize);
|
||||||
|
} else {
|
||||||
|
getdisplay().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";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getdisplay().setCursor(8, y0 + 80);
|
||||||
|
getdisplay().print("Uptime:");
|
||||||
|
getdisplay().setCursor(90, y0 + 80);
|
||||||
|
getdisplay().print(uptime);
|
||||||
|
getdisplay().print(uptime_unit);
|
||||||
|
|
||||||
|
// CPU speed config / active
|
||||||
|
getdisplay().setCursor(202, y0);
|
||||||
getdisplay().print("CPU speed:");
|
getdisplay().print("CPU speed:");
|
||||||
getdisplay().setCursor(300, y0 + 64);
|
getdisplay().setCursor(300, y0);
|
||||||
getdisplay().print(cpuspeed);
|
getdisplay().print(cpuspeed);
|
||||||
getdisplay().print(" / ");
|
getdisplay().print(" / ");
|
||||||
int cpu_freq = esp_clk_cpu_freq() / 1000000;
|
int cpu_freq = esp_clk_cpu_freq() / 1000000;
|
||||||
getdisplay().print(String(cpu_freq));
|
getdisplay().print(String(cpu_freq));
|
||||||
|
|
||||||
getdisplay().setCursor(2, y0 + 64);
|
// total RAM free
|
||||||
|
int Heap_free = esp_get_free_heap_size();
|
||||||
|
getdisplay().setCursor(202, y0 + 16);
|
||||||
|
getdisplay().print("Total free:");
|
||||||
|
getdisplay().setCursor(300, y0 + 16);
|
||||||
|
getdisplay().print(String(Heap_free));
|
||||||
|
|
||||||
|
// RAM free for task
|
||||||
|
int RAM_free = uxTaskGetStackHighWaterMark(NULL);
|
||||||
|
getdisplay().setCursor(202, y0 + 32);
|
||||||
|
getdisplay().print("Task free:");
|
||||||
|
getdisplay().setCursor(300, y0 + 32);
|
||||||
|
getdisplay().print(String(RAM_free));
|
||||||
|
|
||||||
|
} else if (mode == 'S') {
|
||||||
|
// Settings
|
||||||
|
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().setCursor(x0, 48);
|
||||||
|
getdisplay().print("System settings");
|
||||||
|
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
x0 = 8;
|
||||||
|
y0 = 72;
|
||||||
|
|
||||||
|
// left column
|
||||||
|
getdisplay().setCursor(x0, y0);
|
||||||
|
getdisplay().print("Simulation:");
|
||||||
|
getdisplay().setCursor(120, y0);
|
||||||
|
getdisplay().print(simulation ? "on" : "off");
|
||||||
|
|
||||||
|
getdisplay().setCursor(x0, y0 + 16);
|
||||||
|
getdisplay().print("Environment:");
|
||||||
|
getdisplay().setCursor(120, y0 + 16);
|
||||||
|
getdisplay().print(env_module);
|
||||||
|
|
||||||
|
getdisplay().setCursor(x0, y0 + 32);
|
||||||
|
getdisplay().print("Buzzer:");
|
||||||
|
getdisplay().setCursor(120, y0 + 32);
|
||||||
|
getdisplay().print(buzzer_mode);
|
||||||
|
|
||||||
|
getdisplay().setCursor(x0, y0 + 64);
|
||||||
getdisplay().print("GPS:");
|
getdisplay().print("GPS:");
|
||||||
getdisplay().setCursor(120, y0 + 64);
|
getdisplay().setCursor(120, y0 + 64);
|
||||||
getdisplay().print(gps_module);
|
getdisplay().print(gps_module);
|
||||||
|
|
||||||
getdisplay().setCursor(2, y0 + 80);
|
getdisplay().setCursor(x0, y0 + 80);
|
||||||
getdisplay().print("RTC:");
|
getdisplay().print("RTC:");
|
||||||
getdisplay().setCursor(120, y0 + 80);
|
getdisplay().setCursor(120, y0 + 80);
|
||||||
getdisplay().print(rtc_module);
|
getdisplay().print(rtc_module);
|
||||||
|
|
||||||
getdisplay().setCursor(2, y0 + 96);
|
getdisplay().setCursor(x0, y0 + 96);
|
||||||
getdisplay().print("Wifi:");
|
getdisplay().print("Wifi:");
|
||||||
getdisplay().setCursor(120, y0 + 96);
|
getdisplay().setCursor(120, y0 + 96);
|
||||||
getdisplay().print(commonData->status.wifiApOn ? "On" : "Off");
|
getdisplay().print(commonData->status.wifiApOn ? "on" : "off");
|
||||||
|
|
||||||
|
// Home location
|
||||||
|
getdisplay().setCursor(x0, y0 + 128);
|
||||||
|
getdisplay().print("Home Lat.:");
|
||||||
|
getdisplay().setCursor(120, y0 + 128);
|
||||||
|
getdisplay().print(formatLatitude(homelat));
|
||||||
|
getdisplay().setCursor(x0, y0 + 144);
|
||||||
|
getdisplay().print("Home Lon.:");
|
||||||
|
getdisplay().setCursor(120, y0 + 144);
|
||||||
|
getdisplay().print(formatLongitude(homelon));
|
||||||
|
|
||||||
|
// right column
|
||||||
|
getdisplay().setCursor(202, y0);
|
||||||
|
getdisplay().print("Batt. sensor:");
|
||||||
|
getdisplay().setCursor(320, y0);
|
||||||
|
getdisplay().print(batt_sensor);
|
||||||
|
|
||||||
|
// Solar sensor
|
||||||
|
getdisplay().setCursor(202, y0 + 16);
|
||||||
|
getdisplay().print("Solar sensor:");
|
||||||
|
getdisplay().setCursor(320, y0 + 16);
|
||||||
|
getdisplay().print(solar_sensor);
|
||||||
|
|
||||||
|
// Generator sensor
|
||||||
|
getdisplay().setCursor(202, y0 + 32);
|
||||||
|
getdisplay().print("Gen. sensor:");
|
||||||
|
getdisplay().setCursor(320, y0 + 32);
|
||||||
|
getdisplay().print(gen_sensor);
|
||||||
|
|
||||||
|
// Gyro sensor
|
||||||
|
|
||||||
|
} else if (mode == 'C') {
|
||||||
|
// Card info
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().setCursor(8, 48);
|
||||||
|
getdisplay().print("SD Card info");
|
||||||
|
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
|
||||||
|
x0 = 20;
|
||||||
|
y0 = 72;
|
||||||
|
getdisplay().setCursor(x0, y0);
|
||||||
|
#ifdef BOARD_OBP60S3
|
||||||
|
// This mode should not be callable by devices without card hardware
|
||||||
|
// In case of accidential reaching this, display a friendly message
|
||||||
|
getdisplay().print("This mode is not indended to be reached!\n");
|
||||||
|
getdisplay().print("There's nothing to see here. Move on.");
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
getdisplay().print("Work in progress...");
|
||||||
|
|
||||||
|
/* TODO
|
||||||
|
this code should go somewhere else. only for testing purposes here
|
||||||
|
identify card as OBP-Card:
|
||||||
|
magic.dat
|
||||||
|
version.dat
|
||||||
|
readme.txt
|
||||||
|
IMAGES/
|
||||||
|
CHARTS/
|
||||||
|
LOGS/
|
||||||
|
DATA/
|
||||||
|
hint: file access with fopen, fgets, fread, fclose
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Simple test for magic file in root
|
||||||
|
getdisplay().setCursor(x0, y0 + 32);
|
||||||
|
String file_magic = MOUNT_POINT "/magic.dat";
|
||||||
|
logger->logDebug(GwLog::LOG, "Test magicfile: %s", file_magic.c_str());
|
||||||
|
struct stat st;
|
||||||
|
if (stat(file_magic.c_str(), &st) == 0) {
|
||||||
|
getdisplay().printf("File %s exists", file_magic.c_str());
|
||||||
|
} else {
|
||||||
|
getdisplay().printf("File %s not found", file_magic.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Root directory check
|
||||||
|
DIR* dir = opendir(MOUNT_POINT);
|
||||||
|
int dy = 0;
|
||||||
|
if (dir != NULL) {
|
||||||
|
logger->logDebug(GwLog::LOG, "Root directory: %s", MOUNT_POINT);
|
||||||
|
struct dirent* entry;
|
||||||
|
while (((entry = readdir(dir)) != NULL) and (dy < 140)) {
|
||||||
|
getdisplay().setCursor(x0, y0 + 64 + dy);
|
||||||
|
getdisplay().print(entry->d_name);
|
||||||
|
// type 1 is file, type 2 is dir
|
||||||
|
if (entry->d_type == 2) {
|
||||||
|
getdisplay().print("/");
|
||||||
|
}
|
||||||
|
dy += 20;
|
||||||
|
logger->logDebug(GwLog::DEBUG, " %s type %d", entry->d_name, entry->d_type);
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
} else {
|
||||||
|
logger->logDebug(GwLog::LOG, "Failed to open root directory");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// NMEA2000 device list
|
// NMEA2000 device list
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 50);
|
getdisplay().setCursor(8, 48);
|
||||||
getdisplay().print("NMEA2000 device list");
|
getdisplay().print("NMEA2000 device list");
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(20, 80);
|
getdisplay().setCursor(20, 80);
|
||||||
getdisplay().print("RxD: ");
|
getdisplay().print("RxD: ");
|
||||||
getdisplay().print(String(commonData->status.n2kRx));
|
getdisplay().print(String(commonData->status.n2kRx));
|
||||||
@@ -252,7 +471,7 @@ public:
|
|||||||
|
|
||||||
// Update display
|
// Update display
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
return PAGE_OK;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
#include "BoatDataCalibration.h"
|
||||||
|
|
||||||
class PageThreeValues : public Page
|
class PageThreeValues : public Page
|
||||||
{
|
{
|
||||||
@@ -20,7 +21,7 @@ class PageThreeValues : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -43,24 +44,27 @@ class PageThreeValues : public Page
|
|||||||
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
|
||||||
|
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
||||||
double value1 = bvalue1->value; // Value as double in SI unit
|
double value1 = bvalue1->value; // Value as double in SI unit
|
||||||
bool valid1 = bvalue1->valid; // Valid information
|
bool valid1 = bvalue1->valid; // Valid information
|
||||||
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Get boat values #2
|
// Get boat values #2
|
||||||
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list
|
||||||
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
||||||
name2 = name2.substring(0, 6); // String length limit for value name
|
name2 = name2.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
||||||
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 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Get boat values #3
|
// Get boat values #3
|
||||||
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Third element in list
|
||||||
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
||||||
name3 = name3.substring(0, 6); // String length limit for value name
|
name3 = name3.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
||||||
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 = 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
|
||||||
@@ -73,7 +77,7 @@ class PageThreeValues : public Page
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageThreeValues, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageThreeValues, %s: %f, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -91,7 +95,7 @@ class PageThreeValues : public Page
|
|||||||
getdisplay().print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 90);
|
getdisplay().setCursor(20, 90);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
@@ -139,7 +143,7 @@ class PageThreeValues : public Page
|
|||||||
getdisplay().print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 180);
|
getdisplay().setCursor(20, 180);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
@@ -187,7 +191,7 @@ class PageThreeValues : public Page
|
|||||||
getdisplay().print(name3); // Page name
|
getdisplay().print(name3); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 270);
|
getdisplay().setCursor(20, 270);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
@@ -222,8 +226,7 @@ class PageThreeValues : public Page
|
|||||||
unit3old = unit3; // Save the old unit
|
unit3old = unit3; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
#include "BoatDataCalibration.h"
|
||||||
|
|
||||||
class PageTwoValues : public Page
|
class PageTwoValues : public Page
|
||||||
{
|
{
|
||||||
@@ -20,7 +21,7 @@ class PageTwoValues : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -41,15 +42,17 @@ class PageTwoValues : public Page
|
|||||||
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
|
||||||
|
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
||||||
double value1 = bvalue1->value; // Value as double in SI unit
|
double value1 = bvalue1->value; // Value as double in SI unit
|
||||||
bool valid1 = bvalue1->valid; // Valid information
|
bool valid1 = bvalue1->valid; // Valid information
|
||||||
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
|
|
||||||
// Get boat values #2
|
// Get boat values #2
|
||||||
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list
|
||||||
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
||||||
name2 = name2.substring(0, 6); // String length limit for value name
|
name2 = name2.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
||||||
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 = 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
|
||||||
@@ -62,7 +65,7 @@ class PageTwoValues : public Page
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageTwoValues, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageTwoValues, %s: %f, %s: %f", name1.c_str(), value1, name2.c_str(), value2);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -80,7 +83,7 @@ class PageTwoValues : public Page
|
|||||||
getdisplay().print(name1); // Page name
|
getdisplay().print(name1); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 130);
|
getdisplay().setCursor(20, 130);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit1); // Unit
|
getdisplay().print(unit1); // Unit
|
||||||
@@ -128,7 +131,7 @@ class PageTwoValues : public Page
|
|||||||
getdisplay().print(name2); // Page name
|
getdisplay().print(name2); // Page name
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(20, 240);
|
getdisplay().setCursor(20, 240);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
@@ -163,8 +166,7 @@ class PageTwoValues : public Page
|
|||||||
unit2old = unit2; // Save the old unit
|
unit2old = unit2; // Save the old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void printAvg(int avg, uint16_t x, uint16_t y, bool prefix) {
|
void printAvg(int avg, uint16_t x, uint16_t y, bool prefix) {
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(x, y);
|
getdisplay().setCursor(x, y);
|
||||||
if (prefix) {
|
if (prefix) {
|
||||||
getdisplay().print("Avg: ");
|
getdisplay().print("Avg: ");
|
||||||
@@ -91,7 +91,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void printVoltageSymbol(uint16_t x, uint16_t y, uint16_t color) {
|
void printVoltageSymbol(uint16_t x, uint16_t y, uint16_t color) {
|
||||||
getdisplay().setFont(&Ubuntu_Bold16pt7b);
|
getdisplay().setFont(&Ubuntu_Bold16pt8b);
|
||||||
getdisplay().setCursor(x, y);
|
getdisplay().setCursor(x, y);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
getdisplay().fillRect(x, y + 6, 22, 3, color);
|
getdisplay().fillRect(x, y + 6, 22, 3, color);
|
||||||
@@ -100,7 +100,7 @@ public:
|
|||||||
getdisplay().fillRect(x + 16, y + 11, 6, 3, color);
|
getdisplay().fillRect(x + 16, y + 11, 6, 3, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -187,7 +187,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging voltage value
|
// Logging voltage value
|
||||||
if (raw == 0) return;
|
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageVoltage, Type:%s %s:=%f", batType, name1.c_str(), raw);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageVoltage, Type:%s %s:=%f", batType, name1.c_str(), raw);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -201,13 +200,13 @@ public:
|
|||||||
|
|
||||||
// Show name
|
// Show name
|
||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold32pt7b);
|
getdisplay().setFont(&Ubuntu_Bold32pt8b);
|
||||||
getdisplay().setCursor(20, 100);
|
getdisplay().setCursor(20, 100);
|
||||||
getdisplay().print(name1); // Value name
|
getdisplay().print(name1); // Value name
|
||||||
|
|
||||||
#if defined BOARD_OBP40S3 && defined LIPO_ACCU_1200 && defined VOLTAGE_SENSOR
|
#if defined BOARD_OBP40S3 && defined LIPO_ACCU_1200 && defined VOLTAGE_SENSOR
|
||||||
// Show charge status
|
// Show charge status
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(185, 100);
|
getdisplay().setCursor(185, 100);
|
||||||
if(commonData->data.BatteryChargeStatus == true){
|
if(commonData->data.BatteryChargeStatus == true){
|
||||||
getdisplay().print("Charge");
|
getdisplay().print("Charge");
|
||||||
@@ -218,12 +217,12 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Show unit
|
// Show unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(270, 100);
|
getdisplay().setCursor(270, 100);
|
||||||
getdisplay().print("V");
|
getdisplay().print("V");
|
||||||
|
|
||||||
// Show battery type
|
// Show battery type
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(295, 100);
|
getdisplay().setCursor(295, 100);
|
||||||
#ifdef BOARD_OBP60S3
|
#ifdef BOARD_OBP60S3
|
||||||
getdisplay().print(batType);
|
getdisplay().print(batType);
|
||||||
@@ -305,7 +304,7 @@ public:
|
|||||||
{c.x - r + 12, c.y + 1},
|
{c.x - r + 12, c.y + 1},
|
||||||
{c.x - r, c.y + 1}
|
{c.x - r, c.y + 1}
|
||||||
};
|
};
|
||||||
getdisplay().setFont(&Ubuntu_Bold10pt7b);
|
getdisplay().setFont(&Ubuntu_Bold10pt8b);
|
||||||
for (int angle = 3; angle < 90; angle += 3) {
|
for (int angle = 3; angle < 90; angle += 3) {
|
||||||
if (angle % 15 == 0) {
|
if (angle % 15 == 0) {
|
||||||
fillPoly4(rotatePoints(c, pts, angle), commonData->fgcolor);
|
fillPoly4(rotatePoints(c, pts, angle), commonData->fgcolor);
|
||||||
@@ -362,7 +361,7 @@ public:
|
|||||||
printVoltageSymbol(40, 60, commonData->fgcolor);
|
printVoltageSymbol(40, 60, commonData->fgcolor);
|
||||||
|
|
||||||
// Additional information at right side
|
// Additional information at right side
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(300, 60);
|
getdisplay().setCursor(300, 60);
|
||||||
getdisplay().print("Source:");
|
getdisplay().print("Source:");
|
||||||
getdisplay().setCursor(300, 80);
|
getdisplay().setCursor(300, 80);
|
||||||
@@ -384,8 +383,7 @@ public:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -400,11 +398,11 @@ static Page *createPage(CommonData &common){
|
|||||||
* and will will provide the names of the fixed values we need
|
* and will will provide the names of the fixed values we need
|
||||||
*/
|
*/
|
||||||
PageDescription registerPageVoltage(
|
PageDescription registerPageVoltage(
|
||||||
"Voltage", // Name of page
|
"Voltage", // Name of page
|
||||||
createPage, // Action
|
createPage, // Action
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
{}, // Names of bus values undepends on selection in Web configuration (refer GwBoatData.h)
|
{}, // Names of bus values undepends on selection in Web configuration (refer GwBoatData.h)
|
||||||
true // Show display header on/off
|
true // Show display header on/off
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -2,8 +2,14 @@
|
|||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
#include "MFD_OBP60_400x300_sw.h" // MFD with logo
|
|
||||||
#include "Logo_OBP_400x300_sw.h" // OBP Logo
|
#include "images/OBP_400x300.xbm" // OBP Logo
|
||||||
|
#ifdef BOARD_OBP60S3
|
||||||
|
#include "images/OBP60_400x300.xbm" // MFD with logo
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
#include "images/OBP40_400x300.xbm" // MFD with logo
|
||||||
|
#endif
|
||||||
|
|
||||||
class PageWhite : public Page
|
class PageWhite : public Page
|
||||||
{
|
{
|
||||||
@@ -31,7 +37,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -61,17 +67,21 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mode == 'L') {
|
if (mode == 'L') {
|
||||||
getdisplay().drawBitmap(0, 0, gImage_Logo_OBP_400x300_sw, getdisplay().width(), getdisplay().height(), commonData->fgcolor);
|
getdisplay().drawXBitmap(0, 0, OBP_400x300_bits, OBP_400x300_width, OBP_400x300_height, commonData->fgcolor);
|
||||||
} else if (mode == 'M') {
|
} else if (mode == 'M') {
|
||||||
getdisplay().drawBitmap(0, 0, gImage_MFD_OBP60_400x300_sw, getdisplay().width(), getdisplay().height(), commonData->fgcolor);
|
#ifdef BOARD_OBP60S3
|
||||||
|
getdisplay().drawXBitmap(0, 0, OBP60_400x300_bits, OBP60_400x300_width, OBP60_400x300_height, commonData->fgcolor);
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
getdisplay().drawXBitmap(0, 0, OBP40_400x300_bits, OBP40_400x300_width, OBP40_400x300_height, commonData->fgcolor);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
int ret = PAGE_UPDATE;
|
||||||
getdisplay().nextPage();
|
|
||||||
if (mode == 'W') {
|
if (mode == 'W') {
|
||||||
getdisplay().hibernate();
|
ret |= PAGE_HIBERNATE;
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
#include "N2kMessages.h"
|
#include "N2kMessages.h"
|
||||||
|
#include "BoatDataCalibration.h"
|
||||||
|
|
||||||
#define front_width 120
|
#define front_width 120
|
||||||
#define front_height 162
|
#define front_height 162
|
||||||
@@ -246,8 +247,8 @@ public:
|
|||||||
if(key == 1){ // Mode switch
|
if(key == 1){ // Mode switch
|
||||||
if(mode == 'N'){
|
if(mode == 'N'){
|
||||||
mode = 'L';
|
mode = 'L';
|
||||||
} else if (mode == 'L') {
|
// } else if (mode == 'L') {
|
||||||
mode = 'X';
|
// mode = 'X';
|
||||||
} else {
|
} else {
|
||||||
mode = 'N';
|
mode = 'N';
|
||||||
}
|
}
|
||||||
@@ -295,7 +296,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData)
|
int displayPage(PageData &pageData)
|
||||||
{
|
{
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
@@ -323,6 +324,7 @@ 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
|
||||||
|
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
||||||
double value1 = bvalue1->value; // Value as double in SI unit
|
double value1 = bvalue1->value; // Value as double in SI unit
|
||||||
// bool valid1 = bvalue1->valid; // Valid information
|
// bool valid1 = bvalue1->valid; // Valid information
|
||||||
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
@@ -336,6 +338,7 @@ 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
|
||||||
|
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
||||||
double value2 = bvalue2->value; // Value as double in SI unit
|
double value2 = bvalue2->value; // Value as double in SI unit
|
||||||
// bool valid2 = bvalue2->valid; // Valid information
|
// bool valid2 = bvalue2->valid; // Valid information
|
||||||
if (simulation) {
|
if (simulation) {
|
||||||
@@ -351,7 +354,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageWind, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageWind, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -367,7 +370,7 @@ public:
|
|||||||
// Original example code with scaling circle
|
// Original example code with scaling circle
|
||||||
|
|
||||||
// Show values AWS/TWS
|
// Show values AWS/TWS
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 50);
|
getdisplay().setCursor(20, 50);
|
||||||
getdisplay().print(name1); // Value name
|
getdisplay().print(name1); // Value name
|
||||||
getdisplay().print(": ");
|
getdisplay().print(": ");
|
||||||
@@ -383,7 +386,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Show values AWD/TWD
|
// Show values AWD/TWD
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
getdisplay().setCursor(20, 260);
|
getdisplay().setCursor(20, 260);
|
||||||
getdisplay().print(name2); // Value name
|
getdisplay().print(name2); // Value name
|
||||||
getdisplay().print(": ");
|
getdisplay().print(": ");
|
||||||
@@ -417,7 +420,7 @@ public:
|
|||||||
};
|
};
|
||||||
fillPoly4(rotatePoints(c, pts, RadToDeg(value2)), commonData->fgcolor);
|
fillPoly4(rotatePoints(c, pts, RadToDeg(value2)), commonData->fgcolor);
|
||||||
} else {
|
} else {
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
drawTextCenter(c.x, c.y, "no data");
|
drawTextCenter(c.x, c.y, "no data");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -435,7 +438,7 @@ public:
|
|||||||
};
|
};
|
||||||
int angle;
|
int angle;
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
|
||||||
// starbord
|
// starbord
|
||||||
// text with line
|
// text with line
|
||||||
@@ -472,7 +475,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// data source
|
// data source
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(8, 50);
|
getdisplay().setCursor(8, 50);
|
||||||
if (source == 'A') {
|
if (source == 'A') {
|
||||||
getdisplay().print("APP");
|
getdisplay().print("APP");
|
||||||
@@ -507,7 +510,7 @@ public:
|
|||||||
fillPoly4(rotatePoints(c, pts, alpha), commonData->fgcolor);
|
fillPoly4(rotatePoints(c, pts, alpha), commonData->fgcolor);
|
||||||
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
||||||
} else {
|
} else {
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
drawTextCenter(c.x, c.y, "no data");
|
drawTextCenter(c.x, c.y, "no data");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -520,7 +523,7 @@ public:
|
|||||||
getdisplay().print(svalue1old);
|
getdisplay().print(svalue1old);
|
||||||
}
|
}
|
||||||
// unit
|
// unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(220, 265);
|
getdisplay().setCursor(220, 265);
|
||||||
getdisplay().print("kts");
|
getdisplay().print("kts");
|
||||||
}
|
}
|
||||||
@@ -528,7 +531,7 @@ public:
|
|||||||
// Normal mode
|
// Normal mode
|
||||||
|
|
||||||
// data source
|
// data source
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(8, 50);
|
getdisplay().setCursor(8, 50);
|
||||||
if (source == 'A') {
|
if (source == 'A') {
|
||||||
getdisplay().print("APP");
|
getdisplay().print("APP");
|
||||||
@@ -592,7 +595,7 @@ public:
|
|||||||
getdisplay().print(svalue1old);
|
getdisplay().print(svalue1old);
|
||||||
}
|
}
|
||||||
// unit
|
// unit
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(220, 265);
|
getdisplay().setCursor(220, 265);
|
||||||
getdisplay().print("kts");
|
getdisplay().print("kts");
|
||||||
|
|
||||||
@@ -609,15 +612,13 @@ public:
|
|||||||
fillPoly4(rotatePoints(c, pts, alpha), commonData->fgcolor);
|
fillPoly4(rotatePoints(c, pts, alpha), commonData->fgcolor);
|
||||||
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
getdisplay().fillCircle(c.x, c.y, 6, commonData->bgcolor);
|
||||||
} else {
|
} else {
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
drawTextCenter(c.x, c.y, "no data");
|
drawTextCenter(c.x, c.y, "no data");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -632,11 +633,11 @@ static Page *createPage(CommonData &common){
|
|||||||
* and will will provide the names of the fixed values we need
|
* and will will provide the names of the fixed values we need
|
||||||
*/
|
*/
|
||||||
PageDescription registerPageWind(
|
PageDescription registerPageWind(
|
||||||
"Wind", // Page name
|
"Wind", // Page name
|
||||||
createPage, // Action
|
createPage, // Action
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
{"AWS","AWA", "TWS", "TWA"}, // Bus values we need in the page
|
{"AWS","AWA", "TWS", "TWA"}, // Bus values we need in the page
|
||||||
true // Show display header on/off
|
true // Show display header on/off
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
266
lib/obp60task/PageWindPlot.cpp
Normal file
266
lib/obp60task/PageWindPlot.cpp
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
|
|
||||||
|
#include "Pagedata.h"
|
||||||
|
#include "OBP60Extensions.h"
|
||||||
|
#include "OBPcharts.h"
|
||||||
|
|
||||||
|
// ****************************************************************
|
||||||
|
class PageWindPlot : public Page {
|
||||||
|
|
||||||
|
private:
|
||||||
|
GwLog* logger;
|
||||||
|
|
||||||
|
int width; // Screen width
|
||||||
|
int height; // Screen height
|
||||||
|
|
||||||
|
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 apparent wind in chart area
|
||||||
|
bool oldShowTruW = false; // remember recent user selection of wind data type
|
||||||
|
|
||||||
|
int dataIntv = 1; // Update interval for wind history chart:
|
||||||
|
// (1)|(2)|(3)|(4)|(8) x 240 seconds for 4, 8, 12, 16, 32 min. history chart
|
||||||
|
bool useSimuData;
|
||||||
|
String flashLED;
|
||||||
|
String backlightMode;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PageWindPlot(CommonData& common)
|
||||||
|
{
|
||||||
|
commonData = &common;
|
||||||
|
logger = commonData->logger;
|
||||||
|
LOG_DEBUG(GwLog::LOG, "Instantiate PageWindPlot");
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
useSimuData = common.config->getBool(common.config->useSimuData);
|
||||||
|
// holdValues = common.config->getBool(common.config->holdvalues);
|
||||||
|
flashLED = common.config->getString(common.config->flashLED);
|
||||||
|
backlightMode = common.config->getString(common.config->backlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void setupKeys()
|
||||||
|
{
|
||||||
|
Page::setupKeys();
|
||||||
|
commonData->keydata[0].label = "MODE";
|
||||||
|
#if defined BOARD_OBP60S3
|
||||||
|
commonData->keydata[1].label = "SRC";
|
||||||
|
commonData->keydata[4].label = "INTV";
|
||||||
|
#elif defined BOARD_OBP40S3
|
||||||
|
commonData->keydata[1].label = "INTV";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Key functions
|
||||||
|
virtual int handleKey(int key)
|
||||||
|
{
|
||||||
|
// Set chart mode TWD | TWS
|
||||||
|
if (key == 1) {
|
||||||
|
if (chrtMode == 'D') {
|
||||||
|
chrtMode = 'S';
|
||||||
|
} else if (chrtMode == 'S') {
|
||||||
|
chrtMode = 'B';
|
||||||
|
} else {
|
||||||
|
chrtMode = 'D';
|
||||||
|
}
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined BOARD_OBP60S3
|
||||||
|
// Set data source TRUE | APP
|
||||||
|
if (key == 2) {
|
||||||
|
showTruW = !showTruW;
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set interval for wind history chart update time (interval)
|
||||||
|
if (key == 5) {
|
||||||
|
#elif defined BOARD_OBP40S3
|
||||||
|
if (key == 2) {
|
||||||
|
#endif
|
||||||
|
if (dataIntv == 1) {
|
||||||
|
dataIntv = 2;
|
||||||
|
} else if (dataIntv == 2) {
|
||||||
|
dataIntv = 3;
|
||||||
|
} else if (dataIntv == 3) {
|
||||||
|
dataIntv = 4;
|
||||||
|
} else if (dataIntv == 4) {
|
||||||
|
dataIntv = 8;
|
||||||
|
} else {
|
||||||
|
dataIntv = 1;
|
||||||
|
}
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keylock function
|
||||||
|
if (key == 11) { // Code for keylock
|
||||||
|
commonData->keylock = !commonData->keylock;
|
||||||
|
return 0; // Commit the key
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void displayNew(PageData& pageData)
|
||||||
|
{
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
String wndSrc; // Wind source true/apparent 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 apparent wind
|
||||||
|
}
|
||||||
|
LOG_DEBUG(GwLog::LOG, "New PageWindPlot; wind source=%s", wndSrc);
|
||||||
|
#endif
|
||||||
|
oldShowTruW = !showTruW; // makes wind source being initialized at initial page call
|
||||||
|
|
||||||
|
width = getdisplay().width(); // Screen width
|
||||||
|
height = getdisplay().height(); // Screen height
|
||||||
|
}
|
||||||
|
|
||||||
|
int displayPage(PageData& pageData)
|
||||||
|
{
|
||||||
|
GwConfigHandler* config = commonData->config;
|
||||||
|
|
||||||
|
static RingBuffer<uint16_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
|
||||||
|
|
||||||
|
// Separate chart objects for true wind and apparent wind
|
||||||
|
static std::unique_ptr<Chart<uint16_t>> twdFlChart, awdFlChart; // chart object for wind direction chart, full size
|
||||||
|
static std::unique_ptr<Chart<uint16_t>> twsFlChart, awsFlChart; // chart object for wind speed chart, full size
|
||||||
|
static std::unique_ptr<Chart<uint16_t>> twdHfChart, awdHfChart; // chart object for wind direction chart, half size
|
||||||
|
static std::unique_ptr<Chart<uint16_t>> twsHfChart, awsHfChart; // chart object for wind speed chart, half size
|
||||||
|
// Pointers to the currently active charts
|
||||||
|
static Chart<uint16_t>* wdFlChart;
|
||||||
|
static Chart<uint16_t>* wsFlChart;
|
||||||
|
static Chart<uint16_t>* wdHfChart;
|
||||||
|
static Chart<uint16_t>* wsHfChart;
|
||||||
|
|
||||||
|
static GwApi::BoatValue* wdBVal = new GwApi::BoatValue("TWD"); // temp BoatValue for wind direction unit identification; required by OBP60Formater
|
||||||
|
static GwApi::BoatValue* wsBVal = new GwApi::BoatValue("TWS"); // temp BoatValue for wind speed unit identification; required by OBP60Formater */
|
||||||
|
double dfltRngWd = 60.0 * DEG_TO_RAD; // default range for course chart from min to max value in RAD
|
||||||
|
double dfltRngWs = 7.5; // default range for wind speed chart from min to max value in m/s
|
||||||
|
|
||||||
|
const int numBoatData = 4;
|
||||||
|
GwApi::BoatValue* bvalue[numBoatData]; // current boat data values
|
||||||
|
|
||||||
|
LOG_DEBUG(GwLog::LOG, "Display PageWindPlot");
|
||||||
|
ulong pageTime = millis();
|
||||||
|
|
||||||
|
// read boat data values
|
||||||
|
for (int i = 0; i < numBoatData; i++) {
|
||||||
|
bvalue[i] = pageData.values[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optical warning by limit violation (unused)
|
||||||
|
if (String(flashLED) == "Limit Violation") {
|
||||||
|
setBlinkingLED(false);
|
||||||
|
setFlashLED(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showTruW != oldShowTruW) {
|
||||||
|
if (!twdFlChart) { // Create true wind charts if they don't exist
|
||||||
|
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "PageWindPlot: Creating true wind charts");
|
||||||
|
auto* twdHstry = pageData.boatHstry->hstryBufList.twdHstry;
|
||||||
|
auto* twsHstry = pageData.boatHstry->hstryBufList.twsHstry;
|
||||||
|
// LOG_DEBUG(GwLog::DEBUG,"History Buffer addresses PageWindPlot: twdBuf: %p, twsBuf: %p", (void*)pageData.boatHstry->hstryBufList.twdHstry,
|
||||||
|
// (void*)pageData.boatHstry->hstryBufList.twsHstry);
|
||||||
|
|
||||||
|
twdFlChart = std::unique_ptr<Chart<uint16_t>>(new Chart<uint16_t>(*twdHstry, 1, 0, dfltRngWd, *commonData, useSimuData));
|
||||||
|
twsFlChart = std::unique_ptr<Chart<uint16_t>>(new Chart<uint16_t>(*twsHstry, 0, 0, dfltRngWs, *commonData, useSimuData));
|
||||||
|
twdHfChart = std::unique_ptr<Chart<uint16_t>>(new Chart<uint16_t>(*twdHstry, 1, 1, dfltRngWd, *commonData, useSimuData));
|
||||||
|
twsHfChart = std::unique_ptr<Chart<uint16_t>>(new Chart<uint16_t>(*twsHstry, 1, 2, dfltRngWs, *commonData, useSimuData));
|
||||||
|
// twdHfChart = std::unique_ptr<Chart<uint16_t>>(new Chart<uint16_t>(*twdHstry, 0, 1, dfltRngWd, *commonData, useSimuData));
|
||||||
|
// twsHfChart = std::unique_ptr<Chart<uint16_t>>(new Chart<uint16_t>(*twsHstry, 0, 2, dfltRngWs, *commonData, useSimuData));
|
||||||
|
// LOG_DEBUG(GwLog::DEBUG, "PageWindPlot: twdHstry: %p, twsHstry: %p", (void*)twdHstry, (void*)twsHstry);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!awdFlChart) { // Create apparent wind charts if they don't exist
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "PageWindPlot: Creating apparent wind charts");
|
||||||
|
auto* awdHstry = pageData.boatHstry->hstryBufList.awdHstry;
|
||||||
|
auto* awsHstry = pageData.boatHstry->hstryBufList.awsHstry;
|
||||||
|
|
||||||
|
awdFlChart = std::unique_ptr<Chart<uint16_t>>(new Chart<uint16_t>(*awdHstry, 1, 0, dfltRngWd, *commonData, useSimuData));
|
||||||
|
awsFlChart = std::unique_ptr<Chart<uint16_t>>(new Chart<uint16_t>(*awsHstry, 0, 0, dfltRngWs, *commonData, useSimuData));
|
||||||
|
awdHfChart = std::unique_ptr<Chart<uint16_t>>(new Chart<uint16_t>(*awdHstry, 1, 1, dfltRngWd, *commonData, useSimuData));
|
||||||
|
awsHfChart = std::unique_ptr<Chart<uint16_t>>(new Chart<uint16_t>(*awsHstry, 1, 2, dfltRngWs, *commonData, useSimuData));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Switch active charts based on showTruW
|
||||||
|
if (showTruW) {
|
||||||
|
wdHstry = pageData.boatHstry->hstryBufList.twdHstry;
|
||||||
|
wsHstry = pageData.boatHstry->hstryBufList.twsHstry;
|
||||||
|
wdFlChart = twdFlChart.get();
|
||||||
|
wsFlChart = twsFlChart.get();
|
||||||
|
wdHfChart = twdHfChart.get();
|
||||||
|
wsHfChart = twsHfChart.get();
|
||||||
|
} else {
|
||||||
|
wdHstry = pageData.boatHstry->hstryBufList.awdHstry;
|
||||||
|
wsHstry = pageData.boatHstry->hstryBufList.awsHstry;
|
||||||
|
wdFlChart = awdFlChart.get();
|
||||||
|
wsFlChart = awsFlChart.get();
|
||||||
|
wdHfChart = awdHfChart.get();
|
||||||
|
wsHfChart = awsHfChart.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
wdHstry->getMetaData(wdName, wdFormat);
|
||||||
|
wsHstry->getMetaData(wsName, wsFormat);
|
||||||
|
|
||||||
|
oldShowTruW = showTruW;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw page
|
||||||
|
//***********************************************************
|
||||||
|
|
||||||
|
// Set display in partial refresh mode
|
||||||
|
getdisplay().setPartialWindow(0, 0, width, height); // Set partial update
|
||||||
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
|
if (chrtMode == 'D') {
|
||||||
|
wdBVal->value = wdHstry->getLast();
|
||||||
|
wdBVal->valid = wdBVal->value != wdHstry->getMaxVal();
|
||||||
|
wdFlChart->showChrt(dataIntv, *bvalue[0]);
|
||||||
|
|
||||||
|
} else if (chrtMode == 'S') {
|
||||||
|
wsBVal->value = wsHstry->getLast();
|
||||||
|
wsBVal->valid = wsBVal->value != wsHstry->getMaxVal();
|
||||||
|
wsFlChart->showChrt(dataIntv, *bvalue[1]);
|
||||||
|
|
||||||
|
} else if (chrtMode == 'B') {
|
||||||
|
wdBVal->value = wdHstry->getLast();
|
||||||
|
wdBVal->valid = wdBVal->value != wdHstry->getMaxVal();
|
||||||
|
wsBVal->value = wsHstry->getLast();
|
||||||
|
wsBVal->valid = wsBVal->value != wsHstry->getMaxVal();
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "PageWindPlot showChrt: wsBVal.name: %s, format: %s, wsBVal.value: %.1f, valid: %d, address: %p", wsBVal->getName(), wsBVal->getFormat(), wsBVal->value,
|
||||||
|
wsBVal->valid, wsBVal);
|
||||||
|
wdHfChart->showChrt(dataIntv, *bvalue[0]);
|
||||||
|
wsHfChart->showChrt(dataIntv, *bvalue[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_DEBUG(GwLog::LOG, "PageWindPlot: page time %ldms", millis() - pageTime);
|
||||||
|
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", "TWS", "AWD", "AWS" }, // Bus values we need in the page
|
||||||
|
true // Show display header on/off
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
#include "BoatDataCalibration.h"
|
||||||
|
|
||||||
class PageWindRose : public Page
|
class PageWindRose : public Page
|
||||||
{
|
{
|
||||||
@@ -23,7 +24,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -47,10 +48,11 @@ public:
|
|||||||
String flashLED = config->getString(config->flashLED);
|
String flashLED = config->getString(config->flashLED);
|
||||||
String backlightMode = config->getString(config->backlight);
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
// Get boat values for AWA
|
// Get boat value for AWA
|
||||||
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (only one value by PageOneValue)
|
||||||
String name1 = xdrDelete(bvalue1->getName()); // Value name
|
String name1 = xdrDelete(bvalue1->getName()); // Value name
|
||||||
name1 = name1.substring(0, 6); // String length limit for value name
|
name1 = name1.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
||||||
double value1 = bvalue1->value; // Value as double in SI unit
|
double value1 = bvalue1->value; // Value as double in SI unit
|
||||||
bool valid1 = bvalue1->valid; // Valid information
|
bool valid1 = bvalue1->valid; // Valid information
|
||||||
value1 = formatValue(bvalue1, *commonData).value;// Format only nesaccery for simulation data for pointer
|
value1 = formatValue(bvalue1, *commonData).value;// Format only nesaccery for simulation data for pointer
|
||||||
@@ -61,10 +63,11 @@ public:
|
|||||||
unit1old = unit1; // Save old unit
|
unit1old = unit1; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values for AWS
|
// Get boat value for AWS
|
||||||
GwApi::BoatValue *bvalue2 = pageData.values[1]; // First element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list
|
||||||
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
||||||
name2 = name2.substring(0, 6); // String length limit for value name
|
name2 = name2.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
||||||
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 = 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
|
||||||
@@ -74,10 +77,11 @@ public:
|
|||||||
unit2old = unit2; // Save old unit
|
unit2old = unit2; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values TWD
|
// Get boat value for TWD
|
||||||
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Third element in list
|
||||||
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
||||||
name3 = name3.substring(0, 6); // String length limit for value name
|
name3 = name3.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
||||||
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 = 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
|
||||||
@@ -87,10 +91,11 @@ public:
|
|||||||
unit3old = unit3; // Save old unit
|
unit3old = unit3; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values TWS
|
// Get boat value for TWS
|
||||||
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Fourth element in list
|
||||||
String name4 = xdrDelete(bvalue4->getName()); // Value name
|
String name4 = xdrDelete(bvalue4->getName()); // Value name
|
||||||
name4 = name4.substring(0, 6); // String length limit for value name
|
name4 = name4.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue4, logger); // Check if boat data value is to be calibrated
|
||||||
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 = 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
|
||||||
@@ -100,10 +105,11 @@ public:
|
|||||||
unit4old = unit4; // Save old unit
|
unit4old = unit4; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values DBT
|
// Get boat value for DBT
|
||||||
GwApi::BoatValue *bvalue5 = pageData.values[4]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue5 = pageData.values[4]; // Fifth element in list
|
||||||
String name5 = xdrDelete(bvalue5->getName()); // Value name
|
String name5 = xdrDelete(bvalue5->getName()); // Value name
|
||||||
name5 = name5.substring(0, 6); // String length limit for value name
|
name5 = name5.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue5, logger); // Check if boat data value is to be calibrated
|
||||||
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 = 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
|
||||||
@@ -113,10 +119,11 @@ public:
|
|||||||
unit5old = unit5; // Save old unit
|
unit5old = unit5; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values STW
|
// Get boat value for STW
|
||||||
GwApi::BoatValue *bvalue6 = pageData.values[5]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue6 = pageData.values[5]; // Sixth element in list
|
||||||
String name6 = xdrDelete(bvalue6->getName()); // Value name
|
String name6 = xdrDelete(bvalue6->getName()); // Value name
|
||||||
name6 = name6.substring(0, 6); // String length limit for value name
|
name6 = name6.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue6, logger); // Check if boat data value is to be calibrated
|
||||||
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 = 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
|
||||||
@@ -133,7 +140,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageWindRose, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4, name5.c_str(), value5, name6.c_str(), value6);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageWindRose, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4, name5.c_str(), value5, name6.c_str(), value6);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -148,10 +155,10 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
getdisplay().print(svalue1); // Value
|
getdisplay().print(svalue1); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 95);
|
getdisplay().setCursor(10, 95);
|
||||||
getdisplay().print(name1); // Name
|
getdisplay().print(name1); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 115);
|
getdisplay().setCursor(10, 115);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -168,10 +175,10 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(10, 270);
|
getdisplay().setCursor(10, 270);
|
||||||
getdisplay().print(svalue2); // Value
|
getdisplay().print(svalue2); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 220);
|
getdisplay().setCursor(10, 220);
|
||||||
getdisplay().print(name2); // Name
|
getdisplay().print(name2); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 190);
|
getdisplay().setCursor(10, 190);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -190,10 +197,10 @@ public:
|
|||||||
else{
|
else{
|
||||||
getdisplay().print("---"); // Value
|
getdisplay().print("---"); // Value
|
||||||
}
|
}
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(335, 95);
|
getdisplay().setCursor(335, 95);
|
||||||
getdisplay().print(name3); // Name
|
getdisplay().print(name3); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 115);
|
getdisplay().setCursor(335, 115);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -210,10 +217,10 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(295, 270);
|
getdisplay().setCursor(295, 270);
|
||||||
getdisplay().print(svalue4); // Value
|
getdisplay().print(svalue4); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(335, 220);
|
getdisplay().setCursor(335, 220);
|
||||||
getdisplay().print(name4); // Name
|
getdisplay().print(name4); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 190);
|
getdisplay().setCursor(335, 190);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -241,7 +248,7 @@ public:
|
|||||||
float y = 150 - (rInstrument-30)*cos(i/180.0*pi); // y-coordinate cots
|
float y = 150 - (rInstrument-30)*cos(i/180.0*pi); // y-coordinate cots
|
||||||
const char *ii = "";
|
const char *ii = "";
|
||||||
switch (i)
|
switch (i)
|
||||||
{
|
{
|
||||||
case 0: ii="0"; break;
|
case 0: ii="0"; break;
|
||||||
case 30 : ii="30"; break;
|
case 30 : ii="30"; break;
|
||||||
case 60 : ii="60"; break;
|
case 60 : ii="60"; break;
|
||||||
@@ -263,7 +270,7 @@ public:
|
|||||||
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
||||||
getdisplay().setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,7 +333,7 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
getdisplay().setCursor(160, 200);
|
getdisplay().setCursor(160, 200);
|
||||||
getdisplay().print(svalue5); // Value
|
getdisplay().print(svalue5); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(190, 215);
|
getdisplay().setCursor(190, 215);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -340,7 +347,7 @@ public:
|
|||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
getdisplay().setCursor(160, 130);
|
getdisplay().setCursor(160, 130);
|
||||||
getdisplay().print(svalue6); // Value
|
getdisplay().print(svalue6); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(190, 90);
|
getdisplay().setCursor(190, 90);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
@@ -350,8 +357,7 @@ public:
|
|||||||
getdisplay().print(unit6old); // Unit
|
getdisplay().print(unit6old); // Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -366,11 +372,11 @@ static Page *createPage(CommonData &common){
|
|||||||
* and will will provide the names of the fixed values we need
|
* and will will provide the names of the fixed values we need
|
||||||
*/
|
*/
|
||||||
PageDescription registerPageWindRose(
|
PageDescription registerPageWindRose(
|
||||||
"WindRose", // Page name
|
"WindRose", // Page name
|
||||||
createPage, // Action
|
createPage, // Action
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
{"AWA", "AWS", "TWD", "TWS", "DBT", "STW"}, // Bus values we need in the page
|
{"AWA", "AWS", "TWD", "TWS", "DBT", "STW"}, // Bus values we need in the page
|
||||||
true // Show display header on/off
|
true // Show display header on/off
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -2,19 +2,35 @@
|
|||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
|
#include "BoatDataCalibration.h"
|
||||||
|
|
||||||
class PageWindRoseFlex : public Page
|
class PageWindRoseFlex : public Page
|
||||||
{
|
{
|
||||||
int16_t lp = 80; // Pointer length
|
int16_t lp = 80; // Pointer length
|
||||||
|
char source = 'A'; // data source (A)pparent | (T)rue
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageWindRoseFlex(CommonData &common){
|
PageWindRoseFlex(CommonData &common){
|
||||||
commonData = &common;
|
commonData = &common;
|
||||||
common.logger->logDebug(GwLog::LOG,"Instantiate PageWindRoseFlex");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageWindRoseFlex");
|
||||||
}
|
}
|
||||||
|
virtual void setupKeys(){
|
||||||
|
Page::setupKeys();
|
||||||
|
commonData->keydata[1].label = "SRC";
|
||||||
|
}
|
||||||
|
|
||||||
// Key functions
|
// Key functions
|
||||||
virtual int handleKey(int key){
|
virtual int handleKey(int key){
|
||||||
|
if(key == 2){
|
||||||
|
// Code for set source
|
||||||
|
if(source == 'A'){
|
||||||
|
source = 'T';
|
||||||
|
} else {
|
||||||
|
source = 'A';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return key; // Commit the key
|
||||||
|
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if(key == 11){
|
if(key == 11){
|
||||||
commonData->keylock = !commonData->keylock;
|
commonData->keylock = !commonData->keylock;
|
||||||
@@ -23,7 +39,7 @@ public:
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -39,6 +55,11 @@ public:
|
|||||||
static String unit5old = "";
|
static String unit5old = "";
|
||||||
static String svalue6old = "";
|
static String svalue6old = "";
|
||||||
static String unit6old = "";
|
static String unit6old = "";
|
||||||
|
static GFXfont name3font;
|
||||||
|
static GFXfont name4font;
|
||||||
|
static GFXfont name5font;
|
||||||
|
static GFXfont name6font;
|
||||||
|
|
||||||
|
|
||||||
// Get config data
|
// Get config data
|
||||||
String lengthformat = config->getString(config->lengthFormat);
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
@@ -47,37 +68,61 @@ public:
|
|||||||
String flashLED = config->getString(config->flashLED);
|
String flashLED = config->getString(config->flashLED);
|
||||||
String backlightMode = config->getString(config->backlight);
|
String backlightMode = config->getString(config->backlight);
|
||||||
|
|
||||||
// Get boat values for AWA
|
GwApi::BoatValue *bvalue1; // Value 1 for angle
|
||||||
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue2; // Value 2 for speed
|
||||||
String name1 = xdrDelete(bvalue1->getName()); // Value name
|
|
||||||
|
// Get boat value for wind angle (AWA/TWA), shown by pointer
|
||||||
|
if (source == 'A') {
|
||||||
|
bvalue1 = pageData.values[4];
|
||||||
|
} else {
|
||||||
|
bvalue1 = pageData.values[6];
|
||||||
|
}
|
||||||
|
String name1 = bvalue1->getName().c_str(); // Value name
|
||||||
name1 = name1.substring(0, 6); // String length limit for value name
|
name1 = name1.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue1, logger); // Check if boat data value is to be calibrated
|
||||||
double value1 = bvalue1->value; // Value as double in SI unit
|
double value1 = bvalue1->value; // Value as double in SI unit
|
||||||
bool valid1 = bvalue1->valid; // Valid information
|
bool valid1 = bvalue1->valid; // Valid information
|
||||||
value1 = formatValue(bvalue1, *commonData).value;// Format only nesaccery for simulation data for pointer
|
|
||||||
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
if(valid1 == true){
|
if(valid1 == true){
|
||||||
svalue1old = svalue1; // Save old value
|
svalue1old = svalue1; // Save old value
|
||||||
unit1old = unit1; // Save old unit
|
unit1old = unit1; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values for AWS
|
// Get boat value for wind speed (AWS/TWS), shown in top left corner
|
||||||
GwApi::BoatValue *bvalue2 = pageData.values[1]; // First element in list (only one value by PageOneValue)
|
if (source == 'A') {
|
||||||
String name2 = xdrDelete(bvalue2->getName()); // Value name
|
bvalue2 =pageData.values[5];
|
||||||
|
} else {
|
||||||
|
bvalue2 = pageData.values[7];
|
||||||
|
}
|
||||||
|
String name2 = bvalue2->getName().c_str(); // Value name
|
||||||
name2 = name2.substring(0, 6); // String length limit for value name
|
name2 = name2.substring(0, 6); // String length limit for value name
|
||||||
|
calibrationData.calibrateInstance(bvalue2, logger); // Check if boat data value is to be calibrated
|
||||||
double value2 = bvalue2->value; // Value as double in SI unit
|
double value2 = bvalue2->value; // Value as double in SI unit
|
||||||
bool valid2 = bvalue2->valid; // Valid information
|
bool valid2 = bvalue2->valid; // Valid information
|
||||||
|
if (simulation) {
|
||||||
|
value2 = 0.62731; // some random value
|
||||||
|
}
|
||||||
String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
||||||
if(valid2 == true){
|
if(valid2 == true){
|
||||||
svalue2old = svalue2; // Save old value
|
svalue2old = svalue2; // Save old value
|
||||||
unit2old = unit2; // Save old unit
|
unit2old = unit2; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values TWD
|
|
||||||
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue)
|
|
||||||
|
// Get boat value for bottom left corner
|
||||||
|
GwApi::BoatValue *bvalue3 = pageData.values[0];
|
||||||
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
String name3 = xdrDelete(bvalue3->getName()); // Value name
|
||||||
name3 = name3.substring(0, 6); // String length limit for value name
|
name3 = name3.substring(0, 6); // String length limit for value name
|
||||||
|
if (name3.length()>3){
|
||||||
|
name3font=Ubuntu_Bold8pt8b;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
name3font=Ubuntu_Bold12pt8b;
|
||||||
|
}
|
||||||
|
calibrationData.calibrateInstance(bvalue3, logger); // Check if boat data value is to be calibrated
|
||||||
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 = 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
|
||||||
@@ -87,10 +132,17 @@ public:
|
|||||||
unit3old = unit3; // Save old unit
|
unit3old = unit3; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values TWS
|
// Get boat value for top right corner
|
||||||
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue4 = pageData.values[1];
|
||||||
String name4 = xdrDelete(bvalue4->getName()); // Value name
|
String name4 = xdrDelete(bvalue4->getName()); // Value name
|
||||||
name4 = name4.substring(0, 6); // String length limit for value name
|
name4 = name4.substring(0, 6); // String length limit for value name
|
||||||
|
if (name4.length()>3){
|
||||||
|
name4font=Ubuntu_Bold8pt8b;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
name4font=Ubuntu_Bold12pt8b;
|
||||||
|
}
|
||||||
|
calibrationData.calibrateInstance(bvalue4, logger); // Check if boat data value is to be calibrated
|
||||||
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 = 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
|
||||||
@@ -100,10 +152,17 @@ public:
|
|||||||
unit4old = unit4; // Save old unit
|
unit4old = unit4; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values DBT
|
// Get boat value bottom right corner
|
||||||
GwApi::BoatValue *bvalue5 = pageData.values[4]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue5 = pageData.values[2];
|
||||||
String name5 = xdrDelete(bvalue5->getName()); // Value name
|
String name5 = xdrDelete(bvalue5->getName()); // Value name
|
||||||
name5 = name5.substring(0, 6); // String length limit for value name
|
name5 = name5.substring(0, 6); // String length limit for value name
|
||||||
|
if (name5.length()>3){
|
||||||
|
name5font=Ubuntu_Bold8pt8b;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
name5font=Ubuntu_Bold12pt8b;
|
||||||
|
}
|
||||||
|
calibrationData.calibrateInstance(bvalue5, logger); // Check if boat data value is to be calibrated
|
||||||
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 = 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
|
||||||
@@ -113,10 +172,17 @@ public:
|
|||||||
unit5old = unit5; // Save old unit
|
unit5old = unit5; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get boat values STW
|
// Get boat value for center (name is not displayed)
|
||||||
GwApi::BoatValue *bvalue6 = pageData.values[5]; // Second element in list (only one value by PageOneValue)
|
GwApi::BoatValue *bvalue6 = pageData.values[3];
|
||||||
String name6 = xdrDelete(bvalue6->getName()); // Value name
|
String name6 = xdrDelete(bvalue6->getName()); // Value name
|
||||||
name6 = name6.substring(0, 6); // String length limit for value name
|
name6 = name6.substring(0, 6); // String length limit for value name
|
||||||
|
if (name6.length()>3){
|
||||||
|
name6font=Ubuntu_Bold8pt8b;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
name6font=Ubuntu_Bold8pt8b;
|
||||||
|
}
|
||||||
|
calibrationData.calibrateInstance(bvalue6, logger); // Check if boat data value is to be calibrated
|
||||||
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 = 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
|
||||||
@@ -126,14 +192,15 @@ public:
|
|||||||
unit6old = unit6; // Save old unit
|
unit6old = unit6; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Optical warning by limit violation (unused)
|
// Optical warning by limit violation (unused)
|
||||||
if(String(flashLED) == "Limit Violation"){
|
if(String(flashLED) == "Limit Violation"){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
setFlashLED(false);
|
setFlashLED(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return;
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageWindRoseFlex, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4, name5.c_str(), value5, name6.c_str(), value6);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageWindRoseFlex, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3, name4.c_str(), value4, name5.c_str(), value5, name6.c_str(), value6);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
@@ -144,35 +211,15 @@ public:
|
|||||||
|
|
||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// Show values AWA
|
// Show AWS or TWS top left
|
||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(10, 65);
|
getdisplay().setCursor(10, 65);
|
||||||
getdisplay().print(svalue1); // Value
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
|
||||||
getdisplay().setCursor(10, 95);
|
|
||||||
getdisplay().print(name1); // Name
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
|
||||||
getdisplay().setCursor(10, 115);
|
|
||||||
getdisplay().print(" ");
|
|
||||||
if(holdvalues == false){
|
|
||||||
getdisplay().print(unit1); // Unit
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
getdisplay().print(unit1old); // Unit
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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().print(svalue2); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
getdisplay().setCursor(10, 220);
|
getdisplay().setCursor(10, 95);
|
||||||
getdisplay().print(name2); // Name
|
getdisplay().print(name2); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(10, 190);
|
getdisplay().setCursor(10, 115);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit2); // Unit
|
getdisplay().print(unit2); // Unit
|
||||||
@@ -181,21 +228,18 @@ public:
|
|||||||
getdisplay().print(unit2old); // Unit
|
getdisplay().print(unit2old); // Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show values TWD
|
// Horizintal separator left
|
||||||
|
getdisplay().fillRect(0, 149, 60, 3, commonData->fgcolor);
|
||||||
|
|
||||||
|
// Show value 3 (=first user-configured parameter) at bottom left
|
||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(295, 65);
|
getdisplay().setCursor(10, 270);
|
||||||
if(valid3 == true){
|
getdisplay().print(svalue3); // Value
|
||||||
// getdisplay().print(abs(value3 * 180 / PI), 0); // Value
|
getdisplay().setFont(&name3font);
|
||||||
getdisplay().print(svalue3); // Value
|
getdisplay().setCursor(10, 220);
|
||||||
}
|
|
||||||
else{
|
|
||||||
getdisplay().print("---"); // Value
|
|
||||||
}
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
|
||||||
getdisplay().setCursor(335, 95);
|
|
||||||
getdisplay().print(name3); // Name
|
getdisplay().print(name3); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 115);
|
getdisplay().setCursor(10, 190);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit3); // Unit
|
getdisplay().print(unit3); // Unit
|
||||||
@@ -204,31 +248,48 @@ public:
|
|||||||
getdisplay().print(unit3old); // Unit
|
getdisplay().print(unit3old); // Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Horizintal separator right
|
// Show value 4 (=second user-configured parameter) at top right
|
||||||
getdisplay().fillRect(340, 149, 80, 3, commonData->fgcolor);
|
|
||||||
|
|
||||||
// Show values TWS
|
|
||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
getdisplay().setCursor(295, 270);
|
getdisplay().setCursor(295, 65);
|
||||||
getdisplay().print(svalue4); // Value
|
getdisplay().print(svalue4); // Value
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&name4font);
|
||||||
getdisplay().setCursor(335, 220);
|
getdisplay().setCursor(325, 95);
|
||||||
getdisplay().print(name4); // Name
|
getdisplay().print(name4); // Name
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(335, 190);
|
getdisplay().setCursor(325, 115);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
getdisplay().print(unit4); // Unit
|
getdisplay().print(unit4); // Unit
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
getdisplay().print(unit4old); // Unit
|
getdisplay().print(unit4old); // Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Horizintal separator right
|
||||||
|
getdisplay().fillRect(340, 149, 80, 3, commonData->fgcolor);
|
||||||
|
|
||||||
|
// Show value 5 (=third user-configured parameter) at bottom right
|
||||||
|
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
||||||
|
getdisplay().setCursor(295, 270);
|
||||||
|
getdisplay().print(svalue5); // Value
|
||||||
|
getdisplay().setFont(&name5font);
|
||||||
|
getdisplay().setCursor(325, 220);
|
||||||
|
getdisplay().print(name5); // Name
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
getdisplay().setCursor(325, 190);
|
||||||
|
getdisplay().print(" ");
|
||||||
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(unit5); // Unit
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print(unit5old); // 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;
|
|
||||||
|
|
||||||
getdisplay().fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 10, commonData->fgcolor); // Outer circle
|
||||||
getdisplay().fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
getdisplay().fillCircle(200, 150, rInstrument + 7, commonData->bgcolor); // Outer circle
|
||||||
@@ -238,24 +299,23 @@ public:
|
|||||||
for(int i=0; i<360; i=i+10)
|
for(int i=0; i<360; i=i+10)
|
||||||
{
|
{
|
||||||
// Scaling values
|
// Scaling values
|
||||||
float x = 200 + (rInstrument-30)*sin(i/180.0*pi); // x-coordinate dots
|
float x = 200 + (rInstrument-30)*sin(i/180.0*M_PI); // x-coordinate dots
|
||||||
float y = 150 - (rInstrument-30)*cos(i/180.0*pi); // y-coordinate dots
|
float y = 150 - (rInstrument-30)*cos(i/180.0*M_PI); // y-coordinate dots
|
||||||
const char *ii = "";
|
const char *ii = "";
|
||||||
switch (i)
|
switch (i) {
|
||||||
{
|
case 0: ii="0"; break;
|
||||||
case 0: ii="0"; break;
|
case 30 : ii="30"; break;
|
||||||
case 30 : ii="30"; break;
|
case 60 : ii="60"; break;
|
||||||
case 60 : ii="60"; break;
|
case 90 : ii="90"; break;
|
||||||
case 90 : ii="90"; break;
|
case 120 : ii="120"; break;
|
||||||
case 120 : ii="120"; break;
|
case 150 : ii="150"; break;
|
||||||
case 150 : ii="150"; break;
|
case 180 : ii="180"; break;
|
||||||
case 180 : ii="180"; break;
|
case 210 : ii="210"; break;
|
||||||
case 210 : ii="210"; break;
|
case 240 : ii="240"; break;
|
||||||
case 240 : ii="240"; break;
|
case 270 : ii="270"; break;
|
||||||
case 270 : ii="270"; break;
|
case 300 : ii="300"; break;
|
||||||
case 300 : ii="300"; break;
|
case 330 : ii="330"; break;
|
||||||
case 330 : ii="330"; break;
|
default: break;
|
||||||
default: break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print text centered on position x, y
|
// Print text centered on position x, y
|
||||||
@@ -264,16 +324,16 @@ public:
|
|||||||
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
getdisplay().getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string
|
||||||
getdisplay().setCursor(x-w/2, y+h/2);
|
getdisplay().setCursor(x-w/2, y+h/2);
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().print(ii);
|
getdisplay().print(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw sub scale with dots
|
// Draw sub scale with dots
|
||||||
float x1c = 200 + rInstrument*sin(i/180.0*pi);
|
float x1c = 200 + rInstrument*sin(i/180.0*M_PI);
|
||||||
float y1c = 150 - rInstrument*cos(i/180.0*pi);
|
float y1c = 150 - rInstrument*cos(i/180.0*M_PI);
|
||||||
getdisplay().fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
getdisplay().fillCircle((int)x1c, (int)y1c, 2, commonData->fgcolor);
|
||||||
float sinx=sin(i/180.0*pi);
|
float sinx=sin(i/180.0*M_PI);
|
||||||
float cosx=cos(i/180.0*pi);
|
float cosx=cos(i/180.0*M_PI);
|
||||||
|
|
||||||
// Draw sub scale with lines (two triangles)
|
// Draw sub scale with lines (two triangles)
|
||||||
if(i % 30 == 0){
|
if(i % 30 == 0){
|
||||||
@@ -301,7 +361,7 @@ 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);
|
||||||
getdisplay().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);
|
||||||
@@ -318,41 +378,54 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Center circle
|
// Center circle
|
||||||
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->bgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 8, commonData->bgcolor);
|
||||||
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->fgcolor);
|
getdisplay().fillCircle(200, 150, startwidth + 6, commonData->fgcolor);
|
||||||
|
getdisplay().fillCircle(200, 150, startwidth + 4, commonData->bgcolor);
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold10pt8b);
|
||||||
|
if (source=='A'){
|
||||||
|
getdisplay().setCursor(193, 155);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
getdisplay().setCursor(195, 156);
|
||||||
|
}
|
||||||
|
getdisplay().print({source});
|
||||||
|
|
||||||
|
|
||||||
//*******************************************************************************************
|
//*******************************************************************************************
|
||||||
|
|
||||||
// Show values DBT
|
// Show value6 (=fourth user-configured parameter)
|
||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
if ( cos(value1) > 0){
|
||||||
getdisplay().setCursor(160, 200);
|
//pointer points upwards
|
||||||
getdisplay().print(svalue5); // Value
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setCursor(160, 200);
|
||||||
getdisplay().setCursor(190, 215);
|
getdisplay().print(svalue6); // Value
|
||||||
getdisplay().print(" ");
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
if(holdvalues == false){
|
getdisplay().setCursor(190, 215);
|
||||||
getdisplay().print(unit5); // Unit
|
getdisplay().print(" ");
|
||||||
}
|
if(holdvalues == false){
|
||||||
else{
|
getdisplay().print(unit6); // Unit
|
||||||
getdisplay().print(unit5old); // Unit
|
}
|
||||||
}
|
else{
|
||||||
|
getdisplay().print(unit6old); // Unit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
// pointer points downwards
|
||||||
|
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
|
||||||
|
getdisplay().setCursor(160, 130);
|
||||||
|
getdisplay().print(svalue6); // Value
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
getdisplay().setCursor(190, 90);
|
||||||
|
getdisplay().print(" ");
|
||||||
|
if(holdvalues == false){
|
||||||
|
getdisplay().print(unit6); // Unit
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
getdisplay().print(unit6old); // Unit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Show values STW
|
return PAGE_UPDATE;
|
||||||
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)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -363,15 +436,15 @@ static Page *createPage(CommonData &common){
|
|||||||
* with the code below we make this page known to the PageTask
|
* with the code below we make this page known to the PageTask
|
||||||
* we give it a type (name) that can be selected in the config
|
* we give it a type (name) that can be selected in the config
|
||||||
* we define which function is to be called
|
* we define which function is to be called
|
||||||
* and we provide the number of user parameters we expect (0 here)
|
* and we provide the number of user parameters we expect (4 here)
|
||||||
* and will will provide the names of the fixed values we need
|
* and will will provide the names of the fixed values we need
|
||||||
*/
|
*/
|
||||||
PageDescription registerPageWindRoseFlex(
|
PageDescription registerPageWindRoseFlex(
|
||||||
"WindRoseFlex", // Page name
|
"WindRoseFlex", // Page name
|
||||||
createPage, // Action
|
createPage, // Action
|
||||||
6, // Number of bus values depends on selection in Web configuration; was zero
|
4, // Number of bus values depends on selection in Web configuration
|
||||||
//{"AWA", "AWS", "COG", "SOG", "TWD", "TWS"}, // Bus values we need in the page, modified for WindRose2
|
{"AWA", "AWS", "TWA", "TWS"}, // fixed values we need in the page. They are inserted AFTER the web-configured values.
|
||||||
true // Show display header on/off
|
true // Show display header on/off
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ class PageXTETrack : public Page
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void displayPage(PageData &pageData){
|
int displayPage(PageData &pageData){
|
||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
@@ -94,7 +94,7 @@ class PageXTETrack : public Page
|
|||||||
getdisplay().setTextColor(commonData->fgcolor);
|
getdisplay().setTextColor(commonData->fgcolor);
|
||||||
|
|
||||||
// descriptions
|
// descriptions
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(50, 188);
|
getdisplay().setCursor(50, 188);
|
||||||
getdisplay().print("Cross-track error");
|
getdisplay().print("Cross-track error");
|
||||||
getdisplay().setCursor(270, 188);
|
getdisplay().setCursor(270, 188);
|
||||||
@@ -148,7 +148,7 @@ class PageXTETrack : public Page
|
|||||||
sval_wpname = "Tonne 122";
|
sval_wpname = "Tonne 122";
|
||||||
}
|
}
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold10pt7b);
|
getdisplay().setFont(&Ubuntu_Bold10pt8b);
|
||||||
getdisplay().getTextBounds(sval_wpname, 0, 150, &x, &y, &w, &h);
|
getdisplay().getTextBounds(sval_wpname, 0, 150, &x, &y, &w, &h);
|
||||||
// TODO if text don't fix use smaller font size.
|
// TODO if text don't fix use smaller font size.
|
||||||
// if smallest size does not fit use 2 lines
|
// if smallest size does not fit use 2 lines
|
||||||
@@ -207,9 +207,7 @@ class PageXTETrack : public Page
|
|||||||
drawSegment(399, 100, 318, 24, 289, 24, 350, 100, commonData->fgcolor, seg[4]);
|
drawSegment(399, 100, 318, 24, 289, 24, 350, 100, commonData->fgcolor, seg[4]);
|
||||||
drawSegment(399, 54, 354, 24, 325, 24, 399, 90, commonData->fgcolor, seg[5]);
|
drawSegment(399, 54, 354, 24, 325, 24, 399, 90, commonData->fgcolor, seg[5]);
|
||||||
|
|
||||||
// Update display
|
return PAGE_UPDATE;
|
||||||
getdisplay().nextPage(); // Partial update (fast)
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -225,11 +223,11 @@ static Page* createPage(CommonData &common){
|
|||||||
* this will be number of BoatValue pointers in pageData.values
|
* this will be number of BoatValue pointers in pageData.values
|
||||||
*/
|
*/
|
||||||
PageDescription registerPageXTETrack(
|
PageDescription registerPageXTETrack(
|
||||||
"XTETrack", // Page name
|
"XTETrack", // Page name
|
||||||
createPage, // Action
|
createPage, // Action
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
0, // Number of bus values depends on selection in Web configuration
|
||||||
{"XTE", "COG", "DTW", "BTW"}, // Bus values we need in the page
|
{"XTE", "COG", "DTW", "BTW"}, // Bus values we need in the page
|
||||||
true // Show display header on/off
|
true // Show display header on/off
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,15 +4,19 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "LedSpiTask.h"
|
#include "LedSpiTask.h"
|
||||||
|
#include "OBPDataOperations.h"
|
||||||
|
|
||||||
#define MAX_PAGE_NUMBER 10 // Max number of pages for show data
|
#define MAX_PAGE_NUMBER 10 // Max number of pages for show data
|
||||||
|
|
||||||
typedef std::vector<GwApi::BoatValue *> ValueList;
|
typedef std::vector<GwApi::BoatValue *> ValueList;
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
|
GwApi *api;
|
||||||
String pageName;
|
String pageName;
|
||||||
uint8_t pageNumber; // page number in sequence of visible pages
|
uint8_t pageNumber; // page number in sequence of visible pages
|
||||||
//the values will always contain the user defined values first
|
//the values will always contain the user defined values first
|
||||||
ValueList values;
|
ValueList values;
|
||||||
|
HstryBuf* boatHstry;
|
||||||
} PageData;
|
} PageData;
|
||||||
|
|
||||||
// Sensor data structure (only for extended sensors, not for NMEA bus sensors)
|
// Sensor data structure (only for extended sensors, not for NMEA bus sensors)
|
||||||
@@ -78,20 +82,37 @@ typedef struct{
|
|||||||
bool on; // fast on/off detector
|
bool on; // fast on/off detector
|
||||||
} BacklightData;
|
} BacklightData;
|
||||||
|
|
||||||
|
enum AlarmSource {
|
||||||
|
Alarm_Generic,
|
||||||
|
Alarm_Local,
|
||||||
|
Alarm_NMEA0183,
|
||||||
|
Alarm_NMEA2000
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
GwApi::Status status;
|
uint8_t id; // alarm-id e.g. 01..99 from NMEA0183
|
||||||
GwLog *logger=NULL;
|
AlarmSource source;
|
||||||
GwConfigHandler *config=NULL;
|
String message; // single line of plain text
|
||||||
SensorData data;
|
bool active = false;
|
||||||
SunData sundata;
|
uint8_t signal; // how to signal MESSAGE | LED | BUZZER
|
||||||
TouchKeyData keydata[6];
|
uint8_t length_sec; // seconds until alarm disappeares without user interaction
|
||||||
BacklightData backlight;
|
} AlarmData;
|
||||||
GwApi::BoatValue *time=NULL;
|
|
||||||
GwApi::BoatValue *date=NULL;
|
typedef struct{
|
||||||
uint16_t fgcolor;
|
GwApi::Status status;
|
||||||
uint16_t bgcolor;
|
GwLog *logger = nullptr;
|
||||||
bool keylock = false;
|
GwConfigHandler *config = nullptr;
|
||||||
String powermode;
|
SensorData data;
|
||||||
|
SunData sundata;
|
||||||
|
TouchKeyData keydata[6];
|
||||||
|
BacklightData backlight;
|
||||||
|
AlarmData alarm;
|
||||||
|
GwApi::BoatValue *time = nullptr;
|
||||||
|
GwApi::BoatValue *date = nullptr;
|
||||||
|
uint16_t fgcolor;
|
||||||
|
uint16_t bgcolor;
|
||||||
|
bool keylock = false;
|
||||||
|
String powermode;
|
||||||
} CommonData;
|
} CommonData;
|
||||||
|
|
||||||
//a base class that all pages must inherit from
|
//a base class that all pages must inherit from
|
||||||
@@ -100,8 +121,9 @@ class Page{
|
|||||||
CommonData *commonData;
|
CommonData *commonData;
|
||||||
public:
|
public:
|
||||||
int refreshtime = 1000;
|
int refreshtime = 1000;
|
||||||
virtual void displayPage(PageData &pageData)=0;
|
virtual int displayPage(PageData &pageData)=0;
|
||||||
virtual void displayNew(PageData &pageData){}
|
virtual void displayNew(PageData &pageData){}
|
||||||
|
virtual void leavePage(PageData &pageData){}
|
||||||
virtual void setupKeys() {
|
virtual void setupKeys() {
|
||||||
#ifdef HARDWARE_V21
|
#ifdef HARDWARE_V21
|
||||||
commonData->keydata[0].label = "";
|
commonData->keydata[0].label = "";
|
||||||
@@ -160,21 +182,24 @@ class PageDescription{
|
|||||||
|
|
||||||
class PageStruct{
|
class PageStruct{
|
||||||
public:
|
public:
|
||||||
Page *page=NULL;
|
Page *page = nullptr;
|
||||||
PageData parameters;
|
PageData parameters;
|
||||||
PageDescription *description=NULL;
|
PageDescription *description = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Standard format functions without overhead
|
// Standard format functions without overhead
|
||||||
String formatDate(String fmttype, uint16_t year, uint8_t month, uint8_t day);
|
String formatDate(String fmttype, uint16_t year, uint8_t month, uint8_t day);
|
||||||
String formatTime(char fmttype, uint8_t hour, uint8_t minute, uint8_t second);
|
String formatTime(char fmttype, uint8_t hour, uint8_t minute, uint8_t second);
|
||||||
|
String formatLatitude(double lat);
|
||||||
|
String formatLongitude(double lon);
|
||||||
|
|
||||||
// Structure for formatted boat values
|
// Structure for formatted boat values
|
||||||
typedef struct{
|
typedef struct{
|
||||||
double value;
|
double value; // SI value of boat data value
|
||||||
String svalue;
|
double cvalue; // value converted to target unit
|
||||||
String unit;
|
String svalue; // value converted to target unit and formatted
|
||||||
} FormatedData;
|
String unit; // target value unit
|
||||||
|
} FormattedData;
|
||||||
|
|
||||||
// Formatter for boat values
|
// Formatter for boat values
|
||||||
FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata);
|
FormattedData formatValue(GwApi::BoatValue *value, CommonData &commondata);
|
||||||
|
|||||||
@@ -1,232 +0,0 @@
|
|||||||
const uint8_t Ubuntu_Bold10pt7bBitmaps[] PROGMEM = {
|
|
||||||
0xFF, 0xFF, 0xFF, 0xE3, 0xFF, 0xC0, 0xEF, 0xDF, 0xBF, 0x7E, 0xFD, 0xC0,
|
|
||||||
0x0E, 0xE0, 0xEE, 0x1D, 0xCF, 0xFF, 0xFF, 0xF1, 0xDC, 0x1D, 0xC3, 0xB8,
|
|
||||||
0xFF, 0xFF, 0xFF, 0x3B, 0x83, 0xB8, 0x77, 0x07, 0x70, 0x1C, 0x0E, 0x0F,
|
|
||||||
0xCF, 0xEE, 0x07, 0x03, 0x81, 0xFC, 0x7F, 0x0F, 0xC0, 0xE0, 0x74, 0x3F,
|
|
||||||
0xF9, 0xF8, 0x38, 0x1C, 0x00, 0x38, 0x38, 0x7C, 0x70, 0xC6, 0x70, 0xC6,
|
|
||||||
0xE0, 0xC6, 0xE0, 0xC7, 0xC0, 0x7D, 0xDC, 0x3B, 0xBE, 0x03, 0xE3, 0x07,
|
|
||||||
0x63, 0x07, 0x63, 0x0E, 0x63, 0x0E, 0x3E, 0x1C, 0x1C, 0x1E, 0x01, 0xF8,
|
|
||||||
0x1F, 0xE0, 0xE7, 0x07, 0x38, 0x1F, 0x80, 0xF8, 0x0F, 0xCE, 0xEF, 0x77,
|
|
||||||
0x3F, 0x38, 0xF9, 0xFF, 0xC7, 0xFF, 0x1F, 0xBC, 0xFF, 0xFF, 0xC0, 0x08,
|
|
||||||
0x73, 0x8E, 0x71, 0xCE, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x87, 0x1C, 0x38,
|
|
||||||
0xE1, 0xC2, 0x43, 0x87, 0x1C, 0x38, 0xE1, 0xC7, 0x1C, 0x71, 0xC7, 0x1C,
|
|
||||||
0x73, 0x8E, 0x71, 0xCE, 0x10, 0x1C, 0x0E, 0x17, 0x5F, 0xFF, 0xF9, 0xB1,
|
|
||||||
0xDC, 0x6C, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F, 0xFF, 0xFF, 0xFF, 0xF8,
|
|
||||||
0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0x77, 0x77, 0xEE, 0xFF, 0xFF, 0xC0,
|
|
||||||
0x6F, 0xF6, 0x01, 0xC0, 0xE0, 0x38, 0x0E, 0x07, 0x01, 0xC0, 0x70, 0x38,
|
|
||||||
0x0E, 0x03, 0x81, 0xC0, 0x70, 0x1C, 0x0E, 0x03, 0x80, 0xE0, 0x70, 0x1C,
|
|
||||||
0x07, 0x03, 0x80, 0x1C, 0x3F, 0x9F, 0xDE, 0xFE, 0x3F, 0x1F, 0x8F, 0xC7,
|
|
||||||
0xE3, 0xF1, 0xFD, 0xEF, 0xE7, 0xF0, 0xE0, 0x0E, 0x3D, 0xFF, 0xF6, 0xE1,
|
|
||||||
0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC0, 0x3E, 0x7F, 0xBF, 0xEC,
|
|
||||||
0x70, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0xFF, 0xFF, 0xFC,
|
|
||||||
0x3C, 0x7F, 0x3F, 0xC8, 0xE0, 0x70, 0x30, 0xF0, 0x7E, 0x07, 0x81, 0xE0,
|
|
||||||
0xFF, 0xFF, 0xF3, 0xF0, 0x07, 0x07, 0x87, 0xC3, 0xE3, 0xF3, 0xB9, 0x9D,
|
|
||||||
0xCE, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0x70, 0x38, 0x3F, 0x1F, 0x8F, 0xC7,
|
|
||||||
0x03, 0x83, 0xF1, 0xFC, 0xFF, 0x07, 0x81, 0xC0, 0xFF, 0xFF, 0xF3, 0xE0,
|
|
||||||
0x07, 0x0F, 0x8F, 0xCF, 0x07, 0x07, 0xF3, 0xFD, 0xFF, 0xE3, 0xF1, 0xF8,
|
|
||||||
0xEF, 0xF7, 0xF1, 0xF0, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0x70, 0x70,
|
|
||||||
0x38, 0x38, 0x1C, 0x0E, 0x0E, 0x07, 0x03, 0x80, 0x3E, 0x3F, 0xBF, 0xFC,
|
|
||||||
0x7E, 0x3F, 0xB9, 0xF8, 0xFE, 0xE7, 0xF1, 0xF8, 0xFF, 0xF7, 0xF1, 0xF0,
|
|
||||||
0x3E, 0x3F, 0xBF, 0xDC, 0x7E, 0x3F, 0x1F, 0xFE, 0xFF, 0x3F, 0x83, 0xC3,
|
|
||||||
0xCF, 0xC7, 0xC3, 0x80, 0x6F, 0xF6, 0x00, 0x06, 0xFF, 0x60, 0x33, 0xDE,
|
|
||||||
0x60, 0x00, 0x00, 0x73, 0x9C, 0xEE, 0x70, 0x01, 0x87, 0xEF, 0xFF, 0xF8,
|
|
||||||
0xE0, 0x3F, 0x8F, 0xFC, 0x7E, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xE0, 0x00,
|
|
||||||
0x07, 0xFF, 0xFF, 0xFF, 0x60, 0x3E, 0x3F, 0xE3, 0xF0, 0x38, 0xFF, 0xFE,
|
|
||||||
0xF8, 0x60, 0x00, 0x7C, 0xFE, 0xFF, 0x07, 0x07, 0x07, 0x0E, 0x1E, 0x3C,
|
|
||||||
0x38, 0x38, 0x00, 0x30, 0x78, 0x78, 0x30, 0x03, 0xF0, 0x07, 0xFE, 0x0F,
|
|
||||||
0x03, 0x86, 0x00, 0xE6, 0x1F, 0xB7, 0x3F, 0xCF, 0x3C, 0xE7, 0x9C, 0x73,
|
|
||||||
0xCE, 0x39, 0xE7, 0x1C, 0xF3, 0xCE, 0x5C, 0xFF, 0xE6, 0x3F, 0xE3, 0x80,
|
|
||||||
0x00, 0xF0, 0x00, 0x3F, 0xE0, 0x07, 0xF8, 0x00, 0x03, 0x80, 0x0F, 0x80,
|
|
||||||
0x1F, 0x00, 0x77, 0x00, 0xEE, 0x03, 0xDE, 0x07, 0x1C, 0x1E, 0x3C, 0x3F,
|
|
||||||
0xF8, 0x7F, 0xF1, 0xFF, 0xF3, 0x80, 0xE7, 0x01, 0xDC, 0x01, 0xC0, 0xFE,
|
|
||||||
0x3F, 0xCF, 0xFB, 0x8E, 0xE3, 0xBF, 0xCF, 0xF3, 0xFE, 0xE1, 0xF8, 0x7E,
|
|
||||||
0x1F, 0xFF, 0xFF, 0xBF, 0x80, 0x0F, 0xC7, 0xFD, 0xFF, 0xBC, 0x2F, 0x01,
|
|
||||||
0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1E, 0x01, 0xE0, 0x3F, 0xF3, 0xFE, 0x1F,
|
|
||||||
0x80, 0xFF, 0x0F, 0xFC, 0xFF, 0xEE, 0x1E, 0xE0, 0xFE, 0x07, 0xE0, 0x7E,
|
|
||||||
0x07, 0xE0, 0x7E, 0x0F, 0xE1, 0xEF, 0xFE, 0xFF, 0xCF, 0xF0, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFC, 0x0E, 0x07, 0xFB, 0xFD, 0xFE, 0xE0, 0x70, 0x38, 0x1F, 0xFF,
|
|
||||||
0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xFE, 0xFE, 0xFE, 0xE0, 0xE0,
|
|
||||||
0xE0, 0xE0, 0xE0, 0xE0, 0x0F, 0xC7, 0xFD, 0xFF, 0xBC, 0x2F, 0x01, 0xC0,
|
|
||||||
0x38, 0x07, 0x07, 0xE0, 0xFE, 0x1D, 0xE3, 0xBF, 0xF3, 0xFE, 0x1F, 0x80,
|
|
||||||
0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
|
|
||||||
0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xC0, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03,
|
|
||||||
0x81, 0xD1, 0xEF, 0xFF, 0xF3, 0xF0, 0xE0, 0xFE, 0x1E, 0xE3, 0xCE, 0x78,
|
|
||||||
0xEF, 0x0F, 0xE0, 0xFC, 0x0F, 0xC0, 0xEE, 0x0E, 0x70, 0xE7, 0x8E, 0x3C,
|
|
||||||
0xE1, 0xEE, 0x0F, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0,
|
|
||||||
0xE0, 0x70, 0x38, 0x1F, 0xFF, 0xFF, 0xFC, 0x70, 0x1C, 0xF0, 0x79, 0xE0,
|
|
||||||
0xF3, 0xE3, 0xE7, 0xC7, 0xDD, 0x8D, 0xFB, 0xBB, 0xF3, 0x67, 0xE7, 0xCF,
|
|
||||||
0xCF, 0x9F, 0x8E, 0x3F, 0x1C, 0x7E, 0x00, 0xFC, 0x01, 0xC0, 0xE0, 0xFE,
|
|
||||||
0x1F, 0xC3, 0xFC, 0x7F, 0xCF, 0xD9, 0xFB, 0xBF, 0x3F, 0xE7, 0xFC, 0x7F,
|
|
||||||
0x87, 0xF0, 0xFE, 0x0F, 0xC1, 0xC0, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF, 0x9E,
|
|
||||||
0x1E, 0xF0, 0x3F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0xF7,
|
|
||||||
0x87, 0x9F, 0xFE, 0x3F, 0xF0, 0x3F, 0x00, 0xFE, 0x3F, 0xEF, 0xFF, 0x87,
|
|
||||||
0xE1, 0xF8, 0x7F, 0xFF, 0xFE, 0xFE, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38,
|
|
||||||
0x00, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF, 0x9E, 0x1E, 0xF0, 0x3F, 0x80, 0x7E,
|
|
||||||
0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0,
|
|
||||||
0x3F, 0x00, 0x3C, 0x00, 0x7E, 0x00, 0x78, 0xFE, 0x1F, 0xF3, 0xFF, 0x70,
|
|
||||||
0xEE, 0x1D, 0xC3, 0xBF, 0xF7, 0xFC, 0xFF, 0x1C, 0xF3, 0x8E, 0x70, 0xEE,
|
|
||||||
0x1D, 0xC1, 0xC0, 0x3F, 0x1F, 0xEF, 0xFB, 0x80, 0xE0, 0x3E, 0x07, 0xF0,
|
|
||||||
0x7E, 0x03, 0xC0, 0x74, 0x1F, 0xFF, 0xFF, 0x9F, 0xC0, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0x87, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38,
|
|
||||||
0x07, 0x00, 0xE0, 0x1C, 0x00, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F,
|
|
||||||
0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0xC7, 0xBF, 0xE7, 0xFC, 0x3E,
|
|
||||||
0x00, 0xE0, 0x0E, 0xE0, 0x39, 0xC0, 0x71, 0xC1, 0xC3, 0x83, 0x87, 0x07,
|
|
||||||
0x07, 0x1C, 0x0E, 0x38, 0x0E, 0xE0, 0x1D, 0xC0, 0x1F, 0x00, 0x3E, 0x00,
|
|
||||||
0x7C, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xFC, 0x1C, 0x1D, 0xC3, 0x87, 0x38,
|
|
||||||
0x78, 0xE7, 0x1F, 0x1C, 0xE3, 0x63, 0x8E, 0x6C, 0xE1, 0xDD, 0xDC, 0x3B,
|
|
||||||
0xBB, 0x83, 0x63, 0x60, 0x7C, 0x7C, 0x0F, 0x8F, 0x81, 0xE0, 0xF0, 0x1C,
|
|
||||||
0x1C, 0x00, 0xF0, 0x3D, 0xE1, 0xE3, 0x87, 0x07, 0x38, 0x1F, 0xE0, 0x3F,
|
|
||||||
0x00, 0x78, 0x01, 0xE0, 0x0F, 0xC0, 0x7F, 0x81, 0xCE, 0x0E, 0x1C, 0x78,
|
|
||||||
0x7B, 0xC0, 0xF0, 0xE0, 0x3B, 0x83, 0x9C, 0x1C, 0x71, 0xC3, 0xDE, 0x0E,
|
|
||||||
0xE0, 0x3E, 0x01, 0xF0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70,
|
|
||||||
0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFC, 0x0E, 0x07, 0x03, 0x80, 0xE0, 0x70,
|
|
||||||
0x38, 0x1E, 0x07, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xCE, 0x73,
|
|
||||||
0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0xFF, 0xF0, 0xE0, 0x1C, 0x07,
|
|
||||||
0x01, 0xC0, 0x38, 0x0E, 0x03, 0x80, 0x70, 0x1C, 0x07, 0x00, 0xE0, 0x38,
|
|
||||||
0x0E, 0x01, 0xC0, 0x70, 0x1C, 0x03, 0x80, 0xE0, 0x38, 0x07, 0xFF, 0xFE,
|
|
||||||
0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x3F, 0xFF, 0xF0, 0x0E,
|
|
||||||
0x03, 0xE0, 0x7C, 0x1D, 0xC7, 0xBC, 0xE3, 0xB8, 0x3B, 0x06, 0xFF, 0xFF,
|
|
||||||
0xF0, 0x47, 0x1E, 0x20, 0x7E, 0x3F, 0x9F, 0xE0, 0x73, 0xFB, 0xFF, 0x8F,
|
|
||||||
0xC7, 0xFF, 0xBF, 0xCF, 0xE0, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x3F,
|
|
||||||
0xCF, 0xFB, 0xFE, 0xE3, 0xF8, 0x7E, 0x1F, 0x87, 0xE3, 0xFF, 0xEF, 0xFB,
|
|
||||||
0xF8, 0x1F, 0x3F, 0x7F, 0xF0, 0xE0, 0xE0, 0xE0, 0xF0, 0x7F, 0x7F, 0x1F,
|
|
||||||
0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC7, 0xF7, 0xFD, 0xFF, 0xF1, 0xF8,
|
|
||||||
0x7E, 0x1F, 0x87, 0xF1, 0xDF, 0xF7, 0xFC, 0x7F, 0x1F, 0x1F, 0xE7, 0xFF,
|
|
||||||
0x87, 0xFF, 0xFF, 0xFE, 0x03, 0xC0, 0x7F, 0x9F, 0xE1, 0xF8, 0x3F, 0x7E,
|
|
||||||
0xFE, 0xE0, 0xE0, 0xFE, 0xFE, 0xFE, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
|
|
||||||
0xE0, 0xE0, 0x1F, 0xDF, 0xF7, 0xFF, 0xC7, 0xE1, 0xF8, 0x7F, 0x1F, 0xFF,
|
|
||||||
0x7F, 0xCF, 0xF0, 0x1C, 0x0F, 0x7F, 0x9F, 0xE7, 0xE0, 0xE0, 0x38, 0x0E,
|
|
||||||
0x03, 0x80, 0xE0, 0x3F, 0xCF, 0xFB, 0xFF, 0xE3, 0xF8, 0x7E, 0x1F, 0x87,
|
|
||||||
0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1C,
|
|
||||||
0x71, 0xC7, 0x00, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1F,
|
|
||||||
0xFF, 0xBC, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC3, 0xB8, 0xE7,
|
|
||||||
0x38, 0xEE, 0x1F, 0x83, 0xF8, 0x77, 0x8E, 0x79, 0xC7, 0x38, 0x77, 0x07,
|
|
||||||
0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x7F, 0xE7, 0xFE, 0xF9,
|
|
||||||
0xFF, 0xFB, 0xFF, 0xFF, 0x1C, 0x7E, 0x38, 0xFC, 0x71, 0xF8, 0xE3, 0xF1,
|
|
||||||
0xC7, 0xE3, 0x8F, 0xC7, 0x1F, 0x8E, 0x38, 0xFF, 0x3F, 0xEF, 0xFF, 0x8F,
|
|
||||||
0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1C, 0x1E, 0x1F, 0xE7,
|
|
||||||
0xFB, 0xCF, 0xE1, 0xF8, 0x7E, 0x1F, 0xCF, 0x7F, 0x9F, 0xE1, 0xE0, 0xFE,
|
|
||||||
0x3F, 0xEF, 0xFB, 0x8F, 0xE1, 0xF8, 0x7E, 0x1F, 0x8F, 0xFF, 0xBF, 0xEF,
|
|
||||||
0xF3, 0x80, 0xE0, 0x38, 0x0E, 0x00, 0x1F, 0xDF, 0xF7, 0xFF, 0xC7, 0xE1,
|
|
||||||
0xF8, 0x7E, 0x1F, 0xC7, 0x7F, 0xDF, 0xF3, 0xFC, 0x07, 0x01, 0xC0, 0x70,
|
|
||||||
0x1C, 0x7F, 0xFF, 0xFF, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x80, 0x3E,
|
|
||||||
0xFE, 0xE0, 0xE0, 0xF8, 0x7E, 0x1F, 0x07, 0x87, 0xFF, 0xFC, 0xE1, 0xC3,
|
|
||||||
0x87, 0xFF, 0xFF, 0xF8, 0x70, 0xE1, 0xC3, 0x87, 0xF7, 0xE7, 0xC0, 0xE1,
|
|
||||||
0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0xC7, 0xFF, 0xDF, 0xF3,
|
|
||||||
0xFC, 0xE0, 0xFE, 0x1D, 0xC7, 0x38, 0xE7, 0xBC, 0x77, 0x0E, 0xE1, 0xFC,
|
|
||||||
0x1F, 0x03, 0xE0, 0x38, 0x00, 0xE3, 0x8F, 0xC7, 0x1D, 0x8E, 0x33, 0x9E,
|
|
||||||
0xE7, 0x7D, 0xCE, 0xDB, 0x8D, 0xB6, 0x1F, 0x7C, 0x3C, 0x78, 0x38, 0xE0,
|
|
||||||
0x71, 0xC0, 0xF1, 0xEF, 0x78, 0xEE, 0x1F, 0xC1, 0xF0, 0x1C, 0x07, 0xC1,
|
|
||||||
0xFC, 0x3B, 0x8F, 0x7B, 0xC7, 0x80, 0xE0, 0xFC, 0x1D, 0xC7, 0x38, 0xE7,
|
|
||||||
0x1C, 0x77, 0x0E, 0xE1, 0xFC, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x0F, 0xE1,
|
|
||||||
0xF8, 0x3E, 0x00, 0xFF, 0xFF, 0xFF, 0x0E, 0x1C, 0x38, 0x38, 0x70, 0xFF,
|
|
||||||
0xFF, 0xFF, 0x0E, 0x3C, 0xF9, 0xC3, 0x87, 0x0E, 0x1C, 0x79, 0xE3, 0xC7,
|
|
||||||
0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x7C, 0xF8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xF0, 0xE1, 0xE3, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x3C,
|
|
||||||
0x3C, 0x79, 0xF3, 0x87, 0x0E, 0x1C, 0x39, 0xF3, 0xE7, 0x00, 0x30, 0x9F,
|
|
||||||
0x3F, 0xFF, 0x3E, 0x43, 0x00 };
|
|
||||||
|
|
||||||
const GFXglyph Ubuntu_Bold10pt7bGlyphs[] PROGMEM = {
|
|
||||||
{ 0, 0, 0, 5, 0, 1 }, // 0x20 ' '
|
|
||||||
{ 0, 3, 14, 5, 1, -13 }, // 0x21 '!'
|
|
||||||
{ 6, 7, 6, 9, 1, -14 }, // 0x22 '"'
|
|
||||||
{ 12, 12, 14, 14, 1, -13 }, // 0x23 '#'
|
|
||||||
{ 33, 9, 17, 11, 1, -14 }, // 0x24 '$'
|
|
||||||
{ 53, 16, 14, 18, 1, -13 }, // 0x25 '%'
|
|
||||||
{ 81, 13, 14, 14, 1, -13 }, // 0x26 '&'
|
|
||||||
{ 104, 3, 6, 5, 1, -14 }, // 0x27 '''
|
|
||||||
{ 107, 6, 20, 7, 1, -15 }, // 0x28 '('
|
|
||||||
{ 122, 6, 20, 7, 0, -15 }, // 0x29 ')'
|
|
||||||
{ 137, 9, 8, 10, 1, -13 }, // 0x2A '*'
|
|
||||||
{ 146, 11, 11, 13, 1, -11 }, // 0x2B '+'
|
|
||||||
{ 162, 4, 6, 5, 0, -2 }, // 0x2C ','
|
|
||||||
{ 165, 6, 3, 8, 1, -7 }, // 0x2D '-'
|
|
||||||
{ 168, 4, 4, 6, 1, -3 }, // 0x2E '.'
|
|
||||||
{ 170, 10, 20, 9, -1, -15 }, // 0x2F '/'
|
|
||||||
{ 195, 9, 14, 11, 1, -13 }, // 0x30 '0'
|
|
||||||
{ 211, 7, 14, 11, 1, -13 }, // 0x31 '1'
|
|
||||||
{ 224, 9, 14, 11, 1, -13 }, // 0x32 '2'
|
|
||||||
{ 240, 9, 14, 11, 1, -13 }, // 0x33 '3'
|
|
||||||
{ 256, 9, 14, 11, 1, -13 }, // 0x34 '4'
|
|
||||||
{ 272, 9, 14, 11, 1, -13 }, // 0x35 '5'
|
|
||||||
{ 288, 9, 14, 11, 1, -13 }, // 0x36 '6'
|
|
||||||
{ 304, 9, 14, 11, 1, -13 }, // 0x37 '7'
|
|
||||||
{ 320, 9, 14, 11, 1, -13 }, // 0x38 '8'
|
|
||||||
{ 336, 9, 14, 11, 1, -13 }, // 0x39 '9'
|
|
||||||
{ 352, 4, 11, 6, 1, -10 }, // 0x3A ':'
|
|
||||||
{ 358, 5, 14, 6, 0, -10 }, // 0x3B ';'
|
|
||||||
{ 367, 10, 9, 11, 1, -9 }, // 0x3C '<'
|
|
||||||
{ 379, 9, 8, 11, 1, -9 }, // 0x3D '='
|
|
||||||
{ 388, 9, 9, 11, 1, -9 }, // 0x3E '>'
|
|
||||||
{ 399, 8, 16, 9, 0, -15 }, // 0x3F '?'
|
|
||||||
{ 415, 17, 17, 19, 1, -13 }, // 0x40 '@'
|
|
||||||
{ 452, 15, 14, 15, 0, -13 }, // 0x41 'A'
|
|
||||||
{ 479, 10, 14, 13, 2, -13 }, // 0x42 'B'
|
|
||||||
{ 497, 11, 14, 13, 1, -13 }, // 0x43 'C'
|
|
||||||
{ 517, 12, 14, 15, 2, -13 }, // 0x44 'D'
|
|
||||||
{ 538, 9, 14, 12, 2, -13 }, // 0x45 'E'
|
|
||||||
{ 554, 8, 14, 11, 2, -13 }, // 0x46 'F'
|
|
||||||
{ 568, 11, 14, 14, 1, -13 }, // 0x47 'G'
|
|
||||||
{ 588, 11, 14, 15, 2, -13 }, // 0x48 'H'
|
|
||||||
{ 608, 3, 14, 7, 2, -13 }, // 0x49 'I'
|
|
||||||
{ 614, 9, 14, 11, 0, -13 }, // 0x4A 'J'
|
|
||||||
{ 630, 12, 14, 14, 2, -13 }, // 0x4B 'K'
|
|
||||||
{ 651, 9, 14, 11, 2, -13 }, // 0x4C 'L'
|
|
||||||
{ 667, 15, 14, 17, 1, -13 }, // 0x4D 'M'
|
|
||||||
{ 694, 11, 14, 15, 2, -13 }, // 0x4E 'N'
|
|
||||||
{ 714, 14, 14, 16, 1, -13 }, // 0x4F 'O'
|
|
||||||
{ 739, 10, 14, 13, 2, -13 }, // 0x50 'P'
|
|
||||||
{ 757, 14, 17, 16, 1, -13 }, // 0x51 'Q'
|
|
||||||
{ 787, 11, 14, 13, 2, -13 }, // 0x52 'R'
|
|
||||||
{ 807, 10, 14, 12, 1, -13 }, // 0x53 'S'
|
|
||||||
{ 825, 11, 14, 11, 0, -13 }, // 0x54 'T'
|
|
||||||
{ 845, 11, 14, 15, 2, -13 }, // 0x55 'U'
|
|
||||||
{ 865, 15, 14, 15, 0, -13 }, // 0x56 'V'
|
|
||||||
{ 892, 19, 14, 19, 0, -13 }, // 0x57 'W'
|
|
||||||
{ 926, 14, 14, 14, 0, -13 }, // 0x58 'X'
|
|
||||||
{ 951, 13, 14, 13, 0, -13 }, // 0x59 'Y'
|
|
||||||
{ 974, 10, 14, 12, 1, -13 }, // 0x5A 'Z'
|
|
||||||
{ 992, 5, 20, 7, 2, -15 }, // 0x5B '['
|
|
||||||
{ 1005, 10, 20, 9, -1, -15 }, // 0x5C '\'
|
|
||||||
{ 1030, 5, 20, 7, 0, -15 }, // 0x5D ']'
|
|
||||||
{ 1043, 11, 8, 11, 0, -13 }, // 0x5E '^'
|
|
||||||
{ 1054, 10, 2, 10, 0, 3 }, // 0x5F '_'
|
|
||||||
{ 1057, 5, 4, 6, 1, -15 }, // 0x60 '`'
|
|
||||||
{ 1060, 9, 11, 11, 1, -10 }, // 0x61 'a'
|
|
||||||
{ 1073, 10, 16, 12, 1, -15 }, // 0x62 'b'
|
|
||||||
{ 1093, 8, 11, 10, 1, -10 }, // 0x63 'c'
|
|
||||||
{ 1104, 10, 16, 12, 1, -15 }, // 0x64 'd'
|
|
||||||
{ 1124, 10, 11, 12, 1, -10 }, // 0x65 'e'
|
|
||||||
{ 1138, 8, 16, 8, 1, -15 }, // 0x66 'f'
|
|
||||||
{ 1154, 10, 15, 12, 1, -10 }, // 0x67 'g'
|
|
||||||
{ 1173, 10, 16, 12, 1, -15 }, // 0x68 'h'
|
|
||||||
{ 1193, 3, 16, 5, 1, -15 }, // 0x69 'i'
|
|
||||||
{ 1199, 6, 20, 5, -2, -15 }, // 0x6A 'j'
|
|
||||||
{ 1214, 11, 16, 12, 1, -15 }, // 0x6B 'k'
|
|
||||||
{ 1236, 5, 16, 6, 1, -15 }, // 0x6C 'l'
|
|
||||||
{ 1246, 15, 11, 17, 1, -10 }, // 0x6D 'm'
|
|
||||||
{ 1267, 10, 11, 12, 1, -10 }, // 0x6E 'n'
|
|
||||||
{ 1281, 10, 11, 12, 1, -10 }, // 0x6F 'o'
|
|
||||||
{ 1295, 10, 15, 12, 1, -10 }, // 0x70 'p'
|
|
||||||
{ 1314, 10, 15, 12, 1, -10 }, // 0x71 'q'
|
|
||||||
{ 1333, 7, 11, 8, 1, -10 }, // 0x72 'r'
|
|
||||||
{ 1343, 8, 11, 10, 1, -10 }, // 0x73 's'
|
|
||||||
{ 1354, 7, 14, 9, 1, -13 }, // 0x74 't'
|
|
||||||
{ 1367, 10, 11, 12, 1, -10 }, // 0x75 'u'
|
|
||||||
{ 1381, 11, 11, 11, 0, -10 }, // 0x76 'v'
|
|
||||||
{ 1397, 15, 11, 15, 0, -10 }, // 0x77 'w'
|
|
||||||
{ 1418, 11, 11, 11, 0, -10 }, // 0x78 'x'
|
|
||||||
{ 1434, 11, 15, 11, 0, -10 }, // 0x79 'y'
|
|
||||||
{ 1455, 8, 11, 10, 1, -10 }, // 0x7A 'z'
|
|
||||||
{ 1466, 7, 20, 8, 1, -15 }, // 0x7B '{'
|
|
||||||
{ 1484, 3, 20, 7, 2, -15 }, // 0x7C '|'
|
|
||||||
{ 1492, 7, 20, 8, 0, -15 }, // 0x7D '}'
|
|
||||||
{ 1510, 10, 5, 11, 1, -8 } }; // 0x7E '~'
|
|
||||||
|
|
||||||
const GFXfont Ubuntu_Bold10pt7b PROGMEM = {
|
|
||||||
(uint8_t *)Ubuntu_Bold10pt7bBitmaps,
|
|
||||||
(GFXglyph *)Ubuntu_Bold10pt7bGlyphs,
|
|
||||||
0x20, 0x7E, 23 };
|
|
||||||
|
|
||||||
// Approx. 2189 bytes
|
|
||||||
@@ -1,290 +0,0 @@
|
|||||||
const uint8_t Ubuntu_Bold12pt7bBitmaps[] PROGMEM = {
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0x60, 0xF7, 0xFB, 0xFD,
|
|
||||||
0xFE, 0xFF, 0x7F, 0xBF, 0x9C, 0x0F, 0x3C, 0x1E, 0x78, 0x3C, 0xF0, 0xF3,
|
|
||||||
0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x3C, 0x3E, 0xF8, 0x79, 0xE3,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x9E, 0x1E, 0x78, 0x3C, 0xF0, 0x79,
|
|
||||||
0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xFC, 0x7F, 0xE7, 0xFE, 0xF0, 0x4F,
|
|
||||||
0x00, 0xF0, 0x0F, 0xF0, 0x7F, 0xC3, 0xFE, 0x07, 0xF0, 0x1F, 0x00, 0xF6,
|
|
||||||
0x0F, 0xFF, 0xEF, 0xFC, 0x3F, 0x80, 0xE0, 0x0E, 0x00, 0xE0, 0x3E, 0x0F,
|
|
||||||
0x07, 0xF0, 0xE0, 0xF7, 0x9E, 0x0E, 0x39, 0xC0, 0xE3, 0xBC, 0x0E, 0x3B,
|
|
||||||
0x80, 0xF7, 0xF8, 0x07, 0xF7, 0x00, 0x3E, 0xF7, 0xC0, 0x0E, 0xFE, 0x01,
|
|
||||||
0xFE, 0xF0, 0x1D, 0xC7, 0x03, 0xDC, 0x70, 0x39, 0xC7, 0x07, 0x9E, 0xF0,
|
|
||||||
0x70, 0xFE, 0x0F, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0xC0, 0x3F, 0xE0, 0x38,
|
|
||||||
0xE0, 0x38, 0xE0, 0x3D, 0xE0, 0x1F, 0xC0, 0x1F, 0x80, 0x3F, 0x9E, 0x7F,
|
|
||||||
0x9E, 0xF3, 0xDC, 0xF1, 0xFC, 0xF0, 0xF8, 0xF8, 0xF8, 0xFF, 0xFC, 0x7F,
|
|
||||||
0xFE, 0x1F, 0x9F, 0xFF, 0xFF, 0xFF, 0xE0, 0x08, 0x3C, 0xF1, 0xE7, 0x8F,
|
|
||||||
0x1E, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0x78, 0xF1, 0xE1,
|
|
||||||
0xE3, 0xC3, 0xC2, 0x00, 0x21, 0xE1, 0xE3, 0xC3, 0xC7, 0x8F, 0x0F, 0x1E,
|
|
||||||
0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x3C, 0x78, 0xF3, 0xC7, 0x9E, 0x08,
|
|
||||||
0x00, 0x0E, 0x01, 0xC1, 0x39, 0x7A, 0xFF, 0xFE, 0x1C, 0x06, 0xC1, 0xDC,
|
|
||||||
0x7B, 0xC2, 0x20, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0x7B, 0xDE, 0xF7, 0xBB, 0xCC,
|
|
||||||
0xFF, 0xFF, 0xF8, 0x6F, 0xF6, 0x00, 0xF0, 0x1F, 0x01, 0xE0, 0x1E, 0x03,
|
|
||||||
0xC0, 0x3C, 0x03, 0xC0, 0x78, 0x07, 0x80, 0x78, 0x0F, 0x00, 0xF0, 0x0F,
|
|
||||||
0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x03, 0xC0, 0x3C, 0x07, 0x80, 0x78,
|
|
||||||
0x0F, 0x80, 0xF0, 0x00, 0x0F, 0x03, 0xFC, 0x7F, 0xE7, 0x9E, 0x70, 0xEF,
|
|
||||||
0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xE7,
|
|
||||||
0x9E, 0x7F, 0xE3, 0xFC, 0x0F, 0x00, 0x07, 0x1F, 0x7F, 0xFF, 0xEF, 0x4F,
|
|
||||||
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F,
|
|
||||||
0x07, 0xFC, 0xFF, 0xE6, 0x3E, 0x01, 0xE0, 0x1E, 0x03, 0xE0, 0x3C, 0x07,
|
|
||||||
0x80, 0xF8, 0x3F, 0x03, 0xE0, 0x7C, 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xF0, 0x3E, 0x1F, 0xF3, 0xFF, 0x21, 0xE0, 0x3C, 0x07, 0x87, 0xE0, 0xF8,
|
|
||||||
0x1F, 0xC0, 0x78, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0xFF, 0xF7, 0xFC, 0x7F,
|
|
||||||
0x00, 0x03, 0xC0, 0x7C, 0x0F, 0xC0, 0xFC, 0x1F, 0xC3, 0xBC, 0x3B, 0xC7,
|
|
||||||
0x3C, 0x73, 0xCF, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3C, 0x03, 0xC0,
|
|
||||||
0x3C, 0x03, 0xC0, 0x3F, 0xE3, 0xFE, 0x3F, 0xE3, 0x80, 0x38, 0x07, 0x80,
|
|
||||||
0x7F, 0x07, 0xFC, 0x7F, 0xE0, 0x3F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x1F,
|
|
||||||
0xFF, 0xEF, 0xFC, 0x7F, 0x00, 0x01, 0xE0, 0xFE, 0x1F, 0xE3, 0xF0, 0x7C,
|
|
||||||
0x07, 0x80, 0xFF, 0x8F, 0xFE, 0xFF, 0xEF, 0x1F, 0xF0, 0xFF, 0x0F, 0xF0,
|
|
||||||
0xF7, 0x9F, 0x7F, 0xE3, 0xFC, 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
|
|
||||||
0x1E, 0x03, 0xE0, 0x7C, 0x07, 0x80, 0x78, 0x0F, 0x00, 0xF0, 0x1F, 0x01,
|
|
||||||
0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x03, 0xC0, 0x3C, 0x00, 0x1F, 0x83, 0xFE,
|
|
||||||
0x7F, 0xEF, 0x9F, 0xF0, 0xFF, 0x0F, 0xF9, 0xF7, 0xFE, 0x3F, 0xC7, 0xFE,
|
|
||||||
0xF9, 0xFF, 0x0F, 0xF0, 0xFF, 0x8F, 0xFF, 0xE7, 0xFE, 0x1F, 0x80, 0x1F,
|
|
||||||
0x03, 0xFC, 0x7F, 0xEF, 0x9E, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x8F, 0x7F,
|
|
||||||
0xF7, 0xFF, 0x1F, 0xF0, 0x1E, 0x03, 0xE0, 0x7C, 0x7F, 0x87, 0xF0, 0x78,
|
|
||||||
0x00, 0x6F, 0xF6, 0x00, 0x00, 0x06, 0xFF, 0x60, 0x33, 0xDE, 0x60, 0x00,
|
|
||||||
0x00, 0x03, 0xDE, 0xF7, 0xBD, 0xDE, 0x60, 0x00, 0x60, 0x3E, 0x1F, 0xFF,
|
|
||||||
0xFF, 0xFF, 0x8F, 0x00, 0xFF, 0x8F, 0xFF, 0x1F, 0xF0, 0x3E, 0x00, 0x60,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x60,
|
|
||||||
0x07, 0xC0, 0xFF, 0x8F, 0xFF, 0x1F, 0xF0, 0x0F, 0x1F, 0xFF, 0xFF, 0xFF,
|
|
||||||
0x87, 0xC0, 0x60, 0x00, 0x3E, 0x3F, 0xEF, 0xF9, 0x0F, 0x03, 0xC0, 0xF0,
|
|
||||||
0x7C, 0x1E, 0x0F, 0x83, 0xC1, 0xE0, 0x78, 0x1C, 0x07, 0x00, 0x00, 0x30,
|
|
||||||
0x1E, 0x07, 0x80, 0xC0, 0x01, 0xFC, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0,
|
|
||||||
0x7E, 0x07, 0xC3, 0xC0, 0x0F, 0x3C, 0x7E, 0x39, 0xC7, 0xF8, 0xFE, 0x7F,
|
|
||||||
0xC7, 0xE7, 0x8E, 0x3F, 0x38, 0x71, 0xF9, 0xC3, 0x8F, 0xCE, 0x1C, 0x7E,
|
|
||||||
0x78, 0xE7, 0x71, 0xFF, 0xF9, 0xCF, 0xFF, 0x8F, 0x1F, 0xF8, 0x3C, 0x00,
|
|
||||||
0x01, 0xF8, 0x00, 0x07, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x1F, 0xE0, 0x00,
|
|
||||||
0x03, 0xE0, 0x01, 0xF0, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x77, 0x00, 0x7B,
|
|
||||||
0xC0, 0x3D, 0xE0, 0x3C, 0x78, 0x1E, 0x3C, 0x0F, 0x1E, 0x0F, 0xFF, 0x87,
|
|
||||||
0xFF, 0xC3, 0xFF, 0xE3, 0xC0, 0x79, 0xE0, 0x3D, 0xF0, 0x1E, 0xF0, 0x07,
|
|
||||||
0x80, 0xFF, 0x87, 0xFF, 0x3F, 0xF9, 0xE3, 0xEF, 0x0F, 0x78, 0x7B, 0xC7,
|
|
||||||
0xDF, 0xFC, 0xFF, 0xE7, 0xFF, 0xBC, 0x3F, 0xE0, 0xFF, 0x07, 0xF8, 0x7F,
|
|
||||||
0xFF, 0xDF, 0xFC, 0xFF, 0x80, 0x07, 0xF0, 0x7F, 0xF3, 0xFF, 0xDF, 0x82,
|
|
||||||
0x78, 0x03, 0xE0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00,
|
|
||||||
0x3E, 0x00, 0x78, 0x01, 0xF0, 0x23, 0xFF, 0xC7, 0xFF, 0x07, 0xF0, 0xFF,
|
|
||||||
0x81, 0xFF, 0xE3, 0xFF, 0xE7, 0x87, 0xEF, 0x03, 0xDE, 0x07, 0xFC, 0x07,
|
|
||||||
0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x81, 0xFF, 0x03, 0xDE,
|
|
||||||
0x1F, 0xBF, 0xFE, 0x7F, 0xF8, 0xFF, 0x80, 0xFF, 0xEF, 0xFE, 0xFF, 0xEF,
|
|
||||||
0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE, 0xF0, 0x0F,
|
|
||||||
0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0xFE, 0xFF, 0xDF, 0xFB, 0xC0,
|
|
||||||
0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x00, 0x07, 0xF0, 0x7F,
|
|
||||||
0xF3, 0xFF, 0xDF, 0x02, 0x78, 0x03, 0xE0, 0x0F, 0x00, 0x3C, 0x00, 0xF0,
|
|
||||||
0x3F, 0xC0, 0xFF, 0x03, 0xFE, 0x0F, 0x78, 0x3D, 0xF0, 0xF3, 0xFF, 0xC7,
|
|
||||||
0xFF, 0x07, 0xF8, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F,
|
|
||||||
0xC0, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFC, 0x0F,
|
|
||||||
0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3C, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0,
|
|
||||||
0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E,
|
|
||||||
0x87, 0xDF, 0xF7, 0xFE, 0x3F, 0x00, 0xF0, 0xFF, 0xC7, 0xEF, 0x1F, 0x3C,
|
|
||||||
0xF8, 0xF7, 0xC3, 0xFE, 0x0F, 0xF0, 0x3F, 0x80, 0xFF, 0x03, 0xFC, 0x0F,
|
|
||||||
0x78, 0x3D, 0xF0, 0xF3, 0xE3, 0xC7, 0x8F, 0x1F, 0x3C, 0x3E, 0xF0, 0x7C,
|
|
||||||
0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00,
|
|
||||||
0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xF0, 0x78, 0x03, 0xCF, 0x80, 0xF9, 0xF0, 0x1F, 0x3F, 0x07, 0xE7,
|
|
||||||
0xE0, 0xFC, 0xFE, 0x3F, 0xBD, 0xC7, 0xFF, 0xBC, 0xEF, 0xF3, 0xB9, 0xFE,
|
|
||||||
0x77, 0x3F, 0xCF, 0xE7, 0xF8, 0xF8, 0xFF, 0x1F, 0x1F, 0xE1, 0xC3, 0xFC,
|
|
||||||
0x38, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xE0, 0xF0, 0x3F, 0xE0, 0xFF, 0x83,
|
|
||||||
0xFF, 0x0F, 0xFE, 0x3F, 0xF8, 0xFF, 0x73, 0xFD, 0xCF, 0xF3, 0xBF, 0xCF,
|
|
||||||
0xFF, 0x1F, 0xFC, 0x3F, 0xF0, 0xFF, 0xC1, 0xFF, 0x07, 0xFC, 0x0F, 0xF0,
|
|
||||||
0x3C, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x8F, 0x83, 0xE7, 0x80, 0xF7,
|
|
||||||
0xC0, 0x7F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01,
|
|
||||||
0xFF, 0x01, 0xF7, 0x80, 0xF3, 0xE0, 0xF8, 0xFF, 0xF8, 0x3F, 0xF8, 0x07,
|
|
||||||
0xF0, 0x00, 0xFF, 0x0F, 0xFC, 0xFF, 0xEF, 0x1F, 0xF0, 0xFF, 0x0F, 0xF0,
|
|
||||||
0xFF, 0x1F, 0xFF, 0xEF, 0xFC, 0xFF, 0x8F, 0x00, 0xF0, 0x0F, 0x00, 0xF0,
|
|
||||||
0x0F, 0x00, 0xF0, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x8F, 0x83,
|
|
||||||
0xE7, 0x80, 0xF7, 0xC0, 0x7F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8,
|
|
||||||
0x03, 0xFC, 0x01, 0xFF, 0x01, 0xF7, 0x80, 0xF3, 0xE0, 0xF8, 0xFF, 0xF8,
|
|
||||||
0x3F, 0xF8, 0x07, 0xF0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x1F, 0xE0, 0x07,
|
|
||||||
0xF0, 0x00, 0x70, 0xFF, 0x83, 0xFF, 0x8F, 0xFF, 0x3C, 0x3E, 0xF0, 0x7B,
|
|
||||||
0xC1, 0xEF, 0x07, 0xBC, 0x3E, 0xFF, 0xF3, 0xFF, 0x8F, 0xFC, 0x3C, 0xF8,
|
|
||||||
0xF1, 0xF3, 0xC3, 0xCF, 0x0F, 0xBC, 0x1E, 0xF0, 0x7C, 0x1F, 0x87, 0xFE,
|
|
||||||
0x7F, 0xCF, 0x04, 0xF0, 0x0F, 0x00, 0xFC, 0x07, 0xF8, 0x3F, 0xC0, 0xFE,
|
|
||||||
0x01, 0xF0, 0x0F, 0x00, 0xF4, 0x1F, 0xFF, 0xEF, 0xFE, 0x3F, 0x80, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01,
|
|
||||||
0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00,
|
|
||||||
0x78, 0x01, 0xE0, 0x07, 0x80, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF,
|
|
||||||
0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0,
|
|
||||||
0xFF, 0x07, 0xBC, 0x79, 0xFF, 0xC7, 0xFC, 0x0F, 0x80, 0xF0, 0x07, 0xFC,
|
|
||||||
0x07, 0x9E, 0x03, 0xCF, 0x01, 0xE7, 0xC1, 0xE1, 0xE0, 0xF0, 0xF0, 0x78,
|
|
||||||
0x3C, 0x78, 0x1E, 0x3C, 0x0F, 0x1E, 0x03, 0xDE, 0x01, 0xEF, 0x00, 0xF7,
|
|
||||||
0x80, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, 0x03, 0xE0, 0x00, 0xF0, 0x00,
|
|
||||||
0x1F, 0xE0, 0x00, 0x3F, 0xE0, 0xE0, 0xFB, 0xC3, 0xE1, 0xE7, 0x87, 0xC3,
|
|
||||||
0xCF, 0x0F, 0x87, 0x9E, 0x1F, 0x8F, 0x3C, 0x77, 0x3E, 0x7C, 0xEE, 0x7C,
|
|
||||||
0x7B, 0xDE, 0xF0, 0xF7, 0x1D, 0xE1, 0xEE, 0x3B, 0xC3, 0xFC, 0x7F, 0x83,
|
|
||||||
0xF0, 0x7E, 0x07, 0xE0, 0xFC, 0x0F, 0xC1, 0xF8, 0x1F, 0x01, 0xF0, 0xF8,
|
|
||||||
0x1F, 0x7C, 0x3E, 0x3C, 0x3C, 0x3E, 0x7C, 0x1F, 0xF8, 0x0F, 0xF0, 0x0F,
|
|
||||||
0xF0, 0x07, 0xE0, 0x03, 0xC0, 0x07, 0xE0, 0x0F, 0xF0, 0x0F, 0xF0, 0x1F,
|
|
||||||
0xF8, 0x3E, 0x7C, 0x3C, 0x3C, 0x7C, 0x3E, 0xF8, 0x1F, 0xF8, 0x1F, 0x78,
|
|
||||||
0x1E, 0x7C, 0x3E, 0x3C, 0x3C, 0x3E, 0x7C, 0x1E, 0xF8, 0x0F, 0xF0, 0x0F,
|
|
||||||
0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03,
|
|
||||||
0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
|
|
||||||
0x03, 0xE0, 0x1E, 0x01, 0xF0, 0x1F, 0x00, 0xF0, 0x0F, 0x80, 0xF8, 0x07,
|
|
||||||
0x80, 0x7C, 0x07, 0xC0, 0x3E, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF,
|
|
||||||
0xFF, 0xFF, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C,
|
|
||||||
0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0xFF, 0xFF, 0x80, 0xF0, 0x07, 0x80, 0x78,
|
|
||||||
0x07, 0x80, 0x3C, 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x0F,
|
|
||||||
0x00, 0xF0, 0x0F, 0x00, 0x78, 0x07, 0x80, 0x78, 0x03, 0xC0, 0x3C, 0x03,
|
|
||||||
0xC0, 0x1E, 0x01, 0xE0, 0x1E, 0x00, 0xF0, 0xFF, 0xFF, 0xF8, 0xF1, 0xE3,
|
|
||||||
0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78,
|
|
||||||
0xFF, 0xFF, 0xFF, 0x80, 0x07, 0x00, 0x7C, 0x03, 0xE0, 0x3F, 0x83, 0xDE,
|
|
||||||
0x1E, 0xF1, 0xE3, 0xCE, 0x0E, 0xF0, 0x79, 0x01, 0x00, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xF0, 0x23, 0xC7, 0x8F, 0x08, 0x7F, 0x1F, 0xE7, 0xFC, 0x0F, 0x03,
|
|
||||||
0xCF, 0xF7, 0xFF, 0xCF, 0xF3, 0xFC, 0xFF, 0xFD, 0xFF, 0x3F, 0x80, 0x70,
|
|
||||||
0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0x8F, 0xFC, 0xFF,
|
|
||||||
0xEF, 0x1F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x1E, 0xFF,
|
|
||||||
0xEF, 0xFC, 0x7F, 0x00, 0x0F, 0x8F, 0xF7, 0xFD, 0xE0, 0xF0, 0x3C, 0x0F,
|
|
||||||
0x03, 0xC0, 0xF0, 0x1E, 0x17, 0xFC, 0xFF, 0x0F, 0x80, 0x00, 0x70, 0x0F,
|
|
||||||
0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x1F, 0xF3, 0xFF, 0x7F, 0xFF, 0x8F,
|
|
||||||
0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xF7, 0x8F, 0x7F, 0xF3, 0xFF,
|
|
||||||
0x0F, 0xE0, 0x0F, 0x83, 0xFC, 0x7F, 0xE7, 0x9E, 0xF0, 0xFF, 0x0F, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xF0, 0x07, 0x82, 0x7F, 0xE3, 0xFE, 0x0F, 0xC0, 0x1F, 0x3F,
|
|
||||||
0x9F, 0xDF, 0x0F, 0x07, 0x83, 0xFD, 0xFE, 0xFF, 0x78, 0x3C, 0x1E, 0x0F,
|
|
||||||
0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x00, 0x1F, 0xC7, 0xFD, 0xFF,
|
|
||||||
0xFC, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF9, 0xEF, 0xFD, 0xFF, 0x9F,
|
|
||||||
0xF0, 0x1E, 0x87, 0xDF, 0xF3, 0xFE, 0x7F, 0x00, 0x70, 0x1E, 0x03, 0xC0,
|
|
||||||
0x78, 0x0F, 0x01, 0xE0, 0x3F, 0xE7, 0xFE, 0xFF, 0xDE, 0x7F, 0xC7, 0xF8,
|
|
||||||
0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0x80, 0xFF,
|
|
||||||
0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1E, 0x3C, 0x78,
|
|
||||||
0xF0, 0x00, 0x07, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E,
|
|
||||||
0x3C, 0x78, 0xFF, 0xFF, 0xBE, 0x00, 0x70, 0x0F, 0x00, 0xF0, 0x0F, 0x00,
|
|
||||||
0xF0, 0x0F, 0x00, 0xF1, 0xFF, 0x3E, 0xF7, 0xCF, 0xF8, 0xFF, 0x0F, 0xE0,
|
|
||||||
0xFF, 0x0F, 0xF8, 0xF7, 0x8F, 0x7C, 0xF3, 0xEF, 0x1E, 0xF1, 0xF0, 0x73,
|
|
||||||
0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3E, 0xFD,
|
|
||||||
0xF3, 0xC0, 0x7F, 0x3F, 0x3F, 0xFF, 0xEF, 0xFF, 0xFB, 0xCF, 0x9F, 0xF1,
|
|
||||||
0xE3, 0xFC, 0x78, 0xFF, 0x1E, 0x3F, 0xC7, 0x8F, 0xF1, 0xE3, 0xFC, 0x78,
|
|
||||||
0xFF, 0x1E, 0x3F, 0xC7, 0x8F, 0xF1, 0xE3, 0xC0, 0x7F, 0x1F, 0xFB, 0xFF,
|
|
||||||
0x79, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8,
|
|
||||||
0xFF, 0x1E, 0x0F, 0x81, 0xFF, 0x1F, 0xFC, 0xF1, 0xEF, 0x07, 0xF8, 0x3F,
|
|
||||||
0xC1, 0xFE, 0x0F, 0xF0, 0x7B, 0xC7, 0x9F, 0xFC, 0x7F, 0xC0, 0xF8, 0x00,
|
|
||||||
0x7F, 0x0F, 0xFC, 0xFF, 0xEF, 0x1E, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F,
|
|
||||||
0xF0, 0xFF, 0x1F, 0xFF, 0xEF, 0xFC, 0xFF, 0x8F, 0x00, 0xF0, 0x0F, 0x00,
|
|
||||||
0xF0, 0x00, 0x0F, 0xF1, 0xFF, 0xDF, 0xFE, 0xF0, 0xFF, 0x07, 0xF8, 0x3F,
|
|
||||||
0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0xC3, 0xDF, 0xFE, 0x7F, 0xF1, 0xFF, 0x80,
|
|
||||||
0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x3F, 0xFF, 0xFF, 0xFE, 0x0F, 0x07,
|
|
||||||
0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x00, 0x1F, 0x9F, 0xEF,
|
|
||||||
0xFB, 0xC0, 0xF0, 0x3F, 0xE7, 0xFC, 0xFF, 0x03, 0xE0, 0xFF, 0xFF, 0xFE,
|
|
||||||
0x7E, 0x00, 0x70, 0x78, 0x3C, 0x1E, 0x0F, 0xF7, 0xFB, 0xFD, 0xE0, 0xF0,
|
|
||||||
0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xFC, 0xFE, 0x3F, 0x00, 0xF1, 0xFE,
|
|
||||||
0x3F, 0xC7, 0xF8, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFF, 0x3D,
|
|
||||||
0xFF, 0xBF, 0xF1, 0xFC, 0xF0, 0x7F, 0xC7, 0xDE, 0x3C, 0xF1, 0xE7, 0x8F,
|
|
||||||
0x1C, 0xF0, 0xF7, 0x87, 0xBC, 0x3D, 0xC0, 0xFE, 0x07, 0xF0, 0x1F, 0x00,
|
|
||||||
0xF8, 0x00, 0xF0, 0xE1, 0xFE, 0x1C, 0x3D, 0xC7, 0xC7, 0x3C, 0xF9, 0xE7,
|
|
||||||
0x9F, 0x3C, 0xF7, 0xE7, 0x8E, 0xEE, 0xE1, 0xDD, 0xDC, 0x3F, 0x3F, 0x83,
|
|
||||||
0xE3, 0xE0, 0x7C, 0x7C, 0x0F, 0x07, 0x80, 0xE0, 0xE0, 0xF8, 0xFB, 0xC7,
|
|
||||||
0x8F, 0x78, 0x7B, 0xC1, 0xFC, 0x07, 0xC0, 0x1C, 0x01, 0xF0, 0x1F, 0xC1,
|
|
||||||
0xEF, 0x0F, 0x78, 0xFB, 0xEF, 0x8F, 0x80, 0xF0, 0x7F, 0xC7, 0xDE, 0x3C,
|
|
||||||
0xF1, 0xE7, 0x8F, 0x1E, 0xF0, 0xF7, 0x87, 0xBC, 0x1D, 0xC0, 0xFE, 0x07,
|
|
||||||
0xF0, 0x1F, 0x00, 0xF8, 0x0F, 0x83, 0xFC, 0x1F, 0xC0, 0xFC, 0x00, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFC, 0x3E, 0x0F, 0x87, 0xC3, 0xE0, 0xF8, 0x7C, 0x1F, 0x0F,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0x1F, 0x3F, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C,
|
|
||||||
0x3C, 0x7C, 0xF8, 0xF0, 0xF8, 0x7C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C,
|
|
||||||
0x3F, 0x1F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
|
|
||||||
0xF0, 0xF8, 0xFC, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3E, 0x1F, 0x0F,
|
|
||||||
0x1F, 0x3E, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0xFC, 0xF8, 0xF0, 0x38,
|
|
||||||
0x27, 0xE7, 0xFF, 0xFE, 0x7E, 0x41, 0xC0 };
|
|
||||||
|
|
||||||
const GFXglyph Ubuntu_Bold12pt7bGlyphs[] PROGMEM = {
|
|
||||||
{ 0, 0, 0, 6, 0, 1 }, // 0x20 ' '
|
|
||||||
{ 0, 4, 17, 8, 2, -16 }, // 0x21 '!'
|
|
||||||
{ 9, 9, 7, 11, 1, -17 }, // 0x22 '"'
|
|
||||||
{ 17, 15, 17, 17, 1, -16 }, // 0x23 '#'
|
|
||||||
{ 49, 12, 22, 14, 1, -18 }, // 0x24 '$'
|
|
||||||
{ 82, 20, 17, 22, 1, -16 }, // 0x25 '%'
|
|
||||||
{ 125, 16, 17, 17, 1, -16 }, // 0x26 '&'
|
|
||||||
{ 159, 4, 7, 6, 1, -17 }, // 0x27 '''
|
|
||||||
{ 163, 7, 23, 9, 2, -18 }, // 0x28 '('
|
|
||||||
{ 184, 7, 23, 9, 0, -18 }, // 0x29 ')'
|
|
||||||
{ 205, 11, 10, 12, 1, -16 }, // 0x2A '*'
|
|
||||||
{ 219, 11, 11, 13, 1, -12 }, // 0x2B '+'
|
|
||||||
{ 235, 5, 8, 6, 0, -3 }, // 0x2C ','
|
|
||||||
{ 240, 7, 3, 9, 1, -8 }, // 0x2D '-'
|
|
||||||
{ 243, 4, 4, 6, 1, -3 }, // 0x2E '.'
|
|
||||||
{ 245, 12, 23, 10, -1, -18 }, // 0x2F '/'
|
|
||||||
{ 280, 12, 17, 14, 1, -16 }, // 0x30 '0'
|
|
||||||
{ 306, 8, 17, 14, 2, -16 }, // 0x31 '1'
|
|
||||||
{ 323, 12, 17, 14, 1, -16 }, // 0x32 '2'
|
|
||||||
{ 349, 11, 17, 14, 1, -16 }, // 0x33 '3'
|
|
||||||
{ 373, 12, 17, 14, 1, -16 }, // 0x34 '4'
|
|
||||||
{ 399, 12, 17, 14, 1, -16 }, // 0x35 '5'
|
|
||||||
{ 425, 12, 17, 14, 1, -16 }, // 0x36 '6'
|
|
||||||
{ 451, 12, 17, 14, 1, -16 }, // 0x37 '7'
|
|
||||||
{ 477, 12, 17, 14, 1, -16 }, // 0x38 '8'
|
|
||||||
{ 503, 12, 17, 14, 1, -16 }, // 0x39 '9'
|
|
||||||
{ 529, 4, 13, 6, 1, -12 }, // 0x3A ':'
|
|
||||||
{ 536, 5, 17, 6, 0, -12 }, // 0x3B ';'
|
|
||||||
{ 547, 12, 11, 14, 1, -12 }, // 0x3C '<'
|
|
||||||
{ 564, 11, 8, 14, 2, -10 }, // 0x3D '='
|
|
||||||
{ 575, 12, 11, 14, 1, -12 }, // 0x3E '>'
|
|
||||||
{ 592, 10, 19, 11, 0, -18 }, // 0x3F '?'
|
|
||||||
{ 616, 21, 21, 23, 1, -16 }, // 0x40 '@'
|
|
||||||
{ 672, 17, 17, 17, 0, -16 }, // 0x41 'A'
|
|
||||||
{ 709, 13, 17, 16, 2, -16 }, // 0x42 'B'
|
|
||||||
{ 737, 14, 17, 16, 1, -16 }, // 0x43 'C'
|
|
||||||
{ 767, 15, 17, 18, 2, -16 }, // 0x44 'D'
|
|
||||||
{ 799, 12, 17, 15, 2, -16 }, // 0x45 'E'
|
|
||||||
{ 825, 11, 17, 14, 2, -16 }, // 0x46 'F'
|
|
||||||
{ 849, 14, 17, 17, 1, -16 }, // 0x47 'G'
|
|
||||||
{ 879, 14, 17, 18, 2, -16 }, // 0x48 'H'
|
|
||||||
{ 909, 4, 17, 8, 2, -16 }, // 0x49 'I'
|
|
||||||
{ 918, 11, 17, 13, 0, -16 }, // 0x4A 'J'
|
|
||||||
{ 942, 14, 17, 16, 2, -16 }, // 0x4B 'K'
|
|
||||||
{ 972, 12, 17, 14, 2, -16 }, // 0x4C 'L'
|
|
||||||
{ 998, 19, 17, 21, 1, -16 }, // 0x4D 'M'
|
|
||||||
{ 1039, 14, 17, 18, 2, -16 }, // 0x4E 'N'
|
|
||||||
{ 1069, 17, 17, 19, 1, -16 }, // 0x4F 'O'
|
|
||||||
{ 1106, 12, 17, 15, 2, -16 }, // 0x50 'P'
|
|
||||||
{ 1132, 17, 22, 19, 1, -16 }, // 0x51 'Q'
|
|
||||||
{ 1179, 14, 17, 16, 2, -16 }, // 0x52 'R'
|
|
||||||
{ 1209, 12, 17, 14, 1, -16 }, // 0x53 'S'
|
|
||||||
{ 1235, 14, 17, 14, 0, -16 }, // 0x54 'T'
|
|
||||||
{ 1265, 13, 17, 17, 2, -16 }, // 0x55 'U'
|
|
||||||
{ 1293, 17, 17, 17, 0, -16 }, // 0x56 'V'
|
|
||||||
{ 1330, 23, 17, 23, 0, -16 }, // 0x57 'W'
|
|
||||||
{ 1379, 16, 17, 16, 0, -16 }, // 0x58 'X'
|
|
||||||
{ 1413, 16, 17, 16, 0, -16 }, // 0x59 'Y'
|
|
||||||
{ 1447, 13, 17, 15, 1, -16 }, // 0x5A 'Z'
|
|
||||||
{ 1475, 7, 23, 9, 2, -18 }, // 0x5B '['
|
|
||||||
{ 1496, 12, 23, 10, -1, -18 }, // 0x5C '\'
|
|
||||||
{ 1531, 7, 23, 9, 0, -18 }, // 0x5D ']'
|
|
||||||
{ 1552, 13, 10, 13, 0, -16 }, // 0x5E '^'
|
|
||||||
{ 1569, 12, 3, 12, 0, 2 }, // 0x5F '_'
|
|
||||||
{ 1574, 6, 5, 7, 1, -18 }, // 0x60 '`'
|
|
||||||
{ 1578, 10, 13, 13, 1, -12 }, // 0x61 'a'
|
|
||||||
{ 1595, 12, 19, 15, 2, -18 }, // 0x62 'b'
|
|
||||||
{ 1624, 10, 13, 12, 1, -12 }, // 0x63 'c'
|
|
||||||
{ 1641, 12, 19, 15, 1, -18 }, // 0x64 'd'
|
|
||||||
{ 1670, 12, 13, 14, 1, -12 }, // 0x65 'e'
|
|
||||||
{ 1690, 9, 19, 10, 2, -18 }, // 0x66 'f'
|
|
||||||
{ 1712, 11, 17, 14, 1, -12 }, // 0x67 'g'
|
|
||||||
{ 1736, 11, 19, 15, 2, -18 }, // 0x68 'h'
|
|
||||||
{ 1763, 4, 19, 8, 2, -18 }, // 0x69 'i'
|
|
||||||
{ 1773, 7, 23, 6, -2, -18 }, // 0x6A 'j'
|
|
||||||
{ 1794, 12, 19, 14, 2, -18 }, // 0x6B 'k'
|
|
||||||
{ 1823, 6, 19, 8, 2, -18 }, // 0x6C 'l'
|
|
||||||
{ 1838, 18, 13, 22, 2, -12 }, // 0x6D 'm'
|
|
||||||
{ 1868, 11, 13, 15, 2, -12 }, // 0x6E 'n'
|
|
||||||
{ 1886, 13, 13, 15, 1, -12 }, // 0x6F 'o'
|
|
||||||
{ 1908, 12, 17, 15, 2, -12 }, // 0x70 'p'
|
|
||||||
{ 1934, 13, 17, 15, 1, -12 }, // 0x71 'q'
|
|
||||||
{ 1962, 9, 13, 11, 2, -12 }, // 0x72 'r'
|
|
||||||
{ 1977, 10, 13, 12, 1, -12 }, // 0x73 's'
|
|
||||||
{ 1994, 9, 17, 11, 2, -16 }, // 0x74 't'
|
|
||||||
{ 2014, 11, 13, 15, 2, -12 }, // 0x75 'u'
|
|
||||||
{ 2032, 13, 13, 13, 0, -12 }, // 0x76 'v'
|
|
||||||
{ 2054, 19, 13, 19, 0, -12 }, // 0x77 'w'
|
|
||||||
{ 2085, 13, 13, 13, 0, -12 }, // 0x78 'x'
|
|
||||||
{ 2107, 13, 17, 13, 0, -12 }, // 0x79 'y'
|
|
||||||
{ 2135, 10, 13, 12, 1, -12 }, // 0x7A 'z'
|
|
||||||
{ 2152, 8, 23, 9, 1, -18 }, // 0x7B '{'
|
|
||||||
{ 2175, 3, 23, 7, 2, -18 }, // 0x7C '|'
|
|
||||||
{ 2184, 8, 23, 9, 0, -18 }, // 0x7D '}'
|
|
||||||
{ 2207, 12, 5, 14, 1, -9 } }; // 0x7E '~'
|
|
||||||
|
|
||||||
const GFXfont Ubuntu_Bold12pt7b PROGMEM = {
|
|
||||||
(uint8_t *)Ubuntu_Bold12pt7bBitmaps,
|
|
||||||
(GFXglyph *)Ubuntu_Bold12pt7bGlyphs,
|
|
||||||
0x20, 0x7E, 28 };
|
|
||||||
|
|
||||||
// Approx. 2887 bytes
|
|
||||||
@@ -1,402 +0,0 @@
|
|||||||
const uint8_t Ubuntu_Bold16pt7bBitmaps[] PROGMEM = {
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x0E, 0xFF, 0xFF,
|
|
||||||
0xF7, 0x00, 0xF9, 0xFF, 0x9F, 0xF9, 0xFF, 0x9F, 0xF9, 0xFF, 0x9F, 0xF9,
|
|
||||||
0xFF, 0x1E, 0x70, 0xE0, 0x07, 0xCF, 0x81, 0xF3, 0xE0, 0x7D, 0xF8, 0x3E,
|
|
||||||
0x7C, 0x0F, 0x9F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xC7, 0xCF, 0x81, 0xF3, 0xE0, 0x7C, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0x7C, 0x0F, 0x9F, 0x07, 0xEF, 0x81, 0xF3,
|
|
||||||
0xE0, 0x7C, 0xF8, 0x00, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0xF8,
|
|
||||||
0x1F, 0xFE, 0x3F, 0xFE, 0x3F, 0xFC, 0x7E, 0x0C, 0x7C, 0x00, 0x7C, 0x00,
|
|
||||||
0x7E, 0x00, 0x7F, 0xE0, 0x3F, 0xF8, 0x1F, 0xFC, 0x0F, 0xFE, 0x01, 0xFF,
|
|
||||||
0x00, 0x3F, 0x00, 0x1F, 0x00, 0x1F, 0x70, 0x3F, 0x7F, 0xFE, 0xFF, 0xFE,
|
|
||||||
0xFF, 0xFC, 0x1F, 0xF0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
|
|
||||||
0x1F, 0x80, 0xF8, 0x0F, 0xF0, 0x3C, 0x07, 0xFE, 0x1F, 0x03, 0xE7, 0xC7,
|
|
||||||
0x80, 0xF0, 0xF3, 0xE0, 0x3C, 0x3C, 0xF0, 0x0F, 0x0F, 0x78, 0x03, 0xC3,
|
|
||||||
0xFE, 0x00, 0xF9, 0xFF, 0x00, 0x1F, 0xFF, 0xDF, 0x83, 0xFD, 0xEF, 0xF0,
|
|
||||||
0x7E, 0xFF, 0xFE, 0x00, 0x3F, 0xE7, 0xC0, 0x1F, 0xF0, 0xF0, 0x07, 0xBC,
|
|
||||||
0x3C, 0x03, 0xCF, 0x0F, 0x01, 0xF3, 0xC3, 0xC0, 0x78, 0xF9, 0xF0, 0x3E,
|
|
||||||
0x1F, 0xF8, 0x0F, 0x03, 0xFC, 0x07, 0xC0, 0x7E, 0x00, 0x07, 0xF0, 0x00,
|
|
||||||
0x7F, 0xE0, 0x07, 0xFF, 0x00, 0x7F, 0xFC, 0x03, 0xE3, 0xE0, 0x1F, 0x1F,
|
|
||||||
0x00, 0xFD, 0xF0, 0x03, 0xFF, 0x80, 0x1F, 0xF8, 0x00, 0xFF, 0x00, 0x0F,
|
|
||||||
0xFC, 0xF8, 0xFF, 0xF7, 0xC7, 0xDF, 0xBE, 0x7C, 0x7F, 0xE3, 0xE1, 0xFF,
|
|
||||||
0x1F, 0x07, 0xF0, 0xFC, 0x1F, 0x87, 0xFF, 0xFE, 0x1F, 0xFF, 0xF8, 0x7F,
|
|
||||||
0xFF, 0xE0, 0xFE, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x70, 0x04,
|
|
||||||
0x07, 0x87, 0xE3, 0xE3, 0xF1, 0xF1, 0xF8, 0xF8, 0x7C, 0x3E, 0x3E, 0x1F,
|
|
||||||
0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x07, 0xC3, 0xE1,
|
|
||||||
0xF0, 0xFC, 0x3E, 0x1F, 0x87, 0xC3, 0xF0, 0xF0, 0x20, 0x10, 0x3C, 0x3F,
|
|
||||||
0x0F, 0x87, 0xE1, 0xF0, 0xFC, 0x3E, 0x1F, 0x0F, 0x83, 0xE1, 0xF0, 0xF8,
|
|
||||||
0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF1, 0xF0, 0xF8, 0x7C, 0x7E,
|
|
||||||
0x3E, 0x3F, 0x1F, 0x1F, 0x87, 0x80, 0x80, 0x0F, 0x80, 0x7C, 0x1B, 0xCC,
|
|
||||||
0xEE, 0xEF, 0xFF, 0xFF, 0xFC, 0x1C, 0x03, 0xF8, 0x3D, 0xE3, 0xEF, 0x8E,
|
|
||||||
0x38, 0x11, 0x00, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x83,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x1E, 0x00, 0x78, 0x01, 0xE0,
|
|
||||||
0x07, 0x80, 0x1E, 0x00, 0x7D, 0xF7, 0xDF, 0x7D, 0xE7, 0xBE, 0xF0, 0xC0,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7B, 0xFF, 0xFF, 0xFD, 0xE0, 0x00, 0x3E,
|
|
||||||
0x00, 0xFC, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00,
|
|
||||||
0xFC, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00, 0xFC,
|
|
||||||
0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00, 0xFC, 0x01,
|
|
||||||
0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00, 0xFC, 0x01, 0xF0,
|
|
||||||
0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x3F,
|
|
||||||
0xFC, 0x3F, 0xFC, 0x7E, 0x7E, 0x7C, 0x3E, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8,
|
|
||||||
0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8,
|
|
||||||
0x1F, 0x7C, 0x3E, 0x7E, 0x7E, 0x3F, 0xFC, 0x3F, 0xFC, 0x1F, 0xF8, 0x07,
|
|
||||||
0xE0, 0x03, 0xC1, 0xF1, 0xFD, 0xFF, 0xFF, 0xFF, 0xF7, 0x7D, 0x1F, 0x07,
|
|
||||||
0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0,
|
|
||||||
0x7C, 0x1F, 0x07, 0xC0, 0x0F, 0xC0, 0x7F, 0xE3, 0xFF, 0xE7, 0xFF, 0xE7,
|
|
||||||
0x8F, 0xC4, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x03, 0xF0, 0x0F,
|
|
||||||
0xC0, 0x3F, 0x00, 0xFE, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x3E, 0x00,
|
|
||||||
0xFF, 0xFD, 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xE0, 0x1F, 0xC0, 0xFF, 0xE3,
|
|
||||||
0xFF, 0xE3, 0xFF, 0xE6, 0x0F, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x7C, 0x1F,
|
|
||||||
0xF8, 0x3F, 0xC0, 0x7F, 0xE0, 0xFF, 0xE0, 0x0F, 0xE0, 0x07, 0xC0, 0x0F,
|
|
||||||
0x80, 0x1F, 0x60, 0x7F, 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xC3, 0xFC, 0x00,
|
|
||||||
0x00, 0x7C, 0x00, 0xFC, 0x01, 0xFC, 0x03, 0xFC, 0x07, 0xFC, 0x0F, 0xFC,
|
|
||||||
0x0F, 0x7C, 0x1F, 0x7C, 0x3E, 0x7C, 0x3C, 0x7C, 0x78, 0x7C, 0xF8, 0x7C,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7C, 0x00, 0x7C,
|
|
||||||
0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x3F, 0xFC, 0x7F, 0xF8, 0xFF, 0xF1,
|
|
||||||
0xFF, 0xE3, 0xC0, 0x07, 0x80, 0x1F, 0x00, 0x3F, 0xC0, 0x7F, 0xF0, 0xFF,
|
|
||||||
0xF1, 0xFF, 0xF0, 0x0F, 0xF0, 0x07, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F,
|
|
||||||
0x40, 0x7F, 0xFF, 0xFB, 0xFF, 0xE7, 0xFF, 0x83, 0xFC, 0x00, 0x00, 0x3E,
|
|
||||||
0x01, 0xFE, 0x07, 0xFE, 0x0F, 0xFE, 0x1F, 0xE0, 0x3F, 0x00, 0x7E, 0x00,
|
|
||||||
0x7C, 0x00, 0xFF, 0xF0, 0xFF, 0xFC, 0xFF, 0xFE, 0xFF, 0xFE, 0xF8, 0x3F,
|
|
||||||
0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0x7C, 0x3F, 0x7F, 0xFE, 0x3F, 0xFC,
|
|
||||||
0x1F, 0xF8, 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0x00, 0x3E, 0x00, 0x7C, 0x00, 0xFC, 0x00, 0xF8, 0x01, 0xF8, 0x01, 0xF0,
|
|
||||||
0x01, 0xF0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x07, 0xC0, 0x07, 0xC0,
|
|
||||||
0x07, 0xC0, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0xE0,
|
|
||||||
0x3F, 0xF8, 0x7F, 0xFC, 0x7F, 0xFE, 0xFC, 0x7E, 0xF8, 0x3E, 0xF8, 0x3E,
|
|
||||||
0xFC, 0x7C, 0x7F, 0xFC, 0x3F, 0xF0, 0x3F, 0xFC, 0x7F, 0xFE, 0xFC, 0x3E,
|
|
||||||
0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC, 0x3F, 0x7F, 0xFE, 0x7F, 0xFE,
|
|
||||||
0x3F, 0xFC, 0x07, 0xF0, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE,
|
|
||||||
0xFC, 0x3E, 0xF8, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC, 0x1F, 0x7F, 0xFF,
|
|
||||||
0x7F, 0xFF, 0x3F, 0xFF, 0x0F, 0xDF, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0xFE,
|
|
||||||
0x03, 0xFC, 0x3F, 0xF8, 0x3F, 0xF0, 0x3F, 0xC0, 0x3E, 0x00, 0x7B, 0xFF,
|
|
||||||
0xFF, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0x78, 0x7B,
|
|
||||||
0xFF, 0xFF, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xF7, 0xDF, 0x7D,
|
|
||||||
0xE7, 0xBE, 0xF0, 0xC0, 0x00, 0x0C, 0x01, 0xF8, 0x3F, 0xFB, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0x3F, 0xE0, 0x7C, 0x00, 0xFF, 0x81, 0xFF, 0xF3, 0xFF,
|
|
||||||
0xFB, 0xFF, 0xF0, 0xFF, 0xE0, 0x1F, 0x80, 0x03, 0x00, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x60, 0x01, 0xF0, 0x0F, 0xFC, 0x3F,
|
|
||||||
0xFE, 0xFF, 0xFC, 0xFF, 0xF0, 0x3F, 0xC0, 0x1F, 0x03, 0xFC, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFE, 0xFF, 0xC1, 0xF0, 0x06, 0x00, 0x00, 0x3F, 0x8F, 0xFC,
|
|
||||||
0xFF, 0xE7, 0xFF, 0x63, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x03, 0xE0, 0x7E,
|
|
||||||
0x0F, 0xC0, 0xF8, 0x1F, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x00, 0x00, 0x00,
|
|
||||||
0x1E, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x01, 0xE0, 0x00, 0x7F, 0x80,
|
|
||||||
0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFF, 0xC0, 0x3F, 0x03, 0xF8, 0x1F, 0x00,
|
|
||||||
0x3F, 0x0F, 0x80, 0x03, 0xC3, 0xC1, 0xF8, 0x79, 0xE1, 0xFF, 0x1E, 0x78,
|
|
||||||
0xFF, 0xC7, 0xFE, 0x3C, 0xF0, 0xFF, 0x1E, 0x3C, 0x3F, 0xC7, 0x8F, 0x0F,
|
|
||||||
0xF1, 0xE3, 0xC3, 0xFC, 0x78, 0xF0, 0xFF, 0x1E, 0x3C, 0x3F, 0xC7, 0x8F,
|
|
||||||
0x0F, 0xF1, 0xE3, 0xC7, 0xBE, 0x3C, 0xF1, 0xE7, 0x8F, 0xFF, 0xF1, 0xE1,
|
|
||||||
0xFF, 0xF8, 0x3C, 0x3E, 0xF8, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00,
|
|
||||||
0x3F, 0x80, 0x40, 0x07, 0xFF, 0xF0, 0x00, 0x7F, 0xFC, 0x00, 0x03, 0xFE,
|
|
||||||
0x00, 0x00, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x07, 0xFC, 0x00,
|
|
||||||
0x3F, 0xF0, 0x03, 0xEF, 0x80, 0x1F, 0x7C, 0x00, 0xFB, 0xF0, 0x0F, 0x8F,
|
|
||||||
0x80, 0x7C, 0x7E, 0x03, 0xE3, 0xF0, 0x3E, 0x0F, 0x81, 0xFF, 0xFC, 0x1F,
|
|
||||||
0xFF, 0xF0, 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x7E, 0x03, 0xF3, 0xE0, 0x0F,
|
|
||||||
0x9F, 0x00, 0x7D, 0xF8, 0x03, 0xFF, 0x80, 0x0F, 0x80, 0xFF, 0xE0, 0x7F,
|
|
||||||
0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF, 0x83, 0xF7, 0xC0, 0xFB, 0xE0, 0x7D,
|
|
||||||
0xF0, 0x7E, 0xFF, 0xFE, 0x7F, 0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF, 0x81,
|
|
||||||
0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x1F, 0xFF, 0xFF, 0xBF,
|
|
||||||
0xFF, 0xDF, 0xFF, 0x87, 0xFF, 0x00, 0x01, 0xFC, 0x03, 0xFF, 0xC7, 0xFF,
|
|
||||||
0xE7, 0xFF, 0xE3, 0xF0, 0x33, 0xF0, 0x01, 0xF0, 0x01, 0xF0, 0x00, 0xF8,
|
|
||||||
0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03,
|
|
||||||
0xF0, 0x00, 0xFC, 0x00, 0x7F, 0x03, 0x1F, 0xFF, 0x87, 0xFF, 0xE1, 0xFF,
|
|
||||||
0xF0, 0x3F, 0xC0, 0xFF, 0xE0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0xFF,
|
|
||||||
0xCF, 0x83, 0xF9, 0xF0, 0x1F, 0xBE, 0x01, 0xF7, 0xC0, 0x3F, 0xF8, 0x03,
|
|
||||||
0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x0F,
|
|
||||||
0xFE, 0x01, 0xF7, 0xC0, 0x7E, 0xF8, 0x3F, 0x9F, 0xFF, 0xF3, 0xFF, 0xFC,
|
|
||||||
0x7F, 0xFE, 0x0F, 0xFE, 0x00, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF,
|
|
||||||
0xFE, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFC, 0xFF,
|
|
||||||
0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8,
|
|
||||||
0x00, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0x00, 0x3E, 0x00,
|
|
||||||
0x7C, 0x00, 0xFF, 0xFD, 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xEF, 0x80, 0x1F,
|
|
||||||
0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0,
|
|
||||||
0x0F, 0x80, 0x00, 0x01, 0xFE, 0x01, 0xFF, 0xF1, 0xFF, 0xFC, 0xFF, 0xFE,
|
|
||||||
0x3F, 0x01, 0x9F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E,
|
|
||||||
0x00, 0x0F, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xF7, 0xC0,
|
|
||||||
0x7D, 0xF8, 0x1F, 0x7F, 0x07, 0xCF, 0xFF, 0xF1, 0xFF, 0xFC, 0x3F, 0xFF,
|
|
||||||
0x01, 0xFF, 0x00, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01,
|
|
||||||
0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xF0, 0x07,
|
|
||||||
0xFE, 0x00, 0xFF, 0xC0, 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F,
|
|
||||||
0xFC, 0x01, 0xFF, 0x80, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x7C, 0x01, 0xF0, 0x07,
|
|
||||||
0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01,
|
|
||||||
0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x60,
|
|
||||||
0xFD, 0xFF, 0xEF, 0xFF, 0xBF, 0xFC, 0x1F, 0xC0, 0xF8, 0x1F, 0xDF, 0x07,
|
|
||||||
0xF3, 0xE1, 0xFC, 0x7C, 0x7F, 0x0F, 0x9F, 0xC1, 0xF7, 0xF0, 0x3F, 0xFC,
|
|
||||||
0x07, 0xFF, 0x00, 0xFF, 0xC0, 0x1F, 0xF0, 0x03, 0xFF, 0x00, 0x7F, 0xF0,
|
|
||||||
0x0F, 0xFF, 0x01, 0xF7, 0xE0, 0x3E, 0x7E, 0x07, 0xC7, 0xE0, 0xF8, 0x7E,
|
|
||||||
0x1F, 0x07, 0xE3, 0xE0, 0x7E, 0x7C, 0x0F, 0xEF, 0x80, 0xFE, 0xF8, 0x03,
|
|
||||||
0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00,
|
|
||||||
0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80,
|
|
||||||
0x3E, 0x00, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3E,
|
|
||||||
0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x3F, 0x00, 0xFC, 0x7F, 0x00, 0xFE, 0x7F,
|
|
||||||
0x80, 0xFE, 0x7F, 0x81, 0xFE, 0x7F, 0xC1, 0xFE, 0x7F, 0xC3, 0xFE, 0x7F,
|
|
||||||
0xE3, 0xFE, 0x7D, 0xE7, 0xBE, 0x79, 0xF7, 0x9E, 0x78, 0xF7, 0x9E, 0x78,
|
|
||||||
0xFF, 0x1E, 0xF8, 0x7F, 0x1E, 0xF8, 0x7E, 0x1F, 0xF8, 0x3E, 0x1F, 0xF8,
|
|
||||||
0x3E, 0x1F, 0xF8, 0x3C, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xF8,
|
|
||||||
0x00, 0x1F, 0xF8, 0x03, 0xFF, 0x80, 0x7F, 0xF8, 0x0F, 0xFF, 0x01, 0xFF,
|
|
||||||
0xF0, 0x3F, 0xFF, 0x07, 0xFF, 0xF0, 0xFF, 0xFF, 0x1F, 0xFB, 0xE3, 0xFF,
|
|
||||||
0x3E, 0x7F, 0xE3, 0xEF, 0xFC, 0x7D, 0xFF, 0x87, 0xFF, 0xF0, 0x7F, 0xFE,
|
|
||||||
0x07, 0xFF, 0xC0, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0xFF, 0xE0, 0x1F, 0xFC,
|
|
||||||
0x01, 0xFF, 0x80, 0x3E, 0x01, 0xF8, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83,
|
|
||||||
0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xE0, 0x7E, 0x7C, 0x03, 0xEF, 0x80, 0x1F,
|
|
||||||
0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01,
|
|
||||||
0xFF, 0x80, 0x1F, 0x7C, 0x03, 0xE7, 0xE0, 0x7E, 0x7F, 0x0F, 0xE3, 0xFF,
|
|
||||||
0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xF8, 0x00, 0xFF, 0xE0, 0x7F,
|
|
||||||
0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF, 0x83, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F,
|
|
||||||
0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x1F, 0xFF, 0xFF, 0xDF, 0xFF, 0xCF, 0xFF,
|
|
||||||
0xC7, 0xFF, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E,
|
|
||||||
0x00, 0x1F, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0xFF, 0xF0, 0x1F,
|
|
||||||
0xFF, 0x83, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xE0, 0x7E, 0x7C, 0x03, 0xEF,
|
|
||||||
0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F,
|
|
||||||
0xF8, 0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x03, 0xF7, 0xE0, 0x7E, 0x3F, 0x0F,
|
|
||||||
0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0xFF, 0xF0, 0x01, 0xFE, 0x00, 0x07,
|
|
||||||
0xC0, 0x00, 0x7F, 0x00, 0x03, 0xFE, 0x00, 0x1F, 0xE0, 0x00, 0xFC, 0x00,
|
|
||||||
0x03, 0xC0, 0xFF, 0xE0, 0x3F, 0xFF, 0x0F, 0xFF, 0xE3, 0xFF, 0xFC, 0xF8,
|
|
||||||
0x3F, 0xBE, 0x03, 0xEF, 0x80, 0xFB, 0xE0, 0x3E, 0xF8, 0x0F, 0xBE, 0x0F,
|
|
||||||
0xEF, 0xFF, 0xF3, 0xFF, 0xF8, 0xFF, 0xFC, 0x3F, 0xFE, 0x0F, 0x9F, 0xC3,
|
|
||||||
0xE3, 0xF0, 0xF8, 0x7E, 0x3E, 0x0F, 0xCF, 0x83, 0xF3, 0xE0, 0x7E, 0xF8,
|
|
||||||
0x0F, 0xC0, 0x07, 0xF0, 0x3F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFC, 0xFC, 0x0C,
|
|
||||||
0xF8, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0x7F, 0x80, 0x7F, 0xF0, 0x1F, 0xFC,
|
|
||||||
0x07, 0xFE, 0x00, 0xFF, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x1F, 0x70, 0x3F,
|
|
||||||
0x7F, 0xFF, 0xFF, 0xFE, 0xFF, 0xFC, 0x1F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07,
|
|
||||||
0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00,
|
|
||||||
0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8,
|
|
||||||
0x00, 0x7C, 0x00, 0x3E, 0x00, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F,
|
|
||||||
0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8,
|
|
||||||
0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01,
|
|
||||||
0xFF, 0x80, 0x7F, 0xF0, 0x3F, 0x7E, 0x1F, 0x9F, 0xFF, 0xE3, 0xFF, 0xF0,
|
|
||||||
0x7F, 0xF8, 0x07, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xE0, 0x0F, 0x9F, 0x00,
|
|
||||||
0x7C, 0xF8, 0x03, 0xE7, 0xE0, 0x3E, 0x1F, 0x01, 0xF0, 0xF8, 0x1F, 0x87,
|
|
||||||
0xE0, 0xF8, 0x1F, 0x07, 0xC0, 0xF8, 0x7E, 0x07, 0xE3, 0xE0, 0x1F, 0x1F,
|
|
||||||
0x00, 0xFD, 0xF8, 0x07, 0xEF, 0x80, 0x1F, 0x7C, 0x00, 0xFF, 0xE0, 0x03,
|
|
||||||
0xFE, 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x1F, 0xC0,
|
|
||||||
0x00, 0xF8, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x0F, 0xDF, 0x03, 0xE0, 0x7C,
|
|
||||||
0xF8, 0x1F, 0x03, 0xE7, 0xC1, 0xFC, 0x1F, 0x3E, 0x0F, 0xE0, 0xF8, 0xF0,
|
|
||||||
0x7F, 0x0F, 0x87, 0xC3, 0xF8, 0x7C, 0x3E, 0x3D, 0xE3, 0xE1, 0xF1, 0xEF,
|
|
||||||
0x1F, 0x07, 0x8F, 0x78, 0xF0, 0x3E, 0xFB, 0xEF, 0x81, 0xF7, 0x8F, 0x7C,
|
|
||||||
0x0F, 0xBC, 0x7B, 0xE0, 0x3D, 0xE3, 0xFE, 0x01, 0xFF, 0x1F, 0xF0, 0x0F,
|
|
||||||
0xF0, 0x7F, 0x80, 0x3F, 0x83, 0xF8, 0x01, 0xFC, 0x1F, 0xC0, 0x0F, 0xC0,
|
|
||||||
0x7E, 0x00, 0x3E, 0x03, 0xE0, 0x00, 0xFC, 0x01, 0xFB, 0xF0, 0x1F, 0x8F,
|
|
||||||
0xC1, 0xF8, 0x3E, 0x0F, 0x81, 0xF8, 0xFC, 0x07, 0xEF, 0xC0, 0x1F, 0xFC,
|
|
||||||
0x00, 0xFF, 0xE0, 0x03, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x3E, 0x00, 0x03,
|
|
||||||
0xF8, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0x80, 0x1F, 0xFC, 0x01, 0xFB, 0xF0,
|
|
||||||
0x1F, 0x8F, 0xC1, 0xF8, 0x3E, 0x0F, 0xC1, 0xF8, 0xFC, 0x07, 0xEF, 0xC0,
|
|
||||||
0x1F, 0x80, 0xFC, 0x01, 0xFB, 0xE0, 0x1F, 0x9F, 0x80, 0xFC, 0x7E, 0x0F,
|
|
||||||
0xC1, 0xF0, 0x7C, 0x0F, 0xC7, 0xE0, 0x3F, 0x7E, 0x01, 0xFB, 0xF0, 0x07,
|
|
||||||
0xFF, 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x0F, 0x80,
|
|
||||||
0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07,
|
|
||||||
0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7F, 0xFF,
|
|
||||||
0xBF, 0xFF, 0xDF, 0xFF, 0xEF, 0xFF, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03,
|
|
||||||
0xF0, 0x03, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xFC, 0x00,
|
|
||||||
0xFC, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7F, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E,
|
|
||||||
0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83,
|
|
||||||
0xE0, 0xF8, 0x3E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF8, 0x01, 0xF8,
|
|
||||||
0x01, 0xF0, 0x03, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x80,
|
|
||||||
0x1F, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF8, 0x01,
|
|
||||||
0xF0, 0x03, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x80, 0x1F,
|
|
||||||
0x00, 0x3E, 0x00, 0x7E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF8, 0x01, 0xF0,
|
|
||||||
0x03, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07,
|
|
||||||
0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0,
|
|
||||||
0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F,
|
|
||||||
0x07, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xC0, 0x01, 0xF0,
|
|
||||||
0x01, 0xFC, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0x7B, 0xC0, 0x7D, 0xF0, 0x7C,
|
|
||||||
0x7C, 0x3C, 0x1E, 0x3E, 0x0F, 0xBE, 0x03, 0xEF, 0x01, 0xE1, 0x00, 0x40,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0xE3, 0xE3, 0xE3,
|
|
||||||
0xE3, 0x82, 0x00, 0x1F, 0xE0, 0xFF, 0xC3, 0xFF, 0x8F, 0xFF, 0x00, 0xFC,
|
|
||||||
0x01, 0xF1, 0xFF, 0xDF, 0xFF, 0x7F, 0xFF, 0xF1, 0xFF, 0x87, 0xFE, 0x1F,
|
|
||||||
0xFF, 0xFD, 0xFF, 0xF7, 0xFF, 0xC7, 0xFC, 0x38, 0x00, 0xF8, 0x00, 0xF8,
|
|
||||||
0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFB,
|
|
||||||
0xE0, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xFE, 0xF8, 0x3E, 0xF8, 0x3F, 0xF8,
|
|
||||||
0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x3F, 0xF8, 0x7E, 0xFF,
|
|
||||||
0xFE, 0xFF, 0xFC, 0xFF, 0xF8, 0x3F, 0xE0, 0x03, 0xF8, 0x3F, 0xF3, 0xFF,
|
|
||||||
0xDF, 0xFE, 0x7E, 0x03, 0xF0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0,
|
|
||||||
0x0F, 0xC0, 0x1F, 0x80, 0x7F, 0xFC, 0xFF, 0xF1, 0xFF, 0xC1, 0xFE, 0x00,
|
|
||||||
0x07, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00,
|
|
||||||
0x1F, 0x00, 0x1F, 0x07, 0xDF, 0x1F, 0xFF, 0x3F, 0xFF, 0x7F, 0xFF, 0x7C,
|
|
||||||
0x1F, 0xFC, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC,
|
|
||||||
0x1F, 0x7E, 0x1F, 0x7F, 0xFF, 0x3F, 0xFF, 0x1F, 0xFF, 0x07, 0xFC, 0x07,
|
|
||||||
0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0x7C, 0x3F, 0xF8, 0x1F, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x04, 0x7F,
|
|
||||||
0xFE, 0x3F, 0xFE, 0x1F, 0xFE, 0x07, 0xF8, 0x0F, 0xE3, 0xFF, 0x7F, 0xE7,
|
|
||||||
0xFE, 0xFC, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xFF, 0xEF, 0xFE, 0xFF, 0xEF,
|
|
||||||
0xFE, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F,
|
|
||||||
0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0x07, 0xF8, 0x3F, 0xFC, 0xFF,
|
|
||||||
0xFB, 0xFF, 0xF7, 0xC3, 0xFF, 0x87, 0xFE, 0x0F, 0xFC, 0x1F, 0xF8, 0x3F,
|
|
||||||
0xF0, 0x7F, 0xF0, 0xFB, 0xFF, 0xF7, 0xFF, 0xE7, 0xFF, 0xC3, 0xFF, 0x80,
|
|
||||||
0x1F, 0x00, 0x3E, 0x40, 0xFD, 0xFF, 0xF3, 0xFF, 0xE7, 0xFF, 0x03, 0xF8,
|
|
||||||
0x00, 0x38, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F,
|
|
||||||
0x80, 0x3E, 0x00, 0xFF, 0xE3, 0xFF, 0xCF, 0xFF, 0xBF, 0xFE, 0xF8, 0xFF,
|
|
||||||
0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F,
|
|
||||||
0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0x77, 0xFF, 0xF7, 0x00, 0x00,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x07,
|
|
||||||
0xC3, 0xE1, 0xF0, 0x70, 0x00, 0x00, 0x00, 0x0F, 0x87, 0xC3, 0xE1, 0xF0,
|
|
||||||
0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E,
|
|
||||||
0x1F, 0x0F, 0x8F, 0xFF, 0xFF, 0xEF, 0xE7, 0xE0, 0x38, 0x01, 0xF0, 0x03,
|
|
||||||
0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8,
|
|
||||||
0xFF, 0xF1, 0xFB, 0xE7, 0xE7, 0xDF, 0x8F, 0xFF, 0x1F, 0xFC, 0x3F, 0xF0,
|
|
||||||
0x7F, 0xC0, 0xFF, 0xC1, 0xFF, 0xC3, 0xFF, 0xC7, 0xDF, 0x8F, 0x9F, 0x9F,
|
|
||||||
0x1F, 0xBE, 0x3F, 0x7C, 0x3F, 0x38, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
|
|
||||||
0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
|
|
||||||
0xFC, 0xFF, 0x7F, 0x7F, 0x1E, 0x3F, 0xC3, 0xF1, 0xFF, 0xFF, 0xF3, 0xFF,
|
|
||||||
0xFF, 0xF7, 0xFF, 0xFF, 0xEF, 0x8F, 0xC7, 0xFF, 0x0F, 0x87, 0xFE, 0x1F,
|
|
||||||
0x0F, 0xFC, 0x3E, 0x1F, 0xF8, 0x7C, 0x3F, 0xF0, 0xF8, 0x7F, 0xE1, 0xF0,
|
|
||||||
0xFF, 0xC3, 0xE1, 0xFF, 0x87, 0xC3, 0xFF, 0x0F, 0x87, 0xFE, 0x1F, 0x0F,
|
|
||||||
0xFC, 0x3E, 0x1F, 0x3F, 0xC3, 0xFF, 0xCF, 0xFF, 0xBF, 0xFE, 0xF8, 0xFF,
|
|
||||||
0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F,
|
|
||||||
0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0x07, 0xF0, 0x0F, 0xFE, 0x0F,
|
|
||||||
0xFF, 0x8F, 0xFF, 0xE7, 0xE3, 0xF7, 0xE0, 0xFF, 0xE0, 0x3F, 0xF0, 0x1F,
|
|
||||||
0xF8, 0x0F, 0xFC, 0x07, 0xFF, 0x07, 0xEF, 0xC7, 0xE7, 0xFF, 0xF1, 0xFF,
|
|
||||||
0xF0, 0x7F, 0xF0, 0x0F, 0xE0, 0x3F, 0xC0, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF,
|
|
||||||
0xFE, 0xF8, 0x7E, 0xF8, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8,
|
|
||||||
0x1F, 0xF8, 0x3F, 0xF8, 0x3E, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8, 0xFB,
|
|
||||||
0xF0, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8,
|
|
||||||
0x00, 0x03, 0xFE, 0x0F, 0xFF, 0xCF, 0xFF, 0xEF, 0xFF, 0xF7, 0xE0, 0xFF,
|
|
||||||
0xE0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFF, 0x03,
|
|
||||||
0xEF, 0xC1, 0xF7, 0xFF, 0xF9, 0xFF, 0xFC, 0x7F, 0xFE, 0x0F, 0xDF, 0x00,
|
|
||||||
0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C,
|
|
||||||
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8,
|
|
||||||
0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0x0F, 0xE1,
|
|
||||||
0xFF, 0x9F, 0xFD, 0xFF, 0xEF, 0x81, 0x7C, 0x03, 0xFF, 0xDF, 0xFE, 0x7F,
|
|
||||||
0xF9, 0xFF, 0xC0, 0x3F, 0x81, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0x8F, 0xF0,
|
|
||||||
0x38, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE,
|
|
||||||
0xFF, 0xEF, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80,
|
|
||||||
0xFC, 0x0F, 0xFE, 0x7F, 0xE3, 0xFF, 0x0F, 0xE0, 0xF8, 0x7F, 0xE1, 0xFF,
|
|
||||||
0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F,
|
|
||||||
0xE1, 0xFF, 0x87, 0xFF, 0x1F, 0x7F, 0xFD, 0xFF, 0xF3, 0xFF, 0xC3, 0xFC,
|
|
||||||
0xF8, 0x0F, 0xFE, 0x0F, 0xDF, 0x07, 0xCF, 0x83, 0xE7, 0xE3, 0xF1, 0xF1,
|
|
||||||
0xF0, 0xF8, 0xF8, 0x7E, 0xFC, 0x1F, 0x7C, 0x0F, 0xBE, 0x03, 0xFE, 0x01,
|
|
||||||
0xFF, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x07, 0xC0, 0xF8, 0x38,
|
|
||||||
0x1F, 0xF8, 0x3C, 0x1F, 0x7C, 0x7C, 0x3E, 0x7C, 0x7C, 0x3E, 0x7C, 0x7E,
|
|
||||||
0x3E, 0x3C, 0x7E, 0x3C, 0x3C, 0xFE, 0x3C, 0x3E, 0xEE, 0x7C, 0x1E, 0xEF,
|
|
||||||
0x78, 0x1E, 0xEF, 0x78, 0x1F, 0xE7, 0xF8, 0x0F, 0xC7, 0xF0, 0x0F, 0xC3,
|
|
||||||
0xF0, 0x0F, 0xC3, 0xF0, 0x07, 0x83, 0xE0, 0x07, 0x81, 0xE0, 0xFC, 0x1F,
|
|
||||||
0xBF, 0x1F, 0x8F, 0xDF, 0x87, 0xEF, 0xC1, 0xFF, 0xC0, 0x7F, 0xC0, 0x3F,
|
|
||||||
0xE0, 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xF8, 0x03, 0xFE, 0x03, 0xFF, 0x83,
|
|
||||||
0xF7, 0xE1, 0xFB, 0xF1, 0xF8, 0xFD, 0xF8, 0x3F, 0xF8, 0x0F, 0xFE, 0x0F,
|
|
||||||
0xDF, 0x07, 0xCF, 0x83, 0xE7, 0xC3, 0xF1, 0xF1, 0xF0, 0xF8, 0xF8, 0x7C,
|
|
||||||
0x78, 0x1F, 0x7C, 0x0F, 0xBE, 0x03, 0xDE, 0x01, 0xFF, 0x00, 0x7F, 0x00,
|
|
||||||
0x3F, 0x80, 0x0F, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x03, 0xE0, 0x1F, 0xF0,
|
|
||||||
0x1F, 0xF0, 0x0F, 0xF0, 0x03, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0x03, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF8, 0x1F, 0xC0, 0xFE,
|
|
||||||
0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03,
|
|
||||||
0xE1, 0xFC, 0x3F, 0x8F, 0xF1, 0xF8, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03,
|
|
||||||
0xE0, 0x7C, 0x0F, 0x83, 0xF1, 0xFC, 0x3F, 0x87, 0xE0, 0xFE, 0x07, 0xE0,
|
|
||||||
0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xF0, 0x7F,
|
|
||||||
0x87, 0xF0, 0x7E, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x83, 0xF8,
|
|
||||||
0x7F, 0x83, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F,
|
|
||||||
0x81, 0xF8, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE3, 0xF0, 0x7C, 0x0F, 0x81,
|
|
||||||
0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x07, 0xE3, 0xFC, 0x7F, 0x0F, 0xE1,
|
|
||||||
0xF0, 0x00, 0x1E, 0x06, 0x3F, 0x8F, 0x7F, 0xFF, 0xFF, 0xFE, 0xF1, 0xFC,
|
|
||||||
0x60, 0x78 };
|
|
||||||
|
|
||||||
const GFXglyph Ubuntu_Bold16pt7bGlyphs[] PROGMEM = {
|
|
||||||
{ 0, 0, 0, 7, 0, 1 }, // 0x20 ' '
|
|
||||||
{ 0, 5, 21, 9, 2, -20 }, // 0x21 '!'
|
|
||||||
{ 14, 12, 9, 14, 2, -23 }, // 0x22 '"'
|
|
||||||
{ 28, 18, 21, 22, 2, -20 }, // 0x23 '#'
|
|
||||||
{ 76, 16, 28, 18, 1, -23 }, // 0x24 '$'
|
|
||||||
{ 132, 26, 21, 28, 1, -20 }, // 0x25 '%'
|
|
||||||
{ 201, 21, 21, 22, 1, -20 }, // 0x26 '&'
|
|
||||||
{ 257, 5, 9, 9, 2, -23 }, // 0x27 '''
|
|
||||||
{ 263, 9, 30, 11, 2, -23 }, // 0x28 '('
|
|
||||||
{ 297, 9, 30, 11, 0, -23 }, // 0x29 ')'
|
|
||||||
{ 331, 13, 12, 16, 2, -20 }, // 0x2A '*'
|
|
||||||
{ 351, 14, 14, 18, 2, -15 }, // 0x2B '+'
|
|
||||||
{ 376, 6, 10, 8, 1, -4 }, // 0x2C ','
|
|
||||||
{ 384, 9, 4, 11, 1, -10 }, // 0x2D '-'
|
|
||||||
{ 389, 6, 6, 8, 1, -5 }, // 0x2E '.'
|
|
||||||
{ 394, 15, 30, 14, -1, -23 }, // 0x2F '/'
|
|
||||||
{ 451, 16, 21, 18, 1, -20 }, // 0x30 '0'
|
|
||||||
{ 493, 10, 21, 18, 3, -20 }, // 0x31 '1'
|
|
||||||
{ 520, 15, 21, 18, 1, -20 }, // 0x32 '2'
|
|
||||||
{ 560, 15, 21, 18, 1, -20 }, // 0x33 '3'
|
|
||||||
{ 600, 16, 21, 18, 1, -20 }, // 0x34 '4'
|
|
||||||
{ 642, 15, 21, 18, 1, -20 }, // 0x35 '5'
|
|
||||||
{ 682, 16, 21, 18, 1, -20 }, // 0x36 '6'
|
|
||||||
{ 724, 16, 21, 18, 1, -20 }, // 0x37 '7'
|
|
||||||
{ 766, 16, 21, 18, 1, -20 }, // 0x38 '8'
|
|
||||||
{ 808, 16, 21, 18, 1, -20 }, // 0x39 '9'
|
|
||||||
{ 850, 6, 17, 8, 1, -16 }, // 0x3A ':'
|
|
||||||
{ 863, 6, 22, 8, 1, -16 }, // 0x3B ';'
|
|
||||||
{ 880, 15, 15, 18, 1, -16 }, // 0x3C '<'
|
|
||||||
{ 909, 15, 11, 18, 1, -14 }, // 0x3D '='
|
|
||||||
{ 930, 14, 15, 18, 2, -16 }, // 0x3E '>'
|
|
||||||
{ 957, 12, 24, 14, 1, -23 }, // 0x3F '?'
|
|
||||||
{ 993, 26, 27, 30, 2, -21 }, // 0x40 '@'
|
|
||||||
{ 1081, 21, 21, 21, 0, -20 }, // 0x41 'A'
|
|
||||||
{ 1137, 17, 21, 21, 2, -20 }, // 0x42 'B'
|
|
||||||
{ 1182, 17, 21, 20, 2, -20 }, // 0x43 'C'
|
|
||||||
{ 1227, 19, 21, 23, 2, -20 }, // 0x44 'D'
|
|
||||||
{ 1277, 16, 21, 19, 2, -20 }, // 0x45 'E'
|
|
||||||
{ 1319, 15, 21, 18, 2, -20 }, // 0x46 'F'
|
|
||||||
{ 1359, 18, 21, 22, 2, -20 }, // 0x47 'G'
|
|
||||||
{ 1407, 19, 21, 23, 2, -20 }, // 0x48 'H'
|
|
||||||
{ 1457, 5, 21, 9, 2, -20 }, // 0x49 'I'
|
|
||||||
{ 1471, 14, 21, 16, 0, -20 }, // 0x4A 'J'
|
|
||||||
{ 1508, 19, 21, 21, 2, -20 }, // 0x4B 'K'
|
|
||||||
{ 1558, 14, 21, 17, 2, -20 }, // 0x4C 'L'
|
|
||||||
{ 1595, 24, 21, 28, 2, -20 }, // 0x4D 'M'
|
|
||||||
{ 1658, 19, 21, 23, 2, -20 }, // 0x4E 'N'
|
|
||||||
{ 1708, 20, 21, 24, 2, -20 }, // 0x4F 'O'
|
|
||||||
{ 1761, 17, 21, 20, 2, -20 }, // 0x50 'P'
|
|
||||||
{ 1806, 20, 27, 24, 2, -20 }, // 0x51 'Q'
|
|
||||||
{ 1874, 18, 21, 21, 2, -20 }, // 0x52 'R'
|
|
||||||
{ 1922, 16, 21, 18, 1, -20 }, // 0x53 'S'
|
|
||||||
{ 1964, 17, 21, 19, 1, -20 }, // 0x54 'T'
|
|
||||||
{ 2009, 18, 21, 22, 2, -20 }, // 0x55 'U'
|
|
||||||
{ 2057, 21, 21, 21, 0, -20 }, // 0x56 'V'
|
|
||||||
{ 2113, 29, 21, 31, 1, -20 }, // 0x57 'W'
|
|
||||||
{ 2190, 21, 21, 21, 0, -20 }, // 0x58 'X'
|
|
||||||
{ 2246, 21, 21, 21, 0, -20 }, // 0x59 'Y'
|
|
||||||
{ 2302, 17, 21, 19, 1, -20 }, // 0x5A 'Z'
|
|
||||||
{ 2347, 10, 30, 12, 2, -23 }, // 0x5B '['
|
|
||||||
{ 2385, 15, 30, 14, -1, -23 }, // 0x5C '\'
|
|
||||||
{ 2442, 10, 30, 12, 0, -23 }, // 0x5D ']'
|
|
||||||
{ 2480, 17, 13, 19, 1, -21 }, // 0x5E '^'
|
|
||||||
{ 2508, 16, 4, 16, 0, 3 }, // 0x5F '_'
|
|
||||||
{ 2516, 7, 7, 9, 1, -24 }, // 0x60 '`'
|
|
||||||
{ 2523, 14, 16, 17, 1, -15 }, // 0x61 'a'
|
|
||||||
{ 2551, 16, 24, 19, 2, -23 }, // 0x62 'b'
|
|
||||||
{ 2599, 14, 16, 16, 1, -15 }, // 0x63 'c'
|
|
||||||
{ 2627, 16, 24, 19, 1, -23 }, // 0x64 'd'
|
|
||||||
{ 2675, 16, 16, 18, 1, -15 }, // 0x65 'e'
|
|
||||||
{ 2707, 12, 24, 14, 2, -23 }, // 0x66 'f'
|
|
||||||
{ 2743, 15, 22, 18, 1, -15 }, // 0x67 'g'
|
|
||||||
{ 2785, 14, 24, 18, 2, -23 }, // 0x68 'h'
|
|
||||||
{ 2827, 5, 24, 9, 2, -23 }, // 0x69 'i'
|
|
||||||
{ 2842, 9, 30, 9, -2, -23 }, // 0x6A 'j'
|
|
||||||
{ 2876, 15, 24, 18, 2, -23 }, // 0x6B 'k'
|
|
||||||
{ 2921, 8, 24, 10, 2, -23 }, // 0x6C 'l'
|
|
||||||
{ 2945, 23, 16, 27, 2, -15 }, // 0x6D 'm'
|
|
||||||
{ 2991, 14, 16, 18, 2, -15 }, // 0x6E 'n'
|
|
||||||
{ 3019, 17, 16, 19, 1, -15 }, // 0x6F 'o'
|
|
||||||
{ 3053, 16, 22, 19, 2, -15 }, // 0x70 'p'
|
|
||||||
{ 3097, 17, 22, 19, 1, -15 }, // 0x71 'q'
|
|
||||||
{ 3144, 11, 16, 13, 2, -15 }, // 0x72 'r'
|
|
||||||
{ 3166, 13, 16, 15, 1, -15 }, // 0x73 's'
|
|
||||||
{ 3192, 12, 21, 15, 2, -20 }, // 0x74 't'
|
|
||||||
{ 3224, 14, 16, 18, 2, -15 }, // 0x75 'u'
|
|
||||||
{ 3252, 17, 16, 17, 0, -15 }, // 0x76 'v'
|
|
||||||
{ 3286, 24, 16, 24, 0, -15 }, // 0x77 'w'
|
|
||||||
{ 3334, 17, 16, 17, 0, -15 }, // 0x78 'x'
|
|
||||||
{ 3368, 17, 22, 17, 0, -15 }, // 0x79 'y'
|
|
||||||
{ 3415, 14, 16, 16, 1, -15 }, // 0x7A 'z'
|
|
||||||
{ 3443, 11, 30, 12, 1, -23 }, // 0x7B '{'
|
|
||||||
{ 3485, 4, 30, 10, 3, -23 }, // 0x7C '|'
|
|
||||||
{ 3500, 11, 30, 12, 0, -23 }, // 0x7D '}'
|
|
||||||
{ 3542, 16, 6, 18, 1, -11 } }; // 0x7E '~'
|
|
||||||
|
|
||||||
const GFXfont Ubuntu_Bold16pt7b PROGMEM = {
|
|
||||||
(uint8_t *)Ubuntu_Bold16pt7bBitmaps,
|
|
||||||
(GFXglyph *)Ubuntu_Bold16pt7bGlyphs,
|
|
||||||
0x20, 0x7E, 36 };
|
|
||||||
|
|
||||||
// Approx. 4226 bytes
|
|
||||||
@@ -1,578 +0,0 @@
|
|||||||
const uint8_t Ubuntu_Bold20pt7bBitmaps[] PROGMEM = {
|
|
||||||
0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E,
|
|
||||||
0x7E, 0x7E, 0x7E, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF,
|
|
||||||
0xFF, 0x7E, 0x3C, 0xFC, 0x7F, 0xF8, 0xFF, 0xF1, 0xFF, 0xE3, 0xFF, 0xC7,
|
|
||||||
0xFF, 0x8F, 0xFF, 0x1F, 0xFE, 0x3F, 0xF8, 0x7C, 0xF0, 0x79, 0xE0, 0xF0,
|
|
||||||
0x01, 0xF9, 0xF8, 0x03, 0xF3, 0xF0, 0x07, 0xEF, 0xE0, 0x1F, 0x9F, 0x80,
|
|
||||||
0x3F, 0x3F, 0x00, 0x7E, 0x7E, 0x00, 0xFC, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0x3F, 0x00, 0x7E,
|
|
||||||
0x7E, 0x01, 0xFD, 0xFC, 0x03, 0xF3, 0xF0, 0x07, 0xE7, 0xE0, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF9, 0xF8,
|
|
||||||
0x03, 0xF3, 0xF0, 0x07, 0xE7, 0xE0, 0x0F, 0xCF, 0xC0, 0x3F, 0xBF, 0x00,
|
|
||||||
0x7E, 0x7E, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03,
|
|
||||||
0xE0, 0x00, 0x7C, 0x00, 0x1F, 0xF0, 0x1F, 0xFF, 0x87, 0xFF, 0xF1, 0xFF,
|
|
||||||
0xFE, 0x3F, 0xFF, 0x8F, 0xE0, 0x71, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xF0,
|
|
||||||
0x00, 0xFF, 0x80, 0x1F, 0xFE, 0x01, 0xFF, 0xF0, 0x1F, 0xFF, 0x81, 0xFF,
|
|
||||||
0xF8, 0x0F, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0xFE, 0x00, 0x0F, 0xC0, 0x01,
|
|
||||||
0xF8, 0x00, 0x3F, 0x78, 0x0F, 0xEF, 0xFF, 0xF9, 0xFF, 0xFF, 0x7F, 0xFF,
|
|
||||||
0xC7, 0xFF, 0xF0, 0x1F, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8,
|
|
||||||
0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x0F, 0xF8,
|
|
||||||
0x01, 0xF8, 0x07, 0xFF, 0x00, 0x7E, 0x01, 0xFF, 0xC0, 0x3F, 0x00, 0xF8,
|
|
||||||
0xF8, 0x0F, 0x80, 0x3C, 0x1E, 0x07, 0xE0, 0x0F, 0x07, 0x83, 0xF0, 0x03,
|
|
||||||
0xC1, 0xE0, 0xF8, 0x00, 0xF0, 0x78, 0x7E, 0x00, 0x3C, 0x1E, 0x1F, 0x00,
|
|
||||||
0x0F, 0x07, 0x8F, 0xC0, 0x03, 0xE3, 0xE7, 0xE1, 0xF0, 0x7F, 0xF1, 0xF1,
|
|
||||||
0xFF, 0x1F, 0xFC, 0xFC, 0xFF, 0xE3, 0xFE, 0x3E, 0x3F, 0xF8, 0x3E, 0x1F,
|
|
||||||
0x9F, 0x1F, 0x00, 0x0F, 0xC7, 0x83, 0xC0, 0x03, 0xE1, 0xE0, 0xF0, 0x01,
|
|
||||||
0xF8, 0x78, 0x3C, 0x00, 0x7C, 0x1E, 0x0F, 0x00, 0x3F, 0x07, 0x83, 0xC0,
|
|
||||||
0x1F, 0x81, 0xE0, 0xF0, 0x07, 0xC0, 0x7C, 0x7C, 0x03, 0xF0, 0x0F, 0xFE,
|
|
||||||
0x01, 0xF8, 0x03, 0xFF, 0x80, 0x7E, 0x00, 0x7F, 0xC0, 0x3F, 0x00, 0x07,
|
|
||||||
0xC0, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x07,
|
|
||||||
0xFF, 0xF0, 0x01, 0xFF, 0xFE, 0x00, 0x3F, 0x8F, 0xC0, 0x07, 0xE1, 0xF8,
|
|
||||||
0x00, 0xFC, 0x3F, 0x00, 0x1F, 0xCF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F,
|
|
||||||
0xFE, 0x00, 0x03, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x3F, 0xFC, 0x3E,
|
|
||||||
0x0F, 0xFF, 0xC7, 0xE3, 0xFB, 0xFC, 0xFC, 0x7E, 0x3F, 0xFF, 0x1F, 0x83,
|
|
||||||
0xFF, 0xE3, 0xF0, 0x3F, 0xF8, 0x7E, 0x07, 0xFF, 0x0F, 0xC0, 0x7F, 0xC1,
|
|
||||||
0xFE, 0x07, 0xFC, 0x1F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF,
|
|
||||||
0xFF, 0x83, 0xFF, 0xF7, 0xF8, 0x0F, 0xF0, 0x7F, 0x80, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xF9, 0xE7, 0x80, 0x01, 0x00, 0x70, 0x1F, 0x87, 0xE0,
|
|
||||||
0xFC, 0x3F, 0x07, 0xE1, 0xF8, 0x3F, 0x07, 0xE1, 0xF8, 0x3F, 0x07, 0xE1,
|
|
||||||
0xFC, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8,
|
|
||||||
0x3F, 0x07, 0xE0, 0xFC, 0x0F, 0xC1, 0xF8, 0x3F, 0x03, 0xF0, 0x7E, 0x0F,
|
|
||||||
0xC0, 0xFC, 0x1F, 0x81, 0xF8, 0x3F, 0x03, 0xF0, 0x38, 0x02, 0x00, 0x10,
|
|
||||||
0x07, 0x03, 0xF0, 0x3F, 0x07, 0xE0, 0x7E, 0x0F, 0xC0, 0xFC, 0x1F, 0x83,
|
|
||||||
0xF0, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x81, 0xF8, 0x3F, 0x07, 0xE0, 0xFC,
|
|
||||||
0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x0F, 0xE1, 0xF8, 0x3F,
|
|
||||||
0x07, 0xE1, 0xF8, 0x3F, 0x07, 0xE1, 0xF8, 0x3F, 0x0F, 0xC1, 0xF8, 0x7E,
|
|
||||||
0x03, 0x80, 0x20, 0x00, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x0C, 0x7C,
|
|
||||||
0x67, 0x9C, 0xF3, 0xEE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0x03,
|
|
||||||
0xF8, 0x03, 0xDE, 0x03, 0xEF, 0x83, 0xF7, 0xE0, 0xF1, 0xE0, 0x38, 0xE0,
|
|
||||||
0x08, 0x20, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00,
|
|
||||||
0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0x00, 0x03, 0xE0, 0x00,
|
|
||||||
0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00,
|
|
||||||
0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7E, 0x7E, 0x7E, 0x7C, 0xFC, 0x18,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x38, 0xFB, 0xFF, 0xFF, 0xEF,
|
|
||||||
0x8E, 0x00, 0x00, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x00, 0x07, 0xE0,
|
|
||||||
0x01, 0xFC, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x00,
|
|
||||||
0x07, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00,
|
|
||||||
0x3F, 0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01,
|
|
||||||
0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07,
|
|
||||||
0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x3F,
|
|
||||||
0x00, 0x0F, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xF8,
|
|
||||||
0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00,
|
|
||||||
0x7F, 0xE0, 0x0F, 0xFF, 0x01, 0xFF, 0xF8, 0x3F, 0xFF, 0xC3, 0xF0, 0xFE,
|
|
||||||
0x7E, 0x07, 0xE7, 0xE0, 0x7E, 0xFE, 0x07, 0xEF, 0xC0, 0x3F, 0xFC, 0x03,
|
|
||||||
0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0,
|
|
||||||
0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x07, 0xF7, 0xE0, 0x7E, 0x7E,
|
|
||||||
0x07, 0xE7, 0xF0, 0xFE, 0x3F, 0xFF, 0xC1, 0xFF, 0xF8, 0x1F, 0xFF, 0x00,
|
|
||||||
0x7F, 0xE0, 0x01, 0xF8, 0x00, 0x00, 0xF8, 0x0F, 0xC0, 0xFE, 0x0F, 0xF1,
|
|
||||||
0xFF, 0xBF, 0xFF, 0xFF, 0xEF, 0xBF, 0x79, 0xF9, 0x0F, 0xC0, 0x7E, 0x03,
|
|
||||||
0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E,
|
|
||||||
0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0,
|
|
||||||
0x7E, 0x07, 0xF8, 0x03, 0xFF, 0xC1, 0xFF, 0xFC, 0x7F, 0xFF, 0xC7, 0xFF,
|
|
||||||
0xFC, 0xF8, 0x3F, 0x8C, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01,
|
|
||||||
0xF8, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, 0xFE, 0x00, 0x7F,
|
|
||||||
0x80, 0x1F, 0xE0, 0x07, 0xF8, 0x01, 0xFE, 0x00, 0x7F, 0x80, 0x0F, 0xE0,
|
|
||||||
0x03, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0xFF, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF,
|
|
||||||
0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x80, 0x07, 0xF0, 0x07, 0xFF, 0xC3, 0xFF,
|
|
||||||
0xFC, 0x3F, 0xFF, 0xC7, 0xFF, 0xF8, 0x70, 0x3F, 0x88, 0x03, 0xF0, 0x00,
|
|
||||||
0x7E, 0x00, 0x0F, 0xC0, 0x07, 0xF8, 0x3F, 0xFE, 0x07, 0xFF, 0x80, 0xFF,
|
|
||||||
0xE0, 0x1F, 0xFE, 0x03, 0xFF, 0xF0, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x00,
|
|
||||||
0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0xFE, 0xE0, 0x3F, 0xDF, 0xFF,
|
|
||||||
0xF7, 0xFF, 0xFE, 0xFF, 0xFF, 0x9F, 0xFF, 0xC0, 0x3F, 0xC0, 0x00, 0x00,
|
|
||||||
0x1F, 0x80, 0x03, 0xF8, 0x00, 0x7F, 0x80, 0x0F, 0xF8, 0x01, 0xFF, 0x80,
|
|
||||||
0x1F, 0xF8, 0x03, 0xFF, 0x80, 0x7F, 0xF8, 0x07, 0xDF, 0x80, 0xF9, 0xF8,
|
|
||||||
0x1F, 0x9F, 0x81, 0xF1, 0xF8, 0x3E, 0x1F, 0x83, 0xE1, 0xF8, 0x7C, 0x1F,
|
|
||||||
0x8F, 0xC1, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00,
|
|
||||||
0x1F, 0x80, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x1F, 0xFF, 0xC3, 0xFF, 0xF8,
|
|
||||||
0x7F, 0xFF, 0x0F, 0xFF, 0xE1, 0xFF, 0xFC, 0x3E, 0x00, 0x07, 0xC0, 0x00,
|
|
||||||
0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFF, 0x80, 0x1F, 0xFE, 0x03,
|
|
||||||
0xFF, 0xF0, 0x7F, 0xFF, 0x0F, 0xFF, 0xF0, 0x03, 0xFE, 0x00, 0x0F, 0xE0,
|
|
||||||
0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0xFE, 0xC0, 0x3F, 0xDF,
|
|
||||||
0xFF, 0xF7, 0xFF, 0xFC, 0xFF, 0xFF, 0x1F, 0xFF, 0xC0, 0x7F, 0xC0, 0x00,
|
|
||||||
0x00, 0x07, 0xC0, 0x07, 0xFC, 0x01, 0xFF, 0xC0, 0x3F, 0xFC, 0x0F, 0xFF,
|
|
||||||
0xC1, 0xFF, 0xC0, 0x1F, 0xE0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x07, 0xE0,
|
|
||||||
0x00, 0x7F, 0xFC, 0x0F, 0xFF, 0xF8, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0xFF,
|
|
||||||
0xFF, 0xEF, 0xC0, 0xFF, 0xFC, 0x07, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF,
|
|
||||||
0xC0, 0x3F, 0x7E, 0x07, 0xF7, 0xF0, 0xFE, 0x3F, 0xFF, 0xE3, 0xFF, 0xFC,
|
|
||||||
0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0xE0, 0x03, 0xF0,
|
|
||||||
0x01, 0xFC, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x07, 0xE0, 0x01,
|
|
||||||
0xF8, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x07, 0xE0, 0x01, 0xF8,
|
|
||||||
0x00, 0x7E, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00,
|
|
||||||
0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x03, 0xF8, 0x01,
|
|
||||||
0xFF, 0xC0, 0x7F, 0xFC, 0x1F, 0xFF, 0xC3, 0xFF, 0xFC, 0xFE, 0x3F, 0x9F,
|
|
||||||
0x83, 0xF3, 0xF0, 0x7E, 0x7E, 0x0F, 0xCF, 0xE3, 0xF0, 0xFE, 0x7E, 0x0F,
|
|
||||||
0xFF, 0x80, 0xFF, 0xE0, 0x1F, 0xFE, 0x07, 0xFF, 0xE1, 0xF9, 0xFE, 0x7E,
|
|
||||||
0x0F, 0xDF, 0x80, 0xFF, 0xF0, 0x1F, 0xFE, 0x03, 0xFF, 0xC0, 0x7F, 0xFC,
|
|
||||||
0x1F, 0xDF, 0xFF, 0xF3, 0xFF, 0xFE, 0x3F, 0xFF, 0x83, 0xFF, 0xE0, 0x0F,
|
|
||||||
0xE0, 0x00, 0x03, 0xF8, 0x01, 0xFF, 0xC0, 0x7F, 0xFC, 0x1F, 0xFF, 0xC7,
|
|
||||||
0xFF, 0xF8, 0xFE, 0x3F, 0xBF, 0x83, 0xF7, 0xE0, 0x3F, 0xFC, 0x07, 0xFF,
|
|
||||||
0x80, 0xFF, 0xF0, 0x1F, 0xFF, 0x03, 0xF7, 0xFF, 0xFE, 0xFF, 0xFF, 0xCF,
|
|
||||||
0xFF, 0xF8, 0xFF, 0xFF, 0x07, 0xFF, 0xE0, 0x01, 0xF8, 0x00, 0x7F, 0x00,
|
|
||||||
0x0F, 0xC0, 0x07, 0xF8, 0x07, 0xFE, 0x0F, 0xFF, 0x81, 0xFF, 0xE0, 0x3F,
|
|
||||||
0xF8, 0x07, 0xFC, 0x00, 0xF8, 0x00, 0x00, 0x38, 0xFB, 0xFF, 0xFF, 0xEF,
|
|
||||||
0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x3E, 0xFF, 0xFF, 0xFB,
|
|
||||||
0xE3, 0x80, 0x1C, 0x3E, 0x7F, 0x7F, 0x7F, 0x3E, 0x1C, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7E, 0x7E,
|
|
||||||
0x7E, 0x7C, 0xFC, 0x18, 0x00, 0x01, 0x80, 0x01, 0xF0, 0x01, 0xFF, 0x03,
|
|
||||||
0xFF, 0xE3, 0xFF, 0xFD, 0xFF, 0xFF, 0xBF, 0xFF, 0xC7, 0xFF, 0xC0, 0xFF,
|
|
||||||
0x80, 0x1F, 0x80, 0x03, 0xFE, 0x00, 0x7F, 0xFC, 0x0F, 0xFF, 0xF1, 0xFF,
|
|
||||||
0xFF, 0x8F, 0xFF, 0xF0, 0x3F, 0xFE, 0x00, 0x7F, 0xC0, 0x01, 0xF0, 0x00,
|
|
||||||
0x06, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x30, 0x00,
|
|
||||||
0x07, 0xC0, 0x01, 0xFF, 0x00, 0x3F, 0xFE, 0x07, 0xFF, 0xF8, 0xFF, 0xFF,
|
|
||||||
0xC7, 0xFF, 0xF8, 0x1F, 0xFF, 0x00, 0x3F, 0xE0, 0x00, 0xFC, 0x00, 0xFF,
|
|
||||||
0x81, 0xFF, 0xF1, 0xFF, 0xFE, 0xFF, 0xFF, 0xDF, 0xFF, 0xE3, 0xFF, 0xE0,
|
|
||||||
0x7F, 0xC0, 0x07, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x0F, 0xE0, 0x7F, 0xF8,
|
|
||||||
0xFF, 0xFC, 0x7F, 0xFE, 0x7F, 0xFF, 0x70, 0x7F, 0x00, 0x3F, 0x00, 0x3F,
|
|
||||||
0x00, 0x3F, 0x00, 0x7E, 0x00, 0xFE, 0x01, 0xFC, 0x01, 0xF8, 0x03, 0xF8,
|
|
||||||
0x03, 0xF0, 0x07, 0xE0, 0x07, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x03, 0x80, 0x07, 0xC0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0,
|
|
||||||
0x07, 0xC0, 0x03, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xE0,
|
|
||||||
0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFF, 0xE0, 0x07, 0xFC, 0x07,
|
|
||||||
0xFC, 0x03, 0xF8, 0x00, 0x3F, 0x81, 0xFC, 0x00, 0x07, 0xF0, 0x7C, 0x00,
|
|
||||||
0x00, 0xFC, 0x3F, 0x01, 0xFC, 0x1F, 0x8F, 0x81, 0xFF, 0xC3, 0xE7, 0xC1,
|
|
||||||
0xFF, 0xF0, 0xF9, 0xF0, 0x7F, 0xFC, 0x1F, 0xFC, 0x3F, 0x1F, 0x07, 0xFE,
|
|
||||||
0x0F, 0x87, 0xC1, 0xFF, 0x87, 0xC1, 0xF0, 0x7F, 0xE1, 0xF0, 0x7C, 0x1F,
|
|
||||||
0xF8, 0x7C, 0x1F, 0x07, 0xFE, 0x1F, 0x07, 0xC1, 0xFF, 0x87, 0xC1, 0xF0,
|
|
||||||
0x7F, 0xE1, 0xF0, 0x7C, 0x3E, 0xF8, 0x7E, 0x1F, 0x0F, 0xBF, 0x0F, 0xC7,
|
|
||||||
0xC7, 0xE7, 0xC3, 0xFF, 0xFF, 0xF1, 0xF0, 0x7F, 0xFF, 0xF8, 0x7E, 0x0F,
|
|
||||||
0xFF, 0xFC, 0x0F, 0x80, 0xF8, 0xFC, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x7E,
|
|
||||||
0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x20, 0x00,
|
|
||||||
0x3F, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xC0,
|
|
||||||
0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00,
|
|
||||||
0x01, 0xFF, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0xFF,
|
|
||||||
0xC0, 0x00, 0x7E, 0xF8, 0x00, 0x0F, 0xDF, 0x80, 0x01, 0xFB, 0xF0, 0x00,
|
|
||||||
0x7E, 0x3F, 0x00, 0x0F, 0xC7, 0xE0, 0x03, 0xF8, 0xFC, 0x00, 0x7E, 0x0F,
|
|
||||||
0xC0, 0x0F, 0xC1, 0xF8, 0x03, 0xF8, 0x3F, 0x80, 0x7E, 0x03, 0xF0, 0x0F,
|
|
||||||
0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF,
|
|
||||||
0x83, 0xFF, 0xFF, 0xF8, 0x7E, 0x00, 0x3F, 0x1F, 0xC0, 0x07, 0xE3, 0xF8,
|
|
||||||
0x00, 0xFE, 0x7E, 0x00, 0x0F, 0xDF, 0xC0, 0x01, 0xFB, 0xF8, 0x00, 0x3F,
|
|
||||||
0x80, 0x7F, 0xFC, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0xCF,
|
|
||||||
0xFF, 0xFF, 0x7E, 0x03, 0xFB, 0xF0, 0x0F, 0xDF, 0x80, 0x7E, 0xFC, 0x03,
|
|
||||||
0xF7, 0xE0, 0x7F, 0x3F, 0xFF, 0xF9, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F,
|
|
||||||
0xFF, 0xF3, 0xFF, 0xFF, 0xDF, 0x80, 0xFF, 0xFC, 0x03, 0xFF, 0xE0, 0x0F,
|
|
||||||
0xFF, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0xC0, 0x3F, 0xFE, 0x03, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xDF, 0xFF, 0xFC, 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x0F, 0xFF, 0x00,
|
|
||||||
0x00, 0x3F, 0xC0, 0x07, 0xFF, 0xE0, 0x7F, 0xFF, 0xC3, 0xFF, 0xFE, 0x1F,
|
|
||||||
0xFF, 0xF8, 0xFF, 0x81, 0xE3, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x7E, 0x00,
|
|
||||||
0x03, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03,
|
|
||||||
0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8,
|
|
||||||
0x00, 0x07, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00,
|
|
||||||
0xE1, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x0F, 0xFF, 0xE0,
|
|
||||||
0x07, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xE0,
|
|
||||||
0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFC, 0x07, 0xFC, 0xFC, 0x01, 0xFC,
|
|
||||||
0xFC, 0x00, 0xFE, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x3F,
|
|
||||||
0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F,
|
|
||||||
0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xFC, 0x00, 0x7E,
|
|
||||||
0xFC, 0x00, 0xFE, 0xFC, 0x01, 0xFC, 0xFC, 0x0F, 0xFC, 0xFF, 0xFF, 0xF8,
|
|
||||||
0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0x80, 0x7F, 0xF8, 0x00,
|
|
||||||
0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF,
|
|
||||||
0xEF, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0,
|
|
||||||
0x00, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF,
|
|
||||||
0xFF, 0xCF, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F,
|
|
||||||
0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0F, 0xC0, 0x03,
|
|
||||||
0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xFF, 0xFE, 0xFF,
|
|
||||||
0xFF, 0xBF, 0xFF, 0xEF, 0xFF, 0xFB, 0xFF, 0xFE, 0xFC, 0x00, 0x3F, 0x00,
|
|
||||||
0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03,
|
|
||||||
0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x7F, 0xC0,
|
|
||||||
0x07, 0xFF, 0xE0, 0x7F, 0xFF, 0xC3, 0xFF, 0xFE, 0x1F, 0xFF, 0xF8, 0xFF,
|
|
||||||
0x81, 0xE3, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF8, 0x00,
|
|
||||||
0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x03, 0xFF,
|
|
||||||
0xC0, 0x0F, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF8, 0x03, 0xF7, 0xE0,
|
|
||||||
0x0F, 0xDF, 0xC0, 0x3F, 0x7F, 0x80, 0xFC, 0xFF, 0x03, 0xF1, 0xFF, 0xFF,
|
|
||||||
0xC3, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x07, 0xFE, 0x00,
|
|
||||||
0xFC, 0x00, 0x7F, 0xF8, 0x00, 0xFF, 0xF0, 0x01, 0xFF, 0xE0, 0x03, 0xFF,
|
|
||||||
0xC0, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x1F, 0xFE, 0x00, 0x3F, 0xFC,
|
|
||||||
0x00, 0x7F, 0xF8, 0x00, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00,
|
|
||||||
0x7F, 0xF8, 0x00, 0xFF, 0xF0, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x07,
|
|
||||||
0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x1F, 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0x7F,
|
|
||||||
0xF8, 0x00, 0xFF, 0xF0, 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F,
|
|
||||||
0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0,
|
|
||||||
0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00,
|
|
||||||
0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F,
|
|
||||||
0x00, 0x1F, 0xDE, 0x0F, 0xE7, 0xFF, 0xF9, 0xFF, 0xFE, 0xFF, 0xFF, 0x1F,
|
|
||||||
0xFF, 0x00, 0xFF, 0x00, 0xFC, 0x01, 0xFE, 0xFC, 0x03, 0xFC, 0xFC, 0x07,
|
|
||||||
0xF8, 0xFC, 0x0F, 0xF0, 0xFC, 0x1F, 0xE0, 0xFC, 0x3F, 0xC0, 0xFC, 0x7F,
|
|
||||||
0x80, 0xFC, 0xFF, 0x00, 0xFD, 0xFE, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xF8,
|
|
||||||
0x00, 0xFF, 0xF0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0xFF, 0xF8,
|
|
||||||
0x00, 0xFF, 0xFC, 0x00, 0xFD, 0xFE, 0x00, 0xFC, 0xFE, 0x00, 0xFC, 0x7F,
|
|
||||||
0x00, 0xFC, 0x3F, 0x80, 0xFC, 0x3F, 0xC0, 0xFC, 0x1F, 0xE0, 0xFC, 0x0F,
|
|
||||||
0xF0, 0xFC, 0x07, 0xF8, 0xFC, 0x03, 0xFC, 0xFC, 0x01, 0xFE, 0xFC, 0x00,
|
|
||||||
0xFF, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00,
|
|
||||||
0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F,
|
|
||||||
0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0,
|
|
||||||
0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00,
|
|
||||||
0x3F, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFC, 0x3F, 0x00, 0x01, 0xF8, 0x7F, 0x00, 0x07, 0xF0, 0xFE, 0x00,
|
|
||||||
0x0F, 0xE1, 0xFE, 0x00, 0x3F, 0xC7, 0xFC, 0x00, 0x7F, 0xCF, 0xFC, 0x01,
|
|
||||||
0xFF, 0x9F, 0xF8, 0x03, 0xFF, 0x3F, 0xF8, 0x07, 0xFE, 0x7F, 0xF0, 0x1F,
|
|
||||||
0xFC, 0xFF, 0xE0, 0x3F, 0xF9, 0xFF, 0xE0, 0xFB, 0xF3, 0xF7, 0xC1, 0xF7,
|
|
||||||
0xE7, 0xEF, 0xC7, 0xEF, 0xCF, 0xCF, 0x8F, 0x9F, 0x9F, 0x9F, 0x1F, 0x3F,
|
|
||||||
0x3E, 0x1F, 0x7C, 0x3E, 0x7C, 0x3E, 0xF8, 0x7D, 0xF8, 0x7F, 0xE0, 0xFB,
|
|
||||||
0xF0, 0x7F, 0xC1, 0xFF, 0xE0, 0xFF, 0x03, 0xFF, 0xC0, 0xFE, 0x07, 0xFF,
|
|
||||||
0x81, 0xFC, 0x0F, 0xFF, 0x01, 0xF0, 0x1F, 0xFE, 0x03, 0xE0, 0x3F, 0xFC,
|
|
||||||
0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x01, 0xF8, 0xF8,
|
|
||||||
0x00, 0x7F, 0xF8, 0x00, 0xFF, 0xF8, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF8,
|
|
||||||
0x07, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF0,
|
|
||||||
0x7F, 0xFF, 0xF0, 0xFF, 0xF7, 0xE1, 0xFF, 0xE7, 0xE3, 0xFF, 0xCF, 0xE7,
|
|
||||||
0xFF, 0x8F, 0xCF, 0xFF, 0x0F, 0xDF, 0xFE, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF,
|
|
||||||
0xF8, 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0x3F, 0xFF,
|
|
||||||
0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xF8,
|
|
||||||
0x00, 0xFF, 0xF0, 0x00, 0xF8, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xFE, 0x00,
|
|
||||||
0x1F, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xF0, 0x7F, 0xC1,
|
|
||||||
0xFF, 0x0F, 0xE0, 0x0F, 0xE3, 0xF8, 0x00, 0xFE, 0x7E, 0x00, 0x0F, 0xDF,
|
|
||||||
0xC0, 0x01, 0xFF, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00,
|
|
||||||
0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFC,
|
|
||||||
0x00, 0x07, 0xFF, 0xC0, 0x01, 0xFD, 0xF8, 0x00, 0x3F, 0x3F, 0x80, 0x0F,
|
|
||||||
0xE3, 0xF8, 0x03, 0xF8, 0x7F, 0xC1, 0xFF, 0x07, 0xFF, 0xFF, 0xC0, 0x7F,
|
|
||||||
0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0xFF, 0x00,
|
|
||||||
0x00, 0x7F, 0xF8, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0xFF,
|
|
||||||
0xFF, 0xEF, 0xC0, 0xFE, 0xFC, 0x07, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF,
|
|
||||||
0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x7F, 0xFC, 0x0F, 0xEF, 0xFF, 0xFE,
|
|
||||||
0xFF, 0xFF, 0xCF, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F, 0xFF, 0x80, 0xFC, 0x00,
|
|
||||||
0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0,
|
|
||||||
0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x3F, 0x80,
|
|
||||||
0x00, 0x3F, 0xFE, 0x00, 0x1F, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0x01, 0xFF,
|
|
||||||
0xFF, 0xF0, 0x7F, 0xC1, 0xFF, 0x0F, 0xE0, 0x0F, 0xE3, 0xF8, 0x00, 0xFE,
|
|
||||||
0x7E, 0x00, 0x0F, 0xDF, 0xC0, 0x01, 0xFB, 0xF0, 0x00, 0x1F, 0xFE, 0x00,
|
|
||||||
0x03, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF,
|
|
||||||
0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, 0xC0, 0x01, 0xFD, 0xF8, 0x00,
|
|
||||||
0x3F, 0x3F, 0x80, 0x0F, 0xE7, 0xF8, 0x03, 0xF8, 0x7F, 0xC1, 0xFF, 0x07,
|
|
||||||
0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x00, 0x7F, 0xFE,
|
|
||||||
0x00, 0x01, 0xFF, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xFC, 0x00, 0x00,
|
|
||||||
0x1F, 0xF0, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0xFF,
|
|
||||||
0x00, 0x00, 0x03, 0xE0, 0x7F, 0xF8, 0x01, 0xFF, 0xFE, 0x03, 0xFF, 0xFF,
|
|
||||||
0x07, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0x1F, 0x81, 0xFE, 0x3F, 0x00, 0xFE,
|
|
||||||
0x7E, 0x00, 0xFC, 0xFC, 0x01, 0xF9, 0xF8, 0x03, 0xF3, 0xF0, 0x0F, 0xE7,
|
|
||||||
0xE0, 0x3F, 0x8F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0x7F,
|
|
||||||
0xFF, 0x80, 0xFF, 0xFF, 0x01, 0xF8, 0xFF, 0x03, 0xF0, 0xFE, 0x07, 0xE0,
|
|
||||||
0xFE, 0x0F, 0xC0, 0xFE, 0x1F, 0x81, 0xFE, 0x3F, 0x01, 0xFC, 0x7E, 0x01,
|
|
||||||
0xFC, 0xFC, 0x03, 0xFD, 0xF8, 0x03, 0xFB, 0xF0, 0x03, 0xF8, 0x03, 0xFE,
|
|
||||||
0x00, 0xFF, 0xFC, 0x3F, 0xFF, 0xE7, 0xFF, 0xFC, 0x7F, 0xFF, 0xCF, 0xE0,
|
|
||||||
0x1C, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F,
|
|
||||||
0xC0, 0x07, 0xFF, 0x80, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x07, 0xFF, 0xC0,
|
|
||||||
0x0F, 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x3F,
|
|
||||||
0x00, 0x03, 0xF7, 0x80, 0x7F, 0x7F, 0xFF, 0xE7, 0xFF, 0xFE, 0xFF, 0xFF,
|
|
||||||
0xC7, 0xFF, 0xF8, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0xF0, 0x00, 0x0F,
|
|
||||||
0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0,
|
|
||||||
0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00,
|
|
||||||
0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F,
|
|
||||||
0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00,
|
|
||||||
0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0xFF,
|
|
||||||
0xF0, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0,
|
|
||||||
0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, 0x03,
|
|
||||||
0xFF, 0xC0, 0x0F, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, 0x03, 0xFF,
|
|
||||||
0xC0, 0x0F, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, 0x03, 0xFF, 0xC0,
|
|
||||||
0x0F, 0xFF, 0x80, 0x7F, 0x7E, 0x01, 0xF9, 0xFE, 0x1F, 0xE7, 0xFF, 0xFF,
|
|
||||||
0x8F, 0xFF, 0xFC, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x1F, 0xE0, 0x00,
|
|
||||||
0xFE, 0x00, 0x0F, 0xEF, 0xC0, 0x01, 0xF9, 0xF8, 0x00, 0x3F, 0x3F, 0x80,
|
|
||||||
0x0F, 0xE3, 0xF0, 0x01, 0xF8, 0x7E, 0x00, 0x3F, 0x07, 0xE0, 0x0F, 0xC0,
|
|
||||||
0xFC, 0x01, 0xF8, 0x1F, 0x80, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x3F, 0x01,
|
|
||||||
0xF8, 0x07, 0xE0, 0x7E, 0x00, 0x7E, 0x0F, 0xC0, 0x0F, 0xC1, 0xF8, 0x00,
|
|
||||||
0xFC, 0x7E, 0x00, 0x1F, 0x8F, 0xC0, 0x03, 0xF1, 0xF8, 0x00, 0x3F, 0x7E,
|
|
||||||
0x00, 0x07, 0xEF, 0xC0, 0x00, 0x7D, 0xF0, 0x00, 0x0F, 0xFE, 0x00, 0x01,
|
|
||||||
0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x3F, 0x80,
|
|
||||||
0x00, 0x07, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x03,
|
|
||||||
0xFF, 0xC0, 0x00, 0x00, 0x7F, 0x7E, 0x00, 0x00, 0x07, 0xE7, 0xE0, 0x1F,
|
|
||||||
0x00, 0x7E, 0x7E, 0x03, 0xF8, 0x07, 0xE7, 0xE0, 0x3F, 0x80, 0x7E, 0x7E,
|
|
||||||
0x03, 0xF8, 0x0F, 0xE3, 0xF0, 0x3F, 0xC0, 0xFC, 0x3F, 0x07, 0xFC, 0x0F,
|
|
||||||
0xC3, 0xF0, 0x7F, 0xC0, 0xFC, 0x3F, 0x07, 0xFE, 0x0F, 0xC1, 0xF8, 0x7B,
|
|
||||||
0xE1, 0xF8, 0x1F, 0x8F, 0xBE, 0x1F, 0x81, 0xF8, 0xFB, 0xF1, 0xF8, 0x1F,
|
|
||||||
0x8F, 0x9F, 0x1F, 0x80, 0xFC, 0xF1, 0xF3, 0xF0, 0x0F, 0xDF, 0x1F, 0xBF,
|
|
||||||
0x00, 0xFD, 0xF0, 0xFB, 0xF0, 0x07, 0xDF, 0x0F, 0xBE, 0x00, 0x7F, 0xE0,
|
|
||||||
0xFF, 0xE0, 0x07, 0xFE, 0x07, 0xFE, 0x00, 0x7F, 0xE0, 0x7F, 0xE0, 0x03,
|
|
||||||
0xFC, 0x07, 0xFC, 0x00, 0x3F, 0xC0, 0x3F, 0xC0, 0x03, 0xFC, 0x03, 0xFC,
|
|
||||||
0x00, 0x1F, 0xC0, 0x3F, 0x80, 0x01, 0xF8, 0x01, 0xF8, 0x00, 0xFE, 0x00,
|
|
||||||
0x1F, 0xDF, 0xC0, 0x0F, 0xE3, 0xF8, 0x07, 0xF0, 0xFF, 0x03, 0xFC, 0x1F,
|
|
||||||
0xC0, 0xFE, 0x03, 0xF8, 0x7F, 0x00, 0x7F, 0x3F, 0x80, 0x1F, 0xCF, 0xE0,
|
|
||||||
0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF,
|
|
||||||
0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x03,
|
|
||||||
0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xFF, 0x00,
|
|
||||||
0x1F, 0xCF, 0xE0, 0x0F, 0xE3, 0xF8, 0x03, 0xF8, 0x7F, 0x01, 0xFC, 0x0F,
|
|
||||||
0xE0, 0xFE, 0x01, 0xFC, 0x3F, 0x80, 0x7F, 0x1F, 0xC0, 0x0F, 0xEF, 0xE0,
|
|
||||||
0x01, 0xFC, 0xFE, 0x00, 0x1F, 0xDF, 0xC0, 0x0F, 0xE7, 0xF0, 0x03, 0xF8,
|
|
||||||
0xFE, 0x01, 0xFC, 0x3F, 0x80, 0x7F, 0x07, 0xF0, 0x3F, 0x80, 0xFC, 0x1F,
|
|
||||||
0xC0, 0x3F, 0x87, 0xF0, 0x07, 0xF3, 0xF8, 0x01, 0xFC, 0xFE, 0x00, 0x3F,
|
|
||||||
0xFF, 0x00, 0x07, 0xFF, 0x80, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xF0, 0x00,
|
|
||||||
0x0F, 0xF8, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, 0xC0,
|
|
||||||
0x00, 0x03, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F,
|
|
||||||
0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00,
|
|
||||||
0x0F, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x7F, 0xFF, 0xFD, 0xFF, 0xFF, 0xF7,
|
|
||||||
0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFC, 0x00, 0x1F, 0xE0, 0x00,
|
|
||||||
0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF8,
|
|
||||||
0x00, 0x3F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0xC0, 0x01,
|
|
||||||
0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF0,
|
|
||||||
0x00, 0x3F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0,
|
|
||||||
0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E,
|
|
||||||
0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F,
|
|
||||||
0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xC0, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x03,
|
|
||||||
0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03,
|
|
||||||
0xF0, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x01,
|
|
||||||
0xF8, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00,
|
|
||||||
0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00,
|
|
||||||
0xFC, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00,
|
|
||||||
0x7E, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00,
|
|
||||||
0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F,
|
|
||||||
0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83,
|
|
||||||
0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0,
|
|
||||||
0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xC0, 0x00, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x07, 0xFC,
|
|
||||||
0x00, 0x7F, 0xF0, 0x03, 0xFF, 0x80, 0x3F, 0x7E, 0x01, 0xFB, 0xF0, 0x1F,
|
|
||||||
0x8F, 0xC1, 0xFC, 0x7F, 0x0F, 0xC1, 0xF8, 0xFC, 0x07, 0xE7, 0xE0, 0x3F,
|
|
||||||
0x7E, 0x00, 0xFC, 0xF0, 0x07, 0x81, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x10, 0x1C, 0x1E,
|
|
||||||
0x1F, 0x83, 0xE0, 0xF8, 0x3E, 0x0E, 0x02, 0x00, 0x0F, 0xF0, 0x1F, 0xFE,
|
|
||||||
0x0F, 0xFF, 0x87, 0xFF, 0xE1, 0xFF, 0xF0, 0x81, 0xFC, 0x00, 0x7E, 0x00,
|
|
||||||
0x3F, 0x0F, 0xFF, 0x9F, 0xFF, 0xDF, 0xFF, 0xEF, 0xFF, 0xFF, 0xE1, 0xFF,
|
|
||||||
0xE0, 0xFF, 0xF0, 0x7F, 0xFC, 0x3F, 0xFF, 0xFF, 0xBF, 0xFF, 0xDF, 0xFF,
|
|
||||||
0xE7, 0xFF, 0xF0, 0xFF, 0xC0, 0x1C, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00,
|
|
||||||
0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00,
|
|
||||||
0xFC, 0x00, 0x1F, 0xBF, 0x03, 0xFF, 0xF8, 0x7F, 0xFF, 0x8F, 0xFF, 0xF9,
|
|
||||||
0xFF, 0xFF, 0xBF, 0x87, 0xF7, 0xE0, 0x7F, 0xFC, 0x07, 0xFF, 0x80, 0xFF,
|
|
||||||
0xF0, 0x1F, 0xFE, 0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF, 0x03, 0xFF,
|
|
||||||
0xE0, 0x7E, 0xFC, 0x1F, 0xDF, 0xFF, 0xF3, 0xFF, 0xFE, 0x7F, 0xFF, 0x8F,
|
|
||||||
0xFF, 0xC0, 0x3F, 0xE0, 0x00, 0x01, 0xFE, 0x03, 0xFF, 0xC3, 0xFF, 0xE3,
|
|
||||||
0xFF, 0xE3, 0xFF, 0xF3, 0xFC, 0x09, 0xF8, 0x01, 0xFC, 0x00, 0xFC, 0x00,
|
|
||||||
0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xF0, 0x01, 0xF8,
|
|
||||||
0x00, 0xFF, 0x02, 0x7F, 0xFF, 0x1F, 0xFF, 0xC7, 0xFF, 0xE1, 0xFF, 0xF0,
|
|
||||||
0x1F, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0,
|
|
||||||
0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0,
|
|
||||||
0x7E, 0xFC, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, 0xFF, 0xFE, 0xFF, 0xFF, 0xDF,
|
|
||||||
0xC3, 0xFB, 0xF0, 0x3F, 0xFC, 0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x1F, 0xFE,
|
|
||||||
0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF, 0x81, 0xFB, 0xF0, 0x3F, 0x7F,
|
|
||||||
0x07, 0xEF, 0xFF, 0xFC, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0xFF, 0xFE, 0x03,
|
|
||||||
0xFE, 0x00, 0x01, 0xF8, 0x01, 0xFF, 0xC0, 0x7F, 0xFC, 0x1F, 0xFF, 0xC3,
|
|
||||||
0xFF, 0xFC, 0xFE, 0x1F, 0x9F, 0x81, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x01, 0xF8, 0x00, 0x1F,
|
|
||||||
0x80, 0x03, 0xFC, 0x04, 0x7F, 0xFF, 0x87, 0xFF, 0xF8, 0x7F, 0xFF, 0x07,
|
|
||||||
0xFF, 0xE0, 0x1F, 0xE0, 0x07, 0xF0, 0x7F, 0xF3, 0xFF, 0xDF, 0xFE, 0x7F,
|
|
||||||
0xFB, 0xF8, 0x2F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xFF, 0xEF, 0xFF, 0xBF,
|
|
||||||
0xFE, 0xFF, 0xFB, 0xFF, 0xEF, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F,
|
|
||||||
0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03,
|
|
||||||
0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x00, 0x03, 0xFE, 0x03,
|
|
||||||
0xFF, 0xF1, 0xFF, 0xFC, 0xFF, 0xFF, 0x7F, 0xFF, 0xDF, 0xC3, 0xFF, 0xE0,
|
|
||||||
0xFF, 0xF0, 0x3F, 0xFC, 0x0F, 0xFF, 0x03, 0xFF, 0xC0, 0xFF, 0xF0, 0x3F,
|
|
||||||
0xFE, 0x0F, 0xFF, 0x87, 0xF7, 0xFF, 0xFD, 0xFF, 0xFF, 0x3F, 0xFF, 0xC7,
|
|
||||||
0xFF, 0xF0, 0x7E, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x07, 0xF3, 0x03,
|
|
||||||
0xF8, 0xFF, 0xFE, 0x7F, 0xFF, 0x1F, 0xFF, 0xC7, 0xFF, 0xC0, 0x3F, 0xC0,
|
|
||||||
0x1C, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0,
|
|
||||||
0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7F, 0xF8, 0x3F, 0xFF, 0x1F,
|
|
||||||
0xFF, 0xCF, 0xFF, 0xF7, 0xFF, 0xFB, 0xF0, 0xFF, 0xF8, 0x3F, 0xFC, 0x1F,
|
|
||||||
0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0x83, 0xFF, 0xC1, 0xFF, 0xE0, 0xFF, 0xF0,
|
|
||||||
0x7F, 0xF8, 0x3F, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0x83, 0xFF,
|
|
||||||
0xC1, 0xFF, 0xE0, 0xFC, 0x3C, 0x7E, 0x7E, 0xFF, 0x7E, 0x7E, 0x3C, 0x00,
|
|
||||||
0x00, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E,
|
|
||||||
0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x01, 0xE0,
|
|
||||||
0x1F, 0x80, 0xFC, 0x0F, 0xF0, 0x3F, 0x01, 0xF8, 0x07, 0x80, 0x00, 0x00,
|
|
||||||
0x00, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E,
|
|
||||||
0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0,
|
|
||||||
0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F,
|
|
||||||
0xC0, 0xFE, 0x7F, 0xE3, 0xFF, 0x3F, 0xF1, 0xFF, 0x0F, 0xE0, 0x00, 0x1C,
|
|
||||||
0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8,
|
|
||||||
0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x83, 0xFF, 0xF0,
|
|
||||||
0xFF, 0x7E, 0x3F, 0xCF, 0xC7, 0xF1, 0xF9, 0xFC, 0x3F, 0x7F, 0x87, 0xFF,
|
|
||||||
0xE0, 0xFF, 0xF8, 0x1F, 0xFE, 0x03, 0xFF, 0x80, 0x7F, 0xF8, 0x0F, 0xFF,
|
|
||||||
0x81, 0xFF, 0xF8, 0x3F, 0x7F, 0x07, 0xE7, 0xF0, 0xFC, 0x7F, 0x1F, 0x8F,
|
|
||||||
0xE3, 0xF0, 0xFE, 0x7E, 0x1F, 0xEF, 0xC1, 0xFD, 0xF8, 0x1F, 0xC0, 0x1C,
|
|
||||||
0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F,
|
|
||||||
0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3,
|
|
||||||
0xF1, 0xF8, 0xFE, 0x7F, 0xDF, 0xEF, 0xF3, 0xF0, 0x78, 0x1F, 0xF0, 0x7E,
|
|
||||||
0x0F, 0xFF, 0xDF, 0xF8, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFE, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xEF, 0xC3, 0xF8, 0x7F, 0xFC, 0x3F, 0x87, 0xFF, 0xC1, 0xF8,
|
|
||||||
0x3F, 0xFC, 0x1F, 0x83, 0xFF, 0xC1, 0xF8, 0x3F, 0xFC, 0x1F, 0x83, 0xFF,
|
|
||||||
0xC1, 0xF8, 0x3F, 0xFC, 0x1F, 0x83, 0xFF, 0xC1, 0xF8, 0x3F, 0xFC, 0x1F,
|
|
||||||
0x83, 0xFF, 0xC1, 0xF8, 0x3F, 0xFC, 0x1F, 0x83, 0xFF, 0xC1, 0xF8, 0x3F,
|
|
||||||
0xFC, 0x1F, 0x83, 0xFF, 0xC1, 0xF8, 0x3F, 0xFC, 0x1F, 0x83, 0xF0, 0x1F,
|
|
||||||
0xF0, 0x7F, 0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF, 0xFF, 0xF7, 0xE1, 0xFF,
|
|
||||||
0xF0, 0x7F, 0xF8, 0x3F, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0x83,
|
|
||||||
0xFF, 0xC1, 0xFF, 0xE0, 0xFF, 0xF0, 0x7F, 0xF8, 0x3F, 0xFC, 0x1F, 0xFE,
|
|
||||||
0x0F, 0xFF, 0x07, 0xFF, 0x83, 0xFF, 0xC1, 0xF8, 0x01, 0xF8, 0x00, 0x7F,
|
|
||||||
0xE0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x3F, 0xFF, 0xC7, 0xF0, 0xFE, 0x7E,
|
|
||||||
0x07, 0xEF, 0xE0, 0x7F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF,
|
|
||||||
0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x7F, 0x7E, 0x07, 0xE7, 0xF0, 0xFE,
|
|
||||||
0x3F, 0xFF, 0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xF8,
|
|
||||||
0x00, 0x1F, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0xFF, 0xCF, 0xFF,
|
|
||||||
0xF9, 0xF8, 0x3F, 0xBF, 0x03, 0xF7, 0xE0, 0x7F, 0xFC, 0x07, 0xFF, 0x80,
|
|
||||||
0xFF, 0xF0, 0x1F, 0xFE, 0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF, 0x03,
|
|
||||||
0xFF, 0xF0, 0xFE, 0xFF, 0xFF, 0xDF, 0xFF, 0xF3, 0xFF, 0xFC, 0x7F, 0xFF,
|
|
||||||
0x0F, 0xDF, 0x81, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00,
|
|
||||||
0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x7F,
|
|
||||||
0xFF, 0x1F, 0xFF, 0xF3, 0xFF, 0xFF, 0x3F, 0xFF, 0xF7, 0xF8, 0x3F, 0x7E,
|
|
||||||
0x03, 0xFF, 0xE0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF,
|
|
||||||
0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFE, 0x03, 0xF7, 0xF0, 0x7F,
|
|
||||||
0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x03, 0xFB,
|
|
||||||
0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00,
|
|
||||||
0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x0F, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFE, 0xFF, 0xFB, 0xF0, 0x2F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F,
|
|
||||||
0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03,
|
|
||||||
0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x00, 0x07, 0xF8, 0x0F, 0xFE, 0x3F,
|
|
||||||
0xFE, 0x3F, 0xFE, 0x7F, 0xFC, 0x7E, 0x04, 0x7E, 0x00, 0x7F, 0x00, 0x7F,
|
|
||||||
0xF8, 0x7F, 0xFE, 0x3F, 0xFE, 0x1F, 0xFF, 0x07, 0xFF, 0x00, 0x7F, 0x00,
|
|
||||||
0x3F, 0x70, 0x3F, 0x7F, 0xFF, 0x7F, 0xFE, 0x7F, 0xFE, 0xFF, 0xF8, 0x1F,
|
|
||||||
0xE0, 0x1C, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F,
|
|
||||||
0xFF, 0xBF, 0xFE, 0xFF, 0xFB, 0xFF, 0xEF, 0xFF, 0xBF, 0x00, 0xFC, 0x03,
|
|
||||||
0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00,
|
|
||||||
0xFC, 0x03, 0xF8, 0x27, 0xFF, 0x9F, 0xFE, 0x3F, 0xFC, 0x7F, 0xF0, 0x7F,
|
|
||||||
0x00, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0x83, 0xFF, 0xC1, 0xFF,
|
|
||||||
0xE0, 0xFF, 0xF0, 0x7F, 0xF8, 0x3F, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07,
|
|
||||||
0xFF, 0x83, 0xFF, 0xC1, 0xFF, 0xE0, 0xFF, 0xF0, 0x7F, 0xFC, 0x3F, 0x7F,
|
|
||||||
0xFF, 0xBF, 0xFF, 0xCF, 0xFF, 0xE3, 0xFF, 0xF0, 0x7F, 0xC0, 0xFC, 0x01,
|
|
||||||
0xFF, 0xF0, 0x1F, 0xDF, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xF0, 0x7F, 0x1F,
|
|
||||||
0x83, 0xF0, 0xFC, 0x1F, 0x87, 0xE0, 0xFC, 0x3F, 0x8F, 0xC0, 0xFC, 0x7E,
|
|
||||||
0x07, 0xE3, 0xF0, 0x3F, 0xBF, 0x00, 0xFD, 0xF8, 0x07, 0xEF, 0xC0, 0x1F,
|
|
||||||
0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x80,
|
|
||||||
0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFC, 0x0F, 0x80, 0xFF, 0xF0, 0x3E,
|
|
||||||
0x03, 0xF7, 0xE0, 0xF8, 0x1F, 0x9F, 0x83, 0xF0, 0x7E, 0x7E, 0x0F, 0xC1,
|
|
||||||
0xF8, 0xF8, 0x7F, 0x07, 0xC3, 0xF1, 0xFC, 0x3F, 0x0F, 0xC7, 0xF8, 0xFC,
|
|
||||||
0x1F, 0x1F, 0xE3, 0xE0, 0x7C, 0xF7, 0x8F, 0x81, 0xFB, 0xDF, 0x7E, 0x07,
|
|
||||||
0xEF, 0x7D, 0xF0, 0x0F, 0xBC, 0xF7, 0xC0, 0x3E, 0xE3, 0xDF, 0x00, 0xFF,
|
|
||||||
0x8F, 0xF8, 0x01, 0xFE, 0x1F, 0xE0, 0x07, 0xF8, 0x7F, 0x80, 0x0F, 0xC1,
|
|
||||||
0xFC, 0x00, 0x3F, 0x03, 0xF0, 0x00, 0xFC, 0x0F, 0xC0, 0x01, 0xF0, 0x3E,
|
|
||||||
0x00, 0xFF, 0x03, 0xFD, 0xFC, 0x0F, 0xE3, 0xF8, 0x7F, 0x0F, 0xF3, 0xFC,
|
|
||||||
0x1F, 0xCF, 0xE0, 0x3F, 0xFF, 0x00, 0x7F, 0xF8, 0x01, 0xFF, 0xE0, 0x03,
|
|
||||||
0xFF, 0x00, 0x07, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x03, 0xFF,
|
|
||||||
0x00, 0x1F, 0xFE, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0xF0, 0x1F, 0xCF, 0xE0,
|
|
||||||
0xFF, 0x3F, 0x83, 0xF8, 0x7F, 0x1F, 0xC0, 0xFE, 0xFF, 0x03, 0xFC, 0xFC,
|
|
||||||
0x01, 0xFF, 0xF0, 0x1F, 0xDF, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xF0, 0x7F,
|
|
||||||
0x1F, 0x83, 0xF0, 0xFC, 0x1F, 0x87, 0xE0, 0xFC, 0x3F, 0x8F, 0xC0, 0xFC,
|
|
||||||
0x7E, 0x07, 0xE3, 0xF0, 0x1F, 0xBF, 0x00, 0xFD, 0xF8, 0x07, 0xEF, 0xC0,
|
|
||||||
0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0xFF,
|
|
||||||
0x80, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xE0, 0x0F,
|
|
||||||
0xFE, 0x00, 0x7F, 0xF0, 0x07, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0xFE, 0x00,
|
|
||||||
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x01, 0xFC, 0x00, 0xFF, 0x00,
|
|
||||||
0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE,
|
|
||||||
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xC0, 0x00, 0xF8, 0x3F, 0xC3, 0xFE, 0x1F, 0xF1, 0xFF, 0x8F, 0xE0, 0x7E,
|
|
||||||
0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0,
|
|
||||||
0x7E, 0x03, 0xF0, 0x3F, 0x87, 0xF8, 0x3F, 0x81, 0xFC, 0x0F, 0xF0, 0x7F,
|
|
||||||
0x80, 0xFE, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8,
|
|
||||||
0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0xC3, 0xFE, 0x1F, 0xF0,
|
|
||||||
0x7F, 0x80, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF8, 0x07, 0xF8, 0x3F,
|
|
||||||
0xE1, 0xFF, 0x0F, 0xFC, 0x0F, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E,
|
|
||||||
0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xE0,
|
|
||||||
0x3F, 0xC0, 0xFE, 0x07, 0xF0, 0x7F, 0x87, 0xFC, 0x3F, 0x81, 0xF8, 0x0F,
|
|
||||||
0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8,
|
|
||||||
0x1F, 0xC7, 0xFE, 0x3F, 0xE1, 0xFF, 0x0F, 0xF0, 0x7C, 0x00, 0x0F, 0x00,
|
|
||||||
0xC3, 0xFC, 0x0F, 0x3F, 0xF1, 0xF7, 0xFF, 0xFE, 0x7F, 0xFF, 0xEF, 0x8F,
|
|
||||||
0xFC, 0xF0, 0x3F, 0xC3, 0x00, 0xF0 };
|
|
||||||
|
|
||||||
const GFXglyph Ubuntu_Bold20pt7bGlyphs[] PROGMEM = {
|
|
||||||
{ 0, 0, 0, 9, 0, 1 }, // 0x20 ' '
|
|
||||||
{ 0, 8, 27, 11, 2, -26 }, // 0x21 '!'
|
|
||||||
{ 27, 15, 11, 18, 2, -29 }, // 0x22 '"'
|
|
||||||
{ 48, 23, 27, 27, 2, -26 }, // 0x23 '#'
|
|
||||||
{ 126, 19, 35, 22, 1, -29 }, // 0x24 '$'
|
|
||||||
{ 210, 34, 27, 36, 1, -26 }, // 0x25 '%'
|
|
||||||
{ 325, 27, 27, 28, 1, -26 }, // 0x26 '&'
|
|
||||||
{ 417, 6, 11, 10, 2, -29 }, // 0x27 '''
|
|
||||||
{ 426, 11, 38, 14, 3, -30 }, // 0x28 '('
|
|
||||||
{ 479, 11, 38, 14, 0, -30 }, // 0x29 ')'
|
|
||||||
{ 532, 17, 16, 20, 2, -26 }, // 0x2A '*'
|
|
||||||
{ 566, 19, 19, 23, 2, -20 }, // 0x2B '+'
|
|
||||||
{ 612, 8, 12, 9, 0, -5 }, // 0x2C ','
|
|
||||||
{ 624, 11, 5, 13, 1, -13 }, // 0x2D '-'
|
|
||||||
{ 631, 7, 7, 9, 1, -5 }, // 0x2E '.'
|
|
||||||
{ 638, 19, 38, 17, -1, -30 }, // 0x2F '/'
|
|
||||||
{ 729, 20, 27, 22, 1, -26 }, // 0x30 '0'
|
|
||||||
{ 797, 13, 27, 22, 3, -26 }, // 0x31 '1'
|
|
||||||
{ 841, 19, 27, 22, 1, -26 }, // 0x32 '2'
|
|
||||||
{ 906, 19, 27, 22, 1, -26 }, // 0x33 '3'
|
|
||||||
{ 971, 20, 27, 22, 1, -26 }, // 0x34 '4'
|
|
||||||
{ 1039, 19, 27, 22, 1, -26 }, // 0x35 '5'
|
|
||||||
{ 1104, 20, 27, 22, 1, -26 }, // 0x36 '6'
|
|
||||||
{ 1172, 18, 27, 22, 2, -26 }, // 0x37 '7'
|
|
||||||
{ 1233, 19, 27, 22, 2, -26 }, // 0x38 '8'
|
|
||||||
{ 1298, 19, 27, 22, 1, -26 }, // 0x39 '9'
|
|
||||||
{ 1363, 7, 21, 9, 1, -19 }, // 0x3A ':'
|
|
||||||
{ 1382, 8, 26, 9, 0, -19 }, // 0x3B ';'
|
|
||||||
{ 1408, 19, 19, 22, 2, -20 }, // 0x3C '<'
|
|
||||||
{ 1454, 18, 14, 22, 2, -17 }, // 0x3D '='
|
|
||||||
{ 1486, 19, 19, 22, 1, -20 }, // 0x3E '>'
|
|
||||||
{ 1532, 16, 28, 18, 1, -27 }, // 0x3F '?'
|
|
||||||
{ 1588, 34, 34, 38, 2, -27 }, // 0x40 '@'
|
|
||||||
{ 1733, 27, 27, 27, 0, -26 }, // 0x41 'A'
|
|
||||||
{ 1825, 21, 27, 26, 3, -26 }, // 0x42 'B'
|
|
||||||
{ 1896, 22, 27, 25, 2, -26 }, // 0x43 'C'
|
|
||||||
{ 1971, 24, 27, 29, 3, -26 }, // 0x44 'D'
|
|
||||||
{ 2052, 20, 27, 24, 3, -26 }, // 0x45 'E'
|
|
||||||
{ 2120, 18, 27, 22, 3, -26 }, // 0x46 'F'
|
|
||||||
{ 2181, 22, 27, 27, 2, -26 }, // 0x47 'G'
|
|
||||||
{ 2256, 23, 27, 29, 3, -26 }, // 0x48 'H'
|
|
||||||
{ 2334, 6, 27, 12, 3, -26 }, // 0x49 'I'
|
|
||||||
{ 2355, 18, 27, 21, 0, -26 }, // 0x4A 'J'
|
|
||||||
{ 2416, 24, 27, 27, 3, -26 }, // 0x4B 'K'
|
|
||||||
{ 2497, 18, 27, 22, 3, -26 }, // 0x4C 'L'
|
|
||||||
{ 2558, 31, 27, 35, 2, -26 }, // 0x4D 'M'
|
|
||||||
{ 2663, 23, 27, 29, 3, -26 }, // 0x4E 'N'
|
|
||||||
{ 2741, 27, 27, 31, 2, -26 }, // 0x4F 'O'
|
|
||||||
{ 2833, 20, 27, 25, 3, -26 }, // 0x50 'P'
|
|
||||||
{ 2901, 27, 34, 31, 2, -26 }, // 0x51 'Q'
|
|
||||||
{ 3016, 23, 27, 26, 3, -26 }, // 0x52 'R'
|
|
||||||
{ 3094, 20, 27, 23, 1, -26 }, // 0x53 'S'
|
|
||||||
{ 3162, 22, 27, 24, 1, -26 }, // 0x54 'T'
|
|
||||||
{ 3237, 22, 27, 28, 3, -26 }, // 0x55 'U'
|
|
||||||
{ 3312, 27, 27, 27, 0, -26 }, // 0x56 'V'
|
|
||||||
{ 3404, 36, 27, 38, 1, -26 }, // 0x57 'W'
|
|
||||||
{ 3526, 26, 27, 26, 0, -26 }, // 0x58 'X'
|
|
||||||
{ 3614, 26, 27, 26, 0, -26 }, // 0x59 'Y'
|
|
||||||
{ 3702, 22, 27, 24, 1, -26 }, // 0x5A 'Z'
|
|
||||||
{ 3777, 11, 38, 14, 3, -30 }, // 0x5B '['
|
|
||||||
{ 3830, 19, 38, 17, -1, -30 }, // 0x5C '\'
|
|
||||||
{ 3921, 11, 38, 14, 0, -30 }, // 0x5D ']'
|
|
||||||
{ 3974, 21, 16, 23, 1, -26 }, // 0x5E '^'
|
|
||||||
{ 4016, 20, 5, 20, 0, 3 }, // 0x5F '_'
|
|
||||||
{ 4029, 9, 9, 11, 1, -30 }, // 0x60 '`'
|
|
||||||
{ 4040, 17, 21, 22, 2, -20 }, // 0x61 'a'
|
|
||||||
{ 4085, 19, 30, 24, 3, -29 }, // 0x62 'b'
|
|
||||||
{ 4157, 17, 21, 20, 2, -20 }, // 0x63 'c'
|
|
||||||
{ 4202, 19, 30, 24, 2, -29 }, // 0x64 'd'
|
|
||||||
{ 4274, 19, 21, 23, 2, -20 }, // 0x65 'e'
|
|
||||||
{ 4324, 14, 30, 17, 3, -29 }, // 0x66 'f'
|
|
||||||
{ 4377, 18, 28, 23, 2, -20 }, // 0x67 'g'
|
|
||||||
{ 4440, 17, 30, 23, 3, -29 }, // 0x68 'h'
|
|
||||||
{ 4504, 8, 30, 12, 2, -29 }, // 0x69 'i'
|
|
||||||
{ 4534, 13, 37, 10, -4, -29 }, // 0x6A 'j'
|
|
||||||
{ 4595, 19, 30, 23, 3, -29 }, // 0x6B 'k'
|
|
||||||
{ 4667, 9, 30, 13, 3, -29 }, // 0x6C 'l'
|
|
||||||
{ 4701, 28, 21, 34, 3, -20 }, // 0x6D 'm'
|
|
||||||
{ 4775, 17, 21, 23, 3, -20 }, // 0x6E 'n'
|
|
||||||
{ 4820, 20, 21, 24, 2, -20 }, // 0x6F 'o'
|
|
||||||
{ 4873, 19, 28, 24, 3, -20 }, // 0x70 'p'
|
|
||||||
{ 4940, 20, 28, 24, 2, -20 }, // 0x71 'q'
|
|
||||||
{ 5010, 14, 21, 17, 3, -20 }, // 0x72 'r'
|
|
||||||
{ 5047, 16, 21, 19, 1, -20 }, // 0x73 's'
|
|
||||||
{ 5089, 14, 27, 18, 3, -26 }, // 0x74 't'
|
|
||||||
{ 5137, 17, 21, 23, 3, -20 }, // 0x75 'u'
|
|
||||||
{ 5182, 21, 21, 21, 0, -20 }, // 0x76 'v'
|
|
||||||
{ 5238, 30, 21, 30, 0, -20 }, // 0x77 'w'
|
|
||||||
{ 5317, 22, 21, 22, 0, -20 }, // 0x78 'x'
|
|
||||||
{ 5375, 21, 28, 21, 0, -20 }, // 0x79 'y'
|
|
||||||
{ 5449, 18, 21, 20, 1, -20 }, // 0x7A 'z'
|
|
||||||
{ 5497, 13, 38, 14, 1, -30 }, // 0x7B '{'
|
|
||||||
{ 5559, 6, 38, 14, 4, -30 }, // 0x7C '|'
|
|
||||||
{ 5588, 13, 38, 14, 0, -30 }, // 0x7D '}'
|
|
||||||
{ 5650, 20, 8, 22, 1, -15 } }; // 0x7E '~'
|
|
||||||
|
|
||||||
const GFXfont Ubuntu_Bold20pt7b PROGMEM = {
|
|
||||||
(uint8_t *)Ubuntu_Bold20pt7bBitmaps,
|
|
||||||
(GFXglyph *)Ubuntu_Bold20pt7bGlyphs,
|
|
||||||
0x20, 0x7E, 45 };
|
|
||||||
|
|
||||||
// Approx. 6342 bytes
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,182 +0,0 @@
|
|||||||
const uint8_t Ubuntu_Bold8pt7bBitmaps[] PROGMEM = {
|
|
||||||
0xFF, 0xFC, 0xFC, 0xDE, 0xF7, 0xBD, 0x80, 0x1B, 0x0D, 0x87, 0xDF, 0xFF,
|
|
||||||
0xF9, 0xB3, 0xFF, 0xFF, 0x6C, 0x36, 0x1B, 0x00, 0x18, 0x30, 0xFF, 0xFC,
|
|
||||||
0x38, 0x1C, 0x1E, 0x0E, 0x0C, 0x1F, 0xF7, 0xC3, 0x06, 0x00, 0x78, 0x63,
|
|
||||||
0xF3, 0x0C, 0xCC, 0x33, 0x60, 0xCF, 0xFB, 0xFF, 0xF7, 0xFC, 0xC1, 0xB3,
|
|
||||||
0x0C, 0xCC, 0x33, 0xF1, 0x87, 0x80, 0x3C, 0x1F, 0x86, 0x61, 0x98, 0x3C,
|
|
||||||
0x1E, 0x6C, 0xDB, 0x1C, 0xC7, 0x3F, 0xE7, 0xDC, 0xFF, 0xC0, 0x13, 0x66,
|
|
||||||
0xCC, 0xCC, 0xCC, 0xCC, 0x66, 0x31, 0x8C, 0x66, 0x33, 0x33, 0x33, 0x33,
|
|
||||||
0x66, 0xC8, 0x39, 0xFF, 0xF8, 0x86, 0xDD, 0xD1, 0x00, 0x18, 0x18, 0x18,
|
|
||||||
0xFF, 0xFF, 0x18, 0x18, 0x18, 0x6D, 0xEC, 0xFF, 0xC0, 0xFF, 0x80, 0x06,
|
|
||||||
0x1C, 0x30, 0x60, 0xC3, 0x06, 0x0C, 0x30, 0x60, 0xC3, 0x06, 0x0C, 0x38,
|
|
||||||
0x60, 0x38, 0xFB, 0xBE, 0x3C, 0x78, 0xF1, 0xE3, 0xEE, 0xF8, 0xE0, 0x1B,
|
|
||||||
0xFE, 0xB1, 0x8C, 0x63, 0x18, 0xC6, 0x7D, 0xFD, 0x18, 0x30, 0xE3, 0x8E,
|
|
||||||
0x38, 0xE1, 0xFF, 0xF8, 0x7D, 0xFC, 0x18, 0x33, 0xE7, 0x81, 0x83, 0x87,
|
|
||||||
0xFF, 0xE0, 0x06, 0x0E, 0x1E, 0x3E, 0x36, 0x66, 0xE6, 0xFF, 0xFF, 0x06,
|
|
||||||
0x06, 0x7E, 0xFD, 0x83, 0x0F, 0x9F, 0x83, 0x83, 0x07, 0xFB, 0xE0, 0x1C,
|
|
||||||
0x79, 0xC7, 0x0F, 0xDF, 0xF1, 0xE3, 0xC6, 0xF8, 0xE0, 0xFF, 0xFC, 0x30,
|
|
||||||
0xE1, 0x87, 0x0C, 0x18, 0x60, 0xC1, 0x80, 0x3C, 0xFF, 0x1E, 0x3E, 0xEF,
|
|
||||||
0xBF, 0xE3, 0xC7, 0xFD, 0xF0, 0x38, 0xFB, 0x1E, 0x3C, 0x7F, 0xDF, 0x87,
|
|
||||||
0x1C, 0xF1, 0xC0, 0xFF, 0x80, 0x3F, 0xE0, 0x77, 0x70, 0x00, 0x06, 0x66,
|
|
||||||
0xCC, 0x06, 0x3E, 0xF8, 0xC0, 0xF8, 0x3F, 0x06, 0xFF, 0xFF, 0x00, 0x00,
|
|
||||||
0xFF, 0xFF, 0x60, 0x7C, 0x1F, 0x03, 0x1F, 0xFC, 0x60, 0x7D, 0xFC, 0x18,
|
|
||||||
0x30, 0xC3, 0x0C, 0x18, 0x00, 0x70, 0xE1, 0xC0, 0x0F, 0xC0, 0x7F, 0xC3,
|
|
||||||
0x83, 0x98, 0x06, 0xE7, 0xCF, 0x3F, 0x3D, 0x8C, 0xF6, 0x33, 0xD8, 0xCF,
|
|
||||||
0xBF, 0xE6, 0x7F, 0x1E, 0x00, 0x3F, 0xC0, 0x3F, 0x00, 0x0E, 0x01, 0xC0,
|
|
||||||
0x7C, 0x0D, 0x83, 0xB8, 0x63, 0x0C, 0x63, 0xFE, 0x7F, 0xCC, 0x1B, 0x01,
|
|
||||||
0x80, 0xFC, 0x7F, 0xB0, 0xD8, 0x6F, 0xE7, 0xFB, 0x07, 0x83, 0xC3, 0xFF,
|
|
||||||
0xBF, 0x80, 0x1F, 0x1F, 0xD8, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0x60,
|
|
||||||
0x3F, 0xC7, 0xC0, 0xFE, 0x3F, 0xCC, 0x3B, 0x07, 0xC0, 0xF0, 0x3C, 0x0F,
|
|
||||||
0x07, 0xC3, 0xBF, 0xCF, 0xE0, 0xFF, 0xFF, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0,
|
|
||||||
0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0,
|
|
||||||
0xC0, 0xC0, 0xC0, 0x1F, 0x1F, 0xD8, 0x18, 0x0C, 0x06, 0x0F, 0x07, 0x83,
|
|
||||||
0x71, 0xBF, 0xC7, 0xE0, 0xC1, 0xE0, 0xF0, 0x78, 0x3F, 0xFF, 0xFF, 0x07,
|
|
||||||
0x83, 0xC1, 0xE0, 0xF0, 0x60, 0xFF, 0xFF, 0xFC, 0x06, 0x0C, 0x18, 0x30,
|
|
||||||
0x60, 0xC1, 0x83, 0x07, 0xF9, 0xE0, 0xC1, 0xB0, 0xCC, 0x63, 0x30, 0xF8,
|
|
||||||
0x3C, 0x0D, 0x83, 0x30, 0xC6, 0x30, 0xCC, 0x18, 0xC0, 0xC0, 0xC0, 0xC0,
|
|
||||||
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0x60, 0x33, 0x83, 0x9C, 0x1C,
|
|
||||||
0xF1, 0xED, 0x8D, 0xEE, 0xEF, 0x36, 0x79, 0xF3, 0xC7, 0x1E, 0x38, 0xF0,
|
|
||||||
0x06, 0xC0, 0xF8, 0x3F, 0x0F, 0xE3, 0xDC, 0xF3, 0xBC, 0x7F, 0x0F, 0xC1,
|
|
||||||
0xF0, 0x7C, 0x0C, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80, 0xF0,
|
|
||||||
0x1F, 0x07, 0x71, 0xCF, 0xF8, 0x7C, 0x00, 0xFC, 0xFE, 0xC3, 0xC3, 0xC3,
|
|
||||||
0xFE, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C,
|
|
||||||
0x07, 0x80, 0xF0, 0x1F, 0x07, 0x71, 0xCF, 0xF0, 0xF8, 0x07, 0x00, 0x7C,
|
|
||||||
0x07, 0x80, 0xFC, 0x7F, 0x30, 0xD8, 0x6C, 0x37, 0xF3, 0xE1, 0x98, 0xC6,
|
|
||||||
0x63, 0xB0, 0xE0, 0x3D, 0xFF, 0x06, 0x0F, 0x0F, 0x87, 0x83, 0x07, 0xFD,
|
|
||||||
0xF0, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
|
||||||
0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xE3, 0xBF, 0x8F,
|
|
||||||
0x80, 0xC0, 0x6C, 0x19, 0x83, 0x38, 0xE3, 0x18, 0x63, 0x06, 0xC0, 0xD8,
|
|
||||||
0x0E, 0x01, 0xC0, 0x38, 0x00, 0xC0, 0x07, 0x87, 0x0D, 0x8E, 0x33, 0x1C,
|
|
||||||
0x66, 0x6C, 0xC6, 0xDB, 0x0D, 0xB6, 0x1B, 0x6C, 0x1C, 0x70, 0x38, 0xE0,
|
|
||||||
0x71, 0xC0, 0xE0, 0xEC, 0x18, 0xC6, 0x0D, 0x80, 0xE0, 0x1C, 0x03, 0x80,
|
|
||||||
0xD8, 0x31, 0x8C, 0x1B, 0x83, 0x80, 0xC0, 0xD8, 0x67, 0x38, 0xCC, 0x1E,
|
|
||||||
0x07, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0xFF, 0xFF, 0x06, 0x0C,
|
|
||||||
0x1C, 0x18, 0x30, 0x70, 0x60, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C, 0x63, 0x18,
|
|
||||||
0xC6, 0x31, 0x8C, 0x63, 0xFF, 0xC1, 0xC1, 0x83, 0x06, 0x06, 0x0C, 0x18,
|
|
||||||
0x18, 0x30, 0x60, 0x60, 0xC1, 0x83, 0x83, 0xFF, 0xC6, 0x31, 0x8C, 0x63,
|
|
||||||
0x18, 0xC6, 0x31, 0x8F, 0xFF, 0x08, 0x0E, 0x0F, 0x86, 0xC7, 0x77, 0x1D,
|
|
||||||
0x04, 0xFF, 0xFF, 0x4E, 0x72, 0x7C, 0xFC, 0x1B, 0xFF, 0xF8, 0xFF, 0xBF,
|
|
||||||
0xC1, 0x83, 0x06, 0x0F, 0x9F, 0xB3, 0xE3, 0xC7, 0x9F, 0xF7, 0xC0, 0x3D,
|
|
||||||
0xFE, 0x30, 0xC3, 0x87, 0xCF, 0x06, 0x0C, 0x18, 0x33, 0xEF, 0xF9, 0xE3,
|
|
||||||
0xC7, 0xCD, 0xF9, 0xF0, 0x38, 0xFB, 0x1F, 0xFF, 0xF8, 0x1F, 0x1E, 0x7F,
|
|
||||||
0xF1, 0x8F, 0xFF, 0x18, 0xC6, 0x31, 0x80, 0x3E, 0xFF, 0x9E, 0x3C, 0x7C,
|
|
||||||
0xDF, 0x9F, 0x06, 0xFB, 0xE0, 0xC1, 0x83, 0x06, 0x0F, 0xDF, 0xF1, 0xE3,
|
|
||||||
0xC7, 0x8F, 0x1E, 0x30, 0xFC, 0xFF, 0xFF, 0x33, 0x30, 0x33, 0x33, 0x33,
|
|
||||||
0x33, 0x3F, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC6, 0xCC, 0xD8, 0xF0, 0xD8,
|
|
||||||
0xCC, 0xC6, 0xC7, 0xDB, 0x6D, 0xB6, 0xDB, 0xB0, 0xFD, 0xEF, 0xFF, 0xC6,
|
|
||||||
0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xFD, 0xFF, 0x1E, 0x3C,
|
|
||||||
0x78, 0xF1, 0xE3, 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0xF9,
|
|
||||||
0xFB, 0x3E, 0x3C, 0x79, 0xFF, 0x7C, 0xC1, 0x83, 0x00, 0x3E, 0xFF, 0x9E,
|
|
||||||
0x3C, 0x7C, 0xDF, 0xBF, 0x06, 0x0C, 0x18, 0xFF, 0xF1, 0x8C, 0x63, 0x18,
|
|
||||||
0x7F, 0xEC, 0x3E, 0x7C, 0x3F, 0xFE, 0xC6, 0x3F, 0xFC, 0x63, 0x18, 0xFB,
|
|
||||||
0xC0, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xFF, 0xBF, 0xC1, 0xB1, 0x98, 0xCE,
|
|
||||||
0xE3, 0x61, 0xF0, 0x70, 0x38, 0xC6, 0x79, 0xCD, 0xBB, 0x35, 0x66, 0xAC,
|
|
||||||
0x77, 0x0E, 0xE1, 0x8C, 0xE3, 0xBB, 0x8D, 0x83, 0x81, 0xC1, 0xB1, 0xDD,
|
|
||||||
0xC7, 0xE3, 0xB1, 0x98, 0xCE, 0xE3, 0x61, 0xF0, 0x70, 0x38, 0x18, 0x7C,
|
|
||||||
0x3C, 0x00, 0xFF, 0xF1, 0x8E, 0x71, 0x8F, 0xFF, 0x3B, 0xD8, 0xC6, 0x31,
|
|
||||||
0x98, 0xC3, 0x18, 0xC6, 0x31, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x8C,
|
|
||||||
0x63, 0x18, 0xC3, 0x19, 0x8C, 0x63, 0x1B, 0xDC, 0x73, 0xFF, 0xCE };
|
|
||||||
|
|
||||||
const GFXglyph Ubuntu_Bold8pt7bGlyphs[] PROGMEM = {
|
|
||||||
{ 0, 0, 0, 4, 0, 1 }, // 0x20 ' '
|
|
||||||
{ 0, 2, 11, 4, 1, -10 }, // 0x21 '!'
|
|
||||||
{ 3, 5, 5, 7, 1, -11 }, // 0x22 '"'
|
|
||||||
{ 7, 9, 11, 11, 1, -10 }, // 0x23 '#'
|
|
||||||
{ 20, 7, 15, 9, 1, -12 }, // 0x24 '$'
|
|
||||||
{ 34, 14, 11, 16, 1, -10 }, // 0x25 '%'
|
|
||||||
{ 54, 10, 11, 11, 1, -10 }, // 0x26 '&'
|
|
||||||
{ 68, 2, 5, 4, 1, -11 }, // 0x27 '''
|
|
||||||
{ 70, 4, 16, 6, 1, -12 }, // 0x28 '('
|
|
||||||
{ 78, 4, 16, 6, 1, -12 }, // 0x29 ')'
|
|
||||||
{ 86, 7, 7, 8, 1, -10 }, // 0x2A '*'
|
|
||||||
{ 93, 8, 8, 10, 1, -8 }, // 0x2B '+'
|
|
||||||
{ 101, 3, 5, 4, 0, -1 }, // 0x2C ','
|
|
||||||
{ 103, 5, 2, 7, 1, -5 }, // 0x2D '-'
|
|
||||||
{ 105, 3, 3, 5, 1, -2 }, // 0x2E '.'
|
|
||||||
{ 107, 7, 16, 7, 0, -12 }, // 0x2F '/'
|
|
||||||
{ 121, 7, 11, 9, 1, -10 }, // 0x30 '0'
|
|
||||||
{ 131, 5, 11, 9, 1, -10 }, // 0x31 '1'
|
|
||||||
{ 138, 7, 11, 9, 1, -10 }, // 0x32 '2'
|
|
||||||
{ 148, 7, 11, 9, 1, -10 }, // 0x33 '3'
|
|
||||||
{ 158, 8, 11, 9, 1, -10 }, // 0x34 '4'
|
|
||||||
{ 169, 7, 11, 9, 1, -10 }, // 0x35 '5'
|
|
||||||
{ 179, 7, 11, 9, 1, -10 }, // 0x36 '6'
|
|
||||||
{ 189, 7, 11, 9, 1, -10 }, // 0x37 '7'
|
|
||||||
{ 199, 7, 11, 9, 1, -10 }, // 0x38 '8'
|
|
||||||
{ 209, 7, 11, 9, 1, -10 }, // 0x39 '9'
|
|
||||||
{ 219, 3, 9, 5, 1, -8 }, // 0x3A ':'
|
|
||||||
{ 223, 4, 12, 5, 0, -8 }, // 0x3B ';'
|
|
||||||
{ 229, 8, 7, 9, 1, -7 }, // 0x3C '<'
|
|
||||||
{ 236, 8, 6, 10, 1, -7 }, // 0x3D '='
|
|
||||||
{ 242, 8, 7, 9, 0, -7 }, // 0x3E '>'
|
|
||||||
{ 249, 7, 12, 7, 0, -11 }, // 0x3F '?'
|
|
||||||
{ 260, 14, 14, 16, 1, -10 }, // 0x40 '@'
|
|
||||||
{ 285, 11, 11, 11, 0, -10 }, // 0x41 'A'
|
|
||||||
{ 301, 9, 11, 11, 1, -10 }, // 0x42 'B'
|
|
||||||
{ 314, 9, 11, 11, 1, -10 }, // 0x43 'C'
|
|
||||||
{ 327, 10, 11, 12, 1, -10 }, // 0x44 'D'
|
|
||||||
{ 341, 8, 11, 10, 1, -10 }, // 0x45 'E'
|
|
||||||
{ 352, 8, 11, 9, 1, -10 }, // 0x46 'F'
|
|
||||||
{ 363, 9, 11, 11, 1, -10 }, // 0x47 'G'
|
|
||||||
{ 376, 9, 11, 11, 1, -10 }, // 0x48 'H'
|
|
||||||
{ 389, 2, 11, 4, 1, -10 }, // 0x49 'I'
|
|
||||||
{ 392, 7, 11, 8, 0, -10 }, // 0x4A 'J'
|
|
||||||
{ 402, 10, 11, 11, 1, -10 }, // 0x4B 'K'
|
|
||||||
{ 416, 8, 11, 9, 1, -10 }, // 0x4C 'L'
|
|
||||||
{ 427, 13, 11, 15, 1, -10 }, // 0x4D 'M'
|
|
||||||
{ 445, 10, 11, 12, 1, -10 }, // 0x4E 'N'
|
|
||||||
{ 459, 11, 11, 13, 1, -10 }, // 0x4F 'O'
|
|
||||||
{ 475, 8, 11, 10, 1, -10 }, // 0x50 'P'
|
|
||||||
{ 486, 11, 14, 13, 1, -10 }, // 0x51 'Q'
|
|
||||||
{ 506, 9, 11, 10, 1, -10 }, // 0x52 'R'
|
|
||||||
{ 519, 7, 11, 9, 1, -10 }, // 0x53 'S'
|
|
||||||
{ 529, 8, 11, 8, 0, -10 }, // 0x54 'T'
|
|
||||||
{ 540, 9, 11, 11, 1, -10 }, // 0x55 'U'
|
|
||||||
{ 553, 11, 11, 11, 0, -10 }, // 0x56 'V'
|
|
||||||
{ 569, 15, 11, 15, 0, -10 }, // 0x57 'W'
|
|
||||||
{ 590, 11, 11, 11, 0, -10 }, // 0x58 'X'
|
|
||||||
{ 606, 10, 11, 10, 0, -10 }, // 0x59 'Y'
|
|
||||||
{ 620, 8, 11, 10, 1, -10 }, // 0x5A 'Z'
|
|
||||||
{ 631, 5, 16, 6, 1, -12 }, // 0x5B '['
|
|
||||||
{ 641, 7, 16, 7, 0, -12 }, // 0x5C '\'
|
|
||||||
{ 655, 5, 16, 6, 0, -12 }, // 0x5D ']'
|
|
||||||
{ 665, 9, 7, 9, 0, -10 }, // 0x5E '^'
|
|
||||||
{ 673, 8, 2, 8, 0, 2 }, // 0x5F '_'
|
|
||||||
{ 675, 4, 4, 5, 1, -12 }, // 0x60 '`'
|
|
||||||
{ 677, 7, 8, 9, 1, -7 }, // 0x61 'a'
|
|
||||||
{ 684, 7, 12, 9, 1, -11 }, // 0x62 'b'
|
|
||||||
{ 695, 6, 8, 8, 1, -7 }, // 0x63 'c'
|
|
||||||
{ 701, 7, 12, 9, 1, -11 }, // 0x64 'd'
|
|
||||||
{ 712, 7, 8, 9, 1, -7 }, // 0x65 'e'
|
|
||||||
{ 719, 5, 12, 6, 1, -11 }, // 0x66 'f'
|
|
||||||
{ 727, 7, 11, 9, 1, -7 }, // 0x67 'g'
|
|
||||||
{ 737, 7, 12, 9, 1, -11 }, // 0x68 'h'
|
|
||||||
{ 748, 2, 12, 4, 1, -11 }, // 0x69 'i'
|
|
||||||
{ 751, 4, 15, 4, -1, -11 }, // 0x6A 'j'
|
|
||||||
{ 759, 8, 12, 9, 1, -11 }, // 0x6B 'k'
|
|
||||||
{ 771, 3, 12, 4, 1, -11 }, // 0x6C 'l'
|
|
||||||
{ 776, 12, 8, 14, 1, -7 }, // 0x6D 'm'
|
|
||||||
{ 788, 7, 8, 9, 1, -7 }, // 0x6E 'n'
|
|
||||||
{ 795, 8, 8, 10, 1, -7 }, // 0x6F 'o'
|
|
||||||
{ 803, 7, 11, 9, 1, -7 }, // 0x70 'p'
|
|
||||||
{ 813, 7, 11, 9, 1, -7 }, // 0x71 'q'
|
|
||||||
{ 823, 5, 8, 6, 1, -7 }, // 0x72 'r'
|
|
||||||
{ 828, 6, 8, 8, 1, -7 }, // 0x73 's'
|
|
||||||
{ 834, 5, 10, 7, 1, -9 }, // 0x74 't'
|
|
||||||
{ 841, 7, 8, 9, 1, -7 }, // 0x75 'u'
|
|
||||||
{ 848, 9, 8, 9, 0, -7 }, // 0x76 'v'
|
|
||||||
{ 857, 11, 8, 11, 0, -7 }, // 0x77 'w'
|
|
||||||
{ 868, 9, 8, 9, 0, -7 }, // 0x78 'x'
|
|
||||||
{ 877, 9, 11, 9, 0, -7 }, // 0x79 'y'
|
|
||||||
{ 890, 6, 8, 8, 1, -7 }, // 0x7A 'z'
|
|
||||||
{ 896, 5, 16, 5, 0, -12 }, // 0x7B '{'
|
|
||||||
{ 906, 2, 16, 4, 1, -12 }, // 0x7C '|'
|
|
||||||
{ 910, 5, 16, 5, 0, -12 }, // 0x7D '}'
|
|
||||||
{ 920, 8, 3, 9, 1, -5 } }; // 0x7E '~'
|
|
||||||
|
|
||||||
const GFXfont Ubuntu_Bold8pt7b PROGMEM = {
|
|
||||||
(uint8_t *)Ubuntu_Bold8pt7bBitmaps,
|
|
||||||
(GFXglyph *)Ubuntu_Bold8pt7bGlyphs,
|
|
||||||
0x20, 0x7E, 18 };
|
|
||||||
|
|
||||||
// Approx. 1595 bytes
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
6
lib/obp60task/debugging.txt
Normal file
6
lib/obp60task/debugging.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Debugging tool
|
||||||
|
##############
|
||||||
|
|
||||||
|
log.txt = text file with error messages from terminal console
|
||||||
|
|
||||||
|
tools/decoder.py -p ESP32S3 -t ~/.platformio/packages/toolchain-xtensa-esp32s3/ -e .pio/build/obp60_s3/firmware.elf log.txt
|
||||||
30
lib/obp60task/extra_task.py
Normal file
30
lib/obp60task/extra_task.py
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# PlatformIO extra script for obp60task
|
||||||
|
|
||||||
|
epdtype = "unknown"
|
||||||
|
pcbvers = "unknown"
|
||||||
|
for x in env["BUILD_FLAGS"]:
|
||||||
|
if x.startswith("-D HARDWARE_"):
|
||||||
|
pcbvers = x.split('_')[1]
|
||||||
|
if x.startswith("-D DISPLAY_"):
|
||||||
|
epdtype = x.split('_')[1]
|
||||||
|
|
||||||
|
propfilename = os.path.join(env["PROJECT_LIBDEPS_DIR"], env["PIOENV"], "GxEPD2/library.properties")
|
||||||
|
properties = {}
|
||||||
|
with open(propfilename, 'r') as file:
|
||||||
|
for line in file:
|
||||||
|
match = re.match(r'^([^=]+)=(.*)$', line)
|
||||||
|
if match:
|
||||||
|
key = match.group(1).strip()
|
||||||
|
value = match.group(2).strip()
|
||||||
|
properties[key] = value
|
||||||
|
|
||||||
|
gxepd2vers = "unknown"
|
||||||
|
try:
|
||||||
|
if properties["name"] == "GxEPD2":
|
||||||
|
gxepd2vers = properties["version"]
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
env["CPPDEFINES"].extend([("BOARD", env["BOARD"]), ("EPDTYPE", epdtype), ("PCBVERS", pcbvers), ("GXEPD2VERS", gxepd2vers)])
|
||||||
|
|
||||||
|
print("added hardware info to CPPDEFINES")
|
||||||
1198
lib/obp60task/fonts/DSEG7Classic-BoldItalic26pt7b.h
Normal file
1198
lib/obp60task/fonts/DSEG7Classic-BoldItalic26pt7b.h
Normal file
File diff suppressed because it is too large
Load Diff
202
lib/obp60task/fonts/IBM8x8px.h
Normal file
202
lib/obp60task/fonts/IBM8x8px.h
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
const uint8_t IBM8x8pxBitmaps[] PROGMEM = {
|
||||||
|
0x00, /* 0x20 space */
|
||||||
|
0x6F, 0xF6, 0x60, 0x60, /* 0x21 exclam */
|
||||||
|
0xDE, 0xF6, /* 0x22 quotedbl */
|
||||||
|
0x6C, 0xDB, 0xFB, 0x6F, 0xED, 0x9B, 0x00, /* 0x23 numbersign */
|
||||||
|
0x31, 0xFC, 0x1E, 0x0F, 0xE3, 0x00, /* 0x24 dollar */
|
||||||
|
0xC7, 0x98, 0x61, 0x86, 0x78, 0xC0, /* 0x25 percent */
|
||||||
|
0x38, 0xD8, 0xE3, 0xBD, 0xD9, 0x9D, 0x80, /* 0x26 ampersand */
|
||||||
|
0x6F, 0x00, /* 0x27 quotesingle */
|
||||||
|
0x36, 0xCC, 0xC6, 0x30, /* 0x28 parenleft */
|
||||||
|
0xC6, 0x33, 0x36, 0xC0, /* 0x29 parenright */
|
||||||
|
0x66, 0x3C, 0xFF, 0x3C, 0x66, /* 0x2A asterisk */
|
||||||
|
0x30, 0xCF, 0xCC, 0x30, /* 0x2B plus */
|
||||||
|
0x6F, 0x00, /* 0x2C comma */
|
||||||
|
0xFC, /* 0x2D hyphen */
|
||||||
|
0xF0, /* 0x2E period */
|
||||||
|
0x06, 0x18, 0x61, 0x86, 0x18, 0x20, 0x00, /* 0x2F slash */
|
||||||
|
0x7D, 0x8F, 0x3E, 0xFF, 0x7C, 0xDF, 0x00, /* 0x30 zero */
|
||||||
|
0x31, 0xC3, 0x0C, 0x30, 0xCF, 0xC0, /* 0x31 one */
|
||||||
|
0x7B, 0x30, 0xCE, 0x63, 0x1F, 0xC0, /* 0x32 two */
|
||||||
|
0x7B, 0x30, 0xCE, 0x0F, 0x37, 0x80, /* 0x33 three */
|
||||||
|
0x1C, 0x79, 0xB6, 0x6F, 0xE1, 0x87, 0x80, /* 0x34 four */
|
||||||
|
0xFF, 0x0F, 0x83, 0x0F, 0x37, 0x80, /* 0x35 five */
|
||||||
|
0x39, 0x8C, 0x3E, 0xCF, 0x37, 0x80, /* 0x36 six */
|
||||||
|
0xFF, 0x30, 0xC6, 0x30, 0xC3, 0x00, /* 0x37 seven */
|
||||||
|
0x7B, 0x3C, 0xDE, 0xCF, 0x37, 0x80, /* 0x38 eight */
|
||||||
|
0x7B, 0x3C, 0xDF, 0x0C, 0x67, 0x00, /* 0x39 nine */
|
||||||
|
0xF0, 0xF0, /* 0x3A colon */
|
||||||
|
0x6C, 0x37, 0x80, /* 0x3B semicolon */
|
||||||
|
0x19, 0x99, 0x86, 0x18, 0x60, /* 0x3C less */
|
||||||
|
0xFC, 0x00, 0x3F, /* 0x3D equal */
|
||||||
|
0xC3, 0x0C, 0x33, 0x33, 0x00, /* 0x3E greater */
|
||||||
|
0x7B, 0x30, 0xC6, 0x30, 0x03, 0x00, /* 0x3F question */
|
||||||
|
0x7D, 0x8F, 0x7E, 0xFD, 0xF8, 0x1E, 0x00, /* 0x40 at */
|
||||||
|
0x31, 0xEC, 0xF3, 0xFF, 0x3C, 0xC0, /* 0x41 A */
|
||||||
|
0xFC, 0xCD, 0x9B, 0xE6, 0x6C, 0xFF, 0x00, /* 0x42 B */
|
||||||
|
0x3C, 0xCF, 0x06, 0x0C, 0x0C, 0xCF, 0x00, /* 0x43 C */
|
||||||
|
0xF8, 0xD9, 0x9B, 0x36, 0x6D, 0xBE, 0x00, /* 0x44 D */
|
||||||
|
0xFE, 0xC5, 0xA3, 0xC6, 0x8C, 0x7F, 0x80, /* 0x45 E */
|
||||||
|
0xFE, 0xC5, 0xA3, 0xC6, 0x8C, 0x3C, 0x00, /* 0x46 F */
|
||||||
|
0x3C, 0xCF, 0x06, 0x0C, 0xEC, 0xCF, 0x80, /* 0x47 G */
|
||||||
|
0xCF, 0x3C, 0xFF, 0xCF, 0x3C, 0xC0, /* 0x48 H */
|
||||||
|
0xF6, 0x66, 0x66, 0xF0, /* 0x49 I */
|
||||||
|
0x1E, 0x18, 0x30, 0x6C, 0xD9, 0x9E, 0x00, /* 0x4A J */
|
||||||
|
0xE6, 0xCD, 0xB3, 0xC6, 0xCC, 0xF9, 0x80, /* 0x4B K */
|
||||||
|
0xF0, 0xC1, 0x83, 0x06, 0x2C, 0xFF, 0x80, /* 0x4C L */
|
||||||
|
0xC7, 0xDF, 0xFF, 0xFD, 0x78, 0xF1, 0x80, /* 0x4D M */
|
||||||
|
0xC7, 0xCF, 0xDE, 0xFC, 0xF8, 0xF1, 0x80, /* 0x4E N */
|
||||||
|
0x38, 0xDB, 0x1E, 0x3C, 0x6D, 0x8E, 0x00, /* 0x4F O */
|
||||||
|
0xFC, 0xCD, 0x9B, 0xE6, 0x0C, 0x3C, 0x00, /* 0x50 P */
|
||||||
|
0x7B, 0x3C, 0xF3, 0xDD, 0xE1, 0xC0, /* 0x51 Q */
|
||||||
|
0xFC, 0xCD, 0x9B, 0xE6, 0xCC, 0xF9, 0x80, /* 0x52 R */
|
||||||
|
0x7B, 0x3E, 0x1C, 0x1F, 0x37, 0x80, /* 0x53 S */
|
||||||
|
0xFE, 0xD3, 0x0C, 0x30, 0xC7, 0x80, /* 0x54 T */
|
||||||
|
0xCF, 0x3C, 0xF3, 0xCF, 0x3F, 0xC0, /* 0x55 U */
|
||||||
|
0xCF, 0x3C, 0xF3, 0xCD, 0xE3, 0x00, /* 0x56 V */
|
||||||
|
0xC7, 0x8F, 0x1E, 0xBF, 0xFD, 0xF1, 0x80, /* 0x57 W */
|
||||||
|
0xC7, 0x8D, 0xB1, 0xC3, 0x8D, 0xB1, 0x80, /* 0x58 X */
|
||||||
|
0xCF, 0x3C, 0xDE, 0x30, 0xC7, 0x80, /* 0x59 Y */
|
||||||
|
0xFF, 0x8E, 0x30, 0xC3, 0x2C, 0xFF, 0x80, /* 0x5A Z */
|
||||||
|
0xFC, 0xCC, 0xCC, 0xF0, /* 0x5B bracketleft */
|
||||||
|
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, /* 0x5C backslash */
|
||||||
|
0xF3, 0x33, 0x33, 0xF0, /* 0x5D bracketright */
|
||||||
|
0x10, 0x71, 0xB6, 0x30, /* 0x5E asciicircum */
|
||||||
|
0xFF, /* 0x5F underscore */
|
||||||
|
0xD9, 0x80, /* 0x60 grave */
|
||||||
|
0x78, 0x19, 0xF6, 0x67, 0x60, /* 0x61 a */
|
||||||
|
0xE0, 0xC1, 0x83, 0xE6, 0x6C, 0xF7, 0x00, /* 0x62 b */
|
||||||
|
0x7B, 0x3C, 0x33, 0x78, /* 0x63 c */
|
||||||
|
0x1C, 0x18, 0x33, 0xEC, 0xD9, 0x9D, 0x80, /* 0x64 d */
|
||||||
|
0x7B, 0x3F, 0xF0, 0x78, /* 0x65 e */
|
||||||
|
0x39, 0xB6, 0x3C, 0x61, 0x8F, 0x00, /* 0x66 f */
|
||||||
|
0x77, 0x9B, 0x33, 0xE0, 0xDF, 0x00, /* 0x67 g */
|
||||||
|
0xE0, 0xC1, 0xB3, 0xB6, 0x6C, 0xF9, 0x80, /* 0x68 h */
|
||||||
|
0x60, 0xE6, 0x66, 0xF0, /* 0x69 i */
|
||||||
|
0x0C, 0x00, 0xC3, 0x0F, 0x3C, 0xDE, /* 0x6A j */
|
||||||
|
0xE0, 0xC1, 0x9B, 0x67, 0x8D, 0xB9, 0x80, /* 0x6B k */
|
||||||
|
0xE6, 0x66, 0x66, 0xF0, /* 0x6C l */
|
||||||
|
0xCD, 0xFF, 0xFE, 0xBC, 0x60, /* 0x6D m */
|
||||||
|
0xFB, 0x3C, 0xF3, 0xCC, /* 0x6E n */
|
||||||
|
0x7B, 0x3C, 0xF3, 0x78, /* 0x6F o */
|
||||||
|
0xDC, 0xCD, 0x9B, 0xE6, 0x1E, 0x00, /* 0x70 p */
|
||||||
|
0x77, 0x9B, 0x33, 0xE0, 0xC3, 0xC0, /* 0x71 q */
|
||||||
|
0xDC, 0xED, 0x9B, 0x0F, 0x00, /* 0x72 r */
|
||||||
|
0x7F, 0x07, 0x83, 0xF8, /* 0x73 s */
|
||||||
|
0x23, 0x3E, 0xC6, 0x34, 0xC0, /* 0x74 t */
|
||||||
|
0xCD, 0x9B, 0x36, 0x67, 0x60, /* 0x75 u */
|
||||||
|
0xCF, 0x3C, 0xDE, 0x30, /* 0x76 v */
|
||||||
|
0xC7, 0xAF, 0xFF, 0xF6, 0xC0, /* 0x77 w */
|
||||||
|
0xC6, 0xD8, 0xE3, 0x6C, 0x60, /* 0x78 x */
|
||||||
|
0xCF, 0x3C, 0xDF, 0x0F, 0xE0, /* 0x79 y */
|
||||||
|
0xFE, 0x63, 0x19, 0xFC, /* 0x7A z */
|
||||||
|
0x1C, 0xC3, 0x38, 0x30, 0xC1, 0xC0, /* 0x7B braceleft */
|
||||||
|
0xFC, 0xFC, /* 0x7C bar */
|
||||||
|
0xE0, 0xC3, 0x07, 0x30, 0xCE, 0x00, /* 0x7D braceright */
|
||||||
|
0x77, 0xB8, /* 0x7E asciitilde */
|
||||||
|
0x10, 0x71, 0xB6, 0x3C, 0x7F, 0xC0 /* 0x7F uni007F */
|
||||||
|
};
|
||||||
|
|
||||||
|
const GFXglyph IBM8x8pxGlyphs[] PROGMEM = {
|
||||||
|
{ 0, 1, 1, 2, 0, -1 }, /* 0x20 space */
|
||||||
|
{ 1, 4, 7, 5, 0, -7 }, /* 0x21 exclam */
|
||||||
|
{ 5, 5, 3, 6, 0, -7 }, /* 0x22 quotedbl */
|
||||||
|
{ 7, 7, 7, 8, 0, -7 }, /* 0x23 numbersign */
|
||||||
|
{ 14, 6, 7, 7, 0, -7 }, /* 0x24 dollar */
|
||||||
|
{ 20, 7, 6, 8, 0, -6 }, /* 0x25 percent */
|
||||||
|
{ 26, 7, 7, 8, 0, -7 }, /* 0x26 ampersand */
|
||||||
|
{ 33, 3, 3, 4, 0, -7 }, /* 0x27 quotesingle */
|
||||||
|
{ 35, 4, 7, 5, 0, -7 }, /* 0x28 parenleft */
|
||||||
|
{ 39, 4, 7, 5, 0, -7 }, /* 0x29 parenright */
|
||||||
|
{ 43, 8, 5, 9, 0, -6 }, /* 0x2A asterisk */
|
||||||
|
{ 48, 6, 5, 7, 0, -6 }, /* 0x2B plus */
|
||||||
|
{ 52, 3, 3, 4, 0, -2 }, /* 0x2C comma */
|
||||||
|
{ 54, 6, 1, 7, 0, -4 }, /* 0x2D hyphen */
|
||||||
|
{ 55, 2, 2, 3, 0, -2 }, /* 0x2E period */
|
||||||
|
{ 56, 7, 7, 8, 0, -7 }, /* 0x2F slash */
|
||||||
|
{ 63, 7, 7, 8, 0, -7 }, /* 0x30 zero */
|
||||||
|
{ 70, 6, 7, 7, 0, -7 }, /* 0x31 one */
|
||||||
|
{ 76, 6, 7, 7, 0, -7 }, /* 0x32 two */
|
||||||
|
{ 82, 6, 7, 7, 0, -7 }, /* 0x33 three */
|
||||||
|
{ 88, 7, 7, 8, 0, -7 }, /* 0x34 four */
|
||||||
|
{ 95, 6, 7, 7, 0, -7 }, /* 0x35 five */
|
||||||
|
{ 101, 6, 7, 7, 0, -7 }, /* 0x36 six */
|
||||||
|
{ 107, 6, 7, 7, 0, -7 }, /* 0x37 seven */
|
||||||
|
{ 113, 6, 7, 7, 0, -7 }, /* 0x38 eight */
|
||||||
|
{ 119, 6, 7, 7, 0, -7 }, /* 0x39 nine */
|
||||||
|
{ 125, 2, 6, 3, 0, -6 }, /* 0x3A colon */
|
||||||
|
{ 127, 3, 6, 4, 0, -6 }, /* 0x3B semicolon */
|
||||||
|
{ 130, 5, 7, 6, 0, -7 }, /* 0x3C less */
|
||||||
|
{ 135, 6, 4, 7, 0, -5 }, /* 0x3D equal */
|
||||||
|
{ 138, 5, 7, 6, 0, -7 }, /* 0x3E greater */
|
||||||
|
{ 143, 6, 7, 7, 0, -7 }, /* 0x3F question */
|
||||||
|
{ 149, 7, 7, 8, 0, -7 }, /* 0x40 at */
|
||||||
|
{ 156, 6, 7, 7, 0, -7 }, /* 0x41 A */
|
||||||
|
{ 162, 7, 7, 8, 0, -7 }, /* 0x42 B */
|
||||||
|
{ 169, 7, 7, 8, 0, -7 }, /* 0x43 C */
|
||||||
|
{ 176, 7, 7, 8, 0, -7 }, /* 0x44 D */
|
||||||
|
{ 183, 7, 7, 8, 0, -7 }, /* 0x45 E */
|
||||||
|
{ 190, 7, 7, 8, 0, -7 }, /* 0x46 F */
|
||||||
|
{ 197, 7, 7, 8, 0, -7 }, /* 0x47 G */
|
||||||
|
{ 204, 6, 7, 7, 0, -7 }, /* 0x48 H */
|
||||||
|
{ 210, 4, 7, 5, 0, -7 }, /* 0x49 I */
|
||||||
|
{ 214, 7, 7, 8, 0, -7 }, /* 0x4A J */
|
||||||
|
{ 221, 7, 7, 8, 0, -7 }, /* 0x4B K */
|
||||||
|
{ 228, 7, 7, 8, 0, -7 }, /* 0x4C L */
|
||||||
|
{ 235, 7, 7, 8, 0, -7 }, /* 0x4D M */
|
||||||
|
{ 242, 7, 7, 8, 0, -7 }, /* 0x4E N */
|
||||||
|
{ 249, 7, 7, 8, 0, -7 }, /* 0x4F O */
|
||||||
|
{ 256, 7, 7, 8, 0, -7 }, /* 0x50 P */
|
||||||
|
{ 263, 6, 7, 7, 0, -7 }, /* 0x51 Q */
|
||||||
|
{ 269, 7, 7, 8, 0, -7 }, /* 0x52 R */
|
||||||
|
{ 276, 6, 7, 7, 0, -7 }, /* 0x53 S */
|
||||||
|
{ 282, 6, 7, 7, 0, -7 }, /* 0x54 T */
|
||||||
|
{ 288, 6, 7, 7, 0, -7 }, /* 0x55 U */
|
||||||
|
{ 294, 6, 7, 7, 0, -7 }, /* 0x56 V */
|
||||||
|
{ 300, 7, 7, 8, 0, -7 }, /* 0x57 W */
|
||||||
|
{ 307, 7, 7, 8, 0, -7 }, /* 0x58 X */
|
||||||
|
{ 314, 6, 7, 7, 0, -7 }, /* 0x59 Y */
|
||||||
|
{ 320, 7, 7, 8, 0, -7 }, /* 0x5A Z */
|
||||||
|
{ 327, 4, 7, 5, 0, -7 }, /* 0x5B bracketleft */
|
||||||
|
{ 331, 7, 7, 8, 0, -7 }, /* 0x5C backslash */
|
||||||
|
{ 338, 4, 7, 5, 0, -7 }, /* 0x5D bracketright */
|
||||||
|
{ 342, 7, 4, 8, 0, -7 }, /* 0x5E asciicircum */
|
||||||
|
{ 346, 8, 1, 9, 0, 0 }, /* 0x5F underscore */
|
||||||
|
{ 347, 3, 3, 4, 0, -7 }, /* 0x60 grave */
|
||||||
|
{ 349, 7, 5, 8, 0, -5 }, /* 0x61 a */
|
||||||
|
{ 354, 7, 7, 8, 0, -7 }, /* 0x62 b */
|
||||||
|
{ 361, 6, 5, 7, 0, -5 }, /* 0x63 c */
|
||||||
|
{ 365, 7, 7, 8, 0, -7 }, /* 0x64 d */
|
||||||
|
{ 372, 6, 5, 7, 0, -5 }, /* 0x65 e */
|
||||||
|
{ 376, 6, 7, 7, 0, -7 }, /* 0x66 f */
|
||||||
|
{ 382, 7, 6, 8, 0, -5 }, /* 0x67 g */
|
||||||
|
{ 388, 7, 7, 8, 0, -7 }, /* 0x68 h */
|
||||||
|
{ 395, 4, 7, 5, 0, -7 }, /* 0x69 i */
|
||||||
|
{ 399, 6, 8, 7, 0, -7 }, /* 0x6A j */
|
||||||
|
{ 405, 7, 7, 8, 0, -7 }, /* 0x6B k */
|
||||||
|
{ 412, 4, 7, 5, 0, -7 }, /* 0x6C l */
|
||||||
|
{ 416, 7, 5, 8, 0, -5 }, /* 0x6D m */
|
||||||
|
{ 421, 6, 5, 7, 0, -5 }, /* 0x6E n */
|
||||||
|
{ 425, 6, 5, 7, 0, -5 }, /* 0x6F o */
|
||||||
|
{ 429, 7, 6, 8, 0, -5 }, /* 0x70 p */
|
||||||
|
{ 435, 7, 6, 8, 0, -5 }, /* 0x71 q */
|
||||||
|
{ 441, 7, 5, 8, 0, -5 }, /* 0x72 r */
|
||||||
|
{ 446, 6, 5, 7, 0, -5 }, /* 0x73 s */
|
||||||
|
{ 450, 5, 7, 6, 0, -7 }, /* 0x74 t */
|
||||||
|
{ 455, 7, 5, 8, 0, -5 }, /* 0x75 u */
|
||||||
|
{ 460, 6, 5, 7, 0, -5 }, /* 0x76 v */
|
||||||
|
{ 464, 7, 5, 8, 0, -5 }, /* 0x77 w */
|
||||||
|
{ 469, 7, 5, 8, 0, -5 }, /* 0x78 x */
|
||||||
|
{ 474, 6, 6, 7, 0, -5 }, /* 0x79 y */
|
||||||
|
{ 479, 6, 5, 7, 0, -5 }, /* 0x7A z */
|
||||||
|
{ 483, 6, 7, 7, 0, -7 }, /* 0x7B braceleft */
|
||||||
|
{ 489, 2, 7, 3, 0, -7 }, /* 0x7C bar */
|
||||||
|
{ 491, 6, 7, 7, 0, -7 }, /* 0x7D braceright */
|
||||||
|
{ 497, 7, 2, 8, 0, -7 }, /* 0x7E asciitilde */
|
||||||
|
{ 499, 7, 6, 8, 0, -6 } /* 0x7F uni007F */
|
||||||
|
};
|
||||||
|
|
||||||
|
const GFXfont IBM8x8px PROGMEM = {
|
||||||
|
(uint8_t *)IBM8x8pxBitmaps,
|
||||||
|
(GFXglyph *)IBM8x8pxGlyphs,
|
||||||
|
0x20, 0x7F, 8 };
|
||||||
485
lib/obp60task/fonts/Ubuntu_Bold10pt8b.h
Normal file
485
lib/obp60task/fonts/Ubuntu_Bold10pt8b.h
Normal file
@@ -0,0 +1,485 @@
|
|||||||
|
const uint8_t Ubuntu_Bold10pt8bBitmaps[] PROGMEM = {
|
||||||
|
0x00, 0xFF, 0xFF, 0xFF, 0xE3, 0xFF, 0xC0, 0xEF, 0xDF, 0xBF, 0x7E, 0xFD,
|
||||||
|
0xC0, 0x0E, 0xE0, 0xEE, 0x1D, 0xCF, 0xFF, 0xFF, 0xF1, 0xDC, 0x1D, 0xC3,
|
||||||
|
0xB8, 0xFF, 0xFF, 0xFF, 0x3B, 0x83, 0xB8, 0x77, 0x07, 0x70, 0x1C, 0x0E,
|
||||||
|
0x0F, 0xCF, 0xEE, 0x07, 0x03, 0x81, 0xFC, 0x7F, 0x0F, 0xC0, 0xE0, 0x74,
|
||||||
|
0x3F, 0xF9, 0xF8, 0x38, 0x1C, 0x00, 0x38, 0x38, 0x7C, 0x70, 0xC6, 0x70,
|
||||||
|
0xC6, 0xE0, 0xC6, 0xE0, 0xC7, 0xC0, 0x7D, 0xDC, 0x3B, 0xBE, 0x03, 0xE3,
|
||||||
|
0x07, 0x63, 0x07, 0x63, 0x0E, 0x63, 0x0E, 0x3E, 0x1C, 0x1C, 0x1E, 0x01,
|
||||||
|
0xF8, 0x1F, 0xE0, 0xE7, 0x07, 0x38, 0x1F, 0x80, 0xF8, 0x0F, 0xCE, 0xEF,
|
||||||
|
0x77, 0x3F, 0x38, 0xF9, 0xFF, 0xC7, 0xFF, 0x1F, 0xBC, 0xFF, 0xFF, 0xC0,
|
||||||
|
0x08, 0x73, 0x8E, 0x71, 0xCE, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x87, 0x1C,
|
||||||
|
0x38, 0xE1, 0xC2, 0x43, 0x87, 0x1C, 0x38, 0xE1, 0xC7, 0x1C, 0x71, 0xC7,
|
||||||
|
0x1C, 0x73, 0x8E, 0x71, 0xCE, 0x10, 0x1C, 0x0E, 0x17, 0x5F, 0xFF, 0xF9,
|
||||||
|
0xB1, 0xDC, 0x6C, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0x77, 0x77, 0xEE, 0xFF, 0xFF,
|
||||||
|
0xC0, 0x6F, 0xF6, 0x01, 0xC0, 0xE0, 0x38, 0x0E, 0x07, 0x01, 0xC0, 0x70,
|
||||||
|
0x38, 0x0E, 0x03, 0x81, 0xC0, 0x70, 0x1C, 0x0E, 0x03, 0x80, 0xE0, 0x70,
|
||||||
|
0x1C, 0x07, 0x03, 0x80, 0x1C, 0x3F, 0x9F, 0xDE, 0xFE, 0x3F, 0x1F, 0x8F,
|
||||||
|
0xC7, 0xE3, 0xF1, 0xFD, 0xEF, 0xE7, 0xF0, 0xE0, 0x0E, 0x3D, 0xFF, 0xF6,
|
||||||
|
0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC0, 0x3E, 0x7F, 0xBF,
|
||||||
|
0xEC, 0x70, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0xFF, 0xFF,
|
||||||
|
0xFC, 0x3C, 0x7F, 0x3F, 0xC8, 0xE0, 0x70, 0x30, 0xF0, 0x7E, 0x07, 0x81,
|
||||||
|
0xE0, 0xFF, 0xFF, 0xF3, 0xF0, 0x07, 0x07, 0x87, 0xC3, 0xE3, 0xF3, 0xB9,
|
||||||
|
0x9D, 0xCE, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0x70, 0x38, 0x3F, 0x1F, 0x8F,
|
||||||
|
0xC7, 0x03, 0x83, 0xF1, 0xFC, 0xFF, 0x07, 0x81, 0xC0, 0xFF, 0xFF, 0xF3,
|
||||||
|
0xE0, 0x07, 0x0F, 0x8F, 0xCF, 0x07, 0x07, 0xF3, 0xFD, 0xFF, 0xE3, 0xF1,
|
||||||
|
0xF8, 0xEF, 0xF7, 0xF1, 0xF0, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0x70,
|
||||||
|
0x70, 0x38, 0x38, 0x1C, 0x0E, 0x0E, 0x07, 0x03, 0x80, 0x3E, 0x3F, 0xBF,
|
||||||
|
0xFC, 0x7E, 0x3F, 0xB9, 0xF8, 0xFE, 0xE7, 0xF1, 0xF8, 0xFF, 0xF7, 0xF1,
|
||||||
|
0xF0, 0x3E, 0x3F, 0xBF, 0xDC, 0x7E, 0x3F, 0x1F, 0xFE, 0xFF, 0x3F, 0x83,
|
||||||
|
0xC3, 0xCF, 0xC7, 0xC3, 0x80, 0x6F, 0xF6, 0x00, 0x06, 0xFF, 0x60, 0x33,
|
||||||
|
0xDE, 0x60, 0x00, 0x00, 0x73, 0x9C, 0xEE, 0x70, 0x01, 0x87, 0xEF, 0xFF,
|
||||||
|
0xF8, 0xE0, 0x3F, 0x8F, 0xFC, 0x7E, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xE0,
|
||||||
|
0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x60, 0x3E, 0x3F, 0xE3, 0xF0, 0x38, 0xFF,
|
||||||
|
0xFE, 0xF8, 0x60, 0x00, 0x7C, 0xFE, 0xFF, 0x07, 0x07, 0x07, 0x0E, 0x1E,
|
||||||
|
0x3C, 0x38, 0x38, 0x00, 0x30, 0x78, 0x78, 0x30, 0x03, 0xF0, 0x07, 0xFE,
|
||||||
|
0x0F, 0x03, 0x86, 0x00, 0xE6, 0x1F, 0xB7, 0x3F, 0xCF, 0x3C, 0xE7, 0x9C,
|
||||||
|
0x73, 0xCE, 0x39, 0xE7, 0x1C, 0xF3, 0xCE, 0x5C, 0xFF, 0xE6, 0x3F, 0xE3,
|
||||||
|
0x80, 0x00, 0xF0, 0x00, 0x3F, 0xE0, 0x07, 0xF8, 0x00, 0x03, 0x80, 0x0F,
|
||||||
|
0x80, 0x1F, 0x00, 0x77, 0x00, 0xEE, 0x03, 0xDE, 0x07, 0x1C, 0x1E, 0x3C,
|
||||||
|
0x3F, 0xF8, 0x7F, 0xF1, 0xFF, 0xF3, 0x80, 0xE7, 0x01, 0xDC, 0x01, 0xC0,
|
||||||
|
0xFE, 0x3F, 0xCF, 0xFB, 0x8E, 0xE3, 0xBF, 0xCF, 0xF3, 0xFE, 0xE1, 0xF8,
|
||||||
|
0x7E, 0x1F, 0xFF, 0xFF, 0xBF, 0x80, 0x0F, 0xC7, 0xFD, 0xFF, 0xBC, 0x2F,
|
||||||
|
0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1E, 0x01, 0xE0, 0x3F, 0xF3, 0xFE,
|
||||||
|
0x1F, 0x80, 0xFF, 0x0F, 0xFC, 0xFF, 0xEE, 0x1E, 0xE0, 0xFE, 0x07, 0xE0,
|
||||||
|
0x7E, 0x07, 0xE0, 0x7E, 0x0F, 0xE1, 0xEF, 0xFE, 0xFF, 0xCF, 0xF0, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFC, 0x0E, 0x07, 0xFB, 0xFD, 0xFE, 0xE0, 0x70, 0x38, 0x1F,
|
||||||
|
0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xFE, 0xFE, 0xFE, 0xE0,
|
||||||
|
0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x0F, 0xC7, 0xFD, 0xFF, 0xBC, 0x2F, 0x01,
|
||||||
|
0xC0, 0x38, 0x07, 0x07, 0xE0, 0xFE, 0x1D, 0xE3, 0xBF, 0xF3, 0xFE, 0x1F,
|
||||||
|
0x80, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xC0, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xC0, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07,
|
||||||
|
0x03, 0x81, 0xD1, 0xEF, 0xFF, 0xF3, 0xF0, 0xE0, 0xFE, 0x1E, 0xE3, 0xCE,
|
||||||
|
0x78, 0xEF, 0x0F, 0xE0, 0xFC, 0x0F, 0xC0, 0xEE, 0x0E, 0x70, 0xE7, 0x8E,
|
||||||
|
0x3C, 0xE1, 0xEE, 0x0F, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81,
|
||||||
|
0xC0, 0xE0, 0x70, 0x38, 0x1F, 0xFF, 0xFF, 0xFC, 0x70, 0x1C, 0xF0, 0x79,
|
||||||
|
0xE0, 0xF3, 0xE3, 0xE7, 0xC7, 0xDD, 0x8D, 0xFB, 0xBB, 0xF3, 0x67, 0xE7,
|
||||||
|
0xCF, 0xCF, 0x9F, 0x8E, 0x3F, 0x1C, 0x7E, 0x00, 0xFC, 0x01, 0xC0, 0xE0,
|
||||||
|
0xFE, 0x1F, 0xC3, 0xFC, 0x7F, 0xCF, 0xD9, 0xFB, 0xBF, 0x3F, 0xE7, 0xFC,
|
||||||
|
0x7F, 0x87, 0xF0, 0xFE, 0x0F, 0xC1, 0xC0, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF,
|
||||||
|
0x9E, 0x1E, 0xF0, 0x3F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0,
|
||||||
|
0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0, 0x3F, 0x00, 0xFE, 0x3F, 0xEF, 0xFF,
|
||||||
|
0x87, 0xE1, 0xF8, 0x7F, 0xFF, 0xFE, 0xFE, 0x38, 0x0E, 0x03, 0x80, 0xE0,
|
||||||
|
0x38, 0x00, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF, 0x9E, 0x1E, 0xF0, 0x3F, 0x80,
|
||||||
|
0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F,
|
||||||
|
0xF0, 0x3F, 0x00, 0x3C, 0x00, 0x7E, 0x00, 0x78, 0xFE, 0x1F, 0xF3, 0xFF,
|
||||||
|
0x70, 0xEE, 0x1D, 0xC3, 0xBF, 0xF7, 0xFC, 0xFF, 0x1C, 0xF3, 0x8E, 0x70,
|
||||||
|
0xEE, 0x1D, 0xC1, 0xC0, 0x3F, 0x1F, 0xEF, 0xFB, 0x80, 0xE0, 0x3E, 0x07,
|
||||||
|
0xF0, 0x7E, 0x03, 0xC0, 0x74, 0x1F, 0xFF, 0xFF, 0x9F, 0xC0, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0x87, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0,
|
||||||
|
0x38, 0x07, 0x00, 0xE0, 0x1C, 0x00, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E,
|
||||||
|
0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0xC7, 0xBF, 0xE7, 0xFC,
|
||||||
|
0x3E, 0x00, 0xE0, 0x0E, 0xE0, 0x39, 0xC0, 0x71, 0xC1, 0xC3, 0x83, 0x87,
|
||||||
|
0x07, 0x07, 0x1C, 0x0E, 0x38, 0x0E, 0xE0, 0x1D, 0xC0, 0x1F, 0x00, 0x3E,
|
||||||
|
0x00, 0x7C, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xFC, 0x1C, 0x1D, 0xC3, 0x87,
|
||||||
|
0x38, 0x78, 0xE7, 0x1F, 0x1C, 0xE3, 0x63, 0x8E, 0x6C, 0xE1, 0xDD, 0xDC,
|
||||||
|
0x3B, 0xBB, 0x83, 0x63, 0x60, 0x7C, 0x7C, 0x0F, 0x8F, 0x81, 0xE0, 0xF0,
|
||||||
|
0x1C, 0x1C, 0x00, 0xF0, 0x3D, 0xE1, 0xE3, 0x87, 0x07, 0x38, 0x1F, 0xE0,
|
||||||
|
0x3F, 0x00, 0x78, 0x01, 0xE0, 0x0F, 0xC0, 0x7F, 0x81, 0xCE, 0x0E, 0x1C,
|
||||||
|
0x78, 0x7B, 0xC0, 0xF0, 0xE0, 0x3B, 0x83, 0x9C, 0x1C, 0x71, 0xC3, 0xDE,
|
||||||
|
0x0E, 0xE0, 0x3E, 0x01, 0xF0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00,
|
||||||
|
0x70, 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFC, 0x0E, 0x07, 0x03, 0x80, 0xE0,
|
||||||
|
0x70, 0x38, 0x1E, 0x07, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xCE,
|
||||||
|
0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0xFF, 0xF0, 0xE0, 0x1C,
|
||||||
|
0x07, 0x01, 0xC0, 0x38, 0x0E, 0x03, 0x80, 0x70, 0x1C, 0x07, 0x00, 0xE0,
|
||||||
|
0x38, 0x0E, 0x01, 0xC0, 0x70, 0x1C, 0x03, 0x80, 0xE0, 0x38, 0x07, 0xFF,
|
||||||
|
0xFE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x3F, 0xFF, 0xF0,
|
||||||
|
0x0E, 0x03, 0xE0, 0x7C, 0x1D, 0xC7, 0xBC, 0xE3, 0xB8, 0x3B, 0x06, 0xFF,
|
||||||
|
0xFF, 0xF0, 0x47, 0x1E, 0x20, 0x7E, 0x3F, 0x9F, 0xE0, 0x73, 0xFB, 0xFF,
|
||||||
|
0x8F, 0xC7, 0xFF, 0xBF, 0xCF, 0xE0, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0,
|
||||||
|
0x3F, 0xCF, 0xFB, 0xFE, 0xE3, 0xF8, 0x7E, 0x1F, 0x87, 0xE3, 0xFF, 0xEF,
|
||||||
|
0xFB, 0xF8, 0x1F, 0x3F, 0x7F, 0xF0, 0xE0, 0xE0, 0xE0, 0xF0, 0x7F, 0x7F,
|
||||||
|
0x1F, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC7, 0xF7, 0xFD, 0xFF, 0xF1,
|
||||||
|
0xF8, 0x7E, 0x1F, 0x87, 0xF1, 0xDF, 0xF7, 0xFC, 0x7F, 0x1F, 0x1F, 0xE7,
|
||||||
|
0xFF, 0x87, 0xFF, 0xFF, 0xFE, 0x03, 0xC0, 0x7F, 0x9F, 0xE1, 0xF8, 0x3F,
|
||||||
|
0x7E, 0xFE, 0xE0, 0xE0, 0xFE, 0xFE, 0xFE, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
|
||||||
|
0xE0, 0xE0, 0xE0, 0x1F, 0xDF, 0xF7, 0xFF, 0xC7, 0xE1, 0xF8, 0x7F, 0x1F,
|
||||||
|
0xFF, 0x7F, 0xCF, 0xF0, 0x1C, 0x0F, 0x7F, 0x9F, 0xE7, 0xE0, 0xE0, 0x38,
|
||||||
|
0x0E, 0x03, 0x80, 0xE0, 0x3F, 0xCF, 0xFB, 0xFF, 0xE3, 0xF8, 0x7E, 0x1F,
|
||||||
|
0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0x1C, 0x71, 0xC7, 0x00, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7,
|
||||||
|
0x1F, 0xFF, 0xBC, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC3, 0xB8,
|
||||||
|
0xE7, 0x38, 0xEE, 0x1F, 0x83, 0xF8, 0x77, 0x8E, 0x79, 0xC7, 0x38, 0x77,
|
||||||
|
0x07, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x7F, 0xE7, 0xFE,
|
||||||
|
0xF9, 0xFF, 0xFB, 0xFF, 0xFF, 0x1C, 0x7E, 0x38, 0xFC, 0x71, 0xF8, 0xE3,
|
||||||
|
0xF1, 0xC7, 0xE3, 0x8F, 0xC7, 0x1F, 0x8E, 0x38, 0xFF, 0x3F, 0xEF, 0xFF,
|
||||||
|
0x8F, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1C, 0x1E, 0x1F,
|
||||||
|
0xE7, 0xFB, 0xCF, 0xE1, 0xF8, 0x7E, 0x1F, 0xCF, 0x7F, 0x9F, 0xE1, 0xE0,
|
||||||
|
0xFE, 0x3F, 0xEF, 0xFB, 0x8F, 0xE1, 0xF8, 0x7E, 0x1F, 0x8F, 0xFF, 0xBF,
|
||||||
|
0xEF, 0xF3, 0x80, 0xE0, 0x38, 0x0E, 0x00, 0x1F, 0xDF, 0xF7, 0xFF, 0xC7,
|
||||||
|
0xE1, 0xF8, 0x7E, 0x1F, 0xC7, 0x7F, 0xDF, 0xF3, 0xFC, 0x07, 0x01, 0xC0,
|
||||||
|
0x70, 0x1C, 0x7F, 0xFF, 0xFF, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x80,
|
||||||
|
0x3E, 0xFE, 0xE0, 0xE0, 0xF8, 0x7E, 0x1F, 0x07, 0x87, 0xFF, 0xFC, 0xE1,
|
||||||
|
0xC3, 0x87, 0xFF, 0xFF, 0xF8, 0x70, 0xE1, 0xC3, 0x87, 0xF7, 0xE7, 0xC0,
|
||||||
|
0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0xC7, 0xFF, 0xDF,
|
||||||
|
0xF3, 0xFC, 0xE0, 0xFE, 0x1D, 0xC7, 0x38, 0xE7, 0xBC, 0x77, 0x0E, 0xE1,
|
||||||
|
0xFC, 0x1F, 0x03, 0xE0, 0x38, 0x00, 0xE3, 0x8F, 0xC7, 0x1D, 0x8E, 0x33,
|
||||||
|
0x9E, 0xE7, 0x7D, 0xCE, 0xDB, 0x8D, 0xB6, 0x1F, 0x7C, 0x3C, 0x78, 0x38,
|
||||||
|
0xE0, 0x71, 0xC0, 0xF1, 0xEF, 0x78, 0xEE, 0x1F, 0xC1, 0xF0, 0x1C, 0x07,
|
||||||
|
0xC1, 0xFC, 0x3B, 0x8F, 0x7B, 0xC7, 0x80, 0xE0, 0xFC, 0x1D, 0xC7, 0x38,
|
||||||
|
0xE7, 0x1C, 0x77, 0x0E, 0xE1, 0xFC, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x0F,
|
||||||
|
0xE1, 0xF8, 0x3E, 0x00, 0xFF, 0xFF, 0xFF, 0x0E, 0x1C, 0x38, 0x38, 0x70,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x0E, 0x3C, 0xF9, 0xC3, 0x87, 0x0E, 0x1C, 0x79, 0xE3,
|
||||||
|
0xC7, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x7C, 0xF8, 0x70, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xE1, 0xE3, 0xE1, 0xC3, 0x87, 0x0E, 0x1C,
|
||||||
|
0x3C, 0x3C, 0x79, 0xF3, 0x87, 0x0E, 0x1C, 0x39, 0xF3, 0xE7, 0x00, 0x30,
|
||||||
|
0x9F, 0x3F, 0xFF, 0x3E, 0x43, 0x00, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81,
|
||||||
|
0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x00, 0xFF, 0xF1,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF8, 0x1C, 0x1C, 0x1C, 0x3F, 0x7F, 0x7F, 0xF0, 0xE0,
|
||||||
|
0xE0, 0xF0, 0xFF, 0x7F, 0x3F, 0x1C, 0x1C, 0x1C, 0x0F, 0x87, 0xF3, 0xFC,
|
||||||
|
0xF0, 0x38, 0x0E, 0x0F, 0xF3, 0xFC, 0xFF, 0x0E, 0x03, 0x80, 0xFF, 0x3F,
|
||||||
|
0xDF, 0xF0, 0x40, 0xBF, 0xF7, 0xF9, 0xCE, 0x61, 0x98, 0x67, 0x39, 0xFE,
|
||||||
|
0xFF, 0xD0, 0x20, 0xE0, 0xEE, 0x39, 0xC7, 0x1D, 0xC3, 0xB8, 0x3E, 0x1F,
|
||||||
|
0xF3, 0xFE, 0x0E, 0x01, 0xC1, 0xFF, 0x3F, 0xE0, 0xE0, 0x1C, 0x00, 0xFF,
|
||||||
|
0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x3E, 0x7F, 0xFF, 0xE0, 0xE0,
|
||||||
|
0x7C, 0xFE, 0xEF, 0xE7, 0xE7, 0xF7, 0x7E, 0x1E, 0x07, 0x07, 0xFF, 0xFF,
|
||||||
|
0x7C, 0xEF, 0xDF, 0xB8, 0x0F, 0xC0, 0x7F, 0x83, 0x87, 0x18, 0x06, 0xE7,
|
||||||
|
0xDF, 0x3F, 0x3C, 0xC0, 0xF3, 0x03, 0xCF, 0xCF, 0x9F, 0x76, 0x01, 0x8E,
|
||||||
|
0x1C, 0x1F, 0xE0, 0x3F, 0x00, 0x7C, 0xFC, 0x19, 0xFF, 0xF8, 0xFF, 0xBF,
|
||||||
|
0x10, 0x8E, 0x77, 0xBD, 0xCE, 0xF7, 0x9C, 0xE7, 0xBC, 0xE7, 0x10, 0x80,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0xFF, 0xFF, 0xC0,
|
||||||
|
0x0F, 0xC0, 0x7F, 0x83, 0x87, 0x18, 0x06, 0xEF, 0x9F, 0x33, 0x3C, 0xFC,
|
||||||
|
0xF3, 0xE3, 0xCD, 0xCF, 0xB3, 0x76, 0x01, 0x8E, 0x1C, 0x1F, 0xE0, 0x3F,
|
||||||
|
0x00, 0xFF, 0xF0, 0x7B, 0xFC, 0xF3, 0xFD, 0xE0, 0x0E, 0x01, 0xC0, 0x38,
|
||||||
|
0x07, 0x0F, 0xFF, 0xFF, 0xFF, 0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00,
|
||||||
|
0x0F, 0xFF, 0xFF, 0xFF, 0xF8, 0x7B, 0xF0, 0xC7, 0x31, 0x8F, 0xFF, 0x7B,
|
||||||
|
0xF0, 0xCF, 0x3C, 0x3F, 0xFE, 0x11, 0xFC, 0x80, 0xE1, 0xF8, 0x7E, 0x1F,
|
||||||
|
0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE0,
|
||||||
|
0x38, 0x0E, 0x00, 0x1F, 0xF7, 0xFF, 0xFE, 0x7F, 0xE7, 0xFE, 0x7F, 0xE7,
|
||||||
|
0xFE, 0x77, 0xE7, 0x1E, 0x70, 0xE7, 0x0E, 0x70, 0xE7, 0x0E, 0x70, 0xE7,
|
||||||
|
0x0E, 0x70, 0xE7, 0x0E, 0x70, 0xE7, 0x6F, 0xF6, 0x63, 0xBF, 0x37, 0xFB,
|
||||||
|
0x33, 0x33, 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x42, 0x39,
|
||||||
|
0xCF, 0x79, 0xCE, 0x7B, 0xDC, 0xEF, 0x7B, 0x9C, 0x42, 0x00, 0x30, 0x30,
|
||||||
|
0x70, 0x70, 0xF0, 0x60, 0xB0, 0xE0, 0x31, 0xC0, 0x31, 0xC0, 0x33, 0x8E,
|
||||||
|
0x33, 0x9E, 0x07, 0x36, 0x07, 0x26, 0x0E, 0x7F, 0x0E, 0x7F, 0x1C, 0x06,
|
||||||
|
0x1C, 0x06, 0x30, 0x30, 0xE0, 0xE3, 0xC1, 0x85, 0x87, 0x03, 0x1C, 0x06,
|
||||||
|
0x38, 0x0C, 0xEF, 0x19, 0xFF, 0x07, 0x06, 0x0E, 0x1C, 0x38, 0x60, 0x71,
|
||||||
|
0x81, 0xC7, 0xE3, 0x8F, 0xC0, 0x78, 0x0C, 0x7E, 0x0E, 0x03, 0x06, 0x07,
|
||||||
|
0x87, 0x03, 0xC7, 0x00, 0x63, 0x83, 0xF3, 0x9D, 0xF1, 0xDE, 0x01, 0xDB,
|
||||||
|
0x00, 0xE9, 0x80, 0xEF, 0xE0, 0x77, 0xF0, 0x70, 0x30, 0x38, 0x18, 0x0C,
|
||||||
|
0x1E, 0x1E, 0x0C, 0x00, 0x1C, 0x1C, 0x3C, 0x78, 0x70, 0xE0, 0xE0, 0xFF,
|
||||||
|
0x7F, 0x3E, 0x02, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x04, 0x00, 0x00, 0x00,
|
||||||
|
0x70, 0x01, 0xF0, 0x03, 0xE0, 0x0E, 0xE0, 0x1D, 0xC0, 0x7B, 0xC0, 0xE3,
|
||||||
|
0x83, 0xC7, 0x87, 0xFF, 0x0F, 0xFE, 0x3F, 0xFE, 0x70, 0x1C, 0xE0, 0x3B,
|
||||||
|
0x80, 0x38, 0x00, 0x80, 0x03, 0x80, 0x1E, 0x00, 0x10, 0x00, 0x00, 0x00,
|
||||||
|
0x70, 0x01, 0xF0, 0x03, 0xE0, 0x0E, 0xE0, 0x1D, 0xC0, 0x7B, 0xC0, 0xE3,
|
||||||
|
0x83, 0xC7, 0x87, 0xFF, 0x0F, 0xFE, 0x3F, 0xFE, 0x70, 0x1C, 0xE0, 0x3B,
|
||||||
|
0x80, 0x38, 0x01, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x77, 0x00, 0x44, 0x00,
|
||||||
|
0x00, 0x00, 0xE0, 0x03, 0xE0, 0x07, 0xC0, 0x1D, 0xC0, 0x3B, 0x80, 0xF7,
|
||||||
|
0x81, 0xC7, 0x07, 0x8F, 0x0F, 0xFE, 0x1F, 0xFC, 0x7F, 0xFC, 0xE0, 0x39,
|
||||||
|
0xC0, 0x77, 0x00, 0x70, 0x06, 0x40, 0x1F, 0xC0, 0x13, 0x00, 0x00, 0x00,
|
||||||
|
0x38, 0x00, 0xF8, 0x01, 0xF0, 0x07, 0x70, 0x0E, 0xE0, 0x3D, 0xE0, 0x71,
|
||||||
|
0xC1, 0xE3, 0xC3, 0xFF, 0x87, 0xFF, 0x1F, 0xFF, 0x38, 0x0E, 0x70, 0x1D,
|
||||||
|
0xC0, 0x1C, 0x0E, 0xE0, 0x1D, 0xC0, 0x3B, 0x80, 0x00, 0x00, 0x38, 0x00,
|
||||||
|
0xF8, 0x01, 0xF0, 0x07, 0x70, 0x0E, 0xE0, 0x3D, 0xE0, 0x71, 0xC1, 0xE3,
|
||||||
|
0xC3, 0xFF, 0x87, 0xFF, 0x1F, 0xFF, 0x38, 0x0E, 0x70, 0x1D, 0xC0, 0x1C,
|
||||||
|
0x03, 0x80, 0x0D, 0x80, 0x1B, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x03,
|
||||||
|
0xF8, 0x07, 0x70, 0x0E, 0xE0, 0x38, 0xE0, 0x71, 0xC1, 0xE3, 0xC3, 0xFF,
|
||||||
|
0x87, 0xFF, 0x1F, 0xFF, 0x38, 0x0E, 0x70, 0x1D, 0xC0, 0x1C, 0x00, 0x7F,
|
||||||
|
0xE0, 0x1F, 0xFC, 0x07, 0xFF, 0x80, 0xFC, 0x00, 0x3B, 0x80, 0x0E, 0x7F,
|
||||||
|
0x81, 0xCF, 0xF0, 0x71, 0xFE, 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0xFF, 0xE0,
|
||||||
|
0x1C, 0x1F, 0xF7, 0x03, 0xFF, 0xC0, 0x7F, 0xC0, 0x0F, 0xC7, 0xFD, 0xFF,
|
||||||
|
0xBC, 0x2F, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1E, 0x01, 0xE0, 0x3F,
|
||||||
|
0xF3, 0xFE, 0x1F, 0x81, 0x80, 0x18, 0x0F, 0x01, 0xC0, 0x10, 0x1C, 0x07,
|
||||||
|
0x80, 0x80, 0x07, 0xFF, 0xFF, 0xFF, 0xE0, 0x70, 0x3F, 0xDF, 0xEF, 0xF7,
|
||||||
|
0x03, 0x81, 0xC0, 0xFF, 0xFF, 0xFF, 0xE0, 0x04, 0x07, 0x0F, 0x02, 0x00,
|
||||||
|
0x07, 0xFF, 0xFF, 0xFF, 0xE0, 0x70, 0x3F, 0xDF, 0xEF, 0xF7, 0x03, 0x81,
|
||||||
|
0xC0, 0xFF, 0xFF, 0xFF, 0xE0, 0x08, 0x0E, 0x0F, 0x8E, 0xE2, 0x20, 0x03,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF0, 0x38, 0x1F, 0xEF, 0xF7, 0xFB, 0x81, 0xC0, 0xE0,
|
||||||
|
0x7F, 0xFF, 0xFF, 0xF0, 0x77, 0x3B, 0x9D, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xC0, 0xE0, 0x7F, 0xBF, 0xDF, 0xEE, 0x07, 0x03, 0x81, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xC0, 0x47, 0x1E, 0x20, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73,
|
||||||
|
0x9C, 0x11, 0xFC, 0x80, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73,
|
||||||
|
0x9C, 0x10, 0x71, 0xF7, 0x74, 0x40, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3,
|
||||||
|
0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC0, 0xEF, 0xDF, 0xB8, 0x03, 0x87,
|
||||||
|
0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0x3F,
|
||||||
|
0xC0, 0xFF, 0xC3, 0xFF, 0x8E, 0x1E, 0x38, 0x3C, 0xE0, 0x7F, 0xF1, 0xFF,
|
||||||
|
0xC7, 0x38, 0x1C, 0xE0, 0xF3, 0x87, 0x8F, 0xFE, 0x3F, 0xF0, 0xFF, 0x00,
|
||||||
|
0x19, 0x07, 0xF0, 0x4C, 0x00, 0x0E, 0x0F, 0xE1, 0xFC, 0x3F, 0xC7, 0xFC,
|
||||||
|
0xFD, 0x9F, 0xBB, 0xF3, 0xFE, 0x7F, 0xC7, 0xF8, 0x7F, 0x0F, 0xE0, 0xFC,
|
||||||
|
0x1C, 0x04, 0x00, 0x38, 0x00, 0x78, 0x00, 0x40, 0x00, 0x00, 0x3F, 0x03,
|
||||||
|
0xFF, 0x1F, 0xFE, 0x78, 0x7B, 0xC0, 0xFE, 0x01, 0xF8, 0x07, 0xE0, 0x1F,
|
||||||
|
0x80, 0x7F, 0x03, 0xDE, 0x1E, 0x7F, 0xF8, 0xFF, 0xC0, 0xFC, 0x00, 0x00,
|
||||||
|
0x80, 0x07, 0x00, 0x78, 0x00, 0x80, 0x00, 0x00, 0x3F, 0x03, 0xFF, 0x1F,
|
||||||
|
0xFE, 0x78, 0x7B, 0xC0, 0xFE, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7F,
|
||||||
|
0x03, 0xDE, 0x1E, 0x7F, 0xF8, 0xFF, 0xC0, 0xFC, 0x00, 0x01, 0x00, 0x0E,
|
||||||
|
0x00, 0x7C, 0x03, 0xB8, 0x04, 0x40, 0x00, 0x00, 0xFC, 0x0F, 0xFC, 0x7F,
|
||||||
|
0xF9, 0xE1, 0xEF, 0x03, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xFC,
|
||||||
|
0x0F, 0x78, 0x79, 0xFF, 0xE3, 0xFF, 0x03, 0xF0, 0x06, 0x40, 0x3F, 0x80,
|
||||||
|
0x4C, 0x00, 0x00, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF, 0x9E, 0x1E, 0xF0, 0x3F,
|
||||||
|
0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE,
|
||||||
|
0x3F, 0xF0, 0x3F, 0x00, 0x1D, 0xC0, 0x77, 0x01, 0xDC, 0x00, 0x00, 0x0F,
|
||||||
|
0xC0, 0xFF, 0xC7, 0xFF, 0x9E, 0x1E, 0xF0, 0x3F, 0x80, 0x7E, 0x01, 0xF8,
|
||||||
|
0x07, 0xE0, 0x1F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0, 0x3F, 0x00,
|
||||||
|
0x41, 0x71, 0xDD, 0xC7, 0xC1, 0xC1, 0xF1, 0xDD, 0xC7, 0x41, 0x00, 0x00,
|
||||||
|
0x00, 0x3F, 0x63, 0xFF, 0x9F, 0xFE, 0x78, 0xFB, 0xC3, 0xFE, 0x1D, 0xF8,
|
||||||
|
0xE7, 0xE7, 0x1F, 0xB8, 0x7F, 0xC3, 0xDE, 0x1E, 0x7F, 0xF9, 0xFF, 0xC6,
|
||||||
|
0xFC, 0x00, 0x00, 0x10, 0x07, 0x00, 0x78, 0x02, 0x00, 0x01, 0xC1, 0xF8,
|
||||||
|
0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F,
|
||||||
|
0x8F, 0x7F, 0xCF, 0xF8, 0x7C, 0x00, 0x02, 0x00, 0xE0, 0x78, 0x04, 0x00,
|
||||||
|
0x01, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F,
|
||||||
|
0xC1, 0xF8, 0x3F, 0x8F, 0x7F, 0xCF, 0xF8, 0x7C, 0x00, 0x04, 0x01, 0xC0,
|
||||||
|
0x7C, 0x1D, 0xC1, 0x10, 0x00, 0x38, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83,
|
||||||
|
0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xF1, 0xEF, 0xF9, 0xFF, 0x0F,
|
||||||
|
0x80, 0x3B, 0x87, 0x70, 0xEE, 0x00, 0x0E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07,
|
||||||
|
0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xFC, 0x7B, 0xFE, 0x7F,
|
||||||
|
0xC3, 0xE0, 0x01, 0x00, 0x1C, 0x03, 0xC0, 0x08, 0x00, 0x00, 0x70, 0x1D,
|
||||||
|
0xC1, 0xCE, 0x0E, 0x38, 0xE1, 0xEF, 0x07, 0x70, 0x1F, 0x00, 0xF8, 0x03,
|
||||||
|
0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0xE0, 0x38, 0x0F,
|
||||||
|
0xE3, 0xFE, 0xFF, 0xF8, 0x7E, 0x1F, 0x87, 0xFF, 0xFF, 0xEF, 0xE3, 0x80,
|
||||||
|
0xE0, 0x38, 0x00, 0x3E, 0x0F, 0xE3, 0xFE, 0x71, 0xCE, 0x39, 0xCF, 0x39,
|
||||||
|
0xC7, 0x70, 0xEF, 0x1D, 0xF3, 0x8F, 0x70, 0x7E, 0x0F, 0xDF, 0xFB, 0xF7,
|
||||||
|
0x7C, 0x10, 0x1C, 0x07, 0x80, 0x80, 0x03, 0xF1, 0xFC, 0xFF, 0x03, 0x9F,
|
||||||
|
0xDF, 0xFC, 0x7E, 0x3F, 0xFD, 0xFE, 0x7F, 0x04, 0x07, 0x0F, 0x02, 0x00,
|
||||||
|
0x03, 0xF1, 0xFC, 0xFF, 0x03, 0x9F, 0xDF, 0xFC, 0x7E, 0x3F, 0xFD, 0xFE,
|
||||||
|
0x7F, 0x08, 0x0E, 0x0F, 0x8E, 0xE2, 0x20, 0x01, 0xF8, 0xFE, 0x7F, 0x81,
|
||||||
|
0xCF, 0xEF, 0xFE, 0x3F, 0x1F, 0xFE, 0xFF, 0x3F, 0x80, 0x32, 0x3F, 0x89,
|
||||||
|
0x80, 0x07, 0xE3, 0xF9, 0xFE, 0x07, 0x3F, 0xBF, 0xF8, 0xFC, 0x7F, 0xFB,
|
||||||
|
0xFC, 0xFE, 0x77, 0x3B, 0x9D, 0xC0, 0x07, 0xE3, 0xF9, 0xFE, 0x07, 0x3F,
|
||||||
|
0xBF, 0xF8, 0xFC, 0x7F, 0xFB, 0xFC, 0xFE, 0x1E, 0x1F, 0x8C, 0xC6, 0x63,
|
||||||
|
0xF0, 0xF1, 0xF8, 0xFE, 0x7F, 0x81, 0xCF, 0xEF, 0xFE, 0x3F, 0x1F, 0xFE,
|
||||||
|
0xFF, 0x3F, 0x80, 0x7E, 0x78, 0xFF, 0xF9, 0xFF, 0xF8, 0x1C, 0x73, 0xFF,
|
||||||
|
0xEF, 0xFF, 0xF8, 0xE0, 0x71, 0xE0, 0xFF, 0xFC, 0xFF, 0xF8, 0xF9, 0xF0,
|
||||||
|
0x1E, 0x7F, 0x7E, 0xF0, 0xE0, 0xE0, 0xE0, 0xF0, 0x7F, 0x3F, 0x0F, 0x0C,
|
||||||
|
0x0C, 0x3C, 0x38, 0x10, 0x0E, 0x01, 0xE0, 0x10, 0x00, 0x07, 0xC7, 0xF9,
|
||||||
|
0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0x80, 0xF0, 0x1F, 0xE7, 0xF8, 0x7E, 0x02,
|
||||||
|
0x01, 0xC1, 0xE0, 0x20, 0x00, 0x07, 0xC7, 0xF9, 0xFF, 0xE1, 0xFF, 0xFF,
|
||||||
|
0xFF, 0x80, 0xF0, 0x1F, 0xE7, 0xF8, 0x7E, 0x08, 0x07, 0x03, 0xE1, 0xDC,
|
||||||
|
0x22, 0x00, 0x01, 0xF1, 0xFE, 0x7F, 0xF8, 0x7F, 0xFF, 0xFF, 0xE0, 0x3C,
|
||||||
|
0x07, 0xF9, 0xFE, 0x1F, 0x80, 0x3B, 0x8E, 0xE3, 0xB8, 0x00, 0x1F, 0x1F,
|
||||||
|
0xE7, 0xFF, 0x87, 0xFF, 0xFF, 0xFE, 0x03, 0xC0, 0x7F, 0x9F, 0xE1, 0xF8,
|
||||||
|
0x47, 0x1E, 0x20, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x11, 0xFC,
|
||||||
|
0x80, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x10, 0x71, 0xF7, 0x74,
|
||||||
|
0x40, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0xEF,
|
||||||
|
0xDF, 0xB8, 0x03, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E,
|
||||||
|
0x00, 0x0C, 0x07, 0xB0, 0x7C, 0x7E, 0x0B, 0x80, 0x73, 0xFD, 0xFF, 0xFF,
|
||||||
|
0xFC, 0x7E, 0x1F, 0x87, 0xE3, 0x9F, 0xE7, 0xF0, 0x78, 0x19, 0x0F, 0xE1,
|
||||||
|
0x30, 0x00, 0xFF, 0x3F, 0xEF, 0xFF, 0x8F, 0xE1, 0xF8, 0x7E, 0x1F, 0x87,
|
||||||
|
0xE1, 0xF8, 0x7E, 0x1C, 0x10, 0x0E, 0x01, 0xE0, 0x10, 0x00, 0x07, 0x87,
|
||||||
|
0xF9, 0xFE, 0xF3, 0xF8, 0x7E, 0x1F, 0x87, 0xF3, 0xDF, 0xE7, 0xF8, 0x78,
|
||||||
|
0x02, 0x01, 0xC1, 0xE0, 0x20, 0x00, 0x07, 0x87, 0xF9, 0xFE, 0xF3, 0xF8,
|
||||||
|
0x7E, 0x1F, 0x87, 0xF3, 0xDF, 0xE7, 0xF8, 0x78, 0x08, 0x07, 0x03, 0xE1,
|
||||||
|
0xDC, 0x22, 0x00, 0x01, 0xE1, 0xFE, 0x7F, 0xBC, 0xFE, 0x1F, 0x87, 0xE1,
|
||||||
|
0xFC, 0xF7, 0xF9, 0xFE, 0x1E, 0x00, 0x19, 0x0F, 0xE1, 0x30, 0x00, 0x1E,
|
||||||
|
0x1F, 0xE7, 0xFB, 0xCF, 0xE1, 0xF8, 0x7E, 0x1F, 0xCF, 0x7F, 0x9F, 0xE1,
|
||||||
|
0xE0, 0x77, 0x1D, 0xC7, 0x70, 0x00, 0x1E, 0x1F, 0xE7, 0xFB, 0xCF, 0xE1,
|
||||||
|
0xF8, 0x7E, 0x1F, 0xCF, 0x7F, 0x9F, 0xE1, 0xE0, 0x1C, 0x0E, 0x07, 0x00,
|
||||||
|
0x0F, 0xFF, 0xFF, 0xFE, 0x00, 0x1C, 0x0E, 0x07, 0x00, 0x00, 0x07, 0xB7,
|
||||||
|
0xF9, 0xFE, 0xF7, 0xF9, 0xFE, 0xDF, 0xE7, 0xFB, 0xDF, 0xE7, 0xFB, 0x78,
|
||||||
|
0x00, 0x00, 0x10, 0x0E, 0x01, 0xE0, 0x10, 0x00, 0x38, 0x7E, 0x1F, 0x87,
|
||||||
|
0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xF1, 0xFF, 0xF7, 0xFC, 0xFF, 0x02, 0x01,
|
||||||
|
0xC1, 0xE0, 0x20, 0x00, 0x38, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F,
|
||||||
|
0x87, 0xF1, 0xFF, 0xF7, 0xFC, 0xFF, 0x04, 0x03, 0x81, 0xF0, 0xEE, 0x11,
|
||||||
|
0x00, 0x0E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xFC, 0x7F,
|
||||||
|
0xFD, 0xFF, 0x3F, 0xC0, 0x77, 0x1D, 0xC7, 0x70, 0x00, 0xE1, 0xF8, 0x7E,
|
||||||
|
0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0xC7, 0xFF, 0xDF, 0xF3, 0xFC, 0x01,
|
||||||
|
0x00, 0x70, 0x3C, 0x02, 0x00, 0x01, 0xC1, 0xF8, 0x3B, 0x8E, 0x71, 0xCE,
|
||||||
|
0x38, 0xEE, 0x1D, 0xC3, 0xF8, 0x3E, 0x07, 0xC0, 0xF8, 0x1E, 0x1F, 0xC3,
|
||||||
|
0xF0, 0x7C, 0x00, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x3F, 0x8F, 0xFB,
|
||||||
|
0xFE, 0xE3, 0xF8, 0x7E, 0x1F, 0x87, 0xE3, 0xFF, 0xEF, 0xFB, 0xFC, 0xE0,
|
||||||
|
0x38, 0x0E, 0x03, 0x80, 0x3B, 0x87, 0x70, 0xEE, 0x00, 0x0E, 0x0F, 0xC1,
|
||||||
|
0xDC, 0x73, 0x8E, 0x71, 0xC7, 0x70, 0xEE, 0x1F, 0xC1, 0xF0, 0x3E, 0x07,
|
||||||
|
0xC0, 0xF0, 0xFE, 0x1F, 0x83, 0xE0, 0x00 };
|
||||||
|
|
||||||
|
const GFXglyph Ubuntu_Bold10pt8bGlyphs[] PROGMEM = {
|
||||||
|
{ 0, 1, 1, 5, 0, 0 }, // 0x20 ' ' U+0020
|
||||||
|
{ 1, 3, 14, 5, 1, -13 }, // 0x21 '!' U+0021
|
||||||
|
{ 7, 7, 6, 9, 1, -14 }, // 0x22 '"' U+0022
|
||||||
|
{ 13, 12, 14, 14, 1, -13 }, // 0x23 '#' U+0023
|
||||||
|
{ 34, 9, 17, 11, 1, -14 }, // 0x24 '$' U+0024
|
||||||
|
{ 54, 16, 14, 18, 1, -13 }, // 0x25 '%' U+0025
|
||||||
|
{ 82, 13, 14, 14, 1, -13 }, // 0x26 '&' U+0026
|
||||||
|
{ 105, 3, 6, 5, 1, -14 }, // 0x27 ''' U+0027
|
||||||
|
{ 108, 6, 20, 7, 1, -15 }, // 0x28 '(' U+0028
|
||||||
|
{ 123, 6, 20, 7, 0, -15 }, // 0x29 ')' U+0029
|
||||||
|
{ 138, 9, 8, 10, 1, -13 }, // 0x2a '*' U+002A
|
||||||
|
{ 147, 11, 11, 13, 1, -11 }, // 0x2b '+' U+002B
|
||||||
|
{ 163, 4, 6, 5, 0, -2 }, // 0x2c ',' U+002C
|
||||||
|
{ 166, 6, 3, 8, 1, -7 }, // 0x2d '-' U+002D
|
||||||
|
{ 169, 4, 4, 6, 1, -3 }, // 0x2e '.' U+002E
|
||||||
|
{ 171, 10, 20, 9, -1, -15 }, // 0x2f '/' U+002F
|
||||||
|
{ 196, 9, 14, 11, 1, -13 }, // 0x30 '0' U+0030
|
||||||
|
{ 212, 7, 14, 11, 1, -13 }, // 0x31 '1' U+0031
|
||||||
|
{ 225, 9, 14, 11, 1, -13 }, // 0x32 '2' U+0032
|
||||||
|
{ 241, 9, 14, 11, 1, -13 }, // 0x33 '3' U+0033
|
||||||
|
{ 257, 9, 14, 11, 1, -13 }, // 0x34 '4' U+0034
|
||||||
|
{ 273, 9, 14, 11, 1, -13 }, // 0x35 '5' U+0035
|
||||||
|
{ 289, 9, 14, 11, 1, -13 }, // 0x36 '6' U+0036
|
||||||
|
{ 305, 9, 14, 11, 1, -13 }, // 0x37 '7' U+0037
|
||||||
|
{ 321, 9, 14, 11, 1, -13 }, // 0x38 '8' U+0038
|
||||||
|
{ 337, 9, 14, 11, 1, -13 }, // 0x39 '9' U+0039
|
||||||
|
{ 353, 4, 11, 6, 1, -10 }, // 0x3a ':' U+003A
|
||||||
|
{ 359, 5, 14, 6, 0, -10 }, // 0x3b ';' U+003B
|
||||||
|
{ 368, 10, 9, 11, 1, -9 }, // 0x3c '<' U+003C
|
||||||
|
{ 380, 9, 8, 11, 1, -9 }, // 0x3d '=' U+003D
|
||||||
|
{ 389, 9, 9, 11, 1, -9 }, // 0x3e '>' U+003E
|
||||||
|
{ 400, 8, 16, 9, 0, -15 }, // 0x3f '?' U+003F
|
||||||
|
{ 416, 17, 17, 19, 1, -13 }, // 0x40 '@' U+0040
|
||||||
|
{ 453, 15, 14, 15, 0, -13 }, // 0x41 'A' U+0041
|
||||||
|
{ 480, 10, 14, 13, 2, -13 }, // 0x42 'B' U+0042
|
||||||
|
{ 498, 11, 14, 13, 1, -13 }, // 0x43 'C' U+0043
|
||||||
|
{ 518, 12, 14, 15, 2, -13 }, // 0x44 'D' U+0044
|
||||||
|
{ 539, 9, 14, 12, 2, -13 }, // 0x45 'E' U+0045
|
||||||
|
{ 555, 8, 14, 11, 2, -13 }, // 0x46 'F' U+0046
|
||||||
|
{ 569, 11, 14, 14, 1, -13 }, // 0x47 'G' U+0047
|
||||||
|
{ 589, 11, 14, 15, 2, -13 }, // 0x48 'H' U+0048
|
||||||
|
{ 609, 3, 14, 7, 2, -13 }, // 0x49 'I' U+0049
|
||||||
|
{ 615, 9, 14, 11, 0, -13 }, // 0x4a 'J' U+004A
|
||||||
|
{ 631, 12, 14, 14, 2, -13 }, // 0x4b 'K' U+004B
|
||||||
|
{ 652, 9, 14, 11, 2, -13 }, // 0x4c 'L' U+004C
|
||||||
|
{ 668, 15, 14, 17, 1, -13 }, // 0x4d 'M' U+004D
|
||||||
|
{ 695, 11, 14, 15, 2, -13 }, // 0x4e 'N' U+004E
|
||||||
|
{ 715, 14, 14, 16, 1, -13 }, // 0x4f 'O' U+004F
|
||||||
|
{ 740, 10, 14, 13, 2, -13 }, // 0x50 'P' U+0050
|
||||||
|
{ 758, 14, 17, 16, 1, -13 }, // 0x51 'Q' U+0051
|
||||||
|
{ 788, 11, 14, 13, 2, -13 }, // 0x52 'R' U+0052
|
||||||
|
{ 808, 10, 14, 12, 1, -13 }, // 0x53 'S' U+0053
|
||||||
|
{ 826, 11, 14, 11, 0, -13 }, // 0x54 'T' U+0054
|
||||||
|
{ 846, 11, 14, 15, 2, -13 }, // 0x55 'U' U+0055
|
||||||
|
{ 866, 15, 14, 15, 0, -13 }, // 0x56 'V' U+0056
|
||||||
|
{ 893, 19, 14, 19, 0, -13 }, // 0x57 'W' U+0057
|
||||||
|
{ 927, 14, 14, 14, 0, -13 }, // 0x58 'X' U+0058
|
||||||
|
{ 952, 13, 14, 13, 0, -13 }, // 0x59 'Y' U+0059
|
||||||
|
{ 975, 10, 14, 12, 1, -13 }, // 0x5a 'Z' U+005A
|
||||||
|
{ 993, 5, 20, 7, 2, -15 }, // 0x5b '[' U+005B
|
||||||
|
{ 1006, 10, 20, 9, -1, -15 }, // 0x5c '\' U+005C
|
||||||
|
{ 1031, 5, 20, 7, 0, -15 }, // 0x5d ']' U+005D
|
||||||
|
{ 1044, 11, 8, 11, 0, -13 }, // 0x5e '^' U+005E
|
||||||
|
{ 1055, 10, 2, 10, 0, 3 }, // 0x5f '_' U+005F
|
||||||
|
{ 1058, 5, 4, 6, 1, -15 }, // 0x60 '`' U+0060
|
||||||
|
{ 1061, 9, 11, 11, 1, -10 }, // 0x61 'a' U+0061
|
||||||
|
{ 1074, 10, 16, 12, 1, -15 }, // 0x62 'b' U+0062
|
||||||
|
{ 1094, 8, 11, 10, 1, -10 }, // 0x63 'c' U+0063
|
||||||
|
{ 1105, 10, 16, 12, 1, -15 }, // 0x64 'd' U+0064
|
||||||
|
{ 1125, 10, 11, 12, 1, -10 }, // 0x65 'e' U+0065
|
||||||
|
{ 1139, 8, 16, 8, 1, -15 }, // 0x66 'f' U+0066
|
||||||
|
{ 1155, 10, 15, 12, 1, -10 }, // 0x67 'g' U+0067
|
||||||
|
{ 1174, 10, 16, 12, 1, -15 }, // 0x68 'h' U+0068
|
||||||
|
{ 1194, 3, 16, 5, 1, -15 }, // 0x69 'i' U+0069
|
||||||
|
{ 1200, 6, 20, 5, -2, -15 }, // 0x6a 'j' U+006A
|
||||||
|
{ 1215, 11, 16, 12, 1, -15 }, // 0x6b 'k' U+006B
|
||||||
|
{ 1237, 5, 16, 6, 1, -15 }, // 0x6c 'l' U+006C
|
||||||
|
{ 1247, 15, 11, 17, 1, -10 }, // 0x6d 'm' U+006D
|
||||||
|
{ 1268, 10, 11, 12, 1, -10 }, // 0x6e 'n' U+006E
|
||||||
|
{ 1282, 10, 11, 12, 1, -10 }, // 0x6f 'o' U+006F
|
||||||
|
{ 1296, 10, 15, 12, 1, -10 }, // 0x70 'p' U+0070
|
||||||
|
{ 1315, 10, 15, 12, 1, -10 }, // 0x71 'q' U+0071
|
||||||
|
{ 1334, 7, 11, 8, 1, -10 }, // 0x72 'r' U+0072
|
||||||
|
{ 1344, 8, 11, 10, 1, -10 }, // 0x73 's' U+0073
|
||||||
|
{ 1355, 7, 14, 9, 1, -13 }, // 0x74 't' U+0074
|
||||||
|
{ 1368, 10, 11, 12, 1, -10 }, // 0x75 'u' U+0075
|
||||||
|
{ 1382, 11, 11, 11, 0, -10 }, // 0x76 'v' U+0076
|
||||||
|
{ 1398, 15, 11, 15, 0, -10 }, // 0x77 'w' U+0077
|
||||||
|
{ 1419, 11, 11, 11, 0, -10 }, // 0x78 'x' U+0078
|
||||||
|
{ 1435, 11, 15, 11, 0, -10 }, // 0x79 'y' U+0079
|
||||||
|
{ 1456, 8, 11, 10, 1, -10 }, // 0x7a 'z' U+007A
|
||||||
|
{ 1467, 7, 20, 8, 1, -15 }, // 0x7b '{' U+007B
|
||||||
|
{ 1485, 3, 20, 7, 2, -15 }, // 0x7c '|' U+007C
|
||||||
|
{ 1493, 7, 20, 8, 0, -15 }, // 0x7d '}' U+007D
|
||||||
|
{ 1511, 10, 5, 11, 1, -8 }, // 0x7e '~' U+007E
|
||||||
|
{ 1518, 8, 15, 10, 1, -14 }, // 0x7f 'REPLACEMENT CHARACTER *' U+2370
|
||||||
|
{ 1533, 1, 1, 5, 0, 0 }, // 0x80 'NO-BREAK SPACE' U+00A0
|
||||||
|
{ 1534, 3, 15, 5, 1, -10 }, // 0x81 'INVERTED EXCLAMATION MARK' U+00A1
|
||||||
|
{ 1540, 8, 16, 11, 1, -13 }, // 0x82 'CENT SIGN' U+00A2
|
||||||
|
{ 1556, 10, 14, 11, 0, -13 }, // 0x83 'POUND SIGN' U+00A3
|
||||||
|
{ 1574, 10, 10, 11, 1, -11 }, // 0x84 'CURRENCY SIGN' U+00A4
|
||||||
|
{ 1587, 11, 14, 11, 0, -13 }, // 0x85 'YEN SIGN' U+00A5
|
||||||
|
{ 1607, 3, 20, 6, 2, -15 }, // 0x86 'BROKEN BAR' U+00A6
|
||||||
|
{ 1615, 8, 18, 10, 1, -13 }, // 0x87 'SECTION SIGN' U+00A7
|
||||||
|
{ 1633, 7, 3, 11, 2, -14 }, // 0x88 'DIAERESIS' U+00A8
|
||||||
|
{ 1636, 14, 14, 16, 1, -13 }, // 0x89 'COPYRIGHT SIGN' U+00A9
|
||||||
|
{ 1661, 7, 8, 8, 0, -13 }, // 0x8a 'FEMININE ORDINAL INDICATOR' U+00AA
|
||||||
|
{ 1668, 10, 9, 12, 0, -9 }, // 0x8b 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00AB
|
||||||
|
{ 1680, 9, 8, 11, 1, -8 }, // 0x8c 'NOT SIGN' U+00AC
|
||||||
|
{ 1689, 6, 3, 8, 1, -7 }, // 0x8d 'SOFT HYPHEN' U+00AD
|
||||||
|
{ 1692, 14, 14, 16, 1, -13 }, // 0x8e 'REGISTERED SIGN' U+00AE
|
||||||
|
{ 1717, 6, 2, 8, 1, -13 }, // 0x8f 'MACRON' U+00AF
|
||||||
|
{ 1719, 6, 6, 6, 0, -15 }, // 0x90 'DEGREE SIGN' U+00B0
|
||||||
|
{ 1724, 11, 15, 13, 1, -14 }, // 0x91 'PLUS-MINUS SIGN' U+00B1
|
||||||
|
{ 1745, 6, 8, 7, 0, -13 }, // 0x92 'SUPERSCRIPT TWO' U+00B2
|
||||||
|
{ 1751, 6, 8, 7, 0, -13 }, // 0x93 'SUPERSCRIPT THREE' U+00B3
|
||||||
|
{ 1757, 5, 4, 6, 0, -15 }, // 0x94 'ACUTE ACCENT' U+00B4
|
||||||
|
{ 1760, 10, 15, 12, 1, -10 }, // 0x95 'MICRO SIGN' U+00B5
|
||||||
|
{ 1779, 12, 18, 14, 1, -13 }, // 0x96 'PILCROW SIGN' U+00B6
|
||||||
|
{ 1806, 4, 4, 6, 1, -7 }, // 0x97 'MIDDLE DOT' U+00B7
|
||||||
|
{ 1808, 4, 4, 7, 1, 1 }, // 0x98 'CEDILLA' U+00B8
|
||||||
|
{ 1810, 4, 8, 7, 1, -13 }, // 0x99 'SUPERSCRIPT ONE' U+00B9
|
||||||
|
{ 1814, 8, 8, 10, 1, -13 }, // 0x9a 'MASCULINE ORDINAL INDICATOR' U+00BA
|
||||||
|
{ 1822, 10, 9, 12, 2, -9 }, // 0x9b 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00BB
|
||||||
|
{ 1834, 16, 14, 18, 1, -13 }, // 0x9c 'VULGAR FRACTION ONE QUARTER' U+00BC
|
||||||
|
{ 1862, 15, 14, 18, 1, -13 }, // 0x9d 'VULGAR FRACTION ONE HALF' U+00BD
|
||||||
|
{ 1889, 17, 14, 18, 0, -13 }, // 0x9e 'VULGAR FRACTION THREE QUARTERS' U+00BE
|
||||||
|
{ 1919, 8, 15, 9, 1, -10 }, // 0x9f 'INVERTED QUESTION MARK' U+00BF
|
||||||
|
{ 1934, 15, 19, 15, 0, -18 }, // 0xa0 'LATIN CAPITAL LETTER A WITH GRAVE' U+00C0
|
||||||
|
{ 1970, 15, 19, 15, 0, -18 }, // 0xa1 'LATIN CAPITAL LETTER A WITH ACUTE' U+00C1
|
||||||
|
{ 2006, 15, 20, 15, 0, -19 }, // 0xa2 'LATIN CAPITAL LETTER A WITH CIRCUMFLEX' U+00C2
|
||||||
|
{ 2044, 15, 18, 15, 0, -17 }, // 0xa3 'LATIN CAPITAL LETTER A WITH TILDE' U+00C3
|
||||||
|
{ 2078, 15, 18, 15, 0, -17 }, // 0xa4 'LATIN CAPITAL LETTER A WITH DIAERESIS' U+00C4
|
||||||
|
{ 2112, 15, 18, 15, 0, -17 }, // 0xa5 'LATIN CAPITAL LETTER A WITH RING ABOVE' U+00C5
|
||||||
|
{ 2146, 19, 14, 20, 0, -13 }, // 0xa6 'LATIN CAPITAL LETTER AE' U+00C6
|
||||||
|
{ 2180, 11, 18, 13, 1, -13 }, // 0xa7 'LATIN CAPITAL LETTER C WITH CEDILLA' U+00C7
|
||||||
|
{ 2205, 9, 19, 12, 2, -18 }, // 0xa8 'LATIN CAPITAL LETTER E WITH GRAVE' U+00C8
|
||||||
|
{ 2227, 9, 19, 12, 2, -18 }, // 0xa9 'LATIN CAPITAL LETTER E WITH ACUTE' U+00C9
|
||||||
|
{ 2249, 9, 20, 12, 2, -19 }, // 0xaa 'LATIN CAPITAL LETTER E WITH CIRCUMFLEX' U+00CA
|
||||||
|
{ 2272, 9, 18, 12, 2, -17 }, // 0xab 'LATIN CAPITAL LETTER E WITH DIAERESIS' U+00CB
|
||||||
|
{ 2293, 5, 19, 7, 1, -18 }, // 0xac 'LATIN CAPITAL LETTER I WITH GRAVE' U+00CC
|
||||||
|
{ 2305, 5, 19, 7, 1, -18 }, // 0xad 'LATIN CAPITAL LETTER I WITH ACUTE' U+00CD
|
||||||
|
{ 2317, 7, 20, 7, 0, -19 }, // 0xae 'LATIN CAPITAL LETTER I WITH CIRCUMFLEX' U+00CE
|
||||||
|
{ 2335, 7, 18, 7, 0, -17 }, // 0xaf 'LATIN CAPITAL LETTER I WITH DIAERESIS' U+00CF
|
||||||
|
{ 2351, 14, 14, 15, 0, -13 }, // 0xb0 'LATIN CAPITAL LETTER ETH' U+00D0
|
||||||
|
{ 2376, 11, 18, 15, 2, -17 }, // 0xb1 'LATIN CAPITAL LETTER N WITH TILDE' U+00D1
|
||||||
|
{ 2401, 14, 19, 16, 1, -18 }, // 0xb2 'LATIN CAPITAL LETTER O WITH GRAVE' U+00D2
|
||||||
|
{ 2435, 14, 19, 16, 1, -18 }, // 0xb3 'LATIN CAPITAL LETTER O WITH ACUTE' U+00D3
|
||||||
|
{ 2469, 14, 20, 16, 1, -19 }, // 0xb4 'LATIN CAPITAL LETTER O WITH CIRCUMFLEX' U+00D4
|
||||||
|
{ 2504, 14, 18, 16, 1, -17 }, // 0xb5 'LATIN CAPITAL LETTER O WITH TILDE' U+00D5
|
||||||
|
{ 2536, 14, 18, 16, 1, -17 }, // 0xb6 'LATIN CAPITAL LETTER O WITH DIAERESIS' U+00D6
|
||||||
|
{ 2568, 9, 9, 11, 1, -10 }, // 0xb7 'MULTIPLICATION SIGN' U+00D7
|
||||||
|
{ 2579, 14, 16, 16, 1, -14 }, // 0xb8 'LATIN CAPITAL LETTER O WITH STROKE' U+00D8
|
||||||
|
{ 2607, 11, 19, 15, 2, -18 }, // 0xb9 'LATIN CAPITAL LETTER U WITH GRAVE' U+00D9
|
||||||
|
{ 2634, 11, 19, 15, 2, -18 }, // 0xba 'LATIN CAPITAL LETTER U WITH ACUTE' U+00DA
|
||||||
|
{ 2661, 11, 20, 15, 2, -19 }, // 0xbb 'LATIN CAPITAL LETTER U WITH CIRCUMFLEX' U+00DB
|
||||||
|
{ 2689, 11, 18, 15, 2, -17 }, // 0xbc 'LATIN CAPITAL LETTER U WITH DIAERESIS' U+00DC
|
||||||
|
{ 2714, 13, 19, 13, 0, -18 }, // 0xbd 'LATIN CAPITAL LETTER Y WITH ACUTE' U+00DD
|
||||||
|
{ 2745, 10, 14, 13, 2, -13 }, // 0xbe 'LATIN CAPITAL LETTER THORN' U+00DE
|
||||||
|
{ 2763, 11, 16, 13, 1, -15 }, // 0xbf 'LATIN SMALL LETTER SHARP S' U+00DF
|
||||||
|
{ 2785, 9, 16, 11, 1, -15 }, // 0xc0 'LATIN SMALL LETTER A WITH GRAVE' U+00E0
|
||||||
|
{ 2803, 9, 16, 11, 1, -15 }, // 0xc1 'LATIN SMALL LETTER A WITH ACUTE' U+00E1
|
||||||
|
{ 2821, 9, 17, 11, 1, -16 }, // 0xc2 'LATIN SMALL LETTER A WITH CIRCUMFLEX' U+00E2
|
||||||
|
{ 2841, 9, 15, 11, 1, -14 }, // 0xc3 'LATIN SMALL LETTER A WITH TILDE' U+00E3
|
||||||
|
{ 2858, 9, 15, 11, 1, -14 }, // 0xc4 'LATIN SMALL LETTER A WITH DIAERESIS' U+00E4
|
||||||
|
{ 2875, 9, 17, 11, 1, -16 }, // 0xc5 'LATIN SMALL LETTER A WITH RING ABOVE' U+00E5
|
||||||
|
{ 2895, 15, 11, 17, 1, -10 }, // 0xc6 'LATIN SMALL LETTER AE' U+00E6
|
||||||
|
{ 2916, 8, 15, 10, 1, -10 }, // 0xc7 'LATIN SMALL LETTER C WITH CEDILLA' U+00E7
|
||||||
|
{ 2931, 10, 16, 12, 1, -15 }, // 0xc8 'LATIN SMALL LETTER E WITH GRAVE' U+00E8
|
||||||
|
{ 2951, 10, 16, 12, 1, -15 }, // 0xc9 'LATIN SMALL LETTER E WITH ACUTE' U+00E9
|
||||||
|
{ 2971, 10, 17, 12, 1, -16 }, // 0xca 'LATIN SMALL LETTER E WITH CIRCUMFLEX' U+00EA
|
||||||
|
{ 2993, 10, 15, 12, 1, -14 }, // 0xcb 'LATIN SMALL LETTER E WITH DIAERESIS' U+00EB
|
||||||
|
{ 3012, 5, 16, 5, 0, -15 }, // 0xcc 'LATIN SMALL LETTER I WITH GRAVE' U+00EC
|
||||||
|
{ 3022, 5, 16, 5, 0, -15 }, // 0xcd 'LATIN SMALL LETTER I WITH ACUTE' U+00ED
|
||||||
|
{ 3032, 7, 17, 5, -1, -16 }, // 0xce 'LATIN SMALL LETTER I WITH CIRCUMFLEX' U+00EE
|
||||||
|
{ 3047, 7, 15, 5, -1, -14 }, // 0xcf 'LATIN SMALL LETTER I WITH DIAERESIS' U+00EF
|
||||||
|
{ 3061, 10, 16, 12, 1, -15 }, // 0xd0 'LATIN SMALL LETTER ETH' U+00F0
|
||||||
|
{ 3081, 10, 15, 12, 1, -14 }, // 0xd1 'LATIN SMALL LETTER N WITH TILDE' U+00F1
|
||||||
|
{ 3100, 10, 16, 12, 1, -15 }, // 0xd2 'LATIN SMALL LETTER O WITH GRAVE' U+00F2
|
||||||
|
{ 3120, 10, 16, 12, 1, -15 }, // 0xd3 'LATIN SMALL LETTER O WITH ACUTE' U+00F3
|
||||||
|
{ 3140, 10, 17, 12, 1, -16 }, // 0xd4 'LATIN SMALL LETTER O WITH CIRCUMFLEX' U+00F4
|
||||||
|
{ 3162, 10, 15, 12, 1, -14 }, // 0xd5 'LATIN SMALL LETTER O WITH TILDE' U+00F5
|
||||||
|
{ 3181, 10, 15, 12, 1, -14 }, // 0xd6 'LATIN SMALL LETTER O WITH DIAERESIS' U+00F6
|
||||||
|
{ 3200, 9, 11, 11, 1, -10 }, // 0xd7 'DIVISION SIGN' U+00F7
|
||||||
|
{ 3213, 10, 13, 12, 1, -11 }, // 0xd8 'LATIN SMALL LETTER O WITH STROKE' U+00F8
|
||||||
|
{ 3230, 10, 16, 12, 1, -15 }, // 0xd9 'LATIN SMALL LETTER U WITH GRAVE' U+00F9
|
||||||
|
{ 3250, 10, 16, 12, 1, -15 }, // 0xda 'LATIN SMALL LETTER U WITH ACUTE' U+00FA
|
||||||
|
{ 3270, 10, 17, 12, 1, -16 }, // 0xdb 'LATIN SMALL LETTER U WITH CIRCUMFLEX' U+00FB
|
||||||
|
{ 3292, 10, 15, 12, 1, -14 }, // 0xdc 'LATIN SMALL LETTER U WITH DIAERESIS' U+00FC
|
||||||
|
{ 3311, 11, 20, 11, 0, -15 }, // 0xdd 'LATIN SMALL LETTER Y WITH ACUTE' U+00FD
|
||||||
|
{ 3339, 10, 20, 12, 1, -15 }, // 0xde 'LATIN SMALL LETTER THORN' U+00FE
|
||||||
|
{ 3364, 11, 19, 11, 0, -14 } }; // 0xdf 'LATIN SMALL LETTER Y WITH DIAERESIS' U+000FF
|
||||||
|
|
||||||
|
const GFXfont Ubuntu_Bold10pt8b PROGMEM = {
|
||||||
|
(uint8_t *)Ubuntu_Bold10pt8bBitmaps,
|
||||||
|
(GFXglyph *)Ubuntu_Bold10pt8bGlyphs,
|
||||||
|
0x20, 0xDF, 23 };
|
||||||
|
|
||||||
|
// Approx. 4742 bytes
|
||||||
611
lib/obp60task/fonts/Ubuntu_Bold12pt8b.h
Normal file
611
lib/obp60task/fonts/Ubuntu_Bold12pt8b.h
Normal file
@@ -0,0 +1,611 @@
|
|||||||
|
const uint8_t Ubuntu_Bold12pt8bBitmaps[] PROGMEM = {
|
||||||
|
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0x60, 0xF7, 0xFB,
|
||||||
|
0xFD, 0xFE, 0xFF, 0x7F, 0xBF, 0xDE, 0x0F, 0x3C, 0x1E, 0x78, 0x3C, 0xF0,
|
||||||
|
0xF3, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x3C, 0x3E, 0xF8, 0x79,
|
||||||
|
0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x9E, 0x1E, 0x78, 0x3C, 0xF0,
|
||||||
|
0x79, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xFC, 0x7F, 0xE7, 0xFE, 0xF0,
|
||||||
|
0x4F, 0x00, 0xF0, 0x0F, 0xF0, 0x7F, 0xC3, 0xFE, 0x07, 0xF0, 0x1F, 0x00,
|
||||||
|
0xF6, 0x0F, 0xFF, 0xEF, 0xFC, 0x7F, 0x80, 0xE0, 0x0E, 0x00, 0xE0, 0x3E,
|
||||||
|
0x0F, 0x07, 0xF0, 0xE0, 0xF7, 0x9E, 0x0E, 0x39, 0xC0, 0xE3, 0xBC, 0x0E,
|
||||||
|
0x3B, 0x80, 0xF7, 0xF8, 0x07, 0xF7, 0x00, 0x3E, 0xF7, 0xC0, 0x0E, 0xFE,
|
||||||
|
0x01, 0xFE, 0xF0, 0x1D, 0xC7, 0x03, 0xDC, 0x70, 0x39, 0xC7, 0x07, 0x9E,
|
||||||
|
0xF0, 0x70, 0xFE, 0x0F, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0xC0, 0x3F, 0xE0,
|
||||||
|
0x38, 0xE0, 0x38, 0xE0, 0x3D, 0xE0, 0x1F, 0xC0, 0x1F, 0x80, 0x3F, 0x9E,
|
||||||
|
0x7F, 0x9E, 0xF3, 0xDC, 0xF1, 0xFC, 0xF0, 0xF8, 0xF8, 0xF8, 0xFF, 0xFC,
|
||||||
|
0x7F, 0xFE, 0x1F, 0x9F, 0xFF, 0xFF, 0xFF, 0xF0, 0x08, 0x3C, 0xF1, 0xE7,
|
||||||
|
0x8F, 0x1E, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0x78, 0xF1,
|
||||||
|
0xE1, 0xE3, 0xC3, 0xC2, 0x00, 0x21, 0xE1, 0xE3, 0xC3, 0xC7, 0x8F, 0x0F,
|
||||||
|
0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x3C, 0x78, 0xF3, 0xC7, 0x9E,
|
||||||
|
0x08, 0x00, 0x0E, 0x01, 0xC1, 0x39, 0x7A, 0xFF, 0xFE, 0x1C, 0x06, 0xC1,
|
||||||
|
0xDC, 0x7B, 0xC2, 0x20, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0x7B, 0xDE, 0xF7, 0xFB,
|
||||||
|
0xCC, 0xFF, 0xFF, 0xF8, 0x6F, 0xF6, 0x00, 0xF0, 0x1F, 0x01, 0xE0, 0x1E,
|
||||||
|
0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x78, 0x07, 0x80, 0x78, 0x0F, 0x00, 0xF0,
|
||||||
|
0x0F, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x03, 0xC0, 0x3C, 0x07, 0x80,
|
||||||
|
0x78, 0x0F, 0x80, 0xF0, 0x00, 0x0F, 0x03, 0xFC, 0x7F, 0xE7, 0x9E, 0x70,
|
||||||
|
0xEF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0,
|
||||||
|
0xE7, 0x9E, 0x7F, 0xE3, 0xFC, 0x0F, 0x00, 0x07, 0x1F, 0x7F, 0xFF, 0xEF,
|
||||||
|
0x4F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
|
||||||
|
0x1F, 0x07, 0xFC, 0xFF, 0xE6, 0x3E, 0x01, 0xE0, 0x1E, 0x03, 0xE0, 0x3C,
|
||||||
|
0x07, 0x80, 0xF8, 0x3F, 0x03, 0xE0, 0x7C, 0x0F, 0x80, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xF0, 0x3E, 0x1F, 0xF3, 0xFF, 0x21, 0xE0, 0x3C, 0x07, 0x87, 0xE0,
|
||||||
|
0xF8, 0x1F, 0xC0, 0x78, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0xFF, 0xF7, 0xFC,
|
||||||
|
0x7F, 0x00, 0x03, 0xC0, 0x7C, 0x0F, 0xC0, 0xFC, 0x1F, 0xC3, 0xBC, 0x3B,
|
||||||
|
0xC7, 0x3C, 0x73, 0xCF, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3C, 0x03,
|
||||||
|
0xC0, 0x3C, 0x03, 0xC0, 0x3F, 0xE3, 0xFE, 0x3F, 0xE3, 0x80, 0x38, 0x07,
|
||||||
|
0x80, 0x7F, 0x07, 0xFC, 0x7F, 0xE0, 0x3F, 0x00, 0xF0, 0x0F, 0x00, 0xF0,
|
||||||
|
0x1F, 0xFF, 0xEF, 0xFC, 0x7F, 0x00, 0x01, 0xE0, 0xFE, 0x1F, 0xE3, 0xF0,
|
||||||
|
0x7C, 0x07, 0x80, 0xFF, 0x8F, 0xFE, 0xFF, 0xEF, 0x1F, 0xF0, 0xFF, 0x0F,
|
||||||
|
0xF0, 0xF7, 0x9F, 0x7F, 0xE3, 0xFC, 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xF0, 0x1E, 0x03, 0xE0, 0x7C, 0x07, 0x80, 0x78, 0x0F, 0x00, 0xF0, 0x1F,
|
||||||
|
0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x03, 0xC0, 0x3C, 0x00, 0x1F, 0x83,
|
||||||
|
0xFE, 0x7F, 0xEF, 0x9F, 0xF0, 0xFF, 0x0F, 0xF9, 0xF7, 0xFE, 0x3F, 0xC7,
|
||||||
|
0xFE, 0xF9, 0xFF, 0x0F, 0xF0, 0xFF, 0x8F, 0xFF, 0xE7, 0xFE, 0x1F, 0x80,
|
||||||
|
0x1F, 0x83, 0xFC, 0x7F, 0xEF, 0x9E, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x8F,
|
||||||
|
0x7F, 0xF7, 0xFF, 0x1F, 0xF0, 0x1E, 0x03, 0xE0, 0x7C, 0x7F, 0x87, 0xF0,
|
||||||
|
0x78, 0x00, 0x6F, 0xF6, 0x00, 0x00, 0x06, 0xFF, 0x60, 0x33, 0xDE, 0x60,
|
||||||
|
0x00, 0x00, 0x03, 0xDE, 0xF7, 0xBF, 0xDE, 0x60, 0x00, 0x60, 0x3E, 0x1F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x8F, 0x00, 0xFF, 0x8F, 0xFF, 0x1F, 0xF0, 0x3E, 0x00,
|
||||||
|
0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0x60, 0x07, 0xC0, 0xFF, 0x8F, 0xFF, 0x1F, 0xF0, 0x0F, 0x1F, 0xFF, 0xFF,
|
||||||
|
0xFF, 0x87, 0xC0, 0x60, 0x00, 0x3E, 0x3F, 0xEF, 0xF9, 0x0F, 0x03, 0xC0,
|
||||||
|
0xF0, 0x7C, 0x1E, 0x0F, 0x83, 0xC1, 0xE0, 0x78, 0x1C, 0x07, 0x00, 0x00,
|
||||||
|
0x30, 0x1E, 0x07, 0x80, 0xC0, 0x01, 0xFC, 0x00, 0x3F, 0xFC, 0x03, 0xFF,
|
||||||
|
0xF0, 0x7E, 0x07, 0xC3, 0xC0, 0x0F, 0x3C, 0x7E, 0x39, 0xC7, 0xF8, 0xFE,
|
||||||
|
0x7F, 0xC7, 0xE7, 0x8E, 0x3F, 0x38, 0x71, 0xF9, 0xC3, 0x8F, 0xCE, 0x1C,
|
||||||
|
0x7E, 0x78, 0xE7, 0x71, 0xFF, 0xF9, 0xCF, 0xFF, 0x8F, 0x1F, 0xF8, 0x3C,
|
||||||
|
0x00, 0x01, 0xF8, 0x00, 0x07, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x1F, 0xE0,
|
||||||
|
0x00, 0x03, 0xE0, 0x01, 0xF0, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x77, 0x00,
|
||||||
|
0x7B, 0xC0, 0x3D, 0xE0, 0x3C, 0x78, 0x1E, 0x3C, 0x0F, 0x1E, 0x0F, 0xFF,
|
||||||
|
0x87, 0xFF, 0xC3, 0xFF, 0xE3, 0xC0, 0x79, 0xE0, 0x3D, 0xF0, 0x1E, 0xF0,
|
||||||
|
0x07, 0x80, 0xFF, 0x87, 0xFF, 0x3F, 0xF9, 0xE3, 0xEF, 0x0F, 0x78, 0x7B,
|
||||||
|
0xC7, 0xDF, 0xFC, 0xFF, 0xE7, 0xFF, 0xBC, 0x3F, 0xE0, 0xFF, 0x07, 0xF8,
|
||||||
|
0x7F, 0xFF, 0xDF, 0xFC, 0xFF, 0xC0, 0x07, 0xF0, 0x7F, 0xF3, 0xFF, 0xDF,
|
||||||
|
0x82, 0x78, 0x03, 0xE0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F,
|
||||||
|
0x00, 0x3E, 0x00, 0x78, 0x01, 0xF0, 0x23, 0xFF, 0xC7, 0xFF, 0x07, 0xF0,
|
||||||
|
0xFF, 0x81, 0xFF, 0xE3, 0xFF, 0xE7, 0x87, 0xEF, 0x03, 0xDE, 0x07, 0xFC,
|
||||||
|
0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x81, 0xFF, 0x03,
|
||||||
|
0xDE, 0x1F, 0xBF, 0xFE, 0x7F, 0xF0, 0xFF, 0x80, 0xFF, 0xEF, 0xFE, 0xFF,
|
||||||
|
0xEF, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE, 0xF0,
|
||||||
|
0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0xFE, 0xFF, 0xDF, 0xFB,
|
||||||
|
0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x00, 0x07, 0xF0,
|
||||||
|
0x7F, 0xF3, 0xFF, 0xDF, 0x02, 0x78, 0x03, 0xE0, 0x0F, 0x00, 0x3C, 0x00,
|
||||||
|
0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFE, 0x0F, 0x78, 0x3D, 0xF0, 0xF3, 0xFF,
|
||||||
|
0xC7, 0xFF, 0x07, 0xF8, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0,
|
||||||
|
0x3F, 0xC0, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFC,
|
||||||
|
0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3C, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xE0, 0x3C, 0x07, 0x80,
|
||||||
|
0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0,
|
||||||
|
0x1E, 0x87, 0xDF, 0xF7, 0xFE, 0x3F, 0x00, 0xF0, 0xFF, 0xC7, 0xEF, 0x1F,
|
||||||
|
0x3C, 0xF8, 0xF7, 0xC3, 0xFE, 0x0F, 0xF0, 0x3F, 0x80, 0xFF, 0x03, 0xFC,
|
||||||
|
0x0F, 0x78, 0x3D, 0xF0, 0xF3, 0xE3, 0xC7, 0x8F, 0x1F, 0x3C, 0x3E, 0xF0,
|
||||||
|
0x7C, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
|
||||||
|
0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xF0, 0x7C, 0x03, 0xCF, 0x80, 0xF9, 0xF0, 0x1F, 0x3F, 0x07,
|
||||||
|
0xE7, 0xE0, 0xFC, 0xFE, 0x3F, 0xBD, 0xC7, 0x7F, 0xBD, 0xEF, 0xF3, 0xB9,
|
||||||
|
0xFE, 0x77, 0x3F, 0xCF, 0xE7, 0xF8, 0xF8, 0xFF, 0x1F, 0x1F, 0xE1, 0xC3,
|
||||||
|
0xFC, 0x38, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xE0, 0xF0, 0x3F, 0xE0, 0xFF,
|
||||||
|
0x83, 0xFF, 0x0F, 0xFE, 0x3F, 0xF8, 0xFF, 0x73, 0xFD, 0xCF, 0xF3, 0xBF,
|
||||||
|
0xCF, 0xFF, 0x1F, 0xFC, 0x3F, 0xF0, 0xFF, 0xC1, 0xFF, 0x07, 0xFC, 0x0F,
|
||||||
|
0xF0, 0x3C, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x8F, 0x83, 0xE7, 0x80,
|
||||||
|
0xF7, 0xC0, 0x7F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC,
|
||||||
|
0x01, 0xFF, 0x01, 0xF7, 0x80, 0xF3, 0xE0, 0xF8, 0xFF, 0xF8, 0x3F, 0xF8,
|
||||||
|
0x07, 0xF0, 0x00, 0xFF, 0x0F, 0xFC, 0xFF, 0xEF, 0x1F, 0xF0, 0xFF, 0x0F,
|
||||||
|
0xF0, 0xFF, 0x1F, 0xFF, 0xEF, 0xFC, 0xFF, 0x8F, 0x00, 0xF0, 0x0F, 0x00,
|
||||||
|
0xF0, 0x0F, 0x00, 0xF0, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x8F,
|
||||||
|
0x83, 0xE7, 0x80, 0xF7, 0xC0, 0x7F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07,
|
||||||
|
0xF8, 0x03, 0xFC, 0x01, 0xFF, 0x01, 0xF7, 0x80, 0xF3, 0xE0, 0xF8, 0xFF,
|
||||||
|
0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x1F, 0xE0,
|
||||||
|
0x07, 0xF0, 0x00, 0xF0, 0xFF, 0x83, 0xFF, 0x8F, 0xFF, 0x3C, 0x3E, 0xF0,
|
||||||
|
0x7B, 0xC1, 0xEF, 0x07, 0xBC, 0x3E, 0xFF, 0xF3, 0xFF, 0x8F, 0xFC, 0x3C,
|
||||||
|
0xF8, 0xF1, 0xF3, 0xC3, 0xCF, 0x0F, 0xBC, 0x1E, 0xF0, 0x7C, 0x1F, 0x87,
|
||||||
|
0xFE, 0x7F, 0xCF, 0x04, 0xF0, 0x0F, 0x00, 0xFC, 0x07, 0xF8, 0x3F, 0xC0,
|
||||||
|
0xFE, 0x01, 0xF0, 0x0F, 0x00, 0xF4, 0x1F, 0xFF, 0xEF, 0xFE, 0x3F, 0x80,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78,
|
||||||
|
0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E,
|
||||||
|
0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0,
|
||||||
|
0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F,
|
||||||
|
0xE0, 0xFF, 0x07, 0xBC, 0x79, 0xFF, 0xC7, 0xFC, 0x0F, 0x80, 0xF0, 0x07,
|
||||||
|
0xFC, 0x07, 0x9E, 0x03, 0xCF, 0x01, 0xE3, 0xC1, 0xE1, 0xE0, 0xF0, 0xF0,
|
||||||
|
0x78, 0x3C, 0x78, 0x1E, 0x3C, 0x0F, 0x1E, 0x03, 0xDE, 0x01, 0xEF, 0x00,
|
||||||
|
0xF7, 0x80, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, 0x03, 0xE0, 0x00, 0xF0,
|
||||||
|
0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xE0, 0xE0, 0xFB, 0xC3, 0xE1, 0xE7, 0x87,
|
||||||
|
0xC3, 0xCF, 0x0F, 0x87, 0x9E, 0x1F, 0x8F, 0x3C, 0x77, 0x3E, 0x7C, 0xEE,
|
||||||
|
0x7C, 0x7B, 0xDE, 0xF0, 0xF7, 0x1D, 0xE1, 0xEE, 0x3B, 0xC3, 0xFC, 0x7F,
|
||||||
|
0x83, 0xF0, 0x7E, 0x07, 0xE0, 0xFC, 0x0F, 0xC1, 0xF8, 0x1F, 0x01, 0xF0,
|
||||||
|
0xF8, 0x1F, 0x7C, 0x3E, 0x3C, 0x3C, 0x3E, 0x7C, 0x1F, 0xF8, 0x0F, 0xF0,
|
||||||
|
0x0F, 0xF0, 0x07, 0xE0, 0x03, 0xC0, 0x07, 0xE0, 0x0F, 0xF0, 0x0F, 0xF0,
|
||||||
|
0x1F, 0xF8, 0x3E, 0x7C, 0x3C, 0x3C, 0x7C, 0x3E, 0xF8, 0x1F, 0xF8, 0x1F,
|
||||||
|
0x78, 0x1E, 0x7C, 0x3E, 0x3C, 0x3C, 0x3E, 0x7C, 0x1F, 0xF8, 0x0F, 0xF0,
|
||||||
|
0x0F, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
|
||||||
|
0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFE, 0x03, 0xE0, 0x1E, 0x01, 0xF0, 0x1F, 0x00, 0xF0, 0x0F, 0x80, 0xF8,
|
||||||
|
0x07, 0x80, 0x7C, 0x07, 0xC0, 0x3E, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E,
|
||||||
|
0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0xFF, 0xFF, 0x80, 0xF0, 0x07, 0x80,
|
||||||
|
0x78, 0x07, 0x80, 0x3C, 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x1E, 0x01, 0xE0,
|
||||||
|
0x0F, 0x00, 0xF0, 0x0F, 0x00, 0x78, 0x07, 0x80, 0x78, 0x03, 0xC0, 0x3C,
|
||||||
|
0x03, 0xC0, 0x1E, 0x01, 0xE0, 0x1E, 0x00, 0xF0, 0xFF, 0xFF, 0xF8, 0xF1,
|
||||||
|
0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C,
|
||||||
|
0x78, 0xFF, 0xFF, 0xFF, 0x80, 0x07, 0x00, 0x7C, 0x03, 0xE0, 0x3F, 0x83,
|
||||||
|
0xDE, 0x1E, 0xF1, 0xE3, 0xCE, 0x0E, 0xF0, 0x79, 0x01, 0x00, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xF0, 0x23, 0xC7, 0x8F, 0x08, 0x7F, 0x1F, 0xE7, 0xFC, 0x0F,
|
||||||
|
0x03, 0xCF, 0xF7, 0xFF, 0xCF, 0xF3, 0xFC, 0xFF, 0xFD, 0xFF, 0x3F, 0x80,
|
||||||
|
0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0x8F, 0xFC,
|
||||||
|
0xFF, 0xEF, 0x1F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x1E,
|
||||||
|
0xFF, 0xEF, 0xFC, 0x7F, 0x00, 0x0F, 0xCF, 0xF7, 0xFD, 0xE0, 0xF0, 0x3C,
|
||||||
|
0x0F, 0x03, 0xC0, 0xF0, 0x1E, 0x17, 0xFC, 0xFF, 0x1F, 0x80, 0x00, 0xF0,
|
||||||
|
0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x1F, 0xF3, 0xFF, 0x7F, 0xFF,
|
||||||
|
0x8F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xF7, 0x8F, 0x7F, 0xF3,
|
||||||
|
0xFF, 0x0F, 0xE0, 0x0F, 0x83, 0xFC, 0x7F, 0xE7, 0x9E, 0xF0, 0xFF, 0x0F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x82, 0x7F, 0xE3, 0xFE, 0x0F, 0xC0, 0x1F,
|
||||||
|
0x3F, 0x9F, 0xDF, 0x0F, 0x07, 0x83, 0xFD, 0xFE, 0xFF, 0x78, 0x3C, 0x1E,
|
||||||
|
0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x00, 0x1F, 0xC7, 0xFD,
|
||||||
|
0xFF, 0xFC, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF9, 0xEF, 0xFD, 0xFF,
|
||||||
|
0x8F, 0xF0, 0x1E, 0x87, 0xDF, 0xF3, 0xFE, 0x7F, 0x00, 0xF0, 0x1E, 0x03,
|
||||||
|
0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3F, 0xE7, 0xFE, 0xFF, 0xDE, 0x7F, 0xC7,
|
||||||
|
0xF8, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0x80,
|
||||||
|
0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1E, 0x3C,
|
||||||
|
0x78, 0xF0, 0x00, 0x07, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F,
|
||||||
|
0x1E, 0x3C, 0x78, 0xFF, 0xFF, 0xBE, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
|
||||||
|
0x00, 0xF0, 0x0F, 0x00, 0xF1, 0xFF, 0x3E, 0xF7, 0xCF, 0xF8, 0xFF, 0x0F,
|
||||||
|
0xE0, 0xFF, 0x0F, 0xF8, 0xF7, 0x8F, 0x7C, 0xF3, 0xEF, 0x1E, 0xF1, 0xF0,
|
||||||
|
0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3E,
|
||||||
|
0xFD, 0xF3, 0xC0, 0x7F, 0x3F, 0x3F, 0xFF, 0xEF, 0xFF, 0xFB, 0xCF, 0x9F,
|
||||||
|
0xF1, 0xE3, 0xFC, 0x78, 0xFF, 0x1E, 0x3F, 0xC7, 0x8F, 0xF1, 0xE3, 0xFC,
|
||||||
|
0x78, 0xFF, 0x1E, 0x3F, 0xC7, 0x8F, 0xF1, 0xE3, 0xC0, 0x7F, 0x1F, 0xFB,
|
||||||
|
0xFF, 0x79, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7,
|
||||||
|
0xF8, 0xFF, 0x1E, 0x0F, 0x81, 0xFF, 0x1F, 0xFC, 0xF1, 0xEF, 0x07, 0xF8,
|
||||||
|
0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7B, 0xC7, 0x9F, 0xFC, 0x7F, 0xC0, 0xF8,
|
||||||
|
0x00, 0x7F, 0x0F, 0xFC, 0xFF, 0xEF, 0x1E, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF,
|
||||||
|
0x0F, 0xF0, 0xFF, 0x1F, 0xFF, 0xEF, 0xFC, 0xFF, 0x8F, 0x00, 0xF0, 0x0F,
|
||||||
|
0x00, 0xF0, 0x00, 0x0F, 0xF1, 0xFF, 0xDF, 0xFE, 0xF0, 0xFF, 0x87, 0xF8,
|
||||||
|
0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0xC3, 0xDF, 0xFE, 0x7F, 0xF1, 0xFF,
|
||||||
|
0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x3F, 0xFF, 0xFF, 0xFE, 0x0F,
|
||||||
|
0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x00, 0x1F, 0x9F,
|
||||||
|
0xEF, 0xFB, 0xC0, 0xF0, 0x3F, 0xE7, 0xFC, 0xFF, 0x03, 0xE0, 0xFF, 0xFF,
|
||||||
|
0xFE, 0xFE, 0x00, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0xF7, 0xFB, 0xFD, 0xE0,
|
||||||
|
0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0xC3, 0xFC, 0xFE, 0x3F, 0x00, 0xF1,
|
||||||
|
0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFF,
|
||||||
|
0x3D, 0xFF, 0xBF, 0xF1, 0xFC, 0xF0, 0x7F, 0xC7, 0xDE, 0x3C, 0xF1, 0xE7,
|
||||||
|
0x8F, 0x1E, 0xF0, 0xF7, 0x87, 0xBC, 0x1D, 0xC0, 0xFE, 0x07, 0xF0, 0x1F,
|
||||||
|
0x00, 0xF8, 0x00, 0xF0, 0xE1, 0xFE, 0x1C, 0x3D, 0xC7, 0xC7, 0x3C, 0xF9,
|
||||||
|
0xE7, 0x9F, 0x3C, 0xF7, 0xE7, 0x0E, 0xEE, 0xE1, 0xDD, 0xDC, 0x3F, 0x3F,
|
||||||
|
0x83, 0xE3, 0xE0, 0x7C, 0x7C, 0x0F, 0x07, 0x80, 0xE0, 0xE0, 0xF8, 0xFB,
|
||||||
|
0xC7, 0x8F, 0x78, 0x7B, 0xC1, 0xFC, 0x07, 0xC0, 0x1C, 0x01, 0xF0, 0x1F,
|
||||||
|
0xC1, 0xEF, 0x0F, 0x78, 0xFB, 0xEF, 0x8F, 0x80, 0xF0, 0x7F, 0xC7, 0xDE,
|
||||||
|
0x3C, 0xF1, 0xE7, 0x8F, 0x1E, 0xF0, 0xF7, 0x87, 0xBC, 0x1D, 0xC0, 0xFE,
|
||||||
|
0x07, 0xF0, 0x1F, 0x00, 0xF8, 0x0F, 0x83, 0xFC, 0x1F, 0xC0, 0xFC, 0x00,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFC, 0x3E, 0x0F, 0x87, 0xC3, 0xE0, 0xF8, 0x7C, 0x1F,
|
||||||
|
0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0x1F, 0x3F, 0x3C, 0x3C, 0x3C, 0x3C,
|
||||||
|
0x3C, 0x3C, 0x7C, 0xF8, 0xF0, 0xF8, 0x7C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C,
|
||||||
|
0x3C, 0x3F, 0x1F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xF8, 0xF0, 0xF8, 0xFC, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3E, 0x1F,
|
||||||
|
0x0F, 0x1F, 0x3E, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0xFC, 0xF8, 0xF0,
|
||||||
|
0x38, 0x27, 0xE7, 0xFF, 0xEE, 0x7E, 0x41, 0xC0, 0xFF, 0xE0, 0x18, 0x06,
|
||||||
|
0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80,
|
||||||
|
0x60, 0x18, 0x06, 0x01, 0x80, 0x7F, 0xF0, 0x00, 0x6F, 0xF6, 0x0F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x00, 0xE0, 0x1C, 0x07, 0xF3, 0xFE,
|
||||||
|
0xFF, 0x9E, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x3C, 0x17, 0xFE, 0x7F,
|
||||||
|
0xC3, 0xF8, 0x38, 0x07, 0x00, 0xE0, 0x07, 0xC3, 0xFC, 0x7F, 0x1F, 0x03,
|
||||||
|
0xC0, 0x78, 0x0F, 0x07, 0xFC, 0xFF, 0x9F, 0xF0, 0xF0, 0x1E, 0x03, 0xC0,
|
||||||
|
0x78, 0x0F, 0xFB, 0xFF, 0x7F, 0xE0, 0x60, 0xDF, 0xFF, 0xFF, 0xBF, 0xE7,
|
||||||
|
0x1C, 0xE3, 0x9C, 0x73, 0xFE, 0xFF, 0xEF, 0xF9, 0x83, 0x00, 0xF8, 0x7D,
|
||||||
|
0xE1, 0xE7, 0x87, 0x8F, 0x3C, 0x3C, 0xF0, 0x7F, 0x81, 0xFE, 0x03, 0xF0,
|
||||||
|
0x7F, 0xF9, 0xFF, 0xE0, 0x78, 0x01, 0xE0, 0x7F, 0xF9, 0xFF, 0xE0, 0x78,
|
||||||
|
0x01, 0xE0, 0x07, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0x9F, 0xFF, 0xFF, 0xC2, 0xF0, 0x3F, 0x07,
|
||||||
|
0xF1, 0xFE, 0xF7, 0xFC, 0xFF, 0x3F, 0xCF, 0xFB, 0xDF, 0xE3, 0xF8, 0x3F,
|
||||||
|
0x03, 0xD0, 0xFF, 0xFF, 0xFE, 0x7F, 0x00, 0x61, 0xBC, 0xFF, 0x3D, 0x86,
|
||||||
|
0x07, 0xF0, 0x0F, 0xFC, 0x0F, 0x07, 0x8E, 0x00, 0xE6, 0x3E, 0x37, 0x3F,
|
||||||
|
0x9F, 0x3C, 0x07, 0x9C, 0x03, 0xCE, 0x01, 0xE7, 0x00, 0xF3, 0xC0, 0x7C,
|
||||||
|
0xFE, 0x76, 0x3E, 0x33, 0x80, 0x38, 0xF0, 0x78, 0x3F, 0xF0, 0x03, 0xF0,
|
||||||
|
0x00, 0x7E, 0x7F, 0x07, 0x1F, 0x7F, 0xF7, 0xE7, 0xFF, 0x7F, 0x18, 0x61,
|
||||||
|
0xC7, 0x38, 0xE7, 0x9E, 0x71, 0xCF, 0x3C, 0x71, 0xC7, 0x9E, 0x38, 0xE1,
|
||||||
|
0xC7, 0x18, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x00, 0x70, 0x07,
|
||||||
|
0x00, 0x70, 0x07, 0x00, 0x70, 0xFF, 0xFF, 0xF8, 0x07, 0xF0, 0x0F, 0xFC,
|
||||||
|
0x0F, 0x07, 0x8E, 0x00, 0xE6, 0x7E, 0x37, 0x3F, 0xDF, 0x18, 0x67, 0x8C,
|
||||||
|
0x33, 0xC7, 0xF9, 0xE3, 0xF8, 0xF1, 0x8C, 0x7C, 0xC3, 0x76, 0x61, 0xB3,
|
||||||
|
0x80, 0x38, 0xF0, 0x78, 0x3F, 0xF0, 0x03, 0xF0, 0x00, 0xFF, 0xFF, 0x38,
|
||||||
|
0xFB, 0x1E, 0x3C, 0x6F, 0x8E, 0x00, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0x0F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xF8, 0x3E, 0xFF, 0x47, 0x07, 0x0F, 0x3E, 0x78, 0xF0, 0xFF,
|
||||||
|
0xFF, 0x7C, 0xFE, 0x0E, 0x0E, 0x3C, 0x3F, 0x07, 0x07, 0xFF, 0xFC, 0x10,
|
||||||
|
0xF7, 0xBC, 0x40, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1F, 0xE3, 0xFC,
|
||||||
|
0x7F, 0x8F, 0xF1, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFD, 0xE0, 0x3C, 0x07,
|
||||||
|
0x80, 0xF0, 0x00, 0x07, 0xF0, 0xFF, 0xF7, 0xFF, 0xFF, 0xE7, 0xFF, 0x9F,
|
||||||
|
0xFE, 0x7F, 0xF9, 0xFF, 0xE7, 0x7F, 0x9C, 0xFE, 0x70, 0xF9, 0xC1, 0xE7,
|
||||||
|
0x07, 0x9C, 0x1E, 0x70, 0x79, 0xC1, 0xE7, 0x07, 0x9C, 0x1E, 0x70, 0x79,
|
||||||
|
0xC1, 0xE7, 0x07, 0x9C, 0x6F, 0xF6, 0x30, 0xE1, 0xBE, 0xF8, 0x1D, 0xFF,
|
||||||
|
0xD7, 0x1C, 0x71, 0xC7, 0x1C, 0x70, 0x3E, 0x3F, 0xBD, 0xDC, 0x7E, 0x3F,
|
||||||
|
0x1F, 0x8F, 0xEF, 0x7F, 0x1F, 0x00, 0x61, 0x8F, 0x3C, 0x71, 0xC7, 0x9E,
|
||||||
|
0x38, 0xE3, 0xCF, 0x38, 0xE7, 0x9E, 0x71, 0xCF, 0x3C, 0x61, 0x80, 0x1C,
|
||||||
|
0x0F, 0x07, 0xC0, 0xE0, 0xFC, 0x1E, 0x05, 0xC1, 0xC0, 0x1C, 0x3C, 0x01,
|
||||||
|
0xC3, 0x80, 0x1C, 0x78, 0x01, 0xC7, 0x1E, 0x1C, 0xF3, 0xE1, 0xCE, 0x3E,
|
||||||
|
0x01, 0xE7, 0xE0, 0x1C, 0xEE, 0x03, 0xDC, 0xE0, 0x39, 0xFF, 0x07, 0x9F,
|
||||||
|
0xF0, 0x70, 0x0E, 0x0F, 0x00, 0xE0, 0x1C, 0x1E, 0x0F, 0x83, 0x83, 0xF0,
|
||||||
|
0xF0, 0x2E, 0x1C, 0x01, 0xC7, 0x80, 0x38, 0xE0, 0x07, 0x3C, 0x00, 0xE7,
|
||||||
|
0x3E, 0x1D, 0xFF, 0xE3, 0xB9, 0x1C, 0x0F, 0x03, 0x81, 0xC0, 0xF0, 0x78,
|
||||||
|
0x7C, 0x0E, 0x1E, 0x03, 0xC7, 0x80, 0x70, 0xFF, 0x1E, 0x1F, 0xE0, 0x7C,
|
||||||
|
0x07, 0x87, 0xF0, 0x38, 0x03, 0x83, 0xC0, 0x1C, 0x1C, 0x03, 0xC1, 0xE0,
|
||||||
|
0x1F, 0x8E, 0x00, 0x1C, 0xF0, 0x00, 0xE7, 0x1E, 0xFF, 0x79, 0xF7, 0xE3,
|
||||||
|
0x8F, 0x80, 0x3C, 0xFC, 0x01, 0xCE, 0xE0, 0x1E, 0xE7, 0x00, 0xE7, 0xFC,
|
||||||
|
0x0F, 0x3F, 0xE0, 0x70, 0x0E, 0x07, 0x80, 0x70, 0x0C, 0x07, 0x81, 0xE0,
|
||||||
|
0x30, 0x00, 0x03, 0x80, 0xE0, 0x78, 0x3C, 0x1F, 0x07, 0x83, 0xC0, 0xF0,
|
||||||
|
0x3C, 0x2F, 0xFD, 0xFF, 0x3F, 0x00, 0x01, 0x00, 0x03, 0xC0, 0x00, 0xF0,
|
||||||
|
0x00, 0x3C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x07,
|
||||||
|
0xF0, 0x03, 0xF8, 0x01, 0xDC, 0x01, 0xEF, 0x00, 0xF7, 0x80, 0xF1, 0xE0,
|
||||||
|
0x78, 0xF0, 0x3C, 0x78, 0x3F, 0xFE, 0x1F, 0xFF, 0x0F, 0xFF, 0x8F, 0x01,
|
||||||
|
0xE7, 0x80, 0xF7, 0xC0, 0x7B, 0xC0, 0x1E, 0x00, 0x80, 0x00, 0xF0, 0x00,
|
||||||
|
0xF0, 0x00, 0xF0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x07, 0xC0,
|
||||||
|
0x07, 0xF0, 0x03, 0xF8, 0x01, 0xDC, 0x01, 0xEF, 0x00, 0xF7, 0x80, 0xF1,
|
||||||
|
0xE0, 0x78, 0xF0, 0x3C, 0x78, 0x3F, 0xFE, 0x1F, 0xFF, 0x0F, 0xFF, 0x8F,
|
||||||
|
0x01, 0xE7, 0x80, 0xF7, 0xC0, 0x7B, 0xC0, 0x1E, 0x00, 0x80, 0x00, 0xE0,
|
||||||
|
0x00, 0xF8, 0x00, 0xEE, 0x00, 0x22, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x07,
|
||||||
|
0xC0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xDC, 0x01, 0xEF, 0x00, 0xF7, 0x80,
|
||||||
|
0xF1, 0xE0, 0x78, 0xF0, 0x3C, 0x78, 0x3F, 0xFE, 0x1F, 0xFF, 0x0F, 0xFF,
|
||||||
|
0x8F, 0x01, 0xE7, 0x80, 0xF7, 0xC0, 0x7B, 0xC0, 0x1E, 0x03, 0x10, 0x03,
|
||||||
|
0xFC, 0x03, 0xFC, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80,
|
||||||
|
0x07, 0xC0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xDC, 0x01, 0xEF, 0x00, 0xF7,
|
||||||
|
0x80, 0xF1, 0xE0, 0x78, 0xF0, 0x3C, 0x78, 0x3F, 0xFE, 0x1F, 0xFF, 0x0F,
|
||||||
|
0xFF, 0x8F, 0x01, 0xE7, 0x80, 0xF7, 0xC0, 0x7B, 0xC0, 0x1E, 0x0C, 0x30,
|
||||||
|
0x0F, 0x3C, 0x07, 0x9E, 0x01, 0x86, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x0F,
|
||||||
|
0x80, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xB8, 0x03, 0xDE, 0x01, 0xEF, 0x01,
|
||||||
|
0xE3, 0xC0, 0xF1, 0xE0, 0x78, 0xF0, 0x7F, 0xFC, 0x3F, 0xFE, 0x1F, 0xFF,
|
||||||
|
0x1E, 0x03, 0xCF, 0x01, 0xEF, 0x80, 0xF7, 0x80, 0x3C, 0x03, 0xE0, 0x03,
|
||||||
|
0xF8, 0x01, 0x8C, 0x00, 0xC6, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80,
|
||||||
|
0x0F, 0xE0, 0x07, 0x70, 0x07, 0xB8, 0x03, 0xDE, 0x01, 0xEF, 0x01, 0xE3,
|
||||||
|
0xC0, 0xF1, 0xE0, 0x78, 0xF0, 0x7F, 0xFC, 0x3F, 0xFE, 0x3F, 0xFF, 0x1E,
|
||||||
|
0x03, 0xCF, 0x01, 0xEF, 0x80, 0xF7, 0x80, 0x3C, 0x00, 0x7F, 0xFC, 0x01,
|
||||||
|
0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x0F, 0xF8, 0x00, 0x1E, 0xF0, 0x00, 0x7D,
|
||||||
|
0xE0, 0x00, 0xF3, 0xC0, 0x03, 0xE7, 0xFE, 0x07, 0x8F, 0xFC, 0x1F, 0x1F,
|
||||||
|
0xF8, 0x7F, 0xFC, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0x81, 0xE0,
|
||||||
|
0x1F, 0x03, 0xFF, 0xBC, 0x07, 0xFF, 0xF8, 0x0F, 0xFE, 0x07, 0xF0, 0x7F,
|
||||||
|
0xF3, 0xFF, 0xDF, 0x82, 0x78, 0x03, 0xE0, 0x0F, 0x00, 0x3C, 0x00, 0xF0,
|
||||||
|
0x03, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x78, 0x01, 0xF0, 0x23, 0xFF, 0xC7,
|
||||||
|
0xFF, 0x03, 0xF8, 0x07, 0x00, 0x1E, 0x00, 0x38, 0x03, 0xE0, 0x0F, 0x00,
|
||||||
|
0x04, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x01, 0x00, 0x00, 0xFF, 0xEF, 0xFE,
|
||||||
|
0xFF, 0xEF, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE,
|
||||||
|
0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x02,
|
||||||
|
0x00, 0x78, 0x0F, 0x01, 0xE0, 0x08, 0x00, 0x00, 0xFF, 0xEF, 0xFE, 0xFF,
|
||||||
|
0xEF, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE, 0xF0,
|
||||||
|
0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x04, 0x00,
|
||||||
|
0xE0, 0x1F, 0x03, 0xB8, 0x11, 0x00, 0x00, 0xFF, 0xEF, 0xFE, 0xFF, 0xEF,
|
||||||
|
0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE, 0xF0, 0x0F,
|
||||||
|
0x00, 0xF0, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x30, 0xC7, 0x9E,
|
||||||
|
0x79, 0xE3, 0x0C, 0x00, 0x0F, 0xFE, 0xFF, 0xEF, 0xFE, 0xF0, 0x0F, 0x00,
|
||||||
|
0xF0, 0x0F, 0x00, 0xFF, 0xEF, 0xFE, 0xFF, 0xEF, 0x00, 0xF0, 0x0F, 0x00,
|
||||||
|
0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x23, 0xC7, 0x8F, 0x08, 0x07, 0x9E,
|
||||||
|
0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x80,
|
||||||
|
0x10, 0xF7, 0xBC, 0x40, 0x07, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E,
|
||||||
|
0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x80, 0x10, 0x71, 0xF7, 0x74, 0x40, 0x1E,
|
||||||
|
0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7,
|
||||||
|
0x8F, 0x1E, 0x00, 0x61, 0xBC, 0xFF, 0x3D, 0x86, 0x00, 0x07, 0x81, 0xE0,
|
||||||
|
0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E,
|
||||||
|
0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x80, 0x3F, 0xE0, 0x1F, 0xFE, 0x0F,
|
||||||
|
0xFF, 0x87, 0x87, 0xE3, 0xC0, 0xF1, 0xE0, 0x7C, 0xF0, 0x1F, 0xFF, 0x0F,
|
||||||
|
0xFF, 0x87, 0xFF, 0xC3, 0xCF, 0x01, 0xE7, 0x81, 0xF3, 0xC0, 0xF1, 0xE1,
|
||||||
|
0xF8, 0xFF, 0xF8, 0x7F, 0xF0, 0x3F, 0xE0, 0x00, 0x06, 0x20, 0x3F, 0xC1,
|
||||||
|
0xFE, 0x02, 0x30, 0x00, 0x00, 0x00, 0x0F, 0x03, 0xFE, 0x0F, 0xF8, 0x3F,
|
||||||
|
0xF0, 0xFF, 0xE3, 0xFF, 0x8F, 0xF7, 0x3F, 0xDC, 0xFF, 0x3B, 0xFC, 0xFF,
|
||||||
|
0xF1, 0xFF, 0xC3, 0xFF, 0x0F, 0xFC, 0x1F, 0xF0, 0x7F, 0xC0, 0xFF, 0x03,
|
||||||
|
0xC0, 0x01, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x04, 0x00,
|
||||||
|
0x00, 0x00, 0x1F, 0xC0, 0x3F, 0xF8, 0x3F, 0xFE, 0x3E, 0x0F, 0x9E, 0x03,
|
||||||
|
0xDF, 0x01, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0,
|
||||||
|
0x07, 0xFC, 0x07, 0xDE, 0x03, 0xCF, 0x83, 0xE3, 0xFF, 0xE0, 0xFF, 0xE0,
|
||||||
|
0x1F, 0xC0, 0x00, 0x40, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x10,
|
||||||
|
0x00, 0x00, 0x00, 0x1F, 0xC0, 0x3F, 0xF8, 0x3F, 0xFE, 0x3E, 0x0F, 0x9E,
|
||||||
|
0x03, 0xDF, 0x01, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F,
|
||||||
|
0xF0, 0x07, 0xFC, 0x07, 0xDE, 0x03, 0xCF, 0x83, 0xE3, 0xFF, 0xE0, 0xFF,
|
||||||
|
0xE0, 0x1F, 0xC0, 0x00, 0x80, 0x00, 0xE0, 0x00, 0xF8, 0x00, 0xEE, 0x00,
|
||||||
|
0x22, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x3F, 0xF8, 0x3F, 0xFE, 0x3E, 0x0F,
|
||||||
|
0x9E, 0x03, 0xDF, 0x01, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xE0,
|
||||||
|
0x0F, 0xF0, 0x07, 0xFC, 0x07, 0xDE, 0x03, 0xCF, 0x83, 0xE3, 0xFF, 0xE0,
|
||||||
|
0xFF, 0xE0, 0x1F, 0xC0, 0x03, 0x10, 0x03, 0xFC, 0x03, 0xFC, 0x00, 0x8C,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x3F, 0xF8, 0x3F, 0xFE, 0x3E,
|
||||||
|
0x0F, 0x9E, 0x03, 0xDF, 0x01, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F,
|
||||||
|
0xE0, 0x0F, 0xF0, 0x07, 0xFC, 0x07, 0xDE, 0x03, 0xCF, 0x83, 0xE3, 0xFF,
|
||||||
|
0xE0, 0xFF, 0xE0, 0x1F, 0xC0, 0x0C, 0x30, 0x0F, 0x3C, 0x07, 0x9E, 0x01,
|
||||||
|
0x86, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x7F, 0xF0, 0x7F, 0xFC, 0x7C, 0x1F,
|
||||||
|
0x3C, 0x07, 0xBE, 0x03, 0xFE, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x3F, 0xC0,
|
||||||
|
0x1F, 0xE0, 0x0F, 0xF8, 0x0F, 0xBC, 0x07, 0x9F, 0x07, 0xC7, 0xFF, 0xC1,
|
||||||
|
0xFF, 0xC0, 0x3F, 0x80, 0x20, 0x47, 0x0E, 0xF9, 0xF7, 0xFE, 0x1F, 0x80,
|
||||||
|
0xF0, 0x1F, 0x83, 0xFC, 0xF9, 0xF7, 0x0E, 0x20, 0x40, 0x00, 0x02, 0x03,
|
||||||
|
0xFB, 0x87, 0xFF, 0xC7, 0xFF, 0xC7, 0xC3, 0xF3, 0xC1, 0xFB, 0xE1, 0xFF,
|
||||||
|
0xE1, 0xEF, 0xF0, 0xE7, 0xF8, 0xE3, 0xFC, 0xE1, 0xFE, 0xF0, 0xFF, 0xF0,
|
||||||
|
0xFB, 0xF0, 0x79, 0xF8, 0x7C, 0x7F, 0xFC, 0x7F, 0xFC, 0x3B, 0xF8, 0x08,
|
||||||
|
0x00, 0x00, 0x04, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x10, 0x00, 0x03,
|
||||||
|
0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8,
|
||||||
|
0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1E, 0xF1, 0xE7, 0xFF,
|
||||||
|
0x1F, 0xF0, 0x3E, 0x00, 0x01, 0x00, 0x1E, 0x01, 0xE0, 0x1E, 0x00, 0x40,
|
||||||
|
0x00, 0x03, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF,
|
||||||
|
0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1E, 0xF1,
|
||||||
|
0xE7, 0xFF, 0x1F, 0xF0, 0x3E, 0x00, 0x02, 0x00, 0x38, 0x03, 0xE0, 0x3B,
|
||||||
|
0x80, 0x88, 0x00, 0x03, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F,
|
||||||
|
0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC,
|
||||||
|
0x1E, 0xF1, 0xE7, 0xFF, 0x1F, 0xF0, 0x3E, 0x00, 0x30, 0xC3, 0xCF, 0x1E,
|
||||||
|
0x78, 0x61, 0x80, 0x00, 0x78, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83,
|
||||||
|
0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F,
|
||||||
|
0x83, 0xDE, 0x3C, 0xFF, 0xE3, 0xFE, 0x07, 0xC0, 0x00, 0x40, 0x00, 0xF0,
|
||||||
|
0x01, 0xE0, 0x03, 0xC0, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x78, 0x1E,
|
||||||
|
0x7C, 0x3E, 0x3C, 0x3C, 0x3E, 0x7C, 0x1F, 0xF8, 0x0F, 0xF0, 0x0F, 0xF0,
|
||||||
|
0x07, 0xE0, 0x07, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
|
||||||
|
0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xF0, 0x0F, 0x00, 0xFF, 0x8F, 0xFC,
|
||||||
|
0xFF, 0xEF, 0x1F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF1, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xCF, 0xF0, 0xF0, 0x0F, 0x00, 0xF0, 0x00, 0x1F, 0x03, 0xFC, 0x1F,
|
||||||
|
0xF1, 0xE7, 0x8F, 0x3C, 0x79, 0xE3, 0xCF, 0x1E, 0xF0, 0xF7, 0x87, 0xBC,
|
||||||
|
0x3D, 0xF1, 0xEF, 0xCF, 0x1F, 0x78, 0x7F, 0xC1, 0xFE, 0x8F, 0xF7, 0xFF,
|
||||||
|
0xBF, 0xBD, 0xF8, 0x08, 0x0F, 0x01, 0xE0, 0x3C, 0x02, 0x00, 0x07, 0xF1,
|
||||||
|
0xFE, 0x7F, 0xC0, 0xF0, 0x3C, 0xFF, 0x7F, 0xFC, 0xFF, 0x3F, 0xCF, 0xFF,
|
||||||
|
0xDF, 0xF3, 0xF8, 0x04, 0x03, 0xC1, 0xE0, 0xF0, 0x10, 0x00, 0x07, 0xF1,
|
||||||
|
0xFE, 0x7F, 0xC0, 0xF0, 0x3C, 0xFF, 0x7F, 0xFC, 0xFF, 0x3F, 0xCF, 0xFF,
|
||||||
|
0xDF, 0xF3, 0xF8, 0x08, 0x07, 0x03, 0xE1, 0xDC, 0x22, 0x00, 0x07, 0xF1,
|
||||||
|
0xFE, 0x7F, 0xC0, 0xF0, 0x3C, 0xFF, 0x7F, 0xFC, 0xFF, 0x3F, 0xCF, 0xFF,
|
||||||
|
0xDF, 0xF3, 0xF8, 0x18, 0x8F, 0xF7, 0xF8, 0x8C, 0x00, 0x00, 0x07, 0xF1,
|
||||||
|
0xFE, 0x7F, 0xC0, 0xF0, 0x3C, 0xFF, 0x7F, 0xFC, 0xFF, 0x3F, 0xCF, 0xFF,
|
||||||
|
0xDF, 0xF3, 0xF8, 0x61, 0xBC, 0xFF, 0x3D, 0x86, 0x00, 0x1F, 0xC7, 0xF9,
|
||||||
|
0xFF, 0x03, 0xC0, 0xF3, 0xFD, 0xFF, 0xF3, 0xFC, 0xFF, 0x3F, 0xFF, 0x7F,
|
||||||
|
0xCF, 0xE0, 0x1E, 0x0F, 0xC3, 0x30, 0xCC, 0x3F, 0x07, 0x80, 0x01, 0xFC,
|
||||||
|
0x7F, 0x9F, 0xF0, 0x3C, 0x0F, 0x3F, 0xDF, 0xFF, 0x3F, 0xCF, 0xF3, 0xFF,
|
||||||
|
0xF7, 0xFC, 0xFE, 0x3F, 0x8F, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x00, 0xFD,
|
||||||
|
0xF0, 0x0F, 0x1E, 0x3F, 0xE3, 0xDF, 0xFF, 0xFF, 0xC7, 0xFF, 0xF0, 0xF0,
|
||||||
|
0x1E, 0x0F, 0x0B, 0xFF, 0xFF, 0x3F, 0xFF, 0xE3, 0xF9, 0xF8, 0x0F, 0x8F,
|
||||||
|
0xF7, 0xF9, 0xE0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x1E, 0x17, 0xFC,
|
||||||
|
0xFF, 0x07, 0xC1, 0x80, 0x70, 0x1C, 0x1F, 0x07, 0x80, 0x04, 0x01, 0xE0,
|
||||||
|
0x0F, 0x00, 0x78, 0x01, 0x00, 0x00, 0x0F, 0x83, 0xFC, 0x7F, 0xE7, 0x9E,
|
||||||
|
0xF0, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x82, 0x7F, 0xE3, 0xFE,
|
||||||
|
0x0F, 0xC0, 0x02, 0x00, 0x78, 0x0F, 0x01, 0xE0, 0x08, 0x00, 0x00, 0x0F,
|
||||||
|
0x83, 0xFC, 0x7F, 0xE7, 0x9E, 0xF0, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0,
|
||||||
|
0x07, 0x82, 0x7F, 0xE3, 0xFE, 0x0F, 0xC0, 0x04, 0x00, 0xE0, 0x1F, 0x03,
|
||||||
|
0xB8, 0x11, 0x00, 0x00, 0x0F, 0x83, 0xFC, 0x7F, 0xE7, 0x9E, 0xF0, 0xFF,
|
||||||
|
0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x82, 0x7F, 0xE3, 0xFE, 0x0F, 0xC0,
|
||||||
|
0x30, 0xC7, 0x9E, 0x79, 0xE3, 0x0C, 0x00, 0x00, 0xF8, 0x3F, 0xC7, 0xFE,
|
||||||
|
0x79, 0xEF, 0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x78, 0x27, 0xFE,
|
||||||
|
0x3F, 0xE0, 0xFC, 0x23, 0xC7, 0x8F, 0x08, 0x07, 0x9E, 0x79, 0xE7, 0x9E,
|
||||||
|
0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x80, 0x10, 0xF7, 0xBC, 0x40, 0x07, 0x9E,
|
||||||
|
0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x80, 0x10, 0x71, 0xF7,
|
||||||
|
0x74, 0x40, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78,
|
||||||
|
0xF1, 0xE0, 0x61, 0xBC, 0xFF, 0x3D, 0x86, 0x00, 0x07, 0x81, 0xE0, 0x78,
|
||||||
|
0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07,
|
||||||
|
0x80, 0x02, 0x00, 0xF1, 0x07, 0xF0, 0x7F, 0x0F, 0xE0, 0x5E, 0x00, 0xE1,
|
||||||
|
0xFF, 0x3F, 0xF7, 0xFF, 0xF8, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF,
|
||||||
|
0x9E, 0x7F, 0xE3, 0xFC, 0x1F, 0x00, 0x18, 0x87, 0xF9, 0xFE, 0x11, 0x80,
|
||||||
|
0x00, 0x00, 0x1F, 0xC7, 0xFE, 0xFF, 0xDE, 0x7F, 0xC7, 0xF8, 0xFF, 0x1F,
|
||||||
|
0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0x80, 0x04, 0x00, 0xF0,
|
||||||
|
0x03, 0xC0, 0x0F, 0x00, 0x10, 0x00, 0x00, 0x3E, 0x07, 0xFC, 0x7F, 0xF3,
|
||||||
|
0xC7, 0xBC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xEF, 0x1E, 0x7F,
|
||||||
|
0xF1, 0xFF, 0x03, 0xE0, 0x01, 0x00, 0x1E, 0x01, 0xE0, 0x1E, 0x00, 0x40,
|
||||||
|
0x00, 0x00, 0x3E, 0x07, 0xFC, 0x7F, 0xF3, 0xC7, 0xBC, 0x1F, 0xE0, 0xFF,
|
||||||
|
0x07, 0xF8, 0x3F, 0xC1, 0xEF, 0x1E, 0x7F, 0xF1, 0xFF, 0x03, 0xE0, 0x02,
|
||||||
|
0x00, 0x38, 0x03, 0xE0, 0x3B, 0x80, 0x88, 0x00, 0x00, 0x3E, 0x07, 0xFC,
|
||||||
|
0x7F, 0xF3, 0xC7, 0xBC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xEF,
|
||||||
|
0x1E, 0x7F, 0xF1, 0xFF, 0x03, 0xE0, 0x0C, 0x40, 0xFF, 0x0F, 0xF0, 0x23,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x3E, 0x07, 0xFC, 0x7F, 0xF3, 0xC7, 0xBC, 0x1F,
|
||||||
|
0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xEF, 0x1E, 0x7F, 0xF1, 0xFF, 0x03,
|
||||||
|
0xE0, 0x30, 0xC3, 0xCF, 0x1E, 0x78, 0x61, 0x80, 0x00, 0x07, 0xC0, 0xFF,
|
||||||
|
0x8F, 0xFE, 0x78, 0xF7, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3D,
|
||||||
|
0xE3, 0xCF, 0xFE, 0x3F, 0xE0, 0x7C, 0x00, 0x06, 0x00, 0xF0, 0x0F, 0x00,
|
||||||
|
0x60, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x60, 0x0F, 0x00,
|
||||||
|
0xF0, 0x06, 0x00, 0x00, 0x00, 0x7D, 0xCF, 0xFC, 0xFF, 0xE7, 0x8F, 0x78,
|
||||||
|
0xFF, 0xCF, 0xFE, 0xEF, 0xFE, 0x7F, 0xE3, 0xDE, 0x3C, 0xFF, 0xE7, 0xFE,
|
||||||
|
0x77, 0xC0, 0x00, 0x00, 0x08, 0x07, 0x80, 0x78, 0x07, 0x80, 0x20, 0x00,
|
||||||
|
0x3C, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1F, 0xE3, 0xFC,
|
||||||
|
0x7F, 0xCF, 0x7F, 0xEF, 0xFC, 0x7F, 0x00, 0x02, 0x00, 0xF0, 0x3C, 0x0F,
|
||||||
|
0x00, 0x80, 0x00, 0x3C, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF,
|
||||||
|
0x1F, 0xE3, 0xFC, 0x7F, 0xCF, 0x7F, 0xEF, 0xFC, 0x7F, 0x00, 0x04, 0x01,
|
||||||
|
0xC0, 0x7C, 0x1D, 0xC1, 0x10, 0x00, 0x3C, 0x7F, 0x8F, 0xF1, 0xFE, 0x3F,
|
||||||
|
0xC7, 0xF8, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0xCF, 0x7F, 0xEF, 0xFC, 0x7F,
|
||||||
|
0x00, 0x61, 0x9E, 0x7B, 0xCF, 0x30, 0xC0, 0x01, 0xE3, 0xFC, 0x7F, 0x8F,
|
||||||
|
0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1F, 0xE3, 0xFE, 0x7B, 0xFF, 0x7F,
|
||||||
|
0xE3, 0xF8, 0x00, 0x80, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0x20, 0x00, 0x03,
|
||||||
|
0xC1, 0xFF, 0x1F, 0x78, 0xF3, 0xC7, 0x9E, 0x3C, 0x7B, 0xC3, 0xDE, 0x1E,
|
||||||
|
0xF0, 0x77, 0x03, 0xF8, 0x1F, 0xC0, 0x7C, 0x03, 0xE0, 0x3E, 0x0F, 0xF0,
|
||||||
|
0x7F, 0x03, 0xF0, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
|
||||||
|
0x00, 0xFF, 0x0F, 0xFC, 0xFF, 0xEF, 0x1E, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF,
|
||||||
|
0x0F, 0xF0, 0xFF, 0x1F, 0xFF, 0xEF, 0xFC, 0xFF, 0x8F, 0x00, 0xF0, 0x0F,
|
||||||
|
0x00, 0xF0, 0x00, 0x18, 0x61, 0xE7, 0x8F, 0x3C, 0x30, 0xC0, 0x00, 0x78,
|
||||||
|
0x3F, 0xE3, 0xEF, 0x1E, 0x78, 0xF3, 0xC7, 0x8F, 0x78, 0x7B, 0xC3, 0xDE,
|
||||||
|
0x0E, 0xE0, 0x7F, 0x03, 0xF8, 0x0F, 0x80, 0x7C, 0x07, 0xC1, 0xFE, 0x0F,
|
||||||
|
0xE0, 0x7E, 0x00 };
|
||||||
|
|
||||||
|
const GFXglyph Ubuntu_Bold12pt8bGlyphs[] PROGMEM = {
|
||||||
|
{ 0, 1, 1, 6, 0, 0 }, // 0x20 ' ' U+0020
|
||||||
|
{ 1, 4, 17, 8, 2, -16 }, // 0x21 '!' U+0021
|
||||||
|
{ 10, 9, 7, 11, 1, -17 }, // 0x22 '"' U+0022
|
||||||
|
{ 18, 15, 17, 17, 1, -16 }, // 0x23 '#' U+0023
|
||||||
|
{ 50, 12, 22, 14, 1, -18 }, // 0x24 '$' U+0024
|
||||||
|
{ 83, 20, 17, 22, 1, -16 }, // 0x25 '%' U+0025
|
||||||
|
{ 126, 16, 17, 17, 1, -16 }, // 0x26 '&' U+0026
|
||||||
|
{ 160, 4, 7, 6, 1, -17 }, // 0x27 ''' U+0027
|
||||||
|
{ 164, 7, 23, 9, 2, -18 }, // 0x28 '(' U+0028
|
||||||
|
{ 185, 7, 23, 9, 0, -18 }, // 0x29 ')' U+0029
|
||||||
|
{ 206, 11, 10, 12, 1, -16 }, // 0x2a '*' U+002A
|
||||||
|
{ 220, 11, 11, 13, 1, -12 }, // 0x2b '+' U+002B
|
||||||
|
{ 236, 5, 8, 6, 0, -3 }, // 0x2c ',' U+002C
|
||||||
|
{ 241, 7, 3, 9, 1, -8 }, // 0x2d '-' U+002D
|
||||||
|
{ 244, 4, 4, 6, 1, -3 }, // 0x2e '.' U+002E
|
||||||
|
{ 246, 12, 23, 10, -1, -18 }, // 0x2f '/' U+002F
|
||||||
|
{ 281, 12, 17, 14, 1, -16 }, // 0x30 '0' U+0030
|
||||||
|
{ 307, 8, 17, 14, 2, -16 }, // 0x31 '1' U+0031
|
||||||
|
{ 324, 12, 17, 14, 1, -16 }, // 0x32 '2' U+0032
|
||||||
|
{ 350, 11, 17, 14, 1, -16 }, // 0x33 '3' U+0033
|
||||||
|
{ 374, 12, 17, 14, 1, -16 }, // 0x34 '4' U+0034
|
||||||
|
{ 400, 12, 17, 14, 1, -16 }, // 0x35 '5' U+0035
|
||||||
|
{ 426, 12, 17, 14, 1, -16 }, // 0x36 '6' U+0036
|
||||||
|
{ 452, 12, 17, 14, 1, -16 }, // 0x37 '7' U+0037
|
||||||
|
{ 478, 12, 17, 14, 1, -16 }, // 0x38 '8' U+0038
|
||||||
|
{ 504, 12, 17, 14, 1, -16 }, // 0x39 '9' U+0039
|
||||||
|
{ 530, 4, 13, 6, 1, -12 }, // 0x3a ':' U+003A
|
||||||
|
{ 537, 5, 17, 6, 0, -12 }, // 0x3b ';' U+003B
|
||||||
|
{ 548, 12, 11, 14, 1, -12 }, // 0x3c '<' U+003C
|
||||||
|
{ 565, 11, 8, 14, 2, -10 }, // 0x3d '=' U+003D
|
||||||
|
{ 576, 12, 11, 14, 1, -12 }, // 0x3e '>' U+003E
|
||||||
|
{ 593, 10, 19, 11, 0, -18 }, // 0x3f '?' U+003F
|
||||||
|
{ 617, 21, 21, 23, 1, -16 }, // 0x40 '@' U+0040
|
||||||
|
{ 673, 17, 17, 17, 0, -16 }, // 0x41 'A' U+0041
|
||||||
|
{ 710, 13, 17, 16, 2, -16 }, // 0x42 'B' U+0042
|
||||||
|
{ 738, 14, 17, 16, 1, -16 }, // 0x43 'C' U+0043
|
||||||
|
{ 768, 15, 17, 18, 2, -16 }, // 0x44 'D' U+0044
|
||||||
|
{ 800, 12, 17, 15, 2, -16 }, // 0x45 'E' U+0045
|
||||||
|
{ 826, 11, 17, 14, 2, -16 }, // 0x46 'F' U+0046
|
||||||
|
{ 850, 14, 17, 17, 1, -16 }, // 0x47 'G' U+0047
|
||||||
|
{ 880, 14, 17, 18, 2, -16 }, // 0x48 'H' U+0048
|
||||||
|
{ 910, 4, 17, 8, 2, -16 }, // 0x49 'I' U+0049
|
||||||
|
{ 919, 11, 17, 13, 0, -16 }, // 0x4a 'J' U+004A
|
||||||
|
{ 943, 14, 17, 16, 2, -16 }, // 0x4b 'K' U+004B
|
||||||
|
{ 973, 12, 17, 14, 2, -16 }, // 0x4c 'L' U+004C
|
||||||
|
{ 999, 19, 17, 21, 1, -16 }, // 0x4d 'M' U+004D
|
||||||
|
{ 1040, 14, 17, 18, 2, -16 }, // 0x4e 'N' U+004E
|
||||||
|
{ 1070, 17, 17, 19, 1, -16 }, // 0x4f 'O' U+004F
|
||||||
|
{ 1107, 12, 17, 15, 2, -16 }, // 0x50 'P' U+0050
|
||||||
|
{ 1133, 17, 22, 19, 1, -16 }, // 0x51 'Q' U+0051
|
||||||
|
{ 1180, 14, 17, 16, 2, -16 }, // 0x52 'R' U+0052
|
||||||
|
{ 1210, 12, 17, 14, 1, -16 }, // 0x53 'S' U+0053
|
||||||
|
{ 1236, 14, 17, 14, 0, -16 }, // 0x54 'T' U+0054
|
||||||
|
{ 1266, 13, 17, 17, 2, -16 }, // 0x55 'U' U+0055
|
||||||
|
{ 1294, 17, 17, 17, 0, -16 }, // 0x56 'V' U+0056
|
||||||
|
{ 1331, 23, 17, 23, 0, -16 }, // 0x57 'W' U+0057
|
||||||
|
{ 1380, 16, 17, 16, 0, -16 }, // 0x58 'X' U+0058
|
||||||
|
{ 1414, 16, 17, 16, 0, -16 }, // 0x59 'Y' U+0059
|
||||||
|
{ 1448, 13, 17, 15, 1, -16 }, // 0x5a 'Z' U+005A
|
||||||
|
{ 1476, 7, 23, 9, 2, -18 }, // 0x5b '[' U+005B
|
||||||
|
{ 1497, 12, 23, 10, -1, -18 }, // 0x5c '\' U+005C
|
||||||
|
{ 1532, 7, 23, 9, 0, -18 }, // 0x5d ']' U+005D
|
||||||
|
{ 1553, 13, 10, 13, 0, -16 }, // 0x5e '^' U+005E
|
||||||
|
{ 1570, 12, 3, 12, 0, 2 }, // 0x5f '_' U+005F
|
||||||
|
{ 1575, 6, 5, 7, 1, -18 }, // 0x60 '`' U+0060
|
||||||
|
{ 1579, 10, 13, 13, 1, -12 }, // 0x61 'a' U+0061
|
||||||
|
{ 1596, 12, 19, 15, 2, -18 }, // 0x62 'b' U+0062
|
||||||
|
{ 1625, 10, 13, 12, 1, -12 }, // 0x63 'c' U+0063
|
||||||
|
{ 1642, 12, 19, 15, 1, -18 }, // 0x64 'd' U+0064
|
||||||
|
{ 1671, 12, 13, 14, 1, -12 }, // 0x65 'e' U+0065
|
||||||
|
{ 1691, 9, 19, 10, 2, -18 }, // 0x66 'f' U+0066
|
||||||
|
{ 1713, 11, 17, 14, 1, -12 }, // 0x67 'g' U+0067
|
||||||
|
{ 1737, 11, 19, 15, 2, -18 }, // 0x68 'h' U+0068
|
||||||
|
{ 1764, 4, 19, 8, 2, -18 }, // 0x69 'i' U+0069
|
||||||
|
{ 1774, 7, 23, 6, -2, -18 }, // 0x6a 'j' U+006A
|
||||||
|
{ 1795, 12, 19, 14, 2, -18 }, // 0x6b 'k' U+006B
|
||||||
|
{ 1824, 6, 19, 8, 2, -18 }, // 0x6c 'l' U+006C
|
||||||
|
{ 1839, 18, 13, 22, 2, -12 }, // 0x6d 'm' U+006D
|
||||||
|
{ 1869, 11, 13, 15, 2, -12 }, // 0x6e 'n' U+006E
|
||||||
|
{ 1887, 13, 13, 15, 1, -12 }, // 0x6f 'o' U+006F
|
||||||
|
{ 1909, 12, 17, 15, 2, -12 }, // 0x70 'p' U+0070
|
||||||
|
{ 1935, 13, 17, 15, 1, -12 }, // 0x71 'q' U+0071
|
||||||
|
{ 1963, 9, 13, 11, 2, -12 }, // 0x72 'r' U+0072
|
||||||
|
{ 1978, 10, 13, 12, 1, -12 }, // 0x73 's' U+0073
|
||||||
|
{ 1995, 9, 17, 11, 2, -16 }, // 0x74 't' U+0074
|
||||||
|
{ 2015, 11, 13, 15, 2, -12 }, // 0x75 'u' U+0075
|
||||||
|
{ 2033, 13, 13, 13, 0, -12 }, // 0x76 'v' U+0076
|
||||||
|
{ 2055, 19, 13, 19, 0, -12 }, // 0x77 'w' U+0077
|
||||||
|
{ 2086, 13, 13, 13, 0, -12 }, // 0x78 'x' U+0078
|
||||||
|
{ 2108, 13, 17, 13, 0, -12 }, // 0x79 'y' U+0079
|
||||||
|
{ 2136, 10, 13, 12, 1, -12 }, // 0x7a 'z' U+007A
|
||||||
|
{ 2153, 8, 23, 9, 1, -18 }, // 0x7b '{' U+007B
|
||||||
|
{ 2176, 3, 23, 7, 2, -18 }, // 0x7c '|' U+007C
|
||||||
|
{ 2185, 8, 23, 9, 0, -18 }, // 0x7d '}' U+007D
|
||||||
|
{ 2208, 12, 5, 14, 1, -9 }, // 0x7e '~' U+007E
|
||||||
|
{ 2216, 10, 18, 12, 1, -17 }, // 0x7f 'REPLACEMENT CHARACTER *' U+2370
|
||||||
|
{ 2239, 1, 1, 6, 0, 0 }, // 0x80 'NO-BREAK SPACE' U+00A0
|
||||||
|
{ 2240, 4, 17, 8, 2, -12 }, // 0x81 'INVERTED EXCLAMATION MARK' U+00A1
|
||||||
|
{ 2249, 11, 18, 14, 1, -15 }, // 0x82 'CENT SIGN' U+00A2
|
||||||
|
{ 2274, 11, 17, 14, 1, -16 }, // 0x83 'POUND SIGN' U+00A3
|
||||||
|
{ 2298, 11, 11, 14, 1, -13 }, // 0x84 'CURRENCY SIGN' U+00A4
|
||||||
|
{ 2314, 14, 17, 14, 0, -16 }, // 0x85 'YEN SIGN' U+00A5
|
||||||
|
{ 2344, 4, 23, 7, 2, -18 }, // 0x86 'BROKEN BAR' U+00A6
|
||||||
|
{ 2356, 10, 21, 12, 1, -16 }, // 0x87 'SECTION SIGN' U+00A7
|
||||||
|
{ 2383, 10, 4, 13, 2, -17 }, // 0x88 'DIAERESIS' U+00A8
|
||||||
|
{ 2388, 17, 17, 19, 1, -16 }, // 0x89 'COPYRIGHT SIGN' U+00A9
|
||||||
|
{ 2425, 8, 9, 10, 1, -16 }, // 0x8a 'FEMININE ORDINAL INDICATOR' U+00AA
|
||||||
|
{ 2434, 12, 11, 14, 1, -11 }, // 0x8b 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00AB
|
||||||
|
{ 2451, 12, 9, 14, 1, -9 }, // 0x8c 'NOT SIGN' U+00AC
|
||||||
|
{ 2465, 7, 3, 9, 1, -8 }, // 0x8d 'SOFT HYPHEN' U+00AD
|
||||||
|
{ 2468, 17, 17, 19, 1, -16 }, // 0x8e 'REGISTERED SIGN' U+00AE
|
||||||
|
{ 2505, 8, 2, 9, 1, -16 }, // 0x8f 'MACRON' U+00AF
|
||||||
|
{ 2507, 7, 7, 8, 0, -17 }, // 0x90 'DEGREE SIGN' U+00B0
|
||||||
|
{ 2514, 11, 15, 13, 1, -14 }, // 0x91 'PLUS-MINUS SIGN' U+00B1
|
||||||
|
{ 2535, 8, 10, 9, 0, -16 }, // 0x92 'SUPERSCRIPT TWO' U+00B2
|
||||||
|
{ 2545, 8, 10, 9, 0, -16 }, // 0x93 'SUPERSCRIPT THREE' U+00B3
|
||||||
|
{ 2555, 6, 5, 7, 0, -18 }, // 0x94 'ACUTE ACCENT' U+00B4
|
||||||
|
{ 2559, 11, 17, 15, 2, -12 }, // 0x95 'MICRO SIGN' U+00B5
|
||||||
|
{ 2583, 14, 21, 17, 1, -16 }, // 0x96 'PILCROW SIGN' U+00B6
|
||||||
|
{ 2620, 4, 4, 6, 1, -8 }, // 0x97 'MIDDLE DOT' U+00B7
|
||||||
|
{ 2622, 6, 5, 8, 1, 1 }, // 0x98 'CEDILLA' U+00B8
|
||||||
|
{ 2626, 6, 10, 9, 1, -16 }, // 0x99 'SUPERSCRIPT ONE' U+00B9
|
||||||
|
{ 2634, 9, 10, 11, 1, -16 }, // 0x9a 'MASCULINE ORDINAL INDICATOR' U+00BA
|
||||||
|
{ 2646, 12, 11, 14, 1, -11 }, // 0x9b 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00BB
|
||||||
|
{ 2663, 20, 17, 21, 1, -16 }, // 0x9c 'VULGAR FRACTION ONE QUARTER' U+00BC
|
||||||
|
{ 2706, 19, 17, 21, 1, -16 }, // 0x9d 'VULGAR FRACTION ONE HALF' U+00BD
|
||||||
|
{ 2747, 21, 17, 21, 0, -16 }, // 0x9e 'VULGAR FRACTION THREE QUARTERS' U+00BE
|
||||||
|
{ 2792, 10, 17, 11, 1, -12 }, // 0x9f 'INVERTED QUESTION MARK' U+00BF
|
||||||
|
{ 2814, 17, 23, 17, 0, -22 }, // 0xa0 'LATIN CAPITAL LETTER A WITH GRAVE' U+00C0
|
||||||
|
{ 2863, 17, 23, 17, 0, -22 }, // 0xa1 'LATIN CAPITAL LETTER A WITH ACUTE' U+00C1
|
||||||
|
{ 2912, 17, 23, 17, 0, -22 }, // 0xa2 'LATIN CAPITAL LETTER A WITH CIRCUMFLEX' U+00C2
|
||||||
|
{ 2961, 17, 23, 17, 0, -22 }, // 0xa3 'LATIN CAPITAL LETTER A WITH TILDE' U+00C3
|
||||||
|
{ 3010, 17, 22, 17, 0, -21 }, // 0xa4 'LATIN CAPITAL LETTER A WITH DIAERESIS' U+00C4
|
||||||
|
{ 3057, 17, 22, 17, 0, -21 }, // 0xa5 'LATIN CAPITAL LETTER A WITH RING ABOVE' U+00C5
|
||||||
|
{ 3104, 23, 17, 24, 0, -16 }, // 0xa6 'LATIN CAPITAL LETTER AE' U+00C6
|
||||||
|
{ 3153, 14, 22, 16, 1, -16 }, // 0xa7 'LATIN CAPITAL LETTER C WITH CEDILLA' U+00C7
|
||||||
|
{ 3192, 12, 23, 15, 2, -22 }, // 0xa8 'LATIN CAPITAL LETTER E WITH GRAVE' U+00C8
|
||||||
|
{ 3227, 12, 23, 15, 2, -22 }, // 0xa9 'LATIN CAPITAL LETTER E WITH ACUTE' U+00C9
|
||||||
|
{ 3262, 12, 23, 15, 2, -22 }, // 0xaa 'LATIN CAPITAL LETTER E WITH CIRCUMFLEX' U+00CA
|
||||||
|
{ 3297, 12, 22, 15, 2, -21 }, // 0xab 'LATIN CAPITAL LETTER E WITH DIAERESIS' U+00CB
|
||||||
|
{ 3330, 6, 23, 8, 1, -22 }, // 0xac 'LATIN CAPITAL LETTER I WITH GRAVE' U+00CC
|
||||||
|
{ 3348, 6, 23, 8, 1, -22 }, // 0xad 'LATIN CAPITAL LETTER I WITH ACUTE' U+00CD
|
||||||
|
{ 3366, 7, 23, 8, 1, -22 }, // 0xae 'LATIN CAPITAL LETTER I WITH CIRCUMFLEX' U+00CE
|
||||||
|
{ 3387, 10, 22, 8, -1, -21 }, // 0xaf 'LATIN CAPITAL LETTER I WITH DIAERESIS' U+00CF
|
||||||
|
{ 3415, 17, 17, 18, 0, -16 }, // 0xb0 'LATIN CAPITAL LETTER ETH' U+00D0
|
||||||
|
{ 3452, 14, 23, 18, 2, -22 }, // 0xb1 'LATIN CAPITAL LETTER N WITH TILDE' U+00D1
|
||||||
|
{ 3493, 17, 23, 19, 1, -22 }, // 0xb2 'LATIN CAPITAL LETTER O WITH GRAVE' U+00D2
|
||||||
|
{ 3542, 17, 23, 19, 1, -22 }, // 0xb3 'LATIN CAPITAL LETTER O WITH ACUTE' U+00D3
|
||||||
|
{ 3591, 17, 23, 19, 1, -22 }, // 0xb4 'LATIN CAPITAL LETTER O WITH CIRCUMFLEX' U+00D4
|
||||||
|
{ 3640, 17, 23, 19, 1, -22 }, // 0xb5 'LATIN CAPITAL LETTER O WITH TILDE' U+00D5
|
||||||
|
{ 3689, 17, 22, 19, 1, -21 }, // 0xb6 'LATIN CAPITAL LETTER O WITH DIAERESIS' U+00D6
|
||||||
|
{ 3736, 12, 11, 14, 1, -12 }, // 0xb7 'MULTIPLICATION SIGN' U+00D7
|
||||||
|
{ 3753, 17, 19, 19, 1, -17 }, // 0xb8 'LATIN CAPITAL LETTER O WITH STROKE' U+00D8
|
||||||
|
{ 3794, 13, 23, 17, 2, -22 }, // 0xb9 'LATIN CAPITAL LETTER U WITH GRAVE' U+00D9
|
||||||
|
{ 3832, 13, 23, 17, 2, -22 }, // 0xba 'LATIN CAPITAL LETTER U WITH ACUTE' U+00DA
|
||||||
|
{ 3870, 13, 23, 17, 2, -22 }, // 0xbb 'LATIN CAPITAL LETTER U WITH CIRCUMFLEX' U+00DB
|
||||||
|
{ 3908, 13, 22, 17, 2, -21 }, // 0xbc 'LATIN CAPITAL LETTER U WITH DIAERESIS' U+00DC
|
||||||
|
{ 3944, 16, 23, 16, 0, -22 }, // 0xbd 'LATIN CAPITAL LETTER Y WITH ACUTE' U+00DD
|
||||||
|
{ 3990, 12, 17, 15, 2, -16 }, // 0xbe 'LATIN CAPITAL LETTER THORN' U+00DE
|
||||||
|
{ 4016, 13, 19, 16, 2, -18 }, // 0xbf 'LATIN SMALL LETTER SHARP S' U+00DF
|
||||||
|
{ 4047, 10, 19, 13, 1, -18 }, // 0xc0 'LATIN SMALL LETTER A WITH GRAVE' U+00E0
|
||||||
|
{ 4071, 10, 19, 13, 1, -18 }, // 0xc1 'LATIN SMALL LETTER A WITH ACUTE' U+00E1
|
||||||
|
{ 4095, 10, 19, 13, 1, -18 }, // 0xc2 'LATIN SMALL LETTER A WITH CIRCUMFLEX' U+00E2
|
||||||
|
{ 4119, 10, 19, 13, 1, -18 }, // 0xc3 'LATIN SMALL LETTER A WITH TILDE' U+00E3
|
||||||
|
{ 4143, 10, 18, 13, 1, -17 }, // 0xc4 'LATIN SMALL LETTER A WITH DIAERESIS' U+00E4
|
||||||
|
{ 4166, 10, 20, 13, 1, -19 }, // 0xc5 'LATIN SMALL LETTER A WITH RING ABOVE' U+00E5
|
||||||
|
{ 4191, 19, 13, 21, 1, -12 }, // 0xc6 'LATIN SMALL LETTER AE' U+00E6
|
||||||
|
{ 4222, 10, 18, 12, 1, -12 }, // 0xc7 'LATIN SMALL LETTER C WITH CEDILLA' U+00E7
|
||||||
|
{ 4245, 12, 19, 14, 1, -18 }, // 0xc8 'LATIN SMALL LETTER E WITH GRAVE' U+00E8
|
||||||
|
{ 4274, 12, 19, 14, 1, -18 }, // 0xc9 'LATIN SMALL LETTER E WITH ACUTE' U+00E9
|
||||||
|
{ 4303, 12, 19, 14, 1, -18 }, // 0xca 'LATIN SMALL LETTER E WITH CIRCUMFLEX' U+00EA
|
||||||
|
{ 4332, 12, 18, 14, 1, -17 }, // 0xcb 'LATIN SMALL LETTER E WITH DIAERESIS' U+00EB
|
||||||
|
{ 4359, 6, 19, 8, 1, -18 }, // 0xcc 'LATIN SMALL LETTER I WITH GRAVE' U+00EC
|
||||||
|
{ 4374, 6, 19, 8, 1, -18 }, // 0xcd 'LATIN SMALL LETTER I WITH ACUTE' U+00ED
|
||||||
|
{ 4389, 7, 19, 8, 1, -18 }, // 0xce 'LATIN SMALL LETTER I WITH CIRCUMFLEX' U+00EE
|
||||||
|
{ 4406, 10, 18, 8, -1, -17 }, // 0xcf 'LATIN SMALL LETTER I WITH DIAERESIS' U+00EF
|
||||||
|
{ 4429, 12, 19, 14, 1, -18 }, // 0xd0 'LATIN SMALL LETTER ETH' U+00F0
|
||||||
|
{ 4458, 11, 19, 15, 2, -18 }, // 0xd1 'LATIN SMALL LETTER N WITH TILDE' U+00F1
|
||||||
|
{ 4485, 13, 19, 15, 1, -18 }, // 0xd2 'LATIN SMALL LETTER O WITH GRAVE' U+00F2
|
||||||
|
{ 4516, 13, 19, 15, 1, -18 }, // 0xd3 'LATIN SMALL LETTER O WITH ACUTE' U+00F3
|
||||||
|
{ 4547, 13, 19, 15, 1, -18 }, // 0xd4 'LATIN SMALL LETTER O WITH CIRCUMFLEX' U+00F4
|
||||||
|
{ 4578, 13, 19, 15, 1, -18 }, // 0xd5 'LATIN SMALL LETTER O WITH TILDE' U+00F5
|
||||||
|
{ 4609, 13, 18, 15, 1, -17 }, // 0xd6 'LATIN SMALL LETTER O WITH DIAERESIS' U+00F6
|
||||||
|
{ 4639, 12, 13, 14, 1, -12 }, // 0xd7 'DIVISION SIGN' U+00F7
|
||||||
|
{ 4659, 13, 15, 15, 1, -13 }, // 0xd8 'LATIN SMALL LETTER O WITH STROKE' U+00F8
|
||||||
|
{ 4684, 11, 19, 15, 2, -18 }, // 0xd9 'LATIN SMALL LETTER U WITH GRAVE' U+00F9
|
||||||
|
{ 4711, 11, 19, 15, 2, -18 }, // 0xda 'LATIN SMALL LETTER U WITH ACUTE' U+00FA
|
||||||
|
{ 4738, 11, 19, 15, 2, -18 }, // 0xdb 'LATIN SMALL LETTER U WITH CIRCUMFLEX' U+00FB
|
||||||
|
{ 4765, 11, 18, 15, 2, -17 }, // 0xdc 'LATIN SMALL LETTER U WITH DIAERESIS' U+00FC
|
||||||
|
{ 4790, 13, 23, 13, 0, -18 }, // 0xdd 'LATIN SMALL LETTER Y WITH ACUTE' U+00FD
|
||||||
|
{ 4828, 12, 23, 15, 2, -18 }, // 0xde 'LATIN SMALL LETTER THORN' U+00FE
|
||||||
|
{ 4863, 13, 22, 13, 0, -17 } }; // 0xdf 'LATIN SMALL LETTER Y WITH DIAERESIS' U+000FF
|
||||||
|
|
||||||
|
const GFXfont Ubuntu_Bold12pt8b PROGMEM = {
|
||||||
|
(uint8_t *)Ubuntu_Bold12pt8bBitmaps,
|
||||||
|
(GFXglyph *)Ubuntu_Bold12pt8bGlyphs,
|
||||||
|
0x20, 0xDF, 27 };
|
||||||
|
|
||||||
|
// Approx. 6250 bytes
|
||||||
866
lib/obp60task/fonts/Ubuntu_Bold16pt8b.h
Normal file
866
lib/obp60task/fonts/Ubuntu_Bold16pt8b.h
Normal file
@@ -0,0 +1,866 @@
|
|||||||
|
const uint8_t Ubuntu_Bold16pt8bBitmaps[] PROGMEM = {
|
||||||
|
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x0E, 0xFF,
|
||||||
|
0xFF, 0xF7, 0x00, 0xF9, 0xFF, 0x9F, 0xF9, 0xFF, 0x9F, 0xF9, 0xFF, 0x9F,
|
||||||
|
0xF9, 0xFF, 0x1E, 0x70, 0xE0, 0x07, 0xCF, 0x81, 0xF3, 0xE0, 0x7D, 0xF8,
|
||||||
|
0x3E, 0x7C, 0x0F, 0x9F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xC7, 0xCF, 0x81, 0xF3, 0xE0, 0x7C, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0x7C, 0x0F, 0x9F, 0x07, 0xEF, 0x81,
|
||||||
|
0xF3, 0xE0, 0x7C, 0xF8, 0x00, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x07,
|
||||||
|
0xF8, 0x1F, 0xFE, 0x3F, 0xFE, 0x3F, 0xFC, 0x7E, 0x0C, 0x7C, 0x00, 0x7C,
|
||||||
|
0x00, 0x7E, 0x00, 0x7F, 0xE0, 0x3F, 0xF8, 0x1F, 0xFC, 0x0F, 0xFE, 0x01,
|
||||||
|
0xFF, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x1F, 0x70, 0x3F, 0x7F, 0xFE, 0xFF,
|
||||||
|
0xFE, 0xFF, 0xFC, 0x1F, 0xF0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03,
|
||||||
|
0xC0, 0x1F, 0x80, 0xF8, 0x0F, 0xF0, 0x3C, 0x07, 0xFE, 0x1F, 0x03, 0xE7,
|
||||||
|
0xC7, 0x80, 0xF0, 0xF3, 0xE0, 0x3C, 0x3C, 0xF0, 0x0F, 0x0F, 0x78, 0x03,
|
||||||
|
0xC3, 0xFE, 0x00, 0xF9, 0xFF, 0x00, 0x1F, 0xFF, 0xDF, 0x83, 0xFD, 0xEF,
|
||||||
|
0xF0, 0x7E, 0xFF, 0xFE, 0x00, 0x3F, 0xE7, 0xC0, 0x1F, 0xF0, 0xF0, 0x07,
|
||||||
|
0xBC, 0x3C, 0x03, 0xCF, 0x0F, 0x01, 0xF3, 0xC3, 0xC0, 0x78, 0xF9, 0xF0,
|
||||||
|
0x3E, 0x1F, 0xF8, 0x0F, 0x03, 0xFC, 0x07, 0xC0, 0x7E, 0x00, 0x07, 0xF0,
|
||||||
|
0x00, 0x7F, 0xE0, 0x07, 0xFF, 0x80, 0x7F, 0xFC, 0x03, 0xE3, 0xE0, 0x1F,
|
||||||
|
0x1F, 0x00, 0xFD, 0xF0, 0x03, 0xFF, 0x80, 0x1F, 0xF8, 0x00, 0xFF, 0x00,
|
||||||
|
0x0F, 0xFC, 0xF8, 0xFF, 0xF7, 0xC7, 0xDF, 0xBE, 0x7C, 0x7F, 0xE3, 0xE1,
|
||||||
|
0xFF, 0x1F, 0x07, 0xF0, 0xFC, 0x1F, 0x87, 0xFF, 0xFE, 0x1F, 0xFF, 0xF8,
|
||||||
|
0x7F, 0xFF, 0xE0, 0xFE, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x70,
|
||||||
|
0x04, 0x07, 0x87, 0xE3, 0xE3, 0xF1, 0xF1, 0xF8, 0xF8, 0x7C, 0x3E, 0x3E,
|
||||||
|
0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x07, 0xC3,
|
||||||
|
0xE1, 0xF0, 0xFC, 0x3E, 0x1F, 0x87, 0xC3, 0xF0, 0xF0, 0x20, 0x10, 0x3C,
|
||||||
|
0x3F, 0x0F, 0x87, 0xE1, 0xF0, 0xFC, 0x3E, 0x1F, 0x0F, 0x83, 0xE1, 0xF0,
|
||||||
|
0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF1, 0xF0, 0xF8, 0x7C,
|
||||||
|
0x7E, 0x3E, 0x3F, 0x1F, 0x1F, 0x87, 0x80, 0x80, 0x0F, 0x80, 0x7C, 0x1B,
|
||||||
|
0xCC, 0xEE, 0xEF, 0xFF, 0xFF, 0xFC, 0x1C, 0x03, 0xF8, 0x3D, 0xE3, 0xEF,
|
||||||
|
0x8E, 0x38, 0x11, 0x00, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07,
|
||||||
|
0x83, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x1E, 0x00, 0x78, 0x01,
|
||||||
|
0xE0, 0x07, 0x80, 0x1E, 0x00, 0x7D, 0xF7, 0xDF, 0x7D, 0xE7, 0xBE, 0xF1,
|
||||||
|
0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7B, 0xFF, 0xFF, 0xFD, 0xE0, 0x00,
|
||||||
|
0x3E, 0x00, 0xFC, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E,
|
||||||
|
0x00, 0xFC, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00,
|
||||||
|
0xFC, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00, 0xFC,
|
||||||
|
0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x3E, 0x00, 0xFC, 0x01,
|
||||||
|
0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8,
|
||||||
|
0x3F, 0xFC, 0x3F, 0xFC, 0x7E, 0x7E, 0x7C, 0x3E, 0xF8, 0x1F, 0xF8, 0x1F,
|
||||||
|
0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F,
|
||||||
|
0xF8, 0x1F, 0x7C, 0x3E, 0x7E, 0x7E, 0x3F, 0xFC, 0x3F, 0xFC, 0x1F, 0xF8,
|
||||||
|
0x07, 0xE0, 0x03, 0xC1, 0xF1, 0xFD, 0xFF, 0xFF, 0xFF, 0xF7, 0x7D, 0x1F,
|
||||||
|
0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1,
|
||||||
|
0xF0, 0x7C, 0x1F, 0x07, 0xC0, 0x0F, 0xC0, 0x7F, 0xE3, 0xFF, 0xE7, 0xFF,
|
||||||
|
0xE7, 0x8F, 0xC4, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x03, 0xF0,
|
||||||
|
0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x3E,
|
||||||
|
0x00, 0xFF, 0xFD, 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xE0, 0x1F, 0xC0, 0xFF,
|
||||||
|
0xE3, 0xFF, 0xE3, 0xFF, 0xE6, 0x0F, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x7C,
|
||||||
|
0x1F, 0xF8, 0x3F, 0xC0, 0x7F, 0xE0, 0xFF, 0xE0, 0x0F, 0xE0, 0x07, 0xC0,
|
||||||
|
0x0F, 0x80, 0x1F, 0x60, 0x7F, 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xC3, 0xFC,
|
||||||
|
0x00, 0x00, 0x7C, 0x00, 0xFC, 0x01, 0xFC, 0x03, 0xFC, 0x07, 0xFC, 0x0F,
|
||||||
|
0xFC, 0x0F, 0x7C, 0x1E, 0x7C, 0x3E, 0x7C, 0x3C, 0x7C, 0x78, 0x7C, 0xF8,
|
||||||
|
0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7C, 0x00,
|
||||||
|
0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x3F, 0xFC, 0x7F, 0xF8, 0xFF,
|
||||||
|
0xF1, 0xFF, 0xE3, 0xC0, 0x07, 0x80, 0x1F, 0x00, 0x3F, 0xC0, 0x7F, 0xF0,
|
||||||
|
0xFF, 0xF1, 0xFF, 0xF0, 0x0F, 0xF0, 0x07, 0xE0, 0x07, 0xC0, 0x0F, 0x80,
|
||||||
|
0x1F, 0x40, 0x7F, 0xFF, 0xFB, 0xFF, 0xE7, 0xFF, 0x83, 0xFC, 0x00, 0x00,
|
||||||
|
0x3E, 0x01, 0xFE, 0x07, 0xFE, 0x0F, 0xFE, 0x1F, 0xE0, 0x3F, 0x00, 0x7E,
|
||||||
|
0x00, 0x7C, 0x00, 0xFF, 0xF0, 0xFF, 0xFC, 0xFF, 0xFE, 0xFF, 0xFE, 0xF8,
|
||||||
|
0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0x7C, 0x3F, 0x7F, 0xFE, 0x3F,
|
||||||
|
0xFC, 0x1F, 0xF8, 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xFC, 0x00, 0xF8, 0x01, 0xF8, 0x01,
|
||||||
|
0xF0, 0x01, 0xF0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x07, 0xC0, 0x07,
|
||||||
|
0xC0, 0x07, 0xC0, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F,
|
||||||
|
0xE0, 0x3F, 0xF8, 0x7F, 0xFC, 0xFF, 0xFE, 0xFC, 0x7E, 0xF8, 0x3E, 0xF8,
|
||||||
|
0x3E, 0xFC, 0x7C, 0x7F, 0xFC, 0x3F, 0xF0, 0x3F, 0xFC, 0x7F, 0xFE, 0xFC,
|
||||||
|
0x3E, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC, 0x3F, 0x7F, 0xFE, 0x7F,
|
||||||
|
0xFE, 0x3F, 0xFC, 0x07, 0xF0, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F,
|
||||||
|
0xFE, 0xFC, 0x3E, 0xF8, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC, 0x1F, 0x7F,
|
||||||
|
0xFF, 0x7F, 0xFF, 0x3F, 0xFF, 0x0F, 0xDF, 0x00, 0x3E, 0x00, 0x7E, 0x00,
|
||||||
|
0xFE, 0x03, 0xFC, 0x3F, 0xF8, 0x3F, 0xF0, 0x3F, 0xC0, 0x3E, 0x00, 0x7B,
|
||||||
|
0xFF, 0xFF, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0x78,
|
||||||
|
0x7B, 0xFF, 0xFF, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xF7, 0xDF,
|
||||||
|
0x7D, 0xE7, 0xBE, 0xF1, 0xC0, 0x00, 0x0C, 0x01, 0xF8, 0x3F, 0xFB, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xE0, 0x7C, 0x00, 0xFF, 0x81, 0xFF, 0xF3,
|
||||||
|
0xFF, 0xFB, 0xFF, 0xF0, 0xFF, 0xE0, 0x1F, 0x80, 0x03, 0x00, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x60, 0x01, 0xF0, 0x0F, 0xFC,
|
||||||
|
0x3F, 0xFE, 0xFF, 0xFC, 0xFF, 0xF0, 0x7F, 0xC0, 0x1F, 0x03, 0xFC, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xC1, 0xF0, 0x06, 0x00, 0x00, 0x3F, 0x8F,
|
||||||
|
0xFC, 0xFF, 0xE7, 0xFF, 0x63, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x03, 0xE0,
|
||||||
|
0x7E, 0x0F, 0xC0, 0xF8, 0x1F, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x00, 0x00,
|
||||||
|
0x00, 0x1E, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x01, 0xE0, 0x00, 0x7F,
|
||||||
|
0x80, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFF, 0xC0, 0x3F, 0x03, 0xF8, 0x1F,
|
||||||
|
0x00, 0x1F, 0x0F, 0x80, 0x03, 0xC3, 0xC1, 0xF8, 0x79, 0xE1, 0xFF, 0x1E,
|
||||||
|
0x78, 0xFF, 0xC7, 0xFE, 0x3C, 0xF0, 0xFF, 0x1E, 0x3C, 0x3F, 0xC7, 0x8F,
|
||||||
|
0x0F, 0xF1, 0xE3, 0xC3, 0xFC, 0x78, 0xF0, 0xFF, 0x1E, 0x3C, 0x3F, 0xC7,
|
||||||
|
0x8F, 0x0F, 0xF1, 0xE3, 0xC7, 0xBE, 0x3C, 0xF1, 0xE7, 0x8F, 0xFF, 0xF1,
|
||||||
|
0xE1, 0xFF, 0xF8, 0x3C, 0x3E, 0xF8, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00,
|
||||||
|
0x00, 0x3F, 0x80, 0x40, 0x07, 0xFF, 0xF0, 0x00, 0x7F, 0xFC, 0x00, 0x03,
|
||||||
|
0xFE, 0x00, 0x00, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x07, 0xFC,
|
||||||
|
0x00, 0x3F, 0xF0, 0x03, 0xEF, 0x80, 0x1F, 0x7E, 0x00, 0xFB, 0xF0, 0x0F,
|
||||||
|
0x8F, 0x80, 0x7C, 0x7E, 0x03, 0xE3, 0xF0, 0x3E, 0x0F, 0x81, 0xFF, 0xFC,
|
||||||
|
0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x7E, 0x03, 0xF3, 0xE0,
|
||||||
|
0x0F, 0x9F, 0x00, 0x7D, 0xF8, 0x03, 0xFF, 0x80, 0x0F, 0x80, 0xFF, 0xE0,
|
||||||
|
0x7F, 0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF, 0x83, 0xF7, 0xC0, 0xFB, 0xE0,
|
||||||
|
0x7D, 0xF0, 0x7E, 0xFF, 0xFE, 0x7F, 0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF,
|
||||||
|
0x81, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x1F, 0xFF, 0xFF,
|
||||||
|
0xBF, 0xFF, 0xDF, 0xFF, 0x87, 0xFF, 0x00, 0x01, 0xFC, 0x03, 0xFF, 0xC7,
|
||||||
|
0xFF, 0xE7, 0xFF, 0xE3, 0xF0, 0x33, 0xF0, 0x01, 0xF0, 0x01, 0xF0, 0x00,
|
||||||
|
0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0,
|
||||||
|
0x03, 0xF0, 0x00, 0xFC, 0x00, 0x7F, 0x03, 0x1F, 0xFF, 0x87, 0xFF, 0xE1,
|
||||||
|
0xFF, 0xF0, 0x3F, 0xC0, 0xFF, 0xE0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F,
|
||||||
|
0xFF, 0xCF, 0x83, 0xF9, 0xF0, 0x1F, 0xBE, 0x01, 0xF7, 0xC0, 0x1F, 0xF8,
|
||||||
|
0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0,
|
||||||
|
0x0F, 0xFE, 0x01, 0xF7, 0xC0, 0x7E, 0xF8, 0x3F, 0x9F, 0xFF, 0xF3, 0xFF,
|
||||||
|
0xFC, 0x7F, 0xFE, 0x0F, 0xFE, 0x00, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xFE, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFC,
|
||||||
|
0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0x00, 0x3E,
|
||||||
|
0x00, 0x7C, 0x00, 0xFF, 0xFD, 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xEF, 0x80,
|
||||||
|
0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07,
|
||||||
|
0xC0, 0x0F, 0x80, 0x00, 0x01, 0xFE, 0x01, 0xFF, 0xF1, 0xFF, 0xFC, 0xFF,
|
||||||
|
0xFE, 0x3F, 0x01, 0x9F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0x00,
|
||||||
|
0x3E, 0x00, 0x0F, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xF7,
|
||||||
|
0xC0, 0x7D, 0xF8, 0x1F, 0x7F, 0x07, 0xCF, 0xFF, 0xF1, 0xFF, 0xFC, 0x3F,
|
||||||
|
0xFF, 0x01, 0xFF, 0x00, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC,
|
||||||
|
0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xFF, 0xC0, 0x1F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xF0,
|
||||||
|
0x07, 0xFE, 0x00, 0xFF, 0xC0, 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0,
|
||||||
|
0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x7C, 0x01, 0xF0,
|
||||||
|
0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C,
|
||||||
|
0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F,
|
||||||
|
0x60, 0xFD, 0xFF, 0xEF, 0xFF, 0xBF, 0xFC, 0x3F, 0xC0, 0xF8, 0x1F, 0xDF,
|
||||||
|
0x07, 0xF3, 0xE1, 0xFC, 0x7C, 0x7F, 0x0F, 0x9F, 0xC1, 0xF7, 0xF0, 0x3F,
|
||||||
|
0xFC, 0x07, 0xFF, 0x00, 0xFF, 0xC0, 0x1F, 0xF0, 0x03, 0xFF, 0x00, 0x7F,
|
||||||
|
0xF0, 0x0F, 0xFF, 0x01, 0xF7, 0xE0, 0x3E, 0x7E, 0x07, 0xC7, 0xE0, 0xF8,
|
||||||
|
0x7E, 0x1F, 0x07, 0xE3, 0xE0, 0x7E, 0x7C, 0x0F, 0xEF, 0x80, 0xFE, 0xF8,
|
||||||
|
0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E,
|
||||||
|
0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F,
|
||||||
|
0x80, 0x3E, 0x00, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
|
||||||
|
0x3E, 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x3F, 0x00, 0xFC, 0x7F, 0x00, 0xFE,
|
||||||
|
0x7F, 0x80, 0xFE, 0x7F, 0x81, 0xFE, 0x7F, 0xC1, 0xFE, 0x7F, 0xC3, 0xFE,
|
||||||
|
0x7F, 0xE3, 0xFE, 0x7D, 0xE7, 0xBE, 0x79, 0xF7, 0x9E, 0x78, 0xF7, 0x9E,
|
||||||
|
0x78, 0xFF, 0x1E, 0xF8, 0x7F, 0x1E, 0xF8, 0x7E, 0x1F, 0xF8, 0x3E, 0x1F,
|
||||||
|
0xF8, 0x3E, 0x1F, 0xF8, 0x3C, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F,
|
||||||
|
0xF8, 0x00, 0x1F, 0xF8, 0x03, 0xFF, 0x80, 0x7F, 0xF8, 0x0F, 0xFF, 0x01,
|
||||||
|
0xFF, 0xF0, 0x3F, 0xFF, 0x07, 0xFF, 0xF0, 0xFF, 0xFF, 0x1F, 0xFB, 0xE3,
|
||||||
|
0xFF, 0x3E, 0x7F, 0xE3, 0xEF, 0xFC, 0x7F, 0xFF, 0x87, 0xFF, 0xF0, 0x7F,
|
||||||
|
0xFE, 0x07, 0xFF, 0xC0, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0xFF, 0xE0, 0x1F,
|
||||||
|
0xFC, 0x01, 0xFF, 0x80, 0x3E, 0x01, 0xF8, 0x00, 0xFF, 0xF0, 0x1F, 0xFF,
|
||||||
|
0x83, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xE0, 0x7E, 0x7C, 0x03, 0xEF, 0x80,
|
||||||
|
0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8,
|
||||||
|
0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x03, 0xE7, 0xE0, 0x7E, 0x7F, 0x0F, 0xE3,
|
||||||
|
0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xFC, 0x00, 0xFF, 0xE0,
|
||||||
|
0x7F, 0xFE, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF, 0x83, 0xFF, 0xC0, 0x7F, 0xE0,
|
||||||
|
0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x1F, 0xFF, 0xFF, 0xDF, 0xFF, 0xCF,
|
||||||
|
0xFF, 0xC7, 0xFF, 0x83, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00,
|
||||||
|
0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0xFF, 0xF0,
|
||||||
|
0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xE0, 0x7E, 0x7C, 0x03,
|
||||||
|
0xEF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80,
|
||||||
|
0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x03, 0xF7, 0xE0, 0x7E, 0x3F,
|
||||||
|
0x0F, 0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0xFF, 0xF0, 0x01, 0xFE, 0x00,
|
||||||
|
0x07, 0xC0, 0x00, 0x7F, 0x00, 0x03, 0xFE, 0x00, 0x1F, 0xE0, 0x00, 0xFC,
|
||||||
|
0x00, 0x03, 0xC0, 0xFF, 0xE0, 0x3F, 0xFF, 0x0F, 0xFF, 0xE3, 0xFF, 0xFC,
|
||||||
|
0xF8, 0x3F, 0xBE, 0x03, 0xEF, 0x80, 0xFB, 0xE0, 0x3E, 0xF8, 0x0F, 0xBE,
|
||||||
|
0x0F, 0xEF, 0xFF, 0xF3, 0xFF, 0xF8, 0xFF, 0xFC, 0x3F, 0xFE, 0x0F, 0x9F,
|
||||||
|
0xC3, 0xE3, 0xF0, 0xF8, 0x7E, 0x3E, 0x0F, 0xCF, 0x83, 0xFB, 0xE0, 0x7E,
|
||||||
|
0xF8, 0x0F, 0xC0, 0x07, 0xF0, 0x3F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFC, 0xFC,
|
||||||
|
0x0C, 0xF8, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0x7F, 0x80, 0x7F, 0xF0, 0x1F,
|
||||||
|
0xFC, 0x07, 0xFE, 0x00, 0xFF, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x1F, 0x70,
|
||||||
|
0x3F, 0x7F, 0xFF, 0xFF, 0xFE, 0xFF, 0xFC, 0x1F, 0xE0, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80,
|
||||||
|
0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E,
|
||||||
|
0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00,
|
||||||
|
0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80,
|
||||||
|
0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F,
|
||||||
|
0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE,
|
||||||
|
0x01, 0xFF, 0x80, 0x7F, 0xF0, 0x3F, 0x7E, 0x1F, 0x9F, 0xFF, 0xE3, 0xFF,
|
||||||
|
0xF0, 0x7F, 0xF8, 0x07, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xE0, 0x0F, 0x9F,
|
||||||
|
0x00, 0x7C, 0xFC, 0x03, 0xE3, 0xE0, 0x3E, 0x1F, 0x01, 0xF0, 0xFC, 0x1F,
|
||||||
|
0x83, 0xE0, 0xF8, 0x1F, 0x07, 0xC0, 0xFC, 0x7E, 0x07, 0xE3, 0xE0, 0x1F,
|
||||||
|
0x1F, 0x00, 0xFD, 0xF8, 0x07, 0xEF, 0x80, 0x1F, 0x7C, 0x00, 0xFF, 0xE0,
|
||||||
|
0x03, 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x1F,
|
||||||
|
0xC0, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x0F, 0xDF, 0x03, 0xE0,
|
||||||
|
0x7C, 0xF8, 0x1F, 0x03, 0xE7, 0xC1, 0xFC, 0x1F, 0x3E, 0x0F, 0xE0, 0xF8,
|
||||||
|
0xF0, 0x7F, 0x0F, 0x87, 0xC3, 0xF8, 0x7C, 0x3E, 0x3D, 0xE3, 0xE1, 0xF1,
|
||||||
|
0xEF, 0x1F, 0x07, 0x8F, 0x78, 0xF0, 0x3E, 0xFB, 0xEF, 0x81, 0xF7, 0x8F,
|
||||||
|
0x7C, 0x0F, 0xBC, 0x7B, 0xE0, 0x3D, 0xE3, 0xFE, 0x01, 0xFF, 0x1F, 0xF0,
|
||||||
|
0x0F, 0xF0, 0x7F, 0x80, 0x3F, 0x83, 0xF8, 0x01, 0xFC, 0x1F, 0xC0, 0x0F,
|
||||||
|
0xC0, 0x7E, 0x00, 0x3E, 0x03, 0xE0, 0x00, 0xFC, 0x01, 0xFB, 0xF0, 0x1F,
|
||||||
|
0x8F, 0xC1, 0xF8, 0x3E, 0x0F, 0x81, 0xF8, 0xFC, 0x07, 0xEF, 0xC0, 0x1F,
|
||||||
|
0xFC, 0x00, 0xFF, 0xE0, 0x03, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x3E, 0x00,
|
||||||
|
0x03, 0xF8, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0x80, 0x1F, 0xFC, 0x01, 0xFB,
|
||||||
|
0xF0, 0x1F, 0x8F, 0xC1, 0xF8, 0x3E, 0x0F, 0xC1, 0xF8, 0xFC, 0x07, 0xEF,
|
||||||
|
0xC0, 0x1F, 0x80, 0xFC, 0x01, 0xFB, 0xE0, 0x1F, 0x9F, 0x80, 0xFC, 0x7E,
|
||||||
|
0x0F, 0xC1, 0xF0, 0x7C, 0x0F, 0xC7, 0xE0, 0x3F, 0x7E, 0x01, 0xFB, 0xF0,
|
||||||
|
0x07, 0xFF, 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x0F,
|
||||||
|
0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00,
|
||||||
|
0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7F,
|
||||||
|
0xFF, 0xBF, 0xFF, 0xDF, 0xFF, 0xEF, 0xFF, 0xF0, 0x03, 0xF0, 0x03, 0xF0,
|
||||||
|
0x03, 0xF0, 0x03, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xFC,
|
||||||
|
0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8,
|
||||||
|
0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F,
|
||||||
|
0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF8, 0x01,
|
||||||
|
0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F,
|
||||||
|
0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF8,
|
||||||
|
0x01, 0xF0, 0x03, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x80,
|
||||||
|
0x1F, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF8, 0x01,
|
||||||
|
0xF0, 0x03, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1,
|
||||||
|
0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C,
|
||||||
|
0x1F, 0x07, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xC0, 0x01,
|
||||||
|
0xF0, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0x7B, 0xC0, 0x7D, 0xF0,
|
||||||
|
0x7C, 0x7C, 0x3C, 0x1E, 0x3E, 0x0F, 0xBE, 0x03, 0xEF, 0x01, 0xE1, 0x00,
|
||||||
|
0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0xE3, 0xE3,
|
||||||
|
0xE3, 0xE3, 0x82, 0x00, 0x1F, 0xE0, 0xFF, 0xC3, 0xFF, 0x8F, 0xFF, 0x00,
|
||||||
|
0xFC, 0x01, 0xF1, 0xFF, 0xDF, 0xFF, 0x7F, 0xFF, 0xF1, 0xFF, 0x87, 0xFE,
|
||||||
|
0x1F, 0xFF, 0xFD, 0xFF, 0xF7, 0xFF, 0xC7, 0xFE, 0x38, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xFB, 0xE0, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xFE, 0xF8, 0x3E, 0xF8, 0x3F,
|
||||||
|
0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x3F, 0xF8, 0x7E,
|
||||||
|
0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8, 0x3F, 0xE0, 0x03, 0xF8, 0x3F, 0xF3,
|
||||||
|
0xFF, 0xDF, 0xFE, 0x7E, 0x03, 0xF0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03,
|
||||||
|
0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x7F, 0xFC, 0xFF, 0xF1, 0xFF, 0xC1, 0xFE,
|
||||||
|
0x00, 0x07, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F,
|
||||||
|
0x00, 0x1F, 0x00, 0x1F, 0x07, 0xFF, 0x1F, 0xFF, 0x3F, 0xFF, 0x7F, 0xFF,
|
||||||
|
0x7C, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F,
|
||||||
|
0xFC, 0x1F, 0x7E, 0x1F, 0x7F, 0xFF, 0x3F, 0xFF, 0x1F, 0xFF, 0x07, 0xFC,
|
||||||
|
0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0x7C, 0x3F, 0xF8, 0x1F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x04,
|
||||||
|
0x7F, 0xFE, 0x3F, 0xFE, 0x1F, 0xFE, 0x07, 0xF8, 0x0F, 0xE3, 0xFF, 0x7F,
|
||||||
|
0xE7, 0xFE, 0xFC, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xFF, 0xEF, 0xFE, 0xFF,
|
||||||
|
0xEF, 0xFE, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8,
|
||||||
|
0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0x07, 0xF8, 0x3F, 0xFC,
|
||||||
|
0xFF, 0xFB, 0xFF, 0xF7, 0xC3, 0xFF, 0x87, 0xFE, 0x0F, 0xFC, 0x1F, 0xF8,
|
||||||
|
0x3F, 0xF0, 0x7F, 0xF0, 0xFB, 0xFF, 0xF7, 0xFF, 0xE7, 0xFF, 0xC3, 0xFF,
|
||||||
|
0x80, 0x1F, 0x00, 0x3E, 0x40, 0xFD, 0xFF, 0xF3, 0xFF, 0xE7, 0xFF, 0x07,
|
||||||
|
0xF8, 0x00, 0x38, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0,
|
||||||
|
0x0F, 0x80, 0x3E, 0x00, 0xFF, 0xE3, 0xFF, 0xCF, 0xFF, 0xBF, 0xFE, 0xF8,
|
||||||
|
0xFF, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE,
|
||||||
|
0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0x77, 0xFF, 0xF7, 0x00,
|
||||||
|
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07,
|
||||||
|
0x07, 0xC3, 0xE1, 0xF0, 0x70, 0x00, 0x00, 0x00, 0x0F, 0x87, 0xC3, 0xE1,
|
||||||
|
0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C,
|
||||||
|
0x3E, 0x1F, 0x0F, 0x8F, 0xFF, 0xFF, 0xEF, 0xE7, 0xE0, 0x38, 0x01, 0xF0,
|
||||||
|
0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00,
|
||||||
|
0xF8, 0x7F, 0xF1, 0xFB, 0xE7, 0xE7, 0xDF, 0x8F, 0xFF, 0x1F, 0xFC, 0x3F,
|
||||||
|
0xF0, 0x7F, 0xC0, 0xFF, 0xC1, 0xFF, 0xC3, 0xFF, 0xC7, 0xDF, 0x8F, 0x9F,
|
||||||
|
0x9F, 0x1F, 0xBE, 0x3F, 0x7C, 0x3F, 0x38, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
|
||||||
|
0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
|
||||||
|
0xF8, 0xFC, 0xFF, 0x7F, 0x7F, 0x1E, 0x3F, 0xC3, 0xF1, 0xFF, 0xFF, 0xF3,
|
||||||
|
0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0x8F, 0xC7, 0xFF, 0x0F, 0x87, 0xFE,
|
||||||
|
0x1F, 0x0F, 0xFC, 0x3E, 0x1F, 0xF8, 0x7C, 0x3F, 0xF0, 0xF8, 0x7F, 0xE1,
|
||||||
|
0xF0, 0xFF, 0xC3, 0xE1, 0xFF, 0x87, 0xC3, 0xFF, 0x0F, 0x87, 0xFE, 0x1F,
|
||||||
|
0x0F, 0xFC, 0x3E, 0x1F, 0x3F, 0xC3, 0xFF, 0xCF, 0xFF, 0xBF, 0xFE, 0xF8,
|
||||||
|
0xFF, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE,
|
||||||
|
0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0x07, 0xF0, 0x0F, 0xFE,
|
||||||
|
0x0F, 0xFF, 0x8F, 0xFF, 0xE7, 0xE3, 0xF7, 0xE0, 0xFF, 0xE0, 0x3F, 0xF0,
|
||||||
|
0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFF, 0x07, 0xEF, 0xC7, 0xE7, 0xFF, 0xF1,
|
||||||
|
0xFF, 0xF0, 0x7F, 0xF0, 0x0F, 0xE0, 0x3F, 0xE0, 0xFF, 0xF8, 0xFF, 0xFC,
|
||||||
|
0xFF, 0xFE, 0xF8, 0x7E, 0xF8, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F,
|
||||||
|
0xF8, 0x1F, 0xF8, 0x3F, 0xF8, 0x3E, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8,
|
||||||
|
0xFB, 0xF0, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0x03, 0xFE, 0x0F, 0xFF, 0xCF, 0xFF, 0xEF, 0xFF, 0xF7, 0xE0,
|
||||||
|
0xFF, 0xE0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFF,
|
||||||
|
0x03, 0xEF, 0xC1, 0xF7, 0xFF, 0xF9, 0xFF, 0xFC, 0x7F, 0xFE, 0x0F, 0xDF,
|
||||||
|
0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00,
|
||||||
|
0x7C, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x81, 0xF0, 0x3E, 0x07, 0xC0,
|
||||||
|
0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0x0F,
|
||||||
|
0xE1, 0xFF, 0x9F, 0xFD, 0xFF, 0xEF, 0x81, 0x7C, 0x03, 0xFF, 0xDF, 0xFE,
|
||||||
|
0x7F, 0xF9, 0xFF, 0xC0, 0x3F, 0x81, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0x8F,
|
||||||
|
0xF0, 0x38, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0xFE, 0xFF, 0xEF,
|
||||||
|
0xFE, 0xFF, 0xEF, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F,
|
||||||
|
0x80, 0xFC, 0x0F, 0xFE, 0x7F, 0xE3, 0xFF, 0x0F, 0xE0, 0xF8, 0x7F, 0xE1,
|
||||||
|
0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8,
|
||||||
|
0x7F, 0xE1, 0xFF, 0x87, 0xFF, 0x1F, 0x7F, 0xFD, 0xFF, 0xF3, 0xFF, 0xC3,
|
||||||
|
0xFC, 0xF8, 0x0F, 0xFE, 0x0F, 0xDF, 0x07, 0xCF, 0x83, 0xE7, 0xE3, 0xF1,
|
||||||
|
0xF1, 0xF0, 0xF8, 0xF8, 0x7E, 0xFC, 0x1F, 0x7C, 0x0F, 0xBE, 0x03, 0xFE,
|
||||||
|
0x01, 0xFF, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x07, 0xC0, 0xF8,
|
||||||
|
0x38, 0x1F, 0xF8, 0x3C, 0x1F, 0x7C, 0x7C, 0x3E, 0x7C, 0x7C, 0x3E, 0x7C,
|
||||||
|
0x7E, 0x3E, 0x3C, 0x7E, 0x3C, 0x3C, 0xFE, 0x3C, 0x3E, 0xEF, 0x7C, 0x1E,
|
||||||
|
0xEF, 0x78, 0x1E, 0xEF, 0x78, 0x1F, 0xE7, 0xF8, 0x0F, 0xC7, 0xF0, 0x0F,
|
||||||
|
0xC3, 0xF0, 0x0F, 0xC3, 0xF0, 0x07, 0x83, 0xE0, 0x07, 0x81, 0xE0, 0xFC,
|
||||||
|
0x1F, 0xBF, 0x1F, 0x8F, 0xDF, 0x87, 0xEF, 0xC1, 0xFF, 0xC0, 0x7F, 0xC0,
|
||||||
|
0x3F, 0xE0, 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xFC, 0x03, 0xFE, 0x03, 0xFF,
|
||||||
|
0x83, 0xF7, 0xE1, 0xFB, 0xF1, 0xF8, 0xFD, 0xF8, 0x3F, 0xF8, 0x0F, 0xFE,
|
||||||
|
0x0F, 0xDF, 0x07, 0xCF, 0x83, 0xE7, 0xE3, 0xF1, 0xF1, 0xF0, 0xF8, 0xF8,
|
||||||
|
0x7C, 0x78, 0x1F, 0x7C, 0x0F, 0xBE, 0x03, 0xDE, 0x01, 0xFF, 0x00, 0x7F,
|
||||||
|
0x00, 0x3F, 0x80, 0x0F, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x03, 0xE0, 0x1F,
|
||||||
|
0xF0, 0x1F, 0xF0, 0x0F, 0xF0, 0x03, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF8, 0x1F, 0xC0,
|
||||||
|
0xFE, 0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0x03, 0xE1, 0xFC, 0x3F, 0x8F, 0xF1, 0xF8, 0x3E, 0x07, 0xC0, 0xF8, 0x1F,
|
||||||
|
0x03, 0xE0, 0x7C, 0x0F, 0x83, 0xF1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x07,
|
||||||
|
0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xF0,
|
||||||
|
0x7F, 0x87, 0xF0, 0xFE, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x83,
|
||||||
|
0xF8, 0x7F, 0x83, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C,
|
||||||
|
0x0F, 0x81, 0xF8, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE3, 0xF0, 0x7C, 0x0F,
|
||||||
|
0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x07, 0xE3, 0xFC, 0x7F, 0x0F,
|
||||||
|
0xE1, 0xF0, 0x00, 0x1E, 0x06, 0x3F, 0x8F, 0x7F, 0xFF, 0xFF, 0xFE, 0xF1,
|
||||||
|
0xFC, 0x60, 0x78, 0xFF, 0xFF, 0xFF, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03,
|
||||||
|
0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03,
|
||||||
|
0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3F, 0xFF,
|
||||||
|
0xFF, 0xF0, 0x00, 0x77, 0xFF, 0xFF, 0xB8, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78,
|
||||||
|
0x03, 0xF8, 0x3F, 0xF3, 0xFF, 0xDF, 0xFE, 0x7E, 0x03, 0xF0, 0x0F, 0x80,
|
||||||
|
0x3E, 0x00, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x1F, 0xFF, 0x3F, 0xFC, 0x7F,
|
||||||
|
0xF0, 0x3F, 0x80, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x01, 0xFC,
|
||||||
|
0x0F, 0xFC, 0x3F, 0xF8, 0x7F, 0xE1, 0xF8, 0x43, 0xE0, 0x07, 0xC0, 0x0F,
|
||||||
|
0x80, 0x1F, 0x01, 0xFF, 0xE3, 0xFF, 0xC7, 0xFF, 0x8F, 0xFF, 0x03, 0xE0,
|
||||||
|
0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3F, 0xFC, 0xFF, 0xF9, 0xFF, 0xF3,
|
||||||
|
0xFF, 0xE0, 0x10, 0x04, 0x3C, 0x03, 0xBE, 0xFB, 0xEF, 0xFF, 0xE3, 0xFF,
|
||||||
|
0xE1, 0xF1, 0xF0, 0xF0, 0x78, 0x78, 0x3C, 0x3C, 0x1E, 0x1E, 0x0F, 0x0F,
|
||||||
|
0x8F, 0x87, 0xFF, 0xC7, 0xFF, 0xF7, 0xDF, 0x7D, 0xC0, 0x3C, 0x20, 0x08,
|
||||||
|
0xFC, 0x07, 0xEF, 0x80, 0xF9, 0xF8, 0x3F, 0x1F, 0x07, 0xC3, 0xF1, 0xF8,
|
||||||
|
0x3E, 0x7E, 0x07, 0xEF, 0x80, 0x7F, 0xF0, 0x07, 0xFC, 0x00, 0xFF, 0x80,
|
||||||
|
0xFF, 0xFE, 0x1F, 0xFF, 0xC3, 0xFF, 0xF8, 0x03, 0xE0, 0x00, 0x7C, 0x01,
|
||||||
|
0xFF, 0xFC, 0x3F, 0xFF, 0x87, 0xFF, 0xF0, 0x07, 0xC0, 0x00, 0xF8, 0x00,
|
||||||
|
0x1F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF0, 0x7F, 0xF3, 0xFF, 0xDF, 0xFE,
|
||||||
|
0x7C, 0x09, 0xF0, 0x07, 0xE0, 0x0F, 0xE0, 0x3F, 0xE0, 0xFF, 0xE7, 0xFF,
|
||||||
|
0xBE, 0x7F, 0xF8, 0xFF, 0xE1, 0xFF, 0xC7, 0xFF, 0x9E, 0x7F, 0xF0, 0xFF,
|
||||||
|
0xC1, 0xFF, 0x01, 0xFE, 0x01, 0xF8, 0x03, 0xE6, 0x0F, 0x9F, 0xFE, 0xFF,
|
||||||
|
0xF3, 0xFF, 0xC3, 0xFC, 0x00, 0x70, 0xEF, 0x9F, 0xF9, 0xFF, 0x9F, 0x70,
|
||||||
|
0xE0, 0x01, 0xFC, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3E, 0x0F, 0x83,
|
||||||
|
0xC0, 0x1E, 0x3C, 0x7E, 0x79, 0xC7, 0xF9, 0xDE, 0x7F, 0x8F, 0xE7, 0xC0,
|
||||||
|
0x3F, 0x3C, 0x01, 0xF9, 0xE0, 0x0F, 0xCF, 0x00, 0x7E, 0x78, 0x03, 0xF3,
|
||||||
|
0xE0, 0x1F, 0xCF, 0xF1, 0xEE, 0x3F, 0xCE, 0x78, 0xFC, 0xF1, 0xE0, 0x0F,
|
||||||
|
0x07, 0xC1, 0xF0, 0x1F, 0xFF, 0x00, 0x7F, 0xF0, 0x00, 0xFE, 0x00, 0x7F,
|
||||||
|
0x1F, 0xE7, 0xFC, 0x0F, 0x01, 0xCF, 0xF7, 0xFF, 0xC7, 0xE1, 0xF8, 0x7F,
|
||||||
|
0xFD, 0xFF, 0x3F, 0x80, 0x00, 0x00, 0x0E, 0x0E, 0x1F, 0x1F, 0x1E, 0x1E,
|
||||||
|
0x3E, 0x3E, 0x7C, 0x7C, 0x7C, 0x7C, 0xF8, 0xF8, 0x7C, 0x7C, 0x7C, 0x7C,
|
||||||
|
0x3E, 0x3E, 0x1E, 0x1E, 0x1F, 0x1F, 0x0E, 0x0E, 0x00, 0x00, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80,
|
||||||
|
0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
|
||||||
|
0x01, 0xFC, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3E, 0x0F, 0x83, 0xC0,
|
||||||
|
0x1E, 0x3C, 0x00, 0x79, 0xC7, 0xE1, 0xDE, 0x3F, 0xCF, 0xE1, 0xCE, 0x3F,
|
||||||
|
0x0E, 0x71, 0xF8, 0x73, 0x8F, 0xC3, 0xF8, 0x7E, 0x1F, 0xC3, 0xF0, 0xEE,
|
||||||
|
0x1F, 0xC7, 0x39, 0xEE, 0x39, 0xCE, 0x78, 0x00, 0xF1, 0xE0, 0x0F, 0x07,
|
||||||
|
0xC1, 0xF0, 0x1F, 0xFF, 0x00, 0x7F, 0xF0, 0x00, 0xFE, 0x00, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFC, 0x3E, 0x3F, 0xBF, 0xFC, 0x7E, 0x3F, 0x1F, 0xFE, 0xFE, 0x3E,
|
||||||
|
0x00, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x83, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80,
|
||||||
|
0x1E, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x3F,
|
||||||
|
0x3F, 0xEF, 0xFD, 0x87, 0x01, 0xC0, 0xF0, 0x78, 0x38, 0x1C, 0x0E, 0x07,
|
||||||
|
0xFD, 0xFF, 0x7F, 0xC0, 0x3C, 0x7F, 0x1F, 0xC8, 0xE0, 0x70, 0xF8, 0x7C,
|
||||||
|
0x3F, 0x03, 0x81, 0xFF, 0xFF, 0xE7, 0xE0, 0x08, 0x38, 0xFB, 0xEF, 0x8E,
|
||||||
|
0x08, 0x00, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1,
|
||||||
|
0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFF, 0x1F, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E,
|
||||||
|
0x00, 0xF8, 0x03, 0xE0, 0x00, 0x00, 0xFE, 0x01, 0xFF, 0xFC, 0xFF, 0xFF,
|
||||||
|
0xBF, 0xFF, 0xF7, 0xFE, 0x3F, 0xFF, 0xC7, 0xFF, 0xF8, 0xFF, 0xFF, 0x1F,
|
||||||
|
0xFF, 0xE3, 0xFF, 0xFC, 0x7D, 0xFF, 0x8F, 0xBF, 0xF1, 0xF1, 0xFE, 0x3E,
|
||||||
|
0x0F, 0xC7, 0xC0, 0x78, 0xF8, 0x0F, 0x1F, 0x01, 0xE3, 0xE0, 0x3C, 0x7C,
|
||||||
|
0x07, 0x8F, 0x80, 0xF1, 0xF0, 0x1E, 0x3E, 0x03, 0xC7, 0xC0, 0x78, 0xF8,
|
||||||
|
0x0F, 0x1F, 0x01, 0xE3, 0xE0, 0x3C, 0x7C, 0x07, 0x8F, 0x80, 0xF1, 0xF0,
|
||||||
|
0x7B, 0xFF, 0xFF, 0xFD, 0xE0, 0x1E, 0x38, 0xF0, 0xF0, 0xEF, 0xDF, 0xBC,
|
||||||
|
0x0E, 0x3D, 0xFF, 0xF7, 0xE9, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE0,
|
||||||
|
0x1F, 0x83, 0xFC, 0x7F, 0xE7, 0x0E, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07,
|
||||||
|
0xE0, 0x77, 0x0E, 0x7F, 0xE3, 0xFC, 0x1F, 0x80, 0x00, 0x00, 0x78, 0x78,
|
||||||
|
0xF8, 0xF8, 0x7C, 0x7C, 0x7C, 0x7C, 0x3E, 0x3E, 0x3E, 0x3E, 0x1F, 0x1F,
|
||||||
|
0x3E, 0x3E, 0x3E, 0x3E, 0x7C, 0x7C, 0x7C, 0x7C, 0xF8, 0xF8, 0x78, 0x78,
|
||||||
|
0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x80, 0x3E, 0x07, 0xE0, 0x0F, 0x03,
|
||||||
|
0xF8, 0x07, 0xC0, 0x7E, 0x01, 0xE0, 0x13, 0x80, 0xF0, 0x00, 0xE0, 0x3C,
|
||||||
|
0x00, 0x38, 0x1E, 0x00, 0x0E, 0x07, 0x80, 0x03, 0x83, 0xC1, 0xE0, 0xE0,
|
||||||
|
0xF0, 0xF8, 0x38, 0x78, 0x3E, 0x0E, 0x1E, 0x1F, 0x80, 0x0F, 0x0E, 0xE0,
|
||||||
|
0x03, 0xC3, 0x38, 0x01, 0xE1, 0xFF, 0x00, 0x78, 0x7F, 0xC0, 0x3C, 0x1F,
|
||||||
|
0xF0, 0x0F, 0x00, 0x38, 0x07, 0x80, 0x0E, 0x03, 0xE0, 0x03, 0x80, 0xF0,
|
||||||
|
0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x80, 0x7C, 0x07, 0xE0, 0x1E, 0x03,
|
||||||
|
0xF8, 0x0F, 0x80, 0x7E, 0x03, 0xC0, 0x13, 0x81, 0xE0, 0x00, 0xE0, 0x78,
|
||||||
|
0x00, 0x38, 0x3C, 0x00, 0x0E, 0x0F, 0x00, 0x03, 0x87, 0x8F, 0xC0, 0xE1,
|
||||||
|
0xEF, 0xF8, 0x38, 0xF3, 0xFF, 0x0E, 0x3C, 0x61, 0xC0, 0x1E, 0x00, 0x70,
|
||||||
|
0x07, 0x80, 0x3C, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x0E, 0x00, 0x78, 0x07,
|
||||||
|
0x00, 0x1E, 0x03, 0x80, 0x0F, 0x01, 0xFF, 0x07, 0xC0, 0x7F, 0xC1, 0xE0,
|
||||||
|
0x1F, 0xF0, 0x3C, 0x00, 0x00, 0x7F, 0x00, 0x7C, 0x1F, 0xC0, 0x3C, 0x08,
|
||||||
|
0xE0, 0x3E, 0x00, 0x70, 0x1E, 0x00, 0xF8, 0x1E, 0x00, 0x7C, 0x0F, 0x00,
|
||||||
|
0x3F, 0x0F, 0x00, 0x03, 0x87, 0x80, 0x01, 0xC7, 0x87, 0xBF, 0xE3, 0xC7,
|
||||||
|
0xDF, 0xE3, 0xC3, 0xE7, 0xE1, 0xE3, 0xF0, 0x01, 0xE3, 0xB8, 0x00, 0xF1,
|
||||||
|
0x9C, 0x00, 0xF1, 0xFF, 0x00, 0x78, 0xFF, 0x80, 0x78, 0x7F, 0xC0, 0x3C,
|
||||||
|
0x01, 0xC0, 0x3C, 0x00, 0xE0, 0x3E, 0x00, 0x70, 0x1E, 0x00, 0x00, 0x07,
|
||||||
|
0x80, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0x78, 0x00, 0x00, 0x00, 0x07,
|
||||||
|
0x80, 0x78, 0x0F, 0x81, 0xF0, 0x3F, 0x07, 0xE0, 0x7C, 0x0F, 0x80, 0xF8,
|
||||||
|
0x0F, 0x86, 0xFF, 0xE7, 0xFF, 0x7F, 0xF1, 0xFC, 0x00, 0x40, 0x00, 0x07,
|
||||||
|
0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1C, 0x00,
|
||||||
|
0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x7F,
|
||||||
|
0x80, 0x03, 0xFC, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x00,
|
||||||
|
0xFB, 0xF0, 0x07, 0xDF, 0x80, 0x7C, 0x7C, 0x03, 0xE3, 0xF0, 0x1F, 0x1F,
|
||||||
|
0x81, 0xF0, 0x7C, 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x3F,
|
||||||
|
0xFF, 0xE3, 0xF0, 0x1F, 0x9F, 0x00, 0x7C, 0xF8, 0x03, 0xEF, 0xC0, 0x1F,
|
||||||
|
0xFC, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x01, 0xC0, 0x00, 0x1F, 0x00, 0x01,
|
||||||
|
0xF0, 0x00, 0x1F, 0x00, 0x00, 0x70, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x3F,
|
||||||
|
0xE0, 0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x00, 0xFB, 0xF0, 0x07, 0xDF, 0x80,
|
||||||
|
0x7C, 0x7C, 0x03, 0xE3, 0xF0, 0x1F, 0x1F, 0x81, 0xF0, 0x7C, 0x0F, 0xFF,
|
||||||
|
0xE0, 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x3F, 0xFF, 0xE3, 0xF0, 0x1F, 0x9F,
|
||||||
|
0x00, 0x7C, 0xF8, 0x03, 0xEF, 0xC0, 0x1F, 0xFC, 0x00, 0x7C, 0x00, 0x20,
|
||||||
|
0x00, 0x03, 0x80, 0x00, 0x3E, 0x00, 0x03, 0xF8, 0x00, 0x3D, 0xE0, 0x00,
|
||||||
|
0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x0F, 0xF0,
|
||||||
|
0x00, 0x7F, 0x80, 0x07, 0xFC, 0x00, 0x3F, 0xF0, 0x03, 0xEF, 0x80, 0x1F,
|
||||||
|
0x7E, 0x00, 0xFB, 0xF0, 0x0F, 0x8F, 0x80, 0x7C, 0x7E, 0x03, 0xE3, 0xF0,
|
||||||
|
0x3E, 0x0F, 0x81, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x87, 0xFF,
|
||||||
|
0xFC, 0x7E, 0x03, 0xF3, 0xE0, 0x0F, 0x9F, 0x00, 0x7D, 0xF8, 0x03, 0xFF,
|
||||||
|
0x80, 0x0F, 0x80, 0x01, 0xC6, 0x00, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x06,
|
||||||
|
0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80,
|
||||||
|
0x01, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x7D,
|
||||||
|
0xF0, 0x03, 0xEF, 0xC0, 0x1F, 0x7E, 0x01, 0xF1, 0xF0, 0x0F, 0x8F, 0xC0,
|
||||||
|
0x7C, 0x7E, 0x07, 0xC1, 0xF0, 0x3F, 0xFF, 0x83, 0xFF, 0xFE, 0x1F, 0xFF,
|
||||||
|
0xF0, 0xFF, 0xFF, 0x8F, 0xC0, 0x7E, 0x7C, 0x01, 0xF3, 0xE0, 0x0F, 0xBF,
|
||||||
|
0x00, 0x7F, 0xF0, 0x01, 0xF0, 0x07, 0x0E, 0x00, 0x7C, 0xF8, 0x03, 0xE7,
|
||||||
|
0xC0, 0x1F, 0x3E, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x07, 0xFC,
|
||||||
|
0x00, 0x3F, 0xF0, 0x03, 0xEF, 0x80, 0x1F, 0x7E, 0x00, 0xFB, 0xF0, 0x0F,
|
||||||
|
0x8F, 0x80, 0x7C, 0x7E, 0x03, 0xE3, 0xF0, 0x3E, 0x0F, 0x81, 0xFF, 0xFC,
|
||||||
|
0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x7E, 0x03, 0xF3, 0xE0,
|
||||||
|
0x0F, 0x9F, 0x00, 0x7D, 0xF8, 0x03, 0xFF, 0x80, 0x0F, 0x80, 0x00, 0x70,
|
||||||
|
0x00, 0x07, 0xC0, 0x00, 0x63, 0x00, 0x03, 0x18, 0x00, 0x18, 0xC0, 0x00,
|
||||||
|
0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x1F, 0xF8,
|
||||||
|
0x00, 0xFF, 0xC0, 0x0F, 0xBE, 0x00, 0x7D, 0xF8, 0x03, 0xEF, 0xC0, 0x3E,
|
||||||
|
0x3E, 0x01, 0xF1, 0xF8, 0x1F, 0x8F, 0xC0, 0xF8, 0x3E, 0x07, 0xFF, 0xF8,
|
||||||
|
0x7F, 0xFF, 0xC3, 0xFF, 0xFE, 0x1F, 0xFF, 0xF1, 0xF8, 0x0F, 0xCF, 0x80,
|
||||||
|
0x3E, 0x7C, 0x01, 0xF7, 0xE0, 0x0F, 0xFE, 0x00, 0x3E, 0x00, 0x0F, 0xFF,
|
||||||
|
0xF8, 0x00, 0x7F, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xFE,
|
||||||
|
0x00, 0x3F, 0xF0, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x0F, 0xDF, 0x00, 0x00,
|
||||||
|
0x3F, 0x7C, 0x00, 0x01, 0xF9, 0xFF, 0xF0, 0x07, 0xC7, 0xFF, 0xC0, 0x3F,
|
||||||
|
0x1F, 0xFF, 0x01, 0xF8, 0x7F, 0xFC, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xFF,
|
||||||
|
0xC0, 0x00, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x1F, 0x01, 0xF0,
|
||||||
|
0x00, 0xFC, 0x07, 0xFF, 0xF7, 0xE0, 0x1F, 0xFF, 0xDF, 0x80, 0x7F, 0xFF,
|
||||||
|
0xFC, 0x01, 0xFF, 0xFC, 0x01, 0xFC, 0x03, 0xFF, 0xC7, 0xFF, 0xE7, 0xFF,
|
||||||
|
0xE3, 0xF0, 0x33, 0xF0, 0x01, 0xF0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C,
|
||||||
|
0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xF0, 0x00,
|
||||||
|
0xFC, 0x00, 0x7F, 0x03, 0x1F, 0xFF, 0x87, 0xFF, 0xE1, 0xFF, 0xF0, 0x1F,
|
||||||
|
0xC0, 0x0F, 0x00, 0x07, 0x80, 0x00, 0xE0, 0x00, 0x70, 0x01, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0x02, 0x00, 0x07, 0x00, 0x0F, 0x80, 0x07, 0xC0,
|
||||||
|
0x03, 0xE0, 0x01, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x80, 0x01, 0xC0, 0x03, 0xE0, 0x07, 0xC0,
|
||||||
|
0x0F, 0x80, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x03, 0x80, 0x07, 0xC0, 0x0F, 0xE0,
|
||||||
|
0x1E, 0xF0, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xFE, 0xFF, 0xFE, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0x1C, 0x38, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x1C, 0x38,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE,
|
||||||
|
0xFF, 0xFE, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFC,
|
||||||
|
0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00,
|
||||||
|
0xF8, 0x00, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0x20, 0xE3, 0xE3, 0xE3, 0xE3, 0x82, 0x00, 0x00, 0xF9, 0xF3, 0xE7, 0xCF,
|
||||||
|
0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3,
|
||||||
|
0xE7, 0xCF, 0x80, 0x08, 0x38, 0xFB, 0xEF, 0x8E, 0x08, 0x00, 0x00, 0xF9,
|
||||||
|
0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E,
|
||||||
|
0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x80, 0x08, 0x0E, 0x0F, 0x8F, 0xEF, 0x7A,
|
||||||
|
0x08, 0x00, 0x00, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C,
|
||||||
|
0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F,
|
||||||
|
0x87, 0xC3, 0xE0, 0x70, 0xEF, 0x9F, 0xF9, 0xFF, 0x9F, 0x70, 0xE0, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0,
|
||||||
|
0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0,
|
||||||
|
0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x00, 0x1F,
|
||||||
|
0xFC, 0x00, 0x7F, 0xFE, 0x01, 0xFF, 0xFE, 0x07, 0xFF, 0xFC, 0x1F, 0x07,
|
||||||
|
0xF0, 0x7C, 0x07, 0xE1, 0xF0, 0x0F, 0x87, 0xC0, 0x1F, 0xFF, 0xF0, 0x7F,
|
||||||
|
0xFF, 0xC1, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, 0x1F, 0x1F, 0x00, 0x7C, 0x7C,
|
||||||
|
0x03, 0xF1, 0xF0, 0x0F, 0x87, 0xC0, 0x7E, 0x1F, 0x07, 0xF0, 0x7F, 0xFF,
|
||||||
|
0xC1, 0xFF, 0xFE, 0x07, 0xFF, 0xE0, 0x1F, 0xFC, 0x00, 0x03, 0x8C, 0x00,
|
||||||
|
0xFF, 0xC0, 0x3F, 0xF0, 0x03, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x07, 0xC0, 0x1F, 0xFC, 0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF,
|
||||||
|
0x81, 0xFF, 0xF8, 0x3F, 0xFF, 0x87, 0xFF, 0xF8, 0xFF, 0xDF, 0x1F, 0xF9,
|
||||||
|
0xF3, 0xFF, 0x1F, 0x7F, 0xE3, 0xFF, 0xFC, 0x3F, 0xFF, 0x83, 0xFF, 0xF0,
|
||||||
|
0x3F, 0xFE, 0x07, 0xFF, 0xC0, 0x7F, 0xF8, 0x07, 0xFF, 0x00, 0xFF, 0xE0,
|
||||||
|
0x0F, 0xFC, 0x01, 0xF0, 0x00, 0x80, 0x00, 0x1C, 0x00, 0x03, 0xE0, 0x00,
|
||||||
|
0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x1F, 0x80, 0x0F, 0xFF, 0x01, 0xFF, 0xF8, 0x3F, 0xFF,
|
||||||
|
0xC3, 0xF0, 0xFC, 0x7E, 0x07, 0xE7, 0xC0, 0x3E, 0xF8, 0x01, 0xFF, 0x80,
|
||||||
|
0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8,
|
||||||
|
0x01, 0xF7, 0xC0, 0x3E, 0x7E, 0x07, 0xE7, 0xF0, 0xFE, 0x3F, 0xFF, 0xC1,
|
||||||
|
0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x00, 0x03, 0x80,
|
||||||
|
0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x0E, 0x00, 0x00, 0x40,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x0F, 0xFF, 0x01, 0xFF,
|
||||||
|
0xF8, 0x3F, 0xFF, 0xC3, 0xF0, 0xFC, 0x7E, 0x07, 0xE7, 0xC0, 0x3E, 0xF8,
|
||||||
|
0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF,
|
||||||
|
0x80, 0x1F, 0xF8, 0x01, 0xF7, 0xC0, 0x3E, 0x7E, 0x07, 0xE7, 0xF0, 0xFE,
|
||||||
|
0x3F, 0xFF, 0xC1, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x1F, 0xC0, 0x00, 0x40,
|
||||||
|
0x00, 0x0E, 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x80, 0x07, 0xBC, 0x00, 0x20,
|
||||||
|
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0xFF, 0xF0, 0x1F,
|
||||||
|
0xFF, 0x83, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xE0, 0x7E, 0x7C, 0x03, 0xEF,
|
||||||
|
0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F,
|
||||||
|
0xF8, 0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x03, 0xE7, 0xE0, 0x7E, 0x7F, 0x0F,
|
||||||
|
0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xFC, 0x00, 0x01,
|
||||||
|
0xC6, 0x00, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0x31, 0xC0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x0F, 0xFF, 0x01, 0xFF, 0xF8,
|
||||||
|
0x3F, 0xFF, 0xC3, 0xF0, 0xFC, 0x7E, 0x07, 0xE7, 0xC0, 0x3E, 0xF8, 0x01,
|
||||||
|
0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80,
|
||||||
|
0x1F, 0xF8, 0x01, 0xF7, 0xC0, 0x3E, 0x7E, 0x07, 0xE7, 0xF0, 0xFE, 0x3F,
|
||||||
|
0xFF, 0xC1, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x1F, 0xC0, 0x07, 0x0E, 0x00,
|
||||||
|
0xF9, 0xF0, 0x0F, 0x9F, 0x00, 0xF9, 0xF0, 0x07, 0x0E, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0xFF, 0xF0, 0x1F, 0xFF,
|
||||||
|
0x83, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xE0, 0x7E, 0x7C, 0x03, 0xEF, 0x80,
|
||||||
|
0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8,
|
||||||
|
0x01, 0xFF, 0x80, 0x1F, 0x7C, 0x03, 0xE7, 0xE0, 0x7E, 0x7F, 0x0F, 0xE3,
|
||||||
|
0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xFC, 0x00, 0x20, 0x11,
|
||||||
|
0xC0, 0xEF, 0x87, 0xDF, 0x3E, 0x3F, 0xF0, 0x7F, 0x80, 0xFC, 0x03, 0xF0,
|
||||||
|
0x1F, 0xE0, 0xFF, 0xC7, 0xCF, 0xBE, 0x1F, 0x70, 0x38, 0x80, 0x40, 0x00,
|
||||||
|
0x00, 0x80, 0x1F, 0x8C, 0x0F, 0xFF, 0xE1, 0xFF, 0xFC, 0x3F, 0xFF, 0xC3,
|
||||||
|
0xF0, 0xFC, 0x7E, 0x0F, 0xE7, 0xC1, 0xFE, 0xF8, 0x3D, 0xFF, 0x83, 0x9F,
|
||||||
|
0xF8, 0x79, 0xFF, 0x8F, 0x1F, 0xF9, 0xE1, 0xFF, 0xBC, 0x1F, 0xFB, 0xC1,
|
||||||
|
0xF7, 0xF8, 0x3E, 0x7F, 0x07, 0xE7, 0xF0, 0xFE, 0x3F, 0xFF, 0xC3, 0xFF,
|
||||||
|
0xF8, 0x7F, 0xFF, 0x07, 0x1F, 0xC0, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00,
|
||||||
|
0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x38, 0x00, 0x04,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F,
|
||||||
|
0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE,
|
||||||
|
0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80,
|
||||||
|
0x7F, 0xE0, 0x1F, 0xFC, 0x0F, 0xDF, 0x87, 0xE7, 0xFF, 0xF8, 0xFF, 0xFC,
|
||||||
|
0x1F, 0xFE, 0x01, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x0F, 0x80,
|
||||||
|
0x07, 0xC0, 0x03, 0xE0, 0x00, 0x70, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x3E, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01,
|
||||||
|
0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F,
|
||||||
|
0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xFC,
|
||||||
|
0x0F, 0xDF, 0x87, 0xE7, 0xFF, 0xF8, 0xFF, 0xFC, 0x1F, 0xFE, 0x01, 0xFE,
|
||||||
|
0x00, 0x00, 0x80, 0x00, 0x70, 0x00, 0x3E, 0x00, 0x1F, 0xC0, 0x0F, 0x78,
|
||||||
|
0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x07, 0xFE, 0x01, 0xFF,
|
||||||
|
0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0,
|
||||||
|
0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07,
|
||||||
|
0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xF0, 0x3F, 0x7E, 0x1F, 0x9F, 0xFF, 0xE3,
|
||||||
|
0xFF, 0xF0, 0x7F, 0xF8, 0x07, 0xF8, 0x00, 0x0E, 0x1C, 0x07, 0xCF, 0x81,
|
||||||
|
0xF3, 0xE0, 0x7C, 0xF8, 0x0E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07,
|
||||||
|
0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF,
|
||||||
|
0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xF0,
|
||||||
|
0x3F, 0x7E, 0x1F, 0x9F, 0xFF, 0xE3, 0xFF, 0xF0, 0x7F, 0xF8, 0x07, 0xF8,
|
||||||
|
0x00, 0x00, 0x08, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00,
|
||||||
|
0x0F, 0x80, 0x00, 0x38, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x07, 0xE0, 0x0F, 0xDF, 0x00, 0xFC, 0xFC, 0x07, 0xE3, 0xF0, 0x7E, 0x0F,
|
||||||
|
0x83, 0xE0, 0x7E, 0x3F, 0x01, 0xFB, 0xF0, 0x0F, 0xDF, 0x80, 0x3F, 0xF8,
|
||||||
|
0x00, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x1F, 0xC0, 0x00, 0x7C, 0x00, 0x03,
|
||||||
|
0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00,
|
||||||
|
0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x7C, 0x00,
|
||||||
|
0x3E, 0x00, 0x1F, 0xFE, 0x0F, 0xFF, 0xC7, 0xFF, 0xF3, 0xFF, 0xFD, 0xF0,
|
||||||
|
0x7F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x83, 0xFF,
|
||||||
|
0xFF, 0xFB, 0xFF, 0xF9, 0xFF, 0xF8, 0xFF, 0xF0, 0x7C, 0x00, 0x3E, 0x00,
|
||||||
|
0x1F, 0x00, 0x0F, 0x80, 0x00, 0x0F, 0xE0, 0x1F, 0xF8, 0x1F, 0xFE, 0x0F,
|
||||||
|
0xFF, 0x8F, 0xC7, 0xC7, 0xC3, 0xE3, 0xE1, 0xF1, 0xF0, 0xF8, 0xF8, 0xF8,
|
||||||
|
0x7C, 0x7C, 0x3E, 0x7C, 0x1F, 0x3E, 0x0F, 0x9F, 0x07, 0xCF, 0xE3, 0xE3,
|
||||||
|
0xF9, 0xF0, 0xFE, 0xF8, 0x1F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x21, 0xFF,
|
||||||
|
0x9F, 0xFF, 0xCF, 0xFB, 0xE7, 0xFD, 0xF3, 0xF8, 0x04, 0x00, 0x38, 0x01,
|
||||||
|
0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x7F, 0x83, 0xFF, 0x0F, 0xFE, 0x3F, 0xFC, 0x03, 0xF0, 0x07, 0xC7, 0xFF,
|
||||||
|
0x7F, 0xFD, 0xFF, 0xFF, 0xC7, 0xFE, 0x1F, 0xF8, 0x7F, 0xFF, 0xF7, 0xFF,
|
||||||
|
0xDF, 0xFF, 0x1F, 0xF8, 0x00, 0x80, 0x07, 0x00, 0x3E, 0x01, 0xF0, 0x0F,
|
||||||
|
0x80, 0x1C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x83, 0xFF, 0x0F,
|
||||||
|
0xFE, 0x3F, 0xFC, 0x03, 0xF0, 0x07, 0xC7, 0xFF, 0x7F, 0xFD, 0xFF, 0xFF,
|
||||||
|
0xC7, 0xFE, 0x1F, 0xF8, 0x7F, 0xFF, 0xF7, 0xFF, 0xDF, 0xFF, 0x1F, 0xF8,
|
||||||
|
0x02, 0x00, 0x1C, 0x00, 0xF8, 0x07, 0xF0, 0x3D, 0xE0, 0x41, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1F, 0xE0, 0xFF, 0xC3, 0xFF, 0x8F, 0xFF, 0x00, 0xFC, 0x01,
|
||||||
|
0xF1, 0xFF, 0xDF, 0xFF, 0x7F, 0xFF, 0xF1, 0xFF, 0x87, 0xFE, 0x1F, 0xFF,
|
||||||
|
0xFD, 0xFF, 0xF7, 0xFF, 0xC7, 0xFE, 0x0E, 0x30, 0x7F, 0xE3, 0xFF, 0x06,
|
||||||
|
0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x3F, 0xF0, 0xFF, 0xE3,
|
||||||
|
0xFF, 0xC0, 0x3F, 0x00, 0x7C, 0x7F, 0xF7, 0xFF, 0xDF, 0xFF, 0xFC, 0x7F,
|
||||||
|
0xE1, 0xFF, 0x87, 0xFF, 0xFF, 0x7F, 0xFD, 0xFF, 0xF1, 0xFF, 0x80, 0x38,
|
||||||
|
0x71, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x1F, 0xE0, 0xFF, 0xC3, 0xFF, 0x8F, 0xFF, 0x00, 0xFC, 0x01, 0xF1,
|
||||||
|
0xFF, 0xDF, 0xFF, 0x7F, 0xFF, 0xF1, 0xFF, 0x87, 0xFE, 0x1F, 0xFF, 0xFD,
|
||||||
|
0xFF, 0xF7, 0xFF, 0xC7, 0xFE, 0x03, 0x80, 0x1F, 0x00, 0xC6, 0x03, 0x18,
|
||||||
|
0x0C, 0x60, 0x1F, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x83, 0xFF,
|
||||||
|
0x0F, 0xFE, 0x3F, 0xFC, 0x03, 0xF0, 0x07, 0xC7, 0xFF, 0x7F, 0xFD, 0xFF,
|
||||||
|
0xFF, 0xC7, 0xFE, 0x1F, 0xF8, 0x7F, 0xFF, 0xF7, 0xFF, 0xDF, 0xFF, 0x1F,
|
||||||
|
0xF8, 0x1F, 0xE1, 0xF8, 0x1F, 0xFB, 0xFF, 0x0F, 0xFF, 0xFF, 0xC7, 0xFF,
|
||||||
|
0xFF, 0xE2, 0x07, 0xF1, 0xF8, 0x01, 0xF0, 0x7C, 0x3F, 0xFF, 0xFE, 0x7F,
|
||||||
|
0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFE, 0x1F, 0x00, 0x3E, 0x0F, 0xC0, 0x1F,
|
||||||
|
0x83, 0xF0, 0x0F, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC,
|
||||||
|
0x1F, 0xC3, 0xF8, 0x03, 0xF8, 0x7F, 0xF3, 0xFF, 0x9F, 0xFE, 0x7E, 0x0B,
|
||||||
|
0xF0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, 0x80,
|
||||||
|
0x3F, 0xFC, 0x7F, 0xF0, 0xFF, 0xC0, 0x7E, 0x03, 0xC0, 0x03, 0x80, 0x0E,
|
||||||
|
0x03, 0xF8, 0x0F, 0xC0, 0x3E, 0x00, 0x02, 0x00, 0x07, 0x00, 0x0F, 0x80,
|
||||||
|
0x07, 0xC0, 0x03, 0xE0, 0x01, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0x7C, 0x3F, 0xF8, 0x1F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x04,
|
||||||
|
0x7F, 0xFE, 0x3F, 0xFE, 0x1F, 0xFE, 0x07, 0xF8, 0x00, 0x40, 0x00, 0xE0,
|
||||||
|
0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x03, 0x80, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0x7C, 0x3F,
|
||||||
|
0xF8, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFC, 0x00,
|
||||||
|
0x7E, 0x04, 0x7F, 0xFE, 0x3F, 0xFE, 0x1F, 0xFE, 0x07, 0xF8, 0x01, 0x00,
|
||||||
|
0x03, 0x80, 0x07, 0xC0, 0x0F, 0xE0, 0x1E, 0xF0, 0x08, 0x20, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0x7C, 0x3F,
|
||||||
|
0xF8, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFC, 0x00,
|
||||||
|
0x7E, 0x04, 0x7F, 0xFE, 0x3F, 0xFE, 0x1F, 0xFE, 0x07, 0xF8, 0x1C, 0x38,
|
||||||
|
0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x1C, 0x38, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0x7C, 0x3F,
|
||||||
|
0xF8, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFC, 0x00,
|
||||||
|
0x7E, 0x04, 0x7F, 0xFE, 0x3F, 0xFE, 0x1F, 0xFE, 0x07, 0xF8, 0x20, 0xE3,
|
||||||
|
0xE3, 0xE3, 0xE3, 0x82, 0x00, 0x00, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E,
|
||||||
|
0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0x08, 0x38, 0xFB, 0xEF,
|
||||||
|
0x8E, 0x08, 0x00, 0x00, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9,
|
||||||
|
0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0x08, 0x0E, 0x0F, 0x8F, 0xEF, 0x7A,
|
||||||
|
0x08, 0x00, 0x00, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C,
|
||||||
|
0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x70, 0xEF, 0x9F,
|
||||||
|
0xF9, 0xFF, 0x9F, 0x70, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0xF8,
|
||||||
|
0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8,
|
||||||
|
0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x00, 0x80, 0x00,
|
||||||
|
0xF0, 0x00, 0xFC, 0x60, 0x3F, 0xF0, 0x0F, 0xF8, 0x1F, 0xF0, 0x0F, 0xF8,
|
||||||
|
0x07, 0x3E, 0x00, 0x1F, 0x03, 0xF7, 0x87, 0xFF, 0xE7, 0xFF, 0xF7, 0xFF,
|
||||||
|
0xFF, 0xE0, 0xFF, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE,
|
||||||
|
0x07, 0xCF, 0x87, 0xE7, 0xFF, 0xE1, 0xFF, 0xF0, 0x7F, 0xF0, 0x0F, 0xE0,
|
||||||
|
0x0E, 0x30, 0x7F, 0xE3, 0xFF, 0x06, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x0F, 0xF0, 0xFF, 0xF3, 0xFF, 0xEF, 0xFF, 0xBE, 0x3F, 0xF8, 0x7F, 0xE1,
|
||||||
|
0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8,
|
||||||
|
0x7F, 0xE1, 0xFF, 0x87, 0xC0, 0x01, 0x00, 0x01, 0xC0, 0x01, 0xF0, 0x00,
|
||||||
|
0x7C, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x03, 0xF8, 0x07, 0xFF, 0x07, 0xFF, 0xC7, 0xFF, 0xF3, 0xF1, 0xFB, 0xF0,
|
||||||
|
0x7F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x83, 0xF7,
|
||||||
|
0xE3, 0xF3, 0xFF, 0xF8, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x00,
|
||||||
|
0x40, 0x00, 0x70, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x1C, 0x00,
|
||||||
|
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x07, 0xFF, 0x07, 0xFF,
|
||||||
|
0xC7, 0xFF, 0xF3, 0xF1, 0xFB, 0xF0, 0x7F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC,
|
||||||
|
0x07, 0xFE, 0x03, 0xFF, 0x83, 0xF7, 0xE3, 0xF3, 0xFF, 0xF8, 0xFF, 0xF8,
|
||||||
|
0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0xE0, 0x00, 0xF8, 0x00,
|
||||||
|
0xFE, 0x00, 0xF7, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0,
|
||||||
|
0x0F, 0xFE, 0x0F, 0xFF, 0x8F, 0xFF, 0xE7, 0xE3, 0xF7, 0xE0, 0xFF, 0xE0,
|
||||||
|
0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFF, 0x07, 0xEF, 0xC7, 0xE7,
|
||||||
|
0xFF, 0xF1, 0xFF, 0xF0, 0x7F, 0xF0, 0x0F, 0xE0, 0x07, 0x18, 0x07, 0xFE,
|
||||||
|
0x07, 0xFE, 0x01, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F,
|
||||||
|
0xE0, 0x1F, 0xFC, 0x1F, 0xFF, 0x1F, 0xFF, 0xCF, 0xC7, 0xEF, 0xC1, 0xFF,
|
||||||
|
0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFE, 0x0F, 0xDF, 0x8F,
|
||||||
|
0xCF, 0xFF, 0xE3, 0xFF, 0xE0, 0xFF, 0xE0, 0x1F, 0xC0, 0x0E, 0x1C, 0x0F,
|
||||||
|
0x9F, 0x07, 0xCF, 0x83, 0xE7, 0xC0, 0xE1, 0xC0, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x8F, 0xFF, 0xE7, 0xE3,
|
||||||
|
0xF7, 0xE0, 0xFF, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFF,
|
||||||
|
0x07, 0xEF, 0xC7, 0xE7, 0xFF, 0xF1, 0xFF, 0xF0, 0x7F, 0xF0, 0x0F, 0xE0,
|
||||||
|
0x03, 0x80, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x38, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x70, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x07, 0x00, 0x00, 0x02,
|
||||||
|
0x03, 0xFB, 0x87, 0xFF, 0xC7, 0xFF, 0xC7, 0xFF, 0xF3, 0xF1, 0xFB, 0xF1,
|
||||||
|
0xFF, 0xF1, 0xFF, 0xF9, 0xEF, 0xFD, 0xE7, 0xFF, 0xE3, 0xFF, 0xE3, 0xF7,
|
||||||
|
0xE3, 0xF3, 0xFF, 0xF8, 0xFF, 0xF8, 0xFF, 0xF8, 0x77, 0xF0, 0x10, 0x00,
|
||||||
|
0x00, 0x04, 0x00, 0x38, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0E, 0x00,
|
||||||
|
0x10, 0x00, 0x00, 0x00, 0x03, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F,
|
||||||
|
0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F,
|
||||||
|
0xFC, 0x7D, 0xFF, 0xF7, 0xFF, 0xCF, 0xFF, 0x0F, 0xF0, 0x00, 0x80, 0x07,
|
||||||
|
0x00, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x1C, 0x00, 0x20, 0x00, 0x00, 0x00,
|
||||||
|
0x03, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE,
|
||||||
|
0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xFC, 0x7D, 0xFF, 0xF7,
|
||||||
|
0xFF, 0xCF, 0xFF, 0x0F, 0xF0, 0x01, 0x00, 0x0E, 0x00, 0x7C, 0x03, 0xF8,
|
||||||
|
0x1E, 0xF0, 0x20, 0x80, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0xE1, 0xFF, 0x87,
|
||||||
|
0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1,
|
||||||
|
0xFF, 0x87, 0xFF, 0x1F, 0x7F, 0xFD, 0xFF, 0xF3, 0xFF, 0xC3, 0xFC, 0x38,
|
||||||
|
0x71, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF,
|
||||||
|
0x87, 0xFE, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0x87, 0xFF, 0x1F, 0x7F, 0xFD,
|
||||||
|
0xFF, 0xF3, 0xFF, 0xC3, 0xFC, 0x00, 0x20, 0x00, 0x38, 0x00, 0x3E, 0x00,
|
||||||
|
0x3E, 0x00, 0x3E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x7C, 0x07, 0xFF, 0x07, 0xEF, 0x83, 0xE7, 0xC1, 0xF3, 0xF1, 0xF8, 0xF8,
|
||||||
|
0xF8, 0x7C, 0x7C, 0x3E, 0x3C, 0x0F, 0xBE, 0x07, 0xDF, 0x01, 0xEF, 0x00,
|
||||||
|
0xFF, 0x80, 0x3F, 0x80, 0x1F, 0xC0, 0x07, 0xE0, 0x03, 0xE0, 0x01, 0xF0,
|
||||||
|
0x01, 0xF0, 0x0F, 0xF8, 0x0F, 0xF8, 0x07, 0xF8, 0x01, 0xF0, 0x00, 0x38,
|
||||||
|
0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8,
|
||||||
|
0x00, 0xF8, 0x00, 0xFF, 0xE0, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xFE, 0xF8,
|
||||||
|
0x7E, 0xF8, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8,
|
||||||
|
0x3F, 0xF8, 0x3E, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8, 0xFB, 0xF0, 0xF8,
|
||||||
|
0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x0E,
|
||||||
|
0x1C, 0x0F, 0x9F, 0x07, 0xCF, 0x83, 0xE7, 0xC0, 0xE1, 0xC0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0xFE, 0x0F, 0xDF, 0x07, 0xCF, 0x83,
|
||||||
|
0xE7, 0xE3, 0xF1, 0xF1, 0xF0, 0xF8, 0xF8, 0x7C, 0x78, 0x1F, 0x7C, 0x0F,
|
||||||
|
0xBE, 0x03, 0xDE, 0x01, 0xFF, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x0F, 0xC0,
|
||||||
|
0x07, 0xC0, 0x03, 0xE0, 0x03, 0xE0, 0x1F, 0xF0, 0x1F, 0xF0, 0x0F, 0xF0,
|
||||||
|
0x03, 0xE0, 0x00 };
|
||||||
|
|
||||||
|
const GFXglyph Ubuntu_Bold16pt8bGlyphs[] PROGMEM = {
|
||||||
|
{ 0, 1, 1, 7, 0, 0 }, // 0x20 ' ' U+0020
|
||||||
|
{ 1, 5, 21, 9, 2, -20 }, // 0x21 '!' U+0021
|
||||||
|
{ 15, 12, 9, 14, 2, -23 }, // 0x22 '"' U+0022
|
||||||
|
{ 29, 18, 21, 22, 2, -20 }, // 0x23 '#' U+0023
|
||||||
|
{ 77, 16, 28, 18, 1, -23 }, // 0x24 '$' U+0024
|
||||||
|
{ 133, 26, 21, 28, 1, -20 }, // 0x25 '%' U+0025
|
||||||
|
{ 202, 21, 21, 22, 1, -20 }, // 0x26 '&' U+0026
|
||||||
|
{ 258, 5, 9, 9, 2, -23 }, // 0x27 ''' U+0027
|
||||||
|
{ 264, 9, 30, 11, 2, -23 }, // 0x28 '(' U+0028
|
||||||
|
{ 298, 9, 30, 11, 0, -23 }, // 0x29 ')' U+0029
|
||||||
|
{ 332, 13, 12, 16, 2, -20 }, // 0x2a '*' U+002A
|
||||||
|
{ 352, 14, 14, 18, 2, -15 }, // 0x2b '+' U+002B
|
||||||
|
{ 377, 6, 10, 8, 1, -4 }, // 0x2c ',' U+002C
|
||||||
|
{ 385, 9, 4, 11, 1, -10 }, // 0x2d '-' U+002D
|
||||||
|
{ 390, 6, 6, 8, 1, -5 }, // 0x2e '.' U+002E
|
||||||
|
{ 395, 15, 30, 14, -1, -23 }, // 0x2f '/' U+002F
|
||||||
|
{ 452, 16, 21, 18, 1, -20 }, // 0x30 '0' U+0030
|
||||||
|
{ 494, 10, 21, 18, 3, -20 }, // 0x31 '1' U+0031
|
||||||
|
{ 521, 15, 21, 18, 1, -20 }, // 0x32 '2' U+0032
|
||||||
|
{ 561, 15, 21, 18, 1, -20 }, // 0x33 '3' U+0033
|
||||||
|
{ 601, 16, 21, 18, 1, -20 }, // 0x34 '4' U+0034
|
||||||
|
{ 643, 15, 21, 18, 1, -20 }, // 0x35 '5' U+0035
|
||||||
|
{ 683, 16, 21, 18, 1, -20 }, // 0x36 '6' U+0036
|
||||||
|
{ 725, 16, 21, 18, 1, -20 }, // 0x37 '7' U+0037
|
||||||
|
{ 767, 16, 21, 18, 1, -20 }, // 0x38 '8' U+0038
|
||||||
|
{ 809, 16, 21, 18, 1, -20 }, // 0x39 '9' U+0039
|
||||||
|
{ 851, 6, 17, 8, 1, -16 }, // 0x3a ':' U+003A
|
||||||
|
{ 864, 6, 22, 8, 1, -16 }, // 0x3b ';' U+003B
|
||||||
|
{ 881, 15, 15, 18, 1, -16 }, // 0x3c '<' U+003C
|
||||||
|
{ 910, 15, 11, 18, 1, -14 }, // 0x3d '=' U+003D
|
||||||
|
{ 931, 14, 15, 18, 2, -16 }, // 0x3e '>' U+003E
|
||||||
|
{ 958, 12, 24, 14, 1, -23 }, // 0x3f '?' U+003F
|
||||||
|
{ 994, 26, 27, 30, 2, -21 }, // 0x40 '@' U+0040
|
||||||
|
{ 1082, 21, 21, 21, 0, -20 }, // 0x41 'A' U+0041
|
||||||
|
{ 1138, 17, 21, 21, 2, -20 }, // 0x42 'B' U+0042
|
||||||
|
{ 1183, 17, 21, 20, 2, -20 }, // 0x43 'C' U+0043
|
||||||
|
{ 1228, 19, 21, 23, 2, -20 }, // 0x44 'D' U+0044
|
||||||
|
{ 1278, 16, 21, 19, 2, -20 }, // 0x45 'E' U+0045
|
||||||
|
{ 1320, 15, 21, 18, 2, -20 }, // 0x46 'F' U+0046
|
||||||
|
{ 1360, 18, 21, 22, 2, -20 }, // 0x47 'G' U+0047
|
||||||
|
{ 1408, 19, 21, 23, 2, -20 }, // 0x48 'H' U+0048
|
||||||
|
{ 1458, 5, 21, 9, 2, -20 }, // 0x49 'I' U+0049
|
||||||
|
{ 1472, 14, 21, 16, 0, -20 }, // 0x4a 'J' U+004A
|
||||||
|
{ 1509, 19, 21, 21, 2, -20 }, // 0x4b 'K' U+004B
|
||||||
|
{ 1559, 14, 21, 17, 2, -20 }, // 0x4c 'L' U+004C
|
||||||
|
{ 1596, 24, 21, 28, 2, -20 }, // 0x4d 'M' U+004D
|
||||||
|
{ 1659, 19, 21, 23, 2, -20 }, // 0x4e 'N' U+004E
|
||||||
|
{ 1709, 20, 21, 24, 2, -20 }, // 0x4f 'O' U+004F
|
||||||
|
{ 1762, 17, 21, 20, 2, -20 }, // 0x50 'P' U+0050
|
||||||
|
{ 1807, 20, 27, 24, 2, -20 }, // 0x51 'Q' U+0051
|
||||||
|
{ 1875, 18, 21, 21, 2, -20 }, // 0x52 'R' U+0052
|
||||||
|
{ 1923, 16, 21, 18, 1, -20 }, // 0x53 'S' U+0053
|
||||||
|
{ 1965, 17, 21, 19, 1, -20 }, // 0x54 'T' U+0054
|
||||||
|
{ 2010, 18, 21, 22, 2, -20 }, // 0x55 'U' U+0055
|
||||||
|
{ 2058, 21, 21, 21, 0, -20 }, // 0x56 'V' U+0056
|
||||||
|
{ 2114, 29, 21, 31, 1, -20 }, // 0x57 'W' U+0057
|
||||||
|
{ 2191, 21, 21, 21, 0, -20 }, // 0x58 'X' U+0058
|
||||||
|
{ 2247, 21, 21, 21, 0, -20 }, // 0x59 'Y' U+0059
|
||||||
|
{ 2303, 17, 21, 19, 1, -20 }, // 0x5a 'Z' U+005A
|
||||||
|
{ 2348, 10, 30, 12, 2, -23 }, // 0x5b '[' U+005B
|
||||||
|
{ 2386, 15, 30, 14, -1, -23 }, // 0x5c '\' U+005C
|
||||||
|
{ 2443, 10, 30, 12, 0, -23 }, // 0x5d ']' U+005D
|
||||||
|
{ 2481, 17, 13, 19, 1, -21 }, // 0x5e '^' U+005E
|
||||||
|
{ 2509, 16, 4, 16, 0, 3 }, // 0x5f '_' U+005F
|
||||||
|
{ 2517, 7, 7, 9, 1, -24 }, // 0x60 '`' U+0060
|
||||||
|
{ 2524, 14, 16, 17, 1, -15 }, // 0x61 'a' U+0061
|
||||||
|
{ 2552, 16, 24, 19, 2, -23 }, // 0x62 'b' U+0062
|
||||||
|
{ 2600, 14, 16, 16, 1, -15 }, // 0x63 'c' U+0063
|
||||||
|
{ 2628, 16, 24, 19, 1, -23 }, // 0x64 'd' U+0064
|
||||||
|
{ 2676, 16, 16, 18, 1, -15 }, // 0x65 'e' U+0065
|
||||||
|
{ 2708, 12, 24, 14, 2, -23 }, // 0x66 'f' U+0066
|
||||||
|
{ 2744, 15, 22, 18, 1, -15 }, // 0x67 'g' U+0067
|
||||||
|
{ 2786, 14, 24, 18, 2, -23 }, // 0x68 'h' U+0068
|
||||||
|
{ 2828, 5, 24, 9, 2, -23 }, // 0x69 'i' U+0069
|
||||||
|
{ 2843, 9, 30, 9, -2, -23 }, // 0x6a 'j' U+006A
|
||||||
|
{ 2877, 15, 24, 18, 2, -23 }, // 0x6b 'k' U+006B
|
||||||
|
{ 2922, 8, 24, 10, 2, -23 }, // 0x6c 'l' U+006C
|
||||||
|
{ 2946, 23, 16, 27, 2, -15 }, // 0x6d 'm' U+006D
|
||||||
|
{ 2992, 14, 16, 18, 2, -15 }, // 0x6e 'n' U+006E
|
||||||
|
{ 3020, 17, 16, 19, 1, -15 }, // 0x6f 'o' U+006F
|
||||||
|
{ 3054, 16, 22, 19, 2, -15 }, // 0x70 'p' U+0070
|
||||||
|
{ 3098, 17, 22, 19, 1, -15 }, // 0x71 'q' U+0071
|
||||||
|
{ 3145, 11, 16, 13, 2, -15 }, // 0x72 'r' U+0072
|
||||||
|
{ 3167, 13, 16, 15, 1, -15 }, // 0x73 's' U+0073
|
||||||
|
{ 3193, 12, 21, 15, 2, -20 }, // 0x74 't' U+0074
|
||||||
|
{ 3225, 14, 16, 18, 2, -15 }, // 0x75 'u' U+0075
|
||||||
|
{ 3253, 17, 16, 17, 0, -15 }, // 0x76 'v' U+0076
|
||||||
|
{ 3287, 24, 16, 24, 0, -15 }, // 0x77 'w' U+0077
|
||||||
|
{ 3335, 17, 16, 17, 0, -15 }, // 0x78 'x' U+0078
|
||||||
|
{ 3369, 17, 22, 17, 0, -15 }, // 0x79 'y' U+0079
|
||||||
|
{ 3416, 14, 16, 16, 1, -15 }, // 0x7a 'z' U+007A
|
||||||
|
{ 3444, 11, 30, 12, 1, -23 }, // 0x7b '{' U+007B
|
||||||
|
{ 3486, 4, 30, 10, 3, -23 }, // 0x7c '|' U+007C
|
||||||
|
{ 3501, 11, 30, 12, 0, -23 }, // 0x7d '}' U+007D
|
||||||
|
{ 3543, 16, 6, 18, 1, -11 }, // 0x7e '~' U+007E
|
||||||
|
{ 3555, 12, 23, 16, 2, -22 }, // 0x7f 'REPLACEMENT CHARACTER *' U+2370
|
||||||
|
{ 3590, 1, 1, 7, 0, 0 }, // 0x80 'NO-BREAK SPACE' U+00A0
|
||||||
|
{ 3591, 5, 22, 9, 2, -15 }, // 0x81 'INVERTED EXCLAMATION MARK' U+00A1
|
||||||
|
{ 3605, 14, 23, 18, 1, -19 }, // 0x82 'CENT SIGN' U+00A2
|
||||||
|
{ 3646, 15, 21, 18, 1, -20 }, // 0x83 'POUND SIGN' U+00A3
|
||||||
|
{ 3686, 17, 16, 18, 0, -18 }, // 0x84 'CURRENCY SIGN' U+00A4
|
||||||
|
{ 3720, 19, 21, 19, 0, -20 }, // 0x85 'YEN SIGN' U+00A5
|
||||||
|
{ 3770, 4, 30, 9, 2, -23 }, // 0x86 'BROKEN BAR' U+00A6
|
||||||
|
{ 3785, 14, 27, 16, 1, -20 }, // 0x87 'SECTION SIGN' U+00A7
|
||||||
|
{ 3833, 12, 5, 17, 2, -23 }, // 0x88 'DIAERESIS' U+00A8
|
||||||
|
{ 3841, 21, 22, 25, 2, -21 }, // 0x89 'COPYRIGHT SIGN' U+00A9
|
||||||
|
{ 3899, 10, 13, 12, 1, -21 }, // 0x8a 'FEMININE ORDINAL INDICATOR' U+00AA
|
||||||
|
{ 3916, 16, 15, 19, 1, -15 }, // 0x8b 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00AB
|
||||||
|
{ 3946, 15, 11, 18, 2, -12 }, // 0x8c 'NOT SIGN' U+00AC
|
||||||
|
{ 3967, 9, 4, 11, 1, -10 }, // 0x8d 'SOFT HYPHEN' U+00AD
|
||||||
|
{ 3972, 21, 22, 25, 2, -21 }, // 0x8e 'REGISTERED SIGN' U+00AE
|
||||||
|
{ 4030, 10, 3, 12, 1, -21 }, // 0x8f 'MACRON' U+00AF
|
||||||
|
{ 4034, 9, 9, 11, 1, -23 }, // 0x90 'DEGREE SIGN' U+00B0
|
||||||
|
{ 4045, 14, 19, 18, 2, -18 }, // 0x91 'PLUS-MINUS SIGN' U+00B1
|
||||||
|
{ 4079, 10, 13, 11, 0, -21 }, // 0x92 'SUPERSCRIPT TWO' U+00B2
|
||||||
|
{ 4096, 9, 13, 11, 1, -21 }, // 0x93 'SUPERSCRIPT THREE' U+00B3
|
||||||
|
{ 4111, 7, 7, 9, 1, -24 }, // 0x94 'ACUTE ACCENT' U+00B4
|
||||||
|
{ 4118, 14, 22, 18, 2, -15 }, // 0x95 'MICRO SIGN' U+00B5
|
||||||
|
{ 4157, 19, 28, 22, 1, -21 }, // 0x96 'PILCROW SIGN' U+00B6
|
||||||
|
{ 4224, 6, 6, 8, 1, -12 }, // 0x97 'MIDDLE DOT' U+00B7
|
||||||
|
{ 4229, 7, 8, 10, 1, 0 }, // 0x98 'CEDILLA' U+00B8
|
||||||
|
{ 4236, 7, 13, 11, 1, -21 }, // 0x99 'SUPERSCRIPT ONE' U+00B9
|
||||||
|
{ 4248, 12, 13, 14, 1, -21 }, // 0x9a 'MASCULINE ORDINAL INDICATOR' U+00BA
|
||||||
|
{ 4268, 16, 15, 19, 1, -15 }, // 0x9b 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00BB
|
||||||
|
{ 4298, 26, 22, 27, 0, -21 }, // 0x9c 'VULGAR FRACTION ONE QUARTER' U+00BC
|
||||||
|
{ 4370, 26, 22, 27, 0, -21 }, // 0x9d 'VULGAR FRACTION ONE HALF' U+00BD
|
||||||
|
{ 4442, 25, 22, 27, 1, -21 }, // 0x9e 'VULGAR FRACTION THREE QUARTERS' U+00BE
|
||||||
|
{ 4511, 12, 22, 14, 1, -15 }, // 0x9f 'INVERTED QUESTION MARK' U+00BF
|
||||||
|
{ 4544, 21, 30, 21, 0, -29 }, // 0xa0 'LATIN CAPITAL LETTER A WITH GRAVE' U+00C0
|
||||||
|
{ 4623, 21, 30, 21, 0, -29 }, // 0xa1 'LATIN CAPITAL LETTER A WITH ACUTE' U+00C1
|
||||||
|
{ 4702, 21, 29, 21, 0, -28 }, // 0xa2 'LATIN CAPITAL LETTER A WITH CIRCUMFLEX' U+00C2
|
||||||
|
{ 4779, 21, 28, 21, 0, -27 }, // 0xa3 'LATIN CAPITAL LETTER A WITH TILDE' U+00C3
|
||||||
|
{ 4853, 21, 29, 21, 0, -28 }, // 0xa4 'LATIN CAPITAL LETTER A WITH DIAERESIS' U+00C4
|
||||||
|
{ 4930, 21, 27, 21, 0, -26 }, // 0xa5 'LATIN CAPITAL LETTER A WITH RING ABOVE' U+00C5
|
||||||
|
{ 5001, 30, 21, 31, 0, -20 }, // 0xa6 'LATIN CAPITAL LETTER AE' U+00C6
|
||||||
|
{ 5080, 17, 28, 20, 2, -20 }, // 0xa7 'LATIN CAPITAL LETTER C WITH CEDILLA' U+00C7
|
||||||
|
{ 5140, 16, 30, 19, 2, -29 }, // 0xa8 'LATIN CAPITAL LETTER E WITH GRAVE' U+00C8
|
||||||
|
{ 5200, 16, 30, 19, 2, -29 }, // 0xa9 'LATIN CAPITAL LETTER E WITH ACUTE' U+00C9
|
||||||
|
{ 5260, 16, 29, 19, 2, -28 }, // 0xaa 'LATIN CAPITAL LETTER E WITH CIRCUMFLEX' U+00CA
|
||||||
|
{ 5318, 16, 29, 19, 2, -28 }, // 0xab 'LATIN CAPITAL LETTER E WITH DIAERESIS' U+00CB
|
||||||
|
{ 5376, 7, 30, 9, 1, -29 }, // 0xac 'LATIN CAPITAL LETTER I WITH GRAVE' U+00CC
|
||||||
|
{ 5403, 7, 30, 9, 1, -29 }, // 0xad 'LATIN CAPITAL LETTER I WITH ACUTE' U+00CD
|
||||||
|
{ 5430, 9, 29, 9, 0, -28 }, // 0xae 'LATIN CAPITAL LETTER I WITH CIRCUMFLEX' U+00CE
|
||||||
|
{ 5463, 12, 29, 9, -1, -28 }, // 0xaf 'LATIN CAPITAL LETTER I WITH DIAERESIS' U+00CF
|
||||||
|
{ 5507, 22, 21, 23, -1, -20 }, // 0xb0 'LATIN CAPITAL LETTER ETH' U+00D0
|
||||||
|
{ 5565, 19, 28, 23, 2, -27 }, // 0xb1 'LATIN CAPITAL LETTER N WITH TILDE' U+00D1
|
||||||
|
{ 5632, 20, 30, 24, 2, -29 }, // 0xb2 'LATIN CAPITAL LETTER O WITH GRAVE' U+00D2
|
||||||
|
{ 5707, 20, 30, 24, 2, -29 }, // 0xb3 'LATIN CAPITAL LETTER O WITH ACUTE' U+00D3
|
||||||
|
{ 5782, 20, 29, 24, 2, -28 }, // 0xb4 'LATIN CAPITAL LETTER O WITH CIRCUMFLEX' U+00D4
|
||||||
|
{ 5855, 20, 28, 24, 2, -27 }, // 0xb5 'LATIN CAPITAL LETTER O WITH TILDE' U+00D5
|
||||||
|
{ 5925, 20, 29, 24, 2, -28 }, // 0xb6 'LATIN CAPITAL LETTER O WITH DIAERESIS' U+00D6
|
||||||
|
{ 5998, 14, 14, 18, 2, -15 }, // 0xb7 'MULTIPLICATION SIGN' U+00D7
|
||||||
|
{ 6023, 20, 23, 24, 2, -21 }, // 0xb8 'LATIN CAPITAL LETTER O WITH STROKE' U+00D8
|
||||||
|
{ 6081, 18, 30, 22, 2, -29 }, // 0xb9 'LATIN CAPITAL LETTER U WITH GRAVE' U+00D9
|
||||||
|
{ 6149, 18, 30, 22, 2, -29 }, // 0xba 'LATIN CAPITAL LETTER U WITH ACUTE' U+00DA
|
||||||
|
{ 6217, 18, 29, 22, 2, -28 }, // 0xbb 'LATIN CAPITAL LETTER U WITH CIRCUMFLEX' U+00DB
|
||||||
|
{ 6283, 18, 29, 22, 2, -28 }, // 0xbc 'LATIN CAPITAL LETTER U WITH DIAERESIS' U+00DC
|
||||||
|
{ 6349, 21, 30, 21, 0, -29 }, // 0xbd 'LATIN CAPITAL LETTER Y WITH ACUTE' U+00DD
|
||||||
|
{ 6428, 17, 21, 20, 2, -20 }, // 0xbe 'LATIN CAPITAL LETTER THORN' U+00DE
|
||||||
|
{ 6473, 17, 24, 20, 2, -23 }, // 0xbf 'LATIN SMALL LETTER SHARP S' U+00DF
|
||||||
|
{ 6524, 14, 25, 17, 1, -24 }, // 0xc0 'LATIN SMALL LETTER A WITH GRAVE' U+00E0
|
||||||
|
{ 6568, 14, 25, 17, 1, -24 }, // 0xc1 'LATIN SMALL LETTER A WITH ACUTE' U+00E1
|
||||||
|
{ 6612, 14, 24, 17, 1, -23 }, // 0xc2 'LATIN SMALL LETTER A WITH CIRCUMFLEX' U+00E2
|
||||||
|
{ 6654, 14, 23, 17, 1, -22 }, // 0xc3 'LATIN SMALL LETTER A WITH TILDE' U+00E3
|
||||||
|
{ 6695, 14, 24, 17, 1, -23 }, // 0xc4 'LATIN SMALL LETTER A WITH DIAERESIS' U+00E4
|
||||||
|
{ 6737, 14, 25, 17, 1, -24 }, // 0xc5 'LATIN SMALL LETTER A WITH RING ABOVE' U+00E5
|
||||||
|
{ 6781, 25, 16, 27, 1, -15 }, // 0xc6 'LATIN SMALL LETTER AE' U+00E6
|
||||||
|
{ 6831, 14, 22, 16, 1, -15 }, // 0xc7 'LATIN SMALL LETTER C WITH CEDILLA' U+00E7
|
||||||
|
{ 6870, 16, 25, 18, 1, -24 }, // 0xc8 'LATIN SMALL LETTER E WITH GRAVE' U+00E8
|
||||||
|
{ 6920, 16, 25, 18, 1, -24 }, // 0xc9 'LATIN SMALL LETTER E WITH ACUTE' U+00E9
|
||||||
|
{ 6970, 16, 24, 18, 1, -23 }, // 0xca 'LATIN SMALL LETTER E WITH CIRCUMFLEX' U+00EA
|
||||||
|
{ 7018, 16, 24, 18, 1, -23 }, // 0xcb 'LATIN SMALL LETTER E WITH DIAERESIS' U+00EB
|
||||||
|
{ 7066, 7, 25, 9, 1, -24 }, // 0xcc 'LATIN SMALL LETTER I WITH GRAVE' U+00EC
|
||||||
|
{ 7088, 7, 25, 9, 1, -24 }, // 0xcd 'LATIN SMALL LETTER I WITH ACUTE' U+00ED
|
||||||
|
{ 7110, 9, 24, 9, 0, -23 }, // 0xce 'LATIN SMALL LETTER I WITH CIRCUMFLEX' U+00EE
|
||||||
|
{ 7137, 12, 24, 9, -2, -23 }, // 0xcf 'LATIN SMALL LETTER I WITH DIAERESIS' U+00EF
|
||||||
|
{ 7173, 17, 24, 19, 1, -23 }, // 0xd0 'LATIN SMALL LETTER ETH' U+00F0
|
||||||
|
{ 7224, 14, 23, 18, 2, -22 }, // 0xd1 'LATIN SMALL LETTER N WITH TILDE' U+00F1
|
||||||
|
{ 7265, 17, 25, 19, 1, -24 }, // 0xd2 'LATIN SMALL LETTER O WITH GRAVE' U+00F2
|
||||||
|
{ 7319, 17, 25, 19, 1, -24 }, // 0xd3 'LATIN SMALL LETTER O WITH ACUTE' U+00F3
|
||||||
|
{ 7373, 17, 24, 19, 1, -23 }, // 0xd4 'LATIN SMALL LETTER O WITH CIRCUMFLEX' U+00F4
|
||||||
|
{ 7424, 17, 23, 19, 1, -22 }, // 0xd5 'LATIN SMALL LETTER O WITH TILDE' U+00F5
|
||||||
|
{ 7473, 17, 24, 19, 1, -23 }, // 0xd6 'LATIN SMALL LETTER O WITH DIAERESIS' U+00F6
|
||||||
|
{ 7524, 15, 18, 19, 2, -17 }, // 0xd7 'DIVISION SIGN' U+00F7
|
||||||
|
{ 7558, 17, 18, 19, 1, -16 }, // 0xd8 'LATIN SMALL LETTER O WITH STROKE' U+00F8
|
||||||
|
{ 7597, 14, 25, 18, 2, -24 }, // 0xd9 'LATIN SMALL LETTER U WITH GRAVE' U+00F9
|
||||||
|
{ 7641, 14, 25, 18, 2, -24 }, // 0xda 'LATIN SMALL LETTER U WITH ACUTE' U+00FA
|
||||||
|
{ 7685, 14, 24, 18, 2, -23 }, // 0xdb 'LATIN SMALL LETTER U WITH CIRCUMFLEX' U+00FB
|
||||||
|
{ 7727, 14, 24, 18, 2, -23 }, // 0xdc 'LATIN SMALL LETTER U WITH DIAERESIS' U+00FC
|
||||||
|
{ 7769, 17, 31, 17, 0, -24 }, // 0xdd 'LATIN SMALL LETTER Y WITH ACUTE' U+00FD
|
||||||
|
{ 7835, 16, 30, 19, 2, -23 }, // 0xde 'LATIN SMALL LETTER THORN' U+00FE
|
||||||
|
{ 7895, 17, 30, 17, 0, -23 } }; // 0xdf 'LATIN SMALL LETTER Y WITH DIAERESIS' U+000FF
|
||||||
|
|
||||||
|
const GFXfont Ubuntu_Bold16pt8b PROGMEM = {
|
||||||
|
(uint8_t *)Ubuntu_Bold16pt8bBitmaps,
|
||||||
|
(GFXglyph *)Ubuntu_Bold16pt8bGlyphs,
|
||||||
|
0x20, 0xDF, 36 };
|
||||||
|
|
||||||
|
// Approx. 9310 bytes
|
||||||
2955
lib/obp60task/fonts/Ubuntu_Bold32pt8b.h
Normal file
2955
lib/obp60task/fonts/Ubuntu_Bold32pt8b.h
Normal file
File diff suppressed because it is too large
Load Diff
377
lib/obp60task/fonts/Ubuntu_Bold8pt8b.h
Normal file
377
lib/obp60task/fonts/Ubuntu_Bold8pt8b.h
Normal file
@@ -0,0 +1,377 @@
|
|||||||
|
const uint8_t Ubuntu_Bold8pt8bBitmaps[] PROGMEM = {
|
||||||
|
0x00, 0xFF, 0xFC, 0xFC, 0xDE, 0xF7, 0xBD, 0x80, 0x1B, 0x0D, 0x87, 0xDF,
|
||||||
|
0xFF, 0xF9, 0xB3, 0xFF, 0xFF, 0x6C, 0x36, 0x1B, 0x00, 0x18, 0x30, 0xFF,
|
||||||
|
0xFC, 0x38, 0x1C, 0x1E, 0x0E, 0x0C, 0x1F, 0xF7, 0xC3, 0x06, 0x00, 0x78,
|
||||||
|
0x63, 0xF3, 0x0C, 0xCC, 0x33, 0x60, 0xCF, 0xFB, 0xFF, 0xF7, 0xFC, 0xC1,
|
||||||
|
0xB3, 0x0C, 0xCC, 0x33, 0xF1, 0x87, 0x80, 0x3C, 0x1F, 0x86, 0x61, 0x98,
|
||||||
|
0x3C, 0x1E, 0x6C, 0xDB, 0x1C, 0xC7, 0x3F, 0xE7, 0xDC, 0xFF, 0xC0, 0x13,
|
||||||
|
0x66, 0xCC, 0xCC, 0xCC, 0xCC, 0x66, 0x31, 0x8C, 0x66, 0x33, 0x33, 0x33,
|
||||||
|
0x33, 0x66, 0xC8, 0x39, 0xFF, 0xF8, 0x86, 0xDD, 0xD1, 0x00, 0x18, 0x18,
|
||||||
|
0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x6D, 0xEC, 0xFF, 0xC0, 0xFF, 0x80,
|
||||||
|
0x06, 0x1C, 0x30, 0x60, 0xC3, 0x06, 0x0C, 0x30, 0x60, 0xC3, 0x06, 0x0C,
|
||||||
|
0x38, 0x60, 0x38, 0xFB, 0xBE, 0x3C, 0x78, 0xF1, 0xE3, 0xEE, 0xF8, 0xE0,
|
||||||
|
0x1B, 0xFE, 0xB1, 0x8C, 0x63, 0x18, 0xC6, 0x7D, 0xFD, 0x18, 0x30, 0xE3,
|
||||||
|
0x8E, 0x38, 0xE1, 0xFF, 0xF8, 0x7D, 0xFC, 0x18, 0x33, 0xE7, 0x81, 0x83,
|
||||||
|
0x87, 0xFF, 0xE0, 0x06, 0x0E, 0x1E, 0x3E, 0x36, 0x66, 0xE6, 0xFF, 0xFF,
|
||||||
|
0x06, 0x06, 0x7E, 0xFD, 0x83, 0x0F, 0x9F, 0x83, 0x83, 0x07, 0xFB, 0xE0,
|
||||||
|
0x1C, 0x79, 0xC7, 0x0F, 0xDF, 0xF1, 0xE3, 0xC6, 0xF8, 0xE0, 0xFF, 0xFC,
|
||||||
|
0x30, 0xE1, 0x87, 0x0C, 0x18, 0x60, 0xC1, 0x80, 0x3C, 0xFF, 0x1E, 0x3E,
|
||||||
|
0xEF, 0xBF, 0xE3, 0xC7, 0xFD, 0xF0, 0x38, 0xFB, 0x1E, 0x3C, 0x7F, 0xDF,
|
||||||
|
0x87, 0x1C, 0xF1, 0xC0, 0xFF, 0x80, 0x3F, 0xE0, 0x77, 0x70, 0x00, 0x06,
|
||||||
|
0x66, 0xCC, 0x06, 0x3E, 0xF8, 0xC0, 0xF8, 0x3F, 0x06, 0xFF, 0xFF, 0x00,
|
||||||
|
0x00, 0xFF, 0xFF, 0x60, 0x7C, 0x1F, 0x03, 0x1F, 0xFC, 0x60, 0x7D, 0xFC,
|
||||||
|
0x18, 0x30, 0xC3, 0x0C, 0x18, 0x00, 0x70, 0xE1, 0xC0, 0x0F, 0xC0, 0x7F,
|
||||||
|
0xC3, 0x83, 0x98, 0x06, 0xE7, 0xCF, 0x3F, 0x3D, 0x8C, 0xF6, 0x33, 0xD8,
|
||||||
|
0xCF, 0xBF, 0xE6, 0x7F, 0x1E, 0x00, 0x3F, 0xC0, 0x3F, 0x00, 0x0E, 0x01,
|
||||||
|
0xC0, 0x7C, 0x0D, 0x83, 0xB8, 0x63, 0x0C, 0x63, 0xFE, 0x7F, 0xCC, 0x1B,
|
||||||
|
0x01, 0x80, 0xFC, 0x7F, 0xB0, 0xD8, 0x6F, 0xE7, 0xFB, 0x07, 0x83, 0xC3,
|
||||||
|
0xFF, 0xBF, 0x80, 0x1F, 0x1F, 0xD8, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80,
|
||||||
|
0x60, 0x3F, 0xC7, 0xC0, 0xFE, 0x3F, 0xCC, 0x3B, 0x07, 0xC0, 0xF0, 0x3C,
|
||||||
|
0x0F, 0x07, 0xC3, 0xBF, 0xCF, 0xE0, 0xFF, 0xFF, 0xC0, 0xC0, 0xFE, 0xFE,
|
||||||
|
0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0,
|
||||||
|
0xC0, 0xC0, 0xC0, 0xC0, 0x1F, 0x1F, 0xD8, 0x18, 0x0C, 0x06, 0x0F, 0x07,
|
||||||
|
0x83, 0x71, 0xBF, 0xC7, 0xE0, 0xC1, 0xE0, 0xF0, 0x78, 0x3F, 0xFF, 0xFF,
|
||||||
|
0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x60, 0xFF, 0xFF, 0xFC, 0x06, 0x0C, 0x18,
|
||||||
|
0x30, 0x60, 0xC1, 0x83, 0x07, 0xF9, 0xE0, 0xC1, 0xB0, 0xCC, 0x63, 0x30,
|
||||||
|
0xF8, 0x3C, 0x0D, 0x83, 0x30, 0xC6, 0x30, 0xCC, 0x18, 0xC0, 0xC0, 0xC0,
|
||||||
|
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0x60, 0x33, 0x83, 0x9C,
|
||||||
|
0x1C, 0xF1, 0xED, 0x8D, 0xEE, 0xEF, 0x36, 0x79, 0xF3, 0xC7, 0x1E, 0x38,
|
||||||
|
0xF0, 0x06, 0xC0, 0xF8, 0x3F, 0x0F, 0xE3, 0xDC, 0xF3, 0xBC, 0x7F, 0x0F,
|
||||||
|
0xC1, 0xF0, 0x7C, 0x0C, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80,
|
||||||
|
0xF0, 0x1F, 0x07, 0x71, 0xCF, 0xF8, 0x7C, 0x00, 0xFC, 0xFE, 0xC3, 0xC3,
|
||||||
|
0xC3, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0x1F, 0x07, 0xF1, 0xC7, 0x70,
|
||||||
|
0x7C, 0x07, 0x80, 0xF0, 0x1F, 0x07, 0x71, 0xCF, 0xF0, 0xF8, 0x07, 0x00,
|
||||||
|
0x7C, 0x07, 0x80, 0xFC, 0x7F, 0x30, 0xD8, 0x6C, 0x37, 0xF3, 0xE1, 0x98,
|
||||||
|
0xC6, 0x63, 0xB0, 0xE0, 0x3D, 0xFF, 0x06, 0x0F, 0x0F, 0x87, 0x83, 0x07,
|
||||||
|
0xFD, 0xF0, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
||||||
|
0x18, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xE3, 0xBF,
|
||||||
|
0x8F, 0x80, 0xC0, 0x6C, 0x19, 0x83, 0x38, 0xE3, 0x18, 0x63, 0x06, 0xC0,
|
||||||
|
0xD8, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0xC0, 0x07, 0x87, 0x0D, 0x8E, 0x33,
|
||||||
|
0x1C, 0x66, 0x6C, 0xC6, 0xDB, 0x0D, 0xB6, 0x1B, 0x6C, 0x1C, 0x70, 0x38,
|
||||||
|
0xE0, 0x71, 0xC0, 0xE0, 0xEC, 0x18, 0xC6, 0x0D, 0x80, 0xE0, 0x1C, 0x03,
|
||||||
|
0x80, 0xD8, 0x31, 0x8C, 0x1B, 0x83, 0x80, 0xC0, 0xD8, 0x67, 0x38, 0xCC,
|
||||||
|
0x1E, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0xFF, 0xFF, 0x06,
|
||||||
|
0x0C, 0x1C, 0x18, 0x30, 0x70, 0x60, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C, 0x63,
|
||||||
|
0x18, 0xC6, 0x31, 0x8C, 0x63, 0xFF, 0xC1, 0xC1, 0x83, 0x06, 0x06, 0x0C,
|
||||||
|
0x18, 0x18, 0x30, 0x60, 0x60, 0xC1, 0x83, 0x83, 0xFF, 0xC6, 0x31, 0x8C,
|
||||||
|
0x63, 0x18, 0xC6, 0x31, 0x8F, 0xFF, 0x08, 0x0E, 0x0F, 0x86, 0xC7, 0x77,
|
||||||
|
0x1D, 0x04, 0xFF, 0xFF, 0x4E, 0x72, 0x7C, 0xFC, 0x1B, 0xFF, 0xF8, 0xFF,
|
||||||
|
0xBF, 0xC1, 0x83, 0x06, 0x0F, 0x9F, 0xB3, 0xE3, 0xC7, 0x9F, 0xF7, 0xC0,
|
||||||
|
0x3D, 0xFE, 0x30, 0xC3, 0x87, 0xCF, 0x06, 0x0C, 0x18, 0x33, 0xEF, 0xF9,
|
||||||
|
0xE3, 0xC7, 0xCD, 0xF9, 0xF0, 0x38, 0xFB, 0x1F, 0xFF, 0xF8, 0x1F, 0x1E,
|
||||||
|
0x7F, 0xF1, 0x8F, 0xFF, 0x18, 0xC6, 0x31, 0x80, 0x3E, 0xFF, 0x9E, 0x3C,
|
||||||
|
0x7C, 0xDF, 0x9F, 0x06, 0xFB, 0xE0, 0xC1, 0x83, 0x06, 0x0F, 0xDF, 0xF1,
|
||||||
|
0xE3, 0xC7, 0x8F, 0x1E, 0x30, 0xFC, 0xFF, 0xFF, 0x33, 0x30, 0x33, 0x33,
|
||||||
|
0x33, 0x33, 0x3F, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC6, 0xCC, 0xD8, 0xF0,
|
||||||
|
0xD8, 0xCC, 0xC6, 0xC7, 0xDB, 0x6D, 0xB6, 0xDB, 0xB0, 0xFD, 0xEF, 0xFF,
|
||||||
|
0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xFD, 0xFF, 0x1E,
|
||||||
|
0x3C, 0x78, 0xF1, 0xE3, 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C,
|
||||||
|
0xF9, 0xFB, 0x3E, 0x3C, 0x79, 0xFF, 0x7C, 0xC1, 0x83, 0x00, 0x3E, 0xFF,
|
||||||
|
0x9E, 0x3C, 0x7C, 0xDF, 0xBF, 0x06, 0x0C, 0x18, 0xFF, 0xF1, 0x8C, 0x63,
|
||||||
|
0x18, 0x7F, 0xEC, 0x3E, 0x7C, 0x3F, 0xFE, 0xC6, 0x3F, 0xFC, 0x63, 0x18,
|
||||||
|
0xFB, 0xC0, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xFF, 0xBF, 0xC1, 0xB1, 0x98,
|
||||||
|
0xCE, 0xE3, 0x61, 0xF0, 0x70, 0x38, 0xC6, 0x79, 0xCD, 0xBB, 0x35, 0x66,
|
||||||
|
0xAC, 0x77, 0x0E, 0xE1, 0x8C, 0xE3, 0xBB, 0x8D, 0x83, 0x81, 0xC1, 0xB1,
|
||||||
|
0xDD, 0xC7, 0xE3, 0xB1, 0x98, 0xCE, 0xE3, 0x61, 0xF0, 0x70, 0x38, 0x18,
|
||||||
|
0x7C, 0x3C, 0x00, 0xFF, 0xF1, 0x8E, 0x71, 0x8F, 0xFF, 0x3B, 0xD8, 0xC6,
|
||||||
|
0x31, 0x98, 0xC3, 0x18, 0xC6, 0x31, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7,
|
||||||
|
0x8C, 0x63, 0x18, 0xC3, 0x19, 0x8C, 0x63, 0x1B, 0xDC, 0x73, 0xFF, 0xCE,
|
||||||
|
0xFE, 0x18, 0x61, 0x86, 0x18, 0x61, 0x86, 0x18, 0x7F, 0x00, 0xFC, 0xFF,
|
||||||
|
0xFC, 0x18, 0x63, 0xDF, 0xE3, 0x0C, 0x30, 0x7C, 0xF1, 0x86, 0x1F, 0x3F,
|
||||||
|
0x70, 0x60, 0x60, 0xFE, 0xFE, 0x60, 0x60, 0x7F, 0x7F, 0x42, 0xFF, 0x7E,
|
||||||
|
0x66, 0x66, 0x7E, 0xFF, 0x42, 0xC3, 0x66, 0x66, 0x3C, 0x3C, 0x7E, 0x7E,
|
||||||
|
0x18, 0x7E, 0x7E, 0x18, 0xFF, 0xF0, 0x0F, 0xFF, 0x7F, 0xFC, 0x38, 0x7B,
|
||||||
|
0xFC, 0xF3, 0xFD, 0xE1, 0xC3, 0xFF, 0xE0, 0xDE, 0xC0, 0x1F, 0x07, 0xF1,
|
||||||
|
0xC7, 0x77, 0x7D, 0xE7, 0xB0, 0xF7, 0x9F, 0x77, 0x71, 0xC7, 0xF0, 0x7C,
|
||||||
|
0x00, 0x70, 0xDF, 0xFD, 0xBC, 0x11, 0x1D, 0xDD, 0xDD, 0xC7, 0x71, 0xDC,
|
||||||
|
0x44, 0xFF, 0xFC, 0x18, 0x30, 0x60, 0xC0, 0xFF, 0xC0, 0x1F, 0x07, 0xF1,
|
||||||
|
0xC7, 0x7F, 0x7D, 0xB7, 0xBE, 0xF6, 0xDF, 0xDF, 0x71, 0xC7, 0xF0, 0x7C,
|
||||||
|
0x00, 0xFF, 0xC0, 0x7B, 0xFC, 0xF3, 0xFD, 0xE0, 0x18, 0x18, 0x18, 0xFF,
|
||||||
|
0xFF, 0x18, 0x18, 0x18, 0x00, 0xFF, 0xFF, 0xF0, 0xCE, 0xEE, 0x7C, 0xF8,
|
||||||
|
0xDC, 0x31, 0x8F, 0xC0, 0x27, 0xE4, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xFF,
|
||||||
|
0xFF, 0xC1, 0x83, 0x00, 0x7F, 0xFF, 0xFE, 0x7F, 0x3F, 0x9F, 0xCC, 0xE6,
|
||||||
|
0x33, 0x19, 0x8C, 0xC6, 0x63, 0x31, 0x98, 0xCC, 0xFF, 0x80, 0x47, 0xA0,
|
||||||
|
0x7F, 0x33, 0x33, 0x7B, 0x3C, 0xF3, 0xCD, 0xE0, 0x44, 0x77, 0x1D, 0xC7,
|
||||||
|
0x77, 0x77, 0x71, 0x10, 0x70, 0xC7, 0x8C, 0x0C, 0x60, 0x66, 0x03, 0x30,
|
||||||
|
0x1B, 0x38, 0x19, 0xC1, 0x9E, 0x0D, 0xB0, 0xCF, 0xC6, 0x0C, 0x71, 0x8F,
|
||||||
|
0x30, 0x33, 0x03, 0x60, 0x36, 0x03, 0xDE, 0x0C, 0x31, 0x87, 0x18, 0xE3,
|
||||||
|
0x1C, 0x31, 0xF0, 0xF8, 0x60, 0x63, 0x07, 0x0C, 0x06, 0x60, 0x19, 0x80,
|
||||||
|
0x6C, 0xEF, 0x33, 0x81, 0x9E, 0x06, 0xD8, 0x33, 0xF0, 0xC1, 0x80, 0x38,
|
||||||
|
0x70, 0xE0, 0x01, 0x87, 0x1C, 0x60, 0xC1, 0xFD, 0xF0, 0x08, 0x03, 0x80,
|
||||||
|
0x38, 0x02, 0x00, 0x00, 0x1C, 0x03, 0x80, 0xF8, 0x1B, 0x07, 0x70, 0xC6,
|
||||||
|
0x18, 0xC7, 0xFC, 0xFF, 0x98, 0x36, 0x03, 0x04, 0x01, 0xC0, 0x70, 0x04,
|
||||||
|
0x00, 0x00, 0x1C, 0x03, 0x80, 0xF8, 0x1B, 0x07, 0x70, 0xC6, 0x18, 0xC7,
|
||||||
|
0xFC, 0xFF, 0x98, 0x36, 0x03, 0x04, 0x01, 0xC0, 0x6C, 0x00, 0x00, 0xE0,
|
||||||
|
0x1C, 0x07, 0xC0, 0xD8, 0x3B, 0x86, 0x30, 0xC6, 0x3F, 0xE7, 0xFC, 0xC1,
|
||||||
|
0xB0, 0x18, 0x0C, 0x83, 0xF0, 0x4C, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x80,
|
||||||
|
0xF8, 0x1B, 0x07, 0x70, 0xC6, 0x18, 0xC7, 0xFC, 0xFF, 0x98, 0x36, 0x03,
|
||||||
|
0x1B, 0x03, 0x60, 0x00, 0x00, 0x00, 0xE0, 0x1C, 0x07, 0xC0, 0xD8, 0x3B,
|
||||||
|
0x86, 0x30, 0xC6, 0x3F, 0xE7, 0xFC, 0xC1, 0xB0, 0x18, 0x0E, 0x03, 0x60,
|
||||||
|
0x6C, 0x07, 0x00, 0xE0, 0x1C, 0x06, 0xC0, 0xD8, 0x3B, 0x86, 0x30, 0xC6,
|
||||||
|
0x3F, 0xE7, 0xFC, 0xC1, 0xB0, 0x18, 0x01, 0xFE, 0x07, 0xFC, 0x1F, 0x00,
|
||||||
|
0x36, 0x00, 0xCF, 0xC1, 0x9F, 0x87, 0xF0, 0x1F, 0xE0, 0x30, 0xC0, 0xC1,
|
||||||
|
0xFF, 0x83, 0xF8, 0x1F, 0x1F, 0xD8, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80,
|
||||||
|
0x60, 0x3F, 0xC7, 0xC1, 0x80, 0x60, 0xE0, 0x10, 0x38, 0x1C, 0x08, 0x00,
|
||||||
|
0xFF, 0xFF, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0x08,
|
||||||
|
0x1C, 0x38, 0x10, 0x00, 0xFF, 0xFF, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0,
|
||||||
|
0xC0, 0xFF, 0xFF, 0x10, 0x38, 0x6C, 0x00, 0xFF, 0xFF, 0xC0, 0xC0, 0xFE,
|
||||||
|
0xFE, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0x6C, 0x6C, 0x00, 0x00, 0xFF, 0xFF,
|
||||||
|
0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0x4E, 0x72, 0x06,
|
||||||
|
0x66, 0x66, 0x66, 0x66, 0x66, 0x27, 0xE4, 0x06, 0x66, 0x66, 0x66, 0x66,
|
||||||
|
0x66, 0x23, 0xB6, 0x06, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x80, 0xDE,
|
||||||
|
0xC0, 0x06, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x80, 0x7F, 0x0F, 0xF1,
|
||||||
|
0x87, 0x30, 0x7F, 0x87, 0xF0, 0xD8, 0x1B, 0x07, 0x61, 0xCF, 0xF1, 0xFC,
|
||||||
|
0x00, 0x19, 0x0F, 0xC2, 0x60, 0x00, 0x00, 0x30, 0x3E, 0x0F, 0xC3, 0xF8,
|
||||||
|
0xF7, 0x3C, 0xEF, 0x1F, 0xC3, 0xF0, 0x7C, 0x1F, 0x03, 0x08, 0x03, 0x80,
|
||||||
|
0x38, 0x02, 0x00, 0x00, 0x3E, 0x0F, 0xE3, 0x8E, 0xE0, 0xF8, 0x0F, 0x01,
|
||||||
|
0xE0, 0x3E, 0x0E, 0xE3, 0x9F, 0xF0, 0xF8, 0x02, 0x00, 0xE0, 0x38, 0x02,
|
||||||
|
0x00, 0x00, 0x3E, 0x0F, 0xE3, 0x8E, 0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3E,
|
||||||
|
0x0E, 0xE3, 0x9F, 0xF0, 0xF8, 0x04, 0x01, 0xC0, 0x6C, 0x00, 0x01, 0xF0,
|
||||||
|
0x7F, 0x1C, 0x77, 0x07, 0xC0, 0x78, 0x0F, 0x01, 0xF0, 0x77, 0x1C, 0xFF,
|
||||||
|
0x87, 0xC0, 0x0C, 0x83, 0xF0, 0x4C, 0x00, 0x00, 0x00, 0x3E, 0x0F, 0xE3,
|
||||||
|
0x8E, 0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3E, 0x0E, 0xE3, 0x9F, 0xF0, 0xF8,
|
||||||
|
0x1B, 0x03, 0x60, 0x00, 0x00, 0x01, 0xF0, 0x7F, 0x1C, 0x77, 0x07, 0xC0,
|
||||||
|
0x78, 0x0F, 0x01, 0xF0, 0x77, 0x1C, 0xFF, 0x87, 0xC0, 0x45, 0xDD, 0xF1,
|
||||||
|
0xC7, 0xDD, 0xD1, 0x00, 0x1F, 0xE7, 0xF9, 0x87, 0x61, 0xFC, 0x67, 0x9C,
|
||||||
|
0xF3, 0x1F, 0xC3, 0x70, 0xCF, 0xFB, 0x7C, 0x00, 0x00, 0x10, 0x1C, 0x07,
|
||||||
|
0x01, 0x00, 0x06, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1F,
|
||||||
|
0x1D, 0xFC, 0x7C, 0x04, 0x07, 0x07, 0x01, 0x00, 0x06, 0x0F, 0x07, 0x83,
|
||||||
|
0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1F, 0x1D, 0xFC, 0x7C, 0x08, 0x0E, 0x0D,
|
||||||
|
0x80, 0x0C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3E, 0x3B,
|
||||||
|
0xF8, 0xF8, 0x36, 0x1B, 0x00, 0x00, 0x0C, 0x1E, 0x0F, 0x07, 0x83, 0xC1,
|
||||||
|
0xE0, 0xF0, 0x78, 0x3E, 0x3B, 0xF8, 0xF8, 0x04, 0x03, 0x81, 0xC0, 0x20,
|
||||||
|
0x00, 0x30, 0x36, 0x19, 0xCE, 0x33, 0x07, 0x81, 0xE0, 0x30, 0x0C, 0x03,
|
||||||
|
0x00, 0xC0, 0x30, 0xC0, 0xC0, 0xFC, 0xFE, 0xC3, 0xC3, 0xC3, 0xFE, 0xFC,
|
||||||
|
0xC0, 0xC0, 0x3E, 0x3F, 0xB8, 0xD8, 0x6C, 0x66, 0x63, 0x39, 0x8E, 0xC1,
|
||||||
|
0xE0, 0xF3, 0xFB, 0xE0, 0x20, 0xE0, 0xE0, 0x80, 0x0F, 0x9F, 0x83, 0x7F,
|
||||||
|
0xFF, 0x1F, 0xF7, 0xE0, 0x08, 0x38, 0xE0, 0x80, 0x0F, 0x9F, 0x83, 0x7F,
|
||||||
|
0xFF, 0x1F, 0xF7, 0xE0, 0x10, 0x71, 0xB0, 0x07, 0xCF, 0xC1, 0xBF, 0xFF,
|
||||||
|
0x8F, 0xFB, 0xF0, 0x32, 0xFD, 0x30, 0x00, 0x0F, 0x9F, 0x83, 0x7F, 0xFF,
|
||||||
|
0x1F, 0xF7, 0xE0, 0x6C, 0xD8, 0x00, 0x07, 0xCF, 0xC1, 0xBF, 0xFF, 0x8F,
|
||||||
|
0xFB, 0xF0, 0x38, 0xD9, 0xB1, 0xC0, 0x0F, 0x9F, 0x83, 0x7F, 0xFF, 0x1F,
|
||||||
|
0xF7, 0xE0, 0x7D, 0xC7, 0xFE, 0x06, 0x37, 0xFF, 0xFF, 0xFC, 0x60, 0xFF,
|
||||||
|
0xE7, 0xDF, 0x3E, 0xFF, 0x86, 0x0C, 0x1C, 0x1F, 0x9F, 0x1C, 0x18, 0xE0,
|
||||||
|
0x20, 0xE0, 0xE0, 0x80, 0x07, 0x1F, 0x63, 0xFF, 0xFF, 0x03, 0xE3, 0xC0,
|
||||||
|
0x08, 0x38, 0xE0, 0x80, 0x07, 0x1F, 0x63, 0xFF, 0xFF, 0x03, 0xE3, 0xC0,
|
||||||
|
0x10, 0x71, 0xB0, 0x03, 0x8F, 0xB1, 0xFF, 0xFF, 0x81, 0xF1, 0xE0, 0x6C,
|
||||||
|
0xD8, 0x00, 0x03, 0x8F, 0xB1, 0xFF, 0xFF, 0x81, 0xF1, 0xE0, 0x4E, 0x72,
|
||||||
|
0x06, 0x66, 0x66, 0x66, 0x60, 0x27, 0xE4, 0x06, 0x66, 0x66, 0x66, 0x60,
|
||||||
|
0x23, 0xB6, 0x06, 0x31, 0x8C, 0x63, 0x18, 0xC0, 0xDE, 0xC0, 0x03, 0x18,
|
||||||
|
0xC6, 0x31, 0x8C, 0x60, 0x18, 0x1F, 0x1E, 0x06, 0x03, 0x3F, 0x7F, 0xC3,
|
||||||
|
0xC3, 0xC7, 0x7E, 0x3C, 0x65, 0xFA, 0x60, 0x00, 0x1F, 0xBF, 0xE3, 0xC7,
|
||||||
|
0x8F, 0x1E, 0x3C, 0x60, 0x10, 0x38, 0x1C, 0x08, 0x00, 0x3C, 0x7E, 0xE7,
|
||||||
|
0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x08, 0x1C, 0x38, 0x10, 0x00, 0x3C, 0x7E,
|
||||||
|
0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x10, 0x38, 0x6C, 0x00, 0x3C, 0x7E,
|
||||||
|
0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x32, 0x7E, 0x4C, 0x00, 0x00, 0x3C,
|
||||||
|
0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x6C, 0x6C, 0x00, 0x00, 0x3C,
|
||||||
|
0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x38, 0x70, 0xE0, 0x0F, 0xFF,
|
||||||
|
0xC0, 0x1C, 0x38, 0x70, 0x3F, 0x7E, 0xEF, 0xCB, 0xD3, 0xF7, 0x7E, 0xFC,
|
||||||
|
0x20, 0xE0, 0xE0, 0x80, 0x18, 0xF1, 0xE3, 0xC7, 0x8F, 0x1F, 0xF7, 0xE0,
|
||||||
|
0x08, 0x38, 0xE0, 0x80, 0x18, 0xF1, 0xE3, 0xC7, 0x8F, 0x1F, 0xF7, 0xE0,
|
||||||
|
0x10, 0x71, 0xB0, 0x0C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0xFB, 0xF0, 0x6C,
|
||||||
|
0xD8, 0x00, 0x0C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0xFB, 0xF0, 0x04, 0x07,
|
||||||
|
0x07, 0x01, 0x00, 0x07, 0x1D, 0x8C, 0xC6, 0x77, 0x1B, 0x0F, 0x83, 0x81,
|
||||||
|
0xC0, 0xC3, 0xE1, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0xFE, 0xC7, 0xC3,
|
||||||
|
0xC3, 0xC7, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0, 0x36, 0x1B, 0x00, 0x00, 0x0E,
|
||||||
|
0x3B, 0x19, 0x8C, 0xEE, 0x36, 0x1F, 0x07, 0x03, 0x81, 0x87, 0xC3, 0xC0 };
|
||||||
|
|
||||||
|
const GFXglyph Ubuntu_Bold8pt8bGlyphs[] PROGMEM = {
|
||||||
|
{ 0, 1, 1, 4, 0, 0 }, // 0x20 ' ' U+0020
|
||||||
|
{ 1, 2, 11, 4, 1, -10 }, // 0x21 '!' U+0021
|
||||||
|
{ 4, 5, 5, 7, 1, -11 }, // 0x22 '"' U+0022
|
||||||
|
{ 8, 9, 11, 11, 1, -10 }, // 0x23 '#' U+0023
|
||||||
|
{ 21, 7, 15, 9, 1, -12 }, // 0x24 '$' U+0024
|
||||||
|
{ 35, 14, 11, 16, 1, -10 }, // 0x25 '%' U+0025
|
||||||
|
{ 55, 10, 11, 11, 1, -10 }, // 0x26 '&' U+0026
|
||||||
|
{ 69, 2, 5, 4, 1, -11 }, // 0x27 ''' U+0027
|
||||||
|
{ 71, 4, 16, 6, 1, -12 }, // 0x28 '(' U+0028
|
||||||
|
{ 79, 4, 16, 6, 1, -12 }, // 0x29 ')' U+0029
|
||||||
|
{ 87, 7, 7, 8, 1, -10 }, // 0x2a '*' U+002A
|
||||||
|
{ 94, 8, 8, 10, 1, -8 }, // 0x2b '+' U+002B
|
||||||
|
{ 102, 3, 5, 4, 0, -1 }, // 0x2c ',' U+002C
|
||||||
|
{ 104, 5, 2, 7, 1, -5 }, // 0x2d '-' U+002D
|
||||||
|
{ 106, 3, 3, 5, 1, -2 }, // 0x2e '.' U+002E
|
||||||
|
{ 108, 7, 16, 7, 0, -12 }, // 0x2f '/' U+002F
|
||||||
|
{ 122, 7, 11, 9, 1, -10 }, // 0x30 '0' U+0030
|
||||||
|
{ 132, 5, 11, 9, 1, -10 }, // 0x31 '1' U+0031
|
||||||
|
{ 139, 7, 11, 9, 1, -10 }, // 0x32 '2' U+0032
|
||||||
|
{ 149, 7, 11, 9, 1, -10 }, // 0x33 '3' U+0033
|
||||||
|
{ 159, 8, 11, 9, 1, -10 }, // 0x34 '4' U+0034
|
||||||
|
{ 170, 7, 11, 9, 1, -10 }, // 0x35 '5' U+0035
|
||||||
|
{ 180, 7, 11, 9, 1, -10 }, // 0x36 '6' U+0036
|
||||||
|
{ 190, 7, 11, 9, 1, -10 }, // 0x37 '7' U+0037
|
||||||
|
{ 200, 7, 11, 9, 1, -10 }, // 0x38 '8' U+0038
|
||||||
|
{ 210, 7, 11, 9, 1, -10 }, // 0x39 '9' U+0039
|
||||||
|
{ 220, 3, 9, 5, 1, -8 }, // 0x3a ':' U+003A
|
||||||
|
{ 224, 4, 12, 5, 0, -8 }, // 0x3b ';' U+003B
|
||||||
|
{ 230, 8, 7, 9, 1, -7 }, // 0x3c '<' U+003C
|
||||||
|
{ 237, 8, 6, 10, 1, -7 }, // 0x3d '=' U+003D
|
||||||
|
{ 243, 8, 7, 9, 0, -7 }, // 0x3e '>' U+003E
|
||||||
|
{ 250, 7, 12, 7, 0, -11 }, // 0x3f '?' U+003F
|
||||||
|
{ 261, 14, 14, 16, 1, -10 }, // 0x40 '@' U+0040
|
||||||
|
{ 286, 11, 11, 11, 0, -10 }, // 0x41 'A' U+0041
|
||||||
|
{ 302, 9, 11, 11, 1, -10 }, // 0x42 'B' U+0042
|
||||||
|
{ 315, 9, 11, 11, 1, -10 }, // 0x43 'C' U+0043
|
||||||
|
{ 328, 10, 11, 12, 1, -10 }, // 0x44 'D' U+0044
|
||||||
|
{ 342, 8, 11, 10, 1, -10 }, // 0x45 'E' U+0045
|
||||||
|
{ 353, 8, 11, 9, 1, -10 }, // 0x46 'F' U+0046
|
||||||
|
{ 364, 9, 11, 11, 1, -10 }, // 0x47 'G' U+0047
|
||||||
|
{ 377, 9, 11, 11, 1, -10 }, // 0x48 'H' U+0048
|
||||||
|
{ 390, 2, 11, 4, 1, -10 }, // 0x49 'I' U+0049
|
||||||
|
{ 393, 7, 11, 8, 0, -10 }, // 0x4a 'J' U+004A
|
||||||
|
{ 403, 10, 11, 11, 1, -10 }, // 0x4b 'K' U+004B
|
||||||
|
{ 417, 8, 11, 9, 1, -10 }, // 0x4c 'L' U+004C
|
||||||
|
{ 428, 13, 11, 15, 1, -10 }, // 0x4d 'M' U+004D
|
||||||
|
{ 446, 10, 11, 12, 1, -10 }, // 0x4e 'N' U+004E
|
||||||
|
{ 460, 11, 11, 13, 1, -10 }, // 0x4f 'O' U+004F
|
||||||
|
{ 476, 8, 11, 10, 1, -10 }, // 0x50 'P' U+0050
|
||||||
|
{ 487, 11, 14, 13, 1, -10 }, // 0x51 'Q' U+0051
|
||||||
|
{ 507, 9, 11, 10, 1, -10 }, // 0x52 'R' U+0052
|
||||||
|
{ 520, 7, 11, 9, 1, -10 }, // 0x53 'S' U+0053
|
||||||
|
{ 530, 8, 11, 8, 0, -10 }, // 0x54 'T' U+0054
|
||||||
|
{ 541, 9, 11, 11, 1, -10 }, // 0x55 'U' U+0055
|
||||||
|
{ 554, 11, 11, 11, 0, -10 }, // 0x56 'V' U+0056
|
||||||
|
{ 570, 15, 11, 15, 0, -10 }, // 0x57 'W' U+0057
|
||||||
|
{ 591, 11, 11, 11, 0, -10 }, // 0x58 'X' U+0058
|
||||||
|
{ 607, 10, 11, 10, 0, -10 }, // 0x59 'Y' U+0059
|
||||||
|
{ 621, 8, 11, 10, 1, -10 }, // 0x5a 'Z' U+005A
|
||||||
|
{ 632, 5, 16, 6, 1, -12 }, // 0x5b '[' U+005B
|
||||||
|
{ 642, 7, 16, 7, 0, -12 }, // 0x5c '\' U+005C
|
||||||
|
{ 656, 5, 16, 6, 0, -12 }, // 0x5d ']' U+005D
|
||||||
|
{ 666, 9, 7, 9, 0, -10 }, // 0x5e '^' U+005E
|
||||||
|
{ 674, 8, 2, 8, 0, 2 }, // 0x5f '_' U+005F
|
||||||
|
{ 676, 4, 4, 5, 1, -12 }, // 0x60 '`' U+0060
|
||||||
|
{ 678, 7, 8, 9, 1, -7 }, // 0x61 'a' U+0061
|
||||||
|
{ 685, 7, 12, 9, 1, -11 }, // 0x62 'b' U+0062
|
||||||
|
{ 696, 6, 8, 8, 1, -7 }, // 0x63 'c' U+0063
|
||||||
|
{ 702, 7, 12, 9, 1, -11 }, // 0x64 'd' U+0064
|
||||||
|
{ 713, 7, 8, 9, 1, -7 }, // 0x65 'e' U+0065
|
||||||
|
{ 720, 5, 12, 6, 1, -11 }, // 0x66 'f' U+0066
|
||||||
|
{ 728, 7, 11, 9, 1, -7 }, // 0x67 'g' U+0067
|
||||||
|
{ 738, 7, 12, 9, 1, -11 }, // 0x68 'h' U+0068
|
||||||
|
{ 749, 2, 12, 4, 1, -11 }, // 0x69 'i' U+0069
|
||||||
|
{ 752, 4, 15, 4, -1, -11 }, // 0x6a 'j' U+006A
|
||||||
|
{ 760, 8, 12, 9, 1, -11 }, // 0x6b 'k' U+006B
|
||||||
|
{ 772, 3, 12, 4, 1, -11 }, // 0x6c 'l' U+006C
|
||||||
|
{ 777, 12, 8, 14, 1, -7 }, // 0x6d 'm' U+006D
|
||||||
|
{ 789, 7, 8, 9, 1, -7 }, // 0x6e 'n' U+006E
|
||||||
|
{ 796, 8, 8, 10, 1, -7 }, // 0x6f 'o' U+006F
|
||||||
|
{ 804, 7, 11, 9, 1, -7 }, // 0x70 'p' U+0070
|
||||||
|
{ 814, 7, 11, 9, 1, -7 }, // 0x71 'q' U+0071
|
||||||
|
{ 824, 5, 8, 6, 1, -7 }, // 0x72 'r' U+0072
|
||||||
|
{ 829, 6, 8, 8, 1, -7 }, // 0x73 's' U+0073
|
||||||
|
{ 835, 5, 10, 7, 1, -9 }, // 0x74 't' U+0074
|
||||||
|
{ 842, 7, 8, 9, 1, -7 }, // 0x75 'u' U+0075
|
||||||
|
{ 849, 9, 8, 9, 0, -7 }, // 0x76 'v' U+0076
|
||||||
|
{ 858, 11, 8, 11, 0, -7 }, // 0x77 'w' U+0077
|
||||||
|
{ 869, 9, 8, 9, 0, -7 }, // 0x78 'x' U+0078
|
||||||
|
{ 878, 9, 11, 9, 0, -7 }, // 0x79 'y' U+0079
|
||||||
|
{ 891, 6, 8, 8, 1, -7 }, // 0x7a 'z' U+007A
|
||||||
|
{ 897, 5, 16, 5, 0, -12 }, // 0x7b '{' U+007B
|
||||||
|
{ 907, 2, 16, 4, 1, -12 }, // 0x7c '|' U+007C
|
||||||
|
{ 911, 5, 16, 5, 0, -12 }, // 0x7d '}' U+007D
|
||||||
|
{ 921, 8, 3, 9, 1, -5 }, // 0x7e '~' U+007E
|
||||||
|
{ 924, 6, 12, 8, 1, -11 }, // 0x7f 'REPLACEMENT CHARACTER *' U+2370
|
||||||
|
{ 933, 1, 1, 4, 0, 0 }, // 0x80 'NO-BREAK SPACE' U+00A0
|
||||||
|
{ 934, 2, 11, 4, 1, -7 }, // 0x81 'INVERTED EXCLAMATION MARK' U+00A1
|
||||||
|
{ 937, 6, 12, 9, 1, -9 }, // 0x82 'CENT SIGN' U+00A2
|
||||||
|
{ 946, 8, 11, 9, 0, -10 }, // 0x83 'POUND SIGN' U+00A3
|
||||||
|
{ 957, 8, 8, 9, 0, -8 }, // 0x84 'CURRENCY SIGN' U+00A4
|
||||||
|
{ 965, 8, 11, 8, 0, -10 }, // 0x85 'YEN SIGN' U+00A5
|
||||||
|
{ 976, 2, 16, 5, 1, -12 }, // 0x86 'BROKEN BAR' U+00A6
|
||||||
|
{ 980, 6, 14, 8, 1, -10 }, // 0x87 'SECTION SIGN' U+00A7
|
||||||
|
{ 991, 5, 2, 9, 2, -11 }, // 0x88 'DIAERESIS' U+00A8
|
||||||
|
{ 993, 11, 11, 13, 1, -10 }, // 0x89 'COPYRIGHT SIGN' U+00A9
|
||||||
|
{ 1009, 5, 6, 6, 0, -10 }, // 0x8a 'FEMININE ORDINAL INDICATOR' U+00AA
|
||||||
|
{ 1013, 9, 7, 10, 0, -7 }, // 0x8b 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00AB
|
||||||
|
{ 1021, 7, 6, 9, 1, -6 }, // 0x8c 'NOT SIGN' U+00AC
|
||||||
|
{ 1027, 5, 2, 7, 1, -5 }, // 0x8d 'SOFT HYPHEN' U+00AD
|
||||||
|
{ 1029, 11, 11, 13, 1, -10 }, // 0x8e 'REGISTERED SIGN' U+00AE
|
||||||
|
{ 1045, 5, 2, 6, 0, -11 }, // 0x8f 'MACRON' U+00AF
|
||||||
|
{ 1047, 6, 6, 6, 0, -12 }, // 0x90 'DEGREE SIGN' U+00B0
|
||||||
|
{ 1052, 8, 11, 10, 1, -10 }, // 0x91 'PLUS-MINUS SIGN' U+00B1
|
||||||
|
{ 1063, 5, 6, 6, 0, -10 }, // 0x92 'SUPERSCRIPT TWO' U+00B2
|
||||||
|
{ 1067, 5, 7, 6, 0, -10 }, // 0x93 'SUPERSCRIPT THREE' U+00B3
|
||||||
|
{ 1072, 4, 4, 5, 0, -12 }, // 0x94 'ACUTE ACCENT' U+00B4
|
||||||
|
{ 1074, 7, 11, 9, 1, -7 }, // 0x95 'MICRO SIGN' U+00B5
|
||||||
|
{ 1084, 9, 14, 11, 1, -10 }, // 0x96 'PILCROW SIGN' U+00B6
|
||||||
|
{ 1100, 3, 3, 5, 1, -5 }, // 0x97 'MIDDLE DOT' U+00B7
|
||||||
|
{ 1102, 3, 4, 5, 1, 1 }, // 0x98 'CEDILLA' U+00B8
|
||||||
|
{ 1104, 4, 6, 6, 1, -10 }, // 0x99 'SUPERSCRIPT ONE' U+00B9
|
||||||
|
{ 1107, 6, 6, 8, 1, -10 }, // 0x9a 'MASCULINE ORDINAL INDICATOR' U+00BA
|
||||||
|
{ 1112, 9, 7, 10, 0, -7 }, // 0x9b 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK' U+00BB
|
||||||
|
{ 1120, 13, 11, 14, 1, -10 }, // 0x9c 'VULGAR FRACTION ONE QUARTER' U+00BC
|
||||||
|
{ 1138, 12, 11, 14, 1, -10 }, // 0x9d 'VULGAR FRACTION ONE HALF' U+00BD
|
||||||
|
{ 1155, 14, 11, 14, 0, -10 }, // 0x9e 'VULGAR FRACTION THREE QUARTERS' U+00BE
|
||||||
|
{ 1175, 7, 11, 7, 0, -7 }, // 0x9f 'INVERTED QUESTION MARK' U+00BF
|
||||||
|
{ 1185, 11, 16, 11, 0, -15 }, // 0xa0 'LATIN CAPITAL LETTER A WITH GRAVE' U+00C0
|
||||||
|
{ 1207, 11, 16, 11, 0, -15 }, // 0xa1 'LATIN CAPITAL LETTER A WITH ACUTE' U+00C1
|
||||||
|
{ 1229, 11, 15, 11, 0, -14 }, // 0xa2 'LATIN CAPITAL LETTER A WITH CIRCUMFLEX' U+00C2
|
||||||
|
{ 1250, 11, 16, 11, 0, -15 }, // 0xa3 'LATIN CAPITAL LETTER A WITH TILDE' U+00C3
|
||||||
|
{ 1272, 11, 15, 11, 0, -14 }, // 0xa4 'LATIN CAPITAL LETTER A WITH DIAERESIS' U+00C4
|
||||||
|
{ 1293, 11, 15, 11, 0, -14 }, // 0xa5 'LATIN CAPITAL LETTER A WITH RING ABOVE' U+00C5
|
||||||
|
{ 1314, 15, 11, 16, 0, -10 }, // 0xa6 'LATIN CAPITAL LETTER AE' U+00C6
|
||||||
|
{ 1335, 9, 14, 11, 1, -10 }, // 0xa7 'LATIN CAPITAL LETTER C WITH CEDILLA' U+00C7
|
||||||
|
{ 1351, 8, 16, 10, 1, -15 }, // 0xa8 'LATIN CAPITAL LETTER E WITH GRAVE' U+00C8
|
||||||
|
{ 1367, 8, 16, 10, 1, -15 }, // 0xa9 'LATIN CAPITAL LETTER E WITH ACUTE' U+00C9
|
||||||
|
{ 1383, 8, 15, 10, 1, -14 }, // 0xaa 'LATIN CAPITAL LETTER E WITH CIRCUMFLEX' U+00CA
|
||||||
|
{ 1398, 8, 15, 10, 1, -14 }, // 0xab 'LATIN CAPITAL LETTER E WITH DIAERESIS' U+00CB
|
||||||
|
{ 1413, 4, 16, 4, 0, -15 }, // 0xac 'LATIN CAPITAL LETTER I WITH GRAVE' U+00CC
|
||||||
|
{ 1421, 4, 16, 4, 0, -15 }, // 0xad 'LATIN CAPITAL LETTER I WITH ACUTE' U+00CD
|
||||||
|
{ 1429, 5, 15, 4, 0, -14 }, // 0xae 'LATIN CAPITAL LETTER I WITH CIRCUMFLEX' U+00CE
|
||||||
|
{ 1439, 5, 15, 4, 0, -14 }, // 0xaf 'LATIN CAPITAL LETTER I WITH DIAERESIS' U+00CF
|
||||||
|
{ 1449, 11, 11, 12, 0, -10 }, // 0xb0 'LATIN CAPITAL LETTER ETH' U+00D0
|
||||||
|
{ 1465, 10, 16, 12, 1, -15 }, // 0xb1 'LATIN CAPITAL LETTER N WITH TILDE' U+00D1
|
||||||
|
{ 1485, 11, 16, 13, 1, -15 }, // 0xb2 'LATIN CAPITAL LETTER O WITH GRAVE' U+00D2
|
||||||
|
{ 1507, 11, 16, 13, 1, -15 }, // 0xb3 'LATIN CAPITAL LETTER O WITH ACUTE' U+00D3
|
||||||
|
{ 1529, 11, 15, 13, 1, -14 }, // 0xb4 'LATIN CAPITAL LETTER O WITH CIRCUMFLEX' U+00D4
|
||||||
|
{ 1550, 11, 16, 13, 1, -15 }, // 0xb5 'LATIN CAPITAL LETTER O WITH TILDE' U+00D5
|
||||||
|
{ 1572, 11, 15, 13, 1, -14 }, // 0xb6 'LATIN CAPITAL LETTER O WITH DIAERESIS' U+00D6
|
||||||
|
{ 1593, 7, 7, 9, 1, -7 }, // 0xb7 'MULTIPLICATION SIGN' U+00D7
|
||||||
|
{ 1600, 11, 12, 13, 1, -10 }, // 0xb8 'LATIN CAPITAL LETTER O WITH STROKE' U+00D8
|
||||||
|
{ 1617, 9, 16, 11, 1, -15 }, // 0xb9 'LATIN CAPITAL LETTER U WITH GRAVE' U+00D9
|
||||||
|
{ 1635, 9, 16, 11, 1, -15 }, // 0xba 'LATIN CAPITAL LETTER U WITH ACUTE' U+00DA
|
||||||
|
{ 1653, 9, 15, 11, 1, -14 }, // 0xbb 'LATIN CAPITAL LETTER U WITH CIRCUMFLEX' U+00DB
|
||||||
|
{ 1670, 9, 15, 11, 1, -14 }, // 0xbc 'LATIN CAPITAL LETTER U WITH DIAERESIS' U+00DC
|
||||||
|
{ 1687, 10, 16, 10, 0, -15 }, // 0xbd 'LATIN CAPITAL LETTER Y WITH ACUTE' U+00DD
|
||||||
|
{ 1707, 8, 11, 10, 1, -10 }, // 0xbe 'LATIN CAPITAL LETTER THORN' U+00DE
|
||||||
|
{ 1718, 9, 12, 11, 1, -11 }, // 0xbf 'LATIN SMALL LETTER SHARP S' U+00DF
|
||||||
|
{ 1732, 7, 13, 9, 1, -12 }, // 0xc0 'LATIN SMALL LETTER A WITH GRAVE' U+00E0
|
||||||
|
{ 1744, 7, 13, 9, 1, -12 }, // 0xc1 'LATIN SMALL LETTER A WITH ACUTE' U+00E1
|
||||||
|
{ 1756, 7, 12, 9, 1, -11 }, // 0xc2 'LATIN SMALL LETTER A WITH CIRCUMFLEX' U+00E2
|
||||||
|
{ 1767, 7, 13, 9, 1, -12 }, // 0xc3 'LATIN SMALL LETTER A WITH TILDE' U+00E3
|
||||||
|
{ 1779, 7, 12, 9, 1, -11 }, // 0xc4 'LATIN SMALL LETTER A WITH DIAERESIS' U+00E4
|
||||||
|
{ 1790, 7, 13, 9, 1, -12 }, // 0xc5 'LATIN SMALL LETTER A WITH RING ABOVE' U+00E5
|
||||||
|
{ 1802, 12, 8, 14, 1, -7 }, // 0xc6 'LATIN SMALL LETTER AE' U+00E6
|
||||||
|
{ 1814, 7, 11, 8, 1, -7 }, // 0xc7 'LATIN SMALL LETTER C WITH CEDILLA' U+00E7
|
||||||
|
{ 1824, 7, 13, 9, 1, -12 }, // 0xc8 'LATIN SMALL LETTER E WITH GRAVE' U+00E8
|
||||||
|
{ 1836, 7, 13, 9, 1, -12 }, // 0xc9 'LATIN SMALL LETTER E WITH ACUTE' U+00E9
|
||||||
|
{ 1848, 7, 12, 9, 1, -11 }, // 0xca 'LATIN SMALL LETTER E WITH CIRCUMFLEX' U+00EA
|
||||||
|
{ 1859, 7, 12, 9, 1, -11 }, // 0xcb 'LATIN SMALL LETTER E WITH DIAERESIS' U+00EB
|
||||||
|
{ 1870, 4, 13, 4, 0, -12 }, // 0xcc 'LATIN SMALL LETTER I WITH GRAVE' U+00EC
|
||||||
|
{ 1877, 4, 13, 4, 0, -12 }, // 0xcd 'LATIN SMALL LETTER I WITH ACUTE' U+00ED
|
||||||
|
{ 1884, 5, 12, 4, 0, -11 }, // 0xce 'LATIN SMALL LETTER I WITH CIRCUMFLEX' U+00EE
|
||||||
|
{ 1892, 5, 12, 4, -1, -11 }, // 0xcf 'LATIN SMALL LETTER I WITH DIAERESIS' U+00EF
|
||||||
|
{ 1900, 8, 12, 10, 1, -11 }, // 0xd0 'LATIN SMALL LETTER ETH' U+00F0
|
||||||
|
{ 1912, 7, 13, 9, 1, -12 }, // 0xd1 'LATIN SMALL LETTER N WITH TILDE' U+00F1
|
||||||
|
{ 1924, 8, 13, 10, 1, -12 }, // 0xd2 'LATIN SMALL LETTER O WITH GRAVE' U+00F2
|
||||||
|
{ 1937, 8, 13, 10, 1, -12 }, // 0xd3 'LATIN SMALL LETTER O WITH ACUTE' U+00F3
|
||||||
|
{ 1950, 8, 12, 10, 1, -11 }, // 0xd4 'LATIN SMALL LETTER O WITH CIRCUMFLEX' U+00F4
|
||||||
|
{ 1962, 8, 13, 10, 1, -12 }, // 0xd5 'LATIN SMALL LETTER O WITH TILDE' U+00F5
|
||||||
|
{ 1975, 8, 12, 10, 1, -11 }, // 0xd6 'LATIN SMALL LETTER O WITH DIAERESIS' U+00F6
|
||||||
|
{ 1987, 7, 10, 9, 1, -9 }, // 0xd7 'DIVISION SIGN' U+00F7
|
||||||
|
{ 1996, 8, 8, 10, 1, -7 }, // 0xd8 'LATIN SMALL LETTER O WITH STROKE' U+00F8
|
||||||
|
{ 2004, 7, 13, 9, 1, -12 }, // 0xd9 'LATIN SMALL LETTER U WITH GRAVE' U+00F9
|
||||||
|
{ 2016, 7, 13, 9, 1, -12 }, // 0xda 'LATIN SMALL LETTER U WITH ACUTE' U+00FA
|
||||||
|
{ 2028, 7, 12, 9, 1, -11 }, // 0xdb 'LATIN SMALL LETTER U WITH CIRCUMFLEX' U+00FB
|
||||||
|
{ 2039, 7, 12, 9, 1, -11 }, // 0xdc 'LATIN SMALL LETTER U WITH DIAERESIS' U+00FC
|
||||||
|
{ 2050, 9, 16, 9, 0, -12 }, // 0xdd 'LATIN SMALL LETTER Y WITH ACUTE' U+00FD
|
||||||
|
{ 2068, 8, 15, 10, 1, -11 }, // 0xde 'LATIN SMALL LETTER THORN' U+00FE
|
||||||
|
{ 2083, 9, 15, 9, 0, -11 } }; // 0xdf 'LATIN SMALL LETTER Y WITH DIAERESIS' U+000FF
|
||||||
|
|
||||||
|
const GFXfont Ubuntu_Bold8pt8b PROGMEM = {
|
||||||
|
(uint8_t *)Ubuntu_Bold8pt8bBitmaps,
|
||||||
|
(GFXglyph *)Ubuntu_Bold8pt8bGlyphs,
|
||||||
|
0x20, 0xDF, 18 };
|
||||||
|
|
||||||
|
// Approx. 3451 bytes
|
||||||
@@ -1,130 +1,206 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# A tool to generate that part of config.json that deals with pages and fields.
|
|
||||||
#
|
|
||||||
#Usage: 1. modify this script (e.g.add a page, change number of fields, etc.)
|
|
||||||
# 2. Delete all lines from config.json from the curly backet before "name": "page1type" to o the end of the file (as of today, delete from line 917 to the end of the File)
|
|
||||||
# 3. run ./gen_set.py >> config.json
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
A tool to generate that part of config.json that deals with pages and fields.
|
||||||
|
|
||||||
|
Usage example:
|
||||||
|
|
||||||
|
1. Delete all lines from config.json from the curly backet before
|
||||||
|
"name": "page1type" to the end of the file
|
||||||
|
|
||||||
|
2. run ./gen_set.py -d obp60 -p 10 >> config.json
|
||||||
|
|
||||||
|
TODO Better handling of default pages
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import getopt
|
||||||
|
import re
|
||||||
import json
|
import json
|
||||||
|
|
||||||
# List of all pages and the number of parameters they expect.
|
__version__ = "0.3"
|
||||||
no_of_fields_per_page = {
|
|
||||||
"Wind": 0,
|
|
||||||
"XTETrack": 0,
|
|
||||||
"Battery2": 0,
|
|
||||||
"Battery": 0,
|
|
||||||
"BME280": 0,
|
|
||||||
"Clock": 0,
|
|
||||||
"DST810": 0,
|
|
||||||
"Fluid": 1,
|
|
||||||
"FourValues2": 4,
|
|
||||||
"FourValues": 4,
|
|
||||||
"Generator": 0,
|
|
||||||
"KeelPosition": 0,
|
|
||||||
"OneValue": 1,
|
|
||||||
"RollPitch": 2,
|
|
||||||
"RudderPosition": 0,
|
|
||||||
"Solar": 0,
|
|
||||||
"ThreeValues": 3,
|
|
||||||
"TwoValues": 2,
|
|
||||||
"Voltage": 0,
|
|
||||||
"WhitePage": 0,
|
|
||||||
"WindRose": 0,
|
|
||||||
"WindRoseFlex": 6,
|
|
||||||
# "SixValues" : 6,
|
|
||||||
}
|
|
||||||
|
|
||||||
# No changes needed beyond this point
|
def detect_pages(filename):
|
||||||
# max number of pages supported by OBP60
|
# returns a dictionary with page name and the number of gui fields
|
||||||
no_of_pages = 10
|
pagefiles = []
|
||||||
# Default selection for each page
|
with open(filename, 'r') as fh:
|
||||||
default_pages = [
|
pattern = r'extern PageDescription\s*register(Page[^;\s]*)'
|
||||||
"Voltage",
|
for line in fh:
|
||||||
"WindRose",
|
if "extern PageDescription" in line:
|
||||||
"OneValue",
|
match = re.search(pattern, line)
|
||||||
"TwoValues",
|
if match:
|
||||||
"ThreeValues",
|
pagefiles.append(match.group(1))
|
||||||
"FourValues",
|
try:
|
||||||
"FourValues2",
|
pagefiles.remove('PageSystem')
|
||||||
"Clock",
|
except ValueError:
|
||||||
"RollPitch",
|
pass
|
||||||
"Battery2",
|
pagedata = {}
|
||||||
]
|
for pf in pagefiles:
|
||||||
numbers = [
|
filename = pf + ".cpp"
|
||||||
"one",
|
with open(filename, 'r') as fh:
|
||||||
"two",
|
content = fh.read()
|
||||||
"three",
|
pattern = r'PageDescription\s*?register' + pf + r'\s*\(\s*"([^"]+)".*?\n\s*(\d+)'
|
||||||
"four",
|
match = re.search(pattern, content, re.DOTALL)
|
||||||
"five",
|
if match:
|
||||||
"six",
|
pagedata[match.group(1)] = int(match.group(2))
|
||||||
"seven",
|
return pagedata
|
||||||
"eight",
|
|
||||||
"nine",
|
|
||||||
"ten",
|
|
||||||
]
|
|
||||||
pages = sorted(no_of_fields_per_page.keys())
|
|
||||||
max_no_of_fields_per_page = max(no_of_fields_per_page.values())
|
|
||||||
|
|
||||||
output = []
|
def get_default_page(pageno):
|
||||||
|
# Default selection for each page
|
||||||
|
default_pages = (
|
||||||
|
"Voltage",
|
||||||
|
"WindRose",
|
||||||
|
"OneValue",
|
||||||
|
"TwoValues",
|
||||||
|
"ThreeValues",
|
||||||
|
"FourValues",
|
||||||
|
"FourValues2",
|
||||||
|
"Clock",
|
||||||
|
"RollPitch",
|
||||||
|
"Battery2"
|
||||||
|
)
|
||||||
|
if pageno > len(default_pages):
|
||||||
|
return "OneValue"
|
||||||
|
return default_pages[pageno - 1]
|
||||||
|
|
||||||
for page_no in range(1, no_of_pages + 1):
|
def number_to_text(number):
|
||||||
page_data = {
|
if number < 0 or number > 99:
|
||||||
"name": f"page{page_no}type",
|
raise ValueError("Only numbers from 0 to 99 are allowed.")
|
||||||
"label": "Type",
|
numbers = ("zero", "one", "two", "three", "four", "five", "six", "seven",
|
||||||
"type": "list",
|
"eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
|
||||||
"default": default_pages[page_no - 1],
|
"fifteen", "sixteen", "seventeen", "eighteen", "nineteen")
|
||||||
"description": f"Type of page for page {page_no}",
|
tens = ("", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy",
|
||||||
"list": pages,
|
"eighty", "ninety")
|
||||||
"category": f"OBP60 Page {page_no}",
|
if number < 20:
|
||||||
"capabilities": {"obp60": "true"},
|
return numbers[number]
|
||||||
"condition": [{"visiblePages": vp} for vp in range(page_no, no_of_pages + 1)],
|
else:
|
||||||
#"fields": [],
|
q, r = divmod(number, 10)
|
||||||
}
|
return tens[q] + numbers[r]
|
||||||
output.append(page_data)
|
|
||||||
|
|
||||||
for field_no in range(1, max_no_of_fields_per_page + 1):
|
def create_json(device, no_of_pages, pagedata):
|
||||||
field_data = {
|
|
||||||
"name": f"page{page_no}value{field_no}",
|
pages = sorted(pagedata.keys())
|
||||||
"label": f"Field {field_no}",
|
max_no_of_fields_per_page = max(pagedata.values())
|
||||||
"type": "boatData",
|
|
||||||
"default": "",
|
output = []
|
||||||
"description": f"The display for field {numbers[field_no - 1]}",
|
|
||||||
"category": f"OBP60 Page {page_no}",
|
for page_no in range(1, no_of_pages + 1):
|
||||||
"capabilities": {"obp60": "true"},
|
|
||||||
"condition": [
|
category = f"{device.upper()} Page {page_no}"
|
||||||
{f"page{page_no}type": page}
|
capabilities = {device.lower(): "true"}
|
||||||
for page in pages
|
visiblepages = [str(vp) for vp in range(page_no, no_of_pages + 1)]
|
||||||
if no_of_fields_per_page[page] >= field_no
|
|
||||||
],
|
page_data = {
|
||||||
|
"name": f"page{page_no}type",
|
||||||
|
"label": "Type",
|
||||||
|
"type": "list",
|
||||||
|
"default": get_default_page(page_no),
|
||||||
|
"description": f"Type of page for page {page_no}",
|
||||||
|
"list": pages,
|
||||||
|
"category": category,
|
||||||
|
"capabilities": {device.lower(): "true"},
|
||||||
|
"condition": {
|
||||||
|
"visiblePages": visiblepages
|
||||||
|
},
|
||||||
|
#"fields": [],
|
||||||
}
|
}
|
||||||
output.append(field_data)
|
output.append(page_data)
|
||||||
|
|
||||||
fluid_data ={
|
for field_no in range(1, max_no_of_fields_per_page + 1):
|
||||||
"name": f"page{page_no}fluid",
|
field_data = {
|
||||||
"label": "Fluid type",
|
"name": f"page{page_no}value{field_no}",
|
||||||
"type": "list",
|
"label": f"Field {field_no}",
|
||||||
"default": "0",
|
"type": "boatData",
|
||||||
"list": [
|
"default": "",
|
||||||
{"l":"Fuel (0)","v":"0"},
|
"description": "The display for field {}".format(number_to_text(field_no)),
|
||||||
{"l":"Water (1)","v":"1"},
|
"category": category,
|
||||||
{"l":"Gray Water (2)","v":"2"},
|
"capabilities": capabilities,
|
||||||
{"l":"Live Well (3)","v":"3"},
|
"condition": {
|
||||||
{"l":"Oil (4)","v":"4"},
|
f"page{page_no}type": [ p for p in pages if pagedata[p] >= field_no ]
|
||||||
{"l":"Black Water (5)","v":"5"},
|
,"visiblePages": visiblepages
|
||||||
{"l":"Fuel Gasoline (6)","v":"6"}
|
}
|
||||||
],
|
}
|
||||||
"description": "Fluid type in tank",
|
output.append(field_data)
|
||||||
"category": f"OBP60 Page {page_no}",
|
|
||||||
"capabilities": {
|
|
||||||
"obp60":"true"
|
|
||||||
},
|
|
||||||
"condition":[{f"page{page_no}type":"Fluid"}]
|
|
||||||
}
|
|
||||||
output.append(fluid_data)
|
|
||||||
|
|
||||||
json_output = json.dumps(output, indent=4)
|
fluid_data = {
|
||||||
# print omitting first and last line containing [ ] of JSON array
|
"name": f"page{page_no}fluid",
|
||||||
#print(json_output[1:-1])
|
"label": "Fluid type",
|
||||||
# print omitting first line containing [ of JSON array
|
"type": "list",
|
||||||
print(json_output[1:])
|
"default": "0",
|
||||||
# print(",")
|
"list": [
|
||||||
|
{"l":"Fuel (0)","v":"0"},
|
||||||
|
{"l":"Water (1)","v":"1"},
|
||||||
|
{"l":"Gray Water (2)","v":"2"},
|
||||||
|
{"l":"Live Well (3)","v":"3"},
|
||||||
|
{"l":"Oil (4)","v":"4"},
|
||||||
|
{"l":"Black Water (5)","v":"5"},
|
||||||
|
{"l":"Fuel Gasoline (6)","v":"6"}
|
||||||
|
],
|
||||||
|
"description": "Fluid type in tank",
|
||||||
|
"category": category,
|
||||||
|
"capabilities": capabilities,
|
||||||
|
"condition": {
|
||||||
|
f"page{page_no}type": "Fluid",
|
||||||
|
"visiblePages": visiblepages
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output.append(fluid_data)
|
||||||
|
|
||||||
|
if device.upper() == 'OBP40':
|
||||||
|
windsource = {
|
||||||
|
"name": f"page{page_no}wndsrc",
|
||||||
|
"label": "Wind source",
|
||||||
|
"type": "list",
|
||||||
|
"default": "True wind",
|
||||||
|
"description": f"Wind source for page {page_no}: [true|apparent]",
|
||||||
|
"list": [
|
||||||
|
"True wind",
|
||||||
|
"Apparent wind"
|
||||||
|
],
|
||||||
|
"category": category,
|
||||||
|
"capabilities": capabilities,
|
||||||
|
"condition": {
|
||||||
|
f"page{page_no}type": "WindPlot",
|
||||||
|
"visiblePages": visiblepages
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output.append(windsource)
|
||||||
|
|
||||||
|
return json.dumps(output, indent=4)
|
||||||
|
|
||||||
|
def usage():
|
||||||
|
print("{} v{}".format(os.path.basename(__file__), __version__))
|
||||||
|
print()
|
||||||
|
print("Command line options")
|
||||||
|
print(" -d --device device name to use e.g. obp60")
|
||||||
|
print(" -p --pages number of pages to create")
|
||||||
|
print(" -h show this help")
|
||||||
|
print()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
options, remainder = getopt.getopt(sys.argv[1:], 'd:p:', ['device=','--pages='])
|
||||||
|
except getopt.GetoptError as err:
|
||||||
|
print(err)
|
||||||
|
usage()
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
|
device = "obp60"
|
||||||
|
no_of_pages = 10
|
||||||
|
for opt, arg in options:
|
||||||
|
if opt in ('-d', '--device'):
|
||||||
|
device = arg
|
||||||
|
elif opt in ('-p', '--pages'):
|
||||||
|
no_of_pages = int(arg)
|
||||||
|
elif opt == '-h':
|
||||||
|
usage()
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
# automatic detect pages and number of fields from sourcecode
|
||||||
|
pagedata = detect_pages("obp60task.cpp")
|
||||||
|
|
||||||
|
json_output = create_json(device, no_of_pages, pagedata)
|
||||||
|
# print omitting first line containing [ of JSON array
|
||||||
|
print(json_output[1:])
|
||||||
|
|||||||
1253
lib/obp60task/images/OBP40_400x300.xbm
Normal file
1253
lib/obp60task/images/OBP40_400x300.xbm
Normal file
File diff suppressed because it is too large
Load Diff
1253
lib/obp60task/images/OBP60_400x300.xbm
Normal file
1253
lib/obp60task/images/OBP60_400x300.xbm
Normal file
File diff suppressed because it is too large
Load Diff
1253
lib/obp60task/images/OBP_400x300.xbm
Normal file
1253
lib/obp60task/images/OBP_400x300.xbm
Normal file
File diff suppressed because it is too large
Load Diff
14
lib/obp60task/index.js
Normal file
14
lib/obp60task/index.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
// Add a new register card in web configuration interface
|
||||||
|
// This is a Java Script!
|
||||||
|
(function(){
|
||||||
|
const api=window.esp32nmea2k;
|
||||||
|
if (! api) return;
|
||||||
|
const tabName="Screen";
|
||||||
|
api.registerListener((id, data) => {
|
||||||
|
// if (!data.testboard) return; //do nothing if we are not active
|
||||||
|
let page = api.addTabPage(tabName, "Screen");
|
||||||
|
api.addEl('button', '', page, 'Screenshot').addEventListener('click', function (ev) {
|
||||||
|
window.open('/api/user/OBP60Task/screenshot', 'screenshot');
|
||||||
|
})
|
||||||
|
}, api.EVENTS.init);
|
||||||
|
})();
|
||||||
@@ -12,17 +12,14 @@
|
|||||||
#include <GxEPD2_BW.h> // GxEPD2 lib for b/w E-Ink displays
|
#include <GxEPD2_BW.h> // GxEPD2 lib for b/w E-Ink displays
|
||||||
#include "OBP60Extensions.h" // Functions lib for extension board
|
#include "OBP60Extensions.h" // Functions lib for extension board
|
||||||
#include "OBP60Keypad.h" // Functions for keypad
|
#include "OBP60Keypad.h" // Functions for keypad
|
||||||
|
#include "BoatDataCalibration.h" // Functions lib for data instance calibration
|
||||||
|
#include "OBPDataOperations.h" // Functions lib for data operations such as true wind calculation
|
||||||
|
|
||||||
#ifdef BOARD_OBP40S3
|
#ifdef BOARD_OBP40S3
|
||||||
#include "driver/rtc_io.h" // Needs for weakup from deep sleep
|
#include "driver/rtc_io.h" // Needs for weakup from deep sleep
|
||||||
#include <FS.h> // SD-Card access
|
|
||||||
#include <SD.h>
|
|
||||||
#include <SPI.h>
|
#include <SPI.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// True type character sets includes
|
|
||||||
// See OBP60ExtensionPort.cpp
|
|
||||||
|
|
||||||
// Pictures
|
// Pictures
|
||||||
//#include GxEPD_BitmapExamples // Example picture
|
//#include GxEPD_BitmapExamples // Example picture
|
||||||
#include "MFD_OBP60_400x300_sw.h" // MFD with logo
|
#include "MFD_OBP60_400x300_sw.h" // MFD with logo
|
||||||
@@ -31,7 +28,6 @@
|
|||||||
#include "OBP60QRWiFi.h" // Functions lib for WiFi QR code
|
#include "OBP60QRWiFi.h" // Functions lib for WiFi QR code
|
||||||
#include "OBPSensorTask.h" // Functions lib for sensor data
|
#include "OBPSensorTask.h" // Functions lib for sensor data
|
||||||
|
|
||||||
|
|
||||||
// Global vars
|
// Global vars
|
||||||
bool initComplete = false; // Initialization complete
|
bool initComplete = false; // Initialization complete
|
||||||
int taskRunCounter = 0; // Task couter for loop section
|
int taskRunCounter = 0; // Task couter for loop section
|
||||||
@@ -44,63 +40,23 @@ void OBP60Init(GwApi *api){
|
|||||||
GwConfigHandler *config = api->getConfig();
|
GwConfigHandler *config = api->getConfig();
|
||||||
|
|
||||||
// Set a new device name and hidden the original name in the main config
|
// Set a new device name and hidden the original name in the main config
|
||||||
String devicename = api->getConfig()->getConfigItem(api->getConfig()->deviceName,true)->asString();
|
String devicename = config->getConfigItem(config->deviceName, true)->asString();
|
||||||
api->getConfig()->setValue(GwConfigDefinitions::systemName, devicename, GwConfigInterface::ConfigType::HIDDEN);
|
config->setValue(GwConfigDefinitions::systemName, devicename, GwConfigInterface::ConfigType::HIDDEN);
|
||||||
|
|
||||||
|
logger->prefix = devicename + ":";
|
||||||
|
logger->logDebug(GwLog::LOG,"obp60init running");
|
||||||
|
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"obp60init running");
|
|
||||||
|
|
||||||
// Check I2C devices
|
// Check I2C devices
|
||||||
|
|
||||||
|
// Init power
|
||||||
|
String powermode = config->getConfigItem(config->powerMode,true)->asString();
|
||||||
|
logger->logDebug(GwLog::DEBUG, "Power Mode is: %s", powermode.c_str());
|
||||||
|
powerInit(powermode);
|
||||||
|
|
||||||
// Init hardware
|
// Init hardware
|
||||||
hardwareInit(api);
|
hardwareInit(api);
|
||||||
|
|
||||||
// Init power rail 5.0V
|
#ifdef BOARD_OBP40S3
|
||||||
String powermode = api->getConfig()->getConfigItem(api->getConfig()->powerMode,true)->asString();
|
|
||||||
api->getLogger()->logDebug(GwLog::DEBUG,"Power Mode is: %s", powermode.c_str());
|
|
||||||
if(powermode == "Max Power" || powermode == "Only 5.0V"){
|
|
||||||
#ifdef HARDWARE_V21
|
|
||||||
setPortPin(OBP_POWER_50, true); // Power on 5.0V rail
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
setPortPin(OBP_POWER_EPD, true);// Power on ePaper display
|
|
||||||
setPortPin(OBP_POWER_SD, true); // Power on SD card
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
#ifdef HARDWARE_V21
|
|
||||||
setPortPin(OBP_POWER_50, false); // Power off 5.0V rail
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
setPortPin(OBP_POWER_EPD, false);// Power off ePaper display
|
|
||||||
setPortPin(OBP_POWER_SD, false); // Power off SD card
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
String sdcard = config->getConfigItem(config->useSDCard, true)->asString();
|
|
||||||
if (sdcard == "on") {
|
|
||||||
SPIClass SD_SPI = SPIClass(HSPI);
|
|
||||||
SD_SPI.begin(SD_SPI_CLK, SD_SPI_MISO, SD_SPI_MOSI);
|
|
||||||
if (SD.begin(SD_SPI_CS, SD_SPI, 80000000)) {
|
|
||||||
String sdtype = "unknown";
|
|
||||||
uint8_t cardType = SD.cardType();
|
|
||||||
switch (cardType) {
|
|
||||||
case CARD_MMC:
|
|
||||||
sdtype = "MMC";
|
|
||||||
break;
|
|
||||||
case CARD_SD:
|
|
||||||
sdtype = "SDSC";
|
|
||||||
break;
|
|
||||||
case CARD_SDHC:
|
|
||||||
sdtype = "SDHC";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
uint64_t cardSize = SD.cardSize() / (1024 * 1024);
|
|
||||||
LOG_DEBUG(GwLog::LOG,"SD card type %s of size %d MB detected", sdtype, cardSize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deep sleep wakeup configuration
|
// Deep sleep wakeup configuration
|
||||||
esp_sleep_enable_ext0_wakeup(OBP_WAKEWUP_PIN, 0); // 1 = High, 0 = Low
|
esp_sleep_enable_ext0_wakeup(OBP_WAKEWUP_PIN, 0); // 1 = High, 0 = Low
|
||||||
rtc_gpio_pullup_en(OBP_WAKEWUP_PIN); // Activate pullup resistor
|
rtc_gpio_pullup_en(OBP_WAKEWUP_PIN); // Activate pullup resistor
|
||||||
@@ -109,7 +65,7 @@ void OBP60Init(GwApi *api){
|
|||||||
|
|
||||||
// Settings for e-paper display
|
// Settings for e-paper display
|
||||||
String fastrefresh = api->getConfig()->getConfigItem(api->getConfig()->fastRefresh,true)->asString();
|
String fastrefresh = api->getConfig()->getConfigItem(api->getConfig()->fastRefresh,true)->asString();
|
||||||
api->getLogger()->logDebug(GwLog::DEBUG,"Fast Refresh Mode is: %s", fastrefresh.c_str());
|
logger->logDebug(GwLog::DEBUG, "Fast Refresh Mode is: %s", fastrefresh.c_str());
|
||||||
#ifdef DISPLAY_GDEY042T81
|
#ifdef DISPLAY_GDEY042T81
|
||||||
if(fastrefresh == "true"){
|
if(fastrefresh == "true"){
|
||||||
static const bool useFastFullUpdate = true; // Enable fast full display update only for GDEY042T81
|
static const bool useFastFullUpdate = true; // Enable fast full display update only for GDEY042T81
|
||||||
@@ -128,11 +84,11 @@ void OBP60Init(GwApi *api){
|
|||||||
|
|
||||||
// Get CPU speed
|
// Get CPU speed
|
||||||
int freq = getCpuFrequencyMhz();
|
int freq = getCpuFrequencyMhz();
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"CPU speed at boot: %i MHz", freq);
|
logger->logDebug(GwLog::LOG,"CPU speed at boot: %i MHz", freq);
|
||||||
|
|
||||||
// Settings for backlight
|
// Settings for backlight
|
||||||
String backlightMode = api->getConfig()->getConfigItem(api->getConfig()->backlight,true)->asString();
|
String backlightMode = api->getConfig()->getConfigItem(api->getConfig()->backlight,true)->asString();
|
||||||
api->getLogger()->logDebug(GwLog::DEBUG,"Backlight Mode is: %s", backlightMode.c_str());
|
logger->logDebug(GwLog::DEBUG,"Backlight Mode is: %s", backlightMode.c_str());
|
||||||
uint brightness = uint(api->getConfig()->getConfigItem(api->getConfig()->blBrightness,true)->asInt());
|
uint brightness = uint(api->getConfig()->getConfigItem(api->getConfig()->blBrightness,true)->asInt());
|
||||||
String backlightColor = api->getConfig()->getConfigItem(api->getConfig()->blColor,true)->asString();
|
String backlightColor = api->getConfig()->getConfigItem(api->getConfig()->blColor,true)->asString();
|
||||||
if(String(backlightMode) == "On"){
|
if(String(backlightMode) == "On"){
|
||||||
@@ -147,7 +103,7 @@ void OBP60Init(GwApi *api){
|
|||||||
|
|
||||||
// Settings flash LED mode
|
// Settings flash LED mode
|
||||||
String ledMode = api->getConfig()->getConfigItem(api->getConfig()->flashLED,true)->asString();
|
String ledMode = api->getConfig()->getConfigItem(api->getConfig()->flashLED,true)->asString();
|
||||||
api->getLogger()->logDebug(GwLog::DEBUG,"LED Mode is: %s", ledMode.c_str());
|
logger->logDebug(GwLog::DEBUG,"LED Mode is: %s", ledMode.c_str());
|
||||||
if(String(ledMode) == "Off"){
|
if(String(ledMode) == "Off"){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
}
|
}
|
||||||
@@ -165,8 +121,8 @@ void OBP60Init(GwApi *api){
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
int page0=0;
|
int page0=0;
|
||||||
QueueHandle_t queue;
|
QueueHandle_t queue;
|
||||||
GwLog* logger = NULL;
|
GwLog* logger = nullptr;
|
||||||
// GwApi* api = NULL;
|
// GwApi* api = nullptr;
|
||||||
uint sensitivity = 100;
|
uint sensitivity = 100;
|
||||||
bool use_syspage = true;
|
bool use_syspage = true;
|
||||||
} MyData;
|
} MyData;
|
||||||
@@ -191,45 +147,37 @@ void keyboardTask(void *param){
|
|||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
class BoatValueList{
|
// Scorgan: moved class declaration to header file <obp60task.h> to make class available to other functions
|
||||||
public:
|
// --- Class BoatValueList --------------
|
||||||
static const int MAXVALUES=100;
|
bool BoatValueList::addValueToList(GwApi::BoatValue *v){
|
||||||
//we create a list containing all our BoatValues
|
for (int i=0;i<numValues;i++){
|
||||||
//this is the list we later use to let the api fill all the values
|
if (allBoatValues[i] == v){
|
||||||
//additionally we put the necessary values into the paga data - see below
|
//already in list...
|
||||||
GwApi::BoatValue *allBoatValues[MAXVALUES];
|
return true;
|
||||||
int numValues=0;
|
|
||||||
|
|
||||||
bool addValueToList(GwApi::BoatValue *v){
|
|
||||||
for (int i=0;i<numValues;i++){
|
|
||||||
if (allBoatValues[i] == v){
|
|
||||||
//already in list...
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (numValues >= MAXVALUES) return false;
|
|
||||||
allBoatValues[numValues]=v;
|
|
||||||
numValues++;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
//helper to ensure that each BoatValue is only queried once
|
if (numValues >= MAXVALUES) return false;
|
||||||
GwApi::BoatValue *findValueOrCreate(String name){
|
allBoatValues[numValues]=v;
|
||||||
for (int i=0;i<numValues;i++){
|
numValues++;
|
||||||
if (allBoatValues[i]->getName() == name) {
|
return true;
|
||||||
return allBoatValues[i];
|
}
|
||||||
}
|
//helper to ensure that each BoatValue is only queried once
|
||||||
|
GwApi::BoatValue *BoatValueList::findValueOrCreate(String name){
|
||||||
|
for (int i=0;i<numValues;i++){
|
||||||
|
if (allBoatValues[i]->getName() == name) {
|
||||||
|
return allBoatValues[i];
|
||||||
}
|
}
|
||||||
GwApi::BoatValue *rt=new GwApi::BoatValue(name);
|
|
||||||
addValueToList(rt);
|
|
||||||
return rt;
|
|
||||||
}
|
}
|
||||||
};
|
GwApi::BoatValue *rt=new GwApi::BoatValue(name);
|
||||||
|
addValueToList(rt);
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
|
// --- Class BoatValueList --------------
|
||||||
|
|
||||||
//we want to have a list that has all our page definitions
|
//we want to have a list that has all our page definitions
|
||||||
//this way each page can easily be added here
|
//this way each page can easily be added here
|
||||||
//needs some minor tricks for the safe static initialization
|
//needs some minor tricks for the safe static initialization
|
||||||
typedef std::vector<PageDescription*> Pages;
|
typedef std::vector<PageDescription*> Pages;
|
||||||
//the page list class
|
|
||||||
class PageList{
|
class PageList{
|
||||||
public:
|
public:
|
||||||
Pages pages;
|
Pages pages;
|
||||||
@@ -266,22 +214,28 @@ void registerAllPages(PageList &list){
|
|||||||
list.add(®isterPageTwoValues);
|
list.add(®isterPageTwoValues);
|
||||||
extern PageDescription registerPageThreeValues;
|
extern PageDescription registerPageThreeValues;
|
||||||
list.add(®isterPageThreeValues);
|
list.add(®isterPageThreeValues);
|
||||||
|
extern PageDescription registerPageSixValues;
|
||||||
|
list.add(®isterPageSixValues);
|
||||||
extern PageDescription registerPageFourValues;
|
extern PageDescription registerPageFourValues;
|
||||||
list.add(®isterPageFourValues);
|
list.add(®isterPageFourValues);
|
||||||
extern PageDescription registerPageFourValues2;
|
extern PageDescription registerPageFourValues2;
|
||||||
list.add(®isterPageFourValues2);
|
list.add(®isterPageFourValues2);
|
||||||
extern PageDescription registerPageWind;
|
extern PageDescription registerPageWind;
|
||||||
list.add(®isterPageWind);
|
list.add(®isterPageWind);
|
||||||
|
extern PageDescription registerPageWindPlot;
|
||||||
|
list.add(®isterPageWindPlot);
|
||||||
extern PageDescription registerPageWindRose;
|
extern PageDescription registerPageWindRose;
|
||||||
list.add(®isterPageWindRose);
|
list.add(®isterPageWindRose);
|
||||||
extern PageDescription registerPageWindRoseFlex;
|
extern PageDescription registerPageWindRoseFlex;
|
||||||
list.add(®isterPageWindRoseFlex); //
|
list.add(®isterPageWindRoseFlex);
|
||||||
extern PageDescription registerPageVoltage;
|
extern PageDescription registerPageVoltage;
|
||||||
list.add(®isterPageVoltage);
|
list.add(®isterPageVoltage);
|
||||||
extern PageDescription registerPageDST810;
|
extern PageDescription registerPageDST810;
|
||||||
list.add(®isterPageDST810);
|
list.add(®isterPageDST810);
|
||||||
extern PageDescription registerPageClock;
|
extern PageDescription registerPageClock;
|
||||||
list.add(®isterPageClock);
|
list.add(®isterPageClock);
|
||||||
|
extern PageDescription registerPageCompass;
|
||||||
|
list.add(®isterPageCompass);
|
||||||
extern PageDescription registerPageWhite;
|
extern PageDescription registerPageWhite;
|
||||||
list.add(®isterPageWhite);
|
list.add(®isterPageWhite);
|
||||||
extern PageDescription registerPageBME280;
|
extern PageDescription registerPageBME280;
|
||||||
@@ -304,67 +258,71 @@ void registerAllPages(PageList &list){
|
|||||||
list.add(®isterPageXTETrack);
|
list.add(®isterPageXTETrack);
|
||||||
extern PageDescription registerPageFluid;
|
extern PageDescription registerPageFluid;
|
||||||
list.add(®isterPageFluid);
|
list.add(®isterPageFluid);
|
||||||
|
extern PageDescription registerPageSkyView;
|
||||||
|
list.add(®isterPageSkyView);
|
||||||
|
extern PageDescription registerPageNavigation;
|
||||||
|
list.add(®isterPageNavigation);
|
||||||
|
extern PageDescription registerPageDigitalOut;
|
||||||
|
list.add(®isterPageDigitalOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Undervoltage detection for shutdown display
|
// Undervoltage detection for shutdown display
|
||||||
void underVoltageDetection(GwApi *api, CommonData &common){
|
void underVoltageError(CommonData &common) {
|
||||||
// Read settings
|
#if defined VOLTAGE_SENSOR && defined LIPO_ACCU_1200
|
||||||
double voffset = (api->getConfig()->getConfigItem(api->getConfig()->vOffset,true)->asString()).toFloat();
|
// Switch off all power lines
|
||||||
double vslope = (api->getConfig()->getConfigItem(api->getConfig()->vSlope,true)->asString()).toFloat();
|
setPortPin(OBP_BACKLIGHT_LED, false); // Backlight Off
|
||||||
|
setFlashLED(false); // Flash LED Off
|
||||||
|
buzzer(TONE4, 20); // Buzzer tone 4kHz 20ms
|
||||||
|
// Shutdown EInk display
|
||||||
|
getdisplay().setFullWindow(); // Set full Refresh
|
||||||
|
//getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
getdisplay().fillScreen(common.bgcolor);// Clear screen
|
||||||
|
getdisplay().setTextColor(common.fgcolor);
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
|
getdisplay().setCursor(65, 150);
|
||||||
|
getdisplay().print("Undervoltage");
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
getdisplay().setCursor(65, 175);
|
||||||
|
getdisplay().print("Charge battery and restart system");
|
||||||
|
getdisplay().nextPage(); // Partial update
|
||||||
|
getdisplay().powerOff(); // Display power off
|
||||||
|
setPortPin(OBP_POWER_EPD, false); // Power off ePaper display
|
||||||
|
setPortPin(OBP_POWER_SD, false); // Power off SD card
|
||||||
|
#else
|
||||||
|
// Switch off all power lines
|
||||||
|
setPortPin(OBP_BACKLIGHT_LED, false); // Backlight Off
|
||||||
|
setFlashLED(false); // Flash LED Off
|
||||||
|
buzzer(TONE4, 20); // Buzzer tone 4kHz 20ms
|
||||||
|
setPortPin(OBP_POWER_50, false); // Power rail 5.0V Off
|
||||||
|
// Shutdown EInk display
|
||||||
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
getdisplay().fillScreen(common.bgcolor);// Clear screen
|
||||||
|
getdisplay().setTextColor(common.fgcolor);
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold20pt8b);
|
||||||
|
getdisplay().setCursor(65, 150);
|
||||||
|
getdisplay().print("Undervoltage");
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
getdisplay().setCursor(65, 175);
|
||||||
|
getdisplay().print("To wake up repower system");
|
||||||
|
getdisplay().nextPage(); // Partial update
|
||||||
|
getdisplay().powerOff(); // Display power off
|
||||||
|
#endif
|
||||||
|
while (true) {
|
||||||
|
esp_deep_sleep_start(); // Deep Sleep without wakeup. Wakeup only after power cycle (restart).
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool underVoltageDetection(float voffset, float vslope) {
|
||||||
// Read supply voltage
|
// Read supply voltage
|
||||||
#if defined VOLTAGE_SENSOR && defined LIPO_ACCU_1200
|
#if defined VOLTAGE_SENSOR && defined LIPO_ACCU_1200
|
||||||
float actVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.53) * 2; // Vin = 1/2 for OBP40
|
float actVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.53) * 2; // Vin = 1/2 for OBP40
|
||||||
float minVoltage = 3.65; // Absolut minimum volatge for 3,7V LiPo accu
|
float minVoltage = 3.65; // Absolut minimum volatge for 3,7V LiPo accu
|
||||||
#else
|
#else
|
||||||
float actVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.17) * 20; // Vin = 1/20 for OBP60
|
float actVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.17) * 20; // Vin = 1/20 for OBP60
|
||||||
float minVoltage = MIN_VOLTAGE;
|
float minVoltage = MIN_VOLTAGE;
|
||||||
#endif
|
#endif
|
||||||
double calVoltage = actVoltage * vslope + voffset; // Calibration
|
float calVoltage = actVoltage * vslope + voffset; // Calibration
|
||||||
if(calVoltage < minVoltage){
|
return (calVoltage < minVoltage);
|
||||||
#if defined VOLTAGE_SENSOR && defined LIPO_ACCU_1200
|
|
||||||
// Switch off all power lines
|
|
||||||
setPortPin(OBP_BACKLIGHT_LED, false); // Backlight Off
|
|
||||||
setFlashLED(false); // Flash LED Off
|
|
||||||
buzzer(TONE4, 20); // Buzzer tone 4kHz 20ms
|
|
||||||
// Shutdown EInk display
|
|
||||||
getdisplay().setFullWindow(); // Set full Refresh
|
|
||||||
//getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
|
||||||
getdisplay().fillScreen(common.bgcolor);// Clear screen
|
|
||||||
getdisplay().setTextColor(common.fgcolor);
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
|
||||||
getdisplay().setCursor(65, 150);
|
|
||||||
getdisplay().print("Undervoltage");
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
|
||||||
getdisplay().setCursor(65, 175);
|
|
||||||
getdisplay().print("Charge battery and restart system");
|
|
||||||
getdisplay().nextPage(); // Partial update
|
|
||||||
getdisplay().powerOff(); // Display power off
|
|
||||||
setPortPin(OBP_POWER_EPD, false); // Power off ePaper display
|
|
||||||
setPortPin(OBP_POWER_SD, false); // Power off SD card
|
|
||||||
#else
|
|
||||||
// Switch off all power lines
|
|
||||||
setPortPin(OBP_BACKLIGHT_LED, false); // Backlight Off
|
|
||||||
setFlashLED(false); // Flash LED Off
|
|
||||||
buzzer(TONE4, 20); // Buzzer tone 4kHz 20ms
|
|
||||||
setPortPin(OBP_POWER_50, false); // Power rail 5.0V Off
|
|
||||||
// Shutdown EInk display
|
|
||||||
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
|
||||||
getdisplay().fillScreen(common.bgcolor);// Clear screen
|
|
||||||
getdisplay().setTextColor(common.fgcolor);
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold20pt7b);
|
|
||||||
getdisplay().setCursor(65, 150);
|
|
||||||
getdisplay().print("Undervoltage");
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
|
||||||
getdisplay().setCursor(65, 175);
|
|
||||||
getdisplay().print("To wake up repower system");
|
|
||||||
getdisplay().nextPage(); // Partial update
|
|
||||||
getdisplay().powerOff(); // Display power off
|
|
||||||
#endif
|
|
||||||
// Stop system
|
|
||||||
while(true){
|
|
||||||
esp_deep_sleep_start(); // Deep Sleep without weakup. Weakup only after power cycle (restart).
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OBP60 Task
|
// OBP60 Task
|
||||||
@@ -416,7 +374,7 @@ void OBP60Task(GwApi *api){
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISPLAY_GDEY042T81
|
#ifdef DISPLAY_GDEY042T81
|
||||||
getdisplay().init(115200, true, 2, false); // Use this for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
||||||
#else
|
#else
|
||||||
getdisplay().init(115200); // Init for normal displays
|
getdisplay().init(115200); // Init for normal displays
|
||||||
#endif
|
#endif
|
||||||
@@ -477,6 +435,8 @@ void OBP60Task(GwApi *api){
|
|||||||
int lastPage=pageNumber;
|
int lastPage=pageNumber;
|
||||||
|
|
||||||
BoatValueList boatValues; //all the boat values for the api query
|
BoatValueList boatValues; //all the boat values for the api query
|
||||||
|
HstryBuf hstryBufList(1920); // Create ring buffers for history storage of some boat data (1920 seconds = 32 minutes)
|
||||||
|
WindUtils trueWind(&boatValues); // Create helper object for true wind calculation
|
||||||
//commonData.distanceformat=config->getString(xxx);
|
//commonData.distanceformat=config->getString(xxx);
|
||||||
//add all necessary data to common data
|
//add all necessary data to common data
|
||||||
|
|
||||||
@@ -500,6 +460,7 @@ void OBP60Task(GwApi *api){
|
|||||||
pages[i].page=description->creator(commonData);
|
pages[i].page=description->creator(commonData);
|
||||||
pages[i].parameters.pageName=pageType;
|
pages[i].parameters.pageName=pageType;
|
||||||
pages[i].parameters.pageNumber = i + 1;
|
pages[i].parameters.pageNumber = i + 1;
|
||||||
|
pages[i].parameters.api = api;
|
||||||
LOG_DEBUG(GwLog::DEBUG,"found page %s for number %d",pageType.c_str(),i);
|
LOG_DEBUG(GwLog::DEBUG,"found page %s for number %d",pageType.c_str(),i);
|
||||||
//fill in all the user defined parameters
|
//fill in all the user defined parameters
|
||||||
for (int uid=0;uid<description->userParam;uid++){
|
for (int uid=0;uid<description->userParam;uid++){
|
||||||
@@ -518,10 +479,22 @@ void OBP60Task(GwApi *api){
|
|||||||
LOG_DEBUG(GwLog::DEBUG,"added fixed value %s to page %d",value->getName().c_str(),i);
|
LOG_DEBUG(GwLog::DEBUG,"added fixed value %s to page %d",value->getName().c_str(),i);
|
||||||
pages[i].parameters.values.push_back(value);
|
pages[i].parameters.values.push_back(value);
|
||||||
}
|
}
|
||||||
|
// Add boat history data to page parameters
|
||||||
|
pages[i].parameters.boatHstry = &hstryBufList;
|
||||||
}
|
}
|
||||||
// add out of band system page (always available)
|
// add out of band system page (always available)
|
||||||
Page *syspage = allPages.pages[0]->creator(commonData);
|
Page *syspage = allPages.pages[0]->creator(commonData);
|
||||||
|
|
||||||
|
// Read all calibration data settings from config
|
||||||
|
calibrationData.readConfig(config, logger);
|
||||||
|
|
||||||
|
// Check user settings for true wind calculation
|
||||||
|
bool calcTrueWnds = api->getConfig()->getBool(api->getConfig()->calcTrueWnds, false);
|
||||||
|
bool useSimuData = api->getConfig()->getBool(api->getConfig()->useSimuData, false);
|
||||||
|
|
||||||
|
// Initialize history buffer for certain boat data
|
||||||
|
hstryBufList.init(&boatValues, logger);
|
||||||
|
|
||||||
// Display screenshot handler for HTTP request
|
// Display screenshot handler for HTTP request
|
||||||
// http://192.168.15.1/api/user/OBP60Task/screenshot
|
// http://192.168.15.1/api/user/OBP60Task/screenshot
|
||||||
api->registerRequestHandler("screenshot", [api, &pageNumber, pages](AsyncWebServerRequest *request) {
|
api->registerRequestHandler("screenshot", [api, &pageNumber, pages](AsyncWebServerRequest *request) {
|
||||||
@@ -555,7 +528,9 @@ void OBP60Task(GwApi *api){
|
|||||||
commonData.backlight.brightness = 2.55 * uint(config->getConfigItem(config->blBrightness,true)->asInt());
|
commonData.backlight.brightness = 2.55 * uint(config->getConfigItem(config->blBrightness,true)->asInt());
|
||||||
commonData.powermode = api->getConfig()->getConfigItem(api->getConfig()->powerMode,true)->asString();
|
commonData.powermode = api->getConfig()->getConfigItem(api->getConfig()->powerMode,true)->asString();
|
||||||
|
|
||||||
bool uvoltage = api->getConfig()->getConfigItem(api->getConfig()->underVoltage,true)->asBoolean();
|
bool uvoltage = config->getConfigItem(config->underVoltage, true)->asBoolean();
|
||||||
|
float voffset = (config->getConfigItem(config->vOffset,true)->asString()).toFloat();
|
||||||
|
float vslope = (config->getConfigItem(config->vSlope,true)->asString()).toFloat();
|
||||||
String cpuspeed = api->getConfig()->getConfigItem(api->getConfig()->cpuSpeed,true)->asString();
|
String cpuspeed = api->getConfig()->getConfigItem(api->getConfig()->cpuSpeed,true)->asString();
|
||||||
uint hdopAccuracy = uint(api->getConfig()->getConfigItem(api->getConfig()->hdopAccuracy,true)->asInt());
|
uint hdopAccuracy = uint(api->getConfig()->getConfigItem(api->getConfig()->hdopAccuracy,true)->asInt());
|
||||||
|
|
||||||
@@ -563,7 +538,7 @@ void OBP60Task(GwApi *api){
|
|||||||
double homelon = commonData.config->getString(commonData.config->homeLON).toDouble();
|
double homelon = commonData.config->getString(commonData.config->homeLON).toDouble();
|
||||||
bool homevalid = homelat >= -180.0 and homelat <= 180 and homelon >= -90.0 and homelon <= 90.0;
|
bool homevalid = homelat >= -180.0 and homelat <= 180 and homelon >= -90.0 and homelon <= 90.0;
|
||||||
if (homevalid) {
|
if (homevalid) {
|
||||||
LOG_DEBUG(GwLog::LOG, "Home location set to %f : %f", homelat, homelon);
|
LOG_DEBUG(GwLog::LOG, "Home location set to lat=%f, lon=%f", homelat, homelon);
|
||||||
} else {
|
} else {
|
||||||
LOG_DEBUG(GwLog::LOG, "No valid home location found");
|
LOG_DEBUG(GwLog::LOG, "No valid home location found");
|
||||||
}
|
}
|
||||||
@@ -597,14 +572,18 @@ void OBP60Task(GwApi *api){
|
|||||||
//####################################################################################
|
//####################################################################################
|
||||||
|
|
||||||
bool systemPage = false;
|
bool systemPage = false;
|
||||||
|
bool systemPageNew = false;
|
||||||
Page *currentPage;
|
Page *currentPage;
|
||||||
while (true){
|
while (true){
|
||||||
delay(100); // Delay 100ms (loop time)
|
delay(100); // Delay 100ms (loop time)
|
||||||
bool keypressed = false;
|
bool keypressed = false;
|
||||||
|
|
||||||
// Undervoltage detection
|
// Undervoltage detection
|
||||||
if(uvoltage == true){
|
if (uvoltage == true) {
|
||||||
underVoltageDetection(api, commonData);
|
if (underVoltageDetection(voffset, vslope)) {
|
||||||
|
LOG_DEBUG(GwLog::ERROR, "Undervoltage detected, shutting down!");
|
||||||
|
underVoltageError(commonData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set CPU speed after boot after 1min
|
// Set CPU speed after boot after 1min
|
||||||
@@ -649,6 +628,7 @@ void OBP60Task(GwApi *api){
|
|||||||
systemPage = true; // System page is out of band
|
systemPage = true; // System page is out of band
|
||||||
syspage->setupKeys();
|
syspage->setupKeys();
|
||||||
keyboardMessage = 0;
|
keyboardMessage = 0;
|
||||||
|
systemPageNew = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
currentPage = pages[pageNumber].page;
|
currentPage = pages[pageNumber].page;
|
||||||
@@ -703,7 +683,7 @@ void OBP60Task(GwApi *api){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// #9 or #10 Refresh display after a new page after 4s waiting time and if refresh is disabled
|
// #9 or #10 Refresh display after a new page after 4s waiting time and if refresh is disabled
|
||||||
if(refreshmode == true && (keyboardMessage == 9 || keyboardMessage == 10)){
|
if(refreshmode == true && (keyboardMessage == 9 || keyboardMessage == 10 || keyboardMessage == 4 || keyboardMessage == 3)){
|
||||||
starttime4 = millis();
|
starttime4 = millis();
|
||||||
starttime2 = millis(); // Reset the timer for full display update
|
starttime2 = millis(); // Reset the timer for full display update
|
||||||
delayedDisplayUpdate = true;
|
delayedDisplayUpdate = true;
|
||||||
@@ -734,17 +714,28 @@ void OBP60Task(GwApi *api){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Full display update afer a new selected page and 4s wait time
|
// Full display update afer a new selected page and 8s wait time
|
||||||
if(millis() > starttime4 + 4000 && delayedDisplayUpdate == true){
|
if(millis() > starttime4 + 8000 && delayedDisplayUpdate == true){
|
||||||
starttime1 = millis();
|
starttime1 = millis();
|
||||||
starttime2 = millis();
|
starttime2 = millis();
|
||||||
getdisplay().setFullWindow(); // Set full update
|
getdisplay().setFullWindow(); // Set full update
|
||||||
getdisplay().nextPage();
|
if(fastrefresh == "true"){
|
||||||
if(fastrefresh == "false"){
|
getdisplay().nextPage(); // Full update
|
||||||
|
}
|
||||||
|
else{
|
||||||
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
||||||
|
#ifdef DISPLAY_GDEY042T81
|
||||||
|
getdisplay().hibernate(); // Set display in hybenate mode
|
||||||
|
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
||||||
|
#else
|
||||||
|
getdisplay().init(115200); // Init for normal displays
|
||||||
|
#endif
|
||||||
|
getdisplay().firstPage(); // Full update
|
||||||
getdisplay().nextPage(); // Full update
|
getdisplay().nextPage(); // Full update
|
||||||
getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
// getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
getdisplay().nextPage(); // Full update
|
// getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
||||||
|
// getdisplay().nextPage(); // Partial update
|
||||||
|
// getdisplay().nextPage(); // Partial update
|
||||||
}
|
}
|
||||||
delayedDisplayUpdate = false;
|
delayedDisplayUpdate = false;
|
||||||
}
|
}
|
||||||
@@ -756,12 +747,23 @@ void OBP60Task(GwApi *api){
|
|||||||
starttime2 = millis();
|
starttime2 = millis();
|
||||||
LOG_DEBUG(GwLog::DEBUG,"E-Ink full refresh first 5 min");
|
LOG_DEBUG(GwLog::DEBUG,"E-Ink full refresh first 5 min");
|
||||||
getdisplay().setFullWindow(); // Set full update
|
getdisplay().setFullWindow(); // Set full update
|
||||||
getdisplay().nextPage();
|
if(fastrefresh == "true"){
|
||||||
if(fastrefresh == "false"){
|
getdisplay().nextPage(); // Full update
|
||||||
|
}
|
||||||
|
else{
|
||||||
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
||||||
|
#ifdef DISPLAY_GDEY042T81
|
||||||
|
getdisplay().hibernate(); // Set display in hybenate mode
|
||||||
|
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
||||||
|
#else
|
||||||
|
getdisplay().init(115200); // Init for normal displays
|
||||||
|
#endif
|
||||||
|
getdisplay().firstPage(); // Full update
|
||||||
getdisplay().nextPage(); // Full update
|
getdisplay().nextPage(); // Full update
|
||||||
getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
// getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
getdisplay().nextPage(); // Full update
|
// getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
||||||
|
// getdisplay().nextPage(); // Partial update
|
||||||
|
// getdisplay().nextPage(); // Partial update
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -770,15 +772,26 @@ void OBP60Task(GwApi *api){
|
|||||||
starttime2 = millis();
|
starttime2 = millis();
|
||||||
LOG_DEBUG(GwLog::DEBUG,"E-Ink full refresh");
|
LOG_DEBUG(GwLog::DEBUG,"E-Ink full refresh");
|
||||||
getdisplay().setFullWindow(); // Set full update
|
getdisplay().setFullWindow(); // Set full update
|
||||||
getdisplay().nextPage();
|
if(fastrefresh == "true"){
|
||||||
if(fastrefresh == "false"){
|
|
||||||
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
|
||||||
getdisplay().nextPage(); // Full update
|
|
||||||
getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
|
||||||
getdisplay().nextPage(); // Full update
|
getdisplay().nextPage(); // Full update
|
||||||
}
|
}
|
||||||
}
|
else{
|
||||||
|
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
||||||
|
#ifdef DISPLAY_GDEY042T81
|
||||||
|
getdisplay().hibernate(); // Set display in hybenate mode
|
||||||
|
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
||||||
|
#else
|
||||||
|
getdisplay().init(115200); // Init for normal displays
|
||||||
|
#endif
|
||||||
|
getdisplay().firstPage(); // Full update
|
||||||
|
getdisplay().nextPage(); // Full update
|
||||||
|
// getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
// getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
||||||
|
// getdisplay().nextPage(); // Partial update
|
||||||
|
// getdisplay().nextPage(); // Partial update
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Refresh display data, default all 1s
|
// Refresh display data, default all 1s
|
||||||
currentPage = pages[pageNumber].page;
|
currentPage = pages[pageNumber].page;
|
||||||
int pagetime = 1000;
|
int pagetime = 1000;
|
||||||
@@ -794,6 +807,12 @@ void OBP60Task(GwApi *api){
|
|||||||
api->getBoatDataValues(boatValues.numValues,boatValues.allBoatValues);
|
api->getBoatDataValues(boatValues.numValues,boatValues.allBoatValues);
|
||||||
api->getStatus(commonData.status);
|
api->getStatus(commonData.status);
|
||||||
|
|
||||||
|
if (calcTrueWnds) {
|
||||||
|
trueWind.addTrueWind(api, &boatValues, logger);
|
||||||
|
}
|
||||||
|
// Handle history buffers for certain boat data for windplot page and other usage
|
||||||
|
hstryBufList.handleHstryBuf(useSimuData);
|
||||||
|
|
||||||
// Clear display
|
// Clear display
|
||||||
// getdisplay().fillRect(0, 0, getdisplay().width(), getdisplay().height(), commonData.bgcolor);
|
// getdisplay().fillRect(0, 0, getdisplay().width(), getdisplay().height(), commonData.bgcolor);
|
||||||
getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
getdisplay().fillScreen(commonData.bgcolor); // Clear display
|
||||||
@@ -808,6 +827,11 @@ void OBP60Task(GwApi *api){
|
|||||||
if (systemPage) {
|
if (systemPage) {
|
||||||
displayFooter(commonData);
|
displayFooter(commonData);
|
||||||
PageData sysparams; // empty
|
PageData sysparams; // empty
|
||||||
|
sysparams.api = api;
|
||||||
|
if (systemPageNew) {
|
||||||
|
syspage->displayNew(sysparams);
|
||||||
|
systemPageNew = false;
|
||||||
|
}
|
||||||
syspage->displayPage(sysparams);
|
syspage->displayPage(sysparams);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -824,10 +848,11 @@ void OBP60Task(GwApi *api){
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if (lastPage != pageNumber){
|
if (lastPage != pageNumber){
|
||||||
if (hasFRAM) fram.write(FRAM_PAGE_NO, pageNumber); // remember page for device restart
|
pages[lastPage].page->leavePage(pages[lastPage].parameters); // call page cleanup code
|
||||||
|
if (hasFRAM) fram.write(FRAM_PAGE_NO, pageNumber); // remember new page for device restart
|
||||||
currentPage->setupKeys();
|
currentPage->setupKeys();
|
||||||
currentPage->displayNew(pages[pageNumber].parameters);
|
currentPage->displayNew(pages[pageNumber].parameters);
|
||||||
lastPage=pageNumber;
|
lastPage = pageNumber;
|
||||||
}
|
}
|
||||||
//call the page code
|
//call the page code
|
||||||
LOG_DEBUG(GwLog::DEBUG,"calling page %d",pageNumber);
|
LOG_DEBUG(GwLog::DEBUG,"calling page %d",pageNumber);
|
||||||
@@ -835,7 +860,16 @@ void OBP60Task(GwApi *api){
|
|||||||
if (pages[pageNumber].description && pages[pageNumber].description->header){
|
if (pages[pageNumber].description && pages[pageNumber].description->header){
|
||||||
displayFooter(commonData);
|
displayFooter(commonData);
|
||||||
}
|
}
|
||||||
currentPage->displayPage(pages[pageNumber].parameters);
|
int ret = currentPage->displayPage(pages[pageNumber].parameters);
|
||||||
|
if (commonData.alarm.active) {
|
||||||
|
displayAlarm(commonData);
|
||||||
|
}
|
||||||
|
if (ret & PAGE_UPDATE) {
|
||||||
|
getdisplay().nextPage(); // Partial update (fast)
|
||||||
|
}
|
||||||
|
if (ret & PAGE_HIBERNATE) {
|
||||||
|
getdisplay().hibernate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user