Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into feature/p053-add-support-for-pms5003st-pms2003-pms3003

This commit is contained in:
Ton Huisman
2021-07-26 20:27:09 +02:00
7 changed files with 1465 additions and 1 deletions
+42
View File
@@ -0,0 +1,42 @@
.. include:: ../Plugin/_plugin_substitutions_p10x.repl
.. _P109_page:
|P109_typename|
==================================================
|P109_shortinfo|
Plugin details
--------------
Type: |P109_type|
Name: |P109_name|
Status: |P109_status|
GitHub: |P109_github|_
Maintainer: |P109_maintainer|
Used libraries: |P109_usedlibraries|
Description
-----------
.. Events
.. ~~~~~~
.. .. include:: P109_events.repl
Change log
----------
.. versionchanged:: 2.0
...
|added| 2020-04-25
+1
View File
@@ -134,6 +134,7 @@ There are different released versions of ESP Easy:
":ref:`P106_page`","|P106_status|","P106"
":ref:`P107_page`","|P107_status|","P107"
":ref:`P108_page`","|P108_status|","P108"
":ref:`P109_page`","|P109_status|","P109"
":ref:`P110_page`","|P110_status|","P110"
":ref:`P111_page`","|P111_status|","P111"
":ref:`P113_page`","|P113_status|","P113"
@@ -119,3 +119,16 @@
.. |P108_maintainer| replace:: TD-er
.. |P108_compileinfo| replace:: `.`
.. |P108_usedlibraries| replace:: `.`
.. |P109_name| replace:: :cyan:`ThermoOLED`
.. |P109_type| replace:: :cyan:`UV`
.. |P109_typename| replace:: :cyan:`Display - ThermoOLED`
.. |P109_porttype| replace:: `.`
.. |P109_status| replace:: :yellow:`TESTING`
.. |P109_github| replace:: P109_ThermoOLED.ino
.. _P109_github: https://github.com/letscontrolit/ESPEasy/blob/mega/src/_P109_ThermoOLED.ino
.. |P109_usedby| replace:: `.`
.. |P109_shortinfo| replace:: `.`
.. |P109_maintainer| replace:: TD-er
.. |P109_compileinfo| replace:: `.`
.. |P109_usedlibraries| replace:: `.`
@@ -0,0 +1,464 @@
#ifndef DIALOG_PLAIN_FONT18_H
#define DIALOG_PLAIN_FONT18_H
// Created by http://oleddisplay.squix.ch/ Consider a donation
// In case of problems make sure that you are using the font file with the correct version!
const char Dialog_plain_18[] PROGMEM = {
0x13, // Width: 19
0x16, // Height: 22
0x20, // First Char: 32
0xE0, // Numbers of Chars: 224
// Jump Table:
0xFF, 0xFF, 0x00, 0x06, // 32:65535
0x00, 0x00, 0x0F, 0x07, // 33:0
0x00, 0x0F, 0x14, 0x08, // 34:15
0x00, 0x23, 0x26, 0x0F, // 35:35
0x00, 0x49, 0x1D, 0x0B, // 36:73
0x00, 0x66, 0x2F, 0x11, // 37:102
0x00, 0x95, 0x27, 0x0D, // 38:149
0x00, 0xBC, 0x08, 0x04, // 39:188
0x00, 0xC4, 0x12, 0x07, // 40:196
0x00, 0xD6, 0x0E, 0x07, // 41:214
0x00, 0xE4, 0x17, 0x09, // 42:228
0x00, 0xFB, 0x29, 0x0F, // 43:251
0x01, 0x24, 0x0C, 0x06, // 44:292
0x01, 0x30, 0x11, 0x07, // 45:304
0x01, 0x41, 0x0C, 0x06, // 46:321
0x01, 0x4D, 0x10, 0x06, // 47:333
0x01, 0x5D, 0x1D, 0x0B, // 48:349
0x01, 0x7A, 0x1E, 0x0B, // 49:378
0x01, 0x98, 0x1B, 0x0B, // 50:408
0x01, 0xB3, 0x1D, 0x0B, // 51:435
0x01, 0xD0, 0x20, 0x0B, // 52:464
0x01, 0xF0, 0x1A, 0x0B, // 53:496
0x02, 0x0A, 0x1D, 0x0B, // 54:522
0x02, 0x27, 0x19, 0x0B, // 55:551
0x02, 0x40, 0x1D, 0x0B, // 56:576
0x02, 0x5D, 0x1D, 0x0B, // 57:605
0x02, 0x7A, 0x0C, 0x06, // 58:634
0x02, 0x86, 0x0C, 0x06, // 59:646
0x02, 0x92, 0x27, 0x0F, // 60:658
0x02, 0xB9, 0x26, 0x0F, // 61:697
0x02, 0xDF, 0x26, 0x0F, // 62:735
0x03, 0x05, 0x17, 0x0A, // 63:773
0x03, 0x1C, 0x32, 0x12, // 64:796
0x03, 0x4E, 0x24, 0x0C, // 65:846
0x03, 0x72, 0x20, 0x0C, // 66:882
0x03, 0x92, 0x23, 0x0D, // 67:914
0x03, 0xB5, 0x26, 0x0E, // 68:949
0x03, 0xDB, 0x1E, 0x0B, // 69:987
0x03, 0xF9, 0x1C, 0x0A, // 70:1017
0x04, 0x15, 0x23, 0x0E, // 71:1045
0x04, 0x38, 0x24, 0x0E, // 72:1080
0x04, 0x5C, 0x0C, 0x06, // 73:1116
0x04, 0x68, 0x0C, 0x06, // 74:1128
0x04, 0x74, 0x24, 0x0C, // 75:1140
0x04, 0x98, 0x1E, 0x0A, // 76:1176
0x04, 0xB6, 0x2A, 0x10, // 77:1206
0x04, 0xE0, 0x24, 0x0E, // 78:1248
0x05, 0x04, 0x26, 0x0E, // 79:1284
0x05, 0x2A, 0x1D, 0x0B, // 80:1322
0x05, 0x47, 0x26, 0x0E, // 81:1351
0x05, 0x6D, 0x24, 0x0D, // 82:1389
0x05, 0x91, 0x1D, 0x0B, // 83:1425
0x05, 0xAE, 0x22, 0x0C, // 84:1454
0x05, 0xD0, 0x23, 0x0E, // 85:1488
0x05, 0xF3, 0x22, 0x0C, // 86:1523
0x06, 0x15, 0x34, 0x13, // 87:1557
0x06, 0x49, 0x24, 0x0D, // 88:1609
0x06, 0x6D, 0x22, 0x0C, // 89:1645
0x06, 0x8F, 0x24, 0x0D, // 90:1679
0x06, 0xB3, 0x0F, 0x07, // 91:1715
0x06, 0xC2, 0x12, 0x06, // 92:1730
0x06, 0xD4, 0x12, 0x07, // 93:1748
0x06, 0xE6, 0x26, 0x0F, // 94:1766
0x07, 0x0C, 0x1B, 0x09, // 95:1804
0x07, 0x27, 0x10, 0x09, // 96:1831
0x07, 0x37, 0x1B, 0x0A, // 97:1847
0x07, 0x52, 0x20, 0x0B, // 98:1874
0x07, 0x72, 0x1A, 0x09, // 99:1906
0x07, 0x8C, 0x1E, 0x0B, // 100:1932
0x07, 0xAA, 0x20, 0x0B, // 101:1962
0x07, 0xCA, 0x11, 0x06, // 102:1994
0x07, 0xDB, 0x1E, 0x0B, // 103:2011
0x07, 0xF9, 0x1E, 0x0B, // 104:2041
0x08, 0x17, 0x0C, 0x05, // 105:2071
0x08, 0x23, 0x0C, 0x05, // 106:2083
0x08, 0x2F, 0x1E, 0x0A, // 107:2095
0x08, 0x4D, 0x0C, 0x05, // 108:2125
0x08, 0x59, 0x30, 0x11, // 109:2137
0x08, 0x89, 0x1E, 0x0B, // 110:2185
0x08, 0xA7, 0x20, 0x0B, // 111:2215
0x08, 0xC7, 0x20, 0x0B, // 112:2247
0x08, 0xE7, 0x1E, 0x0B, // 113:2279
0x09, 0x05, 0x17, 0x08, // 114:2309
0x09, 0x1C, 0x17, 0x08, // 115:2332
0x09, 0x33, 0x15, 0x07, // 116:2355
0x09, 0x48, 0x1E, 0x0B, // 117:2376
0x09, 0x66, 0x20, 0x0B, // 118:2406
0x09, 0x86, 0x2C, 0x10, // 119:2438
0x09, 0xB2, 0x21, 0x0B, // 120:2482
0x09, 0xD3, 0x20, 0x0B, // 121:2515
0x09, 0xF3, 0x1B, 0x09, // 122:2547
0x0A, 0x0E, 0x1E, 0x0B, // 123:2574
0x0A, 0x2C, 0x0C, 0x06, // 124:2604
0x0A, 0x38, 0x1D, 0x0B, // 125:2616
0x0A, 0x55, 0x26, 0x0F, // 126:2645
0x0A, 0x7B, 0x1E, 0x0B, // 127:2683
0x0A, 0x99, 0x1E, 0x0B, // 128:2713
0x0A, 0xB7, 0x1E, 0x0B, // 129:2743
0x0A, 0xD5, 0x1E, 0x0B, // 130:2773
0x0A, 0xF3, 0x1E, 0x0B, // 131:2803
0x0B, 0x11, 0x1E, 0x0B, // 132:2833
0x0B, 0x2F, 0x1E, 0x0B, // 133:2863
0x0B, 0x4D, 0x1E, 0x0B, // 134:2893
0x0B, 0x6B, 0x1E, 0x0B, // 135:2923
0x0B, 0x89, 0x1E, 0x0B, // 136:2953
0x0B, 0xA7, 0x1E, 0x0B, // 137:2983
0x0B, 0xC5, 0x1E, 0x0B, // 138:3013
0x0B, 0xE3, 0x1E, 0x0B, // 139:3043
0x0C, 0x01, 0x1E, 0x0B, // 140:3073
0x0C, 0x1F, 0x1E, 0x0B, // 141:3103
0x0C, 0x3D, 0x1E, 0x0B, // 142:3133
0x0C, 0x5B, 0x1E, 0x0B, // 143:3163
0x0C, 0x79, 0x1E, 0x0B, // 144:3193
0x0C, 0x97, 0x1E, 0x0B, // 145:3223
0x0C, 0xB5, 0x1E, 0x0B, // 146:3253
0x0C, 0xD3, 0x1E, 0x0B, // 147:3283
0x0C, 0xF1, 0x1E, 0x0B, // 148:3313
0x0D, 0x0F, 0x1E, 0x0B, // 149:3343
0x0D, 0x2D, 0x1E, 0x0B, // 150:3373
0x0D, 0x4B, 0x1E, 0x0B, // 151:3403
0x0D, 0x69, 0x1E, 0x0B, // 152:3433
0x0D, 0x87, 0x1E, 0x0B, // 153:3463
0x0D, 0xA5, 0x1E, 0x0B, // 154:3493
0x0D, 0xC3, 0x1E, 0x0B, // 155:3523
0x0D, 0xE1, 0x1E, 0x0B, // 156:3553
0x0D, 0xFF, 0x1E, 0x0B, // 157:3583
0x0E, 0x1D, 0x1E, 0x0B, // 158:3613
0x0E, 0x3B, 0x1E, 0x0B, // 159:3643
0xFF, 0xFF, 0x00, 0x06, // 160:65535
0x0E, 0x59, 0x0F, 0x07, // 161:3673
0x0E, 0x68, 0x1D, 0x0B, // 162:3688
0x0E, 0x85, 0x1E, 0x0B, // 163:3717
0x0E, 0xA3, 0x1D, 0x0B, // 164:3747
0x0E, 0xC0, 0x20, 0x0B, // 165:3776
0x0E, 0xE0, 0x0C, 0x06, // 166:3808
0x0E, 0xEC, 0x17, 0x09, // 167:3820
0x0F, 0x03, 0x16, 0x09, // 168:3843
0x0F, 0x19, 0x2C, 0x12, // 169:3865
0x0F, 0x45, 0x17, 0x08, // 170:3909
0x0F, 0x5C, 0x1A, 0x0B, // 171:3932
0x0F, 0x76, 0x26, 0x0F, // 172:3958
0x0F, 0x9C, 0x11, 0x07, // 173:3996
0x0F, 0xAD, 0x2C, 0x12, // 174:4013
0x0F, 0xD9, 0x13, 0x09, // 175:4057
0x0F, 0xEC, 0x17, 0x09, // 176:4076
0x10, 0x03, 0x2A, 0x0F, // 177:4099
0x10, 0x2D, 0x11, 0x07, // 178:4141
0x10, 0x3E, 0x11, 0x07, // 179:4158
0x10, 0x4F, 0x13, 0x09, // 180:4175
0x10, 0x62, 0x21, 0x0B, // 181:4194
0x10, 0x83, 0x1B, 0x0B, // 182:4227
0x10, 0x9E, 0x0B, 0x06, // 183:4254
0x10, 0xA9, 0x15, 0x09, // 184:4265
0x10, 0xBE, 0x11, 0x07, // 185:4286
0x10, 0xCF, 0x17, 0x08, // 186:4303
0x10, 0xE6, 0x1D, 0x0B, // 187:4326
0x11, 0x03, 0x32, 0x11, // 188:4355
0x11, 0x35, 0x30, 0x11, // 189:4405
0x11, 0x65, 0x32, 0x11, // 190:4453
0x11, 0x97, 0x1B, 0x0A, // 191:4503
0x11, 0xB2, 0x24, 0x0C, // 192:4530
0x11, 0xD6, 0x24, 0x0C, // 193:4566
0x11, 0xFA, 0x24, 0x0C, // 194:4602
0x12, 0x1E, 0x24, 0x0C, // 195:4638
0x12, 0x42, 0x24, 0x0C, // 196:4674
0x12, 0x66, 0x24, 0x0C, // 197:4710
0x12, 0x8A, 0x30, 0x11, // 198:4746
0x12, 0xBA, 0x23, 0x0D, // 199:4794
0x12, 0xDD, 0x1E, 0x0B, // 200:4829
0x12, 0xFB, 0x1E, 0x0B, // 201:4859
0x13, 0x19, 0x1E, 0x0B, // 202:4889
0x13, 0x37, 0x1E, 0x0B, // 203:4919
0x13, 0x55, 0x0C, 0x06, // 204:4949
0x13, 0x61, 0x0C, 0x06, // 205:4961
0x13, 0x6D, 0x0D, 0x06, // 206:4973
0x13, 0x7A, 0x10, 0x06, // 207:4986
0x13, 0x8A, 0x26, 0x0E, // 208:5002
0x13, 0xB0, 0x24, 0x0E, // 209:5040
0x13, 0xD4, 0x26, 0x0E, // 210:5076
0x13, 0xFA, 0x26, 0x0E, // 211:5114
0x14, 0x20, 0x26, 0x0E, // 212:5152
0x14, 0x46, 0x26, 0x0E, // 213:5190
0x14, 0x6C, 0x26, 0x0E, // 214:5228
0x14, 0x92, 0x23, 0x0F, // 215:5266
0x14, 0xB5, 0x26, 0x0E, // 216:5301
0x14, 0xDB, 0x23, 0x0E, // 217:5339
0x14, 0xFE, 0x23, 0x0E, // 218:5374
0x15, 0x21, 0x23, 0x0E, // 219:5409
0x15, 0x44, 0x23, 0x0E, // 220:5444
0x15, 0x67, 0x22, 0x0C, // 221:5479
0x15, 0x89, 0x1D, 0x0B, // 222:5513
0x15, 0xA6, 0x20, 0x0B, // 223:5542
0x15, 0xC6, 0x1B, 0x0A, // 224:5574
0x15, 0xE1, 0x1B, 0x0A, // 225:5601
0x15, 0xFC, 0x1B, 0x0A, // 226:5628
0x16, 0x17, 0x1B, 0x0A, // 227:5655
0x16, 0x32, 0x1B, 0x0A, // 228:5682
0x16, 0x4D, 0x1B, 0x0A, // 229:5709
0x16, 0x68, 0x2F, 0x11, // 230:5736
0x16, 0x97, 0x1A, 0x09, // 231:5783
0x16, 0xB1, 0x20, 0x0B, // 232:5809
0x16, 0xD1, 0x20, 0x0B, // 233:5841
0x16, 0xF1, 0x20, 0x0B, // 234:5873
0x17, 0x11, 0x20, 0x0B, // 235:5905
0x17, 0x31, 0x0C, 0x05, // 236:5937
0x17, 0x3D, 0x0D, 0x05, // 237:5949
0x17, 0x4A, 0x0D, 0x05, // 238:5962
0x17, 0x57, 0x0D, 0x05, // 239:5975
0x17, 0x64, 0x20, 0x0B, // 240:5988
0x17, 0x84, 0x1E, 0x0B, // 241:6020
0x17, 0xA2, 0x20, 0x0B, // 242:6050
0x17, 0xC2, 0x20, 0x0B, // 243:6082
0x17, 0xE2, 0x20, 0x0B, // 244:6114
0x18, 0x02, 0x20, 0x0B, // 245:6146
0x18, 0x22, 0x20, 0x0B, // 246:6178
0x18, 0x42, 0x29, 0x0F, // 247:6210
0x18, 0x6B, 0x20, 0x0B, // 248:6251
0x18, 0x8B, 0x1E, 0x0B, // 249:6283
0x18, 0xA9, 0x1E, 0x0B, // 250:6313
0x18, 0xC7, 0x1E, 0x0B, // 251:6343
0x18, 0xE5, 0x1E, 0x0B, // 252:6373
0x19, 0x03, 0x20, 0x0B, // 253:6403
0x19, 0x23, 0x20, 0x0B, // 254:6435
0x19, 0x43, 0x20, 0x0B, // 255:6467
// Font Data:
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x9F,0x01,0xF0,0x9F,0x01, // 33
0x00,0x00,0x00,0xF0,0x01,0x00,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0xF0,0x01, // 34
0x00,0x00,0x00,0x00,0x18,0x00,0x80,0x19,0x00,0x80,0xD9,0x01,0x80,0xFD,0x00,0xE0,0x1F,0x00,0xF8,0x19,0x00,0x80,0xF9,0x01,0x80,0x7F,0x00,0xE0,0x1B,0x00,0xB8,0x19,0x00,0x80,0x19,0x00,0x80,0x01, // 35
0x00,0x00,0x00,0x80,0xC3,0x00,0xC0,0x87,0x01,0xE0,0x86,0x01,0x60,0x8E,0x01,0xF8,0xFF,0x0F,0x60,0x8C,0x01,0x60,0xCC,0x01,0xC0,0xF8,0x00,0x00,0x70, // 36
0x00,0x00,0x00,0xE0,0x03,0x00,0xF0,0x07,0x00,0x10,0x04,0x00,0x10,0x04,0x01,0xF0,0xC7,0x00,0xE0,0x63,0x00,0x00,0x18,0x00,0x00,0x04,0x00,0x00,0x03,0x00,0xC0,0xF8,0x00,0x60,0xFC,0x01,0x10,0x04,0x01,0x00,0x04,0x01,0x00,0xFC,0x01,0x00,0xF8, // 37
0x00,0x00,0x00,0x00,0x78,0x00,0x00,0xFC,0x00,0xC0,0xC7,0x01,0xE0,0x83,0x01,0x30,0x87,0x01,0x30,0x8E,0x01,0x30,0x9C,0x01,0x30,0xF8,0x00,0x60,0xF0,0x00,0x00,0xDC,0x01,0x00,0x8C,0x01,0x00,0x00,0x01, // 38
0x00,0x00,0x00,0xF0,0x01,0x00,0xF0,0x01, // 39
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0xE0,0xFF,0x01,0x78,0x80,0x07,0x08,0x00,0x04, // 40
0x00,0x00,0x00,0x08,0x00,0x04,0x78,0x80,0x07,0xE0,0xFF,0x01,0x00,0x3F, // 41
0x00,0x00,0x00,0x20,0x04,0x00,0x40,0x02,0x00,0x80,0x01,0x00,0xF0,0x0F,0x00,0x80,0x01,0x00,0x40,0x02,0x00,0x20,0x04, // 42
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0xE0,0xFF,0x01,0xE0,0xFF,0x01,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C, // 43
0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x80,0x03,0x00,0x80,0x01, // 44
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18, // 45
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x80,0x01, // 46
0x00,0x00,0x06,0x00,0xE0,0x07,0x00,0xFE,0x01,0xC0,0x3F,0x00,0xF0,0x03,0x00,0x30, // 47
0x00,0x00,0x00,0x80,0x3F,0x00,0xE0,0xFF,0x00,0x70,0xC0,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x70,0xC0,0x01,0xE0,0xFF,0x00,0x80,0x3F, // 48
0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x01,0x60,0x80,0x01,0x30,0x80,0x01,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01, // 49
0x00,0x00,0x00,0x60,0x80,0x01,0x30,0xC0,0x01,0x30,0xE0,0x01,0x30,0xB0,0x01,0x30,0x98,0x01,0x70,0x8E,0x01,0xE0,0x87,0x01,0xC0,0x83,0x01, // 50
0x00,0x00,0x00,0x60,0xC0,0x00,0x30,0x80,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x70,0xCF,0x01,0xE0,0xFF,0x00,0xC0,0x79, // 51
0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x3C,0x00,0x00,0x36,0x00,0x80,0x31,0x00,0xC0,0x30,0x00,0x30,0x30,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x00,0x30,0x00,0x00,0x30, // 52
0x00,0x00,0x00,0x00,0xC0,0x00,0xF0,0x87,0x01,0xF0,0x83,0x01,0x30,0x83,0x01,0x30,0x83,0x01,0x30,0xC7,0x01,0x30,0xFE,0x00,0x00,0x7C, // 53
0x00,0x00,0x00,0x80,0x3F,0x00,0xC0,0xFF,0x00,0xE0,0xCC,0x01,0x70,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0xCE,0x01,0x60,0xFC,0x00,0x00,0x78, // 54
0x00,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x80,0x01,0x30,0xF0,0x01,0x30,0xFE,0x00,0xF0,0x1F,0x00,0xF0,0x03,0x00,0x30, // 55
0x00,0x00,0x00,0xC0,0x79,0x00,0xE0,0xFF,0x00,0x70,0xCF,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x70,0xCF,0x01,0xE0,0xFF,0x00,0xC0,0x79, // 56
0x00,0x00,0x00,0xC0,0x03,0x00,0xE0,0xC7,0x00,0x70,0x8E,0x01,0x30,0x8C,0x01,0x30,0x8C,0x01,0x30,0xCC,0x01,0x70,0xE6,0x00,0xE0,0x7F,0x00,0x80,0x3F, // 57
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x83,0x01, // 58
0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x83,0x03,0x00,0x83,0x01, // 59
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x66,0x00,0x00,0x66,0x00,0x00,0xC3,0x00,0x00,0xC3,0x00,0x00,0xC3,0x00,0x80,0x81,0x01, // 60
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x33,0x00,0x00,0x33,0x00,0x00,0x33,0x00,0x00,0x33,0x00,0x00,0x33,0x00,0x00,0x33,0x00,0x00,0x33,0x00,0x00,0x33,0x00,0x00,0x33,0x00,0x00,0x33, // 61
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x81,0x01,0x00,0xC3,0x00,0x00,0xC3,0x00,0x00,0xC3,0x00,0x00,0x66,0x00,0x00,0x66,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x18,0x00,0x00,0x18, // 62
0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x30,0xB8,0x01,0x30,0xBC,0x01,0x30,0x06,0x00,0xE0,0x03,0x00,0xE0,0x01, // 63
0x00,0x00,0x00,0x00,0x7E,0x00,0x80,0xFF,0x01,0xC0,0xC3,0x03,0xE0,0x00,0x07,0x60,0x00,0x06,0x70,0x3C,0x0C,0x30,0x7E,0x0C,0x30,0x66,0x0C,0x30,0x24,0x0C,0x30,0x7E,0x0C,0x30,0x7E,0x04,0x60,0x60,0x06,0x60,0x20,0x00,0xC0,0x30,0x00,0x80,0x1F,0x00,0x00,0x0F, // 64
0x00,0x00,0x01,0x00,0xE0,0x01,0x00,0xF8,0x00,0x00,0x3F,0x00,0xC0,0x37,0x00,0xF0,0x30,0x00,0xF0,0x30,0x00,0xC0,0x37,0x00,0x00,0x3F,0x00,0x00,0xF8,0x00,0x00,0xE0,0x01,0x00,0x00,0x01, // 65
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0xF0,0xCF,0x01,0xE0,0xF9,0x00,0x00,0x70, // 66
0x00,0x00,0x00,0x00,0x1F,0x00,0xC0,0x7F,0x00,0xE0,0xE0,0x00,0x60,0xC0,0x00,0x30,0x80,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x60,0xC0, // 67
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x60,0xC0,0x00,0xE0,0xE0,0x00,0xC0,0x7F,0x00,0x80,0x3F, // 68
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01, // 69
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x30,0x06,0x00,0x30,0x06,0x00,0x30,0x06,0x00,0x30,0x06,0x00,0x30,0x06,0x00,0x30, // 70
0x00,0x00,0x00,0x00,0x1F,0x00,0xC0,0x7F,0x00,0xE0,0xE0,0x00,0x60,0xC0,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0xFE,0x00,0x60,0x7E, // 71
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01, // 72
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01, // 73
0x00,0x00,0x18,0x00,0x00,0x1C,0xF0,0xFF,0x0F,0xF0,0xFF,0x07, // 74
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x00,0x06,0x00,0x00,0x0F,0x00,0x80,0x19,0x00,0xC0,0x30,0x00,0x60,0x60,0x00,0x30,0xC0,0x00,0x10,0x80,0x01,0x00,0x00,0x01, // 75
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01, // 76
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x70,0x00,0x00,0xE0,0x03,0x00,0x80,0x0F,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x0F,0x00,0xE0,0x03,0x00,0x70,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01, // 77
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0xF0,0x00,0x00,0xC0,0x03,0x00,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0x78,0x00,0x00,0xE0,0x01,0xF0,0xFF,0x01,0xF0,0xFF,0x01, // 78
0x00,0x00,0x00,0x00,0x1F,0x00,0xC0,0x7F,0x00,0xE0,0xE0,0x00,0x70,0xC0,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x70,0xC0,0x01,0xE0,0xE0,0x00,0xC0,0x7F,0x00,0x00,0x1F, // 79
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x30,0x0C,0x00,0x30,0x0C,0x00,0x30,0x0C,0x00,0x70,0x0E,0x00,0xE0,0x07,0x00,0xC0,0x03, // 80
0x00,0x00,0x00,0x00,0x1F,0x00,0xC0,0x7F,0x00,0xE0,0xE0,0x00,0x70,0xC0,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x30,0x80,0x03,0x70,0xC0,0x07,0xE0,0xE0,0x04,0xC0,0x7F,0x00,0x00,0x1F, // 81
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x30,0x0C,0x00,0x30,0x0C,0x00,0x30,0x0C,0x00,0x70,0x1E,0x00,0xE0,0x77,0x00,0xC0,0xE3,0x01,0x00,0x80,0x01,0x00,0x00,0x01, // 82
0x00,0x00,0x00,0xC0,0xC1,0x00,0xE0,0x83,0x01,0x70,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0xCC,0x01,0x60,0xFC,0x00,0x00,0x78, // 83
0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30, // 84
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0x00,0xF0,0xFF,0x00,0x00,0xC0,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0xC0,0x01,0xF0,0xFF,0x00,0xF0,0x3F, // 85
0x10,0x00,0x00,0xF0,0x00,0x00,0xE0,0x03,0x00,0x00,0x1F,0x00,0x00,0x7C,0x00,0x00,0xE0,0x01,0x00,0xE0,0x01,0x00,0x7C,0x00,0x00,0x1F,0x00,0xE0,0x03,0x00,0xF0,0x00,0x00,0x10, // 86
0x00,0x00,0x00,0x30,0x00,0x00,0xF0,0x03,0x00,0xC0,0x3F,0x00,0x00,0xFC,0x01,0x00,0xC0,0x01,0x00,0xFC,0x01,0xC0,0x3F,0x00,0xF0,0x03,0x00,0x30,0x00,0x00,0xF0,0x03,0x00,0xC0,0x3F,0x00,0x00,0xFC,0x01,0x00,0xC0,0x01,0x00,0xFC,0x01,0xC0,0x3F,0x00,0xF0,0x03,0x00,0x30, // 87
0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x80,0x01,0x70,0xE0,0x01,0xF0,0x70,0x00,0xC0,0x3F,0x00,0x00,0x0F,0x00,0x80,0x1F,0x00,0xC0,0x79,0x00,0xF0,0xE0,0x01,0x30,0xC0,0x01,0x10,0x00,0x01, // 88
0x10,0x00,0x00,0x30,0x00,0x00,0x70,0x00,0x00,0xC0,0x01,0x00,0x80,0x03,0x00,0x00,0xFE,0x01,0x00,0xFE,0x01,0x80,0x03,0x00,0xC0,0x01,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x10, // 89
0x00,0x00,0x00,0x30,0x80,0x01,0x30,0xC0,0x01,0x30,0xE0,0x01,0x30,0xF8,0x01,0x30,0x9C,0x01,0x30,0x8E,0x01,0xB0,0x87,0x01,0xF0,0x83,0x01,0xF0,0x80,0x01,0x70,0x80,0x01,0x30,0x80,0x01, // 90
0x00,0x00,0x00,0xF8,0xFF,0x07,0xF8,0xFF,0x07,0x18,0x00,0x06,0x18,0x00,0x06, // 91
0x30,0x00,0x00,0xF0,0x03,0x00,0xC0,0x3F,0x00,0x00,0xFE,0x01,0x00,0xE0,0x07,0x00,0x00,0x06, // 92
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x06,0x18,0x00,0x06,0xF8,0xFF,0x07,0xF8,0xFF,0x07, // 93
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x80,0x01,0x00,0xC0,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x10,0x00,0x00,0x30,0x00,0x00,0x60,0x00,0x00,0xC0,0x00,0x00,0x80,0x01,0x00,0x00,0x01, // 94
0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18, // 95
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x18,0x00,0x00,0x30,0x00,0x00,0x20, // 96
0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF3,0x01,0x80,0x99,0x01,0x80,0x99,0x01,0x80,0x99,0x01,0x80,0xDB,0x00,0x00,0xFF,0x01,0x00,0xFE,0x01, // 97
0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x01,0xF8,0xFF,0x01,0x00,0xC3,0x00,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0xC3,0x01,0x00,0xFF,0x00,0x00,0x7E, // 98
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x00,0xC3,0x00,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x00,0xC3, // 99
0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0xFF,0x00,0x80,0xC3,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x00,0xC3,0x00,0xF8,0xFF,0x01,0xF8,0xFF,0x01, // 100
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x00,0xDB,0x00,0x80,0x99,0x01,0x80,0x99,0x01,0x80,0x99,0x01,0x80,0x99,0x01,0x80,0x9B,0x01,0x00,0x9F,0x01,0x00,0xDE, // 101
0x80,0x01,0x00,0x80,0x01,0x00,0xF0,0xFF,0x01,0xF8,0xFF,0x01,0x98,0x01,0x00,0x98,0x01, // 102
0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0xFF,0x0C,0x80,0xC3,0x19,0x80,0x81,0x19,0x80,0x81,0x19,0x80,0x81,0x19,0x00,0xC3,0x1C,0x80,0xFF,0x0F,0x80,0xFF,0x03, // 103
0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x01,0xF8,0xFF,0x01,0x00,0x03,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x03,0x00,0x80,0xFF,0x01,0x00,0xFE,0x01, // 104
0x00,0x00,0x00,0x00,0x00,0x00,0x98,0xFF,0x01,0x98,0xFF,0x01, // 105
0x00,0x00,0x18,0x00,0x00,0x18,0x98,0xFF,0x1F,0x98,0xFF,0x0F, // 106
0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x01,0xF8,0xFF,0x01,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x66,0x00,0x00,0xC3,0x00,0x80,0x81,0x01,0x80,0x00,0x01, // 107
0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x01,0xF8,0xFF,0x01, // 108
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x01,0x80,0xFF,0x01,0x00,0x03,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0xFF,0x01,0x00,0xFE,0x01,0x00,0x03,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0xFF,0x01,0x00,0xFE,0x01, // 109
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x01,0x80,0xFF,0x01,0x00,0x03,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x03,0x00,0x80,0xFF,0x01,0x00,0xFE,0x01, // 110
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x00,0xC3,0x00,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x00,0xC3,0x00,0x00,0xFF,0x00,0x00,0x3C, // 111
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x1F,0x80,0xFF,0x1F,0x00,0xC3,0x00,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0xC3,0x01,0x00,0xFF,0x00,0x00,0x7E, // 112
0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0xFF,0x00,0x80,0xC3,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x00,0xC3,0x00,0x80,0xFF,0x1F,0x80,0xFF,0x1F, // 113
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x01,0x80,0xFF,0x01,0x00,0x03,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01, // 114
0x00,0x00,0x00,0x00,0xC7,0x00,0x80,0x8F,0x01,0x80,0x8D,0x01,0x80,0x99,0x01,0x80,0x99,0x01,0x80,0xF9,0x01,0x00,0xF3, // 115
0x00,0x00,0x00,0x80,0x01,0x00,0xF0,0xFF,0x00,0xF0,0xFF,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0x81,0x01, // 116
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0x80,0xFF,0x01,0x00,0xC0,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0xC0,0x00,0x80,0xFF,0x01,0x80,0xFF,0x01, // 117
0x00,0x00,0x00,0x80,0x01,0x00,0x80,0x07,0x00,0x00,0x3E,0x00,0x00,0xF8,0x00,0x00,0xC0,0x01,0x00,0xC0,0x01,0x00,0xF8,0x00,0x00,0x3E,0x00,0x80,0x07,0x00,0x80,0x01, // 118
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x80,0x3F,0x00,0x00,0xFC,0x01,0x00,0xC0,0x01,0x00,0xFC,0x01,0x80,0x1F,0x00,0x80,0x01,0x00,0x80,0x1F,0x00,0x00,0xFC,0x01,0x00,0xC0,0x01,0x00,0xFC,0x01,0x80,0x3F,0x00,0x80,0x03, // 119
0x00,0x00,0x00,0x80,0x00,0x01,0x80,0x81,0x01,0x80,0xE7,0x01,0x00,0x7E,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x7E,0x00,0x80,0xE7,0x01,0x80,0x81,0x01,0x80,0x00,0x01, // 120
0x00,0x00,0x00,0x80,0x01,0x00,0x80,0x07,0x18,0x00,0x1E,0x18,0x00,0x78,0x1C,0x00,0xE0,0x0F,0x00,0xE0,0x03,0x00,0x78,0x00,0x00,0x1E,0x00,0x80,0x07,0x00,0x80,0x01, // 121
0x00,0x00,0x00,0x80,0x81,0x01,0x80,0xC1,0x01,0x80,0xF1,0x01,0x80,0xF9,0x01,0x80,0x9D,0x01,0x80,0x8F,0x01,0x80,0x83,0x01,0x80,0x81,0x01, // 122
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x1C,0x00,0xF0,0xFF,0x07,0xF8,0xF3,0x0F,0x18,0x00,0x0C,0x18,0x00,0x0C,0x18,0x00,0x0C, // 123
0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x1F,0xF8,0xFF,0x1F, // 124
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x0C,0x18,0x00,0x0C,0x18,0x00,0x0C,0xF8,0xF3,0x0F,0xF0,0xFF,0x07,0x00,0x1C,0x00,0x00,0x0C,0x00,0x00,0x0C, // 125
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x0E,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x06, // 126
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 127
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 128
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 129
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 130
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 131
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 132
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 133
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 134
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 135
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 136
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 137
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 138
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 139
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 140
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 141
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 142
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 143
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 144
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 145
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 146
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 147
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 148
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 149
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 150
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 151
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 152
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 153
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 154
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 155
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 156
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 157
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 158
0x00,0x00,0x00,0xF0,0xFF,0x0F,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x08,0xF0,0xFF,0x0F, // 159
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xF9,0x0F,0x80,0xF9,0x0F, // 161
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x00,0xC3,0x00,0x80,0x81,0x01,0x80,0x81,0x01,0xF0,0xFF,0x0F,0x80,0x81,0x01,0x00,0xC3, // 162
0x00,0x00,0x00,0x00,0x8C,0x01,0x00,0x8C,0x01,0xC0,0xFF,0x01,0xE0,0xFF,0x01,0x70,0x8C,0x01,0x30,0x8C,0x01,0x30,0x8C,0x01,0x30,0x80,0x01,0x60,0x80,0x01, // 163
0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x6B,0x00,0x00,0x7F,0x00,0x00,0x22,0x00,0x00,0x63,0x00,0x00,0x22,0x00,0x00,0x7F,0x00,0x00,0x6B,0x00,0x80,0x80, // 164
0x00,0x00,0x00,0x10,0x12,0x00,0x70,0x12,0x00,0xE0,0x13,0x00,0x80,0x17,0x00,0x00,0xFE,0x01,0x00,0xFE,0x01,0x80,0x17,0x00,0xE0,0x13,0x00,0x70,0x12,0x00,0x10,0x12, // 165
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xE7,0x0F,0xF0,0xE7,0x0F, // 166
0x00,0x00,0x00,0x00,0x0C,0x00,0xE0,0x1E,0x06,0xF0,0x33,0x06,0x30,0x63,0x06,0x30,0xE6,0x07,0x30,0xBC,0x03,0x00,0x1C, // 167
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18, // 168
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0xC0,0x60,0x00,0x60,0xC0,0x00,0x20,0x8E,0x00,0x10,0x11,0x01,0x90,0x20,0x01,0x90,0x20,0x01,0x90,0x20,0x01,0x90,0x10,0x01,0x20,0x80,0x00,0x60,0xC0,0x00,0xC0,0x60,0x00,0x00,0x1F, // 169
0x00,0x00,0x00,0x80,0x13,0x00,0xD0,0x14,0x00,0x50,0x14,0x00,0x50,0x14,0x00,0x50,0x14,0x00,0x50,0x12,0x00,0xE0,0x17, // 170
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x66,0x00,0x00,0xC3,0x00,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x66,0x00,0x00,0xC3, // 171
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x3E,0x00,0x00,0x3E, // 172
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18, // 173
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0xC0,0x60,0x00,0x60,0xC0,0x00,0x20,0x80,0x00,0x90,0x3F,0x01,0x90,0x04,0x01,0x90,0x04,0x01,0x90,0x0C,0x01,0x10,0x33,0x01,0x20,0xA0,0x00,0x60,0xC0,0x00,0xC0,0x60,0x00,0x00,0x1F, // 174
0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30, // 175
0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x30,0x03,0x00,0x10,0x02,0x00,0x10,0x02,0x00,0x30,0x03,0x00,0xE0,0x01, // 176
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x01,0x00,0x86,0x01,0x00,0x86,0x01,0x00,0x86,0x01,0x00,0x86,0x01,0xC0,0xBF,0x01,0xC0,0xBF,0x01,0x00,0x86,0x01,0x00,0x86,0x01,0x00,0x86,0x01,0x00,0x86,0x01,0x00,0x86,0x01, // 177
0x00,0x00,0x00,0x20,0x04,0x00,0x10,0x06,0x00,0x10,0x05,0x00,0x90,0x04,0x00,0x60,0x04, // 178
0x00,0x00,0x00,0x10,0x04,0x00,0x50,0x04,0x00,0x50,0x04,0x00,0x50,0x04,0x00,0xB0,0x03, // 179
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x30,0x00,0x00,0x18,0x00,0x00,0x08, // 180
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x1F,0x80,0xFF,0x1F,0x00,0xC0,0x00,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0xC0,0x00,0x80,0xFF,0x00,0x80,0xFF,0x01,0x00,0x80,0x01, // 181
0x00,0x00,0x00,0xC0,0x03,0x00,0xE0,0x07,0x00,0xF0,0x07,0x00,0xF0,0x07,0x00,0xF0,0xFF,0x07,0x10,0x00,0x00,0x10,0x00,0x00,0xF0,0xFF,0x07, // 182
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x0C, // 183
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x0E,0x00,0x00,0x0C, // 184
0x00,0x00,0x00,0x10,0x04,0x00,0x10,0x04,0x00,0xF0,0x07,0x00,0x00,0x04,0x00,0x00,0x04, // 185
0x00,0x00,0x00,0xC0,0x13,0x00,0x20,0x12,0x00,0x10,0x14,0x00,0x10,0x14,0x00,0x10,0x14,0x00,0x30,0x16,0x00,0xE0,0x13, // 186
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC3,0x00,0x00,0x66,0x00,0x00,0x3C,0x00,0x00,0x18,0x00,0x00,0xC3,0x00,0x00,0x66,0x00,0x00,0x3C,0x00,0x00,0x18, // 187
0x00,0x00,0x00,0x10,0x04,0x00,0x10,0x04,0x00,0xF0,0x07,0x00,0x00,0x04,0x01,0x00,0x84,0x01,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x0C,0x00,0x00,0x06,0x00,0x80,0x01,0x00,0xC0,0x60,0x00,0x30,0x50,0x00,0x10,0x48,0x00,0x00,0x44,0x00,0x00,0xFC,0x01,0x00,0x40, // 188
0x00,0x00,0x00,0x10,0x04,0x00,0x10,0x04,0x00,0xF0,0x07,0x00,0x00,0x04,0x01,0x00,0x84,0x01,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x0C,0x00,0x00,0x06,0x00,0x80,0x01,0x00,0xC0,0x08,0x01,0x30,0x84,0x01,0x10,0x44,0x01,0x00,0x24,0x01,0x00,0x18,0x01, // 189
0x00,0x00,0x00,0x10,0x04,0x00,0x50,0x04,0x00,0x50,0x04,0x00,0x50,0x04,0x01,0xB0,0x83,0x01,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x0C,0x00,0x00,0x06,0x00,0x80,0x01,0x00,0xC0,0x60,0x00,0x30,0x50,0x00,0x10,0x48,0x00,0x00,0x44,0x00,0x00,0xFC,0x01,0x00,0x40, // 190
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x80,0x0F,0x00,0xE0,0x1C,0x80,0x7D,0x18,0x80,0x3D,0x18,0x00,0x00,0x18,0x00,0x00,0x0C, // 191
0x00,0x00,0x01,0x00,0xE0,0x01,0x00,0xF8,0x00,0x00,0x3F,0x00,0xC0,0x37,0x00,0xF2,0x30,0x00,0xF6,0x30,0x00,0xC4,0x37,0x00,0x00,0x3F,0x00,0x00,0xF8,0x00,0x00,0xE0,0x01,0x00,0x00,0x01, // 192
0x00,0x00,0x01,0x00,0xE0,0x01,0x00,0xF8,0x00,0x00,0x3F,0x00,0xC0,0x37,0x00,0xF4,0x30,0x00,0xF6,0x30,0x00,0xC2,0x37,0x00,0x00,0x3F,0x00,0x00,0xF8,0x00,0x00,0xE0,0x01,0x00,0x00,0x01, // 193
0x00,0x00,0x01,0x00,0xE0,0x01,0x00,0xF8,0x00,0x00,0x3F,0x00,0xC4,0x37,0x00,0xF2,0x30,0x00,0xF2,0x30,0x00,0xC4,0x37,0x00,0x00,0x3F,0x00,0x00,0xF8,0x00,0x00,0xE0,0x01,0x00,0x00,0x01, // 194
0x00,0x00,0x01,0x00,0xE0,0x01,0x00,0xF8,0x00,0x04,0x3F,0x00,0xC2,0x37,0x00,0xF2,0x30,0x00,0xF4,0x30,0x00,0xC4,0x37,0x00,0x02,0x3F,0x00,0x00,0xF8,0x00,0x00,0xE0,0x01,0x00,0x00,0x01, // 195
0x00,0x00,0x01,0x00,0xE0,0x01,0x00,0xF8,0x00,0x06,0x3F,0x00,0xC6,0x37,0x00,0xF0,0x30,0x00,0xF0,0x30,0x00,0xC6,0x37,0x00,0x06,0x3F,0x00,0x00,0xF8,0x00,0x00,0xE0,0x01,0x00,0x00,0x01, // 196
0x00,0x00,0x01,0x00,0xE0,0x01,0x00,0xF8,0x00,0x00,0x3F,0x00,0xCE,0x37,0x00,0xF1,0x30,0x00,0xF1,0x30,0x00,0xCE,0x37,0x00,0x00,0x3F,0x00,0x00,0xF8,0x00,0x00,0xE0,0x01,0x00,0x00,0x01, // 197
0x00,0x00,0x01,0x00,0xC0,0x01,0x00,0xF8,0x00,0x00,0x3E,0x00,0x80,0x37,0x00,0xF0,0x31,0x00,0x70,0x30,0x00,0x30,0x30,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01, // 198
0x00,0x00,0x00,0x00,0x1F,0x00,0xC0,0x7F,0x00,0xE0,0xE0,0x00,0x60,0xC0,0x00,0x30,0x80,0x01,0x30,0x80,0x09,0x30,0x80,0x09,0x30,0x80,0x0F,0x30,0x80,0x0D,0x30,0x80,0x01,0x60,0xC0, // 199
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x32,0x86,0x01,0x36,0x86,0x01,0x34,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01, // 200
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x34,0x86,0x01,0x36,0x86,0x01,0x32,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01, // 201
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF4,0xFF,0x01,0x36,0x86,0x01,0x32,0x86,0x01,0x36,0x86,0x01,0x34,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01, // 202
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF6,0xFF,0x01,0x36,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x36,0x86,0x01,0x36,0x86,0x01,0x30,0x86,0x01, // 203
0x00,0x00,0x00,0x02,0x00,0x00,0xF6,0xFF,0x01,0xF4,0xFF,0x01, // 204
0x00,0x00,0x00,0x04,0x00,0x00,0xF6,0xFF,0x01,0xF2,0xFF,0x01, // 205
0x00,0x00,0x00,0x04,0x00,0x00,0xF2,0xFF,0x01,0xF2,0xFF,0x01,0x04, // 206
0x06,0x00,0x00,0x06,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x06,0x00,0x00,0x06, // 207
0x00,0x06,0x00,0x00,0x06,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x86,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x60,0xC0,0x00,0xE0,0xE0,0x00,0xC0,0x7F,0x00,0x80,0x3F, // 208
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0xF4,0x00,0x00,0xC2,0x03,0x00,0x02,0x07,0x00,0x04,0x1C,0x00,0x04,0x78,0x00,0x02,0xE0,0x01,0xF0,0xFF,0x01,0xF0,0xFF,0x01, // 209
0x00,0x00,0x00,0x00,0x1F,0x00,0xC0,0x7F,0x00,0xE0,0xE0,0x00,0x70,0xC0,0x01,0x30,0x80,0x01,0x32,0x80,0x01,0x36,0x80,0x01,0x34,0x80,0x01,0x70,0xC0,0x01,0xE0,0xE0,0x00,0xC0,0x7F,0x00,0x00,0x1F, // 210
0x00,0x00,0x00,0x00,0x1F,0x00,0xC0,0x7F,0x00,0xE0,0xE0,0x00,0x70,0xC0,0x01,0x30,0x80,0x01,0x34,0x80,0x01,0x36,0x80,0x01,0x32,0x80,0x01,0x70,0xC0,0x01,0xE0,0xE0,0x00,0xC0,0x7F,0x00,0x00,0x1F, // 211
0x00,0x00,0x00,0x00,0x1F,0x00,0xC0,0x7F,0x00,0xE0,0xE0,0x00,0x70,0xC0,0x01,0x34,0x80,0x01,0x32,0x80,0x01,0x32,0x80,0x01,0x34,0x80,0x01,0x70,0xC0,0x01,0xE0,0xE0,0x00,0xC0,0x7F,0x00,0x00,0x1F, // 212
0x00,0x00,0x00,0x00,0x1F,0x00,0xC0,0x7F,0x00,0xE0,0xE0,0x00,0x74,0xC0,0x01,0x32,0x80,0x01,0x32,0x80,0x01,0x34,0x80,0x01,0x34,0x80,0x01,0x72,0xC0,0x01,0xE0,0xE0,0x00,0xC0,0x7F,0x00,0x00,0x1F, // 213
0x00,0x00,0x00,0x00,0x1F,0x00,0xC0,0x7F,0x00,0xE0,0xE0,0x00,0x76,0xC0,0x01,0x36,0x80,0x01,0x30,0x80,0x01,0x30,0x80,0x01,0x36,0x80,0x01,0x76,0xC0,0x01,0xE0,0xE0,0x00,0xC0,0x7F,0x00,0x00,0x1F, // 214
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x00,0xC0,0xE1,0x00,0x80,0x73,0x00,0x00,0x3F,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x3F,0x00,0x80,0x73,0x00,0xC0,0xE1,0x00,0x80,0x40, // 215
0x00,0x00,0x00,0x80,0x1F,0x01,0xC0,0xFF,0x00,0xE0,0x60,0x00,0x70,0xF0,0x00,0x30,0x98,0x01,0x30,0x8C,0x01,0x30,0x86,0x01,0x30,0x83,0x01,0xE0,0xC1,0x01,0xC0,0xE0,0x00,0xE0,0x7F,0x00,0x10,0x3F, // 216
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0x00,0xF0,0xFF,0x00,0x00,0xC0,0x01,0x02,0x80,0x01,0x06,0x80,0x01,0x04,0x80,0x01,0x00,0x80,0x01,0x00,0xC0,0x01,0xF0,0xFF,0x00,0xF0,0x3F, // 217
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0x00,0xF0,0xFF,0x00,0x00,0xC0,0x01,0x04,0x80,0x01,0x06,0x80,0x01,0x02,0x80,0x01,0x00,0x80,0x01,0x00,0xC0,0x01,0xF0,0xFF,0x00,0xF0,0x3F, // 218
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0x00,0xF0,0xFF,0x00,0x00,0xC0,0x01,0x04,0x80,0x01,0x02,0x80,0x01,0x02,0x80,0x01,0x04,0x80,0x01,0x00,0xC0,0x01,0xF0,0xFF,0x00,0xF0,0x3F, // 219
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0x00,0xF0,0xFF,0x00,0x06,0xC0,0x01,0x06,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x06,0x80,0x01,0x06,0xC0,0x01,0xF0,0xFF,0x00,0xF0,0x3F, // 220
0x10,0x00,0x00,0x30,0x00,0x00,0x70,0x00,0x00,0xC0,0x01,0x00,0x84,0x03,0x00,0x06,0xFE,0x01,0x02,0xFE,0x01,0x80,0x03,0x00,0xC0,0x01,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x10, // 221
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0xF0,0xFF,0x01,0xC0,0x30,0x00,0xC0,0x30,0x00,0xC0,0x30,0x00,0xC0,0x39,0x00,0x80,0x1F,0x00,0x00,0x0F, // 222
0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x01,0xF0,0xFF,0x01,0x38,0x00,0x00,0x18,0xC0,0x00,0x98,0x83,0x01,0x98,0x87,0x01,0xF0,0x8C,0x01,0x60,0xF8,0x01,0x00,0xF0, // 223
0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF3,0x01,0x88,0x99,0x01,0x98,0x99,0x01,0xB0,0x99,0x01,0xA0,0xDB,0x00,0x00,0xFF,0x01,0x00,0xFE,0x01, // 224
0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF3,0x01,0x80,0x99,0x01,0xA0,0x99,0x01,0xB0,0x99,0x01,0x98,0xDB,0x00,0x08,0xFF,0x01,0x00,0xFE,0x01, // 225
0x00,0x00,0x00,0x00,0xF0,0x00,0x20,0xF3,0x01,0xB0,0x99,0x01,0x98,0x99,0x01,0x98,0x99,0x01,0xB0,0xDB,0x00,0x20,0xFF,0x01,0x00,0xFE,0x01, // 226
0x00,0x00,0x00,0x00,0xF0,0x00,0x18,0xF3,0x01,0x88,0x99,0x01,0x88,0x99,0x01,0x90,0x99,0x01,0x90,0xDB,0x00,0x18,0xFF,0x01,0x00,0xFE,0x01, // 227
0x00,0x00,0x00,0x00,0xF0,0x00,0x18,0xF3,0x01,0x98,0x99,0x01,0x80,0x99,0x01,0x80,0x99,0x01,0x98,0xDB,0x00,0x18,0xFF,0x01,0x00,0xFE,0x01, // 228
0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF3,0x01,0x9C,0x99,0x01,0xA2,0x99,0x01,0xA2,0x99,0x01,0xA2,0xDB,0x00,0x1C,0xFF,0x01,0x00,0xFE,0x01, // 229
0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF3,0x01,0x80,0x99,0x01,0x80,0x99,0x01,0x80,0x99,0x01,0x80,0xDB,0x00,0x00,0x7F,0x00,0x00,0xFE,0x00,0x00,0xDB,0x00,0x80,0x99,0x01,0x80,0x99,0x01,0x80,0x99,0x01,0x80,0x9B,0x01,0x00,0x9F,0x01,0x00,0xDE, // 230
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x00,0xC3,0x00,0x80,0x81,0x09,0x80,0x81,0x09,0x80,0x81,0x0F,0x80,0x81,0x0D,0x00,0xC3, // 231
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x08,0xDB,0x00,0x98,0x99,0x01,0xB0,0x99,0x01,0xA0,0x99,0x01,0x80,0x99,0x01,0x80,0x9B,0x01,0x00,0x9F,0x01,0x00,0xDE, // 232
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x00,0xDB,0x00,0xA0,0x99,0x01,0xB0,0x99,0x01,0x98,0x99,0x01,0x88,0x99,0x01,0x80,0x9B,0x01,0x00,0x9F,0x01,0x00,0xDE, // 233
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x20,0xDB,0x00,0xB0,0x99,0x01,0x98,0x99,0x01,0x98,0x99,0x01,0xB0,0x99,0x01,0xA0,0x9B,0x01,0x00,0x9F,0x01,0x00,0xDE, // 234
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x18,0xDB,0x00,0x98,0x99,0x01,0x80,0x99,0x01,0x80,0x99,0x01,0x98,0x99,0x01,0x98,0x9B,0x01,0x00,0x9F,0x01,0x00,0xDE, // 235
0x08,0x00,0x00,0x18,0x00,0x00,0xB0,0xFF,0x01,0xA0,0xFF,0x01, // 236
0x00,0x00,0x00,0x20,0x00,0x00,0xB0,0xFF,0x01,0x98,0xFF,0x01,0x08, // 237
0x20,0x00,0x00,0x30,0x00,0x00,0x98,0xFF,0x01,0x98,0xFF,0x01,0x30, // 238
0x18,0x00,0x00,0x18,0x00,0x00,0x80,0xFF,0x01,0x80,0xFF,0x01,0x18, // 239
0x00,0x00,0x00,0x00,0x3C,0x00,0x20,0xFF,0x00,0x20,0xC3,0x00,0xB8,0x81,0x01,0xB0,0x81,0x01,0xF0,0x81,0x01,0xD0,0x81,0x01,0x90,0xC3,0x00,0x08,0xFF,0x00,0x00,0x3E, // 240
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x01,0x98,0xFF,0x01,0x08,0x03,0x00,0x88,0x01,0x00,0x90,0x01,0x00,0x90,0x03,0x00,0x98,0xFF,0x01,0x00,0xFE,0x01, // 241
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x08,0xC3,0x00,0x98,0x81,0x01,0xB0,0x81,0x01,0xA0,0x81,0x01,0x80,0x81,0x01,0x00,0xC3,0x00,0x00,0xFF,0x00,0x00,0x3C, // 242
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x00,0xC3,0x00,0xA0,0x81,0x01,0xB0,0x81,0x01,0x98,0x81,0x01,0x88,0x81,0x01,0x00,0xC3,0x00,0x00,0xFF,0x00,0x00,0x3C, // 243
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x20,0xC3,0x00,0xB0,0x81,0x01,0x98,0x81,0x01,0x98,0x81,0x01,0xB0,0x81,0x01,0x20,0xC3,0x00,0x00,0xFF,0x00,0x00,0x3C, // 244
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x18,0xC3,0x00,0x88,0x81,0x01,0x88,0x81,0x01,0x90,0x81,0x01,0x90,0x81,0x01,0x18,0xC3,0x00,0x00,0xFF,0x00,0x00,0x3C, // 245
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x18,0xC3,0x00,0x98,0x81,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x98,0x81,0x01,0x18,0xC3,0x00,0x00,0xFF,0x00,0x00,0x3C, // 246
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x80,0x6D,0x00,0x80,0x6D,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C, // 247
0x00,0x00,0x00,0x00,0x3C,0x03,0x00,0xFF,0x00,0x00,0xC3,0x00,0x80,0xA1,0x01,0x80,0x91,0x01,0x80,0x89,0x01,0x80,0x85,0x01,0x00,0xC3,0x00,0x00,0xFF,0x00,0xC0,0x3C, // 248
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0x88,0xFF,0x01,0x18,0xC0,0x01,0x30,0x80,0x01,0x20,0x80,0x01,0x00,0xC0,0x00,0x80,0xFF,0x01,0x80,0xFF,0x01, // 249
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0x80,0xFF,0x01,0x20,0xC0,0x01,0x30,0x80,0x01,0x18,0x80,0x01,0x08,0xC0,0x00,0x80,0xFF,0x01,0x80,0xFF,0x01, // 250
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0xA0,0xFF,0x01,0x30,0xC0,0x01,0x18,0x80,0x01,0x18,0x80,0x01,0x30,0xC0,0x00,0xA0,0xFF,0x01,0x80,0xFF,0x01, // 251
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0x98,0xFF,0x01,0x18,0xC0,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x18,0xC0,0x00,0x98,0xFF,0x01,0x80,0xFF,0x01, // 252
0x00,0x00,0x00,0x80,0x01,0x00,0x80,0x07,0x18,0x00,0x1E,0x18,0x20,0x78,0x1C,0x30,0xE0,0x0F,0x18,0xE0,0x03,0x08,0x78,0x00,0x00,0x1E,0x00,0x80,0x07,0x00,0x80,0x01, // 253
0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x1F,0xF8,0xFF,0x1F,0x00,0xC3,0x00,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0xC3,0x01,0x00,0xFF,0x00,0x00,0x7E, // 254
0x00,0x00,0x00,0x80,0x01,0x00,0x80,0x07,0x18,0x18,0x1E,0x18,0x18,0x78,0x1C,0x00,0xE0,0x0F,0x18,0xE0,0x03,0x18,0x78,0x00,0x00,0x1E,0x00,0x80,0x07,0x00,0x80,0x01 // 255
};
#endif
+1
View File
@@ -367,6 +367,7 @@ static const char DATA_ESPEASY_DEFAULT_MIN_CSS[] PROGMEM = {
// #define USES_P105 // Atlas_EZO_ORP
// #define USES_P106 // BME680
// #define USES_P107 // Si1145
// #define USES_P109 // ThermoOLED
// #define USES_P110 // VL53L0X Time of Flight sensor
// #define USES_P111 // RF522 RFID reader
// #define USES_P113 // VL53L1X ToF
+938
View File
@@ -0,0 +1,938 @@
#include "_Plugin_Helper.h"
#ifdef USES_P109
# include "src/Globals/ESPEasyWiFiEvent.h"
/*##########################################################################################
##################### Plugin 109: OLED SSD1306 display for Thermostat ####################
##########################################################################################
This is a modification to Plugin_036 with graphics library provided from squix78 github
https://github.com/squix78/esp8266-oled-ssd1306
Features :
- Displays and use current temperature from specified Device/Value (can be a Dummy for example)
- Displays and maintains setpoint value
- on power down/up this plugin maintains and reloads RELAY and SETPOINT values from SPIFFS
- Supports 3 buttons, LEFT, RIGHT and MODE selection (MODE button cycles modes below,
LEFT/RIGHT increases-decreases setpoint OR timeout (Mode sensitive)
- one output relay need to be specified, currently only HIGH level active supported
- 3 mode is available:
- 0 or X: set relay permanently off no matter what
- 1 or A: set relay ON if current temperature below setpoint, and set OFF when
temperature+hysteresis reached - comparison made at setted Plugin interval (AUTO MODE)
- 2 or M: set relay ON for specified time in minutes (MANUAL ON MODE), after timeout, mode switch to "A"
List of commands :
- oledframedcmd,[OLED_STATUS] Inherited command from P036 status can be:
[off/on/low/med/high]
- thermo,setpoint,[target_temperature] Target setpoint, only used in Mode "A"
- thermo,heating,[RELAY_STATUS] Manually forcing relay status [off/on]
- thermo,mode,[MODE],[TIMEOUT] Set to either mode X/A/M, if M selected,
then TIMEOUT can be specified in minutes
Command Examples :
- /control?cmd=thermo,setpoint,23 Set target setpoint to 23 Celsius
- /control?cmd=thermo,mode,1 Set mode to AUTOMATIC so it starts to maintain setpoint temperature
- /control?cmd=thermo,mode,2,5 Starts pre-heat for 5 minute, does not care about TEMP, then go to AUTO mode after timeout
- /control?cmd=thermo,mode,0 Switch heating off, absolutely do nothing until further notice
------------------------------------------------------------------------------------------
Copyleft Nagy Sándor 2018 - https://bitekmindenhol.blog.hu/
------------------------------------------------------------------------------------------
*/
# define PLUGIN_109
# define PLUGIN_ID_109 109
# define PLUGIN_NAME_109 "Display - OLED SSD1306/SH1106 Thermo"
# define PLUGIN_VALUENAME1_109 "setpoint"
# define PLUGIN_VALUENAME2_109 "heating"
# define PLUGIN_VALUENAME3_109 "mode"
# define PLUGIN_VALUENAME4_109 "timeout"
# define P109_Nlines 1
# define P109_Nchars 32
# define P109_CONTRAST_OFF 1
# define P109_CONTRAST_LOW 64
# define P109_CONTRAST_MED 0xCF
# define P109_CONTRAST_HIGH 0xFF
# include "SSD1306.h"
# include "SH1106Wire.h"
# include "Dialog_Plain_12_font.h"
# include "Dialog_Plain_18_font.h"
const char flameimg[] PROGMEM = {
0x00, 0x20, 0x00,
0x00, 0x70, 0x00,
0x00, 0x78, 0x00,
0x00, 0x7c, 0x00,
0x00, 0x7c, 0x00,
0x80, 0x7f, 0x00,
0xc0, 0xff, 0x00,
0xc0, 0xff, 0x00,
0xe0, 0xff, 0x04,
0xe0, 0xff, 0x05,
0xf0, 0xff, 0x0f,
0xf0, 0xff, 0x0f,
0xf8, 0xff, 0x0f,
0xf8, 0xff, 0x1f,
0xf8, 0xff, 0x1f,
0xf8, 0xff, 0x3f,
0xf8, 0xff, 0x3f,
0xf8, 0xf3, 0x3f,
0xf8, 0xf1, 0x3f,
0xf8, 0xf1, 0x3f,
0xf8, 0xe1, 0x3f,
0xf0, 0x21, 0x3f,
0xf0, 0x01, 0x1f,
0xe0, 0x01, 0x0f,
0xc0, 0x01, 0x0f,
0x80, 0x01, 0x07,
0x00, 0x03, 0x01
};
# define P109_WIFI_STATE_UNSET -2
# define P109_WIFI_STATE_NOT_CONNECTED -1
float Plugin_109_prev_temp = 99;
float Plugin_109_prev_setpoint;
float Plugin_109_prev_timeout;
byte Plugin_109_prev_heating;
byte Plugin_109_prev_mode;
byte Plugin_109_taskindex;
byte Plugin_109_varindex;
byte Plugin_109_changed;
boolean Plugin_109_init = false;
unsigned long Plugin_109_lastsavetime = 0;
byte Plugin_109_saveneeded = 0;
static unsigned long Plugin_109_buttons[3];
static int8_t P109_lastWiFiState = P109_WIFI_STATE_UNSET;
// Instantiate display here - does not work to do this within the INIT call
OLEDDisplay *P109_display = NULL;
char P109_deviceTemplate[P109_Nlines][P109_Nchars];
boolean Plugin_109(byte function, struct EventStruct *event, String& string)
{
boolean success = false;
switch (function)
{
case PLUGIN_DEVICE_ADD:
{
Device[++deviceCount].Number = PLUGIN_ID_109;
Device[deviceCount].Type = DEVICE_TYPE_I2C;
Device[deviceCount].VType = Sensor_VType::SENSOR_TYPE_QUAD;
Device[deviceCount].Ports = 0;
Device[deviceCount].PullUpOption = false;
Device[deviceCount].InverseLogicOption = false;
Device[deviceCount].FormulaOption = true;
Device[deviceCount].ValueCount = 4;
Device[deviceCount].SendDataOption = true;
Device[deviceCount].TimerOption = true;
Device[deviceCount].TimerOptional = false;
Device[deviceCount].GlobalSyncOption = true;
break;
}
case PLUGIN_GET_DEVICENAME:
{
string = F(PLUGIN_NAME_109);
break;
}
case PLUGIN_GET_DEVICEVALUENAMES:
{
strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[0], PSTR(PLUGIN_VALUENAME1_109));
strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[1], PSTR(PLUGIN_VALUENAME2_109));
strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[2], PSTR(PLUGIN_VALUENAME3_109));
strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[3], PSTR(PLUGIN_VALUENAME4_109));
break;
}
case PLUGIN_WEBFORM_LOAD:
{
byte choice5 = Settings.TaskDevicePluginConfig[event->TaskIndex][2];
String options5[2];
options5[0] = F("SSD1306");
options5[1] = F("SH1106");
int optionValues5[2] = { 1, 2 };
addFormSelector(F("Controller"), F("plugin_109_controler"), 2, options5, optionValues5, choice5);
byte choice0 = Settings.TaskDevicePluginConfig[event->TaskIndex][0];
int optionValues0[2];
optionValues0[0] = 0x3C;
optionValues0[1] = 0x3D;
addFormSelectorI2C(F("plugin_109_adr"), 2, optionValues0, choice0);
byte choice1 = Settings.TaskDevicePluginConfig[event->TaskIndex][1];
String options1[2];
options1[0] = F("Normal");
options1[1] = F("Rotated");
int optionValues1[2] = { 1, 2 };
addFormSelector(F("Rotation"), F("plugin_109_rotate"), 2, options1, optionValues1, choice1);
LoadCustomTaskSettings(event->TaskIndex, (byte *)&P109_deviceTemplate, sizeof(P109_deviceTemplate));
for (byte varNr = 0; varNr < P109_Nlines; varNr++)
{
if (varNr == 0) {
addFormTextBox(String(F("Temperature source ")),
String(F("Plugin_109_template")) + (varNr + 1),
P109_deviceTemplate[varNr],
P109_Nchars);
} else {
addFormTextBox(String(F("Line ")) + (varNr + 1),
String(F("Plugin_109_template")) + (varNr + 1),
P109_deviceTemplate[varNr],
P109_Nchars);
}
}
addFormPinSelect(F("Button left"), F("taskdevicepin1"), Settings.TaskDevicePin1[event->TaskIndex]);
addFormPinSelect(F("Button right"), F("taskdevicepin2"), Settings.TaskDevicePin2[event->TaskIndex]);
addFormPinSelect(F("Button mode"), F("taskdevicepin3"), Settings.TaskDevicePin3[event->TaskIndex]);
addFormPinSelect(F("Relay"), F("heatrelay"), Settings.TaskDevicePluginConfig[event->TaskIndex][4]);
byte choice6 = Settings.TaskDevicePluginConfig[event->TaskIndex][3];
if (choice6 == 0) { choice6 = P109_CONTRAST_HIGH; }
String options6[3];
options6[0] = F("Low");
options6[1] = F("Medium");
options6[2] = F("High");
int optionValues6[3];
optionValues6[0] = P109_CONTRAST_LOW;
optionValues6[1] = P109_CONTRAST_MED;
optionValues6[2] = P109_CONTRAST_HIGH;
addFormSelector(F("Contrast"), F("plugin_109_contrast"), 3, options6, optionValues6, choice6);
byte choice4 = (Settings.TaskDevicePluginConfigFloat[event->TaskIndex][0] * 10);
String options4[3];
options4[0] = F("0.2");
options4[1] = F("0.5");
options4[2] = F("1");
int optionValues4[3];
optionValues4[0] = 2;
optionValues4[1] = 5;
optionValues4[2] = 10;
addFormSelector(F("Hysteresis"), F("plugin_109_hyst"), 3, options4, optionValues4, choice4);
success = true;
break;
}
case PLUGIN_WEBFORM_SAVE:
{
Settings.TaskDevicePluginConfig[event->TaskIndex][0] = getFormItemInt(F("plugin_109_adr"));
Settings.TaskDevicePluginConfig[event->TaskIndex][1] = getFormItemInt(F("plugin_109_rotate"));
Settings.TaskDevicePluginConfig[event->TaskIndex][2] = getFormItemInt(F("plugin_109_controler"));
Settings.TaskDevicePluginConfig[event->TaskIndex][3] = getFormItemInt(F("plugin_109_contrast"));
Settings.TaskDevicePluginConfig[event->TaskIndex][4] = getFormItemInt(F("heatrelay"));
Settings.TaskDevicePluginConfigFloat[event->TaskIndex][0] = (getFormItemInt(F("plugin_109_hyst")) / 10.0);
String argName;
for (byte varNr = 0; varNr < P109_Nlines; varNr++)
{
argName = F("Plugin_109_template");
argName += varNr + 1;
strncpy(P109_deviceTemplate[varNr], web_server.arg(argName).c_str(), sizeof(P109_deviceTemplate[varNr]));
}
SaveCustomTaskSettings(event->TaskIndex, (byte *)&P109_deviceTemplate, sizeof(P109_deviceTemplate));
success = true;
break;
}
case PLUGIN_INIT:
{
P109_lastWiFiState = P109_WIFI_STATE_UNSET;
// Load the custom settings from flash
LoadCustomTaskSettings(event->TaskIndex, (byte *)&P109_deviceTemplate, sizeof(P109_deviceTemplate));
// Init the display and turn it on
if (P109_display)
{
P109_display->end();
delete P109_display;
}
Plugin_109_taskindex = event->TaskIndex;
Plugin_109_varindex = event->BaseVarIndex;
uint8_t OLED_address = Settings.TaskDevicePluginConfig[event->TaskIndex][0];
if (Settings.TaskDevicePluginConfig[event->TaskIndex][2] == 1) {
P109_display = new SSD1306Wire(OLED_address, Settings.Pin_i2c_sda, Settings.Pin_i2c_scl);
} else {
P109_display = new SH1106Wire(OLED_address, Settings.Pin_i2c_sda, Settings.Pin_i2c_scl);
}
P109_display->init(); // call to local override of init function
P109_display->displayOn();
uint8_t OLED_contrast = Settings.TaskDevicePluginConfig[event->TaskIndex][3];
P109_setContrast(OLED_contrast);
String logstr = F("Thermo : Btn L:");
logstr += Settings.TaskDevicePin1[event->TaskIndex];
logstr += F("R:");
logstr += Settings.TaskDevicePin2[event->TaskIndex];
logstr += F("M:");
logstr += Settings.TaskDevicePin3[event->TaskIndex];
addLog(LOG_LEVEL_INFO, logstr);
if (Settings.TaskDevicePin1[event->TaskIndex] != -1)
{
pinMode(Settings.TaskDevicePin1[event->TaskIndex], INPUT_PULLUP);
}
if (Settings.TaskDevicePin2[event->TaskIndex] != -1)
{
pinMode(Settings.TaskDevicePin2[event->TaskIndex], INPUT_PULLUP);
}
if (Settings.TaskDevicePin3[event->TaskIndex] != -1)
{
pinMode(Settings.TaskDevicePin3[event->TaskIndex], INPUT_PULLUP);
}
Plugin_109_prev_temp = 99;
fs::File f = tryOpenFile(F("thermo.dat"), F("r"));
if (f)
{
f.read(((uint8_t *)&UserVar[event->BaseVarIndex] + 0), 16);
f.close();
}
Plugin_109_lastsavetime = millis();
if (UserVar[event->BaseVarIndex] < 1) {
UserVar[event->BaseVarIndex] = 19; // setpoint
UserVar[event->BaseVarIndex + 2] = 1; // mode (X=0,A=1,M=2)
}
// UserVar[event->BaseVarIndex + 1] = 0; // heating (0=off,1=heating in progress)
// UserVar[event->BaseVarIndex + 3] = 0; // timeout (manual on for minutes)
if (Settings.TaskDevicePluginConfig[event->TaskIndex][4] != -1)
{
// pinMode(Settings.TaskDevicePluginConfig[event->TaskIndex][4], OUTPUT);
P109_setHeatRelay(byte(UserVar[event->BaseVarIndex + 1]));
}
logstr = F("Thermo : Starting status S:");
logstr += String(UserVar[event->BaseVarIndex]);
logstr += F(", R:");
logstr += String(UserVar[event->BaseVarIndex + 1]);
addLog(LOG_LEVEL_INFO, logstr);
Plugin_109_changed = 1;
Plugin_109_buttons[0] = 0; Plugin_109_buttons[1] = 0; Plugin_109_buttons[2] = 0;
// flip screen if required
if (Settings.TaskDevicePluginConfig[event->TaskIndex][1] == 2) { P109_display->flipScreenVertically(); }
// Display the device name, logo, time and wifi
P109_display_header();
P109_display_page();
P109_display->display();
Plugin_109_init = true;
success = true;
break;
}
case PLUGIN_EXIT:
{
if (P109_display)
{
P109_display->end();
delete P109_display;
P109_display = NULL;
}
break;
}
case PLUGIN_TEN_PER_SECOND:
{
unsigned long current_time;
if (Plugin_109_init) {
if (Settings.TaskDevicePin1[event->TaskIndex] != -1)
{
if (!digitalRead(Settings.TaskDevicePin1[event->TaskIndex]))
{
current_time = millis();
if (Plugin_109_buttons[0] + 300 < current_time) {
Plugin_109_buttons[0] = current_time;
switch (int(UserVar[event->BaseVarIndex + 2])) {
case 0: { // off mode, no func
break;
}
case 1: { // auto mode, setpoint dec
P109_setSetpoint(F("-0.5"));
break;
}
case 2: { // manual on mode, timer dec
UserVar[event->BaseVarIndex + 3] = UserVar[event->BaseVarIndex + 3] - 300;
if (UserVar[event->BaseVarIndex + 3] < 0) {
UserVar[event->BaseVarIndex + 3] = 5400;
}
Plugin_109_prev_timeout = 32768;
Plugin_109_changed = 1;
break;
}
}
}
}
}
if (Settings.TaskDevicePin2[event->TaskIndex] != -1)
{
if (!digitalRead(Settings.TaskDevicePin2[event->TaskIndex]))
{
current_time = millis();
if (Plugin_109_buttons[1] + 300 < current_time) {
Plugin_109_buttons[1] = current_time;
switch (int(UserVar[event->BaseVarIndex + 2])) {
case 0: { // off mode, no func
break;
}
case 1: { // auto mode, setpoint inc
P109_setSetpoint(F("+0.5"));
break;
}
case 2: { // manual on mode, timer dec
UserVar[event->BaseVarIndex + 3] = UserVar[event->BaseVarIndex + 3] + 300;
if (UserVar[event->BaseVarIndex + 3] > 5400) {
UserVar[event->BaseVarIndex + 3] = 60;
}
Plugin_109_prev_timeout = 32768;
Plugin_109_changed = 1;
break;
}
}
}
}
}
if (Settings.TaskDevicePin3[event->TaskIndex] != -1)
{
if (!digitalRead(Settings.TaskDevicePin3[event->TaskIndex]))
{
current_time = millis();
if (Plugin_109_buttons[2] + 300 < current_time) {
Plugin_109_buttons[2] = current_time;
switch (int(UserVar[event->BaseVarIndex + 2])) {
case 0: { // off mode, next
P109_setMode(F("a"), F("0"));
break;
}
case 1: { // auto mode, next
P109_setMode(F("m"), F("5"));
break;
}
case 2: { // manual on mode, next
P109_setMode(F("x"), F("0"));
break;
}
}
}
}
}
}
break;
}
// Switch off display after displayTimer seconds
case PLUGIN_ONCE_A_SECOND:
{
if (Plugin_109_init) {
if (P109_display && P109_display_wifibars()) {
// WiFi symbol was updated.
P109_display->display();
}
if (UserVar[event->BaseVarIndex + 2] == 2) { // manual timeout
if (UserVar[event->BaseVarIndex + 3] > 0) {
UserVar[event->BaseVarIndex + 3] = UserVar[event->BaseVarIndex + 3] - 1;
P109_display_timeout();
} else {
UserVar[event->BaseVarIndex + 3] = 0;
P109_setMode(F("a"), F("0")); // heater to auto
P109_display_setpoint_temp(1);
}
}
if (Plugin_109_changed == 1) {
sendData(event);
Plugin_109_saveneeded = 1;
Plugin_109_changed = 0;
}
if (Plugin_109_saveneeded == 1) {
if ((Plugin_109_lastsavetime + 30000) < millis()) {
Plugin_109_saveneeded = 0;
Plugin_109_lastsavetime = millis();
fs::File f = tryOpenFile(F("thermo.dat"), F("w"));
if (f)
{
f.write(((uint8_t *)&UserVar[event->BaseVarIndex] + 0), 16);
f.close();
flashCount();
}
String logstr = F("Thermo : Save UserVars to SPIFFS");
addLog(LOG_LEVEL_INFO, logstr);
}
}
success = true;
}
break;
}
case PLUGIN_READ:
{
if (Plugin_109_init) {
// Update display
P109_display_header();
if (UserVar[event->BaseVarIndex + 2] == 1) {
String atempstr2 = P109_deviceTemplate[0];
String atempstr = parseTemplate(atempstr2, 20);
atempstr.trim();
if ((atempstr.length() > 0) && (Plugin_109_prev_temp != 99)) { // do not switch until the first temperature data arrives
float atemp = atempstr.toFloat();
if (atemp != 0.0) {
if ((UserVar[event->BaseVarIndex] > atemp) && (UserVar[event->BaseVarIndex + 1] < 1))
{
P109_setHeater(F("1"));
Plugin_109_changed = 1;
} else if (((((float)atemp - (float)Settings.TaskDevicePluginConfigFloat[event->TaskIndex][0]) >=
(float)UserVar[event->BaseVarIndex])) && (UserVar[event->BaseVarIndex + 1] > 0)) {
P109_setHeater(F("0"));
Plugin_109_changed = 1;
} else {
P109_display_heat();
}
}
} else {
P109_display_heat();
}
}
P109_display_current_temp();
P109_display_timeout();
P109_display->display();
success = true;
}
break;
}
case PLUGIN_WRITE:
{
String command = parseString(string, 1);
String subcommand = parseString(string, 2);
String logstr;
if (Plugin_109_init) {
if (command == F("oledframedcmd"))
{
success = true;
if (subcommand == F("off")) {
P109_setContrast(P109_CONTRAST_OFF);
}
else if (subcommand == F("on")) {
P109_display->displayOn();
}
else if (subcommand == F("low")) {
P109_setContrast(P109_CONTRAST_LOW);
}
else if (subcommand == F("med")) {
P109_setContrast(P109_CONTRAST_MED);
}
else if (subcommand == F("high")) {
P109_setContrast(P109_CONTRAST_HIGH);
}
logstr = F("\nOk");
SendStatus(event, logstr);
}
if (command == F("thermo"))
{
success = true;
String par1 = parseString(string, 3);
if (subcommand == F("setpoint")) {
P109_setSetpoint(par1);
}
else if (subcommand == F("heating")) {
P109_setHeater(par1); Plugin_109_changed = 1;
}
else if (subcommand == F("mode")) {
P109_setMode(par1, parseString(string, 4));
}
logstr = F("\nOk");
SendStatus(event, logstr);
}
}
break;
}
}
return success;
}
// Set the display contrast
// really low brightness & contrast: contrast = 10, precharge = 5, comdetect = 0
// normal brightness & contrast: contrast = 100
void P109_setContrast(uint8_t OLED_contrast) {
char contrast = 100;
char precharge = 241;
char comdetect = 64;
switch (OLED_contrast) {
case P109_CONTRAST_OFF:
if (P109_display) {
P109_display->displayOff();
}
return;
case P109_CONTRAST_LOW:
contrast = 10; precharge = 5; comdetect = 0;
break;
case P109_CONTRAST_MED:
contrast = P109_CONTRAST_MED; precharge = 0x1F; comdetect = 64;
break;
case P109_CONTRAST_HIGH:
default:
contrast = P109_CONTRAST_HIGH; precharge = 241; comdetect = 64;
break;
}
if (P109_display) {
P109_display->displayOn();
P109_display->setContrast(contrast, precharge, comdetect);
}
}
void P109_display_header() {
static boolean showWiFiName = true;
if (showWiFiName && (WiFiEventData.WiFiServicesInitialized())) {
String newString = WiFi.SSID();
newString.trim();
P109_display_title(newString);
} else {
String dtime = "%sysname%";
String newString = parseTemplate(dtime, 10);
newString.trim();
P109_display_title(newString);
}
showWiFiName = !showWiFiName;
// Display time and wifibars both clear area below, so paint them after the title.
P109_display_time();
P109_display_wifibars();
}
void P109_display_time() {
String dtime = "%systime%";
String newString = parseTemplate(dtime, 10);
P109_display->setTextAlignment(TEXT_ALIGN_LEFT);
P109_display->setFont(Dialog_plain_12);
P109_display->setColor(BLACK);
P109_display->fillRect(0, 0, 28, 13);
P109_display->setColor(WHITE);
P109_display->drawString(0, 0, newString.substring(0, 5));
}
void P109_display_title(String& title) {
P109_display->setTextAlignment(TEXT_ALIGN_CENTER);
P109_display->setFont(Dialog_plain_12);
P109_display->setColor(BLACK);
P109_display->fillRect(0, 0, 128, 15); // Underscores use a extra lines, clear also.
P109_display->setColor(WHITE);
P109_display->drawString(64, 0, title);
}
// Draw Signal Strength Bars, return true when there was an update.
bool P109_display_wifibars() {
const bool connected = WiFiEventData.WiFiServicesInitialized();
const int nbars_filled = (WiFi.RSSI() + 100) / 8;
const int newState = connected ? nbars_filled : P109_WIFI_STATE_UNSET;
if (newState == P109_lastWiFiState) {
return false; // nothing to do.
}
int x = 105;
int y = 0;
int size_x = 15;
int size_y = 10;
int nbars = 5;
int16_t width = (size_x / nbars);
size_x = width * nbars - 1; // Correct for round errors.
// x,y are the x,y locations
// sizex,sizey are the sizes (should be a multiple of the number of bars)
// nbars is the number of bars and nbars_filled is the number of filled bars.
// We leave a 1 pixel gap between bars
P109_display->setColor(BLACK);
P109_display->fillRect(x, y, size_x, size_y);
P109_display->setColor(WHITE);
if (WiFiEventData.WiFiServicesInitialized()) {
for (byte ibar = 0; ibar < nbars; ibar++) {
int16_t height = size_y * (ibar + 1) / nbars;
int16_t xpos = x + ibar * width;
int16_t ypos = y + size_y - height;
if (ibar <= nbars_filled) {
// Fill complete bar
P109_display->fillRect(xpos, ypos, width - 1, height);
} else {
// Only draw top and bottom.
P109_display->fillRect(xpos, ypos, width - 1, 1);
P109_display->fillRect(xpos, y + size_y - 1, width - 1, 1);
}
}
} else {
// Draw a not connected sign.
}
return true;
}
void P109_display_current_temp() {
String tmpString = P109_deviceTemplate[0];
String atempstr = parseTemplate(tmpString, 20);
atempstr.trim();
if (atempstr.length() > 0) {
float atemp = atempstr.toFloat();
atemp = (round(atemp * 10)) / 10.0;
if (Plugin_109_prev_temp != atemp) {
P109_display->setColor(BLACK);
P109_display->fillRect(3, 19, 47, 25);
P109_display->setColor(WHITE);
tmpString = toString(atemp, 1);
P109_display->setFont(ArialMT_Plain_24);
P109_display->drawString(3, 19, tmpString.substring(0, 5));
Plugin_109_prev_temp = atemp;
}
}
}
void P109_display_setpoint_temp(byte force) {
if (UserVar[Plugin_109_varindex + 2] == 1) {
float stemp = (round(UserVar[Plugin_109_varindex] * 10)) / 10.0;
if ((Plugin_109_prev_setpoint != stemp) || (force == 1)) {
P109_display->setColor(BLACK);
P109_display->fillRect(86, 35, 41, 21);
P109_display->setColor(WHITE);
String tmpString = toString(stemp, 1);
P109_display->setFont(Dialog_plain_18);
P109_display->drawString(86, 35, tmpString.substring(0, 5));
Plugin_109_prev_setpoint = stemp;
Plugin_109_changed = 1;
}
}
}
void P109_display_timeout() {
if (UserVar[Plugin_109_varindex + 2] == 2) {
if (Plugin_109_prev_timeout >= (UserVar[Plugin_109_varindex + 3] + 60)) {
float timeinmin = UserVar[Plugin_109_varindex + 3] / 60;
String thour = toString(((int)(timeinmin / 60)), 0);
thour += F(":");
String thour2 = toString(((int)timeinmin % 60), 0);
if (thour2.length() < 2) {
thour += "0" + thour2;
} else {
thour += thour2;
}
P109_display->setColor(BLACK);
P109_display->fillRect(86, 35, 41, 21);
P109_display->setColor(WHITE);
P109_display->setFont(Dialog_plain_18);
P109_display->drawString(86, 35, thour.substring(0, 5));
Plugin_109_prev_timeout = UserVar[Plugin_109_varindex + 3];
}
}
}
void P109_display_mode() {
if (Plugin_109_prev_mode != UserVar[Plugin_109_varindex + 2]) {
String tmpString;
switch (int(UserVar[Plugin_109_varindex + 2]))
{
case 0:
{
tmpString = F("X");
break;
}
case 1:
{
tmpString = F("A");
break;
}
case 2:
{
tmpString = F("M");
break;
}
}
P109_display->setColor(BLACK);
P109_display->fillRect(61, 49, 12, 17);
P109_display->setColor(WHITE);
P109_display->setFont(ArialMT_Plain_16);
P109_display->drawString(61, 49, tmpString.substring(0, 5));
Plugin_109_prev_mode = UserVar[Plugin_109_varindex + 2];
}
}
void P109_display_heat() {
if (Plugin_109_prev_heating != UserVar[Plugin_109_varindex + 1]) {
P109_display->setColor(BLACK);
P109_display->fillRect(54, 19, 24, 27);
P109_display->setColor(WHITE);
if (UserVar[Plugin_109_varindex + 1] == 1) {
P109_display->drawXbm(54, 19, 24, 27, flameimg);
}
Plugin_109_prev_heating = UserVar[Plugin_109_varindex + 1];
}
}
void P109_display_page() {
// init with full clear
P109_display->setColor(BLACK);
P109_display->fillRect(0, 15, 128, 49);
P109_display->setColor(WHITE);
Plugin_109_prev_temp = 99;
Plugin_109_prev_setpoint = 0;
Plugin_109_prev_heating = 255;
Plugin_109_prev_mode = 255;
Plugin_109_prev_timeout = 32768;
P109_display->setFont(Dialog_plain_12);
P109_display->setTextAlignment(TEXT_ALIGN_LEFT);
String tstr = F("{D}C");
String newString = parseTemplate(tstr, 10);
P109_display->drawString(18, 46, newString.substring(0, 5));
P109_display_heat();
P109_display->drawHorizontalLine(0, 15, 128);
P109_display->drawVerticalLine(52, 14, 49);
P109_display->drawCircle(109, 47, 26);
P109_display->drawHorizontalLine(78, 47, 8);
P109_display->drawVerticalLine(109, 19, 10);
P109_display_mode();
P109_display_setpoint_temp(0);
P109_display_current_temp();
}
void P109_setSetpoint(String sptemp) {
float stemp = (round(UserVar[Plugin_109_varindex] * 10)) / 10.0;
if ((sptemp.charAt(0) == '+') || (sptemp.charAt(0) == 'p')) {
stemp = stemp + sptemp.substring(1).toFloat();
} else if ((sptemp.charAt(0) == '-') || (sptemp.charAt(0) == 'm')) {
stemp = stemp - sptemp.substring(1).toFloat();
} else {
stemp = sptemp.toFloat();
}
UserVar[Plugin_109_varindex] = stemp;
P109_display_setpoint_temp(0);
}
void P109_setHeatRelay(byte state) {
uint8_t relaypin = Settings.TaskDevicePluginConfig[Plugin_109_taskindex][4];
String logstr = F("Thermo : Set Relay");
logstr += relaypin;
logstr += F("=");
logstr += state;
addLog(LOG_LEVEL_INFO, logstr);
if (relaypin != -1) {
pinMode(relaypin, OUTPUT);
digitalWrite(relaypin, state);
}
}
void P109_setHeater(String heater) {
if ((heater == F("1")) || (heater == F("on"))) {
UserVar[Plugin_109_varindex + 1] = 1;
P109_setHeatRelay(HIGH);
} else if ((heater == F("0")) || (heater == F("off"))) {
UserVar[Plugin_109_varindex + 1] = 0;
P109_setHeatRelay(LOW);
} else if (UserVar[Plugin_109_varindex + 1] == 0) {
UserVar[Plugin_109_varindex + 1] = 1;
P109_setHeatRelay(HIGH);
} else {
UserVar[Plugin_109_varindex + 1] = 0;
P109_setHeatRelay(LOW);
}
P109_display_heat();
}
void P109_setMode(String amode, String atimeout) {
if ((amode == F("0")) || (amode == F("x"))) {
UserVar[Plugin_109_varindex + 2] = 0;
P109_setHeater(F("0"));
P109_display->setColor(BLACK);
P109_display->fillRect(86, 35, 41, 21);
Plugin_109_prev_setpoint = 0;
} else if ((amode == F("1")) || (amode == F("a"))) {
UserVar[Plugin_109_varindex + 2] = 1;
P109_display_setpoint_temp(1);
} else if ((amode == F("2")) || (amode == F("m"))) {
UserVar[Plugin_109_varindex + 2] = 2;
UserVar[Plugin_109_varindex + 3] = (atimeout.toFloat() * 60);
Plugin_109_prev_timeout = 32768;
P109_display_timeout();
P109_setHeater(F("1"));
} else {
UserVar[Plugin_109_varindex + 2] = 0;
}
Plugin_109_changed = 1;
P109_display_mode();
}
#endif // ifdef USES_P109
+6 -1
View File
@@ -1094,7 +1094,8 @@ To create/register a plugin, you have to :
#define USES_P106 // BME680
#define USES_P107 // SI1145 UV index
#define USES_P108 // DDS238-x ZN MODBUS energy meter (was P224 in the Playground)
// FIXME TD-er: Disabled due to build size
//#define USES_P109 // ThermoOLED
#define USES_P110 // VL53L0X Time of Flight sensor
#define USES_P113 // VL53L1X ToF
#endif
@@ -1190,6 +1191,10 @@ To create/register a plugin, you have to :
#ifndef USES_P099
#define USES_P099 // XPT2046 Touchscreen
#endif
#ifndef USES_P109
// FIXME TD-er: Disabled for now, due to build size.
//#define USES_P109 // ThermoOLED
#endif
#endif