From e9b1ac160b96a227cf0314d48a86a4d02d1e7904 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 22 May 2026 23:23:46 +0200 Subject: [PATCH 01/15] [P157] Add plugin for 14-segment displays (HT16K33) --- lib/NoiascaHt16k33/LICENSE | 24 + lib/NoiascaHt16k33/README.md | 17 + lib/NoiascaHt16k33/docs/changelog.txt | 14 + .../docs/ht16k33_class_model.png | Bin 0 -> 9459 bytes lib/NoiascaHt16k33/docs/html/annotated.html | 62 + lib/NoiascaHt16k33/docs/html/bc_s.png | Bin 0 -> 676 bytes lib/NoiascaHt16k33/docs/html/bdwn.png | Bin 0 -> 147 bytes .../html/class_noiasca__ht16k33-members.html | 65 + .../docs/html/class_noiasca__ht16k33.html | 317 +++ .../docs/html/class_noiasca__ht16k33.png | Bin 0 -> 1781 bytes ...lass_noiasca__ht16k33__hw__14-members.html | 65 + .../html/class_noiasca__ht16k33__hw__14.html | 111 + .../html/class_noiasca__ht16k33__hw__14.png | Bin 0 -> 1356 bytes ...s_noiasca__ht16k33__hw__14__4-members.html | 65 + .../class_noiasca__ht16k33__hw__14__4.html | 110 + .../class_noiasca__ht16k33__hw__14__4.png | Bin 0 -> 1006 bytes ...noiasca__ht16k33__hw__14__ext-members.html | 69 + .../class_noiasca__ht16k33__hw__14__ext.html | 224 ++ .../class_noiasca__ht16k33__hw__14__ext.png | Bin 0 -> 1029 bytes ...class_noiasca__ht16k33__hw__7-members.html | 66 + .../html/class_noiasca__ht16k33__hw__7.html | 138 ++ .../html/class_noiasca__ht16k33__hw__7.png | Bin 0 -> 1008 bytes ...noiasca__ht16k33__hw__7__4__c-members.html | 67 + .../class_noiasca__ht16k33__hw__7__4__c.html | 152 ++ .../class_noiasca__ht16k33__hw__7__4__c.png | Bin 0 -> 1001 bytes lib/NoiascaHt16k33/docs/html/classes.html | 58 + lib/NoiascaHt16k33/docs/html/closed.png | Bin 0 -> 132 bytes .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 62 + .../dir_bec663b67e4420d39ecb45ef100bdbac.html | 56 + lib/NoiascaHt16k33/docs/html/doc.png | Bin 0 -> 746 bytes lib/NoiascaHt16k33/docs/html/doxygen.css | 1841 +++++++++++++++++ lib/NoiascaHt16k33/docs/html/doxygen.svg | 26 + lib/NoiascaHt16k33/docs/html/dynsections.js | 121 ++ lib/NoiascaHt16k33/docs/html/folderclosed.png | Bin 0 -> 616 bytes lib/NoiascaHt16k33/docs/html/folderopen.png | Bin 0 -> 597 bytes lib/NoiascaHt16k33/docs/html/functions.html | 67 + .../docs/html/functions_func.html | 67 + lib/NoiascaHt16k33/docs/html/hierarchy.html | 62 + lib/NoiascaHt16k33/docs/html/index.html | 66 + lib/NoiascaHt16k33/docs/html/jquery.js | 35 + ...braries__noiasca_ht16k33__r_e_a_d_m_e.html | 63 + lib/NoiascaHt16k33/docs/html/menu.js | 127 ++ lib/NoiascaHt16k33/docs/html/menudata.js | 34 + lib/NoiascaHt16k33/docs/html/nav_f.png | Bin 0 -> 153 bytes lib/NoiascaHt16k33/docs/html/nav_g.png | Bin 0 -> 95 bytes lib/NoiascaHt16k33/docs/html/nav_h.png | Bin 0 -> 98 bytes lib/NoiascaHt16k33/docs/html/open.png | Bin 0 -> 123 bytes lib/NoiascaHt16k33/docs/html/pages.html | 57 + lib/NoiascaHt16k33/docs/html/splitbar.png | Bin 0 -> 314 bytes lib/NoiascaHt16k33/docs/html/sync_off.png | Bin 0 -> 853 bytes lib/NoiascaHt16k33/docs/html/sync_on.png | Bin 0 -> 845 bytes lib/NoiascaHt16k33/docs/html/tab_a.png | Bin 0 -> 142 bytes lib/NoiascaHt16k33/docs/html/tab_b.png | Bin 0 -> 169 bytes lib/NoiascaHt16k33/docs/html/tab_h.png | Bin 0 -> 177 bytes lib/NoiascaHt16k33/docs/html/tab_s.png | Bin 0 -> 184 bytes lib/NoiascaHt16k33/docs/html/tabs.css | 1 + lib/NoiascaHt16k33/docs/more.html | 11 + .../01_Strandtest_7segment.ino | 51 + .../02_Strandtest_14segment.ino | 50 + .../03_Strandtest_diagnostics.ino | 74 + .../11_HelloWorld_14segment.ino | 137 ++ .../examples/12_sevenseg/12_sevenseg.ino | 77 + .../examples/12_sevenseg/info.ino | 11 + .../13_format_number_7segment.ino | 133 ++ .../20_Multidisplay/20_Multidisplay.ino | 123 ++ .../examples/21_scrolltext/21_scrolltext.ino | 52 + .../23_clock_14segment_ds3231.ino | 135 ++ .../23_clock_14segment_ds3231/rtc.ino | 99 + .../90_development_tests.ino | 182 ++ lib/NoiascaHt16k33/keywords.txt | 41 + lib/NoiascaHt16k33/library.properties | 9 + lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp | 435 ++++ lib/NoiascaHt16k33/src/NoiascaHt16k33.h | 363 ++++ lib/NoiascaHt16k33/src/fonts/font14default.h | 121 ++ lib/NoiascaHt16k33/src/fonts/font14legacy.h | 121 ++ .../src/fonts/font14netherlands.h | 118 ++ lib/NoiascaHt16k33/src/fonts/font7legacy.h | 121 ++ lib/NoiascaHt16k33/src/zInfo.ino | 38 + src/_P157_14DGT.ino | 240 +++ src/src/CustomBuild/define_plugin_sets.h | 9 + src/src/PluginStructs/P157_data_struct.cpp | 1132 ++++++++++ src/src/PluginStructs/P157_data_struct.h | 216 ++ 82 files changed, 8408 insertions(+) create mode 100644 lib/NoiascaHt16k33/LICENSE create mode 100644 lib/NoiascaHt16k33/README.md create mode 100644 lib/NoiascaHt16k33/docs/changelog.txt create mode 100644 lib/NoiascaHt16k33/docs/ht16k33_class_model.png create mode 100644 lib/NoiascaHt16k33/docs/html/annotated.html create mode 100644 lib/NoiascaHt16k33/docs/html/bc_s.png create mode 100644 lib/NoiascaHt16k33/docs/html/bdwn.png create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33-members.html create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33.html create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33.png create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14-members.html create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14.html create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14.png create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__4-members.html create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__4.html create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__4.png create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__ext-members.html create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__ext.html create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__ext.png create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7-members.html create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7.html create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7.png create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7__4__c-members.html create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7__4__c.html create mode 100644 lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7__4__c.png create mode 100644 lib/NoiascaHt16k33/docs/html/classes.html create mode 100644 lib/NoiascaHt16k33/docs/html/closed.png create mode 100644 lib/NoiascaHt16k33/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html create mode 100644 lib/NoiascaHt16k33/docs/html/dir_bec663b67e4420d39ecb45ef100bdbac.html create mode 100644 lib/NoiascaHt16k33/docs/html/doc.png create mode 100644 lib/NoiascaHt16k33/docs/html/doxygen.css create mode 100644 lib/NoiascaHt16k33/docs/html/doxygen.svg create mode 100644 lib/NoiascaHt16k33/docs/html/dynsections.js create mode 100644 lib/NoiascaHt16k33/docs/html/folderclosed.png create mode 100644 lib/NoiascaHt16k33/docs/html/folderopen.png create mode 100644 lib/NoiascaHt16k33/docs/html/functions.html create mode 100644 lib/NoiascaHt16k33/docs/html/functions_func.html create mode 100644 lib/NoiascaHt16k33/docs/html/hierarchy.html create mode 100644 lib/NoiascaHt16k33/docs/html/index.html create mode 100644 lib/NoiascaHt16k33/docs/html/jquery.js create mode 100644 lib/NoiascaHt16k33/docs/html/md__c___daten_myrepository__arduino_libraries__noiasca_ht16k33__r_e_a_d_m_e.html create mode 100644 lib/NoiascaHt16k33/docs/html/menu.js create mode 100644 lib/NoiascaHt16k33/docs/html/menudata.js create mode 100644 lib/NoiascaHt16k33/docs/html/nav_f.png create mode 100644 lib/NoiascaHt16k33/docs/html/nav_g.png create mode 100644 lib/NoiascaHt16k33/docs/html/nav_h.png create mode 100644 lib/NoiascaHt16k33/docs/html/open.png create mode 100644 lib/NoiascaHt16k33/docs/html/pages.html create mode 100644 lib/NoiascaHt16k33/docs/html/splitbar.png create mode 100644 lib/NoiascaHt16k33/docs/html/sync_off.png create mode 100644 lib/NoiascaHt16k33/docs/html/sync_on.png create mode 100644 lib/NoiascaHt16k33/docs/html/tab_a.png create mode 100644 lib/NoiascaHt16k33/docs/html/tab_b.png create mode 100644 lib/NoiascaHt16k33/docs/html/tab_h.png create mode 100644 lib/NoiascaHt16k33/docs/html/tab_s.png create mode 100644 lib/NoiascaHt16k33/docs/html/tabs.css create mode 100644 lib/NoiascaHt16k33/docs/more.html create mode 100644 lib/NoiascaHt16k33/examples/01_Strandtest_7segment/01_Strandtest_7segment.ino create mode 100644 lib/NoiascaHt16k33/examples/02_Strandtest_14segment/02_Strandtest_14segment.ino create mode 100644 lib/NoiascaHt16k33/examples/03_Strandtest_diagnostics/03_Strandtest_diagnostics.ino create mode 100644 lib/NoiascaHt16k33/examples/11_HelloWorld_14segment/11_HelloWorld_14segment.ino create mode 100644 lib/NoiascaHt16k33/examples/12_sevenseg/12_sevenseg.ino create mode 100644 lib/NoiascaHt16k33/examples/12_sevenseg/info.ino create mode 100644 lib/NoiascaHt16k33/examples/13_format_number_7segment/13_format_number_7segment.ino create mode 100644 lib/NoiascaHt16k33/examples/20_Multidisplay/20_Multidisplay.ino create mode 100644 lib/NoiascaHt16k33/examples/21_scrolltext/21_scrolltext.ino create mode 100644 lib/NoiascaHt16k33/examples/23_clock_14segment_ds3231/23_clock_14segment_ds3231.ino create mode 100644 lib/NoiascaHt16k33/examples/23_clock_14segment_ds3231/rtc.ino create mode 100644 lib/NoiascaHt16k33/examples/90_development_tests/90_development_tests.ino create mode 100644 lib/NoiascaHt16k33/keywords.txt create mode 100644 lib/NoiascaHt16k33/library.properties create mode 100644 lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp create mode 100644 lib/NoiascaHt16k33/src/NoiascaHt16k33.h create mode 100644 lib/NoiascaHt16k33/src/fonts/font14default.h create mode 100644 lib/NoiascaHt16k33/src/fonts/font14legacy.h create mode 100644 lib/NoiascaHt16k33/src/fonts/font14netherlands.h create mode 100644 lib/NoiascaHt16k33/src/fonts/font7legacy.h create mode 100644 lib/NoiascaHt16k33/src/zInfo.ino create mode 100644 src/_P157_14DGT.ino create mode 100644 src/src/PluginStructs/P157_data_struct.cpp create mode 100644 src/src/PluginStructs/P157_data_struct.h diff --git a/lib/NoiascaHt16k33/LICENSE b/lib/NoiascaHt16k33/LICENSE new file mode 100644 index 0000000000..12ae4d540e --- /dev/null +++ b/lib/NoiascaHt16k33/LICENSE @@ -0,0 +1,24 @@ +NoiascaLedControl.h - A library for controling Leds with a MAX7219/MAX7221 + +The library is based on Eberhard Fahle LedControl + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +This permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/lib/NoiascaHt16k33/README.md b/lib/NoiascaHt16k33/README.md new file mode 100644 index 0000000000..620a7b00a4 --- /dev/null +++ b/lib/NoiascaHt16k33/README.md @@ -0,0 +1,17 @@ +Noiasca HT16K33 +========== +"Noiasca HT16K33" is an [Arduino](http://arduino.cc) library for HT16K33 I2C based LED display drivers. + +Documentation +------------- +The library is documented on this page: +https://werner.rothschopf.net/201909_arduino_ht16k33.htm + +Download +-------- +The lastest source files of the library is always available from +https://werner.rothschopf.net/201909_arduino_ht16k33.htm + +Install +------- +Unzip the content to your Arduino Library Folder \ No newline at end of file diff --git a/lib/NoiascaHt16k33/docs/changelog.txt b/lib/NoiascaHt16k33/docs/changelog.txt new file mode 100644 index 0000000000..895d7d7b96 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/changelog.txt @@ -0,0 +1,14 @@ +Changelog Noiasca HT16K33 + +1.1.1 Release Canditate 2021-11-27 + 2021-11-27 corrected TWCR to 328/2560 only + +1.1.0 Release Candidate 2021-03-14 + 2021-03-14 extract chartables in separate font files + fonts are not static any more (only const PROGMEM) + +1.0.2 Release Candidate 2020-06-07 + 2020-06-05 on(), off() + 2020-06-04 Wire.begin() must be called in the user sketch. + A simple hook to catch on AVR platform is implemented + 2020-09-19 fix for ESP8266 \ No newline at end of file diff --git a/lib/NoiascaHt16k33/docs/ht16k33_class_model.png b/lib/NoiascaHt16k33/docs/ht16k33_class_model.png new file mode 100644 index 0000000000000000000000000000000000000000..3992f2123665c8a57f06236963602c5a9937bcda GIT binary patch literal 9459 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 + + + + + + +Noiasca HT16K33: Class List + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+ + + + + + + +
 CNoiasca_ht16k33Base class for all HT16K33 displays
 CNoiasca_ht16k33_hw_14Class for HT16K33 displays with 14 segment LEDs
 CNoiasca_ht16k33_hw_14_4Class for HT16K33 displays with 14 segment LEDs
 CNoiasca_ht16k33_hw_14_extClass for HT16K33 displays with 14 segment LEDs
 CNoiasca_ht16k33_hw_7Class for HT16K33 displays with 7 segment LEDs
 CNoiasca_ht16k33_hw_7_4_cClass for HT16K33 displays with 7 segment LEDs
+
+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/bc_s.png b/lib/NoiascaHt16k33/docs/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/bdwn.png b/lib/NoiascaHt16k33/docs/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + +Noiasca HT16K33: Member List + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+
Noiasca_ht16k33 Member List
+
+
+ +

This is the complete list of members for Noiasca_ht16k33, including all inherited members.

+ + + + + + + + + + + +
begin(uint8_t i2c_addr, uint8_t numDevices=1)Noiasca_ht16k33
blinkRate(uint8_t b)Noiasca_ht16k33
clear(void)Noiasca_ht16k33
isConnected(void)Noiasca_ht16k33
off(void)Noiasca_ht16k33
on(void)Noiasca_ht16k33
setBrightness(uint8_t b)Noiasca_ht16k33
setCursor(uint8_t newPosition)Noiasca_ht16k33
setDigits(uint8_t newDigits)Noiasca_ht16k33
writeLowLevel(uint8_t position, uint16_t bitmask)Noiasca_ht16k33
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33.html b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33.html new file mode 100644 index 0000000000..885bef1cb2 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33.html @@ -0,0 +1,317 @@ + + + + + + + +Noiasca HT16K33: Noiasca_ht16k33 Class Reference + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+ +
Noiasca_ht16k33 Class Reference
+
+
+ +

Base class for all HT16K33 displays. + More...

+ +

#include <NoiascaHt16k33.h>

+
+Inheritance diagram for Noiasca_ht16k33:
+
+
+ + +Noiasca_ht16k33_hw_14 +Noiasca_ht16k33_hw_7 +Noiasca_ht16k33_hw_14_4 +Noiasca_ht16k33_hw_14_ext +Noiasca_ht16k33_hw_7_4_c + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

uint8_t begin (uint8_t i2c_addr, uint8_t numDevices=1)
 initialise hardware More...
 
+void blinkRate (uint8_t b)
 set the blink rate of the display
 
void clear (void)
 Clear the display and place cursor to 0. More...
 
+void off (void)
 Turn the display off.
 
+void on (void)
 Turn the display on.
 
bool isConnected (void)
 check if all ICs are responding More...
 
void setBrightness (uint8_t b)
 set the brightness of the display More...
 
void setCursor (uint8_t newPosition)
 set the cursor for the next writing position More...
 
void setDigits (uint8_t newDigits)
 set the number of digits per device More...
 
void writeLowLevel (uint8_t position, uint16_t bitmask)
 write to I2C More...
 
+

Detailed Description

+

Base class for all HT16K33 displays.

+

This is an (abstract) class used as base for all implementations It holds all common variables and member functions. If you create your instance (your object), don't use this base class but one of implementations

See also
Noiasca_ht16k33_hw_7
+
+Noiasca_ht16k33_hw_7_4_c
+
+Noiasca_ht16k33_hw_14
+
+Noiasca_ht16k33_hw_14_4
+
+Noiasca_ht16k33_hw_14_ext
+

Member Function Documentation

+ +

◆ begin()

+ +
+
+ + + + + + + + + + + + + + + + + + +
uint8_t Noiasca_ht16k33::begin (uint8_t i2c_addr,
uint8_t numDevices = 1 
)
+
+ +

initialise hardware

+

Put this method in your setup

Parameters
+ + + +
i2c_addrthe I2C address of the display
numDevicesthe number of used devices
+
+
+
Returns
0 on success
+ +
+
+ +

◆ clear()

+ +
+
+ + + + + + + + +
void Noiasca_ht16k33::clear (void )
+
+ +

Clear the display and place cursor to 0.

+

Clears the display and sets the cursor to 0.

+ +
+
+ +

◆ isConnected()

+ +
+
+ + + + + + + + +
bool Noiasca_ht16k33::isConnected (void )
+
+ +

check if all ICs are responding

+
Returns
true if all ICs are responding
+ +
+
+ +

◆ setBrightness()

+ +
+
+ + + + + + + + +
void Noiasca_ht16k33::setBrightness (uint8_t b)
+
+ +

set the brightness of the display

+
Parameters
+ + +
bnew brightness from 0..15
+
+
+ +
+
+ +

◆ setCursor()

+ +
+
+ + + + + + + + +
void Noiasca_ht16k33::setCursor (uint8_t newPosition)
+
+ +

set the cursor for the next writing position

+
Parameters
+ + +
newPositionthe new position for the cursor
+
+
+ +
+
+ +

◆ setDigits()

+ +
+
+ + + + + + + + +
void Noiasca_ht16k33::setDigits (uint8_t newDigits)
+
+ +

set the number of digits per device

+
Parameters
+ + +
newDigitsmodify the used digits
+
+
+ +
+
+ +

◆ writeLowLevel()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void Noiasca_ht16k33::writeLowLevel (uint8_t position,
uint16_t bitmask 
)
+
+ +

write to I2C

+

I2C lowLevel write of a bitmask to the IC to a specific position

Parameters
+ + + +
positiondigit to be written to
bitmaskthe bits/segments to be activated as bitmask
+
+
+ +
+
+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33.png b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33.png new file mode 100644 index 0000000000000000000000000000000000000000..203a4c0a855c6dfbbfab19b4ed88fd3d19e36c37 GIT binary patch literal 1781 zcmb_ddo~oIeX8!_kQmEe(t^Jd_SLiFU!fn8ZV=op%mTO zVIROqqSD^rq7Q&%G)gviiNL)||1IgJmV(5#)RIM^<3kosLeaOG?lj4tEKpW_%AMp* z%S<~?N0@Hdg!2Z*`fh(Dt;i%Lt*8br90W*aULxZ3fUCAN6L*`obM8%fs314;#B;{Q zH4&AuC9R<(pAP|h!!#fvv{XU+_irl3LPkHquf$d7Bqnl{iHNTLWu&J)y`sxo1(ksgN zB!t;43M`tzaPcReR(&?J^J@#+5tfp+bhX~%c_d%eG9WMv(lxI1zH$P1ZE3TR)0$|H zPMB(Q&aY|lS;i8XXNb6$O>qdCYBwL;ZOYpzUw9Sz?G8xyvcnmj6UDr9J+UJg#JPZw zh$XP7FG|GZXF2di!D=%_ikLUZb0Yw8r;(WmQ!BA*u(&1}tY+ej9zmeYRB832U^EF4 zjcTgKAp*%kWzj&zZ7sIuv52Gfk176qdyLx04oum+!@ku;%)63-qZ+Ndg?nDhF~T!9 z$36}O1}C%~#4}k(PN)F;^)apB7|$(D(oDXdX8={^;T^dl=bOZLHp?9|pHwlr4*67&;ZEyL3e z(DsD6yT2AQ?nxo->sYfjY|6xzcHtNjSfdCl4WD&d@{=mMW;}FQ_wYh@La!oS6)lLf zf~9@t(2z;nw3|&{-d<=IDGZiLjzV&W!=OME_0mMCtTEC6m5`CcPpvE3Kn$#zgI-_R zH?d<7v~ky|GWwJ9+MyDCR*=u#gqW>06q=908#WmRHlm-KLV1tEJJ>%}|Msz6NS_d7{qm9IRKx1#rSF4i9@SVtDB5+?cv;900$1h=Q zK^1wK3v%ky5o)b-3y9htQ&RueD-{CX-wyGZn_NDFC|z4#pAeT9yN$@*;|3i#9cc|Q z0ge3;v){yI^Xx}5kP83yF{GkY@ak?4sf!K;{Prfxr}wi9i|t1F6n=a2tviPUdmAn_ z>5HI@vZy1G?t`uz2e&k`qlqDnxRaI88WFn+3`kV3ne7cRkwAI@u;K*z*M zkRQ`qTGU_jn$xI~?7FvyoWFM6`=AALbs}~$N9SHys%PTqWculVZCuY=eS=+{wBjV$ zAH7cY=n3zPE(O1HhYwtLM|JE%3$`yAjc3>tIp~yC${UWoaLuWVB1vR1JMT4~b+n;{ zw)<1wvXLdqUWfZzQR<;1k!O|D)yIjAH + + + + + + +Noiasca HT16K33: Member List + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+
Noiasca_ht16k33_hw_14 Member List
+
+
+ +

This is the complete list of members for Noiasca_ht16k33_hw_14, including all inherited members.

+ + + + + + + + + + + +
begin(uint8_t i2c_addr, uint8_t numDevices=1)Noiasca_ht16k33
blinkRate(uint8_t b)Noiasca_ht16k33
clear(void)Noiasca_ht16k33
isConnected(void)Noiasca_ht16k33
off(void)Noiasca_ht16k33
on(void)Noiasca_ht16k33
setBrightness(uint8_t b)Noiasca_ht16k33
setCursor(uint8_t newPosition)Noiasca_ht16k33
setDigits(uint8_t newDigits)Noiasca_ht16k33
writeLowLevel(uint8_t position, uint16_t bitmask)Noiasca_ht16k33
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14.html b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14.html new file mode 100644 index 0000000000..e995e175cf --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14.html @@ -0,0 +1,111 @@ + + + + + + + +Noiasca HT16K33: Noiasca_ht16k33_hw_14 Class Reference + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+ +
Noiasca_ht16k33_hw_14 Class Reference
+
+
+ +

class for HT16K33 displays with 14 segment LEDs + More...

+ +

#include <NoiascaHt16k33.h>

+
+Inheritance diagram for Noiasca_ht16k33_hw_14:
+
+
+ + +Noiasca_ht16k33 +Noiasca_ht16k33_hw_14_4 +Noiasca_ht16k33_hw_14_ext + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Member Functions inherited from Noiasca_ht16k33
uint8_t begin (uint8_t i2c_addr, uint8_t numDevices=1)
 initialise hardware More...
 
+void blinkRate (uint8_t b)
 set the blink rate of the display
 
void clear (void)
 Clear the display and place cursor to 0. More...
 
+void off (void)
 Turn the display off.
 
+void on (void)
 Turn the display on.
 
bool isConnected (void)
 check if all ICs are responding More...
 
void setBrightness (uint8_t b)
 set the brightness of the display More...
 
void setCursor (uint8_t newPosition)
 set the cursor for the next writing position More...
 
void setDigits (uint8_t newDigits)
 set the number of digits per device More...
 
void writeLowLevel (uint8_t position, uint16_t bitmask)
 write to I2C More...
 
+

Detailed Description

+

class for HT16K33 displays with 14 segment LEDs

+

This is for displays with up to eight 14 segment LEDs For example the "HT16K33 AlphaNumeric 0.54" 8-Digit 14 Segment LED I2C Interface" displays from WtihK

+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14.png b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4a4ca5a4fe7662e71fcf9eeb683406f7fd3320 GIT binary patch literal 1356 zcmeAS@N?(olHy`uVBq!ia0y~yV9WxtJ2;quZ-A6UfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1Iuks7srqa#rHRF?e#m!Jb=1b+4wlP4cU3d39{MO6;OldSS)+J7-x>fB(B@jhGB(%lx`t5SP@ame*$*0+2wdX{8Ymd(!(6I*FAspOb**4JY%cS+@( zs<1A*$q+p6eQ2?#)nm=|M>QpHe>uB!q3_e0cOIoH?*Lu%`^}1VZNG0-JC^GHsnhie za^L-b{qf9KZKjf{EQfMmNlHI@n zV(4EkM4KTcX4}mIJ;!Bj1Ga3N(c>we8j z;Mni|wPxA8{a;EdFI;&d&9i>nocUHuEqCVc++hA-`pUc-#u#`!Ecf1_;6Mv3bne}o62}Yos56v5+Si#54N!D7Se*b1{rqm5rBm)5oDt-e z|KQj}bTYGu!ge+va=sQ5QkYipjeYe*Mwe)f6F{&l~a7u{po z5WL#_;@a<5)6BOfPY;=8l(t?^j_uOabN|}UWq(z7n_GT8k?~~rWi_XJDQ~^>s*~(r z1Tp{Dd6C<==R?$=4J(%4|F!a!)t2>1;!SzZ7Bh_guV>Ooyf)*u;`EUJuUGt@Te@V| z+P~LV-AlZX9=uI+x5|PgzjjWzI$x|b_}lcpUXO@geCw=VR%6R literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__4-members.html b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__4-members.html new file mode 100644 index 0000000000..ea6e8793fa --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__4-members.html @@ -0,0 +1,65 @@ + + + + + + + +Noiasca HT16K33: Member List + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+
Noiasca_ht16k33_hw_14_4 Member List
+
+
+ +

This is the complete list of members for Noiasca_ht16k33_hw_14_4, including all inherited members.

+ + + + + + + + + + + +
begin(uint8_t i2c_addr, uint8_t numDevices=1)Noiasca_ht16k33
blinkRate(uint8_t b)Noiasca_ht16k33
clear(void)Noiasca_ht16k33
isConnected(void)Noiasca_ht16k33
off(void)Noiasca_ht16k33
on(void)Noiasca_ht16k33
setBrightness(uint8_t b)Noiasca_ht16k33
setCursor(uint8_t newPosition)Noiasca_ht16k33
setDigits(uint8_t newDigits)Noiasca_ht16k33
writeLowLevel(uint8_t position, uint16_t bitmask)Noiasca_ht16k33
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__4.html b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__4.html new file mode 100644 index 0000000000..d9fb292784 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__4.html @@ -0,0 +1,110 @@ + + + + + + + +Noiasca HT16K33: Noiasca_ht16k33_hw_14_4 Class Reference + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+ +
Noiasca_ht16k33_hw_14_4 Class Reference
+
+
+ +

class for HT16K33 displays with 14 segment LEDs + More...

+ +

#include <NoiascaHt16k33.h>

+
+Inheritance diagram for Noiasca_ht16k33_hw_14_4:
+
+
+ + +Noiasca_ht16k33_hw_14 +Noiasca_ht16k33 + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Member Functions inherited from Noiasca_ht16k33
uint8_t begin (uint8_t i2c_addr, uint8_t numDevices=1)
 initialise hardware More...
 
+void blinkRate (uint8_t b)
 set the blink rate of the display
 
void clear (void)
 Clear the display and place cursor to 0. More...
 
+void off (void)
 Turn the display off.
 
+void on (void)
 Turn the display on.
 
bool isConnected (void)
 check if all ICs are responding More...
 
void setBrightness (uint8_t b)
 set the brightness of the display More...
 
void setCursor (uint8_t newPosition)
 set the cursor for the next writing position More...
 
void setDigits (uint8_t newDigits)
 set the number of digits per device More...
 
void writeLowLevel (uint8_t position, uint16_t bitmask)
 write to I2C More...
 
+

Detailed Description

+

class for HT16K33 displays with 14 segment LEDs

+

This is for displays with four 14 segment LEDs For example the Adafruit Quad Alphanumeric Display - 0.54" Digits w/ I2C Backpack

+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__4.png b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__4.png new file mode 100644 index 0000000000000000000000000000000000000000..7312921bb6dbaad7c09eee0b4f5a25a2e3c1f3ec GIT binary patch literal 1006 zcmeAS@N?(olHy`uVBq!ia0vp^%YnFqgBeI}HR84fQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;UP^tS2V&lb2|ko@<&?{WbU9nKRa}(`T-a4Ek$f{9GZ`h?bXdDxHnx1taZ(N>hymX3PJj1##zhw^uALM+n`~k~{-~y%}nihghH zc-fRotS*z5^oN52rzv>SACn@zXSeQqUh4d`VCzX?o&Ie$@zzT#jq)oEd2STW>i4`f zMJnC#)ZSla<@27!7jLwb{T=x%ds>M7xwDmDdfM4)-tXYe%82yLUI{d|MY| zRJ^iju6y(e>p9g63I)r((~pO}4sY+*s^G|!f7$iN^7*tLQ@!;o&f3^pKi0YW%l6#C zN1o@zu3o>*vi$EW&lBIQ8P?cOx^@5I&J?ejb$0%i^IPAnoozckC+OKaA z@Fcsy{KCA_FPH3FCr?;z{FlpK^<}%roJmiXKbWFof7deD>*Z(G2WzDdu$Bm(yZu&b z0WbuUl%zvihvnRilv_D;QcG9ckJ1zU?eZ0`{UUs{p zZm(VAKECMu^F#*Sp8ppFpI_T}?5XJ1na|VH=PZrde|)F@Q^|8?>(+1Q^!t5v@`ShL z5AOV%D((I1+pF`_!e4)$@;UNE#N5x%C;6Vbb2ZfD_ulBMMhQ0dXA@25&3|9ORI_2< z@tvXPyeFzFw)gYP{kvbs^k)q$(O82#{QNb4<5!muwM7><05d0pr>mdKI;Vst0DPzM A!~g&Q literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__ext-members.html b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__ext-members.html new file mode 100644 index 0000000000..7271068eae --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__ext-members.html @@ -0,0 +1,69 @@ + + + + + + + +Noiasca HT16K33: Member List + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+
Noiasca_ht16k33_hw_14_ext Member List
+
+
+ +

This is the complete list of members for Noiasca_ht16k33_hw_14_ext, including all inherited members.

+ + + + + + + + + + + + + + + +
begin(uint8_t i2c_addr, uint8_t numDevices=1)Noiasca_ht16k33
blinkRate(uint8_t b)Noiasca_ht16k33
clear(void)Noiasca_ht16k33
isConnected(void)Noiasca_ht16k33
off(void)Noiasca_ht16k33
on(void)Noiasca_ht16k33
scroll()Noiasca_ht16k33_hw_14_ext
setBrightness(uint8_t b)Noiasca_ht16k33
setCursor(uint8_t newPosition)Noiasca_ht16k33
setDigits(uint8_t newDigits)Noiasca_ht16k33
setScrollInterval(uint16_t newInterval)Noiasca_ht16k33_hw_14_ext
setScrolltext(const char *newText)Noiasca_ht16k33_hw_14_ext
setScrollWait(uint16_t newWait)Noiasca_ht16k33_hw_14_ext
writeLowLevel(uint8_t position, uint16_t bitmask)Noiasca_ht16k33
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__ext.html b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__ext.html new file mode 100644 index 0000000000..cfb82bf09b --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__ext.html @@ -0,0 +1,224 @@ + + + + + + + +Noiasca HT16K33: Noiasca_ht16k33_hw_14_ext Class Reference + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+ +
Noiasca_ht16k33_hw_14_ext Class Reference
+
+
+ +

class for HT16K33 displays with 14 segment LEDs + More...

+ +

#include <NoiascaHt16k33.h>

+
+Inheritance diagram for Noiasca_ht16k33_hw_14_ext:
+
+
+ + +Noiasca_ht16k33_hw_14 +Noiasca_ht16k33 + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

uint32_t scroll ()
 scroll the text More...
 
void setScrollInterval (uint16_t newInterval)
 set scroll interval More...
 
void setScrollWait (uint16_t newWait)
 set wait time between scrolling More...
 
void setScrolltext (const char *newText)
 set a scrolltext
+ More...
 
- Public Member Functions inherited from Noiasca_ht16k33
uint8_t begin (uint8_t i2c_addr, uint8_t numDevices=1)
 initialise hardware More...
 
+void blinkRate (uint8_t b)
 set the blink rate of the display
 
void clear (void)
 Clear the display and place cursor to 0. More...
 
+void off (void)
 Turn the display off.
 
+void on (void)
 Turn the display on.
 
bool isConnected (void)
 check if all ICs are responding More...
 
void setBrightness (uint8_t b)
 set the brightness of the display More...
 
void setCursor (uint8_t newPosition)
 set the cursor for the next writing position More...
 
void setDigits (uint8_t newDigits)
 set the number of digits per device More...
 
void writeLowLevel (uint8_t position, uint16_t bitmask)
 write to I2C More...
 
+

Detailed Description

+

class for HT16K33 displays with 14 segment LEDs

+

This is for displays with up to eight 14 segment LEDs. This class can be used to scroll the text in the display.

+

Member Function Documentation

+ +

◆ scroll()

+ +
+
+ + + + + + + +
uint32_t Noiasca_ht16k33_hw_14_ext::scroll ()
+
+ +

scroll the text

+

The tick/run/do method for scrolling text. Call this function in your loop().

+ +
+
+ +

◆ setScrollInterval()

+ +
+
+ + + + + + + + +
void Noiasca_ht16k33_hw_14_ext::setScrollInterval (uint16_t newInterval)
+
+ +

set scroll interval

+

Set the speed of the scroll effect.

Parameters
+ + +
newIntervalspeed in milliseconds
+
+
+ +
+
+ +

◆ setScrollWait()

+ +
+
+ + + + + + + + +
void Noiasca_ht16k33_hw_14_ext::setScrollWait (uint16_t newWait)
+
+ +

set wait time between scrolling

+

sets the wait/timeout after all letters are scrolled to the display

Parameters
+ + +
newWaitthe new wait time in milliseconds
+
+
+ +
+
+ +

◆ setScrolltext()

+ +
+
+ + + + + + + + +
void Noiasca_ht16k33_hw_14_ext::setScrolltext (const char * newText)
+
+ +

set a scrolltext
+

+

sets the new scrolltext to be displayed and scrolled

Parameters
+ + +
*newTextthe new text (or number)
+
+
+ +
+
+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__ext.png b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__14__ext.png new file mode 100644 index 0000000000000000000000000000000000000000..28ae403839fcb5558cb7e84692461aee566f3900 GIT binary patch literal 1029 zcmeAS@N?(olHy`uVBq!ia0vp^8-TcjgBeH`I80mvq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0r+B(JhEy=Vo%?pu8Z92z>9<$a{deDY z_msPXWa+z;md?Jr(#;n&bkCje^YpHDuYHoHE~ykbFzLxkhG{DPciH34_o3n$Hk^&P*MspZQ_Mi!7J-&p!xMSh!BwccJ`MLA0t@gYVP~rg`jN zN^e}Tn(nObY46~7VE*LqN6bBUEiZ_eWFrdm!QRH}rLpQl4c&1J#+hahu4fxPy4i4l zPqCmsyG$t4fpA8i2P+xaK7=qZS7<4R!gXEkV8&LnXl7)APXdhGR5wT)hv zY`79UKZP)OPg;JiLHzUWIL}KCnHR1tVV&kb`+ff0J27i!%g^DpU^UC1x+Hqlftk8r zPhGyU(_~T3sl0cG9_}eHU1?#m?e%5jb+cq;k`tC+`TIq&jwfdJvsZW4{nGib@?(wy z`}J>{^(;R;t{wj_5Nf@RCHeCoozuHDzp9>ftYFxae?DqvQ|?}m?`{Vy7w>1kGxMLw z4!`{3Piz}%|0bOJ_m*K>zsgprX{N<;@1A}T_>pz$;+f;AXY(${Ol6p@b&JYy)nDS%44&Te+J8RL^Ve*+_wF5dy=$E?=K)v!hM6YPA6}bE ze#|+Le{W~Ua^^lQ#s{m34LMN2{@ko{+GuhF!?QqWScf)zUv}yKt@gRI#VX_|YT+8X}At;ya7X6Mgu zs^PdO)1q8p2254k`nDRe-mVHvD&_+wxatFYU#c_2GhR>3^}ENgZN0qD&Hb_kZZ>mX z7AI6g1JW!1S!Sg1@rBmezOs3%T{t(a6!JarxnUpQ?5OM4AMQS|&1(wtAM1an?{|L7 yc$RSL<=ges{;Tpa|51h|r}<5LfPv8ekJ*yNgE>}l_CsKvW$<+Mb6Mw<&;$TN`Q8Zt literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7-members.html b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7-members.html new file mode 100644 index 0000000000..a42eca95e2 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7-members.html @@ -0,0 +1,66 @@ + + + + + + + +Noiasca HT16K33: Member List + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+
Noiasca_ht16k33_hw_7 Member List
+
+
+ +

This is the complete list of members for Noiasca_ht16k33_hw_7, including all inherited members.

+ + + + + + + + + + + + +
begin(uint8_t i2c_addr, uint8_t numDevices=1)Noiasca_ht16k33
blinkRate(uint8_t b)Noiasca_ht16k33
clear(void)Noiasca_ht16k33
isConnected(void)Noiasca_ht16k33
off(void)Noiasca_ht16k33
on(void)Noiasca_ht16k33
setBrightness(uint8_t b)Noiasca_ht16k33
setColonDigit(uint8_t activate=1)Noiasca_ht16k33_hw_7
setCursor(uint8_t newPosition)Noiasca_ht16k33
setDigits(uint8_t newDigits)Noiasca_ht16k33
writeLowLevel(uint8_t position, uint16_t bitmask)Noiasca_ht16k33
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7.html b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7.html new file mode 100644 index 0000000000..d52eeb76f8 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7.html @@ -0,0 +1,138 @@ + + + + + + + +Noiasca HT16K33: Noiasca_ht16k33_hw_7 Class Reference + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+ +
Noiasca_ht16k33_hw_7 Class Reference
+
+
+ +

class for HT16K33 displays with 7 segment LEDs + More...

+ +

#include <NoiascaHt16k33.h>

+
+Inheritance diagram for Noiasca_ht16k33_hw_7:
+
+
+ + +Noiasca_ht16k33 +Noiasca_ht16k33_hw_7_4_c + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

void setColonDigit (uint8_t activate=1)
 
- Public Member Functions inherited from Noiasca_ht16k33
uint8_t begin (uint8_t i2c_addr, uint8_t numDevices=1)
 initialise hardware More...
 
+void blinkRate (uint8_t b)
 set the blink rate of the display
 
void clear (void)
 Clear the display and place cursor to 0. More...
 
+void off (void)
 Turn the display off.
 
+void on (void)
 Turn the display on.
 
bool isConnected (void)
 check if all ICs are responding More...
 
void setBrightness (uint8_t b)
 set the brightness of the display More...
 
void setCursor (uint8_t newPosition)
 set the cursor for the next writing position More...
 
void setDigits (uint8_t newDigits)
 set the number of digits per device More...
 
void writeLowLevel (uint8_t position, uint16_t bitmask)
 write to I2C More...
 
+

Detailed Description

+

class for HT16K33 displays with 7 segment LEDs

+

This is for displays with 7 segment LEDs

+

Member Function Documentation

+ +

◆ setColonDigit()

+ +
+
+ + + + + + + + +
void Noiasca_ht16k33_hw_7::setColonDigit (uint8_t activate = 1)
+
+

activates/deactivtes a separate colon digit

Parameters
+ + +
activateset to 1 if you want to display the colon
+
+
+ +
+
+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7.png b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7.png new file mode 100644 index 0000000000000000000000000000000000000000..485fe9c1b3a891653fa8569ebc33df65af8b24f0 GIT binary patch literal 1008 zcmeAS@N?(olHy`uVBq!ia0vp^>wvg}gBeJAsw;d4QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;Dpy0^oc&C097Y{hd|d@D776sznh zUn;-d?CjN*q1tOyYd=3fd#Zby+a$db^>Y50-zVfQ-8y%dY2&ZjX?G`;ER1%~H9dN3 z#^D^@v)`+Bs7|hD*dDZPr$s|Ff79*2)f;8b-_^@2?^OBvwRP9+ur}Q-%ZyAG>Ir`< zy&huTzF5uEUSIys^~&83XR7pS-kGYR&$>>fQnNtyq__W_DM7Q`804xL&Me+pAm6{T z;`yQ4OXrSQOXh{JG1#-}HB4s`Kj7WS{b1<<)(=4sm?|_27=eCgh~tW3&_|JuwLiT{ z=W_>Zf*4F#_RjaSRwiHkDlgr7!aL7>=e>CAr9XGP-_61B=E`By^DGkZ0GhzNyZF5bWLNCYO}*iit>rBI$|y0u+_&`h^}G28Sby~X;=A+J{>7hojt4$-Ri|73 zZGXq~M;YcH|2wIX(=u5eEMz}mGmHEC#~EGadUw>{`s|tf&@GkWLomM3K?}S)Und87 z@l`FEa_M`wisxnxP+T->d&b==5dVBT&NIjz9A?wPqu;Hcd#UEmcgy4FUY%XNQy_wiS#_p6aSud^7xszvulIO zZ=c%GdM%_)?MmvQeeY(y+O~eTdEt4jW|hBnwY=Zw#%%u=Y~_9H_WY{<{ktc9QRa&A n{1o)SYtr<2JAnDA_a8&uXSbUrQ4)>7?8)Hi>gTe~DWM4f?z8MR literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7__4__c-members.html b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7__4__c-members.html new file mode 100644 index 0000000000..ed9ddc1ff9 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7__4__c-members.html @@ -0,0 +1,67 @@ + + + + + + + +Noiasca HT16K33: Member List + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+
Noiasca_ht16k33_hw_7_4_c Member List
+
+
+ +

This is the complete list of members for Noiasca_ht16k33_hw_7_4_c, including all inherited members.

+ + + + + + + + + + + + + +
begin(uint8_t i2c_addr, uint8_t numDevices=1)Noiasca_ht16k33
blinkRate(uint8_t b)Noiasca_ht16k33
clear(void)Noiasca_ht16k33
isConnected(void)Noiasca_ht16k33
off(void)Noiasca_ht16k33
on(void)Noiasca_ht16k33
setBrightness(uint8_t b)Noiasca_ht16k33
setColonDigit(uint8_t activate=1)Noiasca_ht16k33_hw_7
setCursor(uint8_t newPosition)Noiasca_ht16k33
setDigits(uint8_t newDigits)Noiasca_ht16k33
showColon(uint8_t device, bool colon)Noiasca_ht16k33_hw_7_4_c
writeLowLevel(uint8_t position, uint16_t bitmask)Noiasca_ht16k33
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7__4__c.html b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7__4__c.html new file mode 100644 index 0000000000..6fc65cf687 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7__4__c.html @@ -0,0 +1,152 @@ + + + + + + + +Noiasca HT16K33: Noiasca_ht16k33_hw_7_4_c Class Reference + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+ +
Noiasca_ht16k33_hw_7_4_c Class Reference
+
+
+ +

class for HT16K33 displays with 7 segment LEDs + More...

+ +

#include <NoiascaHt16k33.h>

+
+Inheritance diagram for Noiasca_ht16k33_hw_7_4_c:
+
+
+ + +Noiasca_ht16k33_hw_7 +Noiasca_ht16k33 + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

void showColon (uint8_t device, bool colon)
 
- Public Member Functions inherited from Noiasca_ht16k33_hw_7
void setColonDigit (uint8_t activate=1)
 
- Public Member Functions inherited from Noiasca_ht16k33
uint8_t begin (uint8_t i2c_addr, uint8_t numDevices=1)
 initialise hardware More...
 
+void blinkRate (uint8_t b)
 set the blink rate of the display
 
void clear (void)
 Clear the display and place cursor to 0. More...
 
+void off (void)
 Turn the display off.
 
+void on (void)
 Turn the display on.
 
bool isConnected (void)
 check if all ICs are responding More...
 
void setBrightness (uint8_t b)
 set the brightness of the display More...
 
void setCursor (uint8_t newPosition)
 set the cursor for the next writing position More...
 
void setDigits (uint8_t newDigits)
 set the number of digits per device More...
 
void writeLowLevel (uint8_t position, uint16_t bitmask)
 write to I2C More...
 
+

Detailed Description

+

class for HT16K33 displays with 7 segment LEDs

+

This is for displays with 7 segment LEDs, 4 digits and a colon. For example Adafruit 0.56" 4-Digit 7-Segment Display w/I2C Backpack

+

Member Function Documentation

+ +

◆ showColon()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void Noiasca_ht16k33_hw_7_4_c::showColon (uint8_t device,
bool colon 
)
+
+

activate the colon digit

Parameters
+ + + +
devicethe device you want to control the colon
colonTRUE will switch on, FALSE will switch off the colon
+
+
+ +
+
+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7__4__c.png b/lib/NoiascaHt16k33/docs/html/class_noiasca__ht16k33__hw__7__4__c.png new file mode 100644 index 0000000000000000000000000000000000000000..d18fb128e02e87c24d862785aa5a928489c3044d GIT binary patch literal 1001 zcmeAS@N?(olHy`uVBq!ia0vp^>wvg}gBeJAsw;d4QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;K=Ki;Co2Zg0#=1_WQnNtyr1#++-9K~odj`2zUbK3` zJMDVJy7iNdJT6T=R(RG}HPb_M`-G=A%gp`VzVCgQcXON6mYtV3zmnXt@YeOa9p%j` zwO4BISee}STN{i7PL;r&zNoWLE8dnB?pB<1<+}K99Im3KC52CbSCiw-i_Q3mL6dJ5cGhlLbHGoXbh5c z`Cm`XrIjv|mPEo$FD(%Ne6w!ylD51Ztltm*wWtYd77Tit9G>N zoZq&)(kSJy?w#D*Sr?x9-CuS6j78Ru{(rY8{4x{QFKUf$e|CFk=-0TPCtfTyd6VE& z$MF5c*7I)?<9C;NA9?jXvh=;vD`&gVlkJPQ?c2K5aQV$&7i2n>^Hx5IKd^R6t}fq$ zTRG)U_x9gExOI8LnzG$H!WEmRT3;x?eQv|jYb9-JS5pt}dq3;lw)ea38?-(DFREiI z|0`eeFWzI)xhtGI@4V#S1r(jk1Pe9wJTFaOWd?p*hG!RJcJv<)*;D+`E;IenTpn{P z=7#x%LJ2t#*V&)mr1QChH9-s(zS8fiSG;k~PfY&IcK&emdSGIzx%0jDO@B1=xAl)^ zr8DuYd?dEX=Jva1CnxZJ3p-u+44SI8zcMxMllr&#zuA&~XD#3M?LE`CqcmgR-00Bv zQ~P`3ydEc9wSFSDPIvva3DdIY-#okzmbC7*UTL3mVV?bZ+pO0|Zq2xyQ=8FuL~wh^ zr|kvh`}iMSTd_@yy&!j+wc`8x#VfY?e<^sYDY5#l-n-Bf$4|YTU3&>jD4G|Zw_-l9 zfBpK0`?_C;rKm62`zP~T`5o3DqA*|j-${*}mia|KLD}8NtZzy*Fkdowy85}Sb4q9e E09AkaI{*Lx literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/classes.html b/lib/NoiascaHt16k33/docs/html/classes.html new file mode 100644 index 0000000000..92ebc85acc --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/classes.html @@ -0,0 +1,58 @@ + + + + + + + +Noiasca HT16K33: Class Index + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+
Class Index
+
+ + + + + diff --git a/lib/NoiascaHt16k33/docs/html/closed.png b/lib/NoiascaHt16k33/docs/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/lib/NoiascaHt16k33/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 0000000000..6866ee32a2 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,62 @@ + + + + + + + +Noiasca HT16K33: C:/Daten/myrepository/Arduino/libraries/NoiascaHt16k33/src Directory Reference + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + + +
+
+
src Directory Reference
+
+
+ + + + +

+Directories

directory  fonts
 
+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/dir_bec663b67e4420d39ecb45ef100bdbac.html b/lib/NoiascaHt16k33/docs/html/dir_bec663b67e4420d39ecb45ef100bdbac.html new file mode 100644 index 0000000000..d94092a5f5 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/dir_bec663b67e4420d39ecb45ef100bdbac.html @@ -0,0 +1,56 @@ + + + + + + + +Noiasca HT16K33: C:/Daten/myrepository/Arduino/libraries/NoiascaHt16k33/src/fonts Directory Reference + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + + +
+
+
fonts Directory Reference
+
+
+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/doc.png b/lib/NoiascaHt16k33/docs/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/doxygen.css b/lib/NoiascaHt16k33/docs/html/doxygen.css new file mode 100644 index 0000000000..9036737224 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/doxygen.css @@ -0,0 +1,1841 @@ +/* The standard CSS for doxygen 1.9.3 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +.compoundTemplParams { + color: #4665A2; + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font: 200% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 90% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +code.JavaDocCode + direction:ltr; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/lib/NoiascaHt16k33/docs/html/doxygen.svg b/lib/NoiascaHt16k33/docs/html/doxygen.svg new file mode 100644 index 0000000000..d42dad52d5 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/NoiascaHt16k33/docs/html/dynsections.js b/lib/NoiascaHt16k33/docs/html/dynsections.js new file mode 100644 index 0000000000..3174bd7beb --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (la9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/functions.html b/lib/NoiascaHt16k33/docs/html/functions.html new file mode 100644 index 0000000000..5678e2b5f0 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/functions.html @@ -0,0 +1,67 @@ + + + + + + + +Noiasca HT16K33: Class Members + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+
Here is a list of all documented class members with links to the class documentation for each member:
+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/functions_func.html b/lib/NoiascaHt16k33/docs/html/functions_func.html new file mode 100644 index 0000000000..d7522dfc4e --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/functions_func.html @@ -0,0 +1,67 @@ + + + + + + + +Noiasca HT16K33: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/hierarchy.html b/lib/NoiascaHt16k33/docs/html/hierarchy.html new file mode 100644 index 0000000000..1d6a59dafa --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/hierarchy.html @@ -0,0 +1,62 @@ + + + + + + + +Noiasca HT16K33: Class Hierarchy + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 123]
+ + + + + + +
 CNoiasca_ht16k33Base class for all HT16K33 displays
 CNoiasca_ht16k33_hw_14Class for HT16K33 displays with 14 segment LEDs
 CNoiasca_ht16k33_hw_14_4Class for HT16K33 displays with 14 segment LEDs
 CNoiasca_ht16k33_hw_14_extClass for HT16K33 displays with 14 segment LEDs
 CNoiasca_ht16k33_hw_7Class for HT16K33 displays with 7 segment LEDs
 CNoiasca_ht16k33_hw_7_4_cClass for HT16K33 displays with 7 segment LEDs
+
+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/index.html b/lib/NoiascaHt16k33/docs/html/index.html new file mode 100644 index 0000000000..167db671f9 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/index.html @@ -0,0 +1,66 @@ + + + + + + + +Noiasca HT16K33: Some words to the Noiasca HT16K33 Library + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+
Some words to the Noiasca HT16K33 Library
+
+
+

+Introduction

+

The "Noiasca HT16K33 Library" is an Arduino Library to control HT16K33 based seven segment and 14 segment LED displays.

+

The library inherits from Print.h and therefore supports the very common interface you know from other display libraries. Additionally the interface is very close to the so called LCD API 1.0

+

+Examples

+

There are several examples please use the hello world for the beginning.

+

+Install the library

+

Download the library from http://werner.rothschopf.net/201909_arduino_ht16k33.htm

+

In the Arduino IDE use the Menu
+ Sketch / Include Library / Add .ZIP Library
+ to install the library.

+
+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/jquery.js b/lib/NoiascaHt16k33/docs/html/jquery.js new file mode 100644 index 0000000000..c9ed3d99cb --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/lib/NoiascaHt16k33/docs/html/md__c___daten_myrepository__arduino_libraries__noiasca_ht16k33__r_e_a_d_m_e.html b/lib/NoiascaHt16k33/docs/html/md__c___daten_myrepository__arduino_libraries__noiasca_ht16k33__r_e_a_d_m_e.html new file mode 100644 index 0000000000..165fe95268 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/md__c___daten_myrepository__arduino_libraries__noiasca_ht16k33__r_e_a_d_m_e.html @@ -0,0 +1,63 @@ + + + + + + + +Noiasca HT16K33: Noiasca HT16K33 + + + + + + +
+
+ + + + + + +
+
Noiasca HT16K33 +
+
A library for HT16K33 LED displays - 7 segment and 14 segment
+
+
+ + + + + + +
+
+
Noiasca HT16K33
+
+
+

"Noiasca HT16K33" is an Arduino library for HT16K33 I2C based LED display drivers.

+

+Documentation

+

The library is documented on this page: https://werner.rothschopf.net/201909_arduino_ht16k33.htm

+

+Download

+

The lastest source files of the library is always available from https://werner.rothschopf.net/201909_arduino_ht16k33.htm

+

+Install

+

Unzip the content to your Arduino Library Folder

+
+
+ + + + diff --git a/lib/NoiascaHt16k33/docs/html/menu.js b/lib/NoiascaHt16k33/docs/html/menu.js new file mode 100644 index 0000000000..54e81cf15c --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/menu.js @@ -0,0 +1,127 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + var searchBox; + if (searchEnabled) { + if (serverSide) { + searchBox='
'+ + '
'+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBox='
'+ + ''+ + ''+ + ''+ + ''+ + ''+ + '' + '' + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBox) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBox); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBox); + $('#searchBoxPos2').show(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/lib/NoiascaHt16k33/docs/html/menudata.js b/lib/NoiascaHt16k33/docs/html/menudata.js new file mode 100644 index 0000000000..43826ee278 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/menudata.js @@ -0,0 +1,34 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Functions",url:"functions_func.html"}]}]}]} diff --git a/lib/NoiascaHt16k33/docs/html/nav_f.png b/lib/NoiascaHt16k33/docs/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/nav_g.png b/lib/NoiascaHt16k33/docs/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + +Noiasca HT16K33: Related Pages + + + + + + +
    +
    + + + + + + +
    +
    Noiasca HT16K33 +
    +
    A library for HT16K33 LED displays - 7 segment and 14 segment
    +
    +
    + + + + + + +
    +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    + + +
     Noiasca HT16K33
    +
    +
    + + + + diff --git a/lib/NoiascaHt16k33/docs/html/splitbar.png b/lib/NoiascaHt16k33/docs/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/sync_off.png b/lib/NoiascaHt16k33/docs/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/sync_on.png b/lib/NoiascaHt16k33/docs/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/tab_a.png b/lib/NoiascaHt16k33/docs/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/tab_b.png b/lib/NoiascaHt16k33/docs/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/lib/NoiascaHt16k33/docs/html/tabs.css b/lib/NoiascaHt16k33/docs/html/tabs.css new file mode 100644 index 0000000000..00d1c60249 --- /dev/null +++ b/lib/NoiascaHt16k33/docs/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:#666;-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/lib/NoiascaHt16k33/docs/more.html b/lib/NoiascaHt16k33/docs/more.html new file mode 100644 index 0000000000..2db553c5cb --- /dev/null +++ b/lib/NoiascaHt16k33/docs/more.html @@ -0,0 +1,11 @@ + + + +Noiasca HT16K33 Library + + +

    Noiasca HT16K33 Library

    +

    Full library documentation (local)

    +

    Download latest Version

    + + diff --git a/lib/NoiascaHt16k33/examples/01_Strandtest_7segment/01_Strandtest_7segment.ino b/lib/NoiascaHt16k33/examples/01_Strandtest_7segment/01_Strandtest_7segment.ino new file mode 100644 index 0000000000..5b93edce4b --- /dev/null +++ b/lib/NoiascaHt16k33/examples/01_Strandtest_7segment/01_Strandtest_7segment.ino @@ -0,0 +1,51 @@ +/******************************************************************************* + Strandtest 7 Segment + Noiasca HT16K33 + + This is a strandtest to show if wiring of your HT16K33 display is correct + + by noiasca + Sketch Version 2020-06-05 + + On startup you should see some text on your display + In the loop all printable characters will be shown. + + *******************************************************************************/ +#include // HT16K33 uses I2C, include the Wire Library +#include "NoiascaHt16k33.h" // include the noiasca HT16K33 library - download from //http://werner.rothschopf.net/ + +//Noiasca_ht16k33_hw_7 display = Noiasca_ht16k33_hw_7(); // object for 7 segments, 8 digits +Noiasca_ht16k33_hw_7_4_c display = Noiasca_ht16k33_hw_7_4_c(); // object for 7 segments, 4 visbible digits, colon digit. E.g. Adafruit 0.56" 4-Digit 7-Segment Display w/I2C Backpack +//Noiasca_ht16k33_hw_14 display = Noiasca_ht16k33_hw_14(); // object for 14 segments - 8 digits +//Noiasca_ht16k33_hw_14_4 display = Noiasca_ht16k33_hw_14_4(); // object for 14 segments - 4 digits + +const uint8_t i2cAddress = 0x70; // the I2C address of the first module +const uint8_t numOfDevices = 1; // how many modules have you installed on the I2C Bus +const uint16_t wait = 500; // wait milliseconds between demos + + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println(F("\n01 strandtest 7segment")); + Wire.begin(); // start the I2C interface + display.begin(i2cAddress, numOfDevices); // I2C address of first display, total number of devices + + // display.setColonDigit(); // activates a separate digit for a colon manually. But better to use the Noiasca_ht16k33_hw_7_4_c class if necessary. + Serial.println(F("ON Test")); + display.clear(); // clear display + display.print(F("ALFABETADELT")); // if the text is to long or your display (chain) you will only see the last letters + delay(wait); +} + + +void loop() { + // put your main code here, to run repeatedly: + Serial.println(F("Printable characters")); + for (uint8_t counter = 32; counter < 128; counter++) { + display.clear(); + display.print(counter); // print the numerical ANSI code of the character + display.write(counter); // print the character for the ANSI code + delay(wait); + } +} \ No newline at end of file diff --git a/lib/NoiascaHt16k33/examples/02_Strandtest_14segment/02_Strandtest_14segment.ino b/lib/NoiascaHt16k33/examples/02_Strandtest_14segment/02_Strandtest_14segment.ino new file mode 100644 index 0000000000..8e5755154a --- /dev/null +++ b/lib/NoiascaHt16k33/examples/02_Strandtest_14segment/02_Strandtest_14segment.ino @@ -0,0 +1,50 @@ +/******************************************************************************* + Strandtest 14 Segment + Noiasca HT16K33 + + This is a strandtest to show if wiring of your HT16K33 display is correct + + by noiasca + Sketch Version 2020-06-05 + + On startup you should see some text on your display + In the loop all printable Characters will be shown. + + *******************************************************************************/ + +#include // include the noiasca HT16K33 library - download from http://werner.rothschopf.net/ + +//Noiasca_ht16k33_hw_7 display7 = Noiasca_ht16k33_hw_7(); // object for 7 segments, 8 digits +//Noiasca_ht16k33_hw_7_4_c display7 = Noiasca_ht16k33_hw_7_4_c(); // object for 7 segments, 4 visbible digits, colon digit. E.g. Adafruit 0.56" 4-Digit 7-Segment Display w/I2C Backpack +Noiasca_ht16k33_hw_14 display = Noiasca_ht16k33_hw_14(); // object for 14 segments - 8 digits +//Noiasca_ht16k33_hw_14_4 display = Noiasca_ht16k33_hw_14_4(); // object for 14 segments - 4 digits + +const uint8_t i2cAddress = 0x70; // the I2C address of the first module +const uint8_t numOfDevices = 1; // how many modules have you installed on the I2C Bus +const uint16_t wait = 500; // wait milliseconds between demos + + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println(F("\nstrandtest 14 segment ")); + Wire.begin(); // start the I2C interface + display.begin(i2cAddress, numOfDevices); // I2C adress of first display, total number of devices + + Serial.println(F("ON Test")); + display.clear(); // clear display + display.print(F("ALFABETADELT")); // if the text is to long or your display (chain) you will only see the last letters + delay(wait); +} + + +void loop() { + // put your main code here, to run repeatedly: + Serial.println(F("Printable characters")); + for (uint8_t counter = 32; counter < 128; counter++) { + display.clear(); + display.print(counter); // print the numerical ANSI code of the character + display.write(counter); // print the character for the ANSI code + delay(wait); + } +} diff --git a/lib/NoiascaHt16k33/examples/03_Strandtest_diagnostics/03_Strandtest_diagnostics.ino b/lib/NoiascaHt16k33/examples/03_Strandtest_diagnostics/03_Strandtest_diagnostics.ino new file mode 100644 index 0000000000..7f703523bc --- /dev/null +++ b/lib/NoiascaHt16k33/examples/03_Strandtest_diagnostics/03_Strandtest_diagnostics.ino @@ -0,0 +1,74 @@ +/******************************************************************************* + 03_Strandtest_diagnostics + Noiasca HT16K33 + + If you have problems to get your LED modules working try this sketch. + It will activate (most) of the connected LEDs. + + The example will handle: + - test all available adresses + - write the hex adress on each found module + - switch on all remaining segments/LEDs + - loop through a simple animation (set brightness) + + by noiasca + Sketch Version 2020-06-08 + + *******************************************************************************/ +#include // HT16K33 uses I2C, include the Wire Library +#include "NoiascaHt16k33.h" // include the noiasca HT16K33 library - download from http://werner.rothschopf.net/ + +const byte startAddr = 0x70; // lowest addresss of the HT16K33 is 0x70 +const byte noOfModules = 8; // test all 8 modules +const char allSegments = 127; // character 127 will activate "all segments" +Noiasca_ht16k33_hw_14 display[noOfModules]; // let's assume 8 separate HT16K33 + + +// just a simple animation +void tick_animation() +{ + const uint16_t intervall = 500; // intervall of updates + static uint32_t previousMillis; // is static, because we need the value the next time when we call the function again, WITHOUT the need of a global variable + static uint16_t brightness; // static, as we want to keep the value from to call without a global variable + if (millis() - previousMillis > intervall) // check, if it is time to do something + { + for (auto ¤tDisplay : display) + currentDisplay.setBrightness(brightness); + brightness++; + if (brightness > 15) brightness = 0; + previousMillis = millis(); + } +} + + +void setup() { + Serial.begin(115200); + Serial.println(F("\n03 Strandtest diagnostics")); + Wire.begin(); // start the I2C interface + //Wire.setClock(400000); // optional: activate I2C fast mode. If it is to fast for other I2C devices. deactivate this row. + byte foundModules = 0; + Serial.println(F("I: search for available HT16K33")); + for (byte i = 0; i < noOfModules; i++) + { + if (display[i].begin(startAddr + i) == false) // no error + { + Serial.print(F("I: display found 0x")); Serial.println((startAddr + i), HEX); + display[i].clear(); + display[i].print((startAddr + i), HEX); // print the hex address of the modul on the first two digits + for (byte j = 0; j < 6; j++) + display[i].write(allSegments); // activate all segments of the remaining 6 digits + foundModules++; + } + else + { + Serial.print(F("E: no display at 0x")); Serial.println((0x70 + i), HEX); + } + } + Serial.print(F("I: found ")); Serial.print(foundModules); Serial.println(F(" modules on I2C bus")); + Serial.println(F("start loop")); +} + + +void loop() { + tick_animation(); +} diff --git a/lib/NoiascaHt16k33/examples/11_HelloWorld_14segment/11_HelloWorld_14segment.ino b/lib/NoiascaHt16k33/examples/11_HelloWorld_14segment/11_HelloWorld_14segment.ino new file mode 100644 index 0000000000..a2b819adff --- /dev/null +++ b/lib/NoiascaHt16k33/examples/11_HelloWorld_14segment/11_HelloWorld_14segment.ino @@ -0,0 +1,137 @@ +/******************************************************************************* + HelloWorld + Noiasca HT16K33 + + This is a demo Sketch to show up the print methods of the HT16K33 Library + + by noiasca + Sketch Version 2020-06-05 + + *******************************************************************************/ +#include // HT16K33 uses I2C, include the Wire Library +#include "NoiascaHt16k33.h" // include the noiasca HT16K33 library - download from http://werner.rothschopf.net/ + +//Noiasca_ht16k33_hw_7_4 display7 = Noiasca_ht16k33_hw_7_4(); // 7 segments, 8 digits +//Noiasca_ht16k33_hw_7_4_c display7 = Noiasca_ht16k33_hw_7_4_c(); // 7 Segment, 4 visbible digits, colon digit +//Noiasca_ht16k33_hw_14 display = Noiasca_ht16k33_hw_14(); // object for 14 segments - 8 digits +Noiasca_ht16k33_hw_14_4 display = Noiasca_ht16k33_hw_14_4(); // object for 14 segments - 4 digits + +const uint16_t wait = 500; // wait milliseconds between demos + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println(F("\n11 Hello World 14 segment")); + Wire.begin(); // start the I2C interface + Wire.setClock(400000); // optional: activate I2C fast mode. If it is to fast for other I2C devices. deactivate this row. + +/* + display7.begin(0x70); + display7.clear(); + display7.print(F("1.234")); + //display7.showColon(1); // show colon on 7 segment display + //display7.blinkRate(HT16K33_BLINK_HALFHZ); + delay(wait); + display7.clear(); + display7.print(F("8888")); +*/ + + display.begin(0x70); // I2C address of first display, optional total number of devices + + Serial.println(F("ON Test")); + display.clear(); + display.print(F("ALFABETADELT")); // if the text is to long or your display (chain) you will only see the last letters + delay(wait); delay(wait); + + Serial.println(F("Set brightness")); + display.setBrightness(5); // set brightness from 0 to 15 + + Serial.println(F("all Segments of first 4 digits on first device")); + display.clear(); + display.write(127); + display.write(127); + display.write(127); + display.write(127); + delay(wait); + + Serial.println(F("Print a number")); + display.clear(); + display.print(1234); + delay(wait); + + Serial.println(F("Blink display")); + display.clear(); + display.blinkRate(HT16K33_BLINK_2HZ); + display.print(F("BLIN")); + delay(wait); delay(wait); delay(wait); + display.blinkRate(HT16K33_BLINK_OFF); + + Serial.println(F("Print a float")); + display.clear(); + display.print(5.67); + delay(wait); + + Serial.println(F("Print text with dots")); + display.clear(); + display.print(F("5.6.7.8.")); + delay(wait); + + //display7.showColon(0); +} + + +void loop() { + // put your main code here, to run repeatedly: + char data[10]; // we need a small buffer to store a temp result + + Serial.println(F("display fixtext F and a float right aligned")); + display.clear(); + for (float counter = -9; counter < 10; counter = counter + 1.3) + { + int16_t myint = counter * 10; + sprintf(data, "F%2d.%d", myint / 10, abs(myint) % 10); // we split the output into two separte integers + display.print(data); + Serial.println(data); + delay(wait); + } + + /* + Serial.println(F("display fixtext F and a float right aligned on systems like ESP8266 or ESP32 - will NOT work on Arduino UNO/MEGA/NANO ...")); + display.clear(); + for (float counter = -9; counter < 10; counter = counter + 1.3) + { + sprintf(data, "F%3.1f", counter); // 3 total digits (including dot!) + 1 after dot + display.print(data); + Serial.println(data); + delay(wait); + } + */ + + Serial.println(F("display the Fixtext A and an integeger right aligned")); + for (int8_t counter = 123; counter > -12; counter--) { + sprintf(data, "A%3d", counter); + display.print(data); + delay(wait); + } + + Serial.println(F("Printable characters")); + for (uint8_t counter = 32; counter < 128; counter++) { + display.clear(); + display.print(counter); + display.write(counter); + delay(wait); + } + + Serial.println(F("display numbers on display")); + display.clear(); + for (uint16_t counter = 0; counter < 1000; counter++) { + float myvalue = counter; + myvalue = myvalue / 10; + Serial.print(F("\ncounter=")); Serial.println(counter); + Serial.print(F("myvalue=")); Serial.println(myvalue); + //display.clear(); + display.setCursor(0); + display.print(myvalue, 1); + delay(500); + } +} diff --git a/lib/NoiascaHt16k33/examples/12_sevenseg/12_sevenseg.ino b/lib/NoiascaHt16k33/examples/12_sevenseg/12_sevenseg.ino new file mode 100644 index 0000000000..d789f9d2fb --- /dev/null +++ b/lib/NoiascaHt16k33/examples/12_sevenseg/12_sevenseg.ino @@ -0,0 +1,77 @@ +/*************************************************** + + 12 Sevenseg + + This example is a variant of Adafruit Backpack "sevenseg" example to compare the two libraries + + original sketch + Written by Limor Fried/Ladyada for Adafruit Industries. + BSD license, all text above must be included in any redistribution + + this adopted Sketch + written by noiasca + + Sktech Version 2020-06-06 + + ****************************************************/ +#include // HT16K33 uses I2C, include the Wire Library +#include "NoiascaHt16k33.h" // include the noiasca HT16K33 library - download from http://werner.rothschopf.net/ +Noiasca_ht16k33_hw_7_4_c matrix = Noiasca_ht16k33_hw_7_4_c(); // object for 7 segments, 4 visbible digits, colon digit. e.g. Adafruit 0.56" 4-Digit 7-Segment Display w/I2C Backpack + + +void setup() { +#ifndef __AVR_ATtiny85__ + Serial.begin(115200); + Serial.println("7 Segment Backpack Test"); +#endif + Wire.begin(); // start the I2C interface + matrix.begin(0x70); +} + + +void loop() { + // try to print a number thats too long + matrix.print(10000, DEC); + delay(500); + matrix.clear(); + + // print a hex number + matrix.print(0xBEEF, HEX); + delay(500); + matrix.clear(); + + // print a floating point + matrix.print(12.34); + delay(500); + matrix.clear(); + + // print with print/println + for (uint16_t counter = 0; counter < 9999; counter++) { + matrix.println(counter); + delay(10); + matrix.setCursor(0); // as we are counting upwards, no need for matrix.clear() + } + + // method #2 - draw each digit + uint16_t blinkcounter = 0; + boolean drawDots = false; + + for (uint16_t counter = 0; counter < 9999; counter ++) { + matrix.print(counter / 1000); + matrix.print((counter / 100) % 10); + matrix.showColon(drawDots); + matrix.print((counter / 10) % 10); + matrix.print(counter % 10); + + blinkcounter += 50; + if (blinkcounter < 500) { + drawDots = false; + } else if (blinkcounter < 1000) { + drawDots = true; + } else { + blinkcounter = 0; + } + delay(10); + matrix.setCursor(0); + } +} diff --git a/lib/NoiascaHt16k33/examples/12_sevenseg/info.ino b/lib/NoiascaHt16k33/examples/12_sevenseg/info.ino new file mode 100644 index 0000000000..aee8726d48 --- /dev/null +++ b/lib/NoiascaHt16k33/examples/12_sevenseg/info.ino @@ -0,0 +1,11 @@ +/* + +The original sketch from adafruit compiles: +Der Sketch verwendet 5934 Bytes (18%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes. +Globale Variablen verwenden 456 Bytes (22%) des dynamischen Speichers, 1592 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. + +Using NoiascaHt16K33 +Der Sketch verwendet 4540 Bytes (14%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes. +Globale Variablen verwenden 445 Bytes (21%) des dynamischen Speichers, 1603 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. + +*/ diff --git a/lib/NoiascaHt16k33/examples/13_format_number_7segment/13_format_number_7segment.ino b/lib/NoiascaHt16k33/examples/13_format_number_7segment/13_format_number_7segment.ino new file mode 100644 index 0000000000..ff7853be50 --- /dev/null +++ b/lib/NoiascaHt16k33/examples/13_format_number_7segment/13_format_number_7segment.ino @@ -0,0 +1,133 @@ +/*************************************************** + + Print Numbers aligned (without sprintf) + + This example shows how to print numbers right aligned without the RAM hungry sprintf + + The first function is a short introduction how to print with leading zeroes. + The second function uses a similar concept but with trailing blanks. + + written by + noiasca + + Sktech Version 2020-06-06 + + ****************************************************/ +#include // HT16K33 uses I2C, include the Wire Library +#include "NoiascaHt16k33.h" // include the noiasca HT16K33 library - download from http://werner.rothschopf.net/ + +Noiasca_ht16k33_hw_7_4_c display = Noiasca_ht16k33_hw_7_4_c(); // object for 7 segments, 4 visbible digits, Colon digit. E.g. Adafruit 0.56" 4-Digit 7-Segment Display w/I2C Backpack +//Noiasca_ht16k33_hw_7 display = Noiasca_ht16k33_hw_7(); // object for 7 segments, 8 digits +//Noiasca_ht16k33_hw_14_4 display = Noiasca_ht16k33_hw_14_4(); // object for 14 segments - 4 digits + +const uint16_t wait = 1000; // wait milliseconds between demos + +// Print a number Right aligned, position defines lowest digit. Pre-Zero +void printRightZeroedFrom0to3(int32_t value) +{ + display.print((value / 1000) % 10); + display.print((value / 100) % 10); + display.print((value / 10) % 10); + display.print(value % 10); +} + + +// Print a number Right aligned +// unused digits will be blanked +// if the number doesn't fit into the given space (from startposition to endposition) display a filler +// Parameters: +// value = the number you want to print +// startposition = first digit to be used +// endposition = last digit to be used + +void printRightBlank(int32_t value, uint8_t startposition, uint8_t endposition) +{ + uint8_t needed = neededDigits(value); + uint8_t available = endposition - startposition + 1; + display.setCursor(startposition); + if (available - needed < 0) + { + Serial.print (value); Serial.println(F(" is to large to display on defined digits")); + for (uint8_t i = 0; i < (available); i++) + { + display.print(F("o")); // blank out the display + } + } + else + { + display.setCursor(startposition); + for (uint8_t i = 0; i < (available - needed); i++) + { + display.print(F(" ")); // print fillers on unused digits, deletes rests of old number + } + if (value < 0) // care about signed values + { + display.print(F("-")); + value = value * -1; + } + display.print(value); + } +} + + +// return the needed digits for a number +// Parameters: +// value = the number you want to analyze +// Return: +// the digits of the given value +uint8_t neededDigits(int32_t value) { + byte digit = 1; + if (value >= 0) { + value = -value; + digit--; + } + switch (value) { + case -2147483648 ... -1000000000: digit++; + case -999999999 ... -100000000: digit++; + case -99999999 ... -10000000: digit++; + case -9999999 ... -1000000: digit++; + case -999999 ... -100000: digit++; + case -99999 ... -10000: digit++; + case -9999 ... -1000: digit++; + case -999 ... -100: digit++; + case -99 ... -10: digit++; + case -9 ... 0: digit++; + default: break; + } + return digit; +} + + +void setup() { +#ifndef __AVR_ATtiny85__ + Serial.begin(115200); + Serial.println("Format Number Printing"); +#endif + Wire.begin(); // start the I2C interface + Wire.setClock(400000); // optional: activate I2C fast mode. If it is to fast for other I2C devices. deactivate this row. + display.begin(0x70); + if (display.isConnected()) // check if all HT16K33 are connected + Serial.println(F("I: display connected")); + else + Serial.println(F("E: display error")); + display.clear(); + printRightZeroedFrom0to3(123); // print a number right aligned using all digits from 0 to 3 + delay(wait); + + display.clear(); + printRightBlank(45, 1, 2); + delay(wait); + + display.clear(); + printRightBlank(67, 0, 3); + delay(wait); +} + + +void loop() { + display.clear(); + for (int16_t counter = -110; counter < 1010; counter++) { + printRightBlank(counter, 1, 3); // print a number right aligned from digit 1 to 3 + delay(10); + } +} diff --git a/lib/NoiascaHt16k33/examples/20_Multidisplay/20_Multidisplay.ino b/lib/NoiascaHt16k33/examples/20_Multidisplay/20_Multidisplay.ino new file mode 100644 index 0000000000..0400819068 --- /dev/null +++ b/lib/NoiascaHt16k33/examples/20_Multidisplay/20_Multidisplay.ino @@ -0,0 +1,123 @@ +/******************************************************************************* + Multidisplay + Noiasca HT16K33 + + You can easily handle more than one display in different configuration with one Library + + The example will handle: + - One Adafruit 4 Digit Display + - A chain of two alphanumerical displays with 4 digts each for a total of 8 digits. + - One single 4 digit alphanumeric display + + Based on "Blink Without Delay" this sketch uses NO DELAYS in the loop(). The loop() runs non blocking code! + + by noiasca + Sketch Version 2020-09-19 + + *******************************************************************************/ +#include // HT16K33 uses I2C, include the Wire Library +#include "NoiascaHt16k33.h" // include the noiasca HT16K33 library - download from http://werner.rothschopf.net/ + +Noiasca_ht16k33_hw_7_4_c display7 = Noiasca_ht16k33_hw_7_4_c(); // 7 Segment, 4 visbible digits, colon digit +Noiasca_ht16k33_hw_14_4 displayA = Noiasca_ht16k33_hw_14_4(); // 14 segments, 4 digits +Noiasca_ht16k33_hw_14_4 displayB = Noiasca_ht16k33_hw_14_4(); // 14 segments, 4 digits + +// just a simple counter +void tick_animation7() +{ + const uint16_t intervall = 100; // intervall of updates + static uint32_t previousMillis; // is static, because we need the value the next time when we call the function again, WITHOUT the need of a global variable + static uint16_t counter; // static, as we want to keep the counter from to call without a global variable + if (millis() - previousMillis > intervall) // check, if it is time to do something + { + display7.setCursor(0); // goto position 0 + display7.print(counter); // print the counter + counter++; // increase coutner for the next call + if (counter > 9999) + { counter = 0; // care about the rollover + display7.clear(); // clear display + } + previousMillis = millis(); // remember the current time + } +} + +// show messages on display +void tick_animationA() +{ + const uint16_t intervall = 1500; + static uint32_t previousMillis; + static uint16_t counter; + // 12345678 12345678 12345678 12345678 12345678 + const char *myText[] = {"Lets see", "what is ", "new to ", " this ", "Example.", + "You can ", "add more", "Messages", "in the ", "Sketch. ", + "Just see", "how many", " Bytes ", "RAM are ", "Free. ", + "Update ", " Modify ", " or ", " Delete ", "Messages", + "Have fun", "REGARDS ", " noiasca" // no comma after last message + }; + if (millis() - previousMillis > intervall) + { + const uint8_t messages = sizeof(myText) / sizeof(myText[0]); // this will count the definied messages, so we don't have to define the number of messages manually ;-) + // Serial.print (counter); Serial.print(F(" ")); Serial.println(myText[counter]); + displayA.clear(); + displayA.print(myText[counter]); + displayA.write(counter); + counter++; + if (counter >= messages) counter = 0; + previousMillis = millis(); + } +} + +// show all printable characters +void tick_animationB() +{ + const uint16_t intervall = 700; + static uint32_t previousMillis; + static uint16_t counter = 32; + if (millis() - previousMillis > intervall) + { + displayB.clear(); + displayB.print(counter); + displayB.write(counter); + counter++; + if (counter > 127) counter = 32; + previousMillis = millis(); + } +} + + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println(F("\nMultidisplay: 3 independent Display consisting of 4 HT16K33")); + Wire.begin(); // start the I2C interface + Wire.setClock(400000); // optional: activate I2C fast mode. If it is to fast for other I2C devices. deactivate this row. + display7.begin(0x70); // I2C adress of first display, total number of devices + displayA.begin(0x71, 2); // I2C adress of first display, two devices, means, we are using 0x71 and 0x72 as "one" display + displayB.begin(0x73); // I2C adress of first display, total number of devices + + if (display7.isConnected() == false) // check if all HT16K33 are connected + Serial.println(F("E: display7 error")); + if (displayA.isConnected() == false) // check if all HT16K33 are connected + Serial.println(F("E: displayA error")); + if (display7.isConnected() == false) // check if all HT16K33 are connected + Serial.println(F("E: displayB error")); + + Serial.println(F("ON Test")); + display7.print(F("1.234")); + displayA.print(F("2 Module")); + displayB.print(F("ABCD")); + delay(2000); + + display7.clear(); + displayA.clear(); + displayB.clear(); + Serial.println(F("now, each Display shows it's own animation...")); +} + + +void loop() { + // put your main code here, to run repeatedly: + tick_animation7(); + tick_animationA(); + tick_animationB(); +} diff --git a/lib/NoiascaHt16k33/examples/21_scrolltext/21_scrolltext.ino b/lib/NoiascaHt16k33/examples/21_scrolltext/21_scrolltext.ino new file mode 100644 index 0000000000..20462b2991 --- /dev/null +++ b/lib/NoiascaHt16k33/examples/21_scrolltext/21_scrolltext.ino @@ -0,0 +1,52 @@ +/******************************************************************************* + Scrolltext + Noiasca HT16K33 + + The extended class can scroll text (from left to right) + + The example will handle: + - A chain of three alphanumerical displays with 4 digts each for a total of 12 digits. + + The loop() mut run without blocking code, otherwise the scrolling text will be blcoked also + + by noiasca + Sketch Version 2022-02-28 + + *******************************************************************************/ + +#include // HT16K33 uses I2C, include the Wire Library +#include "NoiascaHt16k33.h" // include the noiasca HT16K33 library - download from http://werner.rothschopf.net/ + +Noiasca_ht16k33_hw_14_ext display = Noiasca_ht16k33_hw_14_ext(); // 14 segment, extended class with scroll support + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println(F("\nScroll a text")); + Wire.begin(); // start the I2C interface + //Wire.setClock(400000); // optional: activate I2C fast mode. If it is to fast for other I2C devices deactivate this row. + display.begin(0x70, 3); // I2C adress of first display, in total we use 3 displays + if (display.isConnected() == false) // check if all HT16K33 are connected + Serial.println(F("E: display error")); + display.setDigits(4); // if your modules are not using all 8 digits, reduce the used digits + Serial.println(F("ON Test")); + display.print(F("3 Modules on")); // just some "on" test + delay(2000); + + Serial.println(F("now, each display shows it's own animation...")); + display.setScrolltext("THIS IS OUR FIRST SCROLLTEXT. LOOKS NICE. noiasca"); // this text will be scrolled + + // more examples how to scroll content: + // display.setScrolltext("SHORTY"); // scroll text can be very short also + // display.setScrolltext(1234567890); // scroll a (long) number + // display.setScrolltext(123.456); // floats will be fixed to 2 decimals. + + // display.setScrollInterval(300); // sets the scroll speed + // display.setScrollWait(5000); // sets the wait/timeout after all letters are scrolled to the display +} + + +void loop() { + // put your main code here, to run repeatedly: + display.scroll(); //needs to be called for updating the scroll text +} diff --git a/lib/NoiascaHt16k33/examples/23_clock_14segment_ds3231/23_clock_14segment_ds3231.ino b/lib/NoiascaHt16k33/examples/23_clock_14segment_ds3231/23_clock_14segment_ds3231.ino new file mode 100644 index 0000000000..d8d6ae7023 --- /dev/null +++ b/lib/NoiascaHt16k33/examples/23_clock_14segment_ds3231/23_clock_14segment_ds3231.ino @@ -0,0 +1,135 @@ +/******************************************************************************* + Clock example using 14 segment displays & DS3231 real-time clock. + + Needed hardware + - one chains of two alphanumerical displays with 8 digts total of 16 digits. + - a realtime clock DS3231 + + The software: + - the sketch uses only basic I2C communication to read the DS3231 time + - no dedicated RTClib needed + - the loop() must run without blocking code, otherwise blinking of seconds will not work + - it simulates one row of the "Time Circuit Display" from Back to the Future. + + by noiasca + Sketch Version 2020-06-06 + + *******************************************************************************/ +#include // needed for the DS3231 and HT16K33 +#include "NoiascaHt16k33.h" // include the noiasca HT16K33 library - download from http://werner.rothschopf.net/ + + +const uint8_t DS3231_I2C_ADDRESS = 0x68; // I2C address of the DS3231 +Noiasca_ht16k33_hw_14 display = Noiasca_ht16k33_hw_14(); // 14 segment - Present time + +// Define the clock style: +// 0 European continantial style DD. MMM YYYY HH.MM +// 1 anglo-american style MMM DD YYYY HH.MM +#define CLOCK_STYLE 0 + +void updatePresentTime() +{ + static uint16_t intervall = 60000; // we only check each n milliseconds the rtc + static uint32_t previousMillis = -intervall; // this initial value will force an update of the display on the first call + const uint16_t intervallBlink = 1000; // blink frequency of time dot + static uint32_t previousMillisBlink = 0; + static byte previousMinute; // needed for check if new print is necessary + static byte previousHour; // needed for blinking the time dot + if (millis() - previousMillis > intervall) + { + //Serial.println(F("D46 check time")); + byte second = 0, minute = 0, hour = 0, dayOfWeek, dayOfMonth = 1, month = 1, year = 0; + readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // retrieve data from DS3231 + Serial.print(hour); Serial.print(F(":")); Serial.print (minute); Serial.print(F(":")); Serial.println(second); + if (minute != previousMinute) + { + //Serial.println(F("D52 new minute")); +#if CLOCK_STYLE == 0 + // 0 Clock in European continantial style DD. MMM YYYY HH.MM + const char *monthName[] = {"JAN", "FEB", "MAR", "APR", "MAI", "JUN", "JUL", "AUG", "SEP", "OKT", "NOV", "DEZ"}; // German month names + display.clear(); + if (dayOfMonth < 10) display.print(F("0")); + display.print(dayOfMonth); + display.print(F(". ")); + display.print(monthName[month - 1]); + display.print(F(" ")); + display.print(2000 + year); + display.print(F(" ")); + if (hour < 10) display.print(F("0")); + display.print(hour); + display.print(F(".")); + if (minute < 10) display.print(F("0")); + display.print(minute); +#else + // 1 Clock in anglo-american style MMM DD YYYY HH.MM + const char *monthName[] = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"}; // English month names + display.clear(); + display.print(monthName[month - 1]); + if (dayOfMonth < 10) display.print(F(" ")); + display.print(dayOfMonth); + display.print(F(" ")); + display.print(2000 + year); + display.print(F(" ")); + byte hourDisplay = hour; + if (hour > 12) hourDisplay = hour - 12; + if (hourDisplay < 10) display.print(F("0")); + display.print(hourDisplay); + display.setCursor(14); + if (minute < 10) display.print(F("0")); + display.print(minute); +#endif + previousHour = hour; + previousMinute = minute; + //Serial.print(F("Temp ")); Serial.println(getDS3231temp()); // The DS3231 has a temperature compensation. You can retrive the temperature from the DS3231. + } + intervall = (60 - second) * 1000; // adopt intervall depending on the time to next minute + previousMillis = millis(); + } +#if CLOCK_STYLE == 0 + if (millis() - previousMillisBlink > intervallBlink) + { + // blink the dot between HH and MM + display.setCursor(13); + display.print(previousHour % 10); // we need to reprint the Hour with or without a dot + if ((millis() / intervallBlink ) % 2) + display.print(F(".")); + previousMillisBlink = millis(); + } +#else + if (millis() - previousMillisBlink > intervallBlink) + { + // blink a - between HH and MM + display.setCursor(13); + if ((millis() / intervallBlink ) % 2) + display.print(F("-")); + else + display.print(F(" ")); + previousMillisBlink = millis(); + } +#endif +} + + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println(F("\nTime Circuits Display")); + Wire.begin(); // start the I2C interface + Wire.setClock(400000); // optional: activate I2C fast mode. If it is to fast for other I2C devices. deactivate this row. + display.begin(0x70, 2); // I2C adress of the first green display, 2 modules needed for 16 characters + if (display.isConnected() == false) // check if all HT16K33 are connected + Serial.println(F("E: display error")); + display.clear(); + // ss mm hh w dd mm yy + //setDS3231datetime(00, 56, 9, 7, 12, 10, 19); // set the time once + Serial.println(F("ON Test")); + display.print(F(" PRESENT TIME ")); + delay(2000); + Serial.println(F("now, display shows it's own animation...")); +} + + +void loop() { + // put your main code here, to run repeatedly: + updatePresentTime(); +} diff --git a/lib/NoiascaHt16k33/examples/23_clock_14segment_ds3231/rtc.ino b/lib/NoiascaHt16k33/examples/23_clock_14segment_ds3231/rtc.ino new file mode 100644 index 0000000000..ca1fc90c9d --- /dev/null +++ b/lib/NoiascaHt16k33/examples/23_clock_14segment_ds3231/rtc.ino @@ -0,0 +1,99 @@ +/* ******************************************************************* + Real Time Clock + Datasheet: https://datasheets.maximintegrated.com/en/ds/DS3231.pdf + ***************************************************************** */ + +byte decToBcd(byte val) +{ + // Convert normal decimal numbers to binary coded decimal + return ( (val / 10 * 16) + (val % 10) ); +} + + +byte bcdToDec(byte val) +{ + // Convert binary coded decimal to normal decimal numbers + return ( (val / 16 * 10) + (val % 16) ); +} + + +void setDS3231time(byte second, byte minute, byte hour) +{ + // sets time to DS3231 + Wire.beginTransmission(DS3231_I2C_ADDRESS); + Wire.write(0); // set next input to start at the seconds register + Wire.write(decToBcd(second)); // set seconds + Wire.write(decToBcd(minute)); // set minutes + Wire.write(decToBcd(hour)); // set hours + Wire.endTransmission(); +} + + +void setDS3231datetime(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) +{ + // sets time and date data to DS3231 + Wire.beginTransmission(DS3231_I2C_ADDRESS); + Wire.write(0); // set next input to start at the seconds register + Wire.write(decToBcd(second)); // set seconds + Wire.write(decToBcd(minute)); // set minutes + Wire.write(decToBcd(hour)); // set hours + Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday) + Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31) + Wire.write(decToBcd(month)); // set month + Wire.write(decToBcd(year)); // set year (0 to 99) + Wire.endTransmission(); +} + + +void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) +{ + Wire.beginTransmission(DS3231_I2C_ADDRESS); + Wire.write(0); // set DS3231 register pointer to 00h + Wire.endTransmission(); + byte datalen = 7; + Wire.requestFrom(DS3231_I2C_ADDRESS, datalen); // request seven bytes of data from DS3231 starting from register 00h + if (Wire.available()) { + *second = bcdToDec(Wire.read() & 0b01111111); // 0x00 seconds + *minute = bcdToDec(Wire.read() & 0b01111111); // 0x01 minutes + *hour = bcdToDec(Wire.read() & 0b00111111); // 0x02 hours + *dayOfWeek = bcdToDec(Wire.read() & 0b00000111); // 0x03 "day" in the datasheet + *dayOfMonth = bcdToDec(Wire.read() & 0b00111111); // 0x04 "date" in the datasheet + *month = bcdToDec(Wire.read() & 0b00011111); // 0x05 month + *year = bcdToDec(Wire.read()); // 0x06 year + } + else + { + Serial.println(F("\nE071 no data from DS3231")); + } +} + + +// set the initial time here: +// DS3231 seconds, minutes, hours, day, date, month, year +// ss mm hh w dd mm yy +// setDS3231datetime(00,32,20,3,24,11,15); // set once time and date +// setDS3231time(0,51,19); // if necessaray set the time + +float getDS3231temp() +{ + float temp3231 = 0; + int8_t tMSB; // according datasheet MSB has sign, therefore we are using signed variable + byte tLSB; + Wire.beginTransmission(DS3231_I2C_ADDRESS); + Wire.write(0x11); //temp registers (11h-12h) get updated automatically every 64s + Wire.endTransmission(); + byte datalen = 2; + Wire.requestFrom(DS3231_I2C_ADDRESS, datalen); + if (Wire.available()) + { + tMSB = Wire.read(); // 2's complement int portion + tLSB = Wire.read(); // fraction portion + temp3231 = tMSB; // includes sign, therefore NO bitmask + temp3231 += ((tLSB >> 6) * 0.25 ); // only care about bits 7 & 8 + } + else + { + Serial.println(F("\nE102 no data from DS3231")); + } + return temp3231; +} diff --git a/lib/NoiascaHt16k33/examples/90_development_tests/90_development_tests.ino b/lib/NoiascaHt16k33/examples/90_development_tests/90_development_tests.ino new file mode 100644 index 0000000000..e4ee355da8 --- /dev/null +++ b/lib/NoiascaHt16k33/examples/90_development_tests/90_development_tests.ino @@ -0,0 +1,182 @@ +/******************************************************************************* + Development tests + Noiasca HT16K33 + + This is a sketch I'm using during development and regression testing + + by noiasca + Sketch Version 2020-06-05 + + *******************************************************************************/ +#include // HT16K33 uses I2C, include the Wire Library +#include "NoiascaHt16k33.h" // include the noiasca HT16K33 library - download from http://werner.rothschopf.net/ + +Noiasca_ht16k33_hw_7 display = Noiasca_ht16k33_hw_7(); // 7 segments, 8 digits +//Noiasca_ht16k33_hw_7_4_c display = Noiasca_ht16k33_hw_7_4_c(); // 7 Segment, 4 visbible digits, colon digit +//Noiasca_ht16k33_hw_14 display = Noiasca_ht16k33_hw_14(); // object for 14 segments - 8 digits +//Noiasca_ht16k33_hw_14_4 display = Noiasca_ht16k33_hw_14_4(); // object for 14 segments - 4 digits +//Noiasca_ht16k33_hw_14_ext display = Noiasca_ht16k33_hw_14_ext(); // object for 14 segments - 4 digits + +const uint16_t wait = 500; // wait milliseconds between demos + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println(F("\n90 development tests")); + Wire.begin(); // start the I2C interface + Wire.setClock(400000); // optional: activate I2C fast mode. If it is to fast for other I2C devices. deactivate this row. + + /* + display7.begin(0x70); + display7.clear(); + display7.print(F("1.234")); + //display7.showColon(1); // show colon on 7 segment display + //display7.blinkRate(HT16K33_BLINK_HALFHZ); + delay(wait); + display7.clear(); + display7.print(F("8888")); + */ + + display.begin(0x71); // I2C address of first display, optional total number of devices + display.isConnected() ? Serial.println(F("I: display connected")) : Serial.println(F("E: display error")); + + Serial.println(F("ON Test")); + display.clear(); + display.print(F("ALFABETADELT")); // if the text is to long or your display (chain) you will only see the last letters + delay(wait); delay(wait); + + Serial.println(F("Set brightness")); + display.setBrightness(5); // set brightness from 0 to 15 + + Serial.println(F("all segments of first 4 digits on first device")); + display.clear(); + display.write(127); + display.write(127); + display.write(127); + display.write(127); + delay(wait); + + /* + Serial.println(F("Print a number")); + display.clear(); + display.print(1234); + delay(wait); + + Serial.println(F("Blink display")); + display.clear(); + display.blinkRate(HT16K33_BLINK_2HZ); + display.print(F("BLIN")); + delay(wait); delay(wait); delay(wait); + display.blinkRate(HT16K33_BLINK_OFF); + + Serial.println(F("Print a float")); + display.clear(); + display.print(5.67); + delay(wait); + + Serial.println(F("Print text with dots")); + display.clear(); + display.print(F("5.6.7.8.")); + delay(wait); + + //display7.showColon(0); + + */ +} + + +void loop() { + // put your main code here, to run repeatedly: + testOnOff(); +} + + +void testOnOff() +{ + //display.home(); //4438 422 + display.clear(); // 4438 422 + Serial.println(F("test On Off")); + Serial.println(F("off")); + display.off(); + display.print(F("off ")); // will not be shown on the display + delay(wait); + + Serial.println(F("new")); + display.println(F("new ")); // will not be shown on the display + delay(wait); + + Serial.println(F("On")); + display.on(); // this will show the last text new + //display.print(F("On ")); + delay(wait * 2); +} + + + +void testBrightness() +{ + Serial.println(F("test brightness")); + for (byte i = 0; i < 16; i++) + { + Serial.println(i); + display.setBrightness(i); // set brightness from 0 to 15 + delay(wait); + } +} + +void testSet() +{ + // just a set of several tests + char data[10]; // we need a small buffer to store a temp result + + Serial.println(F("display fixtext F and a float right aligned")); + display.clear(); + for (float counter = -9; counter < 10; counter = counter + 1.3) + { + int16_t myint = counter * 10; + sprintf(data, "F%2d.%d", myint / 10, abs(myint) % 10); // we split the output into two separte integers + display.print(data); + Serial.println(data); + delay(wait); + } + + /* + Serial.println(F("display fixtext F and a float right aligned on systems like ESP8266 or ESP32 - will NOT work on Arduino UNO/MEGA/NANO ...")); + display.clear(); + for (float counter = -9; counter < 10; counter = counter + 1.3) + { + sprintf(data, "F%3.1f", counter); // 3 total digits (including dot!) + 1 after dot + display.print(data); + Serial.println(data); + delay(wait); + } + */ + + Serial.println(F("display the Fixtext A and an integeger right aligned")); + for (int8_t counter = 123; counter > -12; counter--) { + sprintf(data, "A%3d", counter); + display.print(data); + delay(wait); + } + + Serial.println(F("Printable characters")); + for (uint8_t counter = 32; counter < 128; counter++) { + display.clear(); + display.print(counter); + display.write(counter); + delay(wait); + } + + Serial.println(F("display numbers on display")); + display.clear(); + for (uint16_t counter = 0; counter < 1000; counter++) { + float myvalue = counter; + myvalue = myvalue / 10; + Serial.print(F("\ncounter=")); Serial.println(counter); + Serial.print(F("myvalue=")); Serial.println(myvalue); + //display.clear(); + display.setCursor(0); + display.print(myvalue, 1); + delay(500); + } +} diff --git a/lib/NoiascaHt16k33/keywords.txt b/lib/NoiascaHt16k33/keywords.txt new file mode 100644 index 0000000000..f79a61ebc5 --- /dev/null +++ b/lib/NoiascaHt16k33/keywords.txt @@ -0,0 +1,41 @@ +####################################### +# Syntax Coloring Map For NoiascaHt16K33 +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Noiasca_ht16k33_hw_14 KEYWORD1 +Noiasca_ht16k33_hw_14_4 KEYWORD1 +Noiasca_ht16k33_hw_14_ext KEYWORD1 +Noiasca_ht16k33_hw_7 KEYWORD1 +Noiasca_ht16k33_hw_7_4_c KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +begin KEYWORD2 +blinkRate KEYWORD2 +clear KEYWORD2 +off KEYWORD2 +on KEYWORD2 +isConnected KEYWORD2 +scroll KEYWORD2 +setBrightness KEYWORD2 +setCursor KEYWORD2 +setDigits KEYWORD2 +setScrolltext KEYWORD2 +setScrollIntervall KEYWORD2 +setScrollWait KEYWORD2 +#writeLowLevel KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + +HT16K33_BLINK_OFF LITERAL1 +HT16K33_BLINK_2HZ LITERAL1 +HT16K33_BLINK_1HZ LITERAL1 +HT16K33_BLINK_HALFHZ LITERAL1 \ No newline at end of file diff --git a/lib/NoiascaHt16k33/library.properties b/lib/NoiascaHt16k33/library.properties new file mode 100644 index 0000000000..d35f6f713c --- /dev/null +++ b/lib/NoiascaHt16k33/library.properties @@ -0,0 +1,9 @@ +name=NoiascaHt16k33 +version=1.2.0 +author=Werner Rothschopf +maintainer=Werner Rothschopf +sentence=A library for the HT16K33 LED display drivers. +paragraph=The library supports multiple daisychained drivers with 7-segment as well 14-segment displays. This version is optimized to print numbers and long text with easy print and println method. Its interface is very similar to the LCD API 1.0 specification. +category=Display +url=http://werner.rothschopf.net/201909_arduino_ht16k33.htm +architectures=* \ No newline at end of file diff --git a/lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp b/lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp new file mode 100644 index 0000000000..2245648dd8 --- /dev/null +++ b/lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp @@ -0,0 +1,435 @@ +/* ******************************************************************* + HT16K33 Library + + by (c) noiasca + + 2024-09-13 fixed decimal point for 7 segment variants + 2022-02-28 fixed typo interval + 2021-11-27 corrected TWCR to 328/2560 only + * ******************************************************************/ +#include "NoiascaHt16k33.h" + +Noiasca_ht16k33::Noiasca_ht16k33() +{} + + +uint8_t Noiasca_ht16k33::begin(uint8_t i2c_addr, uint8_t numDevices /* = 1 */) { + uint8_t result = 0; // 0 = success + _i2c_addr = i2c_addr; + _numDevices = numDevices; + if (_numDevices > 8) _numDevices = 1; +#if HT16K33_DEBUG > 2 + Serial.println(F("D012 begin base")); + //Serial.print(F("D013 numDevices=")); Serial.println(numDevices); +#endif +#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega2560__) + if (TWCR == 0) { + Wire.begin(); // only call when not started before +#if HT16K33_DEBUG >= 2 + Serial.println(F("W019 add Wire.begin() to your setup")); +#endif + } +#endif + for (uint8_t i = _i2c_addr; i < _i2c_addr + _numDevices; i++) + { + Wire.beginTransmission(i); + Wire.write(HT16K33_OSCILATOR_ON); // turn on oscillator + if (Wire.endTransmission()) + { + result = HT16K33_ERR_ADDR; +#if HT16K33_DEBUG > 0 + Serial.print(F("E039 I2C error for adress 0x")); + Serial.println(i, HEX); +#endif + } + blinkRate(HT16K33_BLINK_OFF); + setBrightness(15); // max brightness + } + return result; +} + + +void Noiasca_ht16k33::blinkRate(uint8_t b) { + for (uint8_t i = 0; i < _numDevices; i++) + { + Wire.beginTransmission(_i2c_addr + i); + if (b > 3) b = 0; // turn blink off if not sure + Wire.write(HT16K33_BLINK_CMD | HT16K33_BLINK_DISPLAYON | (b << 1)); + Wire.endTransmission(); + } +} + + +void Noiasca_ht16k33::clear(void) { // Clears displaybuffer and Display (I2C) +#ifdef HT16K33_BUFFERSIZE + for (uint8_t i = 0; i < HT16K33_BUFFERSIZE; i++) { + displaybuffer[i] = 0; + } +#endif + for (uint8_t i = 0; i < _numDevices; i++) + { + Wire.beginTransmission(_i2c_addr + i); + for (uint8_t j = 0; j < 16; j++) { // for all 8 positions per device (16 adresses) + Wire.write(0); + } + Wire.endTransmission(); + } + _currentPosition = 0; +} + + +/* + check if all ICs are responding + return true on success +*/ +bool Noiasca_ht16k33::isConnected() +{ + for (uint8_t i = _i2c_addr; i < _i2c_addr + _numDevices; i++) { + Wire.beginTransmission(i); + if (Wire.endTransmission() != 0) // 0 if something ack's at this address + { +#if HT16K33_DEBUG >= 1 + Serial.print(F("E090 not responding IC 0x")); + Serial.println(i, HEX); +#endif + return false; // exit on first not responding display + } + } + return true; +} + + +/* + turn the display off +*/ +void Noiasca_ht16k33::off(void) +{ + for (uint8_t i = 0; i < _numDevices; i++) + { + Wire.beginTransmission(_i2c_addr + i); + Wire.write(HT16K33_BLINK_CMD); + Wire.endTransmission(); + } +} + + +/* + turn the display on +*/ +void Noiasca_ht16k33::on(void) +{ + blinkRate(HT16K33_BLINK_OFF); +} + + +/* + set the brightness of the display +*/ +void Noiasca_ht16k33::setBrightness(uint8_t b) { + if (b > 15) b = 15; + for (uint8_t i = 0; i < _numDevices; i++) { + Wire.beginTransmission(_i2c_addr + i); + Wire.write(HT16K33_CMD_BRIGHTNESS | b); + Wire.endTransmission(); + } +} + + +/* + set the cursor for the next writing position +*/ +void Noiasca_ht16k33::setCursor(uint8_t newPosition) { // Set the cursor for the next writing position + _currentPosition = newPosition; +} + + +/* + set the number of digits per device +*/ +void Noiasca_ht16k33::setDigits(uint8_t newDigits) +{ + _numDigits = newDigits; +} + + +#ifdef HT16K33_BUFFERSIZE +void Noiasca_ht16k33::writeChar(uint8_t device, uint16_t digit) { // I2C Ausgabe eines Zeichen aus Displaybuffer + device = digit / _numDigits; + uint8_t reg = (digit % _numDigits) * 2; + uint8_t i2c_addr = _i2c_addr + device; + Wire.beginTransmission(i2c_addr); + Wire.write(reg); // Register (uint8_t)digit * 2 + Wire.write(displaybuffer[digit] & 0xFF); // nibble + Wire.write(displaybuffer[digit] >> 8); // nibble + Wire.endTransmission(); +#if HT16K33_DEBUG > 2 + Serial.print(F(" digit=")); Serial.println(digit); + Serial.print(F(" device=")); Serial.println(device); + Serial.print(F("i2c_addr=")); Serial.println(i2c_addr, HEX); + Serial.print(F(" reg=")); Serial.println(reg); + Serial.print(F(" char=")); Serial.println(displaybuffer[digit], BIN); +#endif +} +#endif + + +/* + I2C lowLevel write of a bitmask to the IC to a specific position +*/ +void Noiasca_ht16k33::writeLowLevel(uint8_t position, uint16_t bitmask) { + uint8_t device = position / _numDigits; + uint8_t reg = (position % _numDigits) * 2; + uint8_t i2c_addr = _i2c_addr + device; + Wire.beginTransmission(i2c_addr); + Wire.write(reg); // Register (uint8_t)digit * 2 + Wire.write(bitmask & 0xFF); // nibble + Wire.write(bitmask >> 8); // nibble + Wire.endTransmission(); +#if HT16K33_DEBUG > 2 + Serial.print(F("position=")); Serial.println(position); + Serial.print(F(" device=")); Serial.println(device); + Serial.print(F("i2c_addr=")); Serial.println(i2c_addr, HEX); + Serial.print(F(" reg=")); Serial.println(reg); + Serial.print(F(" bitmask=")); Serial.println(bitmask, BIN); +#endif +} + + +/* ******************************************************************* + generic module 7 SEGMENT OBJECT + * ******************************************************************/ +Noiasca_ht16k33_hw_7::Noiasca_ht16k33_hw_7 () +{ + //public: +} + +uint16_t Noiasca_ht16k33_hw_7::getCharacterBitmap(uint8_t value) { + + if (value > 31 && value < FONTFILE7_MAX_CHAR) // write printable ASCII characters to display + { + return pgm_read_byte_near(charTable + value - 32); // the table starts with the first printable character at 32 + } + return 0u; +} + + +// general write method for 7 segment +size_t Noiasca_ht16k33_hw_7::write(uint8_t value) { + if (value == '.' || value == ',' || value == ':' || value == ';') // dots need a special handling + { +#ifdef HT16K33_BUFFERSIZE + displaybuffer[_lastPosition] = displaybuffer[_lastPosition] | SEG_DP; +#endif + _lastBitmap = _lastBitmap | SEG_DP; + writeLowLevel(_lastPosition, _lastBitmap); + } + else if (value > 31 && value < FONTFILE7_MAX_CHAR) // write printable ASCII characters to display + { + _lastBitmap = pgm_read_byte_near(charTable + value - 32); // the table starts with the first printable character at 32 +#ifdef HT16K33_BUFFERSIZE + displaybuffer[_currentPosition] = _lastBitmap; +#endif + _lastPosition = _currentPosition; + writeLowLevel(_currentPosition, _lastBitmap); + _currentPosition++; + if (_hasColonDigit && _currentPosition == 2) _currentPosition = 3; // colon MISSING: auch für die vielfachen Positionen!!! + if (_currentPosition >= _numDigits * _numDevices) _currentPosition = 0; + } + return 1; // assume sucess +} + + +// activates/deactivtes a separate colon digit +void Noiasca_ht16k33_hw_7::setColonDigit(uint8_t activate) +{ + _hasColonDigit = activate; +} + + +/* ******************************************************************* + 7 SEGMENT 4 Digits no digitalpoint, and colon digit + * ******************************************************************/ + +Noiasca_ht16k33_hw_7_4_c::Noiasca_ht16k33_hw_7_4_c() +{ + _numDigits = 5; // In fact the display has 5 digits but only 0 1 3 4 are visible. 2 is used for the colon Digit + _hasColonDigit = 1; +} + + +void Noiasca_ht16k33_hw_7_4_c::showColon(bool colon) +{ + for (uint8_t i = 0; i < _numDevices; i++) { + showColon(i, colon); + } +} + + +void Noiasca_ht16k33_hw_7_4_c::showColon(uint8_t device, bool colon) +{ + Wire.beginTransmission(_i2c_addr + device); + Wire.write((uint8_t)0x04); // start at address $02 + if (colon) + Wire.write((uint8_t)0x2); + else + Wire.write((uint8_t)0); + Wire.write((uint8_t)0); + Wire.endTransmission(); +} + + +/* ******************************************************************* + 14 SEGMENT generic + * ******************************************************************/ +Noiasca_ht16k33_hw_14::Noiasca_ht16k33_hw_14() +{} + +uint16_t Noiasca_ht16k33_hw_14::getCharacterBitmap(uint8_t value) { + + if (value > 31 && value < FONTFILE14_MAX_CHAR) // write printable ASCII characters to display + { + return pgm_read_word_near(charTable14 + value - 32); // the table starts with the first printable character at 32 + } + return 0u; +} + +size_t Noiasca_ht16k33_hw_14::write(uint8_t value) { + if (value == 35) value = 127; // MISSING: I don't remember why this is of any sence. This mapping costs 6 byte. DEPRECATED + //if (value==167 || value == 248) value = 42; // degree + //if (value==219) value = 127 // all segements + + if (value == '.' || value == ',' || value == ':' || value == ';') // dots need a special handling + { +#ifdef HT16K33_BUFFERSIZE + displaybuffer[_lastPosition] = displaybuffer[_lastPosition] | SEG14_DP; +#endif + _lastBitmap = _lastBitmap | SEG14_DP; + writeLowLevel(_lastPosition, _lastBitmap); + } + else if (value > 31 && value < FONTFILE14_MAX_CHAR) // write printable ASCII characters to display + { + _lastBitmap = pgm_read_word_near(charTable14 + value - 32); // the table starts with the first printable character at 32 +#ifdef HT16K33_BUFFERSIZE + displaybuffer[_currentPosition] = _lastBitmap; +#endif + _lastPosition = _currentPosition; + writeLowLevel(_currentPosition, _lastBitmap); + _currentPosition++; + if (_currentPosition >= _numDigits * _numDevices) _currentPosition = 0; + } + // Serial.write(value); + // Serial.print(F("Noiasca write: ")); + // Serial.println(value); + return 1; // assume sucess +} + + +/* ******************************************************************* + 14 segment 4 digits, digitalpoint + * ******************************************************************/ +Noiasca_ht16k33_hw_14_4::Noiasca_ht16k33_hw_14_4() +{ + _numDigits = 4; +} + + +/* ******************************************************************* + 14 segment extend class with scroll support + * ******************************************************************/ +Noiasca_ht16k33_hw_14_ext::Noiasca_ht16k33_hw_14_ext() +{} + + +uint32_t Noiasca_ht16k33_hw_14_ext::scroll() // the "tick" method for scrolling text +{ + if (millis() - previousMillis > interval) + { + const uint8_t textLength = strlen(myText); + //Serial.print(F("textLength=")); Serial.println(textLength); + const uint8_t displayLength = _numDigits * _numDevices; // das soll woanders her... ein getter??? + if (millis() - previousMillis > interval) + { + char buffer[displayLength + 2]; + if (counter < displayLength && counter < textLength + 1) // Step 1: print text at right end of display - scroll from right to left + { + clear(); + setCursor(displayLength - counter); + strlcpy(buffer, myText, counter + 1); + print(buffer); +#if HT16K33_DEBUG > 2 + Serial.print(counter); Serial.print(" "); Serial.println(buffer); +#endif + } + else if (counter < textLength + 1) // Step 3: print text on full display + { + strlcpy(buffer, myText + (counter - displayLength), displayLength + 1); + clear(); + print(buffer); +#if HT16K33_DEBUG > 2 + Serial.print(counter); Serial.print(" "); Serial.println(buffer); +#endif + } + if (counter > textLength) //Step 3: A extra delay at the end of the text + { + if (millis() - previousMillis > wait) + { + counter = 1; + rounds++; + previousMillis = millis(); + } + } + else + { + counter++; + previousMillis = millis(); + } + } + } + return rounds; +} + + +void Noiasca_ht16k33_hw_14_ext::setScrollInterval(uint16_t newInterval) +{ + if (newInterval < 100) interval = 100; else interval = newInterval; +} + + +void Noiasca_ht16k33_hw_14_ext::setScrollWait(uint16_t newWait) +{ + if (newWait >= interval) wait = newWait; +} + + +void Noiasca_ht16k33_hw_14_ext::setScrolltext(const char *newText) +{ + strlcpy(myText, newText, scrollBufferSize); + rounds = 0; +#if HT16K33_DEBUG > 2 + Serial.println(myText); +#endif +} + + +void Noiasca_ht16k33_hw_14_ext::setScrolltext(int32_t myNumber) +{ + char newText[12]; + ltoa(myNumber, newText, 10); + strlcpy(myText, newText, scrollBufferSize); + rounds = 0; +#if HT16K33_DEBUG > 2 + Serial.println(myText); +#endif +} + + +void Noiasca_ht16k33_hw_14_ext::setScrolltext(double myNumber) // this will scroll a float +{ + char newText[8]; // Buffer big enough for 7-character float + dtostrf(myNumber, 6, 2, newText); // Leave room for too large numbers! + strlcpy(myText, newText, scrollBufferSize - 1); + rounds = 0; // resets enables to keep external track of how often the text was scrolled already +#if HT16K33_DEBUG > 2 + Serial.println(myText); +#endif +} diff --git a/lib/NoiascaHt16k33/src/NoiascaHt16k33.h b/lib/NoiascaHt16k33/src/NoiascaHt16k33.h new file mode 100644 index 0000000000..d22ed07b0f --- /dev/null +++ b/lib/NoiascaHt16k33/src/NoiascaHt16k33.h @@ -0,0 +1,363 @@ +/* ******************************************************************* + HT16K33 Library + + copyright (c) noiasca + + Version 1.2.0 2024-09-13 + + History: + 2021-03-14 extract fonts in separate file + 2020-06-05 on(), off() + 2020-06-04 Wire.begin() must be called in the user sketch. A simple hook to catch on AVR platform is implemented + 2020-09-19 fix for ESP8266 + * ******************************************************************/ + + /*! + + \mainpage Some words to the Noiasca HT16K33 Library + + \section intro_sec Introduction + The "Noiasca HT16K33 Library" is an Arduino Library to control + HT16K33 based seven segment and 14 segment LED displays. + + The library inherits from Print.h and therefore supports the very common interface you know from other display libraries. + Additionally the interface is very close to the so called LCD API 1.0 + + \section example_sec Examples + There are several examples please use the hello world for the beginning. + + \section install_sec Install the library + Download the library from http://werner.rothschopf.net/201909_arduino_ht16k33.htm + + In the Arduino IDE use the Menu
    + Sketch / Include Library / Add .ZIP Library
    + to install the library. + */ + +#pragma once +#include +#include +#include + +#if defined(__AVR__) +#include +#elif defined(ESP8266) +#include +#endif + +/* ******************************************************************* + Settings + * ******************************************************************/ + +#define HT16K33_DEBUG 0 // Library debug messages: 0 off 1 important/error 2 warning 3 info/debug (mode 1 costs about 230 byte) +//#define HT16K33_BUFFERSIZE 8 * 8 // currently the bitmap Buffer is not needed. Could be used for scrolling text. + +/* ******************************************************************* + HW Definitions of a bitmask for each LED segment: + * ******************************************************************/ +// 7 Segment +// This is the most common segment definition +// match LED segment of display to hardware +// .GFEDCBA +const uint8_t SEG_A = 0b00000001; +const uint8_t SEG_B = 0b00000010; +const uint8_t SEG_C = 0b00000100; +const uint8_t SEG_D = 0b00001000; +const uint8_t SEG_E = 0b00010000; +const uint8_t SEG_F = 0b00100000; +const uint8_t SEG_G = 0b01000000; +const uint8_t SEG_DP = 0b10000000; + +// 14 segment +// .PONMLKHGFEDCBA +const uint16_t SEG14_A = (1<<0); +const uint16_t SEG14_B = (1<<1); +const uint16_t SEG14_C = (1<<2); +const uint16_t SEG14_D = (1<<3); +const uint16_t SEG14_E = (1<<4); +const uint16_t SEG14_F = (1<<5); +const uint16_t SEG14_G = (1<<6); +const uint16_t SEG14_H = (1<<7); +const uint16_t SEG14_K = (1<<8); +const uint16_t SEG14_L = (1<<9); +const uint16_t SEG14_M = (1<<10); +const uint16_t SEG14_N = (1<<11); +const uint16_t SEG14_O = (1<<12); +const uint16_t SEG14_P = (1<<13); +const uint16_t SEG14_DP = (1<<14); + +/* ******************************************************************* + Fonts + Beginning with Version 1.0.3 the fonts are extracted to separate files + if you don't like the existing characters duplicate the file, rename it and + include your modified file instead. + The concept how to include separte files might change in a newer version + * ******************************************************************/ + +//extern const uint8_t charTable7[]; // tbc https://forum.arduino.cc/index.php?topic=659107.0 +//extern const uint16_t charTable14[]; + +#ifndef FONTFILE7 +#include "fonts/font7legacy.h" +#endif + +#ifndef FONTFILE14 // include exact ONE 14 segment font +//#include "fonts/font14legacy.h" +#include "fonts/font14default.h" +//#include "fonts/font14netherlands.h" +#endif + +/* ******************************************************************* + no need to change something below here + * ******************************************************************/ +#define HT16K33_OSCILATOR_ON 0x21 // System Setup Register 0x20 + 0x01 +#define HT16K33_CMD_BRIGHTNESS 0xE0 // Dimming set (Datasheet says EF, but this is just with the set bits D12-D8 for full brightness +#define HT16K33_BLINK_CMD 0x80 // Display Setup - blink and on/off +#define HT16K33_BLINK_DISPLAYON 0x01 +#define HT16K33_BLINK_OFF 0 +#define HT16K33_BLINK_2HZ 1 +#define HT16K33_BLINK_1HZ 2 +#define HT16K33_BLINK_HALFHZ 3 +//#define HT16K33_KEYDATA 0x40 // Key data Adress pointer - unused +//#define HT16K33_INTFLAG 0x60 // INT flag Adress pointer - unused +//#define HT16K33_ROWINT 0xA0 // ROW/INT set - unused +//#define HT16K33_TESTMODE 0xD9 // Testmode - unused + +// Error Codes +#define HT16K33_ERR_ADDR _BV(2) // chip not responding at adress 0b00000100 = 4 +//#define HT16K33_ERR_CHIP _BV(3) // chip signature or a specific register doesn't fit + +/* ******************************************************************* + Classes + * ******************************************************************/ + +/** \brief Base class for all HT16K33 displays + + This is an (abstract) class used as base for all implementations + It holds all common variables and member functions. + If you create your instance (your object), don't use this base class but one of implementations + \see Noiasca_ht16k33_hw_7 + \see Noiasca_ht16k33_hw_7_4_c + \see Noiasca_ht16k33_hw_14 + \see Noiasca_ht16k33_hw_14_4 + \see Noiasca_ht16k33_hw_14_ext +*/ + class Noiasca_ht16k33 : public Print{ // Base class for all HT16K33 displays + public: + Noiasca_ht16k33(void); + /** + \brief initialise hardware + + Put this method in your setup + \param i2c_addr the I2C address of the display + \param numDevices the number of used devices + \returns 0 on success + */ + uint8_t begin(uint8_t i2c_addr, uint8_t numDevices = 1); + + /** + \brief set the blink rate of the display + */ + void blinkRate(uint8_t b); + + /** + \brief Clear the display and place cursor to 0 + + Clears the display and sets the cursor to 0. + */ + void clear(void); + + /** + \brief Turn the display off + */ + void off(void); + + /** + \brief Turn the display on + */ + void on(void); + + /** + \brief check if all ICs are responding + \return true if all ICs are responding + */ + bool isConnected(void); + + /** + \brief set the brightness of the display + \param b new brightness from 0..15 + */ + void setBrightness(uint8_t b); + + /** + \brief set the cursor for the next writing position + \param newPosition the new position for the cursor + */ + void setCursor(uint8_t newPosition); + + /** + \brief set the number of digits per device + \param newDigits modify the used digits + */ + void setDigits(uint8_t newDigits); + + /** + \brief write to I2C + + I2C lowLevel write of a bitmask to the IC to a specific position + \param position digit to be written to + \param bitmask the bits/segments to be activated as bitmask + */ + void writeLowLevel(uint8_t position, uint16_t bitmask); + //size_t write(uint8_t); // write method is depending on the HW and therefore in the first HW child classes + //using Print::write; +#ifdef HT16K33_BUFFERSIZE + void writeChar(uint8_t device, uint16_t digit); // I2C Ausgabe eines Zeichen aus Displaybuffer +#endif + + virtual uint16_t getCharacterBitmap(uint8_t value); + + + // not supported LCD API 1.0 functions + // =================================== + // these function are defined in the LCD API 1.0 API, + // but as this is not a LCD library, these functions are marked as deprecated + // note: only very new versions of gcc support setting warning message + // it breaks on on older versions that shipped with older 1.x IDEs + // so test for gcc 4.5 or greater for better deprecated messages + +#if ( __GNUC__ >= 4) && (__GNUC_MINOR__ >= 5) + inline void __attribute__((deprecated("Use clear() instead"))) + home() {clear();} + inline void __attribute__((deprecated("Use begin() instead"))) + init(uint8_t i2c_addr, uint8_t numDevices = 1) {begin(i2c_addr, numDevices);} +#else + inline void __attribute__((deprecated)) + home() {clear();} + inline void __attribute__((deprecated)) + init(uint8_t i2c_addr, uint8_t numDevices = 1) {begin(i2c_addr, numDevices);} +#endif + + protected: + uint8_t _numDigits = 8; // digits per device + uint8_t _i2c_addr; // base adress of first device (0) + uint8_t _numDevices; // total number of devices +#ifdef HT16K33_BUFFERSIZE + uint16_t displaybuffer[HT16K33_BUFFERSIZE]; // stores printed bitmaps + uint8_t _currentBufferPosition; // current read position in buffer +#endif + uint8_t _currentPosition; // current position of cursor + uint8_t _lastPosition; // last position of cursor +}; + +/** \brief class for HT16K33 displays with 7 segment LEDs + + This is for displays with 7 segment LEDs +*/ +class Noiasca_ht16k33_hw_7 : public Noiasca_ht16k33 { // 7 segment display + public: + Noiasca_ht16k33_hw_7(); + /** + activates/deactivtes a separate colon digit + \param activate set to 1 if you want to display the colon + */ + void setColonDigit(uint8_t activate = 1); + size_t write(uint8_t); // write using a byte char table + using Print::write; + uint16_t getCharacterBitmap(uint8_t value); + // using Noiasca_ht16k33::getCharacterBitmap; + protected: + uint8_t _hasColonDigit; // is set to 1 if display has a separate colon digit at digit 2 (the third column). Is on this level to have one common .write() method + uint8_t _lastBitmap; // last written bitmap (if we have to reprint for the decimal point) +}; + +/** \brief class for HT16K33 displays with 7 segment LEDs + + This is for displays with 7 segment LEDs, 4 digits and a colon. + For example Adafruit 0.56" 4-Digit 7-Segment Display w/I2C Backpack +*/ +class Noiasca_ht16k33_hw_7_4_c : public Noiasca_ht16k33_hw_7 { // 7 Segment Display with 4 visible Digits and Colon Sign. In fact this display has 5 colons + public: + Noiasca_ht16k33_hw_7_4_c(); + /** + activate the colon digit + \param device the device you want to control the colon + \param colon TRUE will switch on, FALSE will switch off the colon + */ + void showColon(uint8_t device, bool colon); // switch on / off colon for one specific device + void showColon(bool colon); // switch on / off colon for all devices +}; + +/** \brief class for HT16K33 displays with 14 segment LEDs + + This is for displays with up to eight 14 segment LEDs + For example the "HT16K33 AlphaNumeric 0.54" 8-Digit 14 Segment LED I2C Interface" displays from WtihK +*/ +class Noiasca_ht16k33_hw_14 : public Noiasca_ht16k33 { // 14 Segment Display + public: + Noiasca_ht16k33_hw_14(); + size_t write(uint8_t); // write using a word char table (14bit char table) + using Print::write; + uint16_t getCharacterBitmap(uint8_t value); + // using Noiasca_ht16k33::getCharacterBitmap; + protected: + uint16_t _lastBitmap; // last written bitmap (if we have to reprint for the decimal point) +}; + +/** \brief class for HT16K33 displays with 14 segment LEDs + + This is for displays with four 14 segment LEDs + For example the Adafruit Quad Alphanumeric Display - 0.54" Digits w/ I2C Backpack +*/ +class Noiasca_ht16k33_hw_14_4 : public Noiasca_ht16k33_hw_14 { // 14 Segment Display with 4 digits only + public: + Noiasca_ht16k33_hw_14_4(); +}; + +/** \brief class for HT16K33 displays with 14 segment LEDs + + This is for displays with up to eight 14 segment LEDs. + This class can be used to scroll the text in the display. +*/ +class Noiasca_ht16k33_hw_14_ext : public Noiasca_ht16k33_hw_14 { + public: + Noiasca_ht16k33_hw_14_ext(); +/** \brief scroll the text + + The tick/run/do method for scrolling text. + Call this function in your loop(). +*/ + uint32_t scroll(); + +/** \brief set scroll interval + + Set the speed of the scroll effect. + \param newInterval speed in milliseconds +*/ + void setScrollInterval(uint16_t newInterval); + +/** \brief set wait time between scrolling + + sets the wait/timeout after all letters are scrolled to the display + \param newWait the new wait time in milliseconds +*/ + void setScrollWait(uint16_t newWait); + +/** \brief set a scrolltext + + sets the new scrolltext to be displayed and scrolled + \param *newText the new text (or number) +*/ + void setScrolltext(const char *newText); + void setScrolltext(int32_t myNumber); + void setScrolltext(double myNumber); // sets a new scrolltext - a float + + private: + uint16_t interval = 400; // shift interval + uint16_t wait = 3000; // wait time after last letter + uint32_t previousMillis = 0; // stores last print out + uint8_t counter = 1; // used as start position + static const uint8_t scrollBufferSize = 65; // maximum size of scroll text + char myText[scrollBufferSize] = {'\0'}; // buffer for the scroll text + uint32_t rounds = 0; // how many scroll overs where already performed with the current scroll text +}; diff --git a/lib/NoiascaHt16k33/src/fonts/font14default.h b/lib/NoiascaHt16k33/src/fonts/font14default.h new file mode 100644 index 0000000000..9377b7fdf4 --- /dev/null +++ b/lib/NoiascaHt16k33/src/fonts/font14default.h @@ -0,0 +1,121 @@ +/* ******************************************************************* + HT16K33 Library - Fontfile + copyright (c) noiasca + + Version 2021-03-14 + + This is the default 14 segment font for library Version 1.1.0 from 2021-03-14 + + * ******************************************************************/ + +#pragma once +#define FONTFILE14 default // include that to each fontfile as additional identifier +#ifndef FONTFILE_WAS_INCLUDED +#define FONTFILE_WAS_INCLUDED +#endif +#define FONTFILE14_MAX_CHAR 130 // 129 + 1 + +/* ******************************************************************* + Characterset for 14 segment + * ******************************************************************/ + +const uint16_t charTable14 [] PROGMEM = { + 0, // 32 space + SEG14_B | SEG14_C | SEG14_DP, // ! 33 + SEG14_B | SEG14_L, // " 34 + SEG14_B | SEG14_C | SEG14_D | SEG14_G | SEG14_H | SEG14_L | SEG14_O, // # 35 + SEG14_A | SEG14_C | SEG14_D | SEG14_F | SEG14_G | SEG14_H | SEG14_L | SEG14_O, // $ 36 + SEG14_A | SEG14_B | SEG14_F | SEG14_G | SEG14_H, // % 37 + SEG14_A | SEG14_C | SEG14_D | SEG14_E | SEG14_G | SEG14_K| SEG14_L | SEG14_N, // & 38 still needs improvement + SEG14_L, // ' 39 + SEG14_M | SEG14_P, // ( 40 + SEG14_K | SEG14_N, // ) 41 + SEG14_G | SEG14_H | SEG14_K | SEG14_L | SEG14_M | SEG14_N | SEG14_O | SEG14_P, // * 42 updated + SEG14_G | SEG14_H | SEG14_O | SEG14_L, // + 43 + 0, // , 44 will be handled in the write methode + SEG14_G | SEG14_H, // - 45 updated + 0, // . 46 will be handled in the write methode + SEG14_M | SEG14_N, // / 47 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F, // 0 48 + SEG14_B | SEG14_C | SEG14_M, // 1 49 + SEG14_A | SEG14_B | SEG14_D | SEG14_E | SEG14_G | SEG14_H, // 2 50 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_H, // 3 51 + SEG14_B | SEG14_C | SEG14_F | SEG14_G | SEG14_H, // 4 52 + SEG14_A | SEG14_C | SEG14_D | SEG14_F | SEG14_G | SEG14_H, // 5 53 + SEG14_A | SEG14_C | SEG14_D | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // 6 54 + SEG14_A | SEG14_M | SEG14_N, // 7 55 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // 8 56 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_F | SEG14_G | SEG14_H, // 9 57 + 0, // : 58 will be handled in the write methode + 0, // ; 59 will be handled in the write methode + SEG14_M | SEG14_P, // < 60 + SEG14_D | SEG14_G | SEG14_H, // = 61 updated + SEG14_K | SEG14_N, // > 62 + SEG14_A | SEG14_B | SEG14_H | SEG14_O | SEG14_DP, // ? 63 + SEG14_D | SEG14_E | SEG14_G | SEG14_O | SEG14_N, // @ 64 + SEG14_A | SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // A 65 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_H | SEG14_L | SEG14_O, // B 66 + SEG14_A | SEG14_D | SEG14_E | SEG14_F, // C 67 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_L | SEG14_O, // D 68 + SEG14_A | SEG14_D | SEG14_E | SEG14_F | SEG14_G, // E 69 + SEG14_A | SEG14_E | SEG14_F | SEG14_G, // F 70 + SEG14_A | SEG14_C | SEG14_D | SEG14_E | SEG14_F | SEG14_H, // G 71 + SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // H 72 + SEG14_A | SEG14_D | SEG14_L | SEG14_O, // I 73 + SEG14_B | SEG14_C | SEG14_D | SEG14_E, // J 74 + SEG14_E | SEG14_F | SEG14_G | SEG14_M | SEG14_P, // K 75 + SEG14_D | SEG14_E | SEG14_F, // L 76 + SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_K | SEG14_M, // M 77 + SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_K | SEG14_P, // N 78 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F, // O 79 + SEG14_A | SEG14_B | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // P 80 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F | SEG14_P, // Q 81 + SEG14_A | SEG14_B | SEG14_E | SEG14_F | SEG14_G | SEG14_H | SEG14_P, // R 82 + SEG14_A | SEG14_C | SEG14_D | SEG14_H | SEG14_K, // S 83 + SEG14_A | SEG14_L | SEG14_O, // T 84 + SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F, // U 85 + SEG14_E | SEG14_F | SEG14_M | SEG14_N, // V 86 + SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_N | SEG14_P, // W 87 + SEG14_K | SEG14_M | SEG14_N | SEG14_P, // X 88 + SEG14_B | SEG14_F | SEG14_G | SEG14_H | SEG14_O, // Y 89 + SEG14_A | SEG14_D | SEG14_M | SEG14_N, // Z 90 + SEG14_A | SEG14_D | SEG14_E | SEG14_F, // [ 91 + SEG14_K | SEG14_P, /* \ 92 backslash*/ + SEG14_A | SEG14_B | SEG14_C | SEG14_D, // ] 93 + SEG14_F | SEG14_K, // ^ 94 + SEG14_D, // _ 95 underscore + SEG14_K, // ` 96 + SEG14_D | SEG14_E | SEG14_G | SEG14_O, // a 97 + SEG14_D | SEG14_E | SEG14_F | SEG14_G | SEG14_P, // b + SEG14_D | SEG14_E | SEG14_G | SEG14_H, // c + SEG14_B | SEG14_C | SEG14_D | SEG14_H | SEG14_N, // d + SEG14_D | SEG14_E | SEG14_G | SEG14_N, // e + SEG14_G | SEG14_H | SEG14_M | SEG14_O, // f updated + SEG14_B | SEG14_C | SEG14_D | SEG14_H | SEG14_M, // g + SEG14_E | SEG14_F | SEG14_G | SEG14_O, // h + SEG14_O, // i + SEG14_B | SEG14_C | SEG14_D, // j + SEG14_L | SEG14_M | SEG14_O | SEG14_P, // k + SEG14_L | SEG14_O, // l + SEG14_C | SEG14_E | SEG14_G | SEG14_H | SEG14_O, // m + SEG14_E | SEG14_G | SEG14_O, // n + SEG14_C | SEG14_D | SEG14_E | SEG14_G | SEG14_H, // o + SEG14_A | SEG14_E | SEG14_F | SEG14_G | SEG14_M, // p + SEG14_A | SEG14_B | SEG14_C | SEG14_H | SEG14_K, // q + SEG14_E | SEG14_G, // r + SEG14_D | SEG14_H | SEG14_P, // s + SEG14_D | SEG14_E | SEG14_F | SEG14_G, // t + SEG14_C | SEG14_D | SEG14_E, // u + SEG14_E | SEG14_N, // v + SEG14_C | SEG14_E | SEG14_N | SEG14_P, // w + SEG14_K | SEG14_M | SEG14_N | SEG14_P, // x + SEG14_B | SEG14_C | SEG14_D | SEG14_H | SEG14_L, // y updated + SEG14_D | SEG14_G | SEG14_N, // z 122 + SEG14_A | SEG14_D | SEG14_G | SEG14_N | SEG14_K, // { 123 + SEG14_B | SEG14_C, // | 124 + SEG14_A | SEG14_D | SEG14_H | SEG14_P | SEG14_M, // } 125 + SEG14_G, // ~ 126 + SEG14_P | SEG14_O | SEG14_N | SEG14_M | SEG14_L | SEG14_K | SEG14_H | SEG14_G | SEG14_F | SEG14_E | SEG14_D | SEG14_C | SEG14_B | SEG14_A | SEG14_DP, // 127 all Segments (32767) + SEG14_A | SEG14_D | SEG14_N | SEG14_H | SEG14_K, // € 128 Euro (2441) added for ESPEasy + SEG14_A | SEG14_B | SEG14_H | SEG14_G | SEG14_F // ° 129 degree added (227) for ESPEasy () +}; diff --git a/lib/NoiascaHt16k33/src/fonts/font14legacy.h b/lib/NoiascaHt16k33/src/fonts/font14legacy.h new file mode 100644 index 0000000000..d2504a555f --- /dev/null +++ b/lib/NoiascaHt16k33/src/fonts/font14legacy.h @@ -0,0 +1,121 @@ +/* ******************************************************************* + HT16K33 Library - Fontfile + copyright (c) noiasca + + Version 2021-03-14 + + This is the original 14 segment font as of library Version 1.0.2 from 2020-06-07 + + * ******************************************************************/ + +#pragma once +#define FONTFILE14 legacy // include that to each fontfile as additional identifier +#ifndef FONTFILE_WAS_INCLUDED +#define FONTFILE_WAS_INCLUDED +#endif + +/* ******************************************************************* + Characterset for 14 segment + * ******************************************************************/ + +const uint16_t charTable14 [] PROGMEM = { + 0, // 32 space + SEG14_B | SEG14_C | SEG14_DP, // ! 33 + SEG14_B | SEG14_L, // " 34 + 0, // # 35 + SEG14_A | SEG14_C | SEG14_D | SEG14_F | SEG14_G, // $ 36 + SEG14_A | SEG14_B | SEG14_F | SEG14_G | SEG14_H, // % 37 + 0, // & 38 + SEG14_L, // ' 39 + SEG14_M | SEG14_P, // ( 40 + SEG14_K | SEG14_N, // ) 41 + SEG14_G | SEG14_H | SEG14_M | SEG14_P | SEG14_N | SEG14_K, // * 42 + SEG14_G | SEG14_H | SEG14_O | SEG14_L, // + 43 + 0, // , 44 will be handled in the write methode + SEG14_H, // - 45 + 0, // . 46 will be handled in the write methode + SEG14_M | SEG14_N, // / 47 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F, // 0 48 + SEG14_B | SEG14_C | SEG14_M, // 1 49 + SEG14_A | SEG14_B | SEG14_D | SEG14_E | SEG14_G | SEG14_H, // 2 50 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_H, // 3 51 + SEG14_B | SEG14_C | SEG14_F | SEG14_G | SEG14_H, // 4 52 + SEG14_A | SEG14_C | SEG14_D | SEG14_F | SEG14_G | SEG14_H, // 5 53 + SEG14_A | SEG14_C | SEG14_D | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // 6 54 + SEG14_A | SEG14_M | SEG14_N, // 7 55 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // 8 56 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_F | SEG14_G | SEG14_H, // 9 57 + 0, // : 58 will be handled in the write methode + 0, // ; 59 will be handled in the write methode + SEG14_M | SEG14_P, // < 60 + SEG14_G | SEG14_H, // = 61 + SEG14_K | SEG14_N, // > 62 + SEG14_A | SEG14_B | SEG14_H | SEG14_O | SEG14_DP, // ? 63 + SEG14_D | SEG14_E | SEG14_G | SEG14_O | SEG14_N, // @ 64 + SEG14_A | SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // A 65 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_H | SEG14_L | SEG14_O, // B + SEG14_A | SEG14_D | SEG14_E | SEG14_F, // C + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_L | SEG14_O, // D + SEG14_A | SEG14_D | SEG14_E | SEG14_F | SEG14_G, // E + SEG14_A | SEG14_E | SEG14_F | SEG14_G, // F + SEG14_A | SEG14_C | SEG14_D | SEG14_E | SEG14_F | SEG14_H, // G + SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // H + SEG14_A | SEG14_D | SEG14_L | SEG14_O, // I + SEG14_B | SEG14_C | SEG14_D | SEG14_E, // J + SEG14_E | SEG14_F | SEG14_G | SEG14_M | SEG14_P, // K + SEG14_D | SEG14_E | SEG14_F, // L + SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_K | SEG14_M, // M + SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_K | SEG14_P, // N + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F, // O + SEG14_A | SEG14_B | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // P + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F | SEG14_P, // Q + SEG14_A | SEG14_B | SEG14_E | SEG14_F | SEG14_G | SEG14_H | SEG14_P, // R + SEG14_A | SEG14_C | SEG14_D | SEG14_H | SEG14_K, // S + SEG14_A | SEG14_L | SEG14_O, // T + SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F, // U + SEG14_E | SEG14_F | SEG14_M | SEG14_N, // V + SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_N | SEG14_P, // W + SEG14_K | SEG14_M | SEG14_N | SEG14_P, // X + SEG14_B | SEG14_F | SEG14_G | SEG14_H | SEG14_O, // Y + SEG14_A | SEG14_D | SEG14_M | SEG14_N, // Z 90 + SEG14_A | SEG14_D | SEG14_E | SEG14_F, // [ 91 + SEG14_K | SEG14_P, /* \ 92 backslash*/ + SEG14_A | SEG14_B | SEG14_C | SEG14_D, // ] 93 + SEG14_F | SEG14_K, // ^ 94 + SEG14_D, // _ 95 underscore + SEG14_K, // ` 96 + SEG14_D | SEG14_E | SEG14_G | SEG14_O, // a 97 + SEG14_D | SEG14_E | SEG14_F | SEG14_G | SEG14_P, // b + SEG14_D | SEG14_E | SEG14_G | SEG14_H, // c + SEG14_B | SEG14_C | SEG14_D | SEG14_H | SEG14_N, // d + SEG14_D | SEG14_E | SEG14_G | SEG14_N, // e + SEG14_A | SEG14_E | SEG14_F | SEG14_G, // f + SEG14_B | SEG14_C | SEG14_D | SEG14_H | SEG14_M, // g + SEG14_E | SEG14_F | SEG14_G | SEG14_O, // h + SEG14_O, // i + SEG14_B | SEG14_C | SEG14_D, // j + SEG14_L | SEG14_M | SEG14_O | SEG14_P, // k + SEG14_L | SEG14_O, // l + SEG14_C | SEG14_E | SEG14_G | SEG14_H | SEG14_O, // m + SEG14_E | SEG14_G | SEG14_O, // n + SEG14_C | SEG14_D | SEG14_E | SEG14_G | SEG14_H, // o + SEG14_A | SEG14_E | SEG14_F | SEG14_G | SEG14_M, // p + SEG14_A | SEG14_B | SEG14_C | SEG14_H | SEG14_K, // q + SEG14_E | SEG14_G, // r + SEG14_D | SEG14_H | SEG14_P, // s + SEG14_D | SEG14_E | SEG14_F | SEG14_G, // t + SEG14_C | SEG14_D | SEG14_E, // u + SEG14_E | SEG14_N, // v + SEG14_C | SEG14_E | SEG14_N | SEG14_P, // w + SEG14_K | SEG14_M | SEG14_N | SEG14_P, // x + SEG14_B | SEG14_C | SEG14_D | SEG14_H | SEG14_L, // y Y + SEG14_D | SEG14_G | SEG14_N, // z 122 + SEG14_A | SEG14_D | SEG14_G | SEG14_N | SEG14_K, // { 123 + SEG14_B | SEG14_C, // | 124 + SEG14_A | SEG14_D | SEG14_H | SEG14_P | SEG14_M, // } 125 + SEG14_G, // ~ 126 + SEG14_P | SEG14_O | SEG14_N | SEG14_M | SEG14_L | SEG14_K | SEG14_H | SEG14_G | SEG14_F | SEG14_E | SEG14_D | SEG14_C | SEG14_B | SEG14_A | SEG14_DP// 127 all Segments +}; + + + \ No newline at end of file diff --git a/lib/NoiascaHt16k33/src/fonts/font14netherlands.h b/lib/NoiascaHt16k33/src/fonts/font14netherlands.h new file mode 100644 index 0000000000..bb8270e30f --- /dev/null +++ b/lib/NoiascaHt16k33/src/fonts/font14netherlands.h @@ -0,0 +1,118 @@ +/* ******************************************************************* + HT16K33 Library - Fontfile + copyright (c) noiasca + + Version 2021-03-14 + + This 14 segment font is based on ideas of Jereone/Netherlands + + * ******************************************************************/ + +#pragma once +#define FONTFILE14 netherlands // include that to each fontfile as additional identifier +#ifndef FONTFILE_WAS_INCLUDED +#define FONTFILE_WAS_INCLUDED +#endif + +/* ******************************************************************* + Characterset for 14 segment + * ******************************************************************/ + +const uint16_t charTable14 [] PROGMEM = { + 0, // 32 space + SEG14_B | SEG14_C | SEG14_DP, // ! 33 + SEG14_B | SEG14_L, // " 34 + SEG14_B | SEG14_C | SEG14_D | SEG14_G | SEG14_H | SEG14_L | SEG14_O, // # 35 + SEG14_A | SEG14_C | SEG14_D | SEG14_F | SEG14_G | SEG14_H | SEG14_L | SEG14_O, // $ 36 + SEG14_C | SEG14_F | SEG14_G | SEG14_H | SEG14_H | SEG14_K | SEG14_M | SEG14_N | SEG14_P, // % 37 + SEG14_A | SEG14_C | SEG14_D | SEG14_E | SEG14_G | SEG14_K| SEG14_L | SEG14_N, // & 38 + SEG14_L, // ' 39 + SEG14_M | SEG14_P, // ( 40 + SEG14_K | SEG14_N, // ) 41 + SEG14_G | SEG14_H | SEG14_K | SEG14_L | SEG14_M | SEG14_N | SEG14_O | SEG14_P, // * 42 + SEG14_G | SEG14_H | SEG14_O | SEG14_L, // + 43 + 0, // , 44 will be handled in the write methode + SEG14_G | SEG14_H, // - 45 + 0, // . 46 will be handled in the write methode + SEG14_M | SEG14_N, // / 47 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F | SEG14_M | SEG14_N, // 0 48 + SEG14_B | SEG14_C | SEG14_M, // 1 49 + SEG14_A | SEG14_B | SEG14_D | SEG14_E | SEG14_G | SEG14_H, // 2 50 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_H, // 3 51 + SEG14_B | SEG14_C | SEG14_F | SEG14_G | SEG14_H, // 4 52 + SEG14_A | SEG14_C | SEG14_D | SEG14_F | SEG14_G | SEG14_H, // 5 53 + SEG14_A | SEG14_C | SEG14_D | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // 6 54 + SEG14_A | SEG14_M | SEG14_N, // 7 55 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // 8 56 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_F | SEG14_G | SEG14_H, // 9 57 + 0, // : 58 will be handled in the write methode + 0, // ; 59 will be handled in the write methode + SEG14_M | SEG14_P, // < 60 + SEG14_D | SEG14_G | SEG14_H, // = 61 + SEG14_K | SEG14_N, // > 62 + SEG14_A | SEG14_B | SEG14_H | SEG14_O | SEG14_DP, // ? 63 + SEG14_A | SEG14_B | SEG14_D | SEG14_E | SEG14_F| SEG14_H | SEG14_L, // @ 64 + SEG14_A | SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // A 65 + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_H | SEG14_L | SEG14_O, // B + SEG14_A | SEG14_D | SEG14_E | SEG14_F, // C + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_L | SEG14_O, // D + SEG14_A | SEG14_D | SEG14_E | SEG14_F | SEG14_G, // E + SEG14_A | SEG14_E | SEG14_F | SEG14_G, // F + SEG14_A | SEG14_C | SEG14_D | SEG14_E | SEG14_F | SEG14_H, // G + SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // H + SEG14_A | SEG14_D | SEG14_L | SEG14_O, // I + SEG14_B | SEG14_C | SEG14_D | SEG14_E, // J + SEG14_E | SEG14_F | SEG14_G | SEG14_M | SEG14_P, // K + SEG14_D | SEG14_E | SEG14_F, // L + SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_K | SEG14_M, // M + SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_K | SEG14_P, // N + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F, // O + SEG14_A | SEG14_B | SEG14_E | SEG14_F | SEG14_G | SEG14_H, // P + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F | SEG14_P, // Q + SEG14_A | SEG14_B | SEG14_E | SEG14_F | SEG14_G | SEG14_H | SEG14_P, // R + SEG14_A | SEG14_C | SEG14_D | SEG14_H | SEG14_K, // S + SEG14_A | SEG14_L | SEG14_O, // T + SEG14_B | SEG14_C | SEG14_D | SEG14_E | SEG14_F, // U + SEG14_E | SEG14_F | SEG14_M | SEG14_N, // V + SEG14_B | SEG14_C | SEG14_E | SEG14_F | SEG14_N | SEG14_P, // W + SEG14_K | SEG14_M | SEG14_N | SEG14_P, // X + SEG14_B | SEG14_F | SEG14_G | SEG14_H | SEG14_O, // Y + SEG14_A | SEG14_D | SEG14_M | SEG14_N, // Z 90 + SEG14_A | SEG14_D | SEG14_E | SEG14_F, // [ 91 + SEG14_K | SEG14_P, /* \ 92 backslash*/ + SEG14_A | SEG14_B | SEG14_C | SEG14_D, // ] 93 + SEG14_F | SEG14_K, // ^ 94 + SEG14_D, // _ 95 underscore + SEG14_K, // ` 96 + SEG14_D | SEG14_E | SEG14_G | SEG14_O, // a 97 + SEG14_D | SEG14_E | SEG14_F | SEG14_G | SEG14_P, // b + SEG14_D | SEG14_E | SEG14_G | SEG14_H, // c + SEG14_B | SEG14_C | SEG14_D | SEG14_H | SEG14_N, // d + SEG14_D | SEG14_E | SEG14_G | SEG14_N, // e + SEG14_G | SEG14_H | SEG14_M | SEG14_O, // f + SEG14_A | SEG14_B | SEG14_C | SEG14_D | SEG14_H | SEG14_K, // g + SEG14_E | SEG14_F | SEG14_G | SEG14_O, // h + SEG14_O, // i + SEG14_B | SEG14_C | SEG14_D, // j + SEG14_L | SEG14_M | SEG14_O | SEG14_P, // k + SEG14_L | SEG14_O, // l + SEG14_C | SEG14_E | SEG14_G | SEG14_H | SEG14_O, // m + SEG14_E | SEG14_G | SEG14_O, // n + SEG14_C | SEG14_D | SEG14_E | SEG14_G | SEG14_H, // o + SEG14_A | SEG14_E | SEG14_F | SEG14_G | SEG14_M, // p + SEG14_A | SEG14_B | SEG14_C | SEG14_H | SEG14_K, // q + SEG14_E | SEG14_G, // r + SEG14_D | SEG14_H | SEG14_P, // s + SEG14_D | SEG14_E | SEG14_F | SEG14_G, // t + SEG14_C | SEG14_D | SEG14_E, // u + SEG14_E | SEG14_N, // v + SEG14_C | SEG14_E | SEG14_N | SEG14_P, // w + SEG14_K | SEG14_M | SEG14_N | SEG14_P, // x + SEG14_K | SEG14_M | SEG14_O, // y + SEG14_D | SEG14_G | SEG14_N, // z 122 + SEG14_A | SEG14_D | SEG14_G | SEG14_N | SEG14_K, // { 123 + SEG14_B | SEG14_C, // | 124 + SEG14_A | SEG14_D | SEG14_H | SEG14_P | SEG14_M, // } 125 + SEG14_G, // ~ 126 + SEG14_P | SEG14_O | SEG14_N | SEG14_M | SEG14_L | SEG14_K | SEG14_H | SEG14_G | SEG14_F | SEG14_E | SEG14_D | SEG14_C | SEG14_B | SEG14_A | SEG14_DP// 127 all Segments +}; \ No newline at end of file diff --git a/lib/NoiascaHt16k33/src/fonts/font7legacy.h b/lib/NoiascaHt16k33/src/fonts/font7legacy.h new file mode 100644 index 0000000000..7e707ad587 --- /dev/null +++ b/lib/NoiascaHt16k33/src/fonts/font7legacy.h @@ -0,0 +1,121 @@ +/* ******************************************************************* + HT16K33 Library - Fontfile + copyright (c) noiasca + + Version 2021-03-14 + + This is the original 7 segment font as of library version 1.0.2 from 2020-06-07 + + * ******************************************************************/ + +#pragma once +#define FONTFILE7 legacy // include that to each fontfile as additional identifier +#ifndef FONTFILE_WAS_INCLUDED +#define FONTFILE_WAS_INCLUDED +#endif +#define FONTFILE7_MAX_CHAR 130 // 129 + 1 + + /* ******************************************************************* + Characterset for 7 segment + * ******************************************************************/ + +const uint8_t charTable [] PROGMEM = { + 0, // 32 space + SEG_B | SEG_C | SEG_DP, // ! 33 + SEG_B | SEG_F, // " 34 + 0, // # 35 + SEG_A | SEG_C | SEG_D | SEG_F | SEG_G, // $ 36 + SEG_A | SEG_B | SEG_F | SEG_G, // % 37 + 0, // & 38 + SEG_B, // ' 39 + SEG_A | SEG_D | SEG_E | SEG_F, // ( 40 + SEG_A | SEG_B | SEG_C | SEG_D, // ) 41 + 0, // * 42 no character on 7segment + 0, // + 43 no character on 7segment + 0, // , 44 will be handled in the write methode + SEG_G, // - 45 + 0, // . 46 will be handled in the write methode + SEG_B | SEG_E | SEG_G , // / 47 + SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // 0 48 + SEG_B | SEG_C, // 1 49 + SEG_A | SEG_B | SEG_D | SEG_E | SEG_G, // 2 50 + SEG_A | SEG_B | SEG_C | SEG_D | SEG_G, // 3 51 + SEG_B | SEG_C | SEG_F | SEG_G, // 4 52 + SEG_A | SEG_C | SEG_D | SEG_F | SEG_G, // 5 53 + SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G, // 6 54 + SEG_A | SEG_B | SEG_C, // 7 55 + SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G, // 8 56 + SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G, // 9 57 + 0, // : 58 will be handled in the write methode + 0, // ; 59 will be handled in the write methode + SEG_D | SEG_E | SEG_G, // < 60 + SEG_G, // = 61 + SEG_C | SEG_D | SEG_G, // > 62 + SEG_A | SEG_B | SEG_E | SEG_G, // ? 63 + 0, // @ 64 + SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G, // A 65 + SEG_C | SEG_D | SEG_E | SEG_F | SEG_G, // B + SEG_A | SEG_D | SEG_E | SEG_F, // C + SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, // D + SEG_A | SEG_D | SEG_E | SEG_F | SEG_G, // E + SEG_A | SEG_E | SEG_F | SEG_G, // F + SEG_A | SEG_C | SEG_D | SEG_E | SEG_F, // G + SEG_B | SEG_C | SEG_E | SEG_F | SEG_G, // H + SEG_B | SEG_C, // I + SEG_B | SEG_C | SEG_D | SEG_E, // J + SEG_A | SEG_C | SEG_E | SEG_F | SEG_G, // K + SEG_D | SEG_E | SEG_F, // L + SEG_A | SEG_C | SEG_E, // M + SEG_C | SEG_E | SEG_G, // N + SEG_C | SEG_D | SEG_E | SEG_G, // O + SEG_A | SEG_B | SEG_E | SEG_F | SEG_G, // P + SEG_A | SEG_B | SEG_C | SEG_F | SEG_G, // Q + SEG_E | SEG_G, // R + SEG_A | SEG_C | SEG_D | SEG_F | SEG_G, // S + SEG_D | SEG_E | SEG_F | SEG_G, // T + SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // U + SEG_C | SEG_D | SEG_E, // V + SEG_B | SEG_D | SEG_F, // W + SEG_B | SEG_C | SEG_E | SEG_F | SEG_G, // X + SEG_B | SEG_C | SEG_D | SEG_F | SEG_G, // Y + SEG_A | SEG_B | SEG_D | SEG_E | SEG_G, // Z 90 + SEG_A | SEG_D | SEG_E | SEG_F, // [ 91 + SEG_C | SEG_F | SEG_G, /* \ 92 backslash*/ + SEG_A | SEG_B | SEG_C | SEG_D, // ] 93 + SEG_A, // ^ 94 + SEG_D, // _ 95 underscore + SEG_B, // ` 96 + SEG_C | SEG_D | SEG_E | SEG_G | SEG_DP, // a 97 + SEG_C | SEG_D | SEG_E | SEG_F | SEG_G, // b 98 + SEG_D | SEG_E | SEG_G, // c 99 + SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, // d 100 + SEG_A | SEG_D | SEG_E | SEG_F | SEG_G, // e 101 + SEG_A | SEG_E | SEG_F | SEG_G, // f 102 + SEG_A | SEG_C | SEG_D | SEG_E | SEG_F, // g G 103 capital letter will be used + SEG_B | SEG_C | SEG_E | SEG_F | SEG_G, // h 104 + SEG_C, // i 105 + SEG_C | SEG_D, // j 106 + SEG_A | SEG_C | SEG_E | SEG_F | SEG_G, // k 107 + SEG_E | SEG_F, // l 108 + SEG_A | SEG_C | SEG_E, // m n 109 n will be used + SEG_C | SEG_E | SEG_G, // n 110 + SEG_C | SEG_D | SEG_E | SEG_G, // o 111 + SEG_A | SEG_B | SEG_E | SEG_F | SEG_G, // p P 112 + SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_DP, // q Q 113 + SEG_E | SEG_G, // r 114 + SEG_A | SEG_C | SEG_D | SEG_F | SEG_G, // s S 115 + SEG_D | SEG_E | SEG_F | SEG_G, // t 116 + SEG_C | SEG_D | SEG_E, // u 117 + SEG_C | SEG_D | SEG_E, // v u 118 u will be used + SEG_C | SEG_D | SEG_E, // w u 119 u will be used + SEG_B | SEG_C | SEG_E | SEG_F | SEG_G, // x 120 + SEG_B | SEG_C | SEG_D | SEG_F | SEG_G, // y Y 121 + SEG_A | SEG_B | SEG_D | SEG_E | SEG_G, // z Z 122 + SEG_A | SEG_D | SEG_E | SEG_F, // { 123 + SEG_B | SEG_C, // | 124 + SEG_A | SEG_B | SEG_C | SEG_D, // } 125 + SEG_G, // ~ 126 + SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G | SEG_DP, // 127 all segments (255) + SEG_A | SEG_D | SEG_E | SEG_F | SEG_G, // € 128 Euro (121) added for ESPEasy + SEG_A | SEG_B | SEG_G | SEG_F // ° 129 degree (99) added for ESPEasy +}; \ No newline at end of file diff --git a/lib/NoiascaHt16k33/src/zInfo.ino b/lib/NoiascaHt16k33/src/zInfo.ino new file mode 100644 index 0000000000..a8b39e8dbc --- /dev/null +++ b/lib/NoiascaHt16k33/src/zInfo.ino @@ -0,0 +1,38 @@ +/* + + 14 Segment + + A + F K L M B + G H + E N O P C + D + + + 7 Segment + A + F B + G + E C + D + + + +print --> write(einzelnes Zeichen) --> writeLowLevel(wohin, bitmask) + + +open tasks + - a method to write a character to a specific position + - replace writeLowLevel with a public version (including usage of _lastcharacter & displaybuffer) + - type_t of displaybuffer and _lastcharacter one or two bytes as needed + + + +Noiasca_ht16k33 base class - not useable + Noiasca_ht16k33_hw_7 7 segments 8 digits + Noiasca_ht16k33_hw_7_4_c 7 segments 4 digits, colon + Noiasca_ht16k33_hw_14 14 segments 8 digits + Noiasca_ht16k33_hw_14_4 14 segments 4 digits only + Noiasca_ht16k33_hw_14_ext 14 segments 8 digits, extended support for scroll text + + */ \ No newline at end of file diff --git a/src/_P157_14DGT.ino b/src/_P157_14DGT.ino new file mode 100644 index 0000000000..07034fb356 --- /dev/null +++ b/src/_P157_14DGT.ino @@ -0,0 +1,240 @@ +#include "_Plugin_Helper.h" +#ifdef USES_P157 + +// ####################################################################################################### +// ###################### Plugin 157 - 14-segment display plugin HT16K33 ###################### +// ####################################################################################################### +// +// Chips/displays supported: +// 0 - HT16K33 -- I2C - 4 digits, 1..8 displays (4..32 digits) with sequential I2C addresses +// 1 - HT16K33 -- I2C - 8 digits, 1..8 displays (4..64 digits) with sequential I2C addresses +// +// Plugin can be setup as: +// - Manual -- display is manually updated sending commands +// "7dn," (number can be negative or positive, even with decimal) +// "7dt," (temperature can be negative or positive and containing decimals) +// "7ddt,," (Dual temperatures on Max7219/74HC595 (8 digits) only, temperature can be negative or +// positive and containing decimals) +// "7dtext," (show free text - supported low ascii, period, comma, colon, semicolon are displayed as dot) +// "7dbin,[uint16_t],..." (show data binary formatted, bits clock-wise from left to right, dot, top, right 2x, bottom, +// left 2x, center), scroll-enabled +// +// Generic commands: +// - "7don" -- turn ON the display +// - "7doff" -- turn OFF the display +// - "7db,<0-15> -- set brightness to specific value between 0 and 15 +// + +/** History + * 2026-05-15 tonhuisman: Start plugin, based on P073 + */ + +# define PLUGIN_157 +# define PLUGIN_ID_157 157 +# define PLUGIN_NAME_157 "Display - HT16K33 14-segment" + +# include "src/PluginStructs/P157_data_struct.h" + +boolean Plugin_157(uint8_t function, struct EventStruct *event, String& string) { + boolean success = false; + + switch (function) + { + case PLUGIN_DEVICE_ADD: + { + auto& dev = Device[++deviceCount]; + dev.Number = PLUGIN_ID_157; + dev.Type = DEVICE_TYPE_I2C; + dev.VType = Sensor_VType::SENSOR_TYPE_NONE; + + break; + } + + case PLUGIN_GET_DEVICENAME: + { + string = F(PLUGIN_NAME_157); + break; + } + + case PLUGIN_SET_DEFAULTS: + { + # if P157_SCROLL_TEXT + P157_CFG_SCROLLSPEED = 10; // Default 10 * 0.1 sec scroll speed + # endif // if P157_SCROLL_TEXT + P157_CFG_DISPLAYS = 1; // Default number of displays + break; + } + + case PLUGIN_I2C_HAS_ADDRESS: + case PLUGIN_WEBFORM_SHOW_I2C_PARAMS: + { + const uint8_t i2cAddressValues[] = { 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77 }; + + if (function == PLUGIN_WEBFORM_SHOW_I2C_PARAMS) { + addFormSelectorI2C(F("i2c_addr"), 8, i2cAddressValues, P157_CFG_I2C_ADDRESS); + } else { + success = intArrayContains(8, i2cAddressValues, event->Par1); + } + break; + } + + # if FEATURE_I2C_GET_ADDRESS + case PLUGIN_I2C_GET_ADDRESS: + { + event->Par1 = P157_CFG_I2C_ADDRESS; + success = true; + break; + } + # endif // if FEATURE_I2C_GET_ADDRESS + + case PLUGIN_WEBFORM_LOAD: + { + { + const __FlashStringHelper *displtype[] = { + P157_DisplayModel(P157_MODEL_4DGT), + P157_DisplayModel(P157_MODEL_8DGT), + P157_DisplayModel(P157_MODEL_4DGT_7SEG), + P157_DisplayModel(P157_MODEL_8DGT_7SEG), + }; + const int displOption[] = { + P157_MODEL_4DGT, + P157_MODEL_8DGT, + P157_MODEL_4DGT_7SEG, + P157_MODEL_8DGT_7SEG, + }; + constexpr size_t optionCount = NR_ELEMENTS(displtype); + const FormSelectorOptions selector(optionCount, displtype, displOption); + selector.addFormSelector(F("Display Type"), F("displtype"), P157_CFG_DISPLAYTYPE); + } + + if (0 == P157_CFG_DISPLAYS) { + P157_CFG_DISPLAYS = 1; + } + addFormNumericBox(F("Nr. of displays"), F("dspls"), P157_CFG_DISPLAYS, 1, 8); + addUnit(F("1..8")); + addFormNote(F("Displays must have consecutive I2C addresses")); + + P157_display_output_selector(F("displout"), P157_CFG_OUTPUTTYPE); + + addFormNumericBox(F("Brightness"), F("brightness"), P157_CFG_BRIGHTNESS, 0, 15); + addUnit(F("0..15")); + + addFormSubHeader(F("Options")); + + // addFormCheckBox(F("Text show periods as dot"), F("periods"), bitRead(P157_CFG_FLAGS, P157_OPTION_PERIOD)); + + addFormCheckBox(F("Hide ° for Temperatures"), F("hide_degree"), bitRead(P157_CFG_FLAGS, P157_OPTION_HIDEDEGREE)); + # if P157_7DDT_COMMAND + addFormNote(F("Commands 7dt,<temp> and 7ddt,<temp1>,<temp2>")); + # else // if P157_7DDT_COMMAND + addFormNote(F("Command 7dt,<temp>")); + # endif // if P157_7DDT_COMMAND + # if P157_SUPPRESS_ZERO + addFormCheckBox(F("Suppress leading 0 on day/hour"), F("supp0"), bitRead(P157_CFG_FLAGS, P157_OPTION_SUPPRESS0)); + # endif // if P157_SUPPRESS_ZERO + + # if P157_SCROLL_TEXT + addFormCheckBox(F("Scroll text > display width"), F("scroll_text"), bitRead(P157_CFG_FLAGS, P157_OPTION_SCROLLTEXT)); + addFormCheckBox(F("Scroll text in from right"), F("scroll_full"), bitRead(P157_CFG_FLAGS, P157_OPTION_SCROLLFULL)); + + if (P157_CFG_SCROLLSPEED == 0) { P157_CFG_SCROLLSPEED = 10; } + addFormNumericBox(F("Scroll speed (0.1 sec/step)"), F("scrollspeed"), P157_CFG_SCROLLSPEED, 1, 600); + addUnit(F("1..600 = 0.1..60 sec/step")); + # endif // if P157_SCROLL_TEXT + + addFormCheckBox(F("Right-align Temperature (7dt)"), F("temp_rightalign"), bitRead(P157_CFG_FLAGS, P157_OPTION_RIGHTALIGN)); + + success = true; + break; + } + + case PLUGIN_WEBFORM_SAVE: + { + P157_CFG_I2C_ADDRESS = getFormItemInt(F("i2c_addr")); + P157_CFG_DISPLAYTYPE = getFormItemInt(F("displtype")); + P157_CFG_DISPLAYS = getFormItemInt(F("dspls")); + P157_CFG_OUTPUTTYPE = getFormItemInt(F("displout")); + P157_CFG_BRIGHTNESS = getFormItemInt(F("brightness")); + uint32_t lSettings = 0; + + // bitWrite(lSettings, P157_OPTION_PERIOD, isFormItemChecked(F("periods"))); + bitWrite(lSettings, P157_OPTION_HIDEDEGREE, isFormItemChecked(F("hide_degree"))); + bitWrite(lSettings, P157_OPTION_RIGHTALIGN, isFormItemChecked(F("temp_rightalign"))); + # if P157_SCROLL_TEXT + bitWrite(lSettings, P157_OPTION_SCROLLTEXT, isFormItemChecked(F("scroll_text"))); + bitWrite(lSettings, P157_OPTION_SCROLLFULL, isFormItemChecked(F("scroll_full"))); + P157_CFG_SCROLLSPEED = getFormItemInt(F("scrollspeed")); + # endif // if P157_SCROLL_TEXT + # if P157_SUPPRESS_ZERO + bitWrite(lSettings, P157_OPTION_SUPPRESS0, isFormItemChecked(F("supp0"))); + # endif // if P157_SUPPRESS_ZERO + P157_CFG_FLAGS = lSettings; + + success = true; + break; + } + + case PLUGIN_INIT: + { + if (0 == P157_CFG_DISPLAYS) { + P157_CFG_DISPLAYS = 1; + } + initPluginTaskData(event->TaskIndex, new (std::nothrow) P157_data_struct()); + P157_data_struct *P157_data = + static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr != P157_data) { + addLog(LOG_LEVEL_INFO, F("P157 : Calling init()")); + success = P157_data->init(event); + } + break; + } + + case PLUGIN_EXIT: + { + success = true; + break; + } + + case PLUGIN_WRITE: + { + P157_data_struct *P157_data = + static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr != P157_data) { + success = P157_data->plugin_write(event, string); + } + break; + } + + case PLUGIN_ONCE_A_SECOND: + { + P157_data_struct *P157_data = + static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr != P157_data) { + success = P157_data->plugin_once_a_second(event); + } + + break; + } + + # if P157_SCROLL_TEXT + case PLUGIN_TEN_PER_SECOND: + { + P157_data_struct *P157_data = + static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr != P157_data) { + success = P157_data->plugin_ten_per_second(event); + } + + break; + } + # endif // if P157_SCROLL_TEXT + + } + return success; +} + +#endif // ifdef USES_P157 diff --git a/src/src/CustomBuild/define_plugin_sets.h b/src/src/CustomBuild/define_plugin_sets.h index 0ddd3935bd..b1b008dc0e 100644 --- a/src/src/CustomBuild/define_plugin_sets.h +++ b/src/src/CustomBuild/define_plugin_sets.h @@ -2069,6 +2069,9 @@ To create/register a plugin, you have to : #if !defined(USES_P148) && defined(ESP32) #define USES_P148 // Sonoff POWR3xxD and THR3xxD display #endif + #if !defined(USES_P157) && defined(ESP32) + #define USES_P157 // Display - HT16K33 14 segment + #endif // #if !defined(USES_P165) && defined(ESP32) // #define USES_P165 // Display - NeoPixel (7-Segment) // #endif @@ -2180,6 +2183,9 @@ To create/register a plugin, you have to : #if !defined(USES_P148) && defined(ESP32) #define USES_P148 // Sonoff POWR3xxD and THR3xxD display #endif + #if !defined(USES_P157) && defined(ESP32) + #define USES_P157 // Display - HT16K33 14 segment + #endif // #if !defined(USES_P165) && defined(ESP32) // #define USES_P165 // Display - NeoPixel (7-Segment) // #endif @@ -2957,6 +2963,9 @@ To create/register a plugin, you have to : #ifndef USES_P154 #define USES_P154 // Environment - BMP3xx I2C #endif + #ifndef USES_P157 + #define USES_P157 // Display - HT16K33 14 segment + #endif #ifndef USES_P172 #define USES_P172 // Environment - BMP3xx SPI #endif diff --git a/src/src/PluginStructs/P157_data_struct.cpp b/src/src/PluginStructs/P157_data_struct.cpp new file mode 100644 index 0000000000..0bc29cba44 --- /dev/null +++ b/src/src/PluginStructs/P157_data_struct.cpp @@ -0,0 +1,1132 @@ +#include "../PluginStructs/P157_data_struct.h" + +#ifdef USES_P157 + +uint8_t P157_getDefaultDigits(uint8_t displayModel, + uint8_t displays) { + const uint8_t digitsSet[] = { 4, 8, 4, 8 }; // Fixed + uint8_t bufLen{}; + + if (displayModel < NR_ELEMENTS(digitsSet)) { + bufLen = digitsSet[displayModel]; + } + + return bufLen * displays; +} + +const __FlashStringHelper* P157_DisplayModel(uint8_t model) { + switch (model) + { + case P157_MODEL_4DGT: return F("HT16K33 - 4 digit"); + case P157_MODEL_8DGT: return F("HT16K33 - 8 digit"); + case P157_MODEL_4DGT_7SEG: return F("HT16K33 - 4 digit (7-segment)"); + case P157_MODEL_8DGT_7SEG: return F("HT16K33 - 8 digit (7-segment)"); + } + return F(""); +} + +void P157_display_output_selector(const __FlashStringHelper *id, int16_t value) { + const __FlashStringHelper *displout[] = { + F("Manual"), + F("Clock 24h - Blink"), + F("Clock 24h - No Blink"), + F("Clock 12h - Blink"), + F("Clock 12h - No Blink"), + F("Date"), + }; + const int disploutOptions[] = { + P157_DISP_MANUAL, + P157_DISP_CLOCK24BLNK, + P157_DISP_CLOCK24, + P157_DISP_CLOCK12BLNK, + P157_DISP_CLOCK12, + P157_DISP_DATE, + }; + const FormSelectorOptions selector(NR_ELEMENTS(disploutOptions), displout, disploutOptions); + + selector.addFormSelector(F("Display Output"), id, value); +} + +P157_data_struct::~P157_data_struct() { + if (nullptr != ht16k33) { + ht16k33->off(); + delete ht16k33; + ht16k33 = nullptr; + } +} + +bool P157_data_struct::init(struct EventStruct *event) +{ + clearBuffer(); + i2cAddress = P157_CFG_I2C_ADDRESS; + displayModel = P157_CFG_DISPLAYTYPE; + output = P157_CFG_OUTPUTTYPE; + brightness = P157_CFG_BRIGHTNESS; + periods = true; // bitRead(P157_CFG_FLAGS, P157_OPTION_PERIOD); + hideDegree = bitRead(P157_CFG_FLAGS, P157_OPTION_HIDEDEGREE); + # if P157_SCROLL_TEXT + txtScrolling = bitRead(P157_CFG_FLAGS, P157_OPTION_SCROLLTEXT); + scrollFull = bitRead(P157_CFG_FLAGS, P157_OPTION_SCROLLFULL); + setScrollSpeed(P157_CFG_SCROLLSPEED); + # endif // if P157_SCROLL_TEXT + rightAlignTempMAX7219 = bitRead(P157_CFG_FLAGS, P157_OPTION_RIGHTALIGN); + suppressLeading0 = bitRead(P157_CFG_FLAGS, P157_OPTION_SUPPRESS0); + timesep = true; + + // # if P157_EXTRA_FONTS + // fontset = P157_CFG_FONTSET; + // # endif // if P157_EXTRA_FONTS + displays = P157_CFG_DISPLAYS; + + if (0 == displays) { + displays = 1; + } + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, strformat(F("P157 : Model: %s, displays: %d"), FsP(P157_DisplayModel(displayModel)), displays)); + } + + if ((P157_MODEL_4DGT == displayModel) || (P157_MODEL_8DGT == displayModel)) { + ht16k33 = new (std::nothrow) Noiasca_ht16k33_hw_14(); // 14 segment + } else { + ht16k33 = new (std::nothrow) Noiasca_ht16k33_hw_7(); // 7 segment + } + + if (nullptr == ht16k33) { + return false; + } + + if (0 == ht16k33->begin(i2cAddress, displays)) { + if (ht16k33->isConnected()) // Happy flow + { + ht16k33->setDigits((P157_MODEL_4DGT == displayModel) || (P157_MODEL_4DGT_7SEG == displayModel) ? 4 : 8); + ht16k33->setBrightness(brightness); + ht16k33->on(); + return true; + } + } + return false; +} + +void P157_data_struct::fillBufferWithTime(bool sevendgt_now, + uint8_t sevendgt_hours, + uint8_t sevendgt_minutes, + uint8_t sevendgt_seconds, + bool flag12h, + bool suppressLeading0) { + clearBuffer(); + const int bufToFill = P157_getDefaultDigits(displayModel, displays); + + if (sevendgt_now) { + sevendgt_hours = node_time.hour(); + sevendgt_minutes = node_time.minute(); + sevendgt_seconds = node_time.second(); + } + + if (flag12h && (sevendgt_hours > 12)) { + sevendgt_hours -= 12; // if flag 12h is TRUE and h>12 adjust subtracting 12 + } + + if (flag12h && (sevendgt_hours == 0)) { + sevendgt_hours = 12; // if flag 12h is TRUE and h=0 adjust to h=12 + } + put4NumbersInBuffer(sevendgt_hours, sevendgt_minutes, bufToFill > 4 ? sevendgt_seconds : -1, -1 + # if P157_SUPPRESS_ZERO + , suppressLeading0 + # endif // if P157_SUPPRESS_ZERO + , timesep + ); +} + +void P157_data_struct::fillBufferWithDate(bool sevendgt_now, + uint8_t sevendgt_day, + uint8_t sevendgt_month, + int sevendgt_year, + bool suppressLeading0) { + clearBuffer(); + int sevendgt_year0 = sevendgt_year; + + if (sevendgt_now) { + sevendgt_day = node_time.day(); + sevendgt_month = node_time.month(); + sevendgt_year0 = node_time.year(); + } else if (sevendgt_year0 < 100) { + sevendgt_year0 += 2000; + } + const uint8_t sevendgt_year1 = static_cast(sevendgt_year0 / 100); + const uint8_t sevendgt_year2 = static_cast(sevendgt_year0 % 100); + + put4NumbersInBuffer(sevendgt_day, sevendgt_month, sevendgt_year1, sevendgt_year2 + # if P157_SUPPRESS_ZERO + , suppressLeading0 + # endif // if P157_SUPPRESS_ZERO + , false + ); +} + +void P157_data_struct::put4NumbersInBuffer(const uint8_t nr1, + const uint8_t nr2, + const int8_t nr3, + const int8_t nr4 + # if P157_SUPPRESS_ZERO + , const bool suppressLeading0 + # endif // if P157_SUPPRESS_ZERO + , const bool sep + ) { + uint8_t idx = 0; + + showbuffer[idx++] = 48 + static_cast(nr1 / 10); + + # if P157_SUPPRESS_ZERO + + if (suppressLeading0 && (showbuffer[idx - 1] == '0')) { showbuffer[idx - 1] = ' '; } // set to space + # endif // if P157_SUPPRESS_ZERO + + showbuffer[idx++] = 48 + (nr1 % 10); + + if (sep) { showbuffer[idx++] = ':'; } + + showbuffer[idx++] = 48 + static_cast(nr2 / 10); + showbuffer[idx++] = 48 + (nr2 % 10); + + if (nr3 > -1) { + if (sep) { showbuffer[idx++] = ':'; } + + showbuffer[idx++] = 48 + static_cast(nr3 / 10); + showbuffer[idx++] = 48 + (nr3 % 10); + + if (nr4 > -1) { + showbuffer[idx++] = 48 + static_cast(nr4 / 10); + showbuffer[idx++] = 48 + (nr4 % 10); + } + } +} + +void P157_data_struct::fillBufferWithNumber(const String& number) { + clearBuffer(); + + if (number.length() == 0) { + return; + } + int8_t P157_index = 7; + + dotpos = -1; // -1 means no dot to display + + for (int i = number.length() - 1; i >= 0 && P157_index >= 0; --i) { + const char P157_tmpchar = number.charAt(i); + + if (P157_tmpchar == '.') { // dot + dotpos = P157_index; + } else { + showbuffer[P157_index] = P157_tmpchar; + P157_index--; + } + } + + while (P157_index >= 0) { // Prefix with spaces + showbuffer[P157_index] = ' '; + P157_index--; + } +} + +void P157_data_struct::fillBufferWithTemp(int temperature) { + clearBuffer(); + char P157_digit[8]; + const bool between10and0 = ((temperature < 10) && (temperature >= 0)); // To have a zero prefix (0.x and -0.x) display between 0.9 + const bool between0andMinus10 = ((temperature < 0) && (temperature > -10)); // and -0.9 degrees,as all display types use 1 digit for + // temperatures between 10.0 and -10.0 + String format; + + if (hideDegree) { + format = (between10and0 ? F(" %02d") : (between0andMinus10 ? F(" %03d") : F("%8d"))); + } else { + format = (between10and0 ? F(" %02d") : (between0andMinus10 ? F(" %03d") : F("%7d"))); + } + sprintf_P(P157_digit, format.c_str(), temperature); + const size_t P157_numlenght = strlen(P157_digit); + + for (size_t i = 0; i < P157_numlenght; ++i) { + showbuffer[i] = P157_digit[i]; + } + + if (P157_numlenght > 2) { + showperiods[P157_numlenght - 2] = true; + } + + if (!hideDegree) { + showbuffer[7] = P157_CHAR_DEGREE; // degree "°" + } +} + +# if P157_7DDT_COMMAND + +/** + * fillBufferWithDualTemp() + * leftTemperature or rightTempareature < -100.0 then shows dashes + */ +void P157_data_struct::fillBufferWithDualTemp(int leftTemperature, + bool leftWithDecimal, + int rightTemperature, + bool rightWithDecimal) { + clearBuffer(); + char P157_digit[8]; + String format; + const bool leftBetween10and0 = (leftWithDecimal && (leftTemperature < 10) && (leftTemperature >= 0)); + + // To have a zero prefix (0.x and -0.x) display between 0.9 and -0.9 degrees, + // as all display types use 1 digit for temperatures between 10.0 and -10.0 + const bool leftBetween0andMinus10 = (leftWithDecimal && (leftTemperature < 0) && (leftTemperature > -10)); + + if (hideDegree) { + // Include a space for compensation of the degree symbol + format = + (leftBetween10and0 ? F(" %02d") : (leftBetween0andMinus10 ? F(" %03d") : leftTemperature < -1000 ? F("----") : F("%4d"))); + showperiods[2] = leftTemperature >= -1000; + } else { + // Include a space for compensation of the degree symbol + format = + (leftBetween10and0 ? F(" %02d ") : (leftBetween0andMinus10 ? F("%03d ") : leftTemperature < -100 ? F("----") : F("%3d "))); + showperiods[2] = leftTemperature >= -100; + } + bool rightBetween10and0 = (rightWithDecimal && (rightTemperature < 10) && (rightTemperature >= 0)); + + // To have a zero prefix (0.x and -0.x) display between 0.9 and -0.9 degrees, + // as all display types use 1 digit for temperatures between 10.0 and -10.0 + const bool rightBetween0andMinus10 = (rightWithDecimal && (rightTemperature < 0) && (rightTemperature > -10)); + + if (hideDegree) { + format += + (rightBetween10and0 ? F(" %02d") : (rightBetween0andMinus10 ? F(" %03d") : rightTemperature < -1000 ? F("----") : F("%4d"))); + showperiods[6] = rightTemperature >= -1000; + } else { + format += + (rightBetween10and0 ? F(" %02d") : (rightBetween0andMinus10 ? F("%03d") : rightTemperature < -100 ? F("----") : F("%3d"))); + showperiods[6] = rightTemperature >= -100; + } + sprintf_P(P157_digit, format.c_str(), leftTemperature, rightTemperature); + const size_t P157_numlenght = strlen(P157_digit); + + for (size_t i = 0; i < P157_numlenght; ++i) { + showbuffer[i] = P157_digit[i]; + } + + if (!hideDegree) { + if (leftTemperature > -100.0) { + showbuffer[3] = P157_CHAR_DEGREE; // degree "°" + } + + if (rightTemperature > -100.0) { + showbuffer[7] = P157_CHAR_DEGREE; // degree "°" + } + } + + // addLog(LOG_LEVEL_INFO, concat(F("7dgt format: "), format)); +} + +# endif // if P157_7DDT_COMMAND + +void P157_data_struct::fillBufferWithString(const String& textToShow, + bool useBinaryData) { + clearBuffer(); + const size_t bufToFill = P157_getDefaultDigits(displayModel, displays); + + String buf(textToShow); + + while (getEffectiveTextLength(buf) > bufToFill && !buf.isEmpty()) { + buf = buf.substring(0, buf.length() - 1); + } + + while (buf.length() < bufToFill) { + buf += ' '; + } + memcpy(showbuffer, buf.c_str(), bufToFill); + + # ifdef P157_DEBUG + logBufferContent(F("7dtext")); + # endif // ifdef P157_DEBUG +} + +# if P157_SCROLL_TEXT || P157_7DBIN_COMMAND + +bool P157_data_struct::isPeriodChar(const char thisChar) { + return std::find(std::begin(periodchars), std::end(periodchars), thisChar) != std::end(periodchars); +} + +int P157_data_struct::getEffectiveTextLength(const String& text) { + const int textLength = text.length(); + int p = 0; + + for (int i = 0; i < textLength; ++i) { + + if (periods && isPeriodChar(text.charAt(i))) { // If setting periods true + if (p == 0) { // Text starts with a period, becomes a space with a dot + p++; + } + + if ((i > 0) && (text.charAt(i - 1) == '.')) { // Handle consecutive periods + p++; + } + } else { + p++; + } + } + return p; +} + +# endif // if P157_SCROLL_TEXT || P157_7DBIN_COMMAND + +# if P157_SCROLL_TEXT + +bool P157_data_struct::nextScroll() { + bool result = false; + + if (isScrollEnabled() && (!_textToScroll.isEmpty() + # if P157_7DBIN_COMMAND + || binData.size() > 0 + # endif // if P157_7DBIN_COMMAND + )) { + + if ((scrollCount > 0) && (scrollCount < 0xFFFF)) { scrollCount--; } + + if (scrollCount == 0) { + scrollCount = 0xFFFF; // Max value to avoid interference when scrolling long texts + result = true; + const int bufToFill = P157_getDefaultDigits(displayModel, displays); + # if P157_7DBIN_COMMAND + + if (binData.size() > 0) { + scrollPos++; + + if (scrollPos > (binData.size() - bufToFill)) { + scrollPos = 0; // Redisplay + } + scrollCount = _scrollSpeed; // Restart countdown + } else + # endif // if P157_7DBIN_COMMAND + { const int P157_txtlength = _textToScroll.length(); + clearBuffer(); + + if (isPeriodChar(_textToScroll.charAt(scrollPos))) { + scrollPos++; + } + + String part = _textToScroll.substring(scrollPos, scrollPos + 1.5 * bufToFill); + + while (getEffectiveTextLength(part) > bufToFill && !part.isEmpty()) { + part = part.substring(0, part.length() - 1); + } + + for (uint16_t i = 0; i < bufToFill && i < part.length(); ++i) { + showbuffer[i] = part.charAt(i); + } + + // for (uint16_t i = scrollPos; i < P157_txtlength && p <= bufToFill; ++i) { // p <= bufToFill to allow a period after last digit + // const char *isPeriod = std::find(std::begin(periodchars), std::end(periodchars), _textToScroll.charAt(i)); + + // if (periods && (isPeriod != std::end(periodchars))) { // If setting periods true + // if (p == 0) { // Text starts with a period, becomes a space with a + // dot + // showperiods[p] = true; + // p++; + // } else { + // showperiods[p - 1] = true; // The period displays as a dot on the previous digit! + // } + + // if ((i > scrollPos) && (isPeriod != std::end(periodchars))) { // Handle consecutive periods + // showperiods[p - 1] = true; // The period displays as a dot on the previous digit! + // p++; + // } + // } else if (p < bufToFill) { + // showbuffer[p] = _textToScroll.charAt(i); + // p++; + // } + // } + scrollPos++; + + if (scrollPos > _textToScroll.length() - bufToFill) { + scrollPos = 0; // Restart when all text displayed + } + scrollCount = _scrollSpeed; // Restart countdown + # ifdef P157_DEBUG + logBufferContent(F("nextScroll")); + # endif // ifdef P157_DEBUG + } + } + } + return result; +} + +void P157_data_struct::setTextToScroll(const String& text) { + free_string(_textToScroll); + + if (!text.isEmpty()) { + const int bufToFill = P157_getDefaultDigits(displayModel, displays); + _textToScroll.reserve(text.length() + bufToFill + (scrollFull ? bufToFill : 0)); + + for (int i = 0; scrollFull && i < bufToFill; ++i) { // Scroll text in from the right, so start with all spaces + _textToScroll += ' '; + } + _textToScroll += text; + + for (int i = 0; i < bufToFill; ++i) { // Scroll text off completely before restarting + _textToScroll += ' '; + } + } + scrollCount = _scrollSpeed; + scrollPos = 0; + # if P157_7DBIN_COMMAND + binaryData = false; + # endif // if P157_7DBIN_COMMAND +} + +void P157_data_struct::setScrollSpeed(uint8_t speed) { + _scrollSpeed = speed; + scrollCount = _scrollSpeed; + scrollPos = 0; +} + +# endif // if P157_SCROLL_TEXT + +// # if P157_7DBIN_COMMAND + +// void P157_data_struct::setBinaryData(const String& data) { +// binaryData = true; +// # if P157_SCROLL_TEXT +// setTextToScroll(data); +// binaryData = true; // is reset in setTextToScroll +// scrollCount = _scrollSpeed; +// scrollPos = 0; +// # else // if P157_SCROLL_TEXT +// _textToScroll = data; +// # endif // if P157_SCROLL_TEXT +// } + +// # endif // if P157_7DBIN_COMMAND + +# ifdef P157_DEBUG + +void P157_data_struct::logBufferContent(String prefix) { + String log; + + if (loglevelActiveFor(LOG_LEVEL_INFO) && + log.reserve(48)) { + log = strformat(F("%s buffer: periods: %c "), prefix.c_str(), periods ? 't' : 'f'); + + for (uint8_t i = 0; i < 8; ++i) { + if (i > 0) { log += ','; } + log += formatToHex(showbuffer[i]); + log += ','; + log += showperiods[i] ? F(".") : F(""); + } + addLogMove(LOG_LEVEL_INFO, log); + } +} + +# endif // ifdef P157_DEBUG + +// in case of error show all dashes +void P157_data_struct::fillBufferWithDash() { memset(showbuffer, '-', sizeof(showbuffer)); } + +void P157_data_struct::clearBuffer() { + memset(showbuffer, 0, sizeof(showbuffer)); + memset(showperiods, 0, sizeof(showperiods)); +} + +void P157_data_struct::printBuffer() { + if (isInitialized()) { + const size_t maxLen = P157_getDefaultDigits(displayModel, displays); + # if P157_7DBIN_COMMAND + + if (binData.size() > 0) { + # ifdef P157_DEBUG + String log; + # endif // ifdef P157_DEBUG + + for (uint16_t j = 0; j < maxLen && (scrollPos + j) < binData.size(); ++j) { + ht16k33->writeLowLevel(j, binData[scrollPos + j]); + # ifdef P157_DEBUG + log += formatToHex(binData[scrollPos + j]); + log += ','; + # endif // ifdef P157_DEBUG + } + # ifdef P157_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, strformat(F("P157 : printBuffer len: %u maxLen: %u data: %s"), + binData.size(), maxLen, log.c_str())); + } + # endif // ifdef P157_DEBUG + } else + # endif // if P157_7DBIN_COMMAND + { + String buf = String(showbuffer); + uint8_t dotOff{}; + + if ((maxLen < 8) && (buf.length() > maxLen) && buf.startsWith(F(" "))) { + dotOff = 4; + buf = buf.substring(4); + } + + while (getEffectiveTextLength(buf) > maxLen && !buf.isEmpty()) { + buf = buf.substring(0, buf.length() - 1); + } + + while (buf.length() < maxLen) { // TODO Account for offset? + buf += ' '; + } + + # ifdef P157_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, strformat(F("P157 : printBuffer len: %u buffer: %s, maxLen: %u raw: '%s'"), + buf.length(), buf.c_str(), maxLen, showbuffer)); + } + # endif // ifdef P157_DEBUG + + for (uint8_t i = 0; i < buf.length(); ++i) { + ht16k33->write(buf[i]); + + if (showperiods[i + dotOff] || (dotpos == (i + dotOff))) { + ht16k33->write('.'); + + } + } + } + ht16k33->setCursor(0); + } + +} + +bool P157_data_struct::plugin_once_a_second(struct EventStruct *event) { + if (output == P157_DISP_MANUAL) { + return false; + } + + if ((output == P157_DISP_CLOCK24BLNK) || + (output == P157_DISP_CLOCK12BLNK)) { + timesep = !timesep; + } else { + timesep = true; + } + + if (output == P157_DISP_DATE) { + fillBufferWithDate(true, 0, 0, 0, + # if P157_SUPPRESS_ZERO + suppressLeading0 + # else // if P157_SUPPRESS_ZERO + false + # endif // if P157_SUPPRESS_ZERO + ); + } else { + fillBufferWithTime(true, 0, 0, 0, !((output == P157_DISP_CLOCK24BLNK) || + (output == P157_DISP_CLOCK24)), + # if P157_SUPPRESS_ZERO + suppressLeading0 + # else // if P157_SUPPRESS_ZERO + false + # endif // if P157_SUPPRESS_ZERO + ); + } + + printBuffer(); + + return true; +} + +# if P157_SCROLL_TEXT + +bool P157_data_struct::plugin_ten_per_second(struct EventStruct *event) { + if ((output != P157_DISP_MANUAL) || !isScrollEnabled()) { + return false; + } + + if (nextScroll()) { + printBuffer(); + } + return true; +} + +# endif // if P157_SCROLL_TEXT + +const char P157_commands[] PROGMEM = + "7dn|7dt|" + # if P157_7DDT_COMMAND + "7ddt|" + # endif // if P157_7DDT_COMMAND + "7dst|7dsd|7dtext|" + # if P157_7DBIN_COMMAND + "7dbin|" + # endif // if P157_7DBIN_COMMAND + "7don|7doff|7db|7output|" +; +enum class P157_commands_e : int8_t { + invalid = -1, + c7dn = 0, + c7dt, + # if P157_7DDT_COMMAND + c7ddt, + # endif // if P157_7DDT_COMMAND + c7dst, + c7dsd, + c7dtext, + # if P157_7DBIN_COMMAND + c7dbin, + # endif // if P157_7DBIN_COMMAND + c7don, + c7doff, + c7db, + c7output, + +}; + +bool P157_data_struct::plugin_write(struct EventStruct *event, + const String & string) { + const String cmd_s = parseString(string, 1); + + if ((cmd_s.length() < 3) || (cmd_s[0] != '7')) { return false; } + + # if P157_SCROLL_TEXT + const bool currentScroll = isScrollEnabled(); // Save current state + bool newScroll = false; // disable scroll if command changes + setScrollEnabled(false); + # endif // if P157_SCROLL_TEXT + + const int cmd_i = GetCommandCode(cmd_s.c_str(), P157_commands); + + if (cmd_i < 0) { return false; } // Fail fast + + const P157_commands_e cmd = static_cast(cmd_i); + + const String text = parseStringToEndKeepCase(string, 2); + bool success = false; + bool displayon = false; + + # if P157_7DBIN_COMMAND + + if ( + (cmd != P157_commands_e::c7dbin) && + (cmd != P157_commands_e::c7db) && + (cmd != P157_commands_e::c7don) && + (cmd != P157_commands_e::c7doff) + ) { + binData.clear(); + } + # endif // if P157_7DBIN_COMMAND + + switch (cmd) + { + case P157_commands_e::c7dn: + return plugin_write_7dn(event, text); + case P157_commands_e::c7dt: + return plugin_write_7dt(text); + # if P157_7DDT_COMMAND + case P157_commands_e::c7ddt: + return plugin_write_7ddt(text); + # endif // if P157_7DDT_COMMAND + case P157_commands_e::c7dst: + return plugin_write_7dst(event); + case P157_commands_e::c7dsd: + return plugin_write_7dsd(event); + case P157_commands_e::c7dtext: + # if P157_SCROLL_TEXT + setScrollEnabled(true); // Scrolling allowed for 7dtext command + # endif // if P157_SCROLL_TEXT + return plugin_write_7dtext(text); + # if P157_7DBIN_COMMAND + case P157_commands_e::c7dbin: + # if P157_SCROLL_TEXT + setScrollEnabled(true); // Scrolling allowed for 7dbin command + # endif // if P157_SCROLL_TEXT + return plugin_write_7dbin(string, 1); + # endif // if P157_7DBIN_COMMAND + case P157_commands_e::c7don: + # if P157_SCROLL_TEXT + newScroll = currentScroll; // Restore state + # endif // if P157_SCROLL_TEXT + # ifndef BUILD_NO_DEBUG + addLog(LOG_LEVEL_INFO, F("7DGT : Display ON")); + # endif // ifndef BUILD_NO_DEBUG + displayon = true; + success = true; + break; + case P157_commands_e::c7doff: + # if P157_SCROLL_TEXT + newScroll = currentScroll; // Restore state + # endif // if P157_SCROLL_TEXT + # ifndef BUILD_NO_DEBUG + addLog(LOG_LEVEL_INFO, F("7DGT : Display OFF")); + # endif // ifndef BUILD_NO_DEBUG + displayon = false; + success = true; + break; + case P157_commands_e::c7db: + # if P157_SCROLL_TEXT + newScroll = currentScroll; // Restore state + # endif // if P157_SCROLL_TEXT + + if ((event->Par1 >= 0) && (event->Par1 < 16)) { + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, concat(F("7DGT : Brightness="), event->Par1)); + } + # endif // ifndef BUILD_NO_DEBUG + brightness = event->Par1; + P157_CFG_BRIGHTNESS = event->Par1; + displayon = true; + success = true; + } + break; + case P157_commands_e::c7output: + + if ((event->Par1 >= 0) && (event->Par1 < 6)) { // 0:"Manual",1:"Clock 24h - Blink",2:"Clock 24h - No Blink", + // 3:"Clock 12h - Blink",4:"Clock 12h - No Blink",5:"Date" + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, concat(F("7DGT : Display output="), event->Par1)); + } + # endif // ifndef BUILD_NO_DEBUG + output = event->Par1; + P157_CFG_OUTPUTTYPE = event->Par1; + displayon = true; + success = true; + # if P157_SCROLL_TEXT + + if (event->Par1 == 0) { newScroll = currentScroll; } // Restore state + # endif // if P157_SCROLL_TEXT + } + break; + case P157_commands_e::invalid: + break; + } + + if (success) { + # if P157_SCROLL_TEXT + setScrollEnabled(newScroll); + # endif // if P157_SCROLL_TEXT + + if (isInitialized()) { + ht16k33->setBrightness(brightness); + + if (displayon) { + ht16k33->on(); + } + else { + ht16k33->off(); + } + } + } + return success; +} + +void P157_data_struct::getDisplayLimits(int32_t& lLimit, + int32_t& uLimit, + int8_t offset, + uint8_t displays) { + uint8_t dgts = P157_getDefaultDigits(displayModel, displays); + + dgts -= offset; // Subtract an offset, used for extra symbol + lLimit = -pow10(dgts - 1); // Lowest value we can display - 1 + uLimit = pow10(dgts); // Highest value we can display + 1 + // TODO disable log + // addLog(LOG_LEVEL_INFO, strformat(F("P157: limits: %d digits(%d), lower: %d, upper: %d"), dgts, offset, lLimit, uLimit)); +} + +bool P157_data_struct::plugin_write_7dn(struct EventStruct *event, + const String & text) { + if (output != P157_DISP_MANUAL) { + return false; + } + + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, concat(F("7DGT : Show Number="), event->Par1)); + } + # endif // ifndef BUILD_NO_DEBUG + + int32_t lLimit = 0; + int32_t uLimit = 0; + getDisplayLimits(lLimit, uLimit, 0, displays); + + if (!text.isEmpty()) { + if ((event->Par1 > lLimit) && (event->Par1 < uLimit)) { + fillBufferWithNumber(text.c_str()); + } else { + fillBufferWithDash(); + } + } + + printBuffer(); + return true; +} + +bool P157_data_struct::plugin_write_7dt(const String& text) { + if (output != P157_DISP_MANUAL) { + return false; + } + + float P157_temptemp = 0.0f; + bool P157_tempflagdot = false; + + if (!text.isEmpty()) { + validFloatFromString(text, P157_temptemp); + } + + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, concat(F("7DGT : Show Temperature="), P157_temptemp)); + } + # endif // ifndef BUILD_NO_DEBUG + + int32_t lLimit = 0; + int32_t uLimit = 0; + getDisplayLimits(lLimit, uLimit, hideDegree ? 0 : 1, displays); + float lLimitErr = lLimit + 0.1f; + float uLimitErr = uLimit - 1.0f; + float lLimitDec = lLimit / 10.0f; + float uLimitDec = uLimit / 10.0f; + + // TODO disable log + // addLog(LOG_LEVEL_INFO, strformat(F("P157: 7dt: lErr: %.1f, uErr: %.1f, lDec: %.1f, uDec: %.1f"), + // lLimitErr, uLimitErr, lLimitDec, uLimitDec)); + + if ((P157_temptemp > uLimitErr) || (P157_temptemp < lLimitErr)) { + fillBufferWithDash(); + } else { + if ((P157_temptemp < uLimitDec) && (P157_temptemp > lLimitDec)) { + P157_temptemp = roundf(P157_temptemp * 10.0f); + P157_tempflagdot = true; + } + fillBufferWithTemp(P157_temptemp); + } + + printBuffer(); + + # ifdef P157_DEBUG + logBufferContent(F("7dt")); + # endif // ifdef P157_DEBUG + return true; +} + +# if P157_7DDT_COMMAND + +bool P157_data_struct::plugin_write_7ddt(const String& text) { + if (output != P157_DISP_MANUAL) { + return false; + } + + float P157_lefttemp = 0.0f; + float P157_righttemp = 0.0f; + bool P157_tempflagdot = false; + + if (!text.isEmpty()) { + validFloatFromString(parseString(text, 1), P157_lefttemp); + + if (text.indexOf(',') > -1) { + validFloatFromString(parseString(text, 2), P157_righttemp); + } + } + + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, strformat(F("7DGT : Dual Temperature 1st=%.2f 2nd=%.2f"), P157_lefttemp, P157_righttemp)); + } + # endif // ifndef BUILD_NO_DEBUG + + { + uint8_t firstDot = -1; // No decimals is no dots + uint8_t secondDot = -1; + float hideFactor = hideDegree ? 10.0f : 1.0f; + + if ((P157_lefttemp > 999.99f * hideFactor) || (P157_lefttemp < -99.99f * hideFactor)) { + P157_lefttemp = -101.0f * hideFactor; // Triggers on -100 + } else { + if ((P157_lefttemp < 100.0f * hideFactor) && (P157_lefttemp > -10.0f * hideFactor)) { + P157_lefttemp = roundf(P157_lefttemp * 10.0f); + firstDot = hideDegree ? 2 : 1; + } + } + + if ((P157_righttemp > 999.99f * hideFactor) || (P157_righttemp < -99.99f * hideFactor)) { + P157_righttemp = -101.0f * hideFactor; + } else { + if ((P157_righttemp < 100.0f * hideFactor) && (P157_righttemp > -10.0f * hideFactor)) { + P157_righttemp = roundf(P157_righttemp * 10.0f); + secondDot = hideDegree ? 6 : 5; + } + } + + # ifdef P157_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, strformat(F("7DGT : 7ddt preprocessed 1st=%.2f 2nd=%.2f"), P157_lefttemp, P157_righttemp)); + } + # endif // ifdef P157_DEBUG + + fillBufferWithDualTemp(P157_lefttemp, firstDot > -1, P157_righttemp, secondDot > -1); + + printBuffer(); + + } + # ifdef P157_DEBUG + logBufferContent(F("7ddt")); + # endif // ifdef P157_DEBUG + return true; +} + +# endif // if P157_7DDT_COMMAND + +bool P157_data_struct::plugin_write_7dst(struct EventStruct *event) { + if (output != P157_DISP_MANUAL) { + return false; + } + + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, strformat(F("7DGT : Show Time=%02d:%02d:%02d"), event->Par1, event->Par2, event->Par3)); + } + # endif // ifndef BUILD_NO_DEBUG + timesep = true; + fillBufferWithTime(false, event->Par1, event->Par2, event->Par3, false, + # if P157_SUPPRESS_ZERO + suppressLeading0 + # else // if P157_SUPPRESS_ZERO + false + # endif // if P157_SUPPRESS_ZERO + ); + + printBuffer(); + return true; +} + +bool P157_data_struct::plugin_write_7dsd(struct EventStruct *event) { + if (output != P157_DISP_MANUAL) { + return false; + } + + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, strformat(F("7DGT : Show Date=%02d:%02d:%02d"), event->Par1, event->Par2, event->Par3)); + } + # endif // ifndef BUILD_NO_DEBUG + fillBufferWithDate(false, event->Par1, event->Par2, event->Par3, + # if P157_SUPPRESS_ZERO + suppressLeading0 + # else // if P157_SUPPRESS_ZERO + false + # endif // if P157_SUPPRESS_ZERO + ); + + printBuffer(); + return true; +} + +bool P157_data_struct::plugin_write_7dtext(const String& text) { + if (output != P157_DISP_MANUAL) { + return false; + } + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLogMove(LOG_LEVEL_INFO, concat(F("7DGT : Show Text="), text)); + } + # endif // ifndef BUILD_NO_DEBUG + # if P157_SCROLL_TEXT + setTextToScroll(EMPTY_STRING); + const uint8_t bufLen = P157_getDefaultDigits(displayModel, displays); + + if (isScrollEnabled() && (getEffectiveTextLength(text) > bufLen)) { + setTextToScroll(text); + } else + # endif // if P157_SCROLL_TEXT + { + fillBufferWithString(text); + + printBuffer(); + } + return true; +} + +# if P157_7DBIN_COMMAND + +bool P157_data_struct::plugin_write_7dbin(const String& text, + const uint8_t offset) { + if (!text.isEmpty()) { + binData.clear(); + scrollPos = 0; + + uint32_t wordValue{}; + uint8_t arg = 1; + String argValue = parseStringKeepCaseNoTrim(text, offset + arg); + + while (!argValue.isEmpty()) { + NumericalType numType; + + if (isNumerical(argValue, numType) && (numType != NumericalType::FloatingPoint) && + validUIntFromString(argValue, wordValue) && (wordValue <= 0xFFFF)) { + # ifdef P157_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, strformat(F("7dbin : argValue: %s value: 0x%04x"), argValue.c_str(), wordValue)); + } + # endif // ifdef P157_DEBUG + binData.push_back(wordValue & 0xFFFF); + } else { + # ifdef P157_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, strformat(F("7dbin : argValue: %s"), argValue.c_str())); + } + # endif // ifdef P157_DEBUG + + uint16_t i = 0; + + while (i < argValue.length()) { + uint16_t bitmap = ht16k33->getCharacterBitmap(argValue.charAt(i)); + + if ((i < argValue.length()) && isPeriodChar(argValue.charAt(i + 1))) { + bitmap |= ((displayModel == P157_MODEL_4DGT) || (displayModel == P157_MODEL_8DGT)) ? SEG14_DP : SEG_DP; + ++i; + } + binData.push_back(bitmap); + ++i; + } + } + arg++; + argValue = parseStringKeepCaseNoTrim(text, offset + arg); + } + + if (binData.size() > 0) { + # if P157_SCROLL_TEXT + + if (isScrollEnabled()) { + const uint8_t bufLen = P157_getDefaultDigits(displayModel, displays); + + for (uint8_t i = 0; scrollFull && i < bufLen; ++i) { // prepend to start display empty + binData.insert(binData.begin(), 0); + } + + for (uint8_t i; i < bufLen; ++i) { // append empty to scroll until empty + binData.push_back(0); + } + } + # endif // if P157_SCROLL_TEXT + + if (!isScrollEnabled()) { + printBuffer(); + } + return true; + } + } + return false; +} + +# endif // if P157_7DBIN_COMMAND + +#endif // ifdef USES_P157 diff --git a/src/src/PluginStructs/P157_data_struct.h b/src/src/PluginStructs/P157_data_struct.h new file mode 100644 index 0000000000..441813bbc3 --- /dev/null +++ b/src/src/PluginStructs/P157_data_struct.h @@ -0,0 +1,216 @@ +#ifndef PLUGINSTRUCTS_P157_DATA_STRUCT_H +#define PLUGINSTRUCTS_P157_DATA_STRUCT_H + +#include "../../_Plugin_Helper.h" +#ifdef USES_P157 + +# include "NoiascaHt16k33.h" +# include + +# define P157_CFG_DISPLAYTYPE PCONFIG(0) +# define P157_CFG_OUTPUTTYPE PCONFIG(1) +# define P157_CFG_BRIGHTNESS PCONFIG(2) +# define P157_CFG_SCROLLSPEED PCONFIG(3) +# define P157_CFG_I2C_ADDRESS PCONFIG(4) +# define P157_CFG_DISPLAYS PCONFIG(5) +# define P157_CFG_FLAGS PCONFIG_ULONG(0) + +# define P157_DISP_MANUAL 0 +# define P157_DISP_CLOCK24BLNK 1 +# define P157_DISP_CLOCK24 2 +# define P157_DISP_CLOCK12BLNK 3 +# define P157_DISP_CLOCK12 4 +# define P157_DISP_DATE 5 + +# define P157_MODEL_4DGT 0 +# define P157_MODEL_8DGT 1 +# define P157_MODEL_4DGT_7SEG 2 +# define P157_MODEL_8DGT_7SEG 3 + +# define P157_CHAR_EURO 128 +# define P157_CHAR_DEGREE 129 + +// # define P157_OPTION_PERIOD 0 // Period as dot +# define P157_OPTION_HIDEDEGREE 1 // Hide degree symbol for temperatures +# define P157_OPTION_RIGHTALIGN 2 // Align 7dt output to the right +# define P157_OPTION_SCROLLTEXT 3 // Scroll text > display width +# define P157_OPTION_SCROLLFULL 4 // Scroll text from the right in, starting with a blank display +# define P157_OPTION_SUPPRESS0 5 // Suppress leading zero on day/hour of Date/Time display +# define P157_OPTION_BLINK_DOT 6 // Use dot on second digit for flashing instead of colon + +# ifndef P157_7DDT_COMMAND +# define P157_7DDT_COMMAND 1 // Enable 7ddt by default +# endif // ifndef P157_7DDT_COMMAND +# ifndef P157_SCROLL_TEXT +# define P157_SCROLL_TEXT 1 // Enable scrolling of 7dtext by default +# endif // ifndef P157_SCROLL_TEXT +# ifndef P157_7DBIN_COMMAND +# define P157_7DBIN_COMMAND 1 // Enable input of binary data via 7dbin,uint8_t,... command +# endif // ifndef P157_7DBIN_COMMAND +# ifndef P157_SUPPRESS_ZERO +# define P157_SUPPRESS_ZERO 1 // Enable Suppress leading zero on day/hour +# endif // ifndef P157_SUPPRESS_ZERO + +# if defined(PLUGIN_SET_COLLECTION) && defined(ESP8266) +# if P157_7DDT_COMMAND +# undef P157_7DDT_COMMAND // Optionally activate if .bin file space is problematic, remove the 7ddt command +# define P157_7DDT_COMMAND 0 +# endif // if P157_7DDT_COMMAND +# if P157_SCROLL_TEXT +# undef P157_SCROLL_TEXT // Optionally activate if .bin file space is problematic, remove the scrolling text feature +# define P157_SCROLL_TEXT 0 +# endif // if P157_SCROLL_TEXT +# if P157_7DBIN_COMMAND +# undef P157_7DBIN_COMMAND // Optionally activate if .bin file space is problematic, remove the 7dbin command +# define P157_7DBIN_COMMAND 0 +# endif // if P157_7DBIN_COMMAND +# if P157_SUPPRESS_ZERO +# undef P157_SUPPRESS_ZERO // Optionally activate if .bin file space is problematic, remove the Suppress leading zero feature +# define P157_SUPPRESS_ZERO 0 +# endif // if P157_SUPPRESS_ZERO +# endif // if defined(PLUGIN_SET_COLLECTION) && defined(ESP8266) +# define P157_DEBUG // Leave out some debugging on demand, activates extra log info in the debug + +const __FlashStringHelper* P157_DisplayModel(uint8_t model); +uint8_t P157_getDefaultDigits(uint8_t displayModel, + uint8_t digits = 0); +void P157_display_output_selector(const __FlashStringHelper *id, + int16_t value); +uint8_t P157_revert7bits(uint8_t character); + +struct P157_data_struct : public PluginTaskData_base { +public: + + P157_data_struct() = default; + virtual ~P157_data_struct(); + + bool init(struct EventStruct *event); + bool plugin_write(struct EventStruct *event, + const String & string); + bool plugin_once_a_second(struct EventStruct *event); + # if P157_SCROLL_TEXT + bool plugin_ten_per_second(struct EventStruct *event); + # endif // if P157_SCROLL_TEXT + + void printBuffer(); + void fillBufferWithTime(bool sevendgt_now, + uint8_t sevendgt_hours, + uint8_t sevendgt_minutes, + uint8_t sevendgt_seconds, + bool flag12h, + bool suppressLeading0); + void fillBufferWithDate(bool sevendgt_now, + uint8_t sevendgt_day, + uint8_t sevendgt_month, + int sevendgt_year, + bool suppressLeading0); + void put4NumbersInBuffer(const uint8_t nr1, + const uint8_t nr2, + const int8_t nr3, + const int8_t nr4 + # if P157_SUPPRESS_ZERO + , + const bool suppressLeading0 + # endif // if P157_SUPPRESS_ZERO + , + const bool sep + ); + void fillBufferWithNumber(const String& number); + void fillBufferWithTemp(int temperature); + # if P157_7DDT_COMMAND + void fillBufferWithDualTemp(int leftTemperature, + bool leftWithDecimal, + int rightTemperature, + bool rightWithDecimal); + # endif // if P157_7DDT_COMMAND + void fillBufferWithString(const String& textToShow, + bool useBinaryData = false); + # if P157_SCROLL_TEXT || P157_7DBIN_COMMAND + bool isPeriodChar(const char thisChar); + int getEffectiveTextLength(const String& text); + # endif // if P157_SCROLL_TEXT || P157_7DBIN_COMMAND + # if P157_SCROLL_TEXT + bool nextScroll(); + void setTextToScroll(const String& text); + void setScrollSpeed(uint8_t speed); + + bool isScrollEnabled() const { return txtScrolling && scrollAllowed; } + + void setScrollEnabled(bool scroll) { scrollAllowed = scroll; } + + # endif // if P157_SCROLL_TEXT + // # if P157_7DBIN_COMMAND + // void setBinaryData(const String& data); + // # endif // if P157_7DBIN_COMMAND + # ifdef P157_DEBUG + void logBufferContent(String prefix); + # endif // ifdef P157_DEBUG + void fillBufferWithDash(); + void clearBuffer(); + + int dotpos = -1; + char showbuffer[64] = { 0 }; + bool showperiods[64] = { 0 }; + uint8_t i2cAddress = 0; + uint8_t displayModel = 0; + uint8_t output = 0; + uint8_t brightness = 0; + uint8_t displays = 4; + bool timesep = false; + bool shift = false; + bool periods = false; + bool hideDegree = false; + bool rightAlignTempMAX7219 = false; + bool suppressLeading0 = false; + uint8_t fontset = 0; + # if P157_7DBIN_COMMAND + bool binaryData = false; + std::vectorbinData; + # endif // P157_7DBIN_COMMAND + # if P157_SCROLL_TEXT + bool txtScrolling = false; + bool scrollAllowed = false; + uint16_t scrollCount = 0; + uint16_t scrollPos = 0; + bool scrollFull = false; + +private: + + uint16_t _scrollSpeed = 0; + # endif // P157_SCROLL_TEXT + # if defined(P157_SCROLL_TEXT) || defined(P157_7DBIN_COMMAND) + String _textToScroll; + # endif // if defined(P157_SCROLL_TEXT) || defined(P157_7DBIN_COMMAND) + # ifdef P157_DEBUG + uint32_t counter50 = 0; + # endif // ifdef P157_DEBUG + +private: + + Noiasca_ht16k33*ht16k33 = nullptr; + + bool isInitialized() const { return nullptr != ht16k33; } + + void getDisplayLimits(int32_t& lLimit, + int32_t& uLimit, + int8_t offset = 0, + uint8_t digits = 0); + bool plugin_write_7dn(struct EventStruct *event, + const String & text); + bool plugin_write_7dt(const String& text); + # if P157_7DDT_COMMAND + bool plugin_write_7ddt(const String& text); + # endif // if P157_7DDT_COMMAND + bool plugin_write_7dst(struct EventStruct *event); + bool plugin_write_7dsd(struct EventStruct *event); + bool plugin_write_7dtext(const String& text); + # if P157_7DBIN_COMMAND + bool plugin_write_7dbin(const String& text, + const uint8_t offset); + # endif // if P157_7DBIN_COMMAND + const char periodchars[4] = { '.', ',', ':', ';' }; + +}; + +#endif // ifdef USES_P157 +#endif // ifndef PLUGINSTRUCTS_P157_DATA_STRUCT_H From c97afc5602654ce94a0f2ac0335c4908f58d6218 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 23 May 2026 22:44:16 +0200 Subject: [PATCH 02/15] [P157] Add support for fonts via P073, P057 update name, P165 fix build/feature flag issue --- .../Plugin/_plugin_substitutions_p05x.repl | 4 +- lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp | 8 ++ lib/NoiascaHt16k33/src/NoiascaHt16k33.h | 5 + src/_P057_HT16K33_LED.ino | 3 +- src/_P157_14DGT.ino | 30 +++++- src/src/CustomBuild/define_plugin_sets.h | 3 + src/src/PluginStructs/P157_data_struct.cpp | 97 +++++++++++++++++-- src/src/PluginStructs/P157_data_struct.h | 34 ++++++- src/src/PluginStructs/P165_data_struct.h | 6 +- 9 files changed, 171 insertions(+), 19 deletions(-) diff --git a/docs/source/Plugin/_plugin_substitutions_p05x.repl b/docs/source/Plugin/_plugin_substitutions_p05x.repl index 2355be524e..9fc98c1598 100644 --- a/docs/source/Plugin/_plugin_substitutions_p05x.repl +++ b/docs/source/Plugin/_plugin_substitutions_p05x.repl @@ -96,9 +96,9 @@ .. |P056_compileinfo| replace:: `.` .. |P056_usedlibraries| replace:: `.` -.. |P057_name| replace:: :cyan:`HT16K33` +.. |P057_name| replace:: :cyan:`HT16K33 4 digit clock/num` .. |P057_type| replace:: :cyan:`Display` -.. |P057_typename| replace:: :cyan:`Display - HT16K33` +.. |P057_typename| replace:: :cyan:`Display - HT16K33 4 digit clock/num` .. |P057_porttype| replace:: `.` .. |P057_status| replace:: :yellow:`DISPLAY` :yellow:`COLLECTION` .. |P057_status_lb| replace:: :yellow:`DISPLAY` :yellow:`COLLECTION` diff --git a/lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp b/lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp index 2245648dd8..a651eae9cd 100644 --- a/lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp +++ b/lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp @@ -143,6 +143,14 @@ void Noiasca_ht16k33::setCursor(uint8_t newPosition) { // Set the } +/* + get the cursor for the next writing position +*/ +uint8_t Noiasca_ht16k33::getCursor() { // Get the cursor for the next writing position + return _currentPosition; +} + + /* set the number of digits per device */ diff --git a/lib/NoiascaHt16k33/src/NoiascaHt16k33.h b/lib/NoiascaHt16k33/src/NoiascaHt16k33.h index d22ed07b0f..56217d1836 100644 --- a/lib/NoiascaHt16k33/src/NoiascaHt16k33.h +++ b/lib/NoiascaHt16k33/src/NoiascaHt16k33.h @@ -195,6 +195,11 @@ const uint16_t SEG14_DP = (1<<14); */ void setCursor(uint8_t newPosition); + /** + \brief get the cursor for the next writing position + */ + uint8_t getCursor(); + /** \brief set the number of digits per device \param newDigits modify the used digits diff --git a/src/_P057_HT16K33_LED.ino b/src/_P057_HT16K33_LED.ino index 2773e1e0b1..81800d9a3a 100644 --- a/src/_P057_HT16K33_LED.ino +++ b/src/_P057_HT16K33_LED.ino @@ -9,6 +9,7 @@ // written by Jochen Krapf (jk@nerd2nerd.org) /** Changelog: + * 2026-05-23 tonhuisman: Update plugin name to better distinguish from P157 * 2024-12-14 tonhuisman: Fix mprint command to skip the colon segment when printing a non-colon character in that position. * 2024-12 tonhuisman: Start changelog. */ @@ -72,7 +73,7 @@ # define PLUGIN_057 # define PLUGIN_ID_057 57 -# define PLUGIN_NAME_057 "Display - HT16K33" +# define PLUGIN_NAME_057 "Display - HT16K33 4 digit clock/num" # include "src/PluginStructs/P057_data_struct.h" diff --git a/src/_P157_14DGT.ino b/src/_P157_14DGT.ino index 07034fb356..adcb2089fe 100644 --- a/src/_P157_14DGT.ino +++ b/src/_P157_14DGT.ino @@ -16,6 +16,10 @@ // "7ddt,," (Dual temperatures on Max7219/74HC595 (8 digits) only, temperature can be negative or // positive and containing decimals) // "7dtext," (show free text - supported low ascii, period, comma, colon, semicolon are displayed as dot) +// "7dfont," 7-segment only: (select the used font: 0/7DGT/Default = default, 1/Siekoo = Siekoo, 2/Siekoo_Upper = Siekoo +// with uppercase CHNORUX, 3/dSEG7 = dSEG7) +// Siekoo: https://www.fakoo.de/siekoo (uppercase CHNORUX is a local extension) +// dSEG7 : https://www.keshikan.net/fonts-e.html // "7dbin,[uint16_t],..." (show data binary formatted, bits clock-wise from left to right, dot, top, right 2x, bottom, // left 2x, center), scroll-enabled // @@ -26,12 +30,13 @@ // /** History + * 2026-05-23 tonhuisman: Add font-selector for 7-segment displays, re-using the fonts available in P073 * 2026-05-15 tonhuisman: Start plugin, based on P073 */ # define PLUGIN_157 # define PLUGIN_ID_157 157 -# define PLUGIN_NAME_157 "Display - HT16K33 14-segment" +# define PLUGIN_NAME_157 "Display - HT16K33 14-/7-segment" # include "src/PluginStructs/P157_data_struct.h" @@ -103,7 +108,8 @@ boolean Plugin_157(uint8_t function, struct EventStruct *event, String& string) P157_MODEL_8DGT_7SEG, }; constexpr size_t optionCount = NR_ELEMENTS(displtype); - const FormSelectorOptions selector(optionCount, displtype, displOption); + FormSelectorOptions selector(optionCount, displtype, displOption); + selector.reloadonchange = true; selector.addFormSelector(F("Display Type"), F("displtype"), P157_CFG_DISPLAYTYPE); } @@ -119,9 +125,15 @@ boolean Plugin_157(uint8_t function, struct EventStruct *event, String& string) addFormNumericBox(F("Brightness"), F("brightness"), P157_CFG_BRIGHTNESS, 0, 15); addUnit(F("0..15")); - addFormSubHeader(F("Options")); + # if P157_EXTRA_FONTS + + if (P157_is7SegmentDisplay(P157_CFG_DISPLAYTYPE)) { + P073_font_selector(F("fontset"), P157_CFG_FONTSET); + addFormNote(F("Only available for 7-segment displays")); + } + # endif // if P157_EXTRA_FONTS - // addFormCheckBox(F("Text show periods as dot"), F("periods"), bitRead(P157_CFG_FLAGS, P157_OPTION_PERIOD)); + addFormSubHeader(F("Options")); addFormCheckBox(F("Hide ° for Temperatures"), F("hide_degree"), bitRead(P157_CFG_FLAGS, P157_OPTION_HIDEDEGREE)); # if P157_7DDT_COMMAND @@ -155,6 +167,16 @@ boolean Plugin_157(uint8_t function, struct EventStruct *event, String& string) P157_CFG_DISPLAYS = getFormItemInt(F("dspls")); P157_CFG_OUTPUTTYPE = getFormItemInt(F("displout")); P157_CFG_BRIGHTNESS = getFormItemInt(F("brightness")); + + # if P157_EXTRA_FONTS + + if (P157_is7SegmentDisplay(P157_CFG_DISPLAYTYPE)) { + P157_CFG_FONTSET = getFormItemInt(F("fontset")); + } else + # endif // if P157_EXTRA_FONTS + { + P157_CFG_FONTSET = 0; + } uint32_t lSettings = 0; // bitWrite(lSettings, P157_OPTION_PERIOD, isFormItemChecked(F("periods"))); diff --git a/src/src/CustomBuild/define_plugin_sets.h b/src/src/CustomBuild/define_plugin_sets.h index b1b008dc0e..c0931c39d1 100644 --- a/src/src/CustomBuild/define_plugin_sets.h +++ b/src/src/CustomBuild/define_plugin_sets.h @@ -1719,6 +1719,9 @@ To create/register a plugin, you have to : #if !defined(USES_P139) && defined(ESP32) #define USES_P139 // AXP2101 #endif + #if !defined(USES_P157) && defined(ESP32) + #define USES_P157 // HT16K33 14 segment + #endif #endif #if !defined(USES_P180) && defined(ESP32) #define USES_P180 // Generic - I2C Generic diff --git a/src/src/PluginStructs/P157_data_struct.cpp b/src/src/PluginStructs/P157_data_struct.cpp index 0bc29cba44..4199f7c9de 100644 --- a/src/src/PluginStructs/P157_data_struct.cpp +++ b/src/src/PluginStructs/P157_data_struct.cpp @@ -47,6 +47,10 @@ void P157_display_output_selector(const __FlashStringHelper *id, int16_t value) selector.addFormSelector(F("Display Output"), id, value); } +bool P157_is7SegmentDisplay(uint8_t model) { return (P157_MODEL_4DGT_7SEG == model) || (P157_MODEL_8DGT_7SEG == model); } + +bool P157_is4DigitDisplay(uint8_t model) { return (P157_MODEL_4DGT == model) || (P157_MODEL_4DGT_7SEG == model); } + P157_data_struct::~P157_data_struct() { if (nullptr != ht16k33) { ht16k33->off(); @@ -86,7 +90,7 @@ bool P157_data_struct::init(struct EventStruct *event) addLog(LOG_LEVEL_INFO, strformat(F("P157 : Model: %s, displays: %d"), FsP(P157_DisplayModel(displayModel)), displays)); } - if ((P157_MODEL_4DGT == displayModel) || (P157_MODEL_8DGT == displayModel)) { + if (!P157_is7SegmentDisplay(displayModel)) { ht16k33 = new (std::nothrow) Noiasca_ht16k33_hw_14(); // 14 segment } else { ht16k33 = new (std::nothrow) Noiasca_ht16k33_hw_7(); // 7 segment @@ -99,7 +103,7 @@ bool P157_data_struct::init(struct EventStruct *event) if (0 == ht16k33->begin(i2cAddress, displays)) { if (ht16k33->isConnected()) // Happy flow { - ht16k33->setDigits((P157_MODEL_4DGT == displayModel) || (P157_MODEL_4DGT_7SEG == displayModel) ? 4 : 8); + ht16k33->setDigits(P157_is4DigitDisplay(displayModel) ? 4 : 8); ht16k33->setBrightness(brightness); ht16k33->on(); return true; @@ -583,13 +587,39 @@ void P157_data_struct::printBuffer() { } # endif // ifdef P157_DEBUG - for (uint8_t i = 0; i < buf.length(); ++i) { - ht16k33->write(buf[i]); + uint8_t i = 0; + # if P157_EXTRA_FONTS + uint8_t pos = ht16k33->getCursor(); + # endif + + while (i < buf.length()) { + # if P157_EXTRA_FONTS + + if (P157_is7SegmentDisplay(displayModel)) { + // Re-use the fonts from P073, but they use the MAX7219 layout, that has bits 0..6 reverted + char toPrint = P073_revert7bits(P073_getFontChar(P073_mapCharToFontPosition(buf[i], fontSet), fontSet)); + + if (showperiods[i + dotOff] || (dotpos == (i + dotOff))) { + toPrint |= SEG_DP; + } + + if (((i + 1) < buf.length()) && isPeriodChar(buf[i + 1])) { + toPrint |= SEG_DP; + ++i; + } + ht16k33->writeLowLevel(pos, toPrint); + ++pos; + } else + # endif // if P157_EXTRA_FONTS + { + ht16k33->write(buf[i]); - if (showperiods[i + dotOff] || (dotpos == (i + dotOff))) { - ht16k33->write('.'); + if (showperiods[i + dotOff] || (dotpos == (i + dotOff))) { + ht16k33->write('.'); + } } + ++i; } } ht16k33->setCursor(0); @@ -654,6 +684,9 @@ const char P157_commands[] PROGMEM = "7ddt|" # endif // if P157_7DDT_COMMAND "7dst|7dsd|7dtext|" + # if P157_EXTRA_FONTS + "7dfont|" + # endif // if P157_EXTRA_FONTS # if P157_7DBIN_COMMAND "7dbin|" # endif // if P157_7DBIN_COMMAND @@ -669,6 +702,9 @@ enum class P157_commands_e : int8_t { c7dst, c7dsd, c7dtext, + # if P157_EXTRA_FONTS + c7dfont, + # endif // if P157_EXTRA_FONTS # if P157_7DBIN_COMMAND c7dbin, # endif // if P157_7DBIN_COMMAND @@ -732,6 +768,13 @@ bool P157_data_struct::plugin_write(struct EventStruct *event, setScrollEnabled(true); // Scrolling allowed for 7dtext command # endif // if P157_SCROLL_TEXT return plugin_write_7dtext(text); + # if P157_EXTRA_FONTS + case P157_commands_e::c7dfont: + # if P157_SCROLL_TEXT + setScrollEnabled(currentScroll); // Restore state + # endif // if P157_SCROLL_TEXT + return plugin_write_7dfont(event, text); + # endif // if P157_EXTRA_FONTS # if P157_7DBIN_COMMAND case P157_commands_e::c7dbin: # if P157_SCROLL_TEXT @@ -1053,6 +1096,32 @@ bool P157_data_struct::plugin_write_7dtext(const String& text) { return true; } +# if P157_EXTRA_FONTS + +bool P157_data_struct::plugin_write_7dfont(struct EventStruct *event, + const String & text) { + if (!P157_is7SegmentDisplay(displayModel)) { return false; } + + if (!text.isEmpty()) { + int32_t fontNr = P073_parse_7dfont(event, text); + # ifdef P157_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, strformat(F("P157 7dfont,%s -> %d"), parseString(text, 1).c_str(), fontNr)); + } + # endif // ifdef P157_DEBUG + + if ((fontNr >= 0) && (fontNr <= 3)) { + fontSet = fontNr; + P157_CFG_FONTSET = fontNr; + return true; + } + } + return false; +} + +# endif // if P157_EXTRA_FONTS + # if P157_7DBIN_COMMAND bool P157_data_struct::plugin_write_7dbin(const String& text, @@ -1088,10 +1157,22 @@ bool P157_data_struct::plugin_write_7dbin(const String& text, uint16_t i = 0; while (i < argValue.length()) { - uint16_t bitmap = ht16k33->getCharacterBitmap(argValue.charAt(i)); + uint16_t bitmap; + + # if P157_EXTRA_FONTS + + if (P157_is7SegmentDisplay(displayModel)) { + // Re-use the fonts from P073, but they use the MAX7219 layout, that has bits 0..6 reverted + bitmap = P073_revert7bits(P073_getFontChar(P073_mapCharToFontPosition(argValue.charAt(i), fontSet), fontSet)); + + } else + # endif // if P157_EXTRA_FONTS + { + bitmap = ht16k33->getCharacterBitmap(argValue.charAt(i)); + } if ((i < argValue.length()) && isPeriodChar(argValue.charAt(i + 1))) { - bitmap |= ((displayModel == P157_MODEL_4DGT) || (displayModel == P157_MODEL_8DGT)) ? SEG14_DP : SEG_DP; + bitmap |= P157_is7SegmentDisplay(displayModel) ? SEG_DP : SEG14_DP; ++i; } binData.push_back(bitmap); diff --git a/src/src/PluginStructs/P157_data_struct.h b/src/src/PluginStructs/P157_data_struct.h index 441813bbc3..f836b04e88 100644 --- a/src/src/PluginStructs/P157_data_struct.h +++ b/src/src/PluginStructs/P157_data_struct.h @@ -13,6 +13,7 @@ # define P157_CFG_SCROLLSPEED PCONFIG(3) # define P157_CFG_I2C_ADDRESS PCONFIG(4) # define P157_CFG_DISPLAYS PCONFIG(5) +# define P157_CFG_FONTSET PCONFIG(6) # define P157_CFG_FLAGS PCONFIG_ULONG(0) # define P157_DISP_MANUAL 0 @@ -38,9 +39,30 @@ # define P157_OPTION_SUPPRESS0 5 // Suppress leading zero on day/hour of Date/Time display # define P157_OPTION_BLINK_DOT 6 // Use dot on second digit for flashing instead of colon +# ifdef USES_P073 +# define P157_FEATURE_P073 1 // Use P073 shared functions and fonts when available +# else // ifdef USES_P073 +# define P157_FEATURE_P073 0 +# endif // ifdef USES_P073 + +# if P157_FEATURE_P073 // Use shared fonts and functions from P073 Display - 7-segment display when available +# include "../PluginStructs/P073_data_struct.h" +# endif // if P157_FEATURE_P073 + +# if P157_FEATURE_P073 +# if P073_EXTRA_FONTS +# define P157_EXTRA_FONTS 1 +# else // if P073_EXTRA_FONTS +# define P157_EXTRA_FONTS 0 +# endif // if P073_EXTRA_FONTS +# endif // if P157_FEATURE_P073 + # ifndef P157_7DDT_COMMAND # define P157_7DDT_COMMAND 1 // Enable 7ddt by default # endif // ifndef P157_7DDT_COMMAND +# ifndef P157_EXTRA_FONTS +# define P157_EXTRA_FONTS 1 // Enable extra fonts +# endif // ifndef P157_EXTRA_FONTS # ifndef P157_SCROLL_TEXT # define P157_SCROLL_TEXT 1 // Enable scrolling of 7dtext by default # endif // ifndef P157_SCROLL_TEXT @@ -56,6 +78,10 @@ # undef P157_7DDT_COMMAND // Optionally activate if .bin file space is problematic, remove the 7ddt command # define P157_7DDT_COMMAND 0 # endif // if P157_7DDT_COMMAND +# if P157_EXTRA_FONTS +# undef P157_EXTRA_FONTS // Optionally activate if .bin file space is problematic, remove the font selection and 7dfont command +# define P157_EXTRA_FONTS 0 +# endif // if P157_EXTRA_FONTS # if P157_SCROLL_TEXT # undef P157_SCROLL_TEXT // Optionally activate if .bin file space is problematic, remove the scrolling text feature # define P157_SCROLL_TEXT 0 @@ -76,7 +102,8 @@ uint8_t P157_getDefaultDigits(uint8_t displayModel, uint8_t digits = 0); void P157_display_output_selector(const __FlashStringHelper *id, int16_t value); -uint8_t P157_revert7bits(uint8_t character); +bool P157_is7SegmentDisplay(uint8_t model); +bool P157_is4DigitDisplay(uint8_t model); struct P157_data_struct : public PluginTaskData_base { public: @@ -156,6 +183,7 @@ struct P157_data_struct : public PluginTaskData_base { uint8_t output = 0; uint8_t brightness = 0; uint8_t displays = 4; + uint8_t fontSet = 0; bool timesep = false; bool shift = false; bool periods = false; @@ -204,6 +232,10 @@ struct P157_data_struct : public PluginTaskData_base { bool plugin_write_7dst(struct EventStruct *event); bool plugin_write_7dsd(struct EventStruct *event); bool plugin_write_7dtext(const String& text); + # if P157_EXTRA_FONTS + bool plugin_write_7dfont(struct EventStruct *event, + const String & text); + # endif // if P157_EXTRA_FONTS # if P157_7DBIN_COMMAND bool plugin_write_7dbin(const String& text, const uint8_t offset); diff --git a/src/src/PluginStructs/P165_data_struct.h b/src/src/PluginStructs/P165_data_struct.h index 7b7bdcbbc8..1754f7868c 100644 --- a/src/src/PluginStructs/P165_data_struct.h +++ b/src/src/PluginStructs/P165_data_struct.h @@ -26,11 +26,11 @@ # endif // if P165_FEATURE_P073 # if P165_FEATURE_P073 -# ifdef P073_EXTRA_FONTS // FIXME to use #if instead of #ifdef after P073 improvements from PR #5091 are merged +# if P073_EXTRA_FONTS # define P165_EXTRA_FONTS 1 -# else // ifdef P073_EXTRA_FONTS +# else // if P073_EXTRA_FONTS # define P165_EXTRA_FONTS 0 -# endif // ifdef P073_EXTRA_FONTS +# endif // if P073_EXTRA_FONTS # endif // if P165_FEATURE_P073 # ifndef P165_FEATURE_GROUPCOLOR From 2dacd1b4e9c11f85494fba1941508fbb52cfbaab Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sun, 24 May 2026 16:45:18 +0200 Subject: [PATCH 03/15] [Lib] Noiasca HT16K33 change fonts to have degree symbol instead of ^ like P073 fonts --- lib/NoiascaHt16k33/src/fonts/font14default.h | 2 +- lib/NoiascaHt16k33/src/fonts/font7legacy.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/NoiascaHt16k33/src/fonts/font14default.h b/lib/NoiascaHt16k33/src/fonts/font14default.h index 9377b7fdf4..b70141a6f1 100644 --- a/lib/NoiascaHt16k33/src/fonts/font14default.h +++ b/lib/NoiascaHt16k33/src/fonts/font14default.h @@ -82,7 +82,7 @@ const uint16_t charTable14 [] PROGMEM = { SEG14_A | SEG14_D | SEG14_E | SEG14_F, // [ 91 SEG14_K | SEG14_P, /* \ 92 backslash*/ SEG14_A | SEG14_B | SEG14_C | SEG14_D, // ] 93 - SEG14_F | SEG14_K, // ^ 94 + SEG14_A | SEG14_B | SEG14_H | SEG14_G | SEG14_F, // ^ 94 ESPEasy change: ° degree symbol, like P073 7-digit fonts SEG14_D, // _ 95 underscore SEG14_K, // ` 96 SEG14_D | SEG14_E | SEG14_G | SEG14_O, // a 97 diff --git a/lib/NoiascaHt16k33/src/fonts/font7legacy.h b/lib/NoiascaHt16k33/src/fonts/font7legacy.h index 7e707ad587..5275f90f04 100644 --- a/lib/NoiascaHt16k33/src/fonts/font7legacy.h +++ b/lib/NoiascaHt16k33/src/fonts/font7legacy.h @@ -82,7 +82,7 @@ const uint8_t charTable [] PROGMEM = { SEG_A | SEG_D | SEG_E | SEG_F, // [ 91 SEG_C | SEG_F | SEG_G, /* \ 92 backslash*/ SEG_A | SEG_B | SEG_C | SEG_D, // ] 93 - SEG_A, // ^ 94 + SEG_A | SEG_B | SEG_G | SEG_F, // ^ 94 ESPEasy change: ° degree symbol, like P073 7-digit fonts SEG_D, // _ 95 underscore SEG_B, // ` 96 SEG_C | SEG_D | SEG_E | SEG_G | SEG_DP, // a 97 From 8a611ae1238a8adba9c938db6b34c20b08991db4 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sun, 24 May 2026 21:50:10 +0200 Subject: [PATCH 04/15] [P157] Add documentation --- docs/source/Plugin/P157.rst | 179 ++++++++++++++++++ docs/source/Plugin/P157_14-segment-dp-map.png | Bin 0 -> 17158 bytes .../Plugin/P157_DeviceConfiguration.png | Bin 0 -> 43263 bytes .../Plugin/P157_DisplayOutputOptions.png | Bin 0 -> 26720 bytes .../source/Plugin/P157_DisplayTypeOptions.png | Bin 0 -> 18744 bytes docs/source/Plugin/P157_FontSetOptions.png | Bin 0 -> 13803 bytes docs/source/Plugin/P157_I2CAddressOptions.png | Bin 0 -> 42911 bytes docs/source/Plugin/P157_commands.repl | 119 ++++++++++++ docs/source/Plugin/_Plugin.rst | 1 + docs/source/Plugin/_plugin_categories.repl | 2 +- .../Plugin/_plugin_substitutions_p15x.repl | 14 ++ 11 files changed, 314 insertions(+), 1 deletion(-) create mode 100644 docs/source/Plugin/P157.rst create mode 100644 docs/source/Plugin/P157_14-segment-dp-map.png create mode 100644 docs/source/Plugin/P157_DeviceConfiguration.png create mode 100644 docs/source/Plugin/P157_DisplayOutputOptions.png create mode 100644 docs/source/Plugin/P157_DisplayTypeOptions.png create mode 100644 docs/source/Plugin/P157_FontSetOptions.png create mode 100644 docs/source/Plugin/P157_I2CAddressOptions.png create mode 100644 docs/source/Plugin/P157_commands.repl diff --git a/docs/source/Plugin/P157.rst b/docs/source/Plugin/P157.rst new file mode 100644 index 0000000000..86ab6992b2 --- /dev/null +++ b/docs/source/Plugin/P157.rst @@ -0,0 +1,179 @@ +.. include:: ../Plugin/_plugin_substitutions_p15x.repl +.. _P157_page: + +|P157_typename| +================================================== + +|P157_shortinfo| + +Plugin details +-------------- + +Type: |P157_type| + +Name: |P157_name| + +Status ESP32: |P157_status| + +Status ESP8266: |P157_status_lb| + +GitHub: |P157_github|_ + +Maintainer: |P157_maintainer| + +Used libraries: |P157_usedlibraries| + +Description +----------- + +The 14-/7-segment display plugin allows to display date, time, temperatures, numbers, text and self-created shapes on 14 segment LED displays, also supporting 7-segment displays, using a HT16K33 I2C driver. + +Up to 8 displays can be combined, and as these displays are available with 4 and 8 digits, up to 64 characters can be shown from a single plugin instance. + +For 14-segment displays a single font is available, and for 7-segment displays the 3 fonts available in P073 (when also included in the build) can be selected for presenting text on the display, where the character shapes are somewhat different. + +When text to be displayed can't fit on the width of the display, scrolling text can be used so longer messages are shown like a ticker-tape display. Scrolling is always from right to left, and optionally starts with an empty display, so text can be read as it scrolls in. + +Periods, comma's, colons and semicolons in text are always shown on the dots of the display, when available (all 14-segment, and most 7-segment, HT16K33 displays have a dot per digit). + +For temperature display commands, ``7dt,`` and ``7ddt,,``, the degree symbol after the temperature can be turned off so there's room for 1 more digit of temperature on the display. + +Configuration +^^^^^^^^^^^^^^ + +.. image:: P157_DeviceConfiguration.png + +* **Name**: In the Name field a unique name should be entered. + +* **Enabled**: When unchecked the plugin is not enabled. + +I2C options +^^^^^^^^^^^ + +* **I2C Address**: Select the address the chip is set for, available options: + +.. image:: P157_I2CAddressOptions.png + +The available settings here depend on the build and hardware configuration used. At least the **Force Slow I2C speed** option is available, but selections for the I2C Multiplexer can also be shown. For details see the :ref:`i2c-bus` page + + + +Device Settings +~~~~~~~~~~~~~~~ + +* **Display Type**: Select the type of display that's connected: + +.. image:: P157_DisplayTypeOptions.png + +* **Nr. of digits**: Up to 8 displays can be connected on the same I2C bus, or when using a multiplexer on the multiplexer channel. + +If a longer than the default size display is needed, multiple displays of the same type can be combined. They must have incremental I2C addresses. + +When multiple displays are connected, but the content must be set independent, multiple tasks can be configured, using the I2C address of the display for the next task. + +* **Display Output**: Here the type of output can be selected: + +.. image:: P157_DisplayOutputOptions.png + +*Manual*: The content can be set from rules by using the commands available (see below) + +*Clock 24h - Blink*: Displays the current time in 24h format, with a blinking colon or dot. + +*Clock 24h - No Blink*: Displays the current time in 24h format. + +*Clock 12h - Blink*: Displays the current time in 12h format, with a blinking colon or dot. + +*Clock 12h - No Blink*: Displays the current time in 12h format. + +*Date*: Displays the current date. + +*NB: Clock and Date outputs assume a time-source is available, f.e. the via NTP or External Time Source settings in Tools/Advanced, by connecting a GPS module, or via the ESPEasy P2P network.* + +The Clock and Date outputs are updated every second, and the blinking selections are 1 second on then 1 second off. + +Clock formats are shown in HH.MM format on 4 digit displays, and in HH.MM.SS format on displays with 8 or more available digits. Date is shown in DD MM format on 4 digit displays, and DD MM YYYY format on 8 digit and wider displays. + +* **Brightness**: The brightness level of the display can be set here. 0 is 'Default' brightness, 1..15 from low to high brightness. + +* **Font set**: Select the font set from this list: (Only available for 7-segment displays, and when plugin :ref:`P073_page` is also included in the build) + +.. image:: P157_FontSetOptions.png + +*Default*: The standard font. Includes digits 0..9, special characters: space, dash, degree (when using a ``^``), equal sign, slash, underscore and letters A..Z. Uppercase and lowercase characters are shown exactly the same, but as the possible shapes are quite limited, some can be somewhat hard to recognize at first. + +*Siekoo*: The character set as documented here `Fakoo.de: Siekoo alphabet `_ (See below for the extra special characters supported) + +*Siekoo with uppercase 'CHNORUX'*: This font is the same as the normal Siekoo character set, but supports uppercase versions for characters 'CHNORUX', even though they duplicate other characters in the set, they are somewhat better recognizable. + +*dSEG7*: the character set as documented here `Keshikan.net: dSEG7 `_ special characters: space, dash, degree (when using a ``^``), equal sign, slash, underscore and letters A..Z. (Again single-case, like the default font) + +**Siekoo**: + +.. image:: P073_SiekooSet.png + +The four marked characters, Ä, Ö, Ü and ß, are *not* included, as they can not reliably be sent to the unit because of conversion issues from ASCII/UTF-8/ISO charactersets. And they are possibly not often used, except in German, and some closely related, languages. + +**dSEG7**: + +.. image:: P073_dSEG7Set.png + +The ``^`` character is again used to display the degree symbol, and the degree symbol is not recognized! + +Options +^^^^^^^ + +* **Hide ° for Temperatures**: Will leave out the degree symbol from the display for temperature commands ``7dt,`` (and ``7ddt,,`` when available), allowing 1 more digit for actual temperature display. + +* **Suppress leading 0 on day/hour**: When enabled, will show the hours of the time and days of the date without a leading 0 when < 10. (Not available in all builds for size reasons) + +* **Scroll text > display width**: Normally the ``7dtext,`` and ``7dbin,...`` commands only show the left n characters the display can hold. This option enables the Scroll Text feature, that will scroll text sent using the ``7dtext`` command (or ``7dbin`` command when available) from right to left when the content is longer than the display can show at once. + +* **Scroll text in from right**: Normally the Scroll Text feature starts with the display filled with the left part of the text to scroll, with this option enabled, the display starts empty and the text is scrolled in from the right side of the display to the left, until all text is scrolled off. Then the scrolling restarts. + +* **Scroll speed (0.1 sec/step)**: Determines the speed of scrolling the text. Default value is 10, so 1 character per second. + +(The Scroll options and feature are not included in some builds for size reasons) + +* **Right align Temperature (7dt)**: By default the temperature display on 8 digit or wider displays, is shown right aligned on position 1..7. This option enabled right-aligns the temperature to position 8. + +Commands available +^^^^^^^^^^^^^^^^^^ + +.. include:: P157_commands.repl + +Bit to segment mapping for 7dbin command +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ``7dbin`` command allows to show any combination of segments on the display according to a (sequence of) bit pattern(s). + +14-segment +~~~~~~~~~~ + +.. image:: P157_14-segment-dp-map.png + +The mapping from bits to segments is ``0B(dp)ponmlkhgfedcba`` where the decimal point only takes 1 bit, of course + +7-segment +~~~~~~~~~ + +.. image:: P073_7Segments.png + +The mapping from bits to segments is: ``0Bhgfedcba`` + + +ESPEasy allows decimal, hexadecimal and binary notation for numbers. This makes creating the desired display pattern easy when using the binary notation (starting with ``0B`` or ``0b``). + +Switching on all horizontal segments for a 14-segment digit can be done by the command ``7dbin,0b11001001`` or ``7dbin,0b01001001`` for a 7-segment digit. This can also be entered in hexadecimal notation: ``7dbin,0xC9`` (14 segment) or ``7dbin,0x49`` (7-segment). + +Change log +---------- + +.. versionchanged:: 2.0 + ... + + |added| 2026-05-24: Initial release version. + + + + + diff --git a/docs/source/Plugin/P157_14-segment-dp-map.png b/docs/source/Plugin/P157_14-segment-dp-map.png new file mode 100644 index 0000000000000000000000000000000000000000..3f9822aca842a33c0d4e83c9086960849dd9262c GIT binary patch literal 17158 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Ý)BCbkyn+Q&rLl8`(Gtt5N6P>GC=?@6P4?$3 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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P157_DeviceConfiguration.png b/docs/source/Plugin/P157_DeviceConfiguration.png new file mode 100644 index 0000000000000000000000000000000000000000..cceb910af6bffa35ec848aa42ff0c11d74d46f6d GIT binary patch literal 43263 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

    9=>*96y9zGDe<>>~kI(fMjPI<^vv2_jWK+H| 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 b;1=79>gb{U%uCw47X>{Bzfh=@dlULUnefFT literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P157_DisplayTypeOptions.png b/docs/source/Plugin/P157_DisplayTypeOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..24891d1c6ed08620e5e767ec4a0192b23c1545d2 GIT binary patch literal 18744 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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P157_I2CAddressOptions.png b/docs/source/Plugin/P157_I2CAddressOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..059b2b270765ab6d753548d08bf72494ca6c3c15 GIT binary patch literal 42911 zcmZU)1yq~M_C6f66oNy5;!xbRKwG3FI4xS--5rX%26uNT?php*Q@prSin|l!&*?em zcklhaSu1(7k~fptGJ8L>_mfb$kK*X4uTTL10J@|ESOEZlhd#f)KtXe+w`2N=eE`bSy`1wt3M~JE;*vP@a-ptm~%*GmEU}|q; zWrU8($<4yf!@|kV$xFdZ!ND)U!zaMWiH<7z=VJ;PBNIIXR|*v~YeO3sbX16<92X~x zC@%*K2M;F&3x&9ijftfZ#osq0J`L&u02Ba8u!zzZ?SnQI7ZUN<$B4?)M>glNBYuH% zS4SR|7Ov8mYaAN++*Ys@o@6Kyf-{BymColWYU@2i>E-C(JKzITnJpYXP zqQa`8!omh~ULGDuXlQ7i`?dAm?=%~w5+{b%EJ;a8ZZ57(&%mG4)9`<$vr@Ly*Y~?R zT9!UMJajx<;7QHMP%fS+IPq$zub*J+xc?9r7q_CKCM)~H02OL(ZqCFD#)Au6Ava1e zZ$s-W!WQGHpZohK^+orHup!5o)l&5UaM6tcQ?Y_I)XD?#ar=gR-I` z)cT*vWL}*-qLeBTL%w)FuPHaJJ2y3TAxu_JzCNblSrE`79_ab~&z7jrk_hH!G3)0* z_@Lmc$B2!`hNPgS7qw3x?d4y8Fu@1OQ+G#LU#T!41O+ykT7j_#Ch4@Nm8BMJgjH)^zB|qzS zLC1L5zn6l7L$}saqB?u$S?DUx#`O))5ZP$Yo7S$nba*cIGK^t5S&M6=Q?@gGuk9PuiEXr>6CUK4{Af= z`Boh&pH{GoZLf@M5Sd>QKESkzUpm3o!Q!O1K0p1+N@WaVAfwU`6EI0xtGxLdT@KW$ zmzFOL=jk;OZTWY9=?Z^{|AA(@ez#%?C|$3JU+vfdNsymxeT zMcQ9Y`qud-lIeL1^)@7Q<-Wj3a+H-h2jhCiNL#GLe?d9ww&KVpM3zO!v=dalfG<>> zUH$N)4ST{T!~`tF?5r(ob^h0qQTmME7n`E7V)!5ySc;y-JK^CLdGr&su$ED%UTAf^ zUV9n2!Ga;fu{PqQg>v$)^Y_({cstmJP24KE&3ldo+;SORLp$C*q1TDI@7=FLI-VX@ zpJcVPv~o6Y!VUNuZC2YuEdKI;{Y6yW2{ifA=--!JIZtH1>_K_({-6PmONr3loT%Iz zEcvX^!XUj#3uuOl;-W``an;TvS-igUAm+P@O~IY>58*0as%JxsA1m)|@ym(;Bn947 zV=uz5&&ke(wQO739+AB<5l^F|M2uP=TEVIpiSEdhZa3slr{t8n-(3daAlu2XSAV;g zr7AGB3I|1fOc(j)otcS_(rDZr2B~vG+}PuVlOYVqEcQW*dmPG4EM+5p>QsGhZl3mI z1_vZsg#Za;V_OQSXI2fzDR3NK9hG2t3DPpNT5X2pT8La@Mv8s&j5u;J6oMR&g=}M= z%J>1s+&c=oHzp@fCIZUop7uK)r5CQVo^G?KJo-3X>Lz0T_CgRdvM&|$3=cF7u72Fx z=N&4Xrtb7Ozx4thN`}Js<@TMbowmkG^j}LoPJ--{L=Ua03&u6|fxRa;4Mis)e1TT1 zUjt|yWbZLm!;!+qsjN`GdDpoI!8*AzCrSyc2&GI!ugEM2)GoBI58&AaqEX=R@(y(> z{=}wCB2b=hZZaF{PPOW`K{_-XkO z!Zu7j%QR--Csj76J!X6HZc-8Ec%bU?zF1mFT?b^HUSZ?{XjAG5j^Mb0f}qwgcR;q9MBj5fu@U+uv1E% zkeF}pXlb#Pp$3TA%@_PD5D|?S{x$Cd5kR18LbQ~ELJje|-y*1(Le+tZk(m_wRO9JhX z6Te6m>orHuDCDHi9B_`j+2ta$?m3n*k^=2_ZL{L^C`GO9-zNLXbRA&7uW9&d2-6dt zD>Uxf2m*T{dR|U{XNE)+s5JSo$%xp_(pD}6-OP+)FHqv@ffMM#ijKfT%%Y`3 z$Zv99eypWWrKH#jS%a1N!{`? z4uW>x+K_lHppVw&tH80 zh_f_6{v_i1f(0pEyN4k(-Z6RjA#ESDaVp^!4kN&s>s8Ai8!A3$2t|!*tB07fT-dlj>Wv$Hq!32vnMrfY* zr~Ma$bXi48#8O{uP9L8^4dl(=q7!@BK6T74D3zcyw01lrk3Wg>S>Pa)i0c=s1q<}u zu+qXp(DMHeA^bD_vzDz4{}QS9A6-6!3v+7eKZg28Qaq3{vD*JAlS;KrJ*23#gE3o% z+qEL1u3yQOLGx;OrC)xmce>y$w>X;PgnPQvslbHhaq@A~1flW@+F3t|i-uu}=`2L$ zz&ZKc@fgFC$d>in(joBbY2Iir+?46=`p)wEt;wk;PyT;{n&BXb?|Xu#=aes9I~^q! z2>AYt08YMih^sh$v0LMMmH#q3=2{(1*V?wWlUSY=Ir}bPp8&3Ft8-%#wxjkd5VA;K zVR9+cUK#r*OZ)?#tX!)I0jQN~Ri`BGAR-Beo*>_TiK6ol(p8Ab9?|$jL>IGqdOuUi z;UCyZ5FMZpwB>75zxm!h9T{&T=Jp1qRh3Wwqmp;3;qU@DW?a!5;A5(xISEY)8I*7q z^l?9taTd0@fT)x!B#|N{$TabEB0Z`lw3NJci-2hp%+uSnG6YZ!ml+ms;M#Drzul3B zy~w{qc(5I6hH>MRP~V4a%&PyrZ~ieyA`(=dVl*u*GCb^7al{%)Y&_SeKR2e<^bm~! z1=Kdnh6M7@vyj(YD9ENSdsFku?}JK5vH|O=rN(mm%^jU?i11n)JWL1$)U(OQq?qftL)#K%>kuiQ+36+ed=^~>z72Ke$``gpW8Dm<$rBcaDtqJU zP(sdM5n6M{_$j6y5H)8)nLp>Uch^oO#FGF5pw@?D}wu znVau-&Ab9p_rbgEV?%-?O#%35LD@XPy%1sSu=yaLyS!UGI6K~0B1;Zkjtv0~>mO85 z=uP|3--t8jIUZAe+8K>Px4|aTj%aO!q_VivrBfZ=!6kb*q3?`1Fmq?xI*P2+boAJ56ft0+3 zR|EIdm}_?AUo(sOetXVPKARSle_#Q~53>DYv2(z{?LPT(2mAe*M5GV~a(_p6_jRLH z?3L@n5lO9^_Q`(5n~luOtL*Y9a@WYfA@@k}QzL4CilIN?hDmvA4vTqa`_Dp(V=2fyW>HvG(0q674r+-{=D1iuJhAFqCep`q1Ld}CWBKRFHd zSb^);T~n7%32KSTK{rKP2x!QOm~>9E9WjIT1Y<}DjN_w|B+*Y%QIGMzIZ1Kfcr5fT zki|Z%>(7sfv0pf5+U`7&T6kLeg`|r);_e~0$oDLRB^1zg;_~LgRk;6p*;C80>imN- z*7OY?u5b=O^<3*1i8<}#b(eg!AKVWXa@Du}9^(Y_CM%C9XEf|JJ4Y@m>H=rC&Fyb> z??B1)bDKqU{zB#2gyqf zB-gx;_9JLypRCkDhsdwt^9jwjk0lq6mzsM%q@7-4EN>ZHHyvL8-Y$4R_JY&W`x1`W zU*&PFVmPlZmWRo9FGuTlr{aD)h zU}9j$iNO`^+G&F?>&-?dweVcw3MCynNs&(-N9T^Ok36A1oI7BSIBqHErS&%7^=Xk= z=>&a5ZpNnRHll36_tjh1@TjOzas!WLKJu*AE{c(HJ{PF(ekMXV#=(NK1Tn(h)DV!v zc5rG{>~UX)XpwDY6D~G{F*k1qsyqLOgEgYw-z4H9l^I$_=@X>r3OxRXgzTj5- z0~Px5^+9t_GI%qQP)!u?hz)*$XQK9|UFz>JXcrPdDeLC#oAdiB-Dl(b9M3laJ_!U* z&*|AIY0oy#=~W?Nf6*St%U9VJe%9vTzD#igY?(c%YsBpp% z5>f&kTH3FssPgZ@`+z7Q>q&pzm>E>k=mkUiikSKw92@cbO+iS$!(LxLV0CAwsPlT@ zgdII6s##0r4pvO=8R2}k&4jQt>o2DZ~hOT37{wSeX{iRhJ0ci0N{)?-#u;)rlQ~gveto_wLdi-RmWS5zI;Kyt>*h)Jv91s_&a!4|cAzghm?P z37&VNfr$N(Y?=}Wl`NIy;DQB&p36!XLwFNDWf9Pu!hjGaiZH!8C7W?*HN7w?^W%pc zT76v&=HcP=#Drvq*7Ef7a!)&Z`XyHpI(s;}juDEO66Qq9KF*IcN2=&pKXI5PaoY!V z!Wa(W+CY{U(bhRuJBppy{u2WySm;1aJ@x~W=);1{BkR4rgM18Y4Gj&Zdi%E;6WfzB z7<<1QwC+hhY@96vJKqC_nSk**VbQJ8FI@3+~AXgb77sZ11{Ul)qtP* z?+B(=DalW@hFUVK50m8DM!6tak{y9#gSV2MoVi8Rz>fR$JJ=1;g~A&TBHfS<0VxCA zH{YWc2{&}7_Gk+#CVDTe(_Vp;)3pC2C6E>1iYh4-NUWVb8yGJ8eEQr?tkFIA7v54C^q!PQ7P9t zFHeG)+VdSw31& zVMF5H-d=G|PRuLfw4&-zPuvhg35yrPSL^|lHT@?jCIvlry)MCeKwRUqTq_7)={ul;Dir!g$;|goVj^;?a5~yh%Jf}7u7XX#GNip zZ4eq8V-|SCV~gI zyfkh#Nw;19n;1`w9@=iR0Q+^5-Dzsi-zeBidb1BfSP-Pw=UjWHc_6QjS82CuRXQxs z&R+2dhup`3ylR#TiN}j8ijMTci)3YFtI+w+S)hS0Wv+((lZ*9ozFAO3ssF?D)QZ#( zAai{}f|9blB+t)!Age5p>2UhzPpioSp9HUa$hV~Rf)=O40$sU9#B-l@`@$;8DpJPTQ6>nP#b}7R-MJ z8GKpUVRL7z$ScQxwqcbzV0xh>&^yv!553-Jy zSsd?|HfTQ|5&tdmZjk8(?cKls=IIb*9j=qN{;0iYX_gzr7?h+C#QfO^g8$SxD=kHU z1qj(emIF{Ns23#+zj;H68e~f7FYB2R8Y`J!)(0NOT1JE1G+D-lCa2(WP#FUWNdf4> zcx&iR6pRBKZhJ%}sYD+H-0uiuW$u(|%OuPll9BJ+i)zbLUYVB`=avP8K~amdDYDMa z(Qa%g@j)PYd2A&a$bEBFRWd46s;DSArv}d!Ii$>ZybPbOqTJUU%tOgPF~k_u#CRKC zL?c|0LRnnfl63b1+3aSIC#8rps5(m}*mMom-_qr)Pa=SdDou|1+QHL*DKD(6xU4Qd z3<@pC2rS#!z(HQNFVWR4+p_oRbq-?7x3UEwAM_r_`K;UdqAryr+?E8gC9sJ zV!f*d$&CuaV+{`%HRUIxhN04vkD;)SJ!s8#k2OTWtSXq&R41rMg4EwgG|#s`NX!T5FU><`Nn`J+ zXGe+8p&1{4&Qre>1PZFj^m0QwwZCheb5IbYCv=wG{DN*XH;%w5_Tecen+WK4BHn zOIhHQ)_YE5o4LZWU@N8S+S=uO?HGIH*HomDMO6O86m>PZ=~DA!AKG;US3gk@_zbfv zYpX$cE|+Er-wp}yg{zQs@kz^I*crQg`ZNqqeHru^lfyK<_#=C6#8chB$cX>?y}ug6 z+8kI5&g%DVQx-0w9Fi(Q)$xIW7wa|6{g1*W5_)mGJ&mI=%OmLv3yfyKpDbRO){ z+9<*=00bMVWLvgcYMP%wPe1g$p@giZ#J6pG%^&<{`^@z3Xn*im-N@+|E*=H zskSo3Y0!#`n^t{=F1#YtjmFp_zlrVEXJleA@eyVGCO`Q#`Q4a>N>)tq3H9eNy`TQMB7^RvjAOm+Uj=LAKng{tiw9m-bW^S}uJ#F)2-8E7{y@@EQ;UUcCuiTc2y(~FCsuV1Q{0*hZ zRKbST&;{cCV$kOAuCwfZpRN+)vgb;>%tUNC$bKcE{w7_FwM4RMlv z#wN>jai7><8nPoo%cqwNsX`@sXFt?C#g>#8mBrg7gzQm1gg;`-;T1KQnTGE>=wdUN zjszqQP#G62s*NNsztd9~_kZvhn-ME1EzX|YfJfH7>GS!0A^Hl2w0dL1=>5sRlISX> z0O1M{aG-Hda|NT)YX9CI#%fQlnGYRDxm z-{aiKncr!;^>jpaUZH5XQUZ;`(%BG*o4bl6TI5;SLn3$v_P?iDk{L8Tl^;OA<-BoeP5-(4a z(CIVZikpn3=WylLIzGbp;31f}ea-|Am=n1P7-|+oFzcrzw_EQWnATRQ(#0r+V}EZF z48LUB6zl_&|QO zZ~X<=J520IC|pxmbw09phCIq5Um(bls*XgvP$9&Ozrl(>8+@m zqUUoMOW;bzM~lY8*Y_aqYoH8EmQN9JB z{3#}X@S?LYnC49@ftPH_wxYv~_3lY?V{x>=ZT>!P|8fB?CXm9niNZ%kws$uQz67y= zL1>6>dn^MO`e%dnrQCj}@hWb`Xa=CPG$8YgF0XCEP1H+f8k*z_-|7IP`?e1N?1{dU z*RQTEO}V&8qzNgz=`C0m0w;|!zQ4@R$(Uc480O+j0?CV5H{>TEfpCd_;cV>MzeB^G z0t@rsEp+Oq%D$(gQ_~Ia7&zJ9QIJSttzo4|{W2kjZ^xXu!L})Yt1R;pf-fueieU$M z!KAS2>KY#``R*Rm=PnUrZ;w1bruyYKN(&ZvP_;%>_l6kze|8BPONPVs49O2&&>_31 zipv`(ecv70{B(`twv6?%mL$D{u(AY~f=Y3P_QT|Q&EP?n}lhlmIlUqT`ge;Q_dGJd&KIYo^{=Vuy%G^v9L(i_O22e^u z_YggHu49aWAw&e4I$7)K@N(>S^DZ+lUHF89{Kvigt$b9P+P;q3u+Xb&hA4r&}@ zrIt;CYw_*v4G|T~*rfr`gjeCPFBtI!Askeq7GZA^8@mt7Pll*Axz{$Ot1~k(m3gAC zN+Dc9MoNgEVII{$06PV7C#^b6E&1Lr6vD|60>gQDxvr)QFHc0v$|I-fPH+jd?HHWo z$6($|?v2p@5ADI2V5|Mpxr_DG(g>bxWW?ma8bE7zw_v5hdfx1p)Dr*!vnS<1$0I?+ zP$JQ2_t5+eb{{fxtpa{3c7&rnQoz<{L{zwdOU@hwE+6Uu8pqTT9Uplu(!@%R+8k;2 zv{ww)V5-CLHIOjmi2|KEl~%ehIRjFGMuCnxpf5=tUdj!1m>odGVLnw@FEdaLa(t7G zSFA$~zLu&E!03T8KT&m?kRaIV50Z9L8^cluDFGkDyO_b>6=@rFnYVCI##6M zM-Z)3jbNB;QQD`O1gMQS8#hzcD#d7R<6tXd=YFNRe@7`8`MBkRu=#GW>R=qJLkCxp z+w&Z>92&yBXSs9vOi%egzRC43j;kOqVYG9X-O(l4RJbpC9opf+#QIo7?NWJp298=+ z{_T{~wKCd`Xo8p*ib9|<>wZ2l885gS9+Z0?9%`K5WqETSNdY9Yx#OzYub^56)y4zN z7|VTf0ln35k?ZxZ_OY}Og!P6+=64O^^?)q}BLhzp)fvkXgD>N}5;*+c*I?uqS3+pF z24=i#+9?yuIEH6*on1WN8^0$0SsQI{V`&=8gH;XEcfb{VO9AB}jA89x@G~y&Vl;V2 zNt>lhQZU6kk8B%MSZ#87$?+|SXi??P=+wThw0V9c+?lpzpnL5kX1^;j;JuF%v+ByQ z+?+oPY6i>Gf&On^^!MC;8CDfs$@&?Pb8KXO2ig+GcqjE_Ttv+*RC&bQeuNWuBA9rE(0G-fC-jFO# zw55vU5YrlPyd8$1i*uSD(rn-E9iGsXM&s^L+X)6MDs+GKGa~eqO+iyrQ-ZDUMSLjj zSbdC}uX7!^`F9}c^u~KKS(djuflUMqEAHw4$KF{g3UqG8I>4-eu8i)?7SD+NU2!=Y z#C_!Ox(Fd#(qV^*t{Uos9Z_Sd_vc_l?f`@#>&c}hlI7G|jlt#Q?9gfpV1g(&im9P+ zT!v=0cD{uBVFj~_sjlsF7JjyYZoYF`MqlRV%_20>nk&{MeAX~iN-1#N~#7NJ;V`=RL_{0Jrh;l zman>W_&yYOz=y!{i}dodDrKtctSKD?J|W#ZT&VZ3HLvlirHPICcIKNZU49VK@f)ZE z!VWPppjDNmMQKKjnVB{BgG^DEKq8OoeR@tuy{xl~$kQ;PGMu|`o7y`q=gpX9%d&&3 zK-DTOXX`FdSjHDGXL9Qct*Chs?BwbQ>Zl$OqKnIahTxeTV zp!IycJv!w_&Mx_^^N-DTva5lqFZpDYCzv) zf~(_Hbc=?=!a^bZeqeS%I*SDOp6ENNgS#>2^tBRf>gWWC1~*Vpx%FbClla> zFs&X~5hzsn^uv(+g4qAvnoG#j#;dXf{=W95s^|z8E3d9d6_3|w_QARne}I<;8S^Ww z^A8!qpRsmWaXK#iUoEN{{SDEVlWW)jeXdbYT@mz7!7iUraw+%%n z)C~-eA{WBZ^{{;sWC1uL3IKx7>#C}rdu!B_=faLpf=|g~!8zE`yj&5a;KDM(9b=iW zn?k^LdMLd5I_yWwEAhxOf>jgC)R`E54!c({SJ%#$_X2X!qxGPoc0eT^Va*pyp)r~6XZK+Q{#SrHq=zcg%nCblBuIMJDj@CDn*a*rP? z-}2YE#@7}yUrBNRG6Tv6i5wW_*E!}#wHGxB>hRl3iP(AZ#8dK5=Nj5m$?g??ns-l# zEhh8D^@bfW2$Sqx{4w7n;b#BMah|vbaGN=vqQ)gjWH&OeWnCg4R}WzXAV7fC2JG6= z@+}&7666RElcS?DDI|mASfr(%B14d*O(mEh6HZ?mZW!D<(i%`s>_U@Qa)@9c51R=+ z-~j7rd8MMzQM?e2kR&q2y`}+>SUFI5P%iOG5@^`+!b=eAOt6M-NUic)U0x*I=)(}k zNv6p?thJ9^7KQ5~T8Grb0peg77DK|$N>d8^>li8F9jhsu&tE`i@2t~IaE>$<2`0U- zS{pI7tX%Fvl3FLdt#sHACL*VyoudsR^dJZ{Omk&?1$%AwhKmBs?cEzoCyti$9BRoR~XMUj)-`<^?h+HGz z;cJ2rpqK32$WxQ`&MMwO{!TPA3R6wxfb>x zZAnF9WPhql{Gp`~sRr;1jZ{eF$^SZyrt1726G#))noZ>T!+^N_`PisVro5q9NaoGA*?`2I%xsHa0YB-4vA$mI~_-)=Z>uzJ~GYXUv zDQY?3vw)XkJ@+3TO#?e~m@8#J8!8_th%(8;2>w@_F^6kq6xFH|RP&gLAhzRRXsb;e zk7etX&N3Wo0%ni8?!{01WhkI=`?XF>79*|oYYhw4a6+`5a&bJ;rdD+l_#}1fdR;r- zurX;ffAfFnG4HBSKo?J@#1K4GzRIxZUHYff4jDamwD2?ji4MY(D~~O=)#;hGXHUtC z7(`2+TW1!toid6H^?uPAqepO~vR<&Dk z%-&m-j)Dt^>sKx@nK*l1G(2L@>hidWFDIhQ%JI>DYZZRkU#bIq1FEJw<>ps3h-D<> z(wvp3JFP!lwofr8FqSoC558plc^Bgn8*cvIe7*{$*%-;4u8Ob<{nwvug25L+K$&{V$)nq6rzo^0LIlM3i+^3yZXP5jFbU z$Y(6PsUkdYqCn^5>@4^7x@mEYchf||KD^#=wbklsXoetXfb&sc_QMWZg8Ah$^JZb- zKbp})u`K-k+xVGNmfzQhY+h9P_1ib~lJer5)W2F|yd_=N>Vn!T;+L126~4o7cut*u zyX8qVg)@F_)m;64-P^Xz*-yQ1eKmW|94jDaGB@USRe&KFdQ-dj#!U3r1GVAe%CEYV zN;A{Wdg++9z8P#a7vV+a5+}yL4%VO*o#VIV3dP-FTyn;11?^}F3(Q+C@B7?BWDQMxAs3rh~pRcU@*yeCuCVH$q60tN12JgpGYz4?Ew__6c*hffg*p#{JYq}%wUI9at6qWH{A zF*CEzyF~FZDUf;o=6IFP6IGzC<64*q1ERYRMPvFv20{=BgGEz0o|uotNR^3!!+RKz zzlB@@RBfi1gp({Ca3|v5M%>fXRnh9TD%TZe))PXTA6p_B8Xe6oW2R5Dw?C)yC_T9~ z&X%KyhDqzH4r9S6)gu51}L0N^tx2*`)Y08}*=|3I|z=XE};Ymw}6;ZGS*KkhK(=fzruxaI^ZI4YfJBV$wX=X!{HW?@x zQWPd98Mv5&?av8)074;rQic^WfTC8C8f>1>l6i@=^JVy4VNf<>7A4D@B>SA!cSB=r zx^t+a2`wvf8PE*+5@HF*D=RxO2W6z&xfN-Mlag$I)&0nY*R)ziKd>zqdD*D za*Fs6t0J)inOViYC+x2`{Dv>9>9pFjS`NqkJESaC7%Geg-lw{OWvnPsRxJejD|!a#cd_l$30 zmai)TYxt2%35lr1!#^}V~UPv-|YmP50Xz0>rPoRb2xZ@ z)KLb*eZC(;7~%ZIL1Jt&&-?YYqJlnrFPEiuE1*g6)Am>fCY-Yb-)NQR`UVZMqAvVMwK@$p%kB^rb9At>!fNu{EmqBLj#6n1<_81#M>G}NOomRVJj2={P@14)k zOiHH{EuA7Ng~H?-u#gDA7sn~4B|&Z?r4_QUp6R24+l(fTEd5$pbEK07ySL5|x!2)h zd(gn~*V=L2(`?(pB3qryYGvKiwZG%99XsTW+NH>0JVo$EB#Y@+Ka zLc7z0agO(M@^=Wjo*`X#Ym@?CPIOg+G1TTB{Uhx=NVm@bN43BNAMsGrn#xc~$qhD& z$r}q8+Z0Osa24P}obj4V8t|4X)+{fjIKH0i;cC;&I_dUT!ZZ zEj!z7u-(oa>H`8%QkcVUVB_YeE9j!@-LzyV_!ZwfnHQMsmPd=?9rvxl&JL^hbq;ig z_c5@+f((y?uUbnsLR_}T%i-qUwth-xFK6?gvSup1z2U_0g%LX?4v!d)OKE!a&6?vbDC;K8L>1W>Q zpAKI^SUH~zr=7w$lIwhYW~?y5SY~csu=iI_q2pX~7t625?GHiiw|zT{HgHO-Q`Z1- z;qgx`NF?5mMr?;hC<~3pDt8H#_D_$iyVnRWcE{JLFZ$&>S6>P+uoKM;#vxgU|G1$h;BE1|oHj1Mj13#?)deLr=|fUs^g?uT3URDc%|f5XV-Pwf$6A~xBab`sY}y}F+nq0D zZ_ZV8ynDO1ZKy8L5hfZ}JwGkF5GF63*UBEFq6F4^3w2s#`OIc6Be!;AH)mW-eQGhC zwFcnp;>pz~tw-#yTX+lU3QGdw)(;7M7C*Kh1(W|;SO)5KJbHyZ@_B`gYFBk8>rJjO zNCLlaf1Kh#-e_y_&OUCxOBa0jg64VC_2Q!I1^J{nxlO^C;8Se-AN#1+m1uf$e7@=RF=m*w$<&4sN2&6=1$x7O5XJfj~jvaEexi49jqak z8znT)D13KIpku#krv<;dNYpO-%NZ6)YClFk7o4&2M0O-}l?6L7xnHggc0OL{_3YVR zXS*~18lm}k5f{T$)9gT(o8m63lg{^}Gg)}hEG0fpMWVN0eJ6K>1oMlCQb~d7pDGgk zo98Ohpx-+5RK9&oVK|Z?@k`dun(!c=Bsq!qca#3323jL0t-X=C-HD zV4xT|7on%vqM$hU;oDH~BL#&C1#*@*fDkSktJu)=?(@-kJ$R@6aY%Tlan*}ycl{VU zq82OAk(I*!+B)B(x#G}+Wufj+5$;XrT#}Br^jqhnLeCD;Tm!nX@muMa@vk@O73mpH zIkos4Vk5~GJ_$Y5WwhUJDBj)lT<}mEiQ=TOme{ybRO<|brk+qH~ zY>gzEn=C6 z$fDq)6uEaDq;of;aaEtfEkoP$QrT^5OJyfPMY~{D+d$Y2rsej85JV+Ru=XOFI(rkD zSUd|Y-U@+_l9aio6G3;g20(`!3R?-!xzAj@x>SJ=&GPsjeRuSBDY0=k!(}xOQ)odd z%lqN|;ZkiB1_}R1@5~m7Q%-rBP#j#=30HFF8giR9Nt^aAw{sS^ZBlC(>=+H;4WKY2 zUv=|eKmMt*^HW9Jm|O?jTgUT|=jxK@5m^0H*-HD^aTj)bgkq%a?GFpcIXiR#a<{*z zdIUuOuzjGc>opw)E!1pL2c1Oi=0y>GgJdOl08_}VMEJoX6M`VY%{!I`GQq1y*hlcW z=v_$81JtI$LFZoT#Ur1j2`jCflpF6BzV1P8VXiXM?3wOFXDnu+rtS8h|6-VGQbL4TBQVW)~14F~FQdX9`h z$EBo2y>o`~tS@pUl@~jE;bR~`v0VAwtzaf0J3P0C2 zcrwucZ1DS8>4RCJ$E3&8jxz7ZxX0syq#Yf$4jHx%cnQOo?40k~hqiS5ff53-^wfKs zZmar5NZjyJF(sfc9><=@5MnayylT8Rz1{ zA_Ew_rRK|v*0vO}c3knwJ*CU3LCoJg!dHINvzMzoJ(o(9s_O%|FI;l)isFzTCVhKZ z$j9A%>Sjq*?_WHOJ>9eIlfy&VG*s_9eIcD|pTPq%jw7Afa3Y~p0_?kf5bFFoSvS|T zeB+Lq-8nYX#jhGPj5kLbHskw1N46)l=(|^Km!q(YQxly@7a+9bo1Q!sG-eH`?9BCg$#g%W7dGv!Uc3p}bhV>XHgtqIg5nNG{_J_JdC$~+OxS+@HlA;Fb8Kh6aC>t~7 zA-wua8Kha)NPQo2!{Nl!R~ci(<6$G@YIU18a$Gg+>>)>2?AAq{gp83@O z*!KOgt=lJP?l=0;zg&Q#l|@ zI9FADA8GU%t7Ok3tS#m6?X6g+-^AkBywTu7fH5ugL^|L}0Hf5t2P7RICik+zRV4qg zq|5X;SqI(yni|{PKlaXl5A*s;-OqtWINX=aa;>0PuV_zg5$EOc) z5Ke?=g}u7+Vn=T&SN4{QD&*8hBU-94MqWHijq)&3g7Hz*aB}yv&xhGxAQ{uH15>V) zUetCjKJOrj15hVB!e*MyxP=b{%>Q)!9Iw2o{DwPGR6WpbN7shf&4s52QkL5ehi%OI zKM74e`it*Q&qL#*V@2k3h$hy#>z=VSzxuzG$hx|hOwvdYdeCh`~& zE|+=8bEc8L(I=gG=)pf_@ILRh#UL0?n3>MMC|gFZYm!~n?RVO7^Zmz#dSWzr1Jb^> z8rw^<5&eeYR$a5?Ebm8%a}dY&kGsGYmlPUZuXxx&HaR=)E9p5t>7j##ANIzgT)JL8 z>ANIcX!tS(j|y=Hwe;Q14szcARW@(o$q+x&;NPj z`}>72{Fu$YW?y@)YpwG&iZzhq+10^3JCxdZgJy4d902dq^QJlrY-V*kM{#}4vwC?2)rplfQ_6B3X8%oM)RbG1AK zxE*YNa9KH47I3_U=te1;ycx)c%)0X@IaSv%(6OXEXVcHFDN-CAqeI{3v$?wBqM3q| z?ZTTw(DbV6U##%7(qa9E{V-auzRZI_AHP{HFZrT*Rk7x`5k0I>`?M=oz0TIS2){LOwrYaYOI@XLl?YKnr$j&h_YMKxI$Sx9;)+BgU zk)vFJw6z}Ece92Z(qlPleGn10e*zAnrjCv{&(t3^7ehZB(}E%u6(KXw)8C>G*BvFb z2*uoc)Ryp1Zp!?@8CnYC;cIThgp7l5_a8REu<}!rr!_3%?Ny2WJD<#9!!!Y#Ecad; zj4+m+N(t)WpBk<{kH1K3>XsO1wU0j8JiXQdt{!37uvj$ob?e)-xlaae#&siQ_9>+2 zi;kqeXPMb#6?`3giiKHHS@{_g^ORxwa6KLl_c;7z`F$-J262-Lz(uO4wjQX$TTi7l zio(eQ0Z8Vb=L&0Bm|v$lq@_RN{~@^y6T$R%SbRUt8!lO-n8oSqe@*ky?$7qnx`#;K z4>Zqjin2x%aep~Ua3Yh*-uqmGZ5J<5eIFLxZsQEk&CLbhq75U1GG|aXXTnt%sEN0o z-fnZ;w1PzZ`7337yxF53VXnfGQ)i%qs=UJnAm3kfhp6lt9 z`N8kA;mwRA+Rg-0hKE_>a={>m+q^i;2uS!fL8S@OUv3R4)%b4OO=}V`7DpZmn5dN%ylYkFCLZMF1XAGjE%S^GS zr>8F|Ap=~?XC&Ld^oe3x_J#)5o8>YjuVdB>Q_gk}6-&Frp*|;v<-m8qylRAixwtrc zU;y(`XLwn*B)?ec{ue5@S?=O7i>}FGoaOF_%c1=+X$~&uhR7ecWb1S{0aM@r*y+3b zA|1JJ3U*fca&csUFwd-{=+lo%m^l4FBl(&%hn@@i!||G8t@ViB?M1`idL4#j2jcS-(%c4W2+0@Bv46yfHFj^NArMJ5v|M$U z?Q;5vEl8mCz=SYape^FKTTlNZDC@v{QWXx!NR$7-JK(+3#eaJ?i6L;=2Nw9`7>$lI z-YG5}nw72UpILB5y!Of~xfd_h^o4M2)(7DD(J7=+bYMt@|4&%1?<2y}RH4G6nnp-u ze1P3n7+;((Ntl)N-*(nVaq(+e6z+lBNI)qjlR4Z0tB>jW0agU`gEN#`rJRp3OtN)ol%ad^(kJ}$(D#(rN~T}>jmGjoqDX- zefRs+u>r71<21MUC8zi$p^22tKy{Uv{UtnqVIt0H#Pm(V_6u==6^bjDIi`m{R9Pf` zm)O|YOjFf$o`#N>Y=DN2XG%}e|GSAmMo#{d#hLawmFdSko$sS2VM54ViIRTrbemgU zh4XBLUxZSMic=aK;WwLMk5?_V3K^psf{Ut~RR zg4NVOVlGlR2Xo<>+c_t~r%m6~n8yl3B&G_9|Jx+8wzPcFky_F;tBj8TIx+d!8TTLQ zf6lUo6g{=}|&BimMEb5;emfMBhwBi*j}5_JzZn{KQ)7G(DYJFcCO?TwK-gTO!UXuAYwIKg+`}la*f49s! zHBR7ub*QUSqE`A<+TRB88xMbk0XlCk|Mc-n=3+m>`*;Odf@pBc{8QKNx)T%?t(g0y zt)=yB=keiA#Pdm~5L07etuJeK$B)f9@9I3) zgS$d;sUuoDG7N?FnvfpJo5l#Q)_>yvd+mRFQCCZC-lg)i_9kNi5_~U_V69J-suG$D z6Ge*e3sg!patS+)?js3^iHXO#4#M}Fcvb#_s*1{H?fHEUNiV%(s`y;)BOTAXVu+R< z^DMlD`X(aV>znt&-7>7oKV4m29?X}@zr6C0;Nup6Z-+=6`H!gi_56j2&0+pWf+g^` zc-A!&d6HucYi=ZVQ;NLvCICdKxj0xO&{*iFw5Eq(hjRE9tw=9GZEDwg_Nc;Y5tGYf zYjbn^cexHyEDm>bz!+|1Eoa=A8TY@Cj`>qR8{66uRM*d9iCZ%@{pf*6dU_UIVmrwE zu_(`UKU)%z{!bmn@>&2d;AD^5gkXKZk`1LDF$QVXP8!fFW z2q%eP6}jkM{bD}afy|E9ZB)EwWZkU|V+%OdD?;!-ED!)I2KZ(m<7+Qs<=(Mun>_7NEK__T4< z@)Q%y*(@Ws!8E&=!dG7-f46@QG#K-4BPMDyew`=ry8FW0P_^zB@mTTl7S5rNQB%i$ zMve~Sr5%4}0R04Jv`je<#9)*2iA_1Ds-hC1_kuS+^;^6M$&X@r8V!)b<+dZj>dZx! zL`&Rvv0P4Yaw+BdI)|+Zgk6C?Z?)ifAr0WZX`hs#`=wj4ENaf=>rt2>d~`OXQ<0iV zX2W7QhHctTP*c%vv0}OoW%3;x0HjnaAHLGYfi%;`W;#831^zv1<1Oj4nH2MW4_q1h zTMLhi?foM<8pF;;&3VA;c$_)yU=h`K0$>37%?@NtryJVsNdEtA? zYeEt8T`}KSs^Etp{mzMf>N$T$l(%b4KNmmp)M49LV@1jawf6iOE|(CqcVisulh}Rs zsmDOV`c9_LzBG|uUfiD5vvUkPO8Wg;N}3Dz)8Vqe*cmR>SR1+`30~H-XTuBLGJJ<3 z1>u5E^Y&jSQfy?>fJj8ZnY(^Lu4hlI)+U z%w=n1|9R+{;hpNm2e3=qIk-rXIu4z4=SKeGc27axJer`SZ*98iIikewPrkl{rp=ygn(6@0h@lhfc!Ri~$J| z1IN{SyYJv2uTnfwTbOx86tdTZ3GxZGJmZQ4Xu$deT|#qIwm;^^e*Zd7tow@6X}kjs z1a!p03OjBhnt}cpsVO!yY2%=c`_5p>kjg;g6KcmnF+40+2j4;E${VZDotFxo)o!(!W~V9p=98U)~n+ZC<#XhxMPR> z!CV+;M?XIktW2PU0+l~OZXBlcIUv)eB+ZFKM4&$%niYBlW6Gm9uBpi=LJAY0C+dU3 znnW;BClop!AOuUqqNU`wJn#f|dm;z>EK+Lb;|3|&uNrdJB9!WBVV8@jVsi;qf;@J4 zpP!?;M2mv3wjA_ftG3Oq&WVLZ^gFlL47%i`g*lx-gf|ZxXB_X&)7B;ZdyW4D7pSMf zu0}B|-|OC?V9VH+<)zb&9f939Kt4GI&v zNabfR!e_!`M`~cvDrxNVM6P<=S6Bpo|8=r;E$Cz{u0=Thdy-oF2Z=`9#yAlwF9XW{ zV%zZNp6cbz$B#ybeKC_&ue9Ene*FB1L5^Pxr({O z+1=mGwSyb$i|UdZRK8n3*;Q{Iz%?Sk#R__Ft33_R6t#ii&YoqT(13qZkdZy7p`@T# z9q9%Y79Luk(k2I#Hrg4D=SSPiopii8=KS+?{URCEokj;=9GbOk=HO76mPFf;p}w10 zdN(AGfD`CTU0`ER{%Egvbx~HN7C&J}=2$*zM($Q%xJP?@73AO9h&DCQVG&iquy&X9 z`8uW}Q%yu=k%Stkf%f93j2Ld>Rf>OhU`?PjjrqLn z@<^GP+9r=*bG5yD?z`Lc2qTlEQb7n$B)5=dY<#7O)2PQie>ZJPxg@$4-f(2tc|nV` zUXy>gzmglI1NQxD?^6>wO`fAiyk+IN{7#0E(<1z;F$|RHeg85V-0jAOO5T%o2)qkw zL-p5&{9%s;sLbLuyOgL9|bYvDMSQ=)4F9zDygc)Nt~Dkm2AI} zv+;xxoR_C@b9rV+hLS7^2o^`@ROTSi6{Xh2iRyh>dpQCk8iRe%`;fP_FH6-tprI8=oq?aG-?FEdt3u`5d0m;;kKv7@!#s!+aIk3u0?A0zUVJ$j6RbgUg z%fm$LC2KdQ%PslX0ISUZL#ows@*IIM+1Dh`EgxF2>xVh(ko%Z=psfh7m0ys8Kfqk2 z(0BJtXC#=G3!96~cj#ftv{A`Ff)Z*aiKlpDY?r9#x4p$HN?tORDEDj?4Bb82;WXt% z^sm3b!np1}esc`va+VSgGDQCaMrlqaJf4qQ*1r#-qY1YDuD7wQ`>UmqLmq#k!NTU2 z3R@1Mv^RC9w&b71Id?Qs(0k|7d?}Jqj381;;O=-Fhzp>-DKnHV^MiJ13g<6tp zp!H&v$1=2Bfu}zDLb!_h?9)s=h^P#!j^qK6Bo)uJTDkaSRj2#5cLAyb-AY&jl-XM9 zlz|e(^@XXW-*0L?p{~)ioCteGD-XVT&3RRYhN9V{=nQK>^3q zyk^~=7g2drHq)RtH8E52G8149;=Iw~Mfe4-7|lMLSg=$WNK3TrUF#DKA>80o-S9VZ zno=CaQxG6GKZj(VCi;$yJ$hXOJHhlR&sR{}KCwYnye~mNVKI-vvp1|PhN2PIddDnm zNe{g5(y(SUuhl<(;w*c2uK0p*y++YW*1CaRJ~_t&7i(29!q9_igvU1M>%s6IjfoP&Su5E@RssSREvsI~?A} zEnsc{7VNTN)oKm@$pY&U*|l@+%!LvjH1-G}M-rNXe1k!6n?O$YN}Qw%07p`gBc9l> z&xi?p&}ej!XoYLEZ=l*A70tQa350jb<1u4tX_=6kD#=(! z%AM=wdZ<#jHQBjq@k0de{A}v>z_l^K&bGVw=61L24gp)_Sc;ifXB+#EqCB>+ZsaLGL? zKfs20MY3y$L)ApC!vsi(sw(-+pjZ%*rS(b%OABg<2ALM5zo?Z0SrJgkjaD>?Fz90@ z?1shaU|a|Pn9e_|gE9FPlady{&Ztl3Mu|a^iA>ARu_02xW-+#|&qR z4hl$ZvFc?g`5(ojA>e$R3>>f zYZn(_FrG4%eh)4!DI_}X_e)H|Wat`^yX4?`l@bpu29-;OBUP1vKEdWecA^PrPmK@n zF~SoZQs&(;x@6OTt)vYDGNgigKs9yIlXGL@njzoEXMPY2T^lIBZY;J1O;GC~a0cxi zdpd99B={gmpfAbDtorQ`ne}Bec2wFJm;~sxvlLNPX#_cuH!v~?OKp^25d-_orSz1F zlC?<+Jz`5DRF;%vkc0%4>}Ue~=pEKUZ9w^>s`SpK{tvLgT}!KVxYFZ`;mMNOr=C}Z zIo72R2+^jhpB=BMxv7d7+Pe-womw1#F35;;CBl#?9LOB^71mF~`~tju^AQu7B-b7( zn)IG{?1$Qo=G%Cf5dv^7i^IVAGV|ffBSA(E7bt4$X5keeZ}R7r3>vqYl9_@CVWNhT zym(|l&o^UkN8^DqWPaZuJGrRwI>cLkc|zf!oaBp^tSh$01&O;>Po>s72~^L7jPPeK zrlT#)?oA`i9iq30IRlO&lb#qnfahB0%9uYz}wO#+bKUDLI^6Nth7>C`39W zM0emrRDPS1&euLB$pYuCY!?&6)YYl4;>%{k^|^aV&F==QMx}CfO29I zo>$2|&$KAgif#iu2ab}9u5Z0va?{^dZL=P*HA>xKSS=x@82mdU0PDmv6Xz>r6bvOD z{Ix7z0Ez&`gL3nPz;XeWMdMb>Yf?k^dk20Go}6geNb*h^1Ht1kVN(E z`f+0XC*C0I~8;=4@leCVBVTZl(^N>2ibM*<@G= z{+>s4J2NKHhTP4~%P-qhKRi;M};m+!!zidB74aNqbup4D# znZ10Q0G6EKqIs^m^+pLgQ71aG+N%-3`!P!*q(?8L2MtODj4Ve#x2MM0_HX5S%sK+b zhMpG{ir+3fa6K)4Btl%+-!);!J)~zkukSqE&@tW6(RC}`ZJ+^@h>eTU-JPA$U7t;l z+>Fx;UpPS|C5g zJ;IDw!(y>38G_wE-Q4h{=$`&}NAKJy*FCdod|@GnCLKMX?_)&J@TM{MF(4fx)1M%bA0oK`t=XSj{&3;9 z^OK-pW^OD?Cj7_?jO27x2sfJ^n9O2UozP05x=Pq)vqe8Y!UlySwtw1va`E!dSFO&gDmr#G(2_V6&s z4SH<<-ZLSgA9rY`fx7{~^QZ0~$;n=5s^hgB08VZmTB~cx!Vb>>dh;lfUKdXJ0x?_AdjK-Q-2;EaIjPvT z-Lfs|Kgj*|h(vEWV(cD=Zhdidrhj9_XP#r3b~A6k(9Vr`Q+NM|E1(oOW3jpEMPaOz zUX@qN*HBVf!@R-utufg(m#4b8lyE1hyg9LaYK&CW7}S#C>PYO%>KBp?!R&B8@Ny?->S0RGl&ple>n zA6-{;GnYifz{e-9ik}A>^aXh&Yqc!O!K2mn*gYHMq?dl##bNy9DDfah{$9o+EF@!` zSB(4-S)5O!5^StaJh=uM8rrh3B<*mh{}u0l_fe!FF!DQYc`3(#SKl5zQiQ#^;EDYm z84U@f#<~-4el77aBH7uqMS4EicaDK#d|V@iUL&R$G4g^;5@*Mf4ORv9zwr=zn!-%l z?wCJrhx*&HjV;gkAHB)f7oi+K()IE2Pg#nl8Y`N`C;Px(5PZ*XOYM^rv{vELRq4U} zJLK_p11l&zk~MJ~@Nh#y!Z$qzZLyi=)%$!AEzYU`mHbmoVJ}Xt1D8WyCEBS_(97RG znMR`&d2!%RVRtBpBJS>K3`WZUY<8_^1p|3Yv=P(>w3@aZ-Xn@9tK@F&QKURokd6hb zS$3`LadfmHW1GVc{6(3j@K2>QoqWQw7?p**hj<`IS&Wm{Km{oJxgqq+IV)AKPa_2l z{ek3JEnqDfs(_CEONMn-WP&2L&|?O|%>8mtOHqLw@5ixERI~Q;w2Pb`t-#MOz`peL z^=E2gq5}W|S6d5pTbX}CpHPQLRI$HZ%ccc-R2XN7P&KR1D*3O~sE4#Po!Sg@z~XGt zL58?CGsW0_FGnfpcsHqS%VPoaCT^2`j%6I z&bmI}Tek18G5M$&RR}^B`qV2)A(KSf3<_hR!DKSPOis^9ndKi~fs751A(JMKou#>h z>x>5(8~~@vDL6N&vgmiUv3pBBY$Sfq_yB{_-os){-8+-{T(sqD+#DkGl~%VBzcBY% z=O6KOK5A}iJ5X+RN|>6#+j0C8C*1t>iExceQyl^>4~FrlU3l zr;zf3B+cP@H9>uNM11RaO>mpa8gH?lHcs0kstKzWH0x?!?@qwV!)7&)Pj9QiKa*qJ;CZFm|&RH82}6J#}tO2M7Ed!p@Iw59OVN;M+BC z>cVFn*)5>7ZtRb}D^yU@1D-)whnp+@iVP#Y)S_vAUG&1i=O5}SWFtYP+w3hCx#iYc z3V5EJ(4*Y%N^Vfr6DyYau3Ki~b*|j-kG$N%cN<(+1;44;rl=(}1AA^;)HF4TuhV`* zV=~AuD4Y3`onmyon-1-K2ighD%dmC*8)6O@$mMMKhPBrCH4ZJvNViJte|Y#&`V?FD z;Skio#zG}pjmU>t4)@2Y&N}sW!rX8b7&_c#tb0_oX9Nm%>hQ^QL~?R^@X55^6h2aT z|A7h_2>0Is!i<@Vxa<66&UDOc2eKR6{1v=OP<T-9iJv0UP9;eEmaf^B4%AexM z9CU|U6xBc|!#em!a)TFXR2W=0zIW<|>iZWiy&Mncl;$2|&I-&e4N>EPU~+pZ5&P?Z z-P>WMDMJF`EVUTZly^NAGY6%~7Cna`y;S`(9cWakYrvhTfPkP>EPMF*jw(&pKbTo| z@Xv9-wdeFEut*~P18d4t6EVvg_q&O5li8}R3pHEk(jLwlTfHRRAVJz{0D%OIb?oN% z^;wh6wuaiAnG)MaALD=$)0)b;5e+MQ9}(7a7%iN3)Zzt`VM|5sq9YM43k-OULIG|< zUVo1gmlNB7Tm}*goKzT3`ScSOHEQiaR>DaCCYDSx=LLM5VVmK=ke2@G1{dS6CQpKBKEs;ZmlD^&UotU-Z4kc ze^4HWMFjYbvnKvjS&A$P-*>IJD+C8Q4;-ag7%t3Yin7DP)_~y!YZaX8F_8=cO0C%X zJ3vUpI1SSf#!9J6Cb~D0;n=e@C?3$CwV5cLxG<^zE;1U;YX?bM@!rK)zC|QT*P{)| z)gqG@abTE)@`6pV&)~~{yzwnvE6K~59oNZLUCk(2GGx@bN^yv=)e5ARK>JPGy6Yt5 zDYB@Hh$zI}gEP6S`hsVNyV5y3>@?+6>Pklm<+|XjM7=Jj)9#eGQP!lfGDB_&nK6Q~h`rePQEVrnqd{?`U78#30TipyF5`lCtW|2U|HKreO8JCjAv|t*ERlwB{EU z8ZinXJ4Hbiw*t{y)6^W_zO(cJ$J)BWxCNA;NgPq$V%9XxwJ-XOJpww;Ism6pK%X$2 zh!GGH*e?A3hu&x;RAQjdF))6LKRJ2=wk-|M#Mc5gQ7THl_Amb0FWleYD2x zSlU!XLl=c1b#qJH5)8$nMG`(0w(IBsdItdgZNv-~?6UlY+V6T!aQk(#$wMUcIp8g< zl`{G6l$L!HP5Em-i`D$`79o(^&+7c+iKy;lexH+qdde6I91+;X)=e4H4yz~mi;bu) zK9On--FdelMaq}CJEY(qZl&`S;PTq(ZF#Tf32v`W{?W5Yrmws8yM=}vjCo z_`Xk^F&940mC2vF&aK&ag`!mkB-Bi96 z_VkGvF{2qN<+mp~2*!a*$@j8d0}kP?B*061y)K!dM#8*=5`_`I!w6+KTpezNDyA?Z zdk67jTf4#D!q-?vlQL%tAGR*bzCQTt4^q?AaIMsmQ&7qXtNc)jMeB2N_2}t1Q@TFb zx!MEJMw9|zhCL;)@lF-rhu$-CU6XgZdkVi|;CVTDsKxUdhwsk+=LVQNR~7eb zzpA$W6BtjzlB=zaPem@yk(?vZk z$Rohv?k(&V9TDNb%BUm8`yjraf##{o;`R#-#7$QJdmY3uL01+X#OeTeGcZ#f?wVYVwcMC5;sPjW^2?NdbIKUGbC`q`(Q zegeO5M5Dy6<2y>^g?q{O@2tms<>3^9e7k}!_M=p<_XPW{^f@b{>T>puevf5%2ZbN> zGFl7im$ot@0`=ry-$*?Q5%xMswt%Q;QB4h(fS_=J>hcT`A9du~h^iqZQ$2Mx`+^71 zQtOoL6KBpT>YT}_s3el^ygOihsf+nWl>$)IVzyi|on`hkzIMknD=1ZP`(7Op|AhV< z|5oiG*<kxnL263PMyS3RhB?v>iQl3Ed3NIO;vV}lB<`~yS_dt z7d2MZCLieyao$IfRa^E;O6oI?V~mV+!1^jXQI|q$F1yKFW&j6Pm`aQ>YhT>Yj;MQn z#U-krM+>l512Ja`3!V($(v3&NKTw|czF?cc!NhjKY|LC~E=M&P5^?@`f6qqz&SceN z@7l5VWKONbueJ2A%@Hikq}?B3dq+er9T}JiTg>q0PImH1oEWLus0VkxglJ#4n4EK# zx7vAg+FrOOqBZ*ONTfI`vkKdiv^2q!gKS>c@Gc1bD}WZ?QFH& z=iTc$VkXawEk{XQ34X|}}2g53A#@fL~=y13CaIirDZB>Dims zcz-Hy`{m5O4M>_ZFdgmmV{LW3t(q$Q^9VkG1xt)tK=8AOWD21A#Kl;-U#;&<7%Sj+ zsA90>lw#?w!I+pjQei7YcH~k4&qiTjf~{Rl(FaNoQiiC^Eiv#0*GBANL-sRxnNng{ zO-zXZS?Qw&Vjh{=Y^gZ4D13mC1{>DJA$@P{YptKi4Nd!npR=fJa5HHQ6BJ3u->7|INcrN6bHE%?nE z!336vePbl1afuzQX9n0Fz|Lt>zeoO%@d}sDr_PYuB$u>h@j*M@hK~jHUQ?=<_`ym8 zC4dD9^jm);-%{YVp3Il>t?jDeG3jMfIzPfeV%Y}TPi6txu3nybJLVY`?NtA{Z|>>PB~f1%f<%; z#5d?y;+`gey%hbFX`8F;1KYIWFeuuK`AL>IF(~Ji8)_G3a4UdT%+=E}j>w6BV2EwB ztLu4rS=kucmO8`XIFl`G{1s&!{XW{5Cw`GqajCgJ-B<5U&Dmk6c zLJK3CD9KPM3lob^l2X5#xVW4_F&~FF2+^ci_nM;OKSIA;gF2hny^2Lb7u{I0jC}6B5Qvtv5(Pl~2InD^K94ZBo%i zBHa8f+*xz?`Ou=DY6r5UZM?<N zF9i+CTc%9*)~}at3>{UHgJ)da{G8Gcx*6v?#^iN%wMu`r*X}N(MI%`|&Ir`*)uj@y zxXBS5QI<%+j#XrTGt9}&I(ABi{5&<%{i?)8D{*tu0LqivT%fp4bwG3mdJhV-1{n@U z)>Z83JRJVjzFo2iQa8FwNkRbiQL|W z49O`vHx*huN0`khNejRq`8r~d%p4y;BZ#k=AO^8LNYe%RUhkw?Kn$FMH2|6Wgzzm+ zar#S^Y*1MC@E~)H{_2DEUh$w1p_|-G!V5-a$sK%8JM?V}=i1%Az5k|DzLj!`Y=L!Y z!99atuU0vWE4u#^p~g_!I#jdEr(O-nM^8A|6Z=}(=JvYV?;L#7Jm0*q_PRTy^tG_a z?nN-xtt<;S>ou%yW)!FeMODoesV`nc@O6IX?vNftlq9Zg2M+HvSwE5@O-u zk&HlTfsUg;#Bu^o>%mKWzxqHNwKzx-r0?#$NcCF0i}$#?i(QGkZTPYiuP!b-KN3Ie z1BXLLDBo#IyCaGHWasA@>fJK|WEtntso<>ha|Ui7pvWtXj8deIl15E8)HAZlAH8Cd zNWDhLdv5vF5Sjn(mn6>0Zh3K4M}t9$mBdwQtVrT?>+-msBjbOPAJ=jHlS-&}kB}{d zZFK+o*@gdM_HW#y?V&UC^ZgS#uhX!HbqwLPs}cS7Y~l+2u|d9y9UkQM7BsY)`q;_G zrZg|~P)i%9kWFGu3tKKl336TTAnDQbRz+_?&p9*(*5QeL5W*K3P?qK8-9p+bK)OqE zNg_#3D!1I>t9UenO`TeDVEh_+HXBN8ZYGby%Eu?g_2mmUeRe-=5HNrK7z8*RG-uns znIJwtMeRN$M_a^=o?IB0p(b^BC3Cxj@9MW}vSJ+eR}=@8Gkk2p0#6PrEIoybxK_>! z79$&gJT|yf(^5-*HZ=uL*ybc^Si@Yb5uFQ}a)k7TZd{BClp>6nx+Mm(0p|nG^elgh_9MoL5l_8RJQ&|IWUiKB{d~JI|Udq^u-MjO+)aACE zBt@!;yt}KN&ZCZrhr50B`>SqrwWsYDQ(RCHuiL21b{~lfydK2pCB;Qw?l%H&C(a^k ztJ@`Ra>(um1mXl|V>Y9h=jhujv%P_KN3j@FaJwsW)g`n>TGEZq9^nQBV3 zut+g;3=1pzh?HK`XXTWa+et4Pvo2u5@97Y+g59Rx z4a&SK?b@a%db+IofGYGHVzlW2ra8^$RiS2XW z7o)mBBCf%`k1tM3+ui<&O%a`|NJCNBT#$NItnO9jfF1+^N8dk3-~R^vq3f});+X9` zcG<5$pIRsz9b~3Rn!3bWucY%DdH9&*Z!hk2t`Hs#r!Ddi1CKmc|CqCZ3erQUcmt@= zdT^}l(ckcJ!a1VaOr?Eq0y9Ou=|5lH&&r0h;)1mj{6Z~yC6*<*b=>`OV~6A?Va_+L zuP<n+D|Jlg#GRlGKKv+Ex8sr!;lW6mK|=7b(T=F0=>G)RK0F zYE5B?-p8fYR{<)%l>eM@2(3f(@@G$!$*zALqdIsG!!<@m&+hEc$qi1Z{qs5=9xBeK zJF1?B{hw}`A9@Wgw{K*<9&*C9MO~GTl%7Ryo11S^{~+KXnXHyivzD!8=aazCLrnXc zf1f4tV&FG4I+}WW(HnX|(w~XkpGl_W^B4gvjnkeNQC2(xL`TI;5EwW*1=34~SXL$l z;LA@(W1naKIqXplX+*y`hrK;%@XuZVMRkZ~hvJSU46pQ7hMs42R94v7;EVdw`wdvG z5E@(u0`Ys7M?CKELyYs)acO)3&U&Dsu-3;*LF8I^EpS)Aami2W0r--XA?x@?@s;mz zXb#bFL@h9fO`nWT`(|^|+seW!C-!5OFftuCFOL*|6jC2NNBH{)=cZj0!mKk~s@YX_P;2tVH8zv|^WYO#*_RaMU>PX3P;KrHRsU_u&25tw@~cX=gk`h1rZ zd6*6@^9}*@qY3Eg7}bC5t-Ky&J15U|14Y`CrM{}3i8V8t2DPmjfSoanSbwn0Y3b%K zKvHAxN-EHYM#?A0=cKWtk60k>xx{RsbYcI?z&|@Ih=`YSi5ShcM_pKT@;)^)H3q)A zb%{r$FTxYobGs~W0`_z0$fOeX`BjN_jl$55r-f1p1icctzUH7l3!^%1s-ze(U;tRY zeGa(09y4BglFt1qef8)&yycG8v+Vb^e{UJJc=qX9@PQKiVIQ4cWVKdU)C=SR_3W}J ziu7oY+cx5=t9Mt?T*ix*`!%|-idk;IQNmE^@uSkCw6gft(nZIR!`gP6yzU8yq@=Aa3Bx!X_5*&61Gl(EZucA7 zX}32?-p~I2U4)E`>I4p5s3svft+zkcd0m5 zUZh^F_Q-mfre*0He#S{{$;x|wgF%g~R7MQ=1PpRo!bgsT30MZAMTzvD#J=ic*rKUs zfcLuwHpgvx;eWUjJ3H3u3QEIE^z;?OdufDEow6h*;B!usg%@taUv7M zcyv)ZY3$fTsv)5ffKul+$w?SAh$>wH~4Z*MP+s}E$w=AuZ zznF*m615zxB-ZmrG1=wz(x22@YkRD|8NOLL(6HBRIwjB?o z)V}SXazP5=$Cy|X)TG5OURxtnLb;eB_?rlRG>#su?wPHa*z-8U@9z0E}!Y>{?jo5wR+E-{GE9 z#R**Axl@zia14-~@tpG1(ml9Y-ObQXEc9<%L%H+~k1>O&bK_&Fxb8`nd~TlSRV@!r z3Pwk}HB$`d#ZA~;!$)s$MsGCGx?8=1{Xz@F=jA!hBmP|QWE0>;TF|2n(4>ZOlXLXo zh#R68p1e({Q!U($vp)JkAn?G=E+mOR;hdnOT?e3&B&v#!M8pDf1YiZxDgT>_d^^NS z{Nrpbeq?03Ew8O_W{{p$#9t;E_%pvx($XcYvnsapJJuO)J=bU@ho+$>-^C^FID63Q z}EAa*A-=tJjryIg0CMH--(UQ=@t})zedL`gc$ibqxgXQFd6y^?GAna z$80jYcOX5u94ac^;uQHI26r@^{@_FEyO%Bwuv@R@5-fO69*j z{*{Mi3;29z;3>BnFV~?pBl#DQRJll#!B{K_sM6x}-gW|GnS6&vm}O^Kt5WW<6`x zTKBK+(?A>?k<4+}#~T*3Zm;~{Gi_c!`>IRMW~XLHNU<6^VnvVj|KWp==d*=2*mWji z1ha^t?l=<)#{w4R_wM$XfAaDnbZDG3Jsf=}Wox29%alE>j?P0q##bae;)`;j%Xa7| zi^?x&6GN6ATQ>2v^4k@zp}W=A^W~v9jyOeNSk9xPBJ6q4WjY8R#iOIp?ZQF^U9gL? z`?w5iY1=tOXET*W+}&>aPEJ_-Vse70Pk`1TOR=ZmZ*FUx$Iu?kS<4u0+Y@SW97)@S zUdN|4n$P~6#mYZF5gwQJzvp6%Q~eP#+g-}?WbHK*UkfCYnm>B8?Jg+-@@>|+>`k%o zxkRrEQ?`4~Wbe0W(^)JneA`!&71(JqIX`|4lE>v_ydXf_yw({;&y$OT|A3*>!44?g zvUozDXu^ccj*h1IKdR@lYb`C#FA%DSGf2SSbd1J@d&8b#t)C-`HmdKQ>J{rR8t~J) zsYNtWXDTMnn5kv-jRYCBU~2u^7+d}c*OToTeMeJEJIzn_Q<~JN4*_oMFZ2-j7x|r? zT@Tt8XYb&`$7Doz-WC$f_!Lo~R$aL_%5?5(VS43KQ-i7qa~s77p%fT!6>yBM=yvcf zS}>wVk_V5rZ)a4MblOOvn(=Z(;QIiWMXH}4D3&u1w?z6=;5aPr zk$83y?a|^Ju0g`rn#H9)?%95R_(mSi7`i`{m2SX$!v4FqDTGUp$}&u4_DyH<{8ER> zOFW&T@dMyoB~-vLq+|5`)$euA-WjT4m&pOo0wh)0o6gW+R~>+6Tv9S3Op-9bZbf`l zz0W-`FN|UY4lMiXT7Uf}K`Oxfkz-`}E^Nye`@3<}qA|7{4m=(h4#>;*7LJW!iP#QG zQhE{j7^$xg?lY8lfV{Hg_6RmV%iJ-x!!_b;26zGSYm)2HMGe{=7M1>3yk23Fzu^EC_6+z3M~C(H$gRIJpIWRyF(^a(5}G+QqrEZDG^_QAZpc}kOMy+kYoL(l~3r^Hhw$vNYmTWhsKC@a{igc z*XTR}_+k^M*Y@|fd*dH__EBiUpbEid=el{(;p?-p0I}`xT)S7)h%h{tJsJ56!Ot); zQU!Cs4`dVtIX;dbL>O0nGn&5bM51JQ6>MDlrUO>jand6Jb~*?W1lwo!jDV~;OffYp z*2%gDni}kZs*8)iJLJD;r|F(DkOy%_Fp8n1aHnu zHG*ndgI@nGXNP|{?7vVII+cKTI@6eeze1%Twuu(yJ<%~FB0-*wZ%Cf1b-yc*yAad? zl_#c5E#e9F>Bdq69L=6|fvBp5S}x50`x=aIBj_Hcd)MSXR^*M@<;c$o)=0ibToysK z@Rcour`D(o?p#Nspuka#5LbDz#nn>%e(t|6z&E{aQ{_oRtaOnT`GUn_53cHC%%*Y9 zswXT$o|$!ohmHT(-(_eNxgym92US(ZRf3hu; zy~8Xi)vQcu931>#v{+4kRKKP*++Sw-xC`dNv006oOC?T-YrqpU!>RDU-)^c+EdD?h#jlTz7GUfZQ%AoW z_Y~GHOykDgLfXAz9Pt~IAKsY;Ej8;6I^TLb9MHfXYdt0_1Hyz=9k~*mWaP2 zl$~`s-Wz>zelA^DSU9n@we>Etzve@!`xJTR)Z69XhfK6o<%$$IwS;HwyjT8Pm;w7v z`0^$RW2;9TP2EECyC_J$)^B`=Bx~;mt4|jX+^Q{}FIuHB@%`mXd2&glgZ2-i>mvJB zR_u7Q5iK-S@e08A5Ym#HutGd^>!ovZC|I1)-#EO9|Ew*;?u2&L_}lz^$NViVs~ge3N$n(SXcUpuqgW>gV`7?0+Ik5Rcq!DV2Mm4EW4-3* zQtVp~O@fw0%8l-AZfeS#46muk$iCDv;(da+R5|xF8}JPC>l;56&7JTp(y$wx<+&?7f|3&6c<&F7x%FcBCnYY>^o z@sUEcN1|IOp{DlD(A^YM3CNIw{6SkoOUs~w^7DQ)dOmO%qIdcuCs_Uz7-ZVU*}%-Y z#ui3s#5|0GZ)UR@SX%{*gbO{uD|`iXxlHxbRvdEchO3scX?O z=eHX|`0@|+?Sf)l5iX<~1Utl`mq(GD^|q!6jeq-wy+)OVwlv&xmF=#GoC=Y~PKgm3 zH|={H9r30fzVRWP zi(}9J{F#qvOicj5?f?P!*xcca@H)*%<*>tZSyy-W$%8uar_V_YLP zQ}I3H?#%*E0Ax|2M?bfoBL3JLlW@7~VY=jSa-iSuF|*oA$Z$))^LwzBfkr{7 zK6ZXLD#Q9G>1DPDgAD_|tlNEn1T>kP(SB7vmKi`CcO$kgeelKO;|gl&qpS2E`R$rJoQA|qK zze+rG1qrJ_30TuO#9w&Nd(EOLZ%iXlr4~%3IilCXt!RB?9h&4ie2*`5Y{Lti5##_f z``n1Z|Iml54*zU0_(K2=GjuN*UQzjIBaz5rvI;1xWXtHEn&2O1@wFdrfWJ44cI&o& ztSE@?tWoO((lNKLxT+0trIqO2U?$V~a5-b3TmSsoY8zg$WTTKQ6LOdJH93|;jt|)r zU}bBz?RLnjYD)0Tu$yx@q3G1=TG#R8@2o@#qhALX9-xb0ox5Xuv@>U02}m+aJPV#F;1{K6?ie9dBT z)Mh5S@z=gb9VbAJfoZiS=bn8?z%GanjErhePOY+|gPu(F{v8ICps0tN1UmLN5XbQc zxN!8aS6j93#=I?kLPMr|U$|dlXT8l$l0TvCmya{h3Bl2!^}74P002TCRKtC^Vg`S-ChLZDe~Og6I+_p^7qyj@ zL6h%xcH)Bilvo<7Q^3g!8rTmD+ExH9jH=Hst&NnnfU}`_NGo^RHBp9OQ45qo$H>~9wZebAK{BJ z#4;-j+O(P(GIWd;HmGR|3oie>4j`i=-&Z?mAK9ESKC{g9Oh0ejQPglcnwj2K%C z!wAiaSfjjl$xCg@$qY-_v~sogH!-&J)}c3zi7-J?aaJ0jb#ZncousIqetV#+io=IY zgv6HZQOU=coFO-kugHmX*Ec7JI?**;MdHTq)vJP}3ACX5n&k9VEIC+k21$00u-vKQ zj|Dkq;(T`9^y**B3=M{`D=)7I%@D&!JE9KK?Q=gV_VXmrhTYuao$0Z$EDD!AfH1H7c2Ef$UVyWGl z3Nkp&_3IWOBE=}M+A9T!9L-3tk{zauEKZ7j*d##7gz%7-?kD{P*n?9Q%=b1W@u23C zBXI6FpuTg>DZ`SPX`wQA@-S~mLKjS{siA=iUPf4xs>JG7rw+t7|EWxLtQ9Oj4}PpT zF%|aCg~p)QfP%~ia4bXj10{^RzMfhf+--qxPN!Fbz2AqoAH(OQWM`yXvn3un7u}KN zswE^o9oP|RwogCn%yb=wB_qcW|@83CSdp-Q(e|`U`bD zk}>Kme@xl=^ZY2u3pL2+JZi8q0VQR23|q#agb?7Cx1)_6NOTfAK~wwg?NDOfbRVZcxhsg%u1ezbp#Xb zdM@4`!yAtCyINJ7&-h3b9^B=zV*5(K!3(%_mCEn7hJBi3g7eD{U zHDLM*UBermN?Y5GZ2T`NVkXi*DeH5_ktkY>I8Z?=bC=5UsPXQ>&pa?JQ+rP`vT^1-n(#7_B{HN9fI1;j zqv+7KZfxf*50aGZm5+}RY!6@=@lk@QO&+`El}Nv*B~-_=nNZBa;+v|6&*s!y_ta{F8~?_?y_X|ug76z4*TVCRCL!vWkBU; zzSie60IFuFOhN_SnT@a?a)3%8RV!w?3b&p^m93o!n0+5IA&JL$!N}jgXtEaAPJr8C zUfeKd1_%=z7ohC};I4UnS_&G1h2H{k^+D4z1umDVe z=I*v_*l-4VSv|h?4(9&YD4Ch;RcIGryX>r zh%y)~h@T+dK2xQZgAn5QetFR7qg#s;;r*#chQ=d9f|~s>6(mSSg&u(8bX9v#oc>UQ<&MFyO_CYy$_MSeG9hbj7LYuSj+rkLcRXT(W zgGk*Ea1OC8Q18g8h+_Inb(#4Hjs@$&n)t^X&TsLY*kA(!6h~6y#@rBuoJyd^Ov7ek zJH9wQOAno27+jcD={-8u>+CH|iousRB>U2@;VBFc=+`k{PL8RSqN5`&hiJhV2ntc_ ztQlXYc=uy^s9+77+>f2M!K&y}G`4&hnWXk$L{QmeHL5E9eEAGr8^db9f#RKs%k}A|Y`S>vP4#w3+?1WhC!6cXq~zWKr(Yy%2Y~6}iLgfO``) zdx=pCy-;Y)dRciXx(HRHH9g*VB2ICKX=sXiQ_*V4dbj^$1h35m?2+uDV_7`*sl~CN zSAuJxE*8&S5$#vGntwzmw7`)QLG;{ZLC#A~N@PpfkF%P%ZS^Z?mMUByEyf&N<>9rJ zE5r%YUU#^Z%ViQ0)hN2Vw$1wNb7z^i z09}qKU%aWu@e&oYNJb#0;8`Ina$DL?^s?3igD7 z0oQ~$iIZ@ixKCTLS@yabVXF6koX%wB`vf6s89wqLD2CZ*{8$f#(S}MB!mJUMBEj|; z1C*Pn7r`e-2+<#g%Jgxi;1Tn=-+;na*%A{8Tup8mU+Bgj<=CbBJv4V_=w@FSviI}* zh_(-Q698c6K2TLMve^nrX>}vjM5-seJ6KpH;=Y%ZJ@?(@&q6zstd$(XPxgLJIJeMm zE$kM021G;XZT(l((1k%WV%D}EKUKS7_K6&N6&Z)@^+Mxdc)CCQVkxl=TDCdS@UXLP zvSUTN;W@?|v_Rp?J*@xi6kqsVm*2{{?@_GnYt|?0W3`85HF(=XV^lTZXC_{;?@;8H z2K@|s?@GddqoP;rGgC;_MR*##DRtioc(mS;WM=|0I%NhQd)1%grbwIWpn$|Mx|;2< zCePa9q|kRaA9}1TP5paAo=^lJ1>2(UC~c>`aCCh-Ro}ha(47~@Q*FWb6$5klV)*9J zr!~~-<8nwlk2f(;;b-|&NDn7LG`hmFhf}7f-GmE8eZ?)Dbv+s@BTl@V9%0`0`^OO{ z-zKX4(8La}=&s3NL;G-humu0r3%;|~-!=h>6k`b}>ks{n!A0NYe)ljU#8|8REBIR9 z8dW{Z-7LFgmAfzZL93MEv+a@aMdSBdRcqF4Ur=sHj0A50E%1+`wHnrszrlVX5;w`3 z|1)2>$oiDhXbE92!e}Hn0rTX-79EUz`kw@5FFsA;|CC_d9Qs zMVv;%zO+GSLev@9f3ZE4R{u#f7z@eZ0@L5hH@EW61bArD^ucKOT$kYK&*O?`H3c-4D*bUeK` zF+}zRhHW71Jlr&JiE1th_(18#$Fyv*!bbfgt$PIhgi)S@TuvSFq_$^@Bn$9?Pjds+%;@GCZub} zKk<_TDJDy`UmvqydEW8- z*_Q1q`sdl@#zmb2u)Z07yhhh|bGq$X*S<(6t?@M*iw5FA_FPT6*J$TdmlI^nd5ZmDt@vHV;r8(5>d zi<#8Et3OAty8l9|*(sN-CnXcPEyh^!nHQ_C3Aguu@G^`F0+LeTg|9&(Z!J?cBv(y% zc&ly|p5XY2jqkFH2TbbDr)(yp2X+ng3cu5IU)eE856FbWKbhC(B=eA6egrCZ=_r@MZwgS-UO^SrrM zD7`(2-`bt(bLc(Nph<~iu{3C8KO4($%bV8mLK)Bjcb}bmnre@NpOC@$)U2kFyHfnv zaiKlc)jplJavVt?t|}X{W_XSSj6;M5(+{lNsrkL%0FDsn8w@tM zwJyD63#Q`Byd(!|x)@DfqU}Z;|4|6o@7Wqq?|O>PZ;>idpn>^&OcLED{f{ZZGG3fC0Z qM+$!$RiRTq%|wgLWxH>8mm3Ac-B`#ri_8}Q{dl0Jt6HlJ3I8AdL6*D# literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P157_commands.repl b/docs/source/Plugin/P157_commands.repl new file mode 100644 index 0000000000..deedd8b406 --- /dev/null +++ b/docs/source/Plugin/P157_commands.repl @@ -0,0 +1,119 @@ +.. csv-table:: + :header: "Command", "Extra information" + :widths: 20, 30 + + " + ``7dn,`` + + Example: + + ``7dn,[BME280#Humidity]`` to display the humidity measured by a BME280 sensor. + + "," + Displays a numeric value on the display, with 1 decimal. + " + " + ``7dt,`` + + Example: + + ``7dt,[BME280#Temperature]`` + + "," + To display the temperature measured by a BME280 sensor. By default includes a ° symbol, unless option 'Hide ° for Temperatures' is enabled. + " + " + ``7ddt,,`` + + Example: + + ``7ddt,[BME280#Temperature],[DS18b20#Temperature]`` + + "," + To display two temperatures measured, f.e. by a BME280 sensor and a DS18b20 sensor. Applicable for 8 digit or wider displays. + " + " + ``7dst,,,`` + + Example: + + ``7dst,%syshour%+6,%sysmin%,%syssec%`` + + "," + To display the time, f.e. for a different time zone. + + Can also be used to set a next appointment time externally. + " + " + ``7dsd,

    ,,`` + + "," + To display a date. + " + " + ``7dtext,`` + + Examples: + + ``7dtext,OUT [BLK#Temperature#d2.1]^`` + + ``7dtext,HU. [BLK#Humidity#d2.1]^o`` Will result in 'HU. 57.2°o' being displayed (8 digit or wider display) + "," + To display a text on the display. Any variable can be used. Unsupported characters (like accented letters) will show as a space (empty digit). + + With the Scroll Text option disabled, the first n characters the display can show are displayed, if the Scroll Text option is enabled, longer texts will scroll from right to left across the display, at the set speed. + " + " + ``7dfont,`` + + "," + Select a different font, either by name: ``Default`` or ``7dgt`` for the original font (0), ``Siekoo`` for standard Siekoo font (1), ``Siekoo_Upper`` for the Siekoo font with uppercase 'CHNORUX' characters (2), and ``dSEG7`` for the dSEG7 font (3). Numbers can also be used, 0, 1, 2, or 3 as noted. Fontnames are not case-sensitive. + + Only applicable when a 7-segment **Display Type** is selected. + " + " + ``7dbin,[,|'']...`` + + Example: + + ``7dbin,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x80`` (7-segment Display Type) + + ``7dbin,'ESPEasy is fun! and costs 0.00 ',2441,'uro'`` (14-segment Display Type, using the € sign) + "," + To display any bit pattern on the display. + + The example shows each digit with a different segment on, including the dot/colon, and assuming Scroll Text enabled. + + See explanation on how the bits map to segments, below. + " + " + ``7don`` + + "," + Turn the display on. + " + " + ``7doff`` + + "," + Turn the display off. + " + " + ``7db,<0..15>`` + + "," + Set the brightness to the provided level. + " + " + ``7output,<0..5>`` + + "," + Change the Display Output setting, available options: + + * 0 - Manual + * 1 - Clock 24h - Blink + * 2 - Clock 24h - No Blink + * 3 - Clock 12h - Blink + * 4 - Clock 12h - No Blink + * 5 - Date + " diff --git a/docs/source/Plugin/_Plugin.rst b/docs/source/Plugin/_Plugin.rst index 87f3366f5e..c6dd151fc0 100644 --- a/docs/source/Plugin/_Plugin.rst +++ b/docs/source/Plugin/_Plugin.rst @@ -492,6 +492,7 @@ There are different released versions of ESP Easy: ":ref:`P152_page`","|P152_status|","|P152_status_lb|","P152" ":ref:`P153_page`","|P153_status|","|P153_status_lb|","P153" ":ref:`P154_page`","|P154_status|","|P154_status_lb|","P154" + ":ref:`P157_page`","|P157_status|","|P157_status_lb|","P157" ":ref:`P159_page`","|P159_status|","|P159_status_lb|","P159" ":ref:`P162_page`","|P162_status|","|P162_status_lb|","P162" ":ref:`P163_page`","|P163_status|","|P163_status_lb|","P163" diff --git a/docs/source/Plugin/_plugin_categories.repl b/docs/source/Plugin/_plugin_categories.repl index 0c4fe03df9..2dba2c33c5 100644 --- a/docs/source/Plugin/_plugin_categories.repl +++ b/docs/source/Plugin/_plugin_categories.repl @@ -2,7 +2,7 @@ .. |Plugin_Acceleration| replace:: :ref:`P120_page`, :ref:`P125_page` .. |Plugin_Color| replace:: :ref:`P112_page` .. |Plugin_Communication| replace:: :ref:`P016_page`, :ref:`P020_page`, :ref:`P035_page`, :ref:`P044_page`, :ref:`P054_page`, :ref:`P071_page`, :ref:`P087_page`, :ref:`P089_page`, :ref:`P094_page`, :ref:`P101_page`, :ref:`P118_page`, :ref:`P176_page` -.. |Plugin_Display| replace:: :ref:`P012_page`, :ref:`P023_page`, :ref:`P036_page`, :ref:`P057_page`, :ref:`P073_page`, :ref:`P075_page`, :ref:`P095_page`, :ref:`P104_page`, :ref:`P116_page`, :ref:`P131_page`, :ref:`P148_page` +.. |Plugin_Display| replace:: :ref:`P012_page`, :ref:`P023_page`, :ref:`P036_page`, :ref:`P057_page`, :ref:`P073_page`, :ref:`P075_page`, :ref:`P095_page`, :ref:`P104_page`, :ref:`P116_page`, :ref:`P131_page`, :ref:`P148_page`, :ref:`P157_page`, :ref:`P165_page` .. |Plugin_Distance| replace:: :ref:`P013_page`, :ref:`P110_page`, :ref:`P113_page`, :ref:`P134_page` .. |Plugin_Dust| replace:: :ref:`P018_page`, :ref:`P053_page`, :ref:`P056_page`, :ref:`P144_page`, :ref:`P175_page` .. |Plugin_Energy_AC| replace:: :ref:`P076_page`, :ref:`P077_page`, :ref:`P078_page`, :ref:`P092_page`, :ref:`P102_page`, :ref:`P108_page`, :ref:`P176_page` diff --git a/docs/source/Plugin/_plugin_substitutions_p15x.repl b/docs/source/Plugin/_plugin_substitutions_p15x.repl index f83592e642..aa0082fe1d 100644 --- a/docs/source/Plugin/_plugin_substitutions_p15x.repl +++ b/docs/source/Plugin/_plugin_substitutions_p15x.repl @@ -68,6 +68,20 @@ .. |P154_compileinfo| replace:: `.` .. |P154_usedlibraries| replace:: `Adafruit BMP3XX Library` +.. |P157_name| replace:: :cyan:`HT16K33 14-/7-segment` +.. |P157_type| replace:: :cyan:`Display` +.. |P157_typename| replace:: :cyan:`Display - HT16K33 14-/7-segment` +.. |P157_porttype| replace:: `.` +.. |P157_status| replace:: :green:`DISPLAY` :yellow:`CLIMATE` +.. |P157_status_lb| replace:: `.` +.. |P157_github| replace:: P157_14DGT.ino +.. _P157_github: https://github.com/letscontrolit/ESPEasy/blob/mega/src/_P157_14DGT.ino +.. |P157_usedby| replace:: `.` +.. |P157_shortinfo| replace:: `.` +.. |P157_maintainer| replace:: `tonhuisman` +.. |P157_compileinfo| replace:: `.` +.. |P157_usedlibraries| replace:: `Noiasca HT16K33 (with a few minor modifications)` + .. |P159_name| replace:: :cyan:`LD2410` .. |P159_type| replace:: :cyan:`Presence` .. |P159_typename| replace:: :cyan:`Presence - LD2410` From 161ea2c98c16ddf11f13142dc3e5b37e2f396702 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Mon, 25 May 2026 20:43:49 +0200 Subject: [PATCH 05/15] [P157] Add 7digit command --- src/src/PluginStructs/P157_data_struct.cpp | 41 ++++++++++++++++++++++ src/src/PluginStructs/P157_data_struct.h | 2 ++ 2 files changed, 43 insertions(+) diff --git a/src/src/PluginStructs/P157_data_struct.cpp b/src/src/PluginStructs/P157_data_struct.cpp index 4199f7c9de..7f709bfd65 100644 --- a/src/src/PluginStructs/P157_data_struct.cpp +++ b/src/src/PluginStructs/P157_data_struct.cpp @@ -81,6 +81,7 @@ bool P157_data_struct::init(struct EventStruct *event) // fontset = P157_CFG_FONTSET; // # endif // if P157_EXTRA_FONTS displays = P157_CFG_DISPLAYS; + bufLen = P157_getDefaultDigits(displayModel, displays); if (0 == displays) { displays = 1; @@ -1210,4 +1211,44 @@ bool P157_data_struct::plugin_write_7dbin(const String& text, # endif // if P157_7DBIN_COMMAND +/**************************************************************************** + * Write a character or string to an explicit digit + ***************************************************************************/ +bool P157_data_struct::plugin_write_7digit(const String& text) { + if (output != P157_DISP_MANUAL) { + return false; + } + + if (!text.isEmpty()) { + setTextToScroll(EMPTY_STRING); // Clear scrolling text and binary data + binData.clear(); + setScrollEnabled(false); + + int32_t dgt = 0; + uint32_t bitmap = 0; + const String data = parseStringKeepCaseNoTrim(text, 2); + const bool isValid = validIntFromString(parseString(text, 1), dgt); + + if (isValid && (dgt > 0) && (dgt <= bufLen) && + !data.isEmpty()) { + dgt--; + ht16k33->setCursor(dgt); + uint8_t per = 0; + + for (uint8_t i = 0; i < data.length() && (i + dgt - per) < (bufLen + (isPeriodChar(data.charAt(i)) ? 1 : 0)); ++i) { + ht16k33->write(data.charAt(i)); + per += isPeriodChar(data.charAt(i)) ? 1 : 0; + } + return true; + } else if (isValid && (dgt < 0) && (abs(dgt) <= bufLen) && + !data.isEmpty() && validUIntFromString(data, bitmap) && (bitmap < 0xFFFF)) { + dgt = abs(dgt); + dgt--; + ht16k33->writeLowLevel(dgt, bitmap); + return true; + } + } + return false; +} + #endif // ifdef USES_P157 diff --git a/src/src/PluginStructs/P157_data_struct.h b/src/src/PluginStructs/P157_data_struct.h index f836b04e88..ca54548a94 100644 --- a/src/src/PluginStructs/P157_data_struct.h +++ b/src/src/PluginStructs/P157_data_struct.h @@ -216,6 +216,7 @@ struct P157_data_struct : public PluginTaskData_base { private: Noiasca_ht16k33*ht16k33 = nullptr; + uint8_t bufLen{}; bool isInitialized() const { return nullptr != ht16k33; } @@ -240,6 +241,7 @@ struct P157_data_struct : public PluginTaskData_base { bool plugin_write_7dbin(const String& text, const uint8_t offset); # endif // if P157_7DBIN_COMMAND + bool plugin_write_7digit(const String& text); const char periodchars[4] = { '.', ',', ':', ';' }; }; From 568369a4cd1e4aa7095e6c51204269f4852fa1cc Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Mon, 25 May 2026 20:44:41 +0200 Subject: [PATCH 06/15] [P157] Clean up source, remove unused right-align setting --- src/_P157_14DGT.ino | 10 +- src/src/PluginStructs/P157_data_struct.cpp | 106 ++++++++------------- src/src/PluginStructs/P157_data_struct.h | 52 +++++----- 3 files changed, 71 insertions(+), 97 deletions(-) diff --git a/src/_P157_14DGT.ino b/src/_P157_14DGT.ino index adcb2089fe..45eea4944f 100644 --- a/src/_P157_14DGT.ino +++ b/src/_P157_14DGT.ino @@ -2,7 +2,7 @@ #ifdef USES_P157 // ####################################################################################################### -// ###################### Plugin 157 - 14-segment display plugin HT16K33 ###################### +// ###################### Plugin 157 - 14-/7-segment display plugin HT16K33 ###################### // ####################################################################################################### // // Chips/displays supported: @@ -30,6 +30,9 @@ // /** History + * 2026-05-25 tonhuisman: Add 7digit,, command for writing content from a specific digit 1..len + * Remove right-align option, as this isn't implemented + * Clean up source * 2026-05-23 tonhuisman: Add font-selector for 7-segment displays, re-using the fonts available in P073 * 2026-05-15 tonhuisman: Start plugin, based on P073 */ @@ -154,7 +157,7 @@ boolean Plugin_157(uint8_t function, struct EventStruct *event, String& string) addUnit(F("1..600 = 0.1..60 sec/step")); # endif // if P157_SCROLL_TEXT - addFormCheckBox(F("Right-align Temperature (7dt)"), F("temp_rightalign"), bitRead(P157_CFG_FLAGS, P157_OPTION_RIGHTALIGN)); + // addFormCheckBox(F("Right-align Temperature (7dt)"), F("temp_rightalign"), bitRead(P157_CFG_FLAGS, P157_OPTION_RIGHTALIGN)); success = true; break; @@ -181,7 +184,8 @@ boolean Plugin_157(uint8_t function, struct EventStruct *event, String& string) // bitWrite(lSettings, P157_OPTION_PERIOD, isFormItemChecked(F("periods"))); bitWrite(lSettings, P157_OPTION_HIDEDEGREE, isFormItemChecked(F("hide_degree"))); - bitWrite(lSettings, P157_OPTION_RIGHTALIGN, isFormItemChecked(F("temp_rightalign"))); + + // bitWrite(lSettings, P157_OPTION_RIGHTALIGN, isFormItemChecked(F("temp_rightalign"))); # if P157_SCROLL_TEXT bitWrite(lSettings, P157_OPTION_SCROLLTEXT, isFormItemChecked(F("scroll_text"))); bitWrite(lSettings, P157_OPTION_SCROLLFULL, isFormItemChecked(F("scroll_full"))); diff --git a/src/src/PluginStructs/P157_data_struct.cpp b/src/src/PluginStructs/P157_data_struct.cpp index 7f709bfd65..378443965e 100644 --- a/src/src/PluginStructs/P157_data_struct.cpp +++ b/src/src/PluginStructs/P157_data_struct.cpp @@ -73,13 +73,12 @@ bool P157_data_struct::init(struct EventStruct *event) scrollFull = bitRead(P157_CFG_FLAGS, P157_OPTION_SCROLLFULL); setScrollSpeed(P157_CFG_SCROLLSPEED); # endif // if P157_SCROLL_TEXT - rightAlignTempMAX7219 = bitRead(P157_CFG_FLAGS, P157_OPTION_RIGHTALIGN); - suppressLeading0 = bitRead(P157_CFG_FLAGS, P157_OPTION_SUPPRESS0); - timesep = true; + suppressLeading0 = bitRead(P157_CFG_FLAGS, P157_OPTION_SUPPRESS0); + timesep = true; - // # if P157_EXTRA_FONTS - // fontset = P157_CFG_FONTSET; - // # endif // if P157_EXTRA_FONTS + # if P157_EXTRA_FONTS + fontSet = P157_CFG_FONTSET; + # endif // if P157_EXTRA_FONTS displays = P157_CFG_DISPLAYS; bufLen = P157_getDefaultDigits(displayModel, displays); @@ -120,7 +119,6 @@ void P157_data_struct::fillBufferWithTime(bool sevendgt_now, bool flag12h, bool suppressLeading0) { clearBuffer(); - const int bufToFill = P157_getDefaultDigits(displayModel, displays); if (sevendgt_now) { sevendgt_hours = node_time.hour(); @@ -135,7 +133,7 @@ void P157_data_struct::fillBufferWithTime(bool sevendgt_now, if (flag12h && (sevendgt_hours == 0)) { sevendgt_hours = 12; // if flag 12h is TRUE and h=0 adjust to h=12 } - put4NumbersInBuffer(sevendgt_hours, sevendgt_minutes, bufToFill > 4 ? sevendgt_seconds : -1, -1 + put4NumbersInBuffer(sevendgt_hours, sevendgt_minutes, bufLen > 4 ? sevendgt_seconds : -1, -1 # if P157_SUPPRESS_ZERO , suppressLeading0 # endif // if P157_SUPPRESS_ZERO @@ -333,18 +331,17 @@ void P157_data_struct::fillBufferWithDualTemp(int leftTemperature, void P157_data_struct::fillBufferWithString(const String& textToShow, bool useBinaryData) { clearBuffer(); - const size_t bufToFill = P157_getDefaultDigits(displayModel, displays); String buf(textToShow); - while (getEffectiveTextLength(buf) > bufToFill && !buf.isEmpty()) { + while (getEffectiveTextLength(buf) > bufLen && !buf.isEmpty()) { buf = buf.substring(0, buf.length() - 1); } - while (buf.length() < bufToFill) { + while (buf.length() < bufLen) { buf += ' '; } - memcpy(showbuffer, buf.c_str(), bufToFill); + memcpy(showbuffer, buf.c_str(), bufLen); # ifdef P157_DEBUG logBufferContent(F("7dtext")); @@ -396,59 +393,37 @@ bool P157_data_struct::nextScroll() { if (scrollCount == 0) { scrollCount = 0xFFFF; // Max value to avoid interference when scrolling long texts result = true; - const int bufToFill = P157_getDefaultDigits(displayModel, displays); # if P157_7DBIN_COMMAND if (binData.size() > 0) { scrollPos++; - if (scrollPos > (binData.size() - bufToFill)) { + if (scrollPos > (binData.size() - bufLen)) { scrollPos = 0; // Redisplay } scrollCount = _scrollSpeed; // Restart countdown } else # endif // if P157_7DBIN_COMMAND - { const int P157_txtlength = _textToScroll.length(); + { clearBuffer(); if (isPeriodChar(_textToScroll.charAt(scrollPos))) { scrollPos++; } - String part = _textToScroll.substring(scrollPos, scrollPos + 1.5 * bufToFill); + String part = _textToScroll.substring(scrollPos, scrollPos + 1.5 * bufLen); - while (getEffectiveTextLength(part) > bufToFill && !part.isEmpty()) { + while (getEffectiveTextLength(part) > bufLen && !part.isEmpty()) { part = part.substring(0, part.length() - 1); } - for (uint16_t i = 0; i < bufToFill && i < part.length(); ++i) { + for (uint16_t i = 0; i < bufLen && i < part.length(); ++i) { showbuffer[i] = part.charAt(i); } - // for (uint16_t i = scrollPos; i < P157_txtlength && p <= bufToFill; ++i) { // p <= bufToFill to allow a period after last digit - // const char *isPeriod = std::find(std::begin(periodchars), std::end(periodchars), _textToScroll.charAt(i)); - - // if (periods && (isPeriod != std::end(periodchars))) { // If setting periods true - // if (p == 0) { // Text starts with a period, becomes a space with a - // dot - // showperiods[p] = true; - // p++; - // } else { - // showperiods[p - 1] = true; // The period displays as a dot on the previous digit! - // } - - // if ((i > scrollPos) && (isPeriod != std::end(periodchars))) { // Handle consecutive periods - // showperiods[p - 1] = true; // The period displays as a dot on the previous digit! - // p++; - // } - // } else if (p < bufToFill) { - // showbuffer[p] = _textToScroll.charAt(i); - // p++; - // } - // } scrollPos++; - if (scrollPos > _textToScroll.length() - bufToFill) { + if (scrollPos > _textToScroll.length() - bufLen) { scrollPos = 0; // Restart when all text displayed } scrollCount = _scrollSpeed; // Restart countdown @@ -465,15 +440,14 @@ void P157_data_struct::setTextToScroll(const String& text) { free_string(_textToScroll); if (!text.isEmpty()) { - const int bufToFill = P157_getDefaultDigits(displayModel, displays); - _textToScroll.reserve(text.length() + bufToFill + (scrollFull ? bufToFill : 0)); + _textToScroll.reserve(text.length() + bufLen + (scrollFull ? bufLen : 0)); - for (int i = 0; scrollFull && i < bufToFill; ++i) { // Scroll text in from the right, so start with all spaces + for (int i = 0; scrollFull && i < bufLen; ++i) { // Scroll text in from the right, so start with all spaces _textToScroll += ' '; } _textToScroll += text; - for (int i = 0; i < bufToFill; ++i) { // Scroll text off completely before restarting + for (int i = 0; i < bufLen; ++i) { // Scroll text off completely before restarting _textToScroll += ' '; } } @@ -539,7 +513,6 @@ void P157_data_struct::clearBuffer() { void P157_data_struct::printBuffer() { if (isInitialized()) { - const size_t maxLen = P157_getDefaultDigits(displayModel, displays); # if P157_7DBIN_COMMAND if (binData.size() > 0) { @@ -547,7 +520,7 @@ void P157_data_struct::printBuffer() { String log; # endif // ifdef P157_DEBUG - for (uint16_t j = 0; j < maxLen && (scrollPos + j) < binData.size(); ++j) { + for (uint16_t j = 0; j < bufLen && (scrollPos + j) < binData.size(); ++j) { ht16k33->writeLowLevel(j, binData[scrollPos + j]); # ifdef P157_DEBUG log += formatToHex(binData[scrollPos + j]); @@ -558,7 +531,7 @@ void P157_data_struct::printBuffer() { if (loglevelActiveFor(LOG_LEVEL_INFO)) { addLog(LOG_LEVEL_INFO, strformat(F("P157 : printBuffer len: %u maxLen: %u data: %s"), - binData.size(), maxLen, log.c_str())); + binData.size(), bufLen, log.c_str())); } # endif // ifdef P157_DEBUG } else @@ -567,16 +540,16 @@ void P157_data_struct::printBuffer() { String buf = String(showbuffer); uint8_t dotOff{}; - if ((maxLen < 8) && (buf.length() > maxLen) && buf.startsWith(F(" "))) { + if ((bufLen < 8) && (buf.length() > bufLen) && buf.startsWith(F(" "))) { dotOff = 4; buf = buf.substring(4); } - while (getEffectiveTextLength(buf) > maxLen && !buf.isEmpty()) { + while (getEffectiveTextLength(buf) > bufLen && !buf.isEmpty()) { buf = buf.substring(0, buf.length() - 1); } - while (buf.length() < maxLen) { // TODO Account for offset? + while (buf.length() < bufLen) { // TODO Account for offset? buf += ' '; } @@ -584,7 +557,7 @@ void P157_data_struct::printBuffer() { if (loglevelActiveFor(LOG_LEVEL_INFO)) { addLog(LOG_LEVEL_INFO, strformat(F("P157 : printBuffer len: %u buffer: %s, maxLen: %u raw: '%s'"), - buf.length(), buf.c_str(), maxLen, showbuffer)); + buf.length(), buf.c_str(), bufLen, showbuffer)); } # endif // ifdef P157_DEBUG @@ -684,7 +657,7 @@ const char P157_commands[] PROGMEM = # if P157_7DDT_COMMAND "7ddt|" # endif // if P157_7DDT_COMMAND - "7dst|7dsd|7dtext|" + "7dst|7dsd|7dtext|7digit|" # if P157_EXTRA_FONTS "7dfont|" # endif // if P157_EXTRA_FONTS @@ -703,6 +676,7 @@ enum class P157_commands_e : int8_t { c7dst, c7dsd, c7dtext, + c7digit, # if P157_EXTRA_FONTS c7dfont, # endif // if P157_EXTRA_FONTS @@ -769,6 +743,8 @@ bool P157_data_struct::plugin_write(struct EventStruct *event, setScrollEnabled(true); // Scrolling allowed for 7dtext command # endif // if P157_SCROLL_TEXT return plugin_write_7dtext(text); + case P157_commands_e::c7digit: + return plugin_write_7digit(text); # if P157_EXTRA_FONTS case P157_commands_e::c7dfont: # if P157_SCROLL_TEXT @@ -868,7 +844,7 @@ void P157_data_struct::getDisplayLimits(int32_t& lLimit, int32_t& uLimit, int8_t offset, uint8_t displays) { - uint8_t dgts = P157_getDefaultDigits(displayModel, displays); + uint8_t dgts = min((uint8_t)8, bufLen); dgts -= offset; // Subtract an offset, used for extra symbol lLimit = -pow10(dgts - 1); // Lowest value we can display - 1 @@ -912,7 +888,6 @@ bool P157_data_struct::plugin_write_7dt(const String& text) { } float P157_temptemp = 0.0f; - bool P157_tempflagdot = false; if (!text.isEmpty()) { validFloatFromString(text, P157_temptemp); @@ -942,7 +917,6 @@ bool P157_data_struct::plugin_write_7dt(const String& text) { } else { if ((P157_temptemp < uLimitDec) && (P157_temptemp > lLimitDec)) { P157_temptemp = roundf(P157_temptemp * 10.0f); - P157_tempflagdot = true; } fillBufferWithTemp(P157_temptemp); } @@ -964,7 +938,6 @@ bool P157_data_struct::plugin_write_7ddt(const String& text) { float P157_lefttemp = 0.0f; float P157_righttemp = 0.0f; - bool P157_tempflagdot = false; if (!text.isEmpty()) { validFloatFromString(parseString(text, 1), P157_lefttemp); @@ -1083,9 +1056,10 @@ bool P157_data_struct::plugin_write_7dtext(const String& text) { # endif // ifndef BUILD_NO_DEBUG # if P157_SCROLL_TEXT setTextToScroll(EMPTY_STRING); - const uint8_t bufLen = P157_getDefaultDigits(displayModel, displays); - if (isScrollEnabled() && (getEffectiveTextLength(text) > bufLen)) { + setScrollEnabled(getEffectiveTextLength(text) > bufLen); + + if (isScrollEnabled()) { setTextToScroll(text); } else # endif // if P157_SCROLL_TEXT @@ -1127,6 +1101,10 @@ bool P157_data_struct::plugin_write_7dfont(struct EventStruct *event, bool P157_data_struct::plugin_write_7dbin(const String& text, const uint8_t offset) { + if (output != P157_DISP_MANUAL) { + return false; + } + if (!text.isEmpty()) { binData.clear(); scrollPos = 0; @@ -1186,21 +1164,21 @@ bool P157_data_struct::plugin_write_7dbin(const String& text, if (binData.size() > 0) { # if P157_SCROLL_TEXT + setScrollEnabled(binData.size() > bufLen); if (isScrollEnabled()) { - const uint8_t bufLen = P157_getDefaultDigits(displayModel, displays); + uint8_t i = 0; - for (uint8_t i = 0; scrollFull && i < bufLen; ++i) { // prepend to start display empty + for (; scrollFull && i < bufLen; ++i) { // prepend to start display empty binData.insert(binData.begin(), 0); } - for (uint8_t i; i < bufLen; ++i) { // append empty to scroll until empty + for (i = 0; i < bufLen; ++i) { // append empty to scroll until empty binData.push_back(0); } - } + } else # endif // if P157_SCROLL_TEXT - - if (!isScrollEnabled()) { + { printBuffer(); } return true; diff --git a/src/src/PluginStructs/P157_data_struct.h b/src/src/PluginStructs/P157_data_struct.h index ca54548a94..6209112c35 100644 --- a/src/src/PluginStructs/P157_data_struct.h +++ b/src/src/PluginStructs/P157_data_struct.h @@ -33,14 +33,14 @@ // # define P157_OPTION_PERIOD 0 // Period as dot # define P157_OPTION_HIDEDEGREE 1 // Hide degree symbol for temperatures -# define P157_OPTION_RIGHTALIGN 2 // Align 7dt output to the right +// # define P157_OPTION_RIGHTALIGN 2 // Align 7dt output to the right # define P157_OPTION_SCROLLTEXT 3 // Scroll text > display width # define P157_OPTION_SCROLLFULL 4 // Scroll text from the right in, starting with a blank display # define P157_OPTION_SUPPRESS0 5 // Suppress leading zero on day/hour of Date/Time display # define P157_OPTION_BLINK_DOT 6 // Use dot on second digit for flashing instead of colon # ifdef USES_P073 -# define P157_FEATURE_P073 1 // Use P073 shared functions and fonts when available +# define P157_FEATURE_P073 1 // Use P073 shared functions and fonts when available # else // ifdef USES_P073 # define P157_FEATURE_P073 0 # endif // ifdef USES_P073 @@ -58,19 +58,19 @@ # endif // if P157_FEATURE_P073 # ifndef P157_7DDT_COMMAND -# define P157_7DDT_COMMAND 1 // Enable 7ddt by default +# define P157_7DDT_COMMAND 1 // Enable 7ddt by default # endif // ifndef P157_7DDT_COMMAND # ifndef P157_EXTRA_FONTS -# define P157_EXTRA_FONTS 1 // Enable extra fonts +# define P157_EXTRA_FONTS 0 // Disable extra fonts # endif // ifndef P157_EXTRA_FONTS # ifndef P157_SCROLL_TEXT -# define P157_SCROLL_TEXT 1 // Enable scrolling of 7dtext by default +# define P157_SCROLL_TEXT 1 // Enable scrolling of 7dtext by default # endif // ifndef P157_SCROLL_TEXT # ifndef P157_7DBIN_COMMAND -# define P157_7DBIN_COMMAND 1 // Enable input of binary data via 7dbin,uint8_t,... command +# define P157_7DBIN_COMMAND 1 // Enable input of binary data via 7dbin,uint8_t,... command # endif // ifndef P157_7DBIN_COMMAND # ifndef P157_SUPPRESS_ZERO -# define P157_SUPPRESS_ZERO 1 // Enable Suppress leading zero on day/hour +# define P157_SUPPRESS_ZERO 1 // Enable Suppress leading zero on day/hour # endif // ifndef P157_SUPPRESS_ZERO # if defined(PLUGIN_SET_COLLECTION) && defined(ESP8266) @@ -95,7 +95,7 @@ # define P157_SUPPRESS_ZERO 0 # endif // if P157_SUPPRESS_ZERO # endif // if defined(PLUGIN_SET_COLLECTION) && defined(ESP8266) -# define P157_DEBUG // Leave out some debugging on demand, activates extra log info in the debug +// # define P157_DEBUG // Leave out some debugging on demand, activates extra log info in the debug const __FlashStringHelper* P157_DisplayModel(uint8_t model); uint8_t P157_getDefaultDigits(uint8_t displayModel, @@ -166,31 +166,26 @@ struct P157_data_struct : public PluginTaskData_base { void setScrollEnabled(bool scroll) { scrollAllowed = scroll; } # endif // if P157_SCROLL_TEXT - // # if P157_7DBIN_COMMAND - // void setBinaryData(const String& data); - // # endif // if P157_7DBIN_COMMAND # ifdef P157_DEBUG void logBufferContent(String prefix); # endif // ifdef P157_DEBUG void fillBufferWithDash(); void clearBuffer(); - int dotpos = -1; - char showbuffer[64] = { 0 }; - bool showperiods[64] = { 0 }; - uint8_t i2cAddress = 0; - uint8_t displayModel = 0; - uint8_t output = 0; - uint8_t brightness = 0; - uint8_t displays = 4; - uint8_t fontSet = 0; - bool timesep = false; - bool shift = false; - bool periods = false; - bool hideDegree = false; - bool rightAlignTempMAX7219 = false; - bool suppressLeading0 = false; - uint8_t fontset = 0; + int dotpos = -1; + char showbuffer[64] = { 0 }; + bool showperiods[64] = { 0 }; + uint8_t i2cAddress = 0; + uint8_t displayModel = 0; + uint8_t output = 0; + uint8_t brightness = 0; + uint8_t displays = 4; + uint8_t fontSet = 0; + bool timesep = false; + bool periods = false; + bool hideDegree = false; + bool suppressLeading0 = false; + uint8_t fontset = 0; # if P157_7DBIN_COMMAND bool binaryData = false; std::vectorbinData; @@ -209,9 +204,6 @@ struct P157_data_struct : public PluginTaskData_base { # if defined(P157_SCROLL_TEXT) || defined(P157_7DBIN_COMMAND) String _textToScroll; # endif // if defined(P157_SCROLL_TEXT) || defined(P157_7DBIN_COMMAND) - # ifdef P157_DEBUG - uint32_t counter50 = 0; - # endif // ifdef P157_DEBUG private: From 44a87ca9ee0c81ec5c928ac88a8f49dac24c5a73 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Mon, 25 May 2026 20:45:04 +0200 Subject: [PATCH 07/15] [P157] Update documentation --- docs/source/Plugin/P157.rst | 1 - .../Plugin/P157_DeviceConfiguration.png | Bin 43263 -> 38878 bytes docs/source/Plugin/P157_commands.repl | 10 ++++++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/source/Plugin/P157.rst b/docs/source/Plugin/P157.rst index 86ab6992b2..734b6be74a 100644 --- a/docs/source/Plugin/P157.rst +++ b/docs/source/Plugin/P157.rst @@ -134,7 +134,6 @@ Options (The Scroll options and feature are not included in some builds for size reasons) -* **Right align Temperature (7dt)**: By default the temperature display on 8 digit or wider displays, is shown right aligned on position 1..7. This option enabled right-aligns the temperature to position 8. Commands available ^^^^^^^^^^^^^^^^^^ diff --git a/docs/source/Plugin/P157_DeviceConfiguration.png b/docs/source/Plugin/P157_DeviceConfiguration.png index cceb910af6bffa35ec848aa42ff0c11d74d46f6d..771f48cc460bf21c996b74b955e5bf812562a138 100644 GIT binary patch literal 38878 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 bRWX;5JL_i7h&}+V3Y|ZD=}gfnyFdRwVRj(? literal 43263 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

    9=>*96y9zGDe<>>~kI(fMjPI<^vv2_jWK+H| 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,`` + + "," + Write content to a specific digit, or range of digits up to the end of the display (no scrolling supported) + + ``7digit,8,C.`` : Write a C with a period attached to digit 8 of the display (assuming it has at least 8 digits available). + + ``7digit,-4,0b110110`` : Write a bitmap (``||`` used here), similar to ``7dbin`` command, to a digit (the ``abs(dgt)`` value is used). + " From 15ad5c5337d7ae82ff614b721e88b3fad1589e55 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Thu, 28 May 2026 22:43:35 +0200 Subject: [PATCH 08/15] [P157] Additional documentation --- docs/source/Plugin/P157.rst | 20 ++++++++++++++++++ .../Plugin/P157_ht16k33-4-dgt-module.png | Bin 0 -> 71776 bytes docs/source/Plugin/P157_ht16k33-address.png | Bin 0 -> 58773 bytes docs/source/Plugin/P157_ht16k33-pinout.png | Bin 0 -> 83990 bytes 4 files changed, 20 insertions(+) create mode 100644 docs/source/Plugin/P157_ht16k33-4-dgt-module.png create mode 100644 docs/source/Plugin/P157_ht16k33-address.png create mode 100644 docs/source/Plugin/P157_ht16k33-pinout.png diff --git a/docs/source/Plugin/P157.rst b/docs/source/Plugin/P157.rst index 734b6be74a..ff456e78a7 100644 --- a/docs/source/Plugin/P157.rst +++ b/docs/source/Plugin/P157.rst @@ -38,6 +38,26 @@ Periods, comma's, colons and semicolons in text are always shown on the dots of For temperature display commands, ``7dt,`` and ``7ddt,,``, the degree symbol after the temperature can be turned off so there's room for 1 more digit of temperature on the display. +Hardware +^^^^^^^^ + +Most available 14-segment display units have 4 digits: + +.. image:: P157_ht16k33-4-dgt-module.png + +When multiple modules are combined to form a single display, the adjacent modules must get consecutive addresses, and placed from left to right with low to high addresses. The address for each unit (0x70 .. 0x77) is adjusted by adding a connection on the A0/A1/A2 solder bridges at the backside of the module. All 3 bridges open is address 0x70: + +.. image:: P157_ht16k33-address.png + +Wiring +~~~~~~ + +Wiring multiple modules is as simple as connecting the ``Vi2c``, ``VCC``, ``GND``, ``SDA`` and ``SCL`` of all modules in parallel, and connect ``Vi2c`` to ``3V3``, ``VCC`` to ``5V``, ``GND`` to ``GND`` at the ESP, and ``SDA`` and ``SCL`` to the configured I2C pins of the ESP. The modules using red LEDs will usually work at a VCC of 3V3, but connecting more than 1 module to the 3V3 of the ESP will overload the 3V3 regulator, installed on the ESP board. This split power pinout design makes it very easy to connect these modules, as no level-converter is needed to protect the GPIO pins of the ESP. + +.. image:: P157_ht16k33-pinout.png + +When connecting more than 4 modules to the same ESP, it's best to **not** connect ``Vi2c`` to more than 4 modules, as each module comes with its own pair of 10k pull-up resistors, and having too many of these in parallel will result in a too low value, causing possible display errors. + Configuration ^^^^^^^^^^^^^^ diff --git a/docs/source/Plugin/P157_ht16k33-4-dgt-module.png b/docs/source/Plugin/P157_ht16k33-4-dgt-module.png new file mode 100644 index 0000000000000000000000000000000000000000..c5cd49cc766d234f5c75eeabb51db0d98337583b GIT binary patch literal 71776 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 literal 0 HcmV?d00001 From bd82bc2b5ed90993deb2480223dad28016342b59 Mon Sep 17 00:00:00 2001 From: TD-er Date: Fri, 12 Jun 2026 15:24:03 +0200 Subject: [PATCH 09/15] [P157] Fix minimal OTA builds by ignoring NoiascaHt16k33 lib --- platformio_esp82xx_base.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platformio_esp82xx_base.ini b/platformio_esp82xx_base.ini index 68f17ae757..ce48129483 100644 --- a/platformio_esp82xx_base.ini +++ b/platformio_esp82xx_base.ini @@ -235,6 +235,7 @@ lib_ignore = ESP32_ping WakeOnLan ; Wire XPT2046_Touchscreen + NoiascaHt16k33 bb_captouch htcw_ip5306 ld2410 @@ -406,6 +407,7 @@ lib_ignore = ESP32_ping WakeOnLan Wire XPT2046_Touchscreen + NoiascaHt16k33 bb_captouch htcw_ip5306 ld2410 From 591bd63a9f6a5e8d3b012e9b08217a4246343206 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 12 Jun 2026 22:32:46 +0200 Subject: [PATCH 10/15] [P157] Address pin documentation --- docs/source/Plugin/P157.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/source/Plugin/P157.rst b/docs/source/Plugin/P157.rst index ff456e78a7..d39a9282a5 100644 --- a/docs/source/Plugin/P157.rst +++ b/docs/source/Plugin/P157.rst @@ -49,6 +49,29 @@ When multiple modules are combined to form a single display, the adjacent module .. image:: P157_ht16k33-address.png +To make the A0/A1/A2 addressing of the modules explicit: + ++---------+-------------------+ +| address | A0/A1/A2 | ++=========+===================+ +| 0x70 | all open | ++---------+-------------------+ +| 0x71 | A0 closed | ++---------+-------------------+ +| 0x72 | A1 closed | ++---------+-------------------+ +| 0x73 | A0, A1 closed | ++---------+-------------------+ +| 0x74 | A2 closed | ++---------+-------------------+ +| 0x75 | A0, A2 closed | ++---------+-------------------+ +| 0x76 | A1, A2 closed | ++---------+-------------------+ +| 0x77 | A0, A1, A2 closed | ++---------+-------------------+ + + Wiring ~~~~~~ From b29b525b8cb203f0c3e1cf2d4a00059c40a982fb Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 12 Jun 2026 22:34:56 +0200 Subject: [PATCH 11/15] [P157] Correct BUILD info documentation --- docs/source/Plugin/_plugin_substitutions_p15x.repl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/Plugin/_plugin_substitutions_p15x.repl b/docs/source/Plugin/_plugin_substitutions_p15x.repl index aa0082fe1d..cd1964efec 100644 --- a/docs/source/Plugin/_plugin_substitutions_p15x.repl +++ b/docs/source/Plugin/_plugin_substitutions_p15x.repl @@ -72,7 +72,7 @@ .. |P157_type| replace:: :cyan:`Display` .. |P157_typename| replace:: :cyan:`Display - HT16K33 14-/7-segment` .. |P157_porttype| replace:: `.` -.. |P157_status| replace:: :green:`DISPLAY` :yellow:`CLIMATE` +.. |P157_status| replace:: :green:`DISPLAY` :yellow:`COLLECTION` .. |P157_status_lb| replace:: `.` .. |P157_github| replace:: P157_14DGT.ino .. _P157_github: https://github.com/letscontrolit/ESPEasy/blob/mega/src/_P157_14DGT.ino From 21ef4b11e5d512d7160aa9933210c2ea4b34eb32 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 13 Jun 2026 21:00:51 +0200 Subject: [PATCH 12/15] [P157] Add scroll always option, optional slashed zero, delay between scroll loops --- lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp | 14 +++++++ lib/NoiascaHt16k33/src/NoiascaHt16k33.h | 4 ++ src/_P157_14DGT.ino | 25 +++++++++--- src/src/PluginStructs/P157_data_struct.cpp | 46 +++++++++++----------- src/src/PluginStructs/P157_data_struct.h | 9 ++++- 5 files changed, 67 insertions(+), 31 deletions(-) diff --git a/lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp b/lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp index a651eae9cd..881ce45d05 100644 --- a/lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp +++ b/lib/NoiascaHt16k33/src/NoiascaHt16k33.cpp @@ -221,6 +221,11 @@ uint16_t Noiasca_ht16k33_hw_7::getCharacterBitmap(uint8_t value) { } +void Noiasca_ht16k33_hw_7::setZeroSlash(bool state) { + return; // _zeroSlash = state; // Ignored for 7-segment +} + + // general write method for 7 segment size_t Noiasca_ht16k33_hw_7::write(uint8_t value) { if (value == '.' || value == ',' || value == ':' || value == ';') // dots need a special handling @@ -301,6 +306,12 @@ uint16_t Noiasca_ht16k33_hw_14::getCharacterBitmap(uint8_t value) { return 0u; } + +void Noiasca_ht16k33_hw_14::setZeroSlash(bool state) { + _zeroSlash = state; +} + + size_t Noiasca_ht16k33_hw_14::write(uint8_t value) { if (value == 35) value = 127; // MISSING: I don't remember why this is of any sence. This mapping costs 6 byte. DEPRECATED //if (value==167 || value == 248) value = 42; // degree @@ -317,6 +328,9 @@ size_t Noiasca_ht16k33_hw_14::write(uint8_t value) { else if (value > 31 && value < FONTFILE14_MAX_CHAR) // write printable ASCII characters to display { _lastBitmap = pgm_read_word_near(charTable14 + value - 32); // the table starts with the first printable character at 32 + if (_zeroSlash && ('0' == value)) { + _lastBitmap |= (SEG14_M | SEG14_N); + } #ifdef HT16K33_BUFFERSIZE displaybuffer[_currentPosition] = _lastBitmap; #endif diff --git a/lib/NoiascaHt16k33/src/NoiascaHt16k33.h b/lib/NoiascaHt16k33/src/NoiascaHt16k33.h index 56217d1836..ad5ac42d37 100644 --- a/lib/NoiascaHt16k33/src/NoiascaHt16k33.h +++ b/lib/NoiascaHt16k33/src/NoiascaHt16k33.h @@ -222,6 +222,7 @@ const uint16_t SEG14_DP = (1<<14); virtual uint16_t getCharacterBitmap(uint8_t value); + virtual void setZeroSlash(bool state); // not supported LCD API 1.0 functions // =================================== @@ -253,6 +254,7 @@ const uint16_t SEG14_DP = (1<<14); #endif uint8_t _currentPosition; // current position of cursor uint8_t _lastPosition; // last position of cursor + bool _zeroSlash = false; // Apply / to the 0 for readability }; /** \brief class for HT16K33 displays with 7 segment LEDs @@ -271,6 +273,7 @@ class Noiasca_ht16k33_hw_7 : public Noiasca_ht16k33 { // 7 segment display using Print::write; uint16_t getCharacterBitmap(uint8_t value); // using Noiasca_ht16k33::getCharacterBitmap; + void setZeroSlash(bool state); protected: uint8_t _hasColonDigit; // is set to 1 if display has a separate colon digit at digit 2 (the third column). Is on this level to have one common .write() method uint8_t _lastBitmap; // last written bitmap (if we have to reprint for the decimal point) @@ -305,6 +308,7 @@ class Noiasca_ht16k33_hw_14 : public Noiasca_ht16k33 { // 14 Segment Display using Print::write; uint16_t getCharacterBitmap(uint8_t value); // using Noiasca_ht16k33::getCharacterBitmap; + void setZeroSlash(bool state); protected: uint16_t _lastBitmap; // last written bitmap (if we have to reprint for the decimal point) }; diff --git a/src/_P157_14DGT.ino b/src/_P157_14DGT.ino index 45eea4944f..5382c6aadd 100644 --- a/src/_P157_14DGT.ino +++ b/src/_P157_14DGT.ino @@ -30,6 +30,9 @@ // /** History + * 2026-06-13 tonhuisman: Add Scroll Always option to also scroll content <= display width + * Add Zero with slash option + * Add Delay to next scroll-start option * 2026-05-25 tonhuisman: Add 7digit,, command for writing content from a specific digit 1..len * Remove right-align option, as this isn't implemented * Clean up source @@ -67,9 +70,12 @@ boolean Plugin_157(uint8_t function, struct EventStruct *event, String& string) case PLUGIN_SET_DEFAULTS: { # if P157_SCROLL_TEXT - P157_CFG_SCROLLSPEED = 10; // Default 10 * 0.1 sec scroll speed + P157_CFG_SCROLLSPEED = 10; // Default 10 * 0.1 sec scroll speed # endif // if P157_SCROLL_TEXT - P157_CFG_DISPLAYS = 1; // Default number of displays + P157_CFG_DISPLAYS = 1; // Default number of displays + uint32_t lSettings{}; + bitWrite(lSettings, P157_OPTION_ZEROSLASH, true); // Enable zero with slash by default + P157_CFG_FLAGS = lSettings; break; } @@ -148,13 +154,20 @@ boolean Plugin_157(uint8_t function, struct EventStruct *event, String& string) addFormCheckBox(F("Suppress leading 0 on day/hour"), F("supp0"), bitRead(P157_CFG_FLAGS, P157_OPTION_SUPPRESS0)); # endif // if P157_SUPPRESS_ZERO + if (!P157_is7SegmentDisplay(P157_CFG_DISPLAYTYPE)) { + addFormCheckBox(F("Use 0 with slash"), F("zero_slash"), bitRead(P157_CFG_FLAGS, P157_OPTION_ZEROSLASH)); + } + # if P157_SCROLL_TEXT - addFormCheckBox(F("Scroll text > display width"), F("scroll_text"), bitRead(P157_CFG_FLAGS, P157_OPTION_SCROLLTEXT)); - addFormCheckBox(F("Scroll text in from right"), F("scroll_full"), bitRead(P157_CFG_FLAGS, P157_OPTION_SCROLLFULL)); + addFormCheckBox(F("Scroll text > display width"), F("scroll_text"), bitRead(P157_CFG_FLAGS, P157_OPTION_SCROLLTEXT)); + addFormCheckBox(F("Scroll text also <= display width"), F("scroll_always"), bitRead(P157_CFG_FLAGS, P157_OPTION_SCROLL_ALL)); + addFormCheckBox(F("Scroll text in from right"), F("scroll_full"), bitRead(P157_CFG_FLAGS, P157_OPTION_SCROLLFULL)); if (P157_CFG_SCROLLSPEED == 0) { P157_CFG_SCROLLSPEED = 10; } addFormNumericBox(F("Scroll speed (0.1 sec/step)"), F("scrollspeed"), P157_CFG_SCROLLSPEED, 1, 600); addUnit(F("1..600 = 0.1..60 sec/step")); + addFormNumericBox(F("Delay to next scroll-start"), F("scrolldelay"), P157_CFG_SCROLLDELAY, 0, 6000); + addUnit(F("0.1 sec")); # endif // if P157_SCROLL_TEXT // addFormCheckBox(F("Right-align Temperature (7dt)"), F("temp_rightalign"), bitRead(P157_CFG_FLAGS, P157_OPTION_RIGHTALIGN)); @@ -182,14 +195,16 @@ boolean Plugin_157(uint8_t function, struct EventStruct *event, String& string) } uint32_t lSettings = 0; - // bitWrite(lSettings, P157_OPTION_PERIOD, isFormItemChecked(F("periods"))); + bitWrite(lSettings, P157_OPTION_ZEROSLASH, isFormItemChecked(F("zero_slash"))); bitWrite(lSettings, P157_OPTION_HIDEDEGREE, isFormItemChecked(F("hide_degree"))); // bitWrite(lSettings, P157_OPTION_RIGHTALIGN, isFormItemChecked(F("temp_rightalign"))); # if P157_SCROLL_TEXT bitWrite(lSettings, P157_OPTION_SCROLLTEXT, isFormItemChecked(F("scroll_text"))); + bitWrite(lSettings, P157_OPTION_SCROLL_ALL, isFormItemChecked(F("scroll_always"))); bitWrite(lSettings, P157_OPTION_SCROLLFULL, isFormItemChecked(F("scroll_full"))); P157_CFG_SCROLLSPEED = getFormItemInt(F("scrollspeed")); + P157_CFG_SCROLLDELAY = getFormItemInt(F("scrolldelay")); # endif // if P157_SCROLL_TEXT # if P157_SUPPRESS_ZERO bitWrite(lSettings, P157_OPTION_SUPPRESS0, isFormItemChecked(F("supp0"))); diff --git a/src/src/PluginStructs/P157_data_struct.cpp b/src/src/PluginStructs/P157_data_struct.cpp index 378443965e..b6e60ccb03 100644 --- a/src/src/PluginStructs/P157_data_struct.cpp +++ b/src/src/PluginStructs/P157_data_struct.cpp @@ -71,10 +71,13 @@ bool P157_data_struct::init(struct EventStruct *event) # if P157_SCROLL_TEXT txtScrolling = bitRead(P157_CFG_FLAGS, P157_OPTION_SCROLLTEXT); scrollFull = bitRead(P157_CFG_FLAGS, P157_OPTION_SCROLLFULL); + scrollAll = bitRead(P157_CFG_FLAGS, P157_OPTION_SCROLL_ALL); + scrollDelay = P157_CFG_SCROLLDELAY; setScrollSpeed(P157_CFG_SCROLLSPEED); # endif // if P157_SCROLL_TEXT suppressLeading0 = bitRead(P157_CFG_FLAGS, P157_OPTION_SUPPRESS0); timesep = true; + zeroSlash = bitRead(P157_CFG_FLAGS, P157_OPTION_ZEROSLASH); # if P157_EXTRA_FONTS fontSet = P157_CFG_FONTSET; @@ -92,6 +95,7 @@ bool P157_data_struct::init(struct EventStruct *event) if (!P157_is7SegmentDisplay(displayModel)) { ht16k33 = new (std::nothrow) Noiasca_ht16k33_hw_14(); // 14 segment + ht16k33->setZeroSlash(zeroSlash); } else { ht16k33 = new (std::nothrow) Noiasca_ht16k33_hw_7(); // 7 segment } @@ -382,6 +386,10 @@ int P157_data_struct::getEffectiveTextLength(const String& text) { bool P157_data_struct::nextScroll() { bool result = false; + if (scrollWait && (--scrollWait > 0)) { + return result; + } + if (isScrollEnabled() && (!_textToScroll.isEmpty() # if P157_7DBIN_COMMAND || binData.size() > 0 @@ -399,7 +407,8 @@ bool P157_data_struct::nextScroll() { scrollPos++; if (scrollPos > (binData.size() - bufLen)) { - scrollPos = 0; // Redisplay + scrollPos = 0; // Redisplay + scrollWait = scrollDelay; // Restart delay counter } scrollCount = _scrollSpeed; // Restart countdown } else @@ -424,7 +433,8 @@ bool P157_data_struct::nextScroll() { scrollPos++; if (scrollPos > _textToScroll.length() - bufLen) { - scrollPos = 0; // Restart when all text displayed + scrollPos = 0; // Restart when all text displayed + scrollWait = scrollDelay; // Restart delay counter } scrollCount = _scrollSpeed; // Restart countdown # ifdef P157_DEBUG @@ -466,22 +476,6 @@ void P157_data_struct::setScrollSpeed(uint8_t speed) { # endif // if P157_SCROLL_TEXT -// # if P157_7DBIN_COMMAND - -// void P157_data_struct::setBinaryData(const String& data) { -// binaryData = true; -// # if P157_SCROLL_TEXT -// setTextToScroll(data); -// binaryData = true; // is reset in setTextToScroll -// scrollCount = _scrollSpeed; -// scrollPos = 0; -// # else // if P157_SCROLL_TEXT -// _textToScroll = data; -// # endif // if P157_SCROLL_TEXT -// } - -// # endif // if P157_7DBIN_COMMAND - # ifdef P157_DEBUG void P157_data_struct::logBufferContent(String prefix) { @@ -887,7 +881,7 @@ bool P157_data_struct::plugin_write_7dt(const String& text) { return false; } - float P157_temptemp = 0.0f; + float P157_temptemp = 0.0f; if (!text.isEmpty()) { validFloatFromString(text, P157_temptemp); @@ -916,7 +910,7 @@ bool P157_data_struct::plugin_write_7dt(const String& text) { fillBufferWithDash(); } else { if ((P157_temptemp < uLimitDec) && (P157_temptemp > lLimitDec)) { - P157_temptemp = roundf(P157_temptemp * 10.0f); + P157_temptemp = roundf(P157_temptemp * 10.0f); } fillBufferWithTemp(P157_temptemp); } @@ -936,8 +930,8 @@ bool P157_data_struct::plugin_write_7ddt(const String& text) { return false; } - float P157_lefttemp = 0.0f; - float P157_righttemp = 0.0f; + float P157_lefttemp = 0.0f; + float P157_righttemp = 0.0f; if (!text.isEmpty()) { validFloatFromString(parseString(text, 1), P157_lefttemp); @@ -1057,7 +1051,7 @@ bool P157_data_struct::plugin_write_7dtext(const String& text) { # if P157_SCROLL_TEXT setTextToScroll(EMPTY_STRING); - setScrollEnabled(getEffectiveTextLength(text) > bufLen); + setScrollEnabled(scrollAll || getEffectiveTextLength(text) > bufLen); if (isScrollEnabled()) { setTextToScroll(text); @@ -1148,6 +1142,10 @@ bool P157_data_struct::plugin_write_7dbin(const String& text, # endif // if P157_EXTRA_FONTS { bitmap = ht16k33->getCharacterBitmap(argValue.charAt(i)); + + if (zeroSlash && ('0' == argValue.charAt(i)) && !P157_is7SegmentDisplay(displayModel)) { + bitmap |= (SEG14_M | SEG14_N); + } } if ((i < argValue.length()) && isPeriodChar(argValue.charAt(i + 1))) { @@ -1164,7 +1162,7 @@ bool P157_data_struct::plugin_write_7dbin(const String& text, if (binData.size() > 0) { # if P157_SCROLL_TEXT - setScrollEnabled(binData.size() > bufLen); + setScrollEnabled(scrollAll || binData.size() > bufLen); if (isScrollEnabled()) { uint8_t i = 0; diff --git a/src/src/PluginStructs/P157_data_struct.h b/src/src/PluginStructs/P157_data_struct.h index 6209112c35..334b51863c 100644 --- a/src/src/PluginStructs/P157_data_struct.h +++ b/src/src/PluginStructs/P157_data_struct.h @@ -14,6 +14,7 @@ # define P157_CFG_I2C_ADDRESS PCONFIG(4) # define P157_CFG_DISPLAYS PCONFIG(5) # define P157_CFG_FONTSET PCONFIG(6) +# define P157_CFG_SCROLLDELAY PCONFIG(7) # define P157_CFG_FLAGS PCONFIG_ULONG(0) # define P157_DISP_MANUAL 0 @@ -31,9 +32,9 @@ # define P157_CHAR_EURO 128 # define P157_CHAR_DEGREE 129 -// # define P157_OPTION_PERIOD 0 // Period as dot +# define P157_OPTION_ZEROSLASH 0 // Use zero with slash (14-segment only) # define P157_OPTION_HIDEDEGREE 1 // Hide degree symbol for temperatures -// # define P157_OPTION_RIGHTALIGN 2 // Align 7dt output to the right +# define P157_OPTION_SCROLL_ALL 2 // Scroll also when text not linger than display width # define P157_OPTION_SCROLLTEXT 3 // Scroll text > display width # define P157_OPTION_SCROLLFULL 4 // Scroll text from the right in, starting with a blank display # define P157_OPTION_SUPPRESS0 5 // Suppress leading zero on day/hour of Date/Time display @@ -195,7 +196,11 @@ struct P157_data_struct : public PluginTaskData_base { bool scrollAllowed = false; uint16_t scrollCount = 0; uint16_t scrollPos = 0; + uint16_t scrollDelay = 0; + uint16_t scrollWait = 0; bool scrollFull = false; + bool scrollAll = false; + bool zeroSlash = false; private: From a8219ea406d8463cfc39aee2012a1090547bd993 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 13 Jun 2026 21:03:48 +0200 Subject: [PATCH 13/15] [P157] Update documentation with new options --- docs/source/Plugin/P157.rst | 10 ++++++++-- .../Plugin/P157_DeviceConfiguration.png | Bin 38878 -> 46477 bytes 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/source/Plugin/P157.rst b/docs/source/Plugin/P157.rst index d39a9282a5..048eafb820 100644 --- a/docs/source/Plugin/P157.rst +++ b/docs/source/Plugin/P157.rst @@ -160,7 +160,7 @@ The four marked characters, Ä, Ö, Ü and ß, are *not* included, as they can n .. image:: P073_dSEG7Set.png -The ``^`` character is again used to display the degree symbol, and the degree symbol is not recognized! +The ``^`` character is used to display the degree symbol, and the degree symbol is not recognized! Options ^^^^^^^ @@ -169,12 +169,18 @@ Options * **Suppress leading 0 on day/hour**: When enabled, will show the hours of the time and days of the date without a leading 0 when < 10. (Not available in all builds for size reasons) +* **Use 0 with slash**: The default font has an open ``0`` symbol, like the uppercase ``O``. To have a zero with a slash through it on the display, this setting can be enabled, or disable if the user preferes an open ``0``. Only available for 14-segment displays. + * **Scroll text > display width**: Normally the ``7dtext,`` and ``7dbin,...`` commands only show the left n characters the display can hold. This option enables the Scroll Text feature, that will scroll text sent using the ``7dtext`` command (or ``7dbin`` command when available) from right to left when the content is longer than the display can show at once. +* **Scroll text also <= display width**: The default setting is to only use scrolling for text (``7dtext,...``) or binary (``7dbin,...``) content if that doesn't fit on the display. This option allows to scroll *any* content, also when it *does* fit on the display. + * **Scroll text in from right**: Normally the Scroll Text feature starts with the display filled with the left part of the text to scroll, with this option enabled, the display starts empty and the text is scrolled in from the right side of the display to the left, until all text is scrolled off. Then the scrolling restarts. * **Scroll speed (0.1 sec/step)**: Determines the speed of scrolling the text. Default value is 10, so 1 character per second. +* **Delay to next scroll-start**: Set a (non-blocking) delay after a scroll is completed (display is empty), before the next scroll is started. Range 0 to 10 minutes, in 0.1 second steps. + (The Scroll options and feature are not included in some builds for size reasons) @@ -193,7 +199,7 @@ The ``7dbin`` command allows to show any combination of segments on the display .. image:: P157_14-segment-dp-map.png -The mapping from bits to segments is ``0B(dp)ponmlkhgfedcba`` where the decimal point only takes 1 bit, of course +The mapping from bits to segments is ``0B(dp)ponmlkhgfedcba`` where the decimal point only takes 1 bit, of course. 7-segment ~~~~~~~~~ diff --git a/docs/source/Plugin/P157_DeviceConfiguration.png b/docs/source/Plugin/P157_DeviceConfiguration.png index 771f48cc460bf21c996b74b955e5bf812562a138..240e217509292f1941ea7fa3ed17780f954b5e5d 100644 GIT binary patch literal 46477 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 CMH(mo literal 38878 zcmdSB2UJtryDu8WvbQ2^6-6|H5)d&I0R=);>58EA9;J#RfrQ?o+k$`wLzNbks#2n~ z5Ly(ZhN2)K28fgp>4eZiNVqGOeb0U8ocF)?zBAsqH)A*=Yt1#+EZ_Xf@B4j;x?*Cm zXV>9fAP{Jek)f^`2(--r1mb)9#}43%@Ws|`z}F7vO9r~YH}GNURHK2fKYa{sQ6P}O z2j0IeiBN$fz(qqpJsUq=HYbYt|cuHLC`(Y617|2NXyhV`H%#i(4 ziGk~)6BQg++mfT0H*W8hl|jwA+G;Ya6_Y|eGpqX#CBD=cx-Og_`Qz)Ew|Ry#-XG4r zyRsuRAS78xVy{F8O>f)#khJ)+T&{$FP>anB+DniBF9yo-uvqVBM*ekmiJ%4TEoN3jU1mn z`t?a)_NwKsProp9jQf4*v9vvW)gLbW`;|?pMT8ofY^(0CuCQ-&WDNefd6@Rkb82nB z-zMUp0Qog0#i^6O8@qnKijmP2+tu&HuT*oWIQ*p3-1p!WrQRtmrq|+^8I2=Tjj^?+ zVpRv7!WedIS4y~D_dO^~aG?6HuAq;Qu9E}zkrHzHH+Roi*Y2N1=15=o{iYJ`RZO9( z*z2^o@wVtOk59;)f&9Fh8wb=39Qp@;53(gyA67EDlmxka_w;g#M>ScQ*6jCiW2|Fo z^1yL-;*Fk_HOQuoV`UFa&GGrw=9}V%8(NI{&h%-=VxYzugS0H zki78{kvTZ!+A0@2FXQOw$=h<5eHCtBNG&*(7himoRq@PA;ghX$sUXpl2sJ?xdij$e zJ)S+{Ik=?i!+Dn5dMTGzT&nOo)}Mau!AS$FbO%_siG$haTpjAt3%A&?MBTZYF)7y0 z#%CVrm|ZMO&L{qRgW@V=TqsFf{BY>6Am^`Lse!pzTV!UTc zuwt&hgIo@!&7+EFHS%;uXReFwz5=y&`mo)gt1M`f$?RB7feg5G&8GdFxSV7eQ5IcfAZtgU$=tnlLaCpSu(ZeF2Np$AsEVay{L#cU8T4!U7d=tH#uAEc< zH{o#9k8WC2v%t2#-N+onz+-SBk&dvUyJ2>_{P1^Ll6Dg*4kfJ#e-if{m(y09o^9U; zZ!}YNhwVdTSN`paW2yyzfxrGK{n(L{2Cf}Fr!?#&FIL$6IuW+V+Vf6KD?|KrsB+TNCz+2CJou~!XXzgAB?8-x6P9Q8Ab*1EE{ z0y_0^6q2Wb51pm`0eqdl*|ryS&C@A_w!DBv`zdXF+b^~!wq~=rUeIyv+S=x*u~E^{|}E`vRy9lR9S zkQu`6SU}Wp1lu;{>$v#gWv{ioz|EPFu;lti_*&%1`(!7K^>&cYXaWTE?yUo9nYGYA z94H;O8p;h=3#3LsylOdu9urjblKvWQb)%?(Cc3+86CF5axfPUt5*YoPH|U_TfVI23 zt4Bz|^yav&uDFfB`E?uOhBoW7$CxD_DE$zx+0(AUaD}i<_DVf^8=^-bhx9AAS=C!rc?h!V6ykTTeojad1V#1z5IgFxhUSj?>(gDYQB$33%HMn2YPk^a2CrXU zQ3-r}l#iWZ*^aL4ZbcKiQK_0L*=1q@ikr2Ww8cc~E;M5Zts)J>#FLihfMsW8F!#vihULGF0<3RsCxOZrnHIUK_dnYnPE$rlG_c^ z=QkVr+uTGqMrz03s%{QvtJDkD%$o%<3h=u2+dwu&58ALBpqCM2cDc1)0o;&~WqlQ; zmr-bnFe&PZSZqIBYdDbq-QqH*Q23#!eNy{$%d1K0V<#}?7(e_jqX{zZUaMMKhuey* z_2cnX$+}SwT=2TzW;IsxXyRm|bU6Kt)r=0c#`EqO_j{YQ^NjtZ6^FIH)eU1a?{Q=T zGN*-5OV4kJ)Lx0Y5d#7hl-t1KYD7%X&_T{+w}@jOrRB3!mRb>N*|$%SQkLw`sfH`< zdOA0K(H-PiCt$pj?AaQ!rbMFF`sbGx87q9O9m=lmT#Jspd2?lXszq`8htD6CNBjFL zst!r7z_j7PH3Q2Py6hx*{q=DIEiChb*neIlG9kl;+p+Y3o}+Cf)nmuw0eY z4C=KegyNVAarXS>4V%Jw#ySDP@cZWaL7V>8Bv`?;^=q8S=L2eZOH@K3vB3H(9yqHfulBs9i zq}!7gtS+e^PS%^Nq4Cd#-o^#nt>aV}t6>Z26$hHrv~lAk&3lV(=Gh3e9ec>S!hZ!4 zxWRZUtVSV+Z|o2Mgkb~-S6Yk zQKx#RZP&jl54aP%lvXwkcfj)>I;kk(V{M5nWY4ZoE3c6f(s?E9c!eOZ#NdfnZe5`h zEQNWs7*`dOK_A}3<=j#D_yYTxO$38B_J7dPn_+kW1rsrp?W=BJ1udsJS+J0>fujTg50n8 z-IMPsmDYfLmskz4oVTW)3pjQ3Y11@dJu%x4}rySY$H zVP#F}mC|AQiQd)nXE;sFV8E#i@ghU-yu6dIFt;!+GodE31>jau56EWNBlM0@Je|=3 zM~iPv2DY214j=V%wg@o2@RayY>d5cWh+Ex~S3)U-6KElCqGZsbJ2)WP(cb8C4%A zOPE=$a#OQ#7o`*t-#^s1G#+YYiqSTAY0@ZNDujG0r8+heXH%ru>8h_^kIP$i6R1W; z!tdsmnP!Q^Y_dfGnGpNJZd`zOa{6y#tS}qIz&ZA?;q{YpPaU?n%^D0T9l2rX5W%5`l^mKI=S2{P~99*LI~D&PNc0rl*33v=`C)6)7>9`SJM3nDxrA8@R~jEp!ap9cI?0R94iR2od9c zk*W`@q36drLo%}yA!wGSn1I+YTIFDF4j27N+@JV&?Kd4D@7j3aJY?Q{w~LVWMy zu(hm@U`|zw7kCrDh3nhMH-NEBf;_1D>(xHNu*j7nmT1%V)-%K*oCnT{h&<+TgLJD= zLlbJ3v&|5vlQP@fMHyVpK}86x;y2bSX@A!CRDdyg|e>I&Rx#?CZ+D zoDth-K|CZa;xY|)VaCR*sZ2tH3uz;E>@wg(q$9U|;V+OeK$3DJ-Ch=JOllxd)_1&~ zC&M{*L6q1H-8DS5JTn0tGfoPpH`i0-xEaV=5J>7WY^&G9M8G#+E8P3&17RrrfpgA^ z{CwSCqQO+!LcSPB*DL@mi3n;&jbL{tH;4^|DhzJ}MBoYr1lrAB>*#toA3i@e(lNhQ zl(Y0qYLlhTWsEGE-luMi|99ufMvwHY7R^p1j^3)Pab@O zT%8-*ZK}C!@nvXekFcD>UwdJ_LU=uEywjeYJ9je32SBII+V)<{of{DQO^M`-&)}?Wx$`PJ3DPfz zQx6+TvBWs+7VbKLH-*R;03B#}(;l^yWCLsGo&bp)7~V}7-I)k^2L_Bx-h<{sWRBbw zAUr84t>f7#Rp)fcsE`Dd+L9O62B6Rc#AQ0-+~;w=jO(yI}I5%)nw!)zSPE z`bMJP5w|T@yHJ%yF+&%!DrfU;iZ?dh>zt_t%_04ou!;!=O1PoCZ_I5Hr8;}DV8atZ zaNKoZQqw>jInI0G2+}oFekM_})#UrqF(776?TcUzM{M*B2N3Hxqnl~LCkV3%vAsQt z*00NAQU{B)Xk)2|ZPb}S)Xtv>v1DCM5NP$ll!+G5WAP;~lTwPS?eZMWK9JAo8ChV; z`g=|}jC%Imwrn)KwRvJXCE-+K|7F&vcBN)+REt>_Z%L9Mg!+gt(!*~8(=gt!eP~CM zQ@dh4v7dyFbr|=CpnB|}sX~wk)3sZBZ7=eoBrvU|?8|qk&Q!sL=-?y7 z;H(0zxY2B!6&`9{CBX#Ux)n@oaSbtlC_yuvPD-i-i8vq%{%S2OHMTGuznHXcl@?SB zM9~FyisW8GuiuKMoX#j-&sCZy8mL6b$O3w`!d_3`)Kek&WjMvy0pl0*)ZtZJlHw;> z&G?kXp1b8Gg@Dx;3yFTbhJxjhbu(A@(sbLf?Ew__OYmM;EpJC)Wb8*Fahj~WFKl1< zupvw{l-43nGju+8ah|@p+4_7SA?Z?b=H3JL1+$Gwh1!yNY>~?!=qo2F>us z(BV?5tQL|fhX-H%`(2)$2`tVCj@|2KXSZ}fXqMuSSpdxODT77w2a5Uc=df+qkAqH1 ztvPGYjAJ$j5#hbfzHQjnS*1yMeyi-x!pwN6fg-t)DS<$KyKF=g5$3F0n&-Gfg69i3!{ zyUjsubzQT0hmfZyysThI?b=y=1#!h_V9kGMl_S=eM=d9Rx0somdq^Q5r1B*7SfAr77Qjck~JRJ0{<)p!#M3}1TAIb7?lN|t1Hyw8= zS?Q)$zt#R~e}mLJ&ZO#=t8;clMfLKu~Lk^Jat2 z=7at4u!R?oT0HZDWKVhL`ZoRny7Dh{F`%b^U=sh!O8h^3@J?cN;Jj1N)T{jZxjFAj zpON}{=_FFf@=aA$)ki9T8F_OW(8y+ibAx||hK7zzbfk@}%u+_U9QN*f8!oU)Ba1Zh z$lOphBM<2RAh0V|d6mvNC-q0;TtuXI?X!LgTqZyNaXAsVBO#}pgq`lkClkH^H^9k1 z)VI9`-rvFsKm~pEw6fKR1882kF@J0awDZlrDA!o#$ zBii<=hVqQyyAy!Dhw{V%xCew^oHwQA2Le{4HmQRl`;!F;EA;_>w@gBls=x!#O%g8O zK4}~{Hb|Dg70S5nsXJ*U4w<9T=Xd_wv!A`$*uhH5%a5kU9v`4i9z0;F5SMhk$1OE3 zyS$^7jx*jJR|$^lzl!i!4?YRpD>N6`Ds}$nd`6Ht{(AZWV{3LXxRS6= zo1K7i0A1Ukehy|DZqZfP{$!p4h-kEaDM1+?h*>F8vvT`WCWGhEeA!k@`{SMO z?5}eS$ckAZ!A2X{P+w`_loA0MuJj$#H}jH#^yA@zrrI388Y5u*5a4`4Q9eF@$-(Q= zg^rM0axW$GG7F=Z0ign?00Q|6I1&$=MMDc~y2mOBUxdiQ)6&t{(ABxdG@yyiBcKU! zbXVNy!L(7O3(^Yhd4GF}$gY7nT2hhqNMxRC$Bpl)lf4x;{fec``({l5fjkN!?eJbL_}Gpz>K?z}NE`h(CjGb7svwr%)`b!S83}f`Gk3R9;$&lHsV}W`G-YEl< z_F8opay{zu#-9yOD4N3JB9bm9zWm(Ml{|MTjMm~zzwqlZ6Y<@NkPONtHA3`~yb^pW z>&2#$MitFa1Fps~q#1@$E}2(=i@=k$vr=;KU(bwxMlAtq@Q6{h&&&P7f*A>9fg!s% z=;3IuzC_57pEg@UJNB29rdt7;l;1Kfp~s0BoV^!@bpvchet^7qwdzJjRa&WgMp~%7$p0Rfx#jr8MxK5;< zVD{hKLB_rq%k-W3l`TMy!Y;rR9Sn1<<6I}i03(N>_*W6K%XUZ21$0xax|>ln!<0T* z9U>=#0G@28xPA{1|Fvc&$%mo@sD7&AhZ5e%Hm(20L@SjZqEnFGKLRO;aCL0zzK;QUz8ra-H!AuCkIA-BGWG*C8d~6Hokl??G z{oa|o4xxU9exN46Ko%M^LWPRNH+244>f_-3%K@00 z_JA+d2eeOH&h=dF`x8tarL~m%FdU|r#|9gHWK;6xKb81)!aX}eCDZ4_y;Q9`5f4zp zc*&l5c=e&q+Zlq^qm%x{>GLq$4R}T8gP8sa+hVEGm253j1Jwz|#s~}cGfnOTMc4|{ zI&10QoJ@9mX>f_|>kM430bI4WTwMX%ElsU^E4*xpGO=gC7*9&ZTjxg!2|y9Kbc=lc+hC&K5&!R zr;x{1ztSR+l3p4x@YEg447rc;%h3fQtasp2upN*A1{Ovk5N398x3Brt1ILZ7@9VOj zk~ZJR4jP$k`^^Qop6@{aSOqu+ZvqaUGC=Z;l~|}YCGuHHe-iy{+7|ip!%4!Bxz`yZ zJo1^GIx$O}fN5QM-8^ug+F+57-TE#_@g%;u@e*iVZk&*#7KNKQqoo~(Ct!9vA0N^qa1Ab`?Qzs zUNk<*2J?Y=^mt?MaYWeIk+i>a)~XC0AAj!oO8zMTBS?wWEd>M4BY&LOZs2$1GO}0C z4{EAJJPT*dF9oE}aWA)Fy`w%^d->6Cd-qSm`fOtxYzj-jo;z0cLdXw;e5j6awOR!C z)Ihj`^*EqmDf*0)?G78 zBrm}(g>C{iH;B@zbwA`tQFEzv$&$8!%bTyr9JZ|}Bcu%+{8aPwnmlqJt>ub>nQN2Q zcwc5(pD`jClG0zRSW7c3bEvps8v)y=Er^NBI`--kR$NcP%s7S)p-}eoda`}45}XJMGVzGFup|GPDyTgs%u(Gc&j6^+t#~pXN5cYuqqqSOlpk=)6)U1R}cI-^xjY724?4q z?;_t4mn9`~$|2g792LaEUAW#?k+$4SmYR-^d9apl#m2(8D{pg~T(YXRW^2N!mdCFHr&msW>TlP$2DjC23Nlqtzo>$w!mLQW zXkM{28ycd8B+!?%hS$S{RLKW{oJiS@0llwo=a6po67gFCL%(U54qQF3)qlsu*b^}h z#7`H2=&J2+2Q_Brsj!C=QJs^l7|%(e%-C_&Zj>E*?o!6++g3(S?nOmYU@M3FD+@(V zJxl`sIKTiK2h?011S{!`+PNt8tmIJi?wB)Dj^gRYCmysK;R1g&`T<#_(ONjIy^#DX zT0++LIo9{bk&AluZKz#z2f)EUEy^>SonA2H=1INAIOJ#Kwax-#Wk_SMn$)T-1Yjfq zRsz73ttMoWA;=Y8sQlAbS65f_(16zGfU!2$K*Z4Hfrh*Q{T~SBw;BI|pqP4sK%D?D z;f*4I8S`+1)*rVgyK@)5y}!36y$AG81VG5GraCj!N8UDzLecx@4<50l3w3pk2HOci z07v9WCSaA)uLI+yMMDjv?Y*MAd`@bOo4Fn}*U*l!_jFJIrlZ9RLH}1F?*AY@`4`x@ z4G{CUVIYy87|_wEJl2m0I1^K<;^of&Tk1Yz&t8WC@5-O)KJ ziR2SaLkw2#1p-j;+;Hs?1i%Em24L0K+@hiS(EvmOOTuOy^WFX@fWGkmxNPqU+!+Nj z#l#3sNN~)a-$Aal7G%7V(7lvvgLoSOIC^6|XvsY6(M^Y&GD?j=LK%d)^aBk45ij$) z`WfASmo-=ktf=p^f(O(`)V%vzd0?etj57p)-rd0!)%&fzv}eF`WE1*_T=v)S8d{&z z7fhXCEz>)C>X|ZE^*b+(@dHRHsSQ*Oqe{eYb%u)Go}brst5-{aSSoaDHMd6e#Vc($ zbxiu8gaCA4O8(DB22L5YA&;XiFRcdkJqJt2++B-K3eqP3>8W5gEp4v+5INrd!&gna zCJh7#yG;V$*e7g_yvMF>Jy)mskyK6?vXzsAjy8Mj$&zBy$=G5Cn3Fur~h^*g_2FYQA6{-#f4Fw@HyiCp~GdR z!pRV321FTf7I~OLvy8!1SNo%w`+o0^Bp-}_9}xQ0wXW)oVO!+QYe$7o9xZymx&Tr? zWuQoS>9;C>w5;Fly`NpNkLRU+Y&7|4aFWQ=1hr4=Y0TbKDHgYpF0Nu4qHbPdyvRvQ zlHM&QcIy{pGnNQx{Z@?|bgHlqu|TySTB0Yt+8r-q{m@mb@{A_N8;jNMThSW77&H4O zLr7+l_$<}G{kZH=OfaRjotY?faDN8#Q>ox=@FHb0La>yss^!$lQwg9qe*$<;rR&N4 z)Pws4qjfA&T`%6nndN?3U2ET(b*lv36P}p_ngw`(T6u9>pF17`b3;jIi6W^}+cLV~f0m_>xn%t8-)94`yhy*c*mh9meA`nX3orc1*24~y)2Qn& zkUH5jb~4ZOgsC@vpgIxOq}!!Y+i3U#O+DeRDOwN{Hx=4rjwvJIYpG*R8tjke=ZOD^ z)HfTNAv_ApZpU_l0O_loXS|1+xbt_blLK~6vs^CY1D+*Fsz>%@FMD;J`fC@5{vt4Q zwn67~ui5a`Z3J0n#}avK;v(_=b(8 zuNcerQKf~dXiekM4_2OQ$U^t^R`djqLWQ&NN|Jh2XxaxPXO^ir&?U0nKw3+%*AlFh zT(By6>ZBqYOm!>4Wzmq$IQ|74^Jn82d_kz_sLS*T)PakR?PZFg zX~fx_2aTOhj&VX!UA?-iq3M)>uwkXXa6TCx&MUi{}QjtxQiT*T3G0_`ZCqpVETb6FJ-FXaC>Y-Dz4co z(L*%&WoX!LM764iV5C&mWaGM6$au=cbdRe3FZ`g@1Hgt2L*J1K)BSv(3PEBHN_1)L z6FrqYn*>>A`~xNQDFI0;hNXDNw}|N%3oS|vWLm{`g#)+@drXAI2sEy#N8I10&ibJ{f~>ig^X!KzWu6cIyRF7MCXH+t9r9EkU3z33f={?{ z8|rkz#QUfc{=*GC8ZbbFgeW?>2)Y^`y{f|I?EkqLSVaH~8=~9HbR_Fl?W6KtrO#;U-`L0u7$Rh;7Nh? zNcwG$kn)y>UPYGT^%qbB%zDaUfbzREsCcH5YYsJV&tT8dbI0kw#6ScAc)59*D21c# zDtxSVOY!h~EQgVgaB$fQL~g$#IwBAUHTgP?n{z2Jewm!%!C`1EA2s#+>## z^%~vcjvu1S7?e=sBSkN^Wv_LKnxa0~KmN7h`cHuk$DI#w_{%jKs~Aow)kubJJ7KhA zqg7VU^R7a{p-IQUl{I%fsT4O6oj4b);RNf(5e$8~NbBfvjI?I|FIY^`2Gdd{8K`a! zfBT!F%hZFF7#S6}d%Aruwfrq#Ds9-ymx_;Fef(=rWx)TyX8#!;{NIHi;L`t#gWG8Z zC@#<;1)fFy-%Pgs-^!RMZNpO8?a&b^G`nD=fyC(!V`U`Qn{tQABddaS2l2Z=Hs(M5 zNb!9-s~Y zSUhp&KF4ojW9h-ru272obs%xK@eVl%&@5Vg8*L{T?^IT#;u=~z(6W1{31U z_~vwQm7ZZ9*r;#dYeacxj&TZMsijjTG=pY&CX#-GRFirlu(0DohRfy7Tftt8mFvtR zfYf&Y(r76X57o^=x)xLPMsJVDVC$CV*`Fq0W>aIS?26Q>L(}~QOkoeIRgZLr0KxZd zZBgItv!7&jYpGDI%LJd;+PSr*eC-Tl`8>y(AcYhy8_dSk`L!lN-t6ckA#OfA{FSth z6U+Gzv1*oGEDQP7(_AZ#BUeeQ_) z&}hW+33cqrdY+PR=WeG9AgAsbj9E<{KbYK>1YyxAJtx>7Gdvb;Wj#g8dcU&#L{-!J zUV}X)tube;z0PDFRW#c4zsBj9%GUafqD3=(6&5 zVBMre;p+;~ekdRyUWBbpsE}Y`Q|6gB^Mp6$@(#pma@WQ(+yFYwCdH$HurU)e5}KKk z1kux4jIwU%G^n$ipl61br>{(_I6+C=l~~b<|gQeSQ$_;olLcn#yK8&WP2f>e_(76=|YLbc&) z9B?ya_+zUMy~;07PO-&oJV76*qj@;}LFIgskA$;6Kt~3S;2%=g(eT~sl5-out5h$5rt zCtGTn0(d3+ulJ`06V;Vrn94ttTo`Q2#lv`A!8TEBs5?^@h zZIw<9W_#kIMw7MQheiVxR+oBI=dEh+B-_cqA{UH}@A{1sF4CDVB1KP`Z&W|)t4q!4 zyaroDgYP5Ou#}NB^m@#QJ(_!Iq?W`@Tp&4ckgR!eGz}8jvqJhh9vQI=r7a=YjSU<1 zF+a3Q`85FZ+Vj=gz#{kExhU+?Rvnt*QZOWb_yyf6?Pg}=s&=K0g&Mat-g88yV)V499CU0Unmgy&F%xnwBLeK0iv9!Q1x0O=U-XvOh8h#;Ndw99Y+ z8hrx}o?wm~k>g%nn-J6nhM6K;o_HTFtZ!N;s6n$yRg&|GmdyGO-J+%7-zIsm!ir@Tty2Ee<7+w zkbxXpl!963ZYaFBEj6MUB9B~5oVk6Lp**FSm7=9V9se?s;t`bs0IeGuS}0v*^)Btr zjcY&0xDJd_Yr$Y7joZmtkk#fiDrzsM!Dqux-@*!OiPdvL;ZQQx8HWg8Jgv=a4DtuP zOI1U{;$*jdr5WbkcqS7cal**lOTzlDE1;-Z=I?#qUr9be44+RNpjXuSPvqs(Wo7SG z(fK-yp8)8>G_JjWIGKC8M6MNQa-7#PwHGg} zeV8ZNX>t2DIj6Nb4}OgIu$;l`tyyX9&$a51IU7~A#??VD5vBvTF2;!uK+mN<810$^ zGQRuZcg=*Qd_5I!=)<}RomJysZlMjmDiTr-UKl_fqULS$_>h+f>1m$I?5#9DG_3C^ z@nO4B{2-FqUiuhN6^Pd^UMqCx)n{YKoD?g0RNeaXuQ=p*M1fChgqWU*7GM|~p+IdE zdcMeq+dTgO!HwF9q8DlVKg$gJ>xVi6IGR&AnL}?aN~1A)ONBiLj-B>;fz(yjVs**w zwWR{AMeRj$V7>h?OTJzuVgdeuv^2Il(Ww&tvSsM!zMyC=r?|S_RJBCNX=50&Z-2O` z(Ji|Tn1uLr`U~Xv%KL(m5yECf5Ltcm*al0i?m!*4o|G;>&o=%-^i%&~AvyulJ{#aC zr9)0P*mTIgcd{)3t| zKfEVabH#>5u_b(Y)S{LHFv*i)ww{<~B&%-C11*s1ogfPlbg50J`E|3OB}WDnBohliaigPHD? z;p~7)^kyA6PgPjOdyq%W69C9+QKmq3w9ntXb^pmRcHlQu(K|o7YahTb)8sj@(LXU& z#dB5vV5&XRSxJT|GSDJ8$jVr^-K`hDD=zgAm|B*lk!A4+y{0 z10<7X=Di;9YTE*#5#t|=YTwlI2xMbBt*&d&cpYFPpUu|#KqFMAc~rD?((rpuMguLd zelZ}hggZOay5(j}0_2}ua#skz3bw;XYT`W`Z>`qjFZbSJyK;*9KVD#|g?#RJ1~5u~ zr8X>1<-L>*CV`EmM4rD2EAeaF`>gpY8GB2(D-o~WhSiEk=FFGV0g`VpcU@HMAinyP zb5{SSMyL2Kplh`qat265St0~@sA1zrj(c$FEMP#S42eYCS#67x2x$N(LmH2KcOTBK^({vCq}08duN#o>ruyqL=Vm%8i`;{TXm7<# zZV2lRxwIuf7_{#h{ww@9+Bm7hRi6i(6gORua_FGGt}q&q3rrWZo`e5MCnP{PNWA3o zv@PRsa%k8O0Kdu09fpJkdiocGqv$C*i^LPXAr!=n2Wc;U$Bv@l)VSmJ7}w%clThi@ z;L+QFX9hfG)OZeJ=ivvQ^=utW@vqNI!Gk>wV2WN=EQM*taYji>KiB!@2EZE!c>q*l zL(PwfJ)g(!hFZwAOF9`S5!n=S3gSa41vC6PunijodI}gn9c!{58H>yu3x6CdKhU)j z;kxUHDqjMGNnavk>t`q^_qr2&pm#e`3&1IL*Nb=En|Y_bnY=$l((SyY-D;uA=zz1h z+>tEKtzv$oq_mS_rqR&>$K!}ad1k^!N{FH;47zG?Zx^Icf!4ACTSn$oZS`4CJpfm* z?n*M@1JG6#57@rc?kt%-NmdxwB$zX-do?KkTZ~X?F5eM{V{!=Z{U%~pk1M@=CQ1SGJ*zrtw8Ezx`E}9;$lUz=T>zvjw@?QbCzo6- z&korM0v(wHm^|ic7S_sOpfV_NCvDskJz?ln{g?FSQJ|9N_KsrlSDznTT3ve`92lUs z{YqvSgD*`77+l{Auo3x7>pCw1_0Bf%15)BlZqr*b_Db?!Qb0|P;=RbhB8^#E{9T=i zHtY(6(0NtE5MUY4DKt*YyRPh4ehiEx9pIC{?l;Qhb)kB+7W`+=;&*HZoY8rR_qC#5~QdOp>w@_pVUU( zdZ^#(tIRR&nTbh|PqP4W+lzeiof(hB*D`B)+w49mYtZDCi{O?Lw!9zkTSB_l*qXpf zLZIQ{+dy~Bv%sx3w6x6`#I2FXW|(#{9)OT8N;7OaH4OY*!L4nb%Di2^2va1^(!OUh z{bXjf&(8VtgYGB+lvbc-!Ij(2BNKoMcu6$(z(AG3x^Q*rtvP9<-~)6ZOQd>~r@D9= z(R;8Go3N$3V|lv2p~qDFXr>lGlfD0M>B()N$q9f0F!KK1PR1l32xP+JExu9@oV)*n z+Nf49tK1_*&r+4rQ{Yv1td#*d9VtU#7!JPMjeKJ+Gl+*9cgD6oSac8~bXPh9*%6aW z9v=L!)i}`RKdmGI?)~qvm*4mWW)AI{59zP2kMAEd*cI4NT0OsOzD@f}fen4Ha7xee z!uUwtK{lmzt~4_AaM$|yh)eaz!1!Ig%bksLi&mAkb6Q6Nc9LGjXjz;^5wVQp&8ywuoO7i z=AX}3xL;)L0PUPRW$bjYD8CqcYu5oQmqhJ*d~KNxeF0K%LR%azlj?Qeo>Now+AEEI z)&&>*)0QL^)*T)lXt;ZO;#5pK;%^V>oodj-SB!UDC7!2h+*@_A`{s}?LObW*^ftCi z!%n_nLu5wS5%!rGc5-**oTMyA+gc~~C|ScA)}bT_^05Of7P5TD>Bi@h+#+=G<7XSn zl_sIz%=Vl}ZMGx#lC~G`7gP<|VdmJo9=aoZ=)85v0iDeV0;Y7mBfwj%2enrW5tz|> z%tx`j8eZCYNoGC5zY`Ve_zBiFduhX-QO8tTy}h@ich@X4PUK5Pm#<$tL+f(Rz0Y;w zM}=;yL=<;%os4%^uB?m=xX)1vIfgjvt0K>!uT$xIT_r_v*Zt|LoRn(zOnfVHXf~hh z*AY_lml(<&PNCNf2DsOjPQ1#bb}(~>O=>u0H5toFXQmkgT^+E#Eg+A_fV38`Alzfn z^c}q&Wo7BlYK|iW^%bpsEbd_@&q*kqP9ZNKGs2&=B?X;3Bz&~v+#9Foc3RTbseG4q z#xvAVq}uuRc%cgo&DO7X+%VO$mG3|NY*|2c48J>`Hsy)R$P~#gYGsJd0i0^qQ<-Fk zKR*r;24T~3=3)pxoDyF*Ca9W0#N)CVt68PK`co|xdNdB@d3%dYsovJ@)* zhJC3hJ~K^6yGyAbnCMerqOa%Drh={{id3H9%b7bCs(9|=P7>pt8mU;sy=G*d|DxKx z#v5W%C<5lJY0-Q0Y5kJ(uG>wcJ@vE$JB8C~~l!n3zlYV_!6EVCzZAa;h^lodRBH#{%Q zu)lwEP^KfKcv({mA+10UZjTU~nxrwEn|u@2yHHB9Fx+5R#qa8ZYyp!BPNYK>AvtdZ}UFXvTr znraB(@5K-~(A0Zpt;st%aCf+RH}vQzP~X}u@^Oj(oLcj~F7t?^Vy0onv*A-6`{? z6g)ABD|LU^9+2}5svX>4@{U5Ox{zHg-Q{*b2jz7XN{O_%3WV?YBd`x z^0|?3)G#cfie6#hjk|&FVeVI?my{zIYN46;8r(H^vPDfvbVfz&qQ(&|dhU#JRY_O& zcMZwrcnw4n8WY;3$Em@r65}*+N$;EE>7Bal;H31JR`5N%Eit$oWn-GgK<)M1_1HCZ zKVys)e&isY57c=I@UJz9DjP3CP~mG$RqQ4Wl@`p7r;IyU5gMX{OZ+!?EYD2qmLW2h z^Vt?APj+5m9FsaM5zwg@aOE>8qczj0lXC(_=-@Kr)RR3&{^IP=4jfkNSzoP2MU2j0 zmryZXJ;bD)o6|7v99VAOV9~F6Q*INRDRjj^r!i(6rRzbbOBJ)n-<7mE>(c3%vDfs{ zDuggk)@mLI&%F9L;bGgeK{d+68mxUTkT~d9%WRJi$GEQ6ayXAjD!t&2RhPao9m>%V zlW`IqNB>oM`e=UjJMwSoZt-iCWb5|Tm;@8I82eJ}6k z!bjVRTH~`f(2K1Lu7EIQe0rw^%L_TeI9ICG%mJ3|-j`Q{$4(A+J)N_6z*tZ+Ha9Hj z5ew`@3So)051lbb)my@S!6c9U(#DCz!%^(ca z?WQls3Dk8j=aT6=;(NA?J+6O|ekOy^65lUHc@!%v5>$Scc5d^namUsBLUGhQgJ!O4 znBEn4+zoXdzR9TeI?L%9lY$)q{?YSSOGrJllJt`9aDkOs^Bh$182z>(E?eo+%Nda0 znnqIAeDHdWAqjqz;p-s3qONq>JE00H#&)@RYr7W%a(E1=F9Aq_9qOMRgY#C%xQw zGCvh947fs2pvk^m!ZVrk(~4_uc;M%=c*VmY5ab8n<-f87_y5&#`geizUaa|LhMgZT zDG%h`Ne){;kl)Oz>j;GWU`?6np2)!U`K0m!C}wdk<`l=n`$`18tp-8)dJ(y=39 zmHSMEvE_g(0XigSP_bHHbR$IJ9QCVR$2auUHZr#4OBCVk0QbTJQ)1nL^i2EE>uewG zM2J^hBN>Yt86?&%j@eZPd7C*;h{5jxgH%2RU?tyLXolCnzon_ZK)ULWy!q&R%HX+g zI&yr2g}Oe?BZ{xCv6v$@K1dWoG7?PaWkR_Zait6~Kx4N+Y}F5m?v}V=w#u{@LLcz&CuYe)NV5?#QzOB?VLG z-FqSlmiIAbHE!}5`11JA=9-;qNmH<}Fg$KG{SnjveUDv{pMNXGOxT69sizsh*|8Q6 zZ@Fw+UA@U+Dve`7HnTT~9#yDFEQ_|uj36-hXi@J1-_e0LPrmQnb2b=c z4Z8wXIrRB)$D3|nvyAe+a}6kt)$uwliFp#P9e#ke-WHMsJ&=8?mL3aRj9+XCR*k05SM2jKRc3t z%6Dp_-IQS(hP!O_46N&=qyITY`Oa7}v{32v$SJ#5b%pXNR+I?e{N-1iJj`NG(nN@_ zMOmAQt1tQ4&Feak`V-zyl+SyhBu@qS znI5P%a##czLP~APY>kl#d21{fFwgA~$YT<+0~sq8XWnn(EZBxlsH#0WxpGCPYcQqj zrbV{$?PT!=p6z#4yKH*ppN9mA$w|<-KHxD2-neR$epMVyco(-OF>m{4YmlW9)~0qD zgcC^NApf_(^x>axRL)L1ym_{_!{Ur!QUSETZe{RW-BsZEFY5!Qt=addJNv^wCv6}` z5dF-JIzq^=JeA8J&#l(HhEP3pBS4%EGG2TJ+XsLat4n4#&Vsa`iu2Aq5Kk;Ox*AJkZNLe;%nAVxRX;4e_MFn^Y*>b??^a=p~J++2z`2Zr_1lFpw$S${LRpJ$iHqvS z+1U0^7BAkMZP3ehI`cTFHYqzy!7r%ov!{At_|cxL$x@-DQ-@U&E~NWu>DRHnG$@br z7AI^x*G;(q=E*g?-Jh+fS5T^b!hlTSA;=B611!nsf~+5q&f~cM!2Bu}Wq8!r z!!_f@>!n>kiju3UKSk7??wYb{-1JQB%4l9l^WD7~$*!Bve;h(xMP*tk3`_G?;ZpoX7@^X9E>7(w4Wo01f&N7UbbMMCQCbxNG@q{-108hB= zuWMpiT`04qqP0RjCa|?>ZL#92DL~nX6YpQUp#P-0w${_8E=&?%Cv+!i2S(^Hi%BEU zxvcTC>aU)FuVxs84}`5O>qLaF5mJIe)?Atdr6`DHE*)C<^o9HJ*Cyr6mQ*fK&MQc8 z=cuQb2i6K*Hv&(ws*XIU@9;Qd>N0xqib7VMbJpyuA4lSK&k5bh@D_j{mYP%nDde47 z{ZG`qI|^{4g+AnM5u{7rG2iu5`RB`nITsST4!R9~6{P&%{^Ezv;fr%Gxzrfhl&PsH z`sc@o-Ogo|gfK_W3MK)T20E0u1%Br-$WdAOIyg9}VaWes$^t}fIw|M!&s+IR0jy;% ziw=r$_*eoE8@dzB;A4iw`Hw~(%iX0H);!QP0(g>t6!gRAH*nXkebADAi`GdtJCJoB zkdM8k>UVr|?4l6oju3~G;_am_f}1sd-fXBWB^@4MnN=ddi%x?Xjq@H2I`k7LmlTED zSX*m|i7My8~;#?t5MCSi!d{QMiO5di`H$~Tnf7TUz%5gv7X=Q({A5lc*H z)R-y?rZ(r(^OmfKA`T-7oOyby5~@>WHgEo(H6IDb)=@)aS9oBq4{Pnin5n!V$CCMS zO%8tbiA0V19WZfLeWHp4x3L%=aXt5G6f}75%LXXxvqw zMl5=EmEPGuNyLNBdSTi}$R1P+VBEZ5!N;lDY|bu zn=rQ8%GIDoYiJR z?9>1Sl6%QC8d@H}5$DgauY0j%3XmLfdy7ADg>(1B@22t`27Yzq76kJ|yqmVBv0)4R z+Pkay^H)o|Agb*T3Zn@<$~ zoX5Lh9#_889GJM^YlGQ~>Y#Jsn_{5MQ`o&%evrOK`1MmdeI~u%q~(|+B?1{s2FFw( z%*)*N{L>AIlc;ZWT=}w1+R+GYtZL8fIfWkc{&PY?i!FO&pkwJ0pl|FEZ5tz$Ve)EA z+m`yoY;rQSv~27tXQrnq5b~%x^?}IzZ|2i5Ck z|8C%d{>ljx*iJ^%ebh5>m2WNATAxT+UC}10qAP^qftoTa|19n#vo{FlOE7F+`oe%b&|E(JaEh1n_uS`d zemw(wWccvWrp*oLJ=rU&oo!30(DGohl~kxHwV6?rNR5~lzVi3&3JZ(w$06r6YZ_h^ z=>2sc-3!gnMc<>3Q_SlVbH}|R#`8X5?LDh^4Wj(+SFU1N86-CVgEckOXl_#_&@)ZPyUAu z9Pstu_UYu{h5zyv{tu6;z6}(%&~@Ygvyt@ww{W*+CzrP@NpEFoZldj!;t6p zzQO8QPL6lmzHWrPiwD&Sy;M}Qu{5>*D7*R{^q*Gf_#ZIe!}U9!9S{h)_K!aGi7g1t ze%fK%r+%h4hUZF>gA?l7!U~+r^tnqE4~kTcOfN_|z-qQxXv<)XXK&$TK_(lIq!`5#F)zxX2dkUtl`=#2srwk}gC2m#Eb+h7kvVMyM+alt@mTvb z7zTVu3A+7jDq!bfU0SoaOst7_r-T^e)c2>s@A17muqDWWn3orN!^U|fZ>U8vP#&jH z?2kaw^q+q&4lu?&kCa|iA6O7eFfA#9nHX-PZu`rjrey(3Q%^%W!>&n^9Qu85u>swL zl$f8kc3R|wwD;Q^w9O$<=FNw8#yflKpI-q!;!*b=~!MFMPQoY;fvrC$eEqEm`8k zC`n`$ZLND9A=f8IHIg7X=%iC60(cpPnPtE;5v)#ULt@GH12}bib$$^rGP*QmU+u+w zWse`E8V%-DBFneG-l+kRz&x4q1foJRYDcbCey+?o;vRI2J%)Jy{Md9yV!J3K{?`VC zi^21VbM&!~^AF{D>)ohEPB^*;ud>A35u_igLnKx5D+b@nV9XLw3$SErqdm2`PVM2+ z3&+n)s{604^KFr86o!N@6B8#jOllJi%&Z7Tr){FOF80_S%zHupn+vc7J`xhzU+OM* z?$GVG_n;z4_9c#}UxqI`CoWs>n&&*;}7NjnH}wVg~ERoPvYtBjOR`6RzA zF`^Y%I`a@EXU0a{Je2mG@_Z1h8wKTCvRjJ^LM1$Y&{mx}&YF;Z#zieHs>)wf4O}Ee zpHWKgm}X`^P)nD2J{b+9Ig`6?KATRS`;uf34SR6tK^0@b;Nl;t5h(E1(i0x6a{-jON(u}N)mf|Nr9 zf72Afp4bak;_w0}v-Q)u(bZ=x-8V@wJbHKoRMsHuem-adb|1*BD*sLALp})v)DO6s zSfK_wnI-eqbkS# zAlKy2rtT_Yd?d#a7G~=ph3f_*WSe|HR(jF*8M9VU#D%NdmOWYgm%OsAwoNV+mkQWZ zPwQ1LH#2f@PL4uvIFBEouG4CqvoZ{`l1ipc)5652)wkCj&hFR&XkOIK-u_q$x~h-w zOGR7PZbwSLJS$#bVsDTa80xV7U4M-25Q;T_1+v%9WK!y7c&tZ9`ikWf6P7()RVs`?72MzDB zjap?~MBH+%*sE<1_jtP1RPMvq(1f8iYkJ;PwF)EZT%SEnR|+6(y&+RvaU-2l(2)_* zG_J4Wz6%1O+NCo>XdP@+#vjC0^L37c>$8Bw%_=lId16snV zQd-xTfh%*BjqHUB>Y6m|o^nq~MM`F0MmxJb<|BInacr=I8aUHK8frY=mr11=_$c#m zYUc=cU$(~=>VB3{xPaV?(C#ZTij_Ve9+s)PxJeeH?8_~jZ& z>__*R$~LRZ>K;AwU)-c6rfnut#+g2qq!LKR;c~);iq_n?)~Ev??j!mxKYm)9t|EhP z>FBj>ul0QQuA`5cPz?qSYw zsQZP%3fHrUfw~mc*GS02je(<#KLh^^L`Rct+~rF*9*pY@d=zFiun^Vs%6%m|{*uAQ zA@&d6l{j>YqeO;rF49F$>}JUg=~V4WLb2ZAkg}#jUZj(RQgV!U#*_F7b~=~nJp=p1 zDqiYuCX@uqa6}jCO!_2r*xenro1xByp^n_Dn|3>P)6At)eQ~^|2<;m)&*!A_41kvBM3HQB0VXap;XVXC#_tCXOzq34PcHyt&s8MXv;2&CsOLh)Au= z9>?pE3fK{UUYqNc3Wr?-!n`Z}6@6ic`X##8K78K#ISC&eFWSj2_tII2KBSU^{ELq1 z{?Ml;8LV%JYHA9z>rsmvzcGj(-hmlw*6JnbSlnXUFb8wv;XQ3V*y4)f03T&eO@=3> zCSX=JKXL2~6CzC}cvKHm?N}EnKi%70M_3S3*6m4J5bMSS%XuL@4N=7a8X32^CP@fG zPZC@vD=%$=RyiRy3AKXGL-VZskt*+SvHjG00WK){~C%85~*M7opthsghhC?t+5klMRkl56M~H&%8_3iubUcffPuk zqNmIB^r8{0=z!j}wOw|Dd9<4tZq01`1%z!sBQT8vLAywi|LRoy_PGbt|4bs;S8?NKzs(Kxv{bTlpP z`0=Mcw`d*aNlgYApGTg4P8kjUi4FE6=_~Dl*ae08&PgXG$*eh;xg-R@K4v zbz^<F$q>J7^`AuEkE3tbialn1mbbgCkvD?i=@&-lDut^ik^Ru!EY>#LkMjyO8FmGorX z-XObw+{t~y@{nsrWg4z>%H;)H-xT9Mn5mO_cg81yBntVVv*wPjKslJ&L?J1+i;9c2 z#XB2>r(Q8Pi~24csJpE~*FxyZSdi0*52JTiWONBv{5~)36Ei=d;fI=09?@|rSwB!%G4*rglUCP` z&W{p%M87-d&2b-OCJm);4aJrmm)Dis?5arCb{Xmphn*Rm&7Qv@-Jh}CU>O%`btyC> z8$IOgrnBxbEl6rp_{N7!w>)wNT7@3IalnrjK@bw616>5)rCNy!jK4B1Sz+=udt?L4 ztFEBGPmA=jYM{!#C{FRS$O{P!4Q=@Pdk z+Ofd3wQ03Aw6X7A35I;j!u3*Qpdq0Gy|{Ah?ej8*o%G@;i#|RC4!&Jx3~z4-G18NR zzz$M_uafBl+$7nKAHyq%q}}6Zo!Wk`^tNGEl)-Tq^H{T+>t zxkY0S||(FPRbY-VV&A;}e*~ z-Ep7(0*36`ohU)+R>FRP1FU}m1P2}nY}CI)03WOcjh{zDM~f1=;>>S)-2?>Gzb~HA zjFuu4ya%trxq}l#7Jhj-cY(bsDTtnUZ_92-)Yc}BHJF3O zg4(S-C;R^QEjcANG26R4Ts0!0{kQ`GST~udy7{5aE)_N9+Rx% z{$;e0;P=#cm-Haanmos-aAmE$`zV3}uW-QcZb($wF41=;!$ngN<_J5|@sMOPO)1Jr&I`Ot1*KTo<^W&Fy)q`3| zY11jg65G!3hKoM~Og*r>LVu$W?^FuAv7oa(*%T-Js>i>V;NhPsCIZhR+e*h&>W4nP zg*Fs>LytpNrTH#*8B9lKMR+;#ZYY->C&qO&_xZM`|61S2)aLeYUXdnAqI5Hwg{M_& z(cK!FMz^!BWYpRj4Og5JNs~uW6>UfiS(h$?4Zn@8s~9*x|H0`PGmhXE_?R%0yJ;_t zT;p>EcD$~Qs`V8^{oxB@#g?|=VUM>*@18Q573;XWq^7{m2^@B89Y&``k53_f11)Xd zjxQ>w?9em|q!(wC?B_aH2WXlF_iaPPNHx1QGZ%o1)wqEyshP@v@?afdgBF~`P3|Hc z@eVybs|!)U;&;k_nt5);=rb4{Z(3o_93~gyExiUX9>$Zr_bBvEYIF3jLAEv|%4;R@ zr12r^g40~JijR6K^7cC_LqH6mM`L!2)QPju3`b&U?T!S|2!oA0LS6N6E!papS4eQ) zU0GXt-5qyZ*tK+*_K55CiPm$b(N|sd%i&K()D-Fy2c9`1%%v|=o7H|I{*cr9kX+5A zb^XZce3ah%Vkc3b&gJWj`_I%(Jnq1yrY7I7Lxmb5Q}W}3wM=S1dvSuX=;piX?QJTW&4jjnO_eL3q=oh`N8}u;DC+{UV zth&4jNt0Rg>xfTMjYyiPq--Q7l`|vk3Dv(HL=Hy4u0402V@x8n-6O*T&|fWl!ZmPYm4x(wlH5yfkS-<0WdwSYI)WC zS9b@ED?LYe&i+BkCuMgJ{xETM(kaWyEkb|s2s9TJiRLAmyqo2}?a>%VT+yob*@uJc zmIgH9(|!D~1h>-OYA2iFnmiBmS=h?s)1`Zw?Az4_r7;KXmy5jWBibPp;v2Onw*k-l zB=ZD65%|Vprzx45{!40HNl9UN9xdS9FIer_HaO;un1KULTf;>PleIUmpt;~!G@`Pu z&TF_X{8p3{;qCjuzvZx=?@T5ApK+#d> zW$*a6Wq0JV^(rO2{9*FE7Uew_K&wgT=Ha|wLjSoc{=v-4h$sIJBlX=^8+x`2zE{D1&~!w zrrosN-I`TXQ&ZWOp2YrGrM#c@NE!I37yPYsKV*X8+kf37EuY+tWO;=?idf3G@cipt zD#~pLIyXiQ6>UlX#!q~gz3=safyJL?UXuOpk$lC- zc*fuqc6`#=Tcs!AJU$Ls3`G!&H7&Kjz)ZV?5XtDR7*ZIs9`dIE51a4we9f;;(7Fz{k2KD`;Ob|P*(gtG$ZMk;!$r%yjygGkxFtyq~vOh zB2E$jd~N^2R16i(dManse}A@2SP~3L`tkA6%?R^pKat#M+D*xEM@7g4C$zEvhH)*L zd41fk3E@4c)p~(UsjGN?bcXaTOfti;8|S*zi;}kXIK2SbjnUiuYd)35;3+i^JR9!t zPyQi^F_Y>YDT>5_1q#?b|3Pk+*LtqTi(5cDrv$rvB!X5R&V^yWKpyWF?ORtV8LH~FzSS4xdXu<>UQ7SOP1rZDlNdI?+W3!^x z%XH6Ow={Yeybn&yUi+?;>1+?{5~;9%7w@xAEllBQ|BPSVu*T39shN`!CH1R^zdqOqh&p!TOplVZd+Xf$DEl@Wg4o3$s4f06> z-H+V@mx(7uLB}Y|cen--%YA~l-exV#Rp8Kg8lYDo7J_<-&w!JW%bBHUcVy_32Pb@b z;T~Pft~$SHUjK>!X6YJrLA553QEv=ih1|~Kl3r^t1m*iNz?}on`oGWF0*(GB2>B%j zP?SV5!{sklwzk@rGxT&SyOsqL0LCX_0s7;840vVNKml%dFE6i@%!sAjU>@6(1tJBJ zO2k#5z6F#wqJZy^2cEDE$n#6`Lu!xyOqB42yuS9w$TpDg{7vGg=J`qEQv0Rty<`Am zTc}d$r^|O_k_?U{cKk zQu?P7%?`aMd;1LDyZ&CT z{mMBa zkq{roT}2L{v=UrJ=${+zZlE@QOMC)I2)adx%8N5vvlWLYa_}MDT5Mb}yl3CqJ1d=! zE&4-P0geyh$z34>;rQzQTI>)579P}=C00I9>+}j`4~&)+7US8LCKYX}vqNt(v7{e} zT}{3?MxxsAH0{$fAFba(;Vtm!m-UuMzD)i3#GaHk)Yz&0f$RIw?p3Ob_+QGK;g4F< zp)&^4wuFis6i$TsA;{;ocUl&AkEBC~^wjo$KlQ?)`eP~Yor5lMzwv|OcuMXyTeJvV zYwDq4PQX3ygSRd*D|^z^=vF_?Rlj3Wn1i@GjuvN6*K)ASB}`-mF?c$Lys)sQ*}5UI zB_y>HLlhngbNX_u*r)g&)LvJcT;~|)HdR>r)TW(-TTVR|Gi|}=D?@T+I4UArKvWO& z;((si(BAgvzr+}DwJxC#pR{FmK6~)xK-8w0i%|QMJ>My6fI19cSz>hl1>>hR)$YW6 z!kuZVa8ioiY){E2{h0TRL-~2wrtW(0(cP0dOYZXlAiEB`v6|MQC;v-ov;nhsiJ(#K zTp_j5QBic>@{7+8Z%2vmB1-G`*k^7;w%s0_)rKf&pM}*o{I)#iz2AJ6{#GI%oYS>G z;ogRR>wSdHaK))3{={JMG-K^~O^!6?(}x3>lps{OUnbTI8O)~_a?L3-&*RaBD?z& z9hh~CcWp$N@+gHMz^^m3&IS5^y3MbDwXkRXTkg*S=5$P%6fv|$_ zQ2yl9B;=sG5kYOzkA|LK9bx=wms?2P+iu!W{8(Kl@BiUvxG3v@9)J3jaTGZV-k z9pEn5C5F7M53vT)2CyWKo{C49{R_H*8Kbc9K#S&KT}R7QkQSg(Y>QX+#{sUw0_Rj|r&A39^PwRAATd6#!fdIfne)|J7;udFwx3!*FeE z!!{83{fVdj6w!Ts`Lyf52`DjwaPM!g!P#aX7Q~9R69jKaiV-+ak5^Qp;jWi#UE@fW z>;AdsecNNS+f^}M6Q~IZfh4a_H3gW@(g!!0+OaX z<00m4ER%b>KGAk{beO$M=g*upW2b&Zb!t@oe9i%5Q{H~BI#m?utGrHzBw3w$GOo9`bQGsI0}oi;mfTb) zo7|AFM(7WBJ;;R0C0fAcP_=9Lw+2N4(SVqV6FnEm+lL;`!3Tj_`|cOW8pzNAKf9Gi z&f3&($Q79Hvn*{5RK;?sMiCZ9J21;j;oJEOyIQ2NrIN94eFJR+$<;+il3At?E~&^2zG-mta2LkK(L= z4WbtY1@_R|fR;ISPmSbdaTQyY7hX%`H?(_{z76zw?}J_q-ogBP-}61vlg1k158M#P zTvDbh<|0;eR1d~(+;4Sc)~3kH%%$4ypb5#--E-ILT;^1E^V;Mktti(KiJTe9c5$yv z%27WDozNz{EWrcqM!uP5I&)$?ZV#(X7`|jTDo!jme6lI)ucmxPepoVLc1$A3(^hs_`)Ir0 z7Zmp;h#&0N-ih%S4VwA$?UkxMF!yGja6y>POyi~C#P_%lH}+z7ncVFV|`gGwp{{9h))-Zb&!{tB;A?Fe8iiy+!Kas_ny^ z7a1Grn8>Qc_%36`yL@z@;@!Na=mx-@j5Zg8cTwaNWM49G6W@VBM6+uRojEt8kdB14 zcR!xc&YW%GI5Mr(cBjr>X&kT9Muf6&9-sM=*pxp4Mk79T1PfiUDtf(~k-@Px(3b%( z1dIogH&pG3?d`qd`w`-0w~~aDTke_h=I2J-&%>^{zKRU&_t9l}Dya-VdRNHH$wgia z=dUY|T}=$fi03{&*L1>yLVvk*g2f~o?;^+>(Rz!s>)KxW;@Ao3u~YctCLD(djE_G! z)%nFz82`-TAC&t;F3MV^h)gW-eqvHe^h1w65Bz3HGe3e?f4u~XIMlU{LoyeKz%hY+ z$A!7+frw422t2S_xQO9U6s93>b6a#K;&er*>*%SxoyP^sJoDDdD4EtJOeapT;Mf;CNB*S2Pm{!LX4y?6eBU!T|T@CU8)$*g;ixB79RDZuDcI8s& zN!~(zVtglaO692%uO|27hK11$ZZ{)J!|vWVrb%{uU*lRJ_*BUY+VSKR14Wr2iJ;Fd-Jy6&}4w2 zgTMlux=n{>7acD$r~1K%|{PMvoOjo^E|vqOIgZd(I8%* z7dFF8p@L3v2#y>|@lDwA+PDe6I52Ao*Tvv$jj#P1S~IfoA#&QlC*5C(fOU<^ox)95 zrZ;#>uWiPqZR8K?ue)nq}^sBcnnYK^a zXVsncDg0<%tC%5Bd#4w?-%O}pP!#{8@!ok<;$v$gQPt~;RHG106+G_9p!GN9Eg(tY zCU=8rXyS9Ei_aQMkA}M>e|#=^;m3?#H*+vA!4x-y?+BW=a_=N9<0P#OJtA-6ys2 zR1$cbguI`1dONy+5I7bH7{ai>Fh}x{`zI7dhg6+6{iCrHuJBDMJgLHfDXInf3lIS<;AFYC!M#hQtHAWqHF}GFM0V zj!ha=yngw4j7vzU7UgRB>|%T(GcPPT&A;Zj?KnDRRo%hJtqic z#_R*eoB%fcoyWDJa&D>N4buGdQMhK^$vhGBc}$e;JKAy%|(t5Fq>fRy2q3 zs_JHFmY}75Hcedr@_%cIiCnqZX<1m?^{mZld7I!lH;-2UXhE=_%sleUZuvEGzm}#b zwdb(Kg+2)4eU}uq%<>AWM#9`~5ciCm@`Q!HsR``$J<@rnr&L$xF57=zt>vbAq=*sG zi+-fAm4+CH;TTKM&bC5)uz2#I#_Akr%%8N7Ks40Ik)#osd{$;Ee%h8tHq_3f@DXZ5 zUEq1x%9Ry7;jGtD*>STOOVxA^a+q(*l3l3?T?Oj4?1Pyef=CwT+Br2A!m2eVaD+V8- z9rU@u*&B{dwbOpQ0FjZk70WVH9*|+}{0N&0=3a<5?Pg+2r4P`D#ET%`cTE0gT8A?-j=E zsUM;)J{A{tH2KGmz1TvWy{=OuXsy`V&uXJ#Fi{l#XhvdBLi`WXbPC^^CSxmXi0ri% z+qEqhtXV9eQY&sjgg~~_uR&gGmEi#^qVq^ax%)Ma z_P2!v+40Ut;M+0gHPX-rygln476FE}L|IsxB58L#pHW`NMNdf`Vr{9ph>m-@J|lYolgN4z*5Yxco~g~m_AjN0%8trj~9huHU${BVsq%yPBoF=U<09<~rGUTjNGm zkd?@FVBO^6M9!YB6JCGQr#7bB%BQX&uQbzS47{`NAzF;qT6cXVquFpd+(4e|ivj+h zJ?FluPuo+$jg93)!`D31OdI{GwJ_ysWT`48M?|Ph=6~4LNp9{%u*{o+x%~=WV)*w+ zFO-96x_mTWAYRaGgaokIw>J)_vjzkbNYJ`LId}`=ubsL&LRn6JmHSh&DYfVSub<9S z_$9aVdTd;c={r^S*<3tzgjQ4VH0~&Xgam-@0&10s-xJ@RGNroGEt>*Fs?w@|+h%GP zwftbz@%C1?&wXo!($;|^;fv;CSCO4oh2<*?t4xJ$9dCB4Wc_hS1#Z&YwS97Sg_N0! zc209Km&!Q=Xs+Jdz?#)A;#YncrmS*%XHzrz$kof89{TJHyfn6c{71Q!Nvv$FQ{Kc) zsZ)oVf^GH*cHHCbFu$ZKt~fomOc;JmUG~(S zh~?Ss$312xK4Yl+kLi3YDU8_@b4v#EgNI6^g+`n+Xoa5uuC-9Y$7Sy~I$rm^i)9=^ z3g1W{WbGsQheRs|cR=X`wdd#^1N8s0>PRyJ0n@N{4DR`~f?kjTd?RDqQZQ{b!1@35 ze1Hac!%8{YlSBq4w)LxbmU98JO{-hmF0{wom7XU$bv^52tf=di^)ihocrV6HcuRd1 zTA<=U>0Q+s;WZa{r|u*YZfrbh-1&#g6y=^}@LSD&n6IZ2ChLed$D3=`jrCoxP%zc8 zjb^8hGY21nSL6my{9ukR2KRF!maCpcz)VmPm(!93XQGozHBvLl`V7&i@l>yL4{UV~ z9!2VXO{to@DROZ>6GdFLv?~!6J@-^Q%+pQhvv+lAy}{mc_itsmiw|kXHfuQSA#IB< z#1>LlFvCMTQyEp%=Inu9!deV}3X+KhX@CCauFEv07g|O~mKI#6F>QGw+zM@&@j5f1 zvKDF><0FCL_W@NPq<0+!q6}X=#7UglWD~T06>4Djr-?`Wb2Yugmp; bRWX;5JL_i7h&}+V3Y|ZD=}gfnyFdRwVRj(? From c3718b75e682f1b0daa612e89886fc141f646506 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 13 Jun 2026 22:56:46 +0200 Subject: [PATCH 14/15] [P157] Don't restart scrolling when the content isn't changed (7dtext) --- src/src/PluginStructs/P157_data_struct.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/src/PluginStructs/P157_data_struct.cpp b/src/src/PluginStructs/P157_data_struct.cpp index b6e60ccb03..ad2517e531 100644 --- a/src/src/PluginStructs/P157_data_struct.cpp +++ b/src/src/PluginStructs/P157_data_struct.cpp @@ -1049,6 +1049,10 @@ bool P157_data_struct::plugin_write_7dtext(const String& text) { } # endif // ifndef BUILD_NO_DEBUG # if P157_SCROLL_TEXT + + if (_textToScroll.equals(text)) { + return true; // Success, but no change + } setTextToScroll(EMPTY_STRING); setScrollEnabled(scrollAll || getEffectiveTextLength(text) > bufLen); From f989c33cc14c87326b6fd3ce8210502ed30c16da Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 13 Jun 2026 23:19:19 +0200 Subject: [PATCH 15/15] [P157] Don't restart scrolling when the content isn't changed (7dtext and 7dbin) --- src/src/PluginStructs/P157_data_struct.cpp | 8 +++++++- src/src/PluginStructs/P157_data_struct.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/src/PluginStructs/P157_data_struct.cpp b/src/src/PluginStructs/P157_data_struct.cpp index ad2517e531..152841457b 100644 --- a/src/src/PluginStructs/P157_data_struct.cpp +++ b/src/src/PluginStructs/P157_data_struct.cpp @@ -1050,9 +1050,10 @@ bool P157_data_struct::plugin_write_7dtext(const String& text) { # endif // ifndef BUILD_NO_DEBUG # if P157_SCROLL_TEXT - if (_textToScroll.equals(text)) { + if (_lastArgument.equals(text)) { return true; // Success, but no change } + _lastArgument = text; setTextToScroll(EMPTY_STRING); setScrollEnabled(scrollAll || getEffectiveTextLength(text) > bufLen); @@ -1103,6 +1104,11 @@ bool P157_data_struct::plugin_write_7dbin(const String& text, return false; } + if (_lastArgument.equals(text)) { + return true; // Success, but no change + } + _lastArgument = text; + if (!text.isEmpty()) { binData.clear(); scrollPos = 0; diff --git a/src/src/PluginStructs/P157_data_struct.h b/src/src/PluginStructs/P157_data_struct.h index 334b51863c..864f10e177 100644 --- a/src/src/PluginStructs/P157_data_struct.h +++ b/src/src/PluginStructs/P157_data_struct.h @@ -209,6 +209,7 @@ struct P157_data_struct : public PluginTaskData_base { # if defined(P157_SCROLL_TEXT) || defined(P157_7DBIN_COMMAND) String _textToScroll; # endif // if defined(P157_SCROLL_TEXT) || defined(P157_7DBIN_COMMAND) + String _lastArgument; // Keep last argument for 7dtext and 7dbin private: