From 58539896519aa712a0012741a986f4f5be743218 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 8 Apr 2023 17:17:47 -0500 Subject: [PATCH 001/151] Update src.ino --- src/src.ino | 73 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/src/src.ino b/src/src.ino index 3bb8cfd..e9a1726 100644 --- a/src/src.ino +++ b/src/src.ino @@ -25,47 +25,68 @@ * ********************************************************************************/ -// This is a placeholder .ino file that allows you to easily edit the contents of this library using the Arduino IDE, -// as well as compile and test from this point. This file is ignored when the library is included in other sketches. - #include "HomeSpan.h" -CUSTOM_CHAR(CharFloat, 00000001-0001-0001-0001-46637266EA00, PR+PW+EV, FLOAT, 0, 0, 100, false); -CUSTOM_CHAR(CharUInt8, 00000009-0001-0001-0001-46637266EA00, PR+PW+EV, UINT8, 0, 0, 100, false); -CUSTOM_CHAR(CharUInt16, 00000016-0001-0001-0001-46637266EA00, PR+PW+EV, UINT16, 0, 0, 100, false); -CUSTOM_CHAR(CharUInt32, 00000032-0001-0001-0001-46637266EA00, PR+PW+EV, UINT32, 0, 0, 100, false); -CUSTOM_CHAR(CharInt, 00000002-0001-0001-0001-46637266EA00, PR+PW+EV, INT, 0, 0, 100, false); +struct LED_Service : Service::LightBulb { -////////////////////////////////////// + int ledPin; + boolean oldPower=false; + SpanCharacteristic *power; + LED_Service(int ledPin) : Service::LightBulb(){ + + power=new Characteristic::On(); + this->ledPin=ledPin; + pinMode(ledPin,OUTPUT); + } + + boolean update(){ + + digitalWrite(ledPin,power->getNewVal()); + oldPower=power->getNewVal(); + return(true); + } + +// void loop(){ +// if(power->getVal()!=oldPower){ +// oldPower=!oldPower; +// Serial.printf("Power was manually changed to %s\n",oldPower?"ON":"OFF"); +// } +// } +}; + +////////////////////////////////////// + +boolean oldPower=false; +LED_Service *pLed; + void setup() { Serial.begin(115200); - homeSpan.setLogLevel(1); + homeSpan.setLogLevel(2); - homeSpan.begin(Category::Other,"HomeSpan Test"); - - new SpanAccessory(); - new Service::AccessoryInformation(); - new Characteristic::Identify(); - new Service::LightBulb(); - new Characteristic::On(); - - (new Characteristic::CharFloat())->setValidValues(5,0,1,2,6,7,8); - (new Characteristic::CharUInt8())->setValidValues(5,0,1,2,6,7,8); - (new Characteristic::CharUInt16())->setValidValues(5,0,1<<8,1<<16,0xFFFFFFFF,-1); - (new Characteristic::CharUInt32())->setValidValues(5,0,1<<8,1<<16,0xFFFFFFFF,-1); - (new Characteristic::CharInt())->setValidValues(5,0,255,2000000000,-2000000000,-1)->setValidValues(1,2); + homeSpan.begin(Category::Lighting,"HomeSpan LED"); -} // end of setup() + new SpanAccessory(); + new Service::AccessoryInformation(); + new Characteristic::Identify(); + pLed=new LED_Service(13); + + homeSpan.autoPoll(8192,10,1); +} ////////////////////////////////////// void loop(){ - homeSpan.poll(); +// homeSpan.poll(); -} // end of loop() + while(pLed->power->getVal()!=oldPower){ + oldPower=pLed->power->getVal(); + Serial.printf("Power was manually changed to %s\n",oldPower?"ON":"OFF"); + } + +} ////////////////////////////////////// From 889a326e02a298dc1c3c4ef903cd6693040bed21 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Thu, 20 Apr 2023 21:56:55 -0400 Subject: [PATCH 002/151] Address conflict between SpanButton and certain Adafruit Boards Change enum from BUTTON and TOGGLE to HS_BUTTON and HS_TOGGLE to avoid conflict with #define BUTTON in certain Adafruit boards --- src/HomeSpan.cpp | 8 ++++---- src/HomeSpan.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index d5119eb..5417ead 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -969,7 +969,7 @@ void Span::processSerialCommand(const char *c){ for(auto button=PushButtons.begin(); button!=PushButtons.end(); button++){ if((*button)->service==(*svc)){ - if((*button)->buttonType==SpanButton::BUTTON) + if((*button)->buttonType==SpanButton::HS_BUTTON) Serial.printf(" \u25bc SpanButton: Pin=%d, Single=%ums, Double=%ums, Long=%ums, Type=",(*button)->pin,(*button)->singleTime,(*button)->doubleTime,(*button)->longTime); else Serial.printf(" \u25bc SpanToggle: Pin=%d, Toggle=%ums, Type=",(*button)->pin,(*button)->longTime); @@ -2118,7 +2118,7 @@ SpanRange::SpanRange(int min, int max, int step){ SpanButton::SpanButton(int pin, uint16_t longTime, uint16_t singleTime, uint16_t doubleTime, triggerType_t triggerType) : PushButton(pin, triggerType){ if(homeSpan.Accessories.empty() || homeSpan.Accessories.back()->Services.empty()){ - if(buttonType==BUTTON) + if(buttonType==HS_BUTTON) Serial.printf("\nFATAL ERROR! Can't create new SpanButton(%d,%u,%u,%u) without a defined Service ***\n",pin,longTime,singleTime,doubleTime); else Serial.printf("\nFATAL ERROR! Can't create new SpanToggle(%d,%u) without a defined Service ***\n",pin,longTime); @@ -2139,8 +2139,8 @@ SpanButton::SpanButton(int pin, uint16_t longTime, uint16_t singleTime, uint16_t void SpanButton::check(){ - if( (buttonType==BUTTON && triggered(singleTime,longTime,doubleTime)) || - (buttonType==TOGGLE && toggled(longTime)) ) // if the underlying PushButton is triggered/toggled + if( (buttonType==HS_BUTTON && triggered(singleTime,longTime,doubleTime)) || + (buttonType==HS_TOGGLE && toggled(longTime)) ) // if the underlying PushButton is triggered/toggled service->button(pin,type()); // call the Service's button() routine with pin and type as parameters } diff --git a/src/HomeSpan.h b/src/HomeSpan.h index 3b4a20d..0edcb76 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -814,11 +814,11 @@ class SpanButton : public PushButton { protected: enum buttonType_t { - BUTTON, - TOGGLE + HS_BUTTON, + HS_TOGGLE }; - buttonType_t buttonType=BUTTON; // type of SpanButton + buttonType_t buttonType=HS_BUTTON; // type of SpanButton public: @@ -842,7 +842,7 @@ class SpanToggle : public SpanButton { public: - SpanToggle(int pin, triggerType_t triggerType=TRIGGER_ON_LOW, uint16_t toggleTime=5) : SpanButton(pin,triggerType,toggleTime){buttonType=TOGGLE;}; + SpanToggle(int pin, triggerType_t triggerType=TRIGGER_ON_LOW, uint16_t toggleTime=5) : SpanButton(pin,triggerType,toggleTime){buttonType=HS_TOGGLE;}; int position(){return(pressType);} }; From 6fca946dd555c10a50ef46111259392b077a10ab Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 23 Apr 2023 07:46:37 -0500 Subject: [PATCH 003/151] Added Sodium and MbedTLS versions, and Pairing Status, to Web Log --- src/HAP.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/HAP.cpp b/src/HAP.cpp index 3db9f4a..fa4d743 100644 --- a/src/HAP.cpp +++ b/src/HAP.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "HAP.h" @@ -1263,6 +1264,13 @@ int HAPClient::getStatusURL(){ response+="ESP-IDF Version:" + String(ESP_IDF_VERSION_MAJOR) + "." + String(ESP_IDF_VERSION_MINOR) + "." + String(ESP_IDF_VERSION_PATCH) + "\n"; response+="HomeSpan Version:" + String(HOMESPAN_VERSION) + "\n"; response+="Sketch Version:" + String(homeSpan.getSketchVersion()) + "\n"; + response+="Sodium Version:" + String(sodium_version_string()) + " Lib " + String(sodium_library_version_major()) + "." + String(sodium_library_version_minor()) +"\n"; + + char mbtlsv[64]; + mbedtls_version_get_string_full(mbtlsv); + response+="MbedTLS Version:" + String(mbtlsv) + "\n"; + + response+="HomeKit Status:" + String(nAdminControllers()?"PAIRED":"NOT PAIRED") + "\n"; response+="Max Log Entries:" + String(homeSpan.webLog.maxEntries) + "\n"; response+="\n"; response+="

"; From 947e2af012378eb370f95948d710679c4d95bb25 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 23 Apr 2023 10:01:00 -0500 Subject: [PATCH 004/151] Added homeSpan.setWebLogCSS(const char *css) Allows user to define a custom style sheet to change the webLog output. Style sheet is based on pre-defined class: bod1 = main body of web page, including header (in format of

) tabl1 = top table showing general status tab2 = bottom table showing all weblog entries --- src/HAP.cpp | 10 ++++------ src/HomeSpan.h | 3 +++ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/HAP.cpp b/src/HAP.cpp index fa4d743..395da3d 100644 --- a/src/HAP.cpp +++ b/src/HAP.cpp @@ -1246,12 +1246,10 @@ int HAPClient::getStatusURL(){ String response="HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n"; response+="" + String(homeSpan.displayName) + "\n"; - response+="\n"; - response+="\n"; - response+="

" + String(homeSpan.displayName) + "

\n"; + response+="\n"; + response+="

" + String(homeSpan.displayName) + "

\n"; - response+="\n"; + response+="
\n"; response+="\n"; response+="\n"; response+="\n"; @@ -1276,7 +1274,7 @@ int HAPClient::getStatusURL(){ response+="

"; if(homeSpan.webLog.maxEntries>0){ - response+="
Up Time:" + String(uptime) + "
Current Time:" + String(clocktime) + "
Boot Time:" + String(homeSpan.webLog.bootTime) + "
\n"; + response+="
EntryUp TimeLog TimeClientMessage
\n"; int lastIndex=homeSpan.webLog.nEntries-homeSpan.webLog.maxEntries; if(lastIndex<0) lastIndex=0; diff --git a/src/HomeSpan.h b/src/HomeSpan.h index 0edcb76..ceaea9f 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -151,6 +151,7 @@ struct SpanWebLog{ // optional web status/log data char bootTime[33]="Unknown"; // boot time String statusURL; // URL of status log uint32_t waitTime=10000; // number of milliseconds to wait for initial connection to time server + String css=""; // optional user-defined style sheet for web log struct log_t { // log entry type uint64_t upTime; // number of seconds since booting @@ -341,6 +342,8 @@ class Span{ va_end(ap); } + void setWebLogCSS(const char *css){webLog.css="\n" + String(css) + "\n";} + void autoPoll(uint32_t stackSize=8192, uint32_t priority=1, uint32_t cpu=0){ // start pollTask() xTaskCreateUniversal([](void *parms){for(;;)homeSpan.pollTask();}, "pollTask", stackSize, NULL, priority, &pollTaskHandle, cpu); Serial.printf("\n*** AutoPolling Task started with priority=%d\n\n",uxTaskPriorityGet(pollTaskHandle)); From 2ce78fead6b9585bb576c487b3bb82ab2907fa6b Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 23 Apr 2023 15:14:57 -0500 Subject: [PATCH 005/151] Added charset=utf-8 to weblog to allow for utf-8 encoding --- src/HAP.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HAP.cpp b/src/HAP.cpp index 395da3d..a3cab86 100644 --- a/src/HAP.cpp +++ b/src/HAP.cpp @@ -1243,7 +1243,7 @@ int HAPClient::getStatusURL(){ sprintf(uptime,"%d:%02d:%02d:%02d",days,hours,mins,secs); - String response="HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n"; + String response="HTTP/1.1 200 OK\r\nContent-type: text/html; charset=utf-8\r\n\r\n"; response+="" + String(homeSpan.displayName) + "\n"; response+="\n"; From 8a5208aeba748a598e5ad8a931b8bc4e86d23d77 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 24 Apr 2023 06:23:49 -0500 Subject: [PATCH 006/151] Update Reference.md --- docs/Reference.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/Reference.md b/docs/Reference.md index 98f651b..8bd03b7 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -193,6 +193,10 @@ The following **optional** `homeSpan` methods enable additional features and pro * `void setTimeServerTimeout(uint32_t tSec)` * changes the default 10-second timeout period HomeSpan uses when `enableWebLog()` tries set the device clock from an internet time server to *tSec* seconds +* `void setWebLogCSS(const char *css)` + * sets the CSS style page use by the web log to a user-define CSS specified by *css* + * see [Message Logging](Logging.md) for complete details + * `void processSerialCommand(const char *CLIcommand)` * processes the *CLIcommand* just as if were typed into the Serial Monitor * allows for programmatic access to all CLI commands, included any custom commands defined by the user From faf336dd60d69ca44f731644fc8a970ee81e1d4e Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 24 Apr 2023 06:48:58 -0500 Subject: [PATCH 007/151] Update Logging.md --- docs/Logging.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/Logging.md b/docs/Logging.md index 6f40b99..a0f49cd 100644 --- a/docs/Logging.md +++ b/docs/Logging.md @@ -58,6 +58,27 @@ Additional notes: See [Example 19 - WebLog](Tutorials.md#example-19---weblog) for a tutorial sketch demonstrating the use of `homeSpan.enableWebLog()` and the WEBLOG() macro. +### Custom Style Sheets (CSS) + +HomeSpan's Web Log normally consists of black text on light blue background. However, you can create a custom style sheet for HomeSpan to use by calling the method `homeSpan.setWebLogCSS(const char *css)`, where *css* is formatted as series of [HTML classes](https://www.w3schools.com/html/html_classes.asp) containing various style elements. HomeSpan uses the following three class names for the different parts of the Web Log: + + * *bod1* - this class specifies style elements for the main body of the Web Log page, including the background color and the header text at the top (which is formatted as \ + * *tab1* - this class specifies style elements for the status table at the top of the Web Log page + * *tab2* - this class specifies style elements for the log entry table at the botom of the Web Log page + +For example, the following CSS changes the color of the page background to light yellow and header text to blue, the color of top table to light green, and the color of the botom table to light blue. It also changes the color of the text in the header row of the second table to red, and the color of the data rows in the second table to dark blue, as well as centering the text for the data rows: + + ```C++ + homeSpan.setWebLogCSS(".bod1 {background-color:lightyellow;}" + ".bod1 h2 {color:blue;}" + ".tab1 {background-color:lightgreen;}" + ".tab2 {background-color:lightblue;} .tab2 th {color:red;} .tab2 td {color:darkblue; text-align:center;}" + ); + ``` + + Note that HomeSpan outputs the full content of the Web Log HTML to the Serial Monitor + + --- [↩️](../README.md) Back to the Welcome page From 25b64919e0c3b1862498eae6971230d67f854b5d Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 24 Apr 2023 10:32:44 -0500 Subject: [PATCH 008/151] Update Logging.md --- docs/Logging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Logging.md b/docs/Logging.md index a0f49cd..5a2a01c 100644 --- a/docs/Logging.md +++ b/docs/Logging.md @@ -60,7 +60,7 @@ See [Example 19 - WebLog](Tutorials.md#example-19---weblog) for a tutorial sketc ### Custom Style Sheets (CSS) -HomeSpan's Web Log normally consists of black text on light blue background. However, you can create a custom style sheet for HomeSpan to use by calling the method `homeSpan.setWebLogCSS(const char *css)`, where *css* is formatted as series of [HTML classes](https://www.w3schools.com/html/html_classes.asp) containing various style elements. HomeSpan uses the following three class names for the different parts of the Web Log: +HomeSpan's Web Log normally consists of black text on light blue background. However, you can change use your own custom style sheets (CSS) formatting by calling the method `homeSpan.setWebLogCSS(const char *css)`, where *css* is formatted as series of [HTML classes](https://www.w3schools.com/html/html_classes.asp) containing various style elements. HomeSpan uses the following three class names for the different parts of the Web Log: * *bod1* - this class specifies style elements for the main body of the Web Log page, including the background color and the header text at the top (which is formatted as \ * *tab1* - this class specifies style elements for the status table at the top of the Web Log page From 4300dcce0b4fbb4dc66bc3e6650d12e0157c7dd7 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 24 Apr 2023 10:48:53 -0500 Subject: [PATCH 009/151] Update Reference.md --- docs/Reference.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/Reference.md b/docs/Reference.md index 8bd03b7..c713236 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -181,11 +181,11 @@ The following **optional** `homeSpan` methods enable additional features and pro * can by called from anywhere in a sketch * `void enableWebLog(uint16_t maxEntries, const char *timeServerURL, const char *timeZone, const char *logURL)` - * enables a rolling web log that displays the most recent *maxEntries* entries created by the user with the `WEBLOG()` macro. Parameters, and their default values if unspecified, are as follows: - * *maxEntries* - maximum number of (most recent) entries to save. If unspecified, defaults to 0, in which case the web log will only display status without any log entries + * enables a rolling Web Log that displays the most recent *maxEntries* entries created by the user with the `WEBLOG()` macro. Parameters, and their default values if unspecified, are as follows: + * *maxEntries* - maximum number of (most recent) entries to save. If unspecified, defaults to 0, in which case the Web Log will only display status without any log entries * *timeServerURL* - the URL of a time server that HomeSpan will use to set its clock upon startup after a WiFi connection has been established. If unspecified, default to NULL, in which case HomeSpan skips setting the device clock * *timeZone* - specifies the time zone to use for setting the clock. Uses standard Unix timezone formatting as interpreted by Espressif IDF. Note the IDF uses a somewhat non-intuitive convention such that a timezone of "UTC+5:00" *subtracts* 5 hours from UTC time, and "UTC-5:00" *adds* 5 hours to UTC time. If *serverURL=NULL* this field is ignored; if *serverURL!=NULL* this field is required - * *logURL* - the URL of the log page for this device. If unspecified, defaults to "status" + * *logURL* - the URL of the Web Log page for this device. If unspecified, defaults to "status" * example: `homeSpan.enableWebLog(50,"pool.ntp.org","UTC-1:00","myLog");` creates a web log at the URL *http://HomeSpan-\[DEVICE-ID\].local:\[TCP-PORT\]/myLog* that will display the 50 most-recent log messages produced with the WEBLOG() macro. Upon start-up (after a WiFi connection has been established) HomeSpan will attempt to set the device clock by calling the server "pool.ntp.org" and adjusting the time to be 1 hour ahead of UTC. * when attemping to connect to *timeServerURL*, HomeSpan waits 10 seconds for a response. If no response is received after the 10-second timeout period, HomeSpan assumes the server is unreachable and skips the clock-setting procedure. Use `setTimeServerTimeout()` to re-configure the 10-second timeout period to another value * see [Message Logging](Logging.md) for complete details @@ -194,8 +194,8 @@ The following **optional** `homeSpan` methods enable additional features and pro * changes the default 10-second timeout period HomeSpan uses when `enableWebLog()` tries set the device clock from an internet time server to *tSec* seconds * `void setWebLogCSS(const char *css)` - * sets the CSS style page use by the web log to a user-define CSS specified by *css* - * see [Message Logging](Logging.md) for complete details + * sets the format of the HomeSpan Web Log to the custom style sheet specified by *css* + * see [Message Logging](Logging.md) for details on how to construct *css* * `void processSerialCommand(const char *CLIcommand)` * processes the *CLIcommand* just as if were typed into the Serial Monitor From 8e7ccac85bde5874bebc68527835f25065456c8f Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 24 Apr 2023 11:08:00 -0500 Subject: [PATCH 010/151] Update Logging.md --- docs/Logging.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/Logging.md b/docs/Logging.md index 5a2a01c..ba7c99b 100644 --- a/docs/Logging.md +++ b/docs/Logging.md @@ -60,23 +60,23 @@ See [Example 19 - WebLog](Tutorials.md#example-19---weblog) for a tutorial sketc ### Custom Style Sheets (CSS) -HomeSpan's Web Log normally consists of black text on light blue background. However, you can change use your own custom style sheets (CSS) formatting by calling the method `homeSpan.setWebLogCSS(const char *css)`, where *css* is formatted as series of [HTML classes](https://www.w3schools.com/html/html_classes.asp) containing various style elements. HomeSpan uses the following three class names for the different parts of the Web Log: +HomeSpan's Web Log normally consists of black text on a light blue background. However, you can set a Custom Style Sheet (CSS) to change the format by calling `homeSpan.setWebLogCSS(const char *css)`, where *css* is constructed using [HTML classes](https://www.w3schools.com/html/html_classes.asp) containing one or more custom style elements. HomeSpan implements the following three class names for the different parts of the Web Log: - * *bod1* - this class specifies style elements for the main body of the Web Log page, including the background color and the header text at the top (which is formatted as \ + * *bod1* - this class specifies style elements for the main body of the Web Log page, including the background color and the header text at the top (which itself is formatted as \) * *tab1* - this class specifies style elements for the status table at the top of the Web Log page * *tab2* - this class specifies style elements for the log entry table at the botom of the Web Log page -For example, the following CSS changes the color of the page background to light yellow and header text to blue, the color of top table to light green, and the color of the botom table to light blue. It also changes the color of the text in the header row of the second table to red, and the color of the data rows in the second table to dark blue, as well as centering the text for the data rows: +For example, the following CSS changes the background color of the Web Log page to light yellow, the color of the header text to blue, the color of the cells in the top table to light green, and the color of the cells in the botom table to light blue. It also changes the color of the text in the header row (\) of the second table to red, the color of the data rows (\) in the second table to dark blue, and the alignment of the text in the data rows to be centered within each table cell: ```C++ - homeSpan.setWebLogCSS(".bod1 {background-color:lightyellow;}" - ".bod1 h2 {color:blue;}" - ".tab1 {background-color:lightgreen;}" - ".tab2 {background-color:lightblue;} .tab2 th {color:red;} .tab2 td {color:darkblue; text-align:center;}" - ); + homeSpan.setWebLogCSS(".bod1 {background-color:lightyellow;}" + ".bod1 h2 {color:blue;}" + ".tab1 {background-color:lightgreen;}" + ".tab2 {background-color:lightblue;} .tab2 th {color:red;} .tab2 td {color:darkblue; text-align:center;}" + ); ``` - Note that HomeSpan outputs the full content of the Web Log HTML to the Serial Monitor +Note that HomeSpan outputs the full content of the Web Log HTML, including whatever CSS you may have specified above, to the Serial Monitor whenever the Log Level is set to 1 or greater. Reviewing this output can be helpful when creating your own CSS. --- From 7e08e007347e84c7e79d65235451233b3e6a5500 Mon Sep 17 00:00:00 2001 From: Francois Date: Wed, 26 Apr 2023 13:51:42 -0400 Subject: [PATCH 011/151] Added description of Reset Reason Code to WebLog. --- src/HAP.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/HAP.cpp b/src/HAP.cpp index a3cab86..e7df1f8 100644 --- a/src/HAP.cpp +++ b/src/HAP.cpp @@ -1253,7 +1253,52 @@ int HAPClient::getStatusURL(){ response+="\n"; response+="\n"; response+="\n"; - response+="\n"; + + response+="\n"; + response+="\n"; response+="\n"; response+="\n"; From 1f675f390fa9210811e4d122bf83a2615415c8bd Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Thu, 27 Apr 2023 19:22:33 -0500 Subject: [PATCH 012/151] Update Reference.md --- docs/Reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Reference.md b/docs/Reference.md index c713236..6c224ff 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -183,7 +183,7 @@ The following **optional** `homeSpan` methods enable additional features and pro * `void enableWebLog(uint16_t maxEntries, const char *timeServerURL, const char *timeZone, const char *logURL)` * enables a rolling Web Log that displays the most recent *maxEntries* entries created by the user with the `WEBLOG()` macro. Parameters, and their default values if unspecified, are as follows: * *maxEntries* - maximum number of (most recent) entries to save. If unspecified, defaults to 0, in which case the Web Log will only display status without any log entries - * *timeServerURL* - the URL of a time server that HomeSpan will use to set its clock upon startup after a WiFi connection has been established. If unspecified, default to NULL, in which case HomeSpan skips setting the device clock + * *timeServerURL* - the URL of a time server that HomeSpan will use to set its clock upon startup after a WiFi connection has been established. If unspecified, defaults to NULL, in which case HomeSpan skips setting the device clock * *timeZone* - specifies the time zone to use for setting the clock. Uses standard Unix timezone formatting as interpreted by Espressif IDF. Note the IDF uses a somewhat non-intuitive convention such that a timezone of "UTC+5:00" *subtracts* 5 hours from UTC time, and "UTC-5:00" *adds* 5 hours to UTC time. If *serverURL=NULL* this field is ignored; if *serverURL!=NULL* this field is required * *logURL* - the URL of the Web Log page for this device. If unspecified, defaults to "status" * example: `homeSpan.enableWebLog(50,"pool.ntp.org","UTC-1:00","myLog");` creates a web log at the URL *http://HomeSpan-\[DEVICE-ID\].local:\[TCP-PORT\]/myLog* that will display the 50 most-recent log messages produced with the WEBLOG() macro. Upon start-up (after a WiFi connection has been established) HomeSpan will attempt to set the device clock by calling the server "pool.ntp.org" and adjusting the time to be 1 hour ahead of UTC. From beb79538e9ea09c34f3a0f78aeaf95699d369412 Mon Sep 17 00:00:00 2001 From: Gregg Date: Thu, 27 Apr 2023 19:29:05 -0500 Subject: [PATCH 013/151] Update to WebLog TimeServer Logic Acquiring time from a timeserver is now spawned as a separate task running in the background. This avoids blocking HomeSpan while setting the time. Default wait time has been extended from 10 seconds to 2 minutes, since there are no problems with blocking. --- src/HomeSpan.cpp | 29 ++++++++++++++++------------- src/HomeSpan.h | 4 ++-- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index 5417ead..0d1d687 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -543,10 +543,11 @@ void Span::checkConnect(){ mdns_service_txt_item_set("_hap","_tcp","logURL",webLog.statusURL.c_str()+4); // Web Log status (info only - NOT used by HAP) Serial.printf("Web Logging enabled at http://%s.local:%d%swith max number of entries=%d\n\n",hostName,tcpPortNum,webLog.statusURL.c_str()+4,webLog.maxEntries); - webLog.initTime(); + if(webLog.timeServer) + xTaskCreateUniversal(webLog.initTime, "timeSeverTaskHandle", 8096, &webLog, 1, NULL, 0); } - Serial.printf("Starting HAP Server on port %d supporting %d simultaneous HomeKit Controller Connections...\n",tcpPortNum,maxConnections); + Serial.printf("Starting HAP Server on port %d supporting %d simultaneous HomeKit Controller Connections...\n\n",tcpPortNum,maxConnections); hapServer->begin(); @@ -2182,20 +2183,22 @@ void SpanWebLog::init(uint16_t maxEntries, const char *serv, const char *tz, con /////////////////////////////// -void SpanWebLog::initTime(){ - if(!timeServer) - return; - - Serial.printf("Acquiring Time from %s (%s). Waiting %d second(s) for response... ",timeServer,timeZone,waitTime/1000); - configTzTime(timeZone,timeServer); +void SpanWebLog::initTime(void *args){ + SpanWebLog *wLog = (SpanWebLog *)args; + + WEBLOG("Acquiring Time from %s (%s)",wLog->timeServer,wLog->timeZone,wLog->waitTime/1000); + configTzTime(wLog->timeZone,wLog->timeServer); struct tm timeinfo; - if(getLocalTime(&timeinfo,waitTime)){ - strftime(bootTime,sizeof(bootTime),"%c",&timeinfo); - Serial.printf("%s\n\n",bootTime); - timeInit=true; + if(getLocalTime(&timeinfo,wLog->waitTime)){ + strftime(wLog->bootTime,sizeof(wLog->bootTime),"%c",&timeinfo); + wLog->timeInit=true; + WEBLOG("Time Acquired: %s",wLog->bootTime); } else { - Serial.printf("Can't access Time Server - time-keeping not initialized!\n\n"); + WEBLOG("Can't access Time Server after %d seconds",wLog->waitTime/1000); } + + vTaskDelete(NULL); + } /////////////////////////////// diff --git a/src/HomeSpan.h b/src/HomeSpan.h index ceaea9f..c8a0b9d 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -150,7 +150,7 @@ struct SpanWebLog{ // optional web status/log data boolean timeInit=false; // flag to indicate time has been initialized char bootTime[33]="Unknown"; // boot time String statusURL; // URL of status log - uint32_t waitTime=10000; // number of milliseconds to wait for initial connection to time server + uint32_t waitTime=120000; // number of milliseconds to wait for initial connection to time server String css=""; // optional user-defined style sheet for web log struct log_t { // log entry type @@ -161,7 +161,7 @@ struct SpanWebLog{ // optional web status/log data } *log=NULL; // array of log entries void init(uint16_t maxEntries, const char *serv, const char *tz, const char *url); - void initTime(); + static void initTime(void *args); void vLog(boolean sysMsg, const char *fmr, va_list ap); }; From 6b24ec871444fb2cb91dc441b35b542deb44e859 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Thu, 27 Apr 2023 19:34:17 -0500 Subject: [PATCH 014/151] Update Reference.md --- docs/Reference.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Reference.md b/docs/Reference.md index 6c224ff..cbd0677 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -187,11 +187,11 @@ The following **optional** `homeSpan` methods enable additional features and pro * *timeZone* - specifies the time zone to use for setting the clock. Uses standard Unix timezone formatting as interpreted by Espressif IDF. Note the IDF uses a somewhat non-intuitive convention such that a timezone of "UTC+5:00" *subtracts* 5 hours from UTC time, and "UTC-5:00" *adds* 5 hours to UTC time. If *serverURL=NULL* this field is ignored; if *serverURL!=NULL* this field is required * *logURL* - the URL of the Web Log page for this device. If unspecified, defaults to "status" * example: `homeSpan.enableWebLog(50,"pool.ntp.org","UTC-1:00","myLog");` creates a web log at the URL *http://HomeSpan-\[DEVICE-ID\].local:\[TCP-PORT\]/myLog* that will display the 50 most-recent log messages produced with the WEBLOG() macro. Upon start-up (after a WiFi connection has been established) HomeSpan will attempt to set the device clock by calling the server "pool.ntp.org" and adjusting the time to be 1 hour ahead of UTC. - * when attemping to connect to *timeServerURL*, HomeSpan waits 10 seconds for a response. If no response is received after the 10-second timeout period, HomeSpan assumes the server is unreachable and skips the clock-setting procedure. Use `setTimeServerTimeout()` to re-configure the 10-second timeout period to another value + * when attemping to connect to *timeServerURL*, HomeSpan waits 120 seconds for a response. This is done in the background and does not block HomeSpan from running as usual while it tries to set the time. If no response is received after the 120-second timeout period, HomeSpan assumes the server is unreachable and skips the clock-setting procedure. Use `setTimeServerTimeout()` to re-configure the 120-second timeout period to another value * see [Message Logging](Logging.md) for complete details * `void setTimeServerTimeout(uint32_t tSec)` - * changes the default 10-second timeout period HomeSpan uses when `enableWebLog()` tries set the device clock from an internet time server to *tSec* seconds + * changes the default 120-second timeout period HomeSpan uses when `enableWebLog()` tries set the device clock from an internet time server to *tSec* seconds * `void setWebLogCSS(const char *css)` * sets the format of the HomeSpan Web Log to the custom style sheet specified by *css* From ec1cd4438279a36ae6dcda7f3e121add06ab1f73 Mon Sep 17 00:00:00 2001 From: Gregg Date: Thu, 27 Apr 2023 19:53:33 -0500 Subject: [PATCH 015/151] Small tweaks to reset reasons in web log --- src/HAP.cpp | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/src/HAP.cpp b/src/HAP.cpp index e7df1f8..118da3e 100644 --- a/src/HAP.cpp +++ b/src/HAP.cpp @@ -1254,50 +1254,45 @@ int HAPClient::getStatusURL(){ response+="\n"; response+="\n"; - response+="\n"; + response+=" (" + String(esp_reset_reason()) + ")\n"; response+="\n"; response+="\n"; From 9b3d0c02eeebc9dfad41d35ec6b6594146cd7dda Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 29 Apr 2023 15:15:16 -0500 Subject: [PATCH 016/151] Update README.md --- README.md | 35 +++++++++-------------------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 345c0c1..acd8c33 100644 --- a/README.md +++ b/README.md @@ -48,36 +48,19 @@ HomeSpan requires version 2.0.0 or later of the [Arduino-ESP32 Board Manager](ht * Launch the WiFi Access Point * A standalone, detailed End-User Guide -## ❗Latest Update - HomeSpan 1.7.2 (4/5/2023) +## ❗Latest Update - HomeSpan 1.7.3 (MM/DD/2023) -* **New ability to set OTA password from within sketch** - * See the [OTA Page](docs/OTA.md) for details +* **Upgrades to HomeSpan Web Log output** -* **Added logic to allow duplicates of the same Custom Characteristic to be "defined" in more than one file in a sketch** - * Allows the use of the same Custom Characteristic across multiple files in the same sketch without the compiler throwing a "redefinition error" - * See the [API Reference](docs/Reference.md) for details + * adds new method `void homeSpan.setWebLogCSS(const char *css)` that allows you to define custom style sheets (CSS) for the Web Log text, tables, and background + * adds version numbers for the Sodium and MbedTLS libraries, HomeKit pairing status, and a text description of Reset Reason code + * see [Message Logging](Logging.md) for details -* **Extended functionality of `setValidValues()` to work with more than just UINT8 Characteristics** - * Now works with INT, UINT16, and UINT32 Characteristics, as well as UINT8 Characteristics - * See the [API Reference](docs/Reference.md) for details - -* **New parameters added to `autoPoll()` that allow the user to set priority and chose CPU** - * Provides for enhanced performance on dual-processor chips - * See the [API Reference](docs/Reference.md) for details - -* **Automatic LED Fading!** - * Added new methods to LedPin class that enable use of the ESP32's built-in fade controls - * Allows user to specify speed of fade - * Runs in background without consuming any CPU resources - * See the [PWM Page](docs/PWM.md) for details - -* **Added ability to Clone the Pairing Data from one device to another** - * Adds new 'P' and 'C' commands to the CLI - * Enables a broken device to be swapped for a new device (running the same sketch) without the need to unpair the old device or pair the new device - * Avoids loss of automations, scenes, and any other Home App customizations associated with device - * New and old device can be different chips (e.g. ESP32-S2 versus ESP32-C3) - * See the new [Cloning Page](docs/Cloning.md) for details +* **Upgrades to Web Log Time Server initialization** + * the process for retrieving the time and date from an NTP server upon booting now runs in the background as a separate task + * HomeSpan is no longer blocked from running during the NTP query + See [Releases](https://github.com/HomeSpan/HomeSpan/releases) for details on all changes and bug fixes included in this update. # HomeSpan Resources From a3b5508791d7359815e6e028cc77e87df6ebcb96 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 29 Apr 2023 15:15:52 -0500 Subject: [PATCH 017/151] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index acd8c33..05e371c 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ HomeSpan requires version 2.0.0 or later of the [Arduino-ESP32 Board Manager](ht * adds new method `void homeSpan.setWebLogCSS(const char *css)` that allows you to define custom style sheets (CSS) for the Web Log text, tables, and background * adds version numbers for the Sodium and MbedTLS libraries, HomeKit pairing status, and a text description of Reset Reason code - * see [Message Logging](Logging.md) for details + * see [Message Logging](docs/Logging.md) for details * **Upgrades to Web Log Time Server initialization** From 0f3b798fccb7f8f491817d6df29440112a126471 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 29 Apr 2023 15:18:33 -0500 Subject: [PATCH 018/151] Bumped version to 1.7.3 --- src/Settings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Settings.h b/src/Settings.h index 9dcdb7a..2cffe73 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -36,7 +36,7 @@ #define HS_MAJOR 1 #define HS_MINOR 7 -#define HS_PATCH 2 +#define HS_PATCH 3 #define STRINGIFY(x) _STR(x) #define _STR(x) #x From 320ad6f819574c1165bd7bd229ceb155257ac80e Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 29 Apr 2023 15:19:09 -0500 Subject: [PATCH 019/151] Update library.properties --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index d531b0c..6ef42cc 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=HomeSpan -version=1.7.2 +version=1.7.3 author=Gregg maintainer=Gregg sentence=A robust and extremely easy-to-use HomeKit implementation for the Espressif ESP32 running on the Arduino IDE. From 34be49393a38a2acc42d16df589c71ac2b3ad8ab Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 30 Apr 2023 09:04:56 -0500 Subject: [PATCH 020/151] Update RemoteTempSensor.ino fixed typed in a comment --- .../RemoteSensors/RemoteTempSensor/RemoteTempSensor.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Other Examples/RemoteSensors/RemoteTempSensor/RemoteTempSensor.ino b/examples/Other Examples/RemoteSensors/RemoteTempSensor/RemoteTempSensor.ino index 4157707..63d5931 100644 --- a/examples/Other Examples/RemoteSensors/RemoteTempSensor/RemoteTempSensor.ino +++ b/examples/Other Examples/RemoteSensors/RemoteTempSensor/RemoteTempSensor.ino @@ -58,7 +58,7 @@ #define DIAGNOSTIC_MODE #define SAMPLE_TIME 30000 // Time between temperature samples (in milliseconds) -#define I2C_ADD 0x48 // ICS Address to use for the Adafruit ADT7410 +#define I2C_ADD 0x48 // I2C Address to use for the Adafruit ADT7410 SpanPoint *mainDevice; From a36552e0ca32741bc8fae8269dd3e250abd637c3 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sun, 30 Apr 2023 10:05:40 -0500 Subject: [PATCH 021/151] Update GettingStarted.md --- docs/GettingStarted.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/GettingStarted.md b/docs/GettingStarted.md index 09b84d0..bf53f36 100644 --- a/docs/GettingStarted.md +++ b/docs/GettingStarted.md @@ -52,7 +52,7 @@ In addition to being able to configure a HomeSpan device using the [HomeSpan CLI The Control Button should be installed between ground and any pin on the ESP32 that can serve as an input. To inform HomeSpan of which pin you chose, you must call the method `homeSpan.setControlPin(pin)` near the top of your sketch (see the [HomeSpan API Reference](Reference.md) for details), else HomeSpan will assume a Control Button has **not** be installed. -Similarly, the Status LED can be connected to any pin on the ESP32 that can serve as an output (and grounded through an appropriately-sized current-limiting resistor). To inform HomeSpan of which pin you chose, you must call the method `homeSpan.setStatusPin(pin)` near the top of your sketch, else HomeSpan will assume a Status LED has **not** been installed. Note some ESP32 boards have a built-in LED --- it is fine to use this for the Status LED if it is a simple on/off LED, *not* an addressable color LED that requires a special driver. +Similarly, the Status LED can be connected to any pin on the ESP32 that can serve as an output (and grounded through an appropriately-sized current-limiting resistor). To inform HomeSpan of which pin you chose, you must call the method `homeSpan.setStatusPin(pin)` near the top of your sketch, else HomeSpan will assume a Status LED has **not** been installed. Note some ESP32 boards have a built-in LED --- it is fine to use this for the Status LED if it is a simple on/off LED. If your built-in LED is an RGB NeoPixel, or if you would like to use an external RGB NeoPixel for your Status LED, call the method `homeSpan.setStatusPixel(pin)` instead, in which case HomeSpan will use its NeoPixel driver to operate the status LED. Using the Control Button and Status LED to configure a standalone HomeSpan device, including starting HomeSpan's temporary WiFi network to configure the device's WiFi Credentials and HomeKit Setup Code, is fully explained in the [HomeSpan User Guide](UserGuide.md). From 2579d5673afdec948ef0316f10d3550bac23a4a8 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 1 May 2023 05:55:47 -0500 Subject: [PATCH 022/151] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 05e371c..29474ed 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ HomeSpan requires version 2.0.0 or later of the [Arduino-ESP32 Board Manager](ht * **Upgrades to HomeSpan Web Log output** - * adds new method `void homeSpan.setWebLogCSS(const char *css)` that allows you to define custom style sheets (CSS) for the Web Log text, tables, and background + * adds new method `void homeSpan.setWebLogCSS(const char *css)` that allows you to define *Custom Style Sheets (CSS)* for the Web Log text, tables, and background * adds version numbers for the Sodium and MbedTLS libraries, HomeKit pairing status, and a text description of Reset Reason code * see [Message Logging](docs/Logging.md) for details From f2d96a952c3e17a098e7ddec195e2c5beb39d841 Mon Sep 17 00:00:00 2001 From: Francois Date: Wed, 3 May 2023 17:21:12 -0400 Subject: [PATCH 023/151] Added table of content --- docs/UserGuide.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a2cb90d..9ba9508 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -1,5 +1,15 @@ # HomeSpan User Guide +1. [Introduction](#introduction) +2. [Getting Started](#getting-started) +3. [HomeSpan Device States](#homespan-device-states) +4. [Device Configuration Mode](#device-configuration-mode) +5. [Setting HomeSpan WiFi Credentials and Setup Code](#setting-homespan-wifi-credentials-and-setup-code) +6. [Pairing to HomeKit](#pairing-to-homekit) +7. [Factory Reset](#factory-reset) +8. [Creating a Scannable Tag](#creating-a-scannable-tag) + +## Introduction This guide explains how to set up and configure a HomeSpan device that has already been programmed to operate one or more appliances, including how to: * Determine the state of the device by observing the HomeSpan Status LED @@ -83,7 +93,7 @@ To execute the selected Action press and hold the Control Button for 3 seconds, If no Action has been executed within 120 seconds (2 minutes) of starting the Device Configuration Mode, Action 1 is automatically executed and the Device Configuration Mode is exited. -## Setting HomeSpan’s WiFi Credentials and Setup Code +## Setting HomeSpan WiFi Credentials and Setup Code To configure a HomeSpace device to connect to your home WiFi network you must first connect your iPhone directly to the device so you can input your WiFi Credentials. This connection is made via a temporary WiFi network HomeSpan launches just for this purpose. From d5eb2ceeb87bb980d81ff11710a3a1d98d49bb92 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 7 May 2023 13:41:27 -0500 Subject: [PATCH 024/151] Update src.ino --- src/src.ino | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/src/src.ino b/src/src.ino index e9a1726..8f94fe4 100644 --- a/src/src.ino +++ b/src/src.ino @@ -30,35 +30,23 @@ struct LED_Service : Service::LightBulb { int ledPin; - boolean oldPower=false; SpanCharacteristic *power; LED_Service(int ledPin) : Service::LightBulb(){ - power=new Characteristic::On(); this->ledPin=ledPin; pinMode(ledPin,OUTPUT); } boolean update(){ - digitalWrite(ledPin,power->getNewVal()); - oldPower=power->getNewVal(); return(true); } -// void loop(){ -// if(power->getVal()!=oldPower){ -// oldPower=!oldPower; -// Serial.printf("Power was manually changed to %s\n",oldPower?"ON":"OFF"); -// } -// } }; ////////////////////////////////////// -boolean oldPower=false; -LED_Service *pLed; void setup() { @@ -71,22 +59,13 @@ void setup() { new SpanAccessory(); new Service::AccessoryInformation(); new Characteristic::Identify(); - pLed=new LED_Service(13); - - homeSpan.autoPoll(8192,10,1); + new LED_Service(13); } ////////////////////////////////////// -void loop(){ - -// homeSpan.poll(); - - while(pLed->power->getVal()!=oldPower){ - oldPower=pLed->power->getVal(); - Serial.printf("Power was manually changed to %s\n",oldPower?"ON":"OFF"); - } - +void loop(){ + homeSpan.poll(); } ////////////////////////////////////// From 368ce12c0477f6aec2d925733f599f626d0c74e3 Mon Sep 17 00:00:00 2001 From: Gregg Date: Mon, 8 May 2023 17:07:21 -0500 Subject: [PATCH 025/151] Started work on converting all Serial.print() to LOG0() macro --- src/HAP.cpp | 151 +++++++++++++++++----------------------- src/HomeSpan.cpp | 176 +++++++++++++++++++---------------------------- src/HomeSpan.h | 4 +- src/Settings.h | 8 +-- src/src.ino | 3 +- 5 files changed, 143 insertions(+), 199 deletions(-) diff --git a/src/HAP.cpp b/src/HAP.cpp index 118da3e..6e27e36 100644 --- a/src/HAP.cpp +++ b/src/HAP.cpp @@ -62,16 +62,11 @@ void HAPClient::init(){ nvs_get_blob(srpNVS,"VERIFYDATA",&verifyData,&len); // retrieve data srp.loadVerifyCode(verifyData.verifyCode,verifyData.salt); // load verification code and salt into SRP structure } else { - - char c[128]; - sprintf(c,"Generating SRP verification data for default Setup Code: %.3s-%.2s-%.3s\n",homeSpan.defaultSetupCode,homeSpan.defaultSetupCode+3,homeSpan.defaultSetupCode+5); - Serial.print(c); + LOG0("Generating SRP verification data for default Setup Code: %.3s-%.2s-%.3s\n",homeSpan.defaultSetupCode,homeSpan.defaultSetupCode+3,homeSpan.defaultSetupCode+5); srp.createVerifyCode(homeSpan.defaultSetupCode,verifyData.verifyCode,verifyData.salt); // create verification code from default Setup Code and random salt nvs_set_blob(srpNVS,"VERIFYDATA",&verifyData,sizeof(verifyData)); // update data nvs_commit(srpNVS); // commit to NVS - Serial.print("Setup Payload for Optional QR Code: "); - Serial.print(homeSpan.qrCode.get(atoi(homeSpan.defaultSetupCode),homeSpan.qrID,atoi(homeSpan.category))); - Serial.print("\n\n"); + LOG0("Setup Payload for Optional QR Code: %s\n\n",homeSpan.qrCode.get(atoi(homeSpan.defaultSetupCode),homeSpan.qrID,atoi(homeSpan.category))); } if(!strlen(homeSpan.qrID)){ // Setup ID has not been specified in sketch @@ -85,7 +80,7 @@ void HAPClient::init(){ if(!nvs_get_blob(hapNVS,"ACCESSORY",NULL,&len)){ // if found long-term Accessory data in NVS nvs_get_blob(hapNVS,"ACCESSORY",&accessory,&len); // retrieve data } else { - Serial.print("Generating new random Accessory ID and Long-Term Ed25519 Signature Keys...\n"); + LOG0("Generating new random Accessory ID and Long-Term Ed25519 Signature Keys...\n"); uint8_t buf[6]; char cBuf[18]; @@ -103,7 +98,7 @@ void HAPClient::init(){ if(!nvs_get_blob(hapNVS,"CONTROLLERS",NULL,&len)){ // if found long-term Controller Pairings data from NVS nvs_get_blob(hapNVS,"CONTROLLERS",controllers,&len); // retrieve data } else { - Serial.print("Initializing storage for Paired Controllers data...\n\n"); + LOG0("Initializing storage for Paired Controllers data...\n\n"); HAPClient::removeControllers(); // clear all Controller data @@ -111,11 +106,11 @@ void HAPClient::init(){ nvs_commit(hapNVS); // commit to NVS } - Serial.print("Accessory ID: "); + LOG0("Accessory ID: "); charPrintRow(accessory.ID,17); - Serial.print(" LTPK: "); + LOG0(" LTPK: "); hexPrintRow(accessory.LTPK,32); - Serial.print("\n"); + LOG0("\n"); printControllers(); @@ -139,17 +134,19 @@ void HAPClient::init(){ if(!nvs_get_blob(hapNVS,"HAPHASH",NULL,&len)){ // if found HAP HASH structure nvs_get_blob(hapNVS,"HAPHASH",&homeSpan.hapConfig,&len); // retrieve data } else { - Serial.print("Resetting Database Hash...\n"); + LOG0("Resetting Database Hash...\n"); nvs_set_blob(hapNVS,"HAPHASH",&homeSpan.hapConfig,sizeof(homeSpan.hapConfig)); // save data (will default to all zero values, which will then be updated below) nvs_commit(hapNVS); // commit to NVS } - if(homeSpan.updateDatabase(false)) // create Configuration Number and Loop vector - Serial.printf("\nAccessory configuration has changed. Updating configuration number to %d\n",homeSpan.hapConfig.configNumber); - else - Serial.printf("\nAccessory configuration number: %d\n",homeSpan.hapConfig.configNumber); + if(homeSpan.updateDatabase(false)){ // create Configuration Number and Loop vector + LOG0("\nAccessory configuration has changed. Updating configuration number to %d\n",homeSpan.hapConfig.configNumber); + } + else{ + LOG0("\nAccessory configuration number: %d\n",homeSpan.hapConfig.configNumber); + } - Serial.print("\n"); + LOG0("\n"); } @@ -180,7 +177,7 @@ void HAPClient::processRequest(){ if(nBytes>MAX_HTTP){ // exceeded maximum number of bytes allowed badRequestError(); - Serial.print("\n*** ERROR: Exceeded maximum HTTP message length\n\n"); + LOG0("\n*** ERROR: Exceeded maximum HTTP message length\n\n"); return; } @@ -193,7 +190,7 @@ void HAPClient::processRequest(){ if(!(p=strstr((char *)httpBuf,"\r\n\r\n"))){ badRequestError(); - Serial.print("\n*** ERROR: Malformed HTTP request (can't find blank line indicating end of BODY)\n\n"); + LOG0("\n*** ERROR: Malformed HTTP request (can't find blank line indicating end of BODY)\n\n"); return; } @@ -205,7 +202,7 @@ void HAPClient::processRequest(){ cLen=atoi(p+16); if(nBytes!=strlen(body)+4+cLen){ badRequestError(); - Serial.print("\n*** ERROR: Malformed HTTP request (Content-Length plus Body Length does not equal total number of bytes read)\n\n"); + LOG0("\n*** ERROR: Malformed HTTP request (Content-Length plus Body Length does not equal total number of bytes read)\n\n"); return; } @@ -216,7 +213,7 @@ void HAPClient::processRequest(){ if(cLen==0){ badRequestError(); - Serial.print("\n*** ERROR: HTTP POST request contains no Content\n\n"); + LOG0("\n*** ERROR: HTTP POST request contains no Content\n\n"); return; } @@ -261,7 +258,7 @@ void HAPClient::processRequest(){ } notFoundError(); - Serial.print("\n*** ERROR: Bad POST request - URL not found\n\n"); + LOG0("\n*** ERROR: Bad POST request - URL not found\n\n"); return; } // POST request @@ -270,7 +267,7 @@ void HAPClient::processRequest(){ if(cLen==0){ badRequestError(); - Serial.print("\n*** ERROR: HTTP PUT request contains no Content\n\n"); + LOG0("\n*** ERROR: HTTP PUT request contains no Content\n\n"); return; } @@ -297,7 +294,7 @@ void HAPClient::processRequest(){ } notFoundError(); - Serial.print("\n*** ERROR: Bad PUT request - URL not found\n\n"); + LOG0("\n*** ERROR: Bad PUT request - URL not found\n\n"); return; } // PUT request @@ -320,13 +317,13 @@ void HAPClient::processRequest(){ } notFoundError(); - Serial.print("\n*** ERROR: Bad GET request - URL not found\n\n"); + LOG0("\n*** ERROR: Bad GET request - URL not found\n\n"); return; } // GET request badRequestError(); - Serial.print("\n*** ERROR: Unknown or malformed HTTP request\n\n"); + LOG0("\n*** ERROR: Unknown or malformed HTTP request\n\n"); } // processHAP @@ -394,13 +391,13 @@ int HAPClient::postPairSetupURL(){ char buf[64]; if(tlvState==-1){ // missing STATE TLV - Serial.print("\n*** ERROR: Missing State TLV\n\n"); + LOG0("\n*** ERROR: Missing State TLV\n\n"); badRequestError(); // return with 400 error, which closes connection return(0); } if(nAdminControllers()){ // error: Device already paired (i.e. there is at least one admin Controller). We should not be receiving any requests for Pair-Setup! - Serial.print("\n*** ERROR: Device already paired!\n\n"); + LOG0("\n*** ERROR: Device already paired!\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,tlvState+1); // set response STATE to requested state+1 (which should match the state that was expected by the controller) tlv8.val(kTLVType_Error,tagError_Unavailable); // set Error=Unavailable @@ -412,7 +409,7 @@ int HAPClient::postPairSetupURL(){ LOG2(buf); if(tlvState!=pairStatus){ // error: Device is not yet paired, but out-of-sequence pair-setup STATE was received - Serial.print("\n*** ERROR: Out-of-Sequence Pair-Setup request!\n\n"); + LOG0("\n*** ERROR: Out-of-Sequence Pair-Setup request!\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,tlvState+1); // set response STATE to requested state+1 (which should match the state that was expected by the controller) tlv8.val(kTLVType_Error,tagError_Unknown); // set Error=Unknown (there is no specific error type for out-of-sequence steps) @@ -426,7 +423,7 @@ int HAPClient::postPairSetupURL(){ case pairState_M1: // 'SRP Start Request' if(tlv8.val(kTLVType_Method)!=0){ // error: "Pair Setup" method must always be 0 to indicate setup without MiFi Authentification (HAP Table 5-3) - Serial.print("\n*** ERROR: Pair Method not set to 0\n\n"); + LOG0("\n*** ERROR: Pair Method not set to 0\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M2); // set State= tlv8.val(kTLVType_Error,tagError_Unavailable); // set Error=Unavailable @@ -451,7 +448,7 @@ int HAPClient::postPairSetupURL(){ if(!srp.writeTLV(kTLVType_PublicKey,&srp.A) || // try to write TLVs into mpi structures !srp.writeTLV(kTLVType_Proof,&srp.M1)){ - Serial.print("\n*** ERROR: One or both of the required 'PublicKey' and 'Proof' TLV records for this step is bad or missing\n\n"); + LOG0("\n*** ERROR: One or both of the required 'PublicKey' and 'Proof' TLV records for this step is bad or missing\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M4); // set State= tlv8.val(kTLVType_Error,tagError_Unknown); // set Error=Unknown (there is no specific error type for missing/bad TLV data) @@ -463,7 +460,7 @@ int HAPClient::postPairSetupURL(){ srp.createSessionKey(); // create session key, K, from receipt of HAP Client public key, A if(!srp.verifyProof()){ // verify proof, M1, received from HAP Client - Serial.print("\n*** ERROR: SRP Proof Verification Failed\n\n"); + LOG0("\n*** ERROR: SRP Proof Verification Failed\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M4); // set State= tlv8.val(kTLVType_Error,tagError_Authentication); // set Error=Authentication @@ -486,7 +483,7 @@ int HAPClient::postPairSetupURL(){ case pairState_M5: // 'Exchange Request' if(!tlv8.buf(kTLVType_EncryptedData)){ - Serial.print("\n*** ERROR: Required 'EncryptedData' TLV record for this step is bad or missing\n\n"); + LOG0("\n*** ERROR: Required 'EncryptedData' TLV record for this step is bad or missing\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M6); // set State= tlv8.val(kTLVType_Error,tagError_Unknown); // set Error=Unknown (there is no specific error type for missing/bad TLV data) @@ -513,7 +510,7 @@ int HAPClient::postPairSetupURL(){ tlv8.buf(kTLVType_EncryptedData), tlv8.len(kTLVType_EncryptedData), NULL, 0, (unsigned char *)"\x00\x00\x00\x00PS-Msg05", sessionKey)==-1){ - Serial.print("\n*** ERROR: Exchange-Request Authentication Failed\n\n"); + LOG0("\n*** ERROR: Exchange-Request Authentication Failed\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M6); // set State= tlv8.val(kTLVType_Error,tagError_Authentication); // set Error=Authentication @@ -523,7 +520,7 @@ int HAPClient::postPairSetupURL(){ } if(!tlv8.unpack(decrypted,decryptedLen)){ - Serial.print("\n*** ERROR: Can't parse decrypted data into separate TLV records\n\n"); + LOG0("\n*** ERROR: Can't parse decrypted data into separate TLV records\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M6); // set State= tlv8.val(kTLVType_Error,tagError_Unknown); // set Error=Unknown (there is no specific error type for missing/bad TLV data) @@ -536,7 +533,7 @@ int HAPClient::postPairSetupURL(){ LOG2("------- END DECRYPTED TLVS! -------\n"); if(!tlv8.buf(kTLVType_Identifier) || !tlv8.buf(kTLVType_PublicKey) || !tlv8.buf(kTLVType_Signature)){ - Serial.print("\n*** ERROR: One or more of required 'Identifier,' 'PublicKey,' and 'Signature' TLV records for this step is bad or missing\n\n"); + LOG0("\n*** ERROR: One or more of required 'Identifier,' 'PublicKey,' and 'Signature' TLV records for this step is bad or missing\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M6); // set State= tlv8.val(kTLVType_Error,tagError_Unknown); // set Error=Unknown (there is no specific error type for missing/bad TLV data) @@ -570,7 +567,7 @@ int HAPClient::postPairSetupURL(){ uint8_t *iosDeviceSignature = tlv8.buf(kTLVType_Signature); // set iosDeviceSignature from TLV record (an Ed25519 should always be 64 bytes) if(crypto_sign_verify_detached(iosDeviceSignature, iosDeviceInfo, iosDeviceInfoLen, iosDeviceLTPK) != 0){ // verify signature of iosDeviceInfo using iosDeviceLTPK - Serial.print("\n*** ERROR: LPTK Signature Verification Failed\n\n"); + LOG0("\n*** ERROR: LPTK Signature Verification Failed\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M6); // set State= tlv8.val(kTLVType_Error,tagError_Authentication); // set Error=Authentication @@ -667,13 +664,13 @@ int HAPClient::postPairVerifyURL(){ int tlvState=tlv8.val(kTLVType_State); if(tlvState==-1){ // missing STATE TLV - Serial.print("\n*** ERROR: Missing State TLV\n\n"); + LOG0("\n*** ERROR: Missing State TLV\n\n"); badRequestError(); // return with 400 error, which closes connection return(0); } if(!nAdminControllers()){ // error: Device not yet paired - we should not be receiving any requests for Pair-Verify! - Serial.print("\n*** ERROR: Device not yet paired!\n\n"); + LOG0("\n*** ERROR: Device not yet paired!\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,tlvState+1); // set response STATE to requested state+1 (which should match the state that was expected by the controller) tlv8.val(kTLVType_Error,tagError_Unknown); // set Error=Unknown @@ -689,7 +686,7 @@ int HAPClient::postPairVerifyURL(){ case pairState_M1: // 'Verify Start Request' if(!tlv8.buf(kTLVType_PublicKey)){ - Serial.print("\n*** ERROR: Required 'PublicKey' TLV record for this step is bad or missing\n\n"); + LOG0("\n*** ERROR: Required 'PublicKey' TLV record for this step is bad or missing\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M2); // set State= tlv8.val(kTLVType_Error,tagError_Unknown); // set Error=Unknown (there is no specific error type for missing/bad TLV data) @@ -755,7 +752,7 @@ int HAPClient::postPairVerifyURL(){ case pairState_M3: // 'Verify Finish Request' if(!tlv8.buf(kTLVType_EncryptedData)){ - Serial.print("\n*** ERROR: Required 'EncryptedData' TLV record for this step is bad or missing\n\n"); + LOG0("\n*** ERROR: Required 'EncryptedData' TLV record for this step is bad or missing\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M4); // set State= tlv8.val(kTLVType_Error,tagError_Unknown); // set Error=Unknown (there is no specific error type for missing/bad TLV data) @@ -771,7 +768,7 @@ int HAPClient::postPairVerifyURL(){ tlv8.buf(kTLVType_EncryptedData), tlv8.len(kTLVType_EncryptedData), NULL, 0, (unsigned char *)"\x00\x00\x00\x00PV-Msg03", sessionKey)==-1){ - Serial.print("\n*** ERROR: Verify Authentication Failed\n\n"); + LOG0("\n*** ERROR: Verify Authentication Failed\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M4); // set State= tlv8.val(kTLVType_Error,tagError_Authentication); // set Error=Authentication @@ -780,7 +777,7 @@ int HAPClient::postPairVerifyURL(){ } if(!tlv8.unpack(decrypted,decryptedLen)){ - Serial.print("\n*** ERROR: Can't parse decrypted data into separate TLV records\n\n"); + LOG0("\n*** ERROR: Can't parse decrypted data into separate TLV records\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M4); // set State= tlv8.val(kTLVType_Error,tagError_Unknown); // set Error=Unknown (there is no specific error type for missing/bad TLV data) @@ -792,7 +789,7 @@ int HAPClient::postPairVerifyURL(){ LOG2("------- END DECRYPTED TLVS! -------\n"); if(!tlv8.buf(kTLVType_Identifier) || !tlv8.buf(kTLVType_Signature)){ - Serial.print("\n*** ERROR: One or more of required 'Identifier,' and 'Signature' TLV records for this step is bad or missing\n\n"); + LOG0("\n*** ERROR: One or more of required 'Identifier,' and 'Signature' TLV records for this step is bad or missing\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M4); // set State= tlv8.val(kTLVType_Error,tagError_Unknown); // set Error=Unknown (there is no specific error type for missing/bad TLV data) @@ -803,7 +800,7 @@ int HAPClient::postPairVerifyURL(){ Controller *tPair; // temporary pointer to Controller if(!(tPair=findController(tlv8.buf(kTLVType_Identifier)))){ - Serial.print("\n*** ERROR: Unrecognized Controller PairingID\n\n"); + LOG0("\n*** ERROR: Unrecognized Controller PairingID\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M4); // set State= tlv8.val(kTLVType_Error,tagError_Authentication); // set Error=Authentication @@ -819,7 +816,7 @@ int HAPClient::postPairVerifyURL(){ memcpy(iosDeviceInfo+32+36,publicCurveKey,32); if(crypto_sign_verify_detached(tlv8.buf(kTLVType_Signature), iosDeviceInfo, iosDeviceInfoLen, tPair->LTPK) != 0){ // verify signature of iosDeviceInfo using iosDeviceLTPK - Serial.print("\n*** ERROR: LPTK Signature Verification Failed\n\n"); + LOG0("\n*** ERROR: LPTK Signature Verification Failed\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M4); // set State= tlv8.val(kTLVType_Error,tagError_Authentication); // set Error=Authentication @@ -904,7 +901,7 @@ int HAPClient::postPairingsURL(){ LOG1(")..."); if(tlv8.val(kTLVType_State)!=1){ - Serial.print("\n*** ERROR: 'State' TLV record is either missing or not set to as required\n\n"); + LOG0("\n*** ERROR: 'State' TLV record is either missing or not set to as required\n\n"); badRequestError(); // return with 400 error, which closes connection return(0); } @@ -915,7 +912,7 @@ int HAPClient::postPairingsURL(){ LOG1("Add...\n"); if(!tlv8.buf(kTLVType_Identifier) || !tlv8.buf(kTLVType_PublicKey) || !tlv8.buf(kTLVType_Permissions)){ - Serial.print("\n*** ERROR: One or more of required 'Identifier,' 'PublicKey,' and 'Permissions' TLV records for this step is bad or missing\n\n"); + LOG0("\n*** ERROR: One or more of required 'Identifier,' 'PublicKey,' and 'Permissions' TLV records for this step is bad or missing\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M2); // set State= tlv8.val(kTLVType_Error,tagError_Unknown); // set Error=Unknown (there is no specific error type for missing/bad TLV data) @@ -923,7 +920,7 @@ int HAPClient::postPairingsURL(){ } if(!cPair->admin){ - Serial.print("\n*** ERROR: Controller making request does not have admin privileges to add/update other Controllers\n\n"); + LOG0("\n*** ERROR: Controller making request does not have admin privileges to add/update other Controllers\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M2); // set State= tlv8.val(kTLVType_Error,tagError_Authentication); // set Error=Authentication @@ -931,7 +928,7 @@ int HAPClient::postPairingsURL(){ } if((newCont=findController(tlv8.buf(kTLVType_Identifier))) && memcmp(tlv8.buf(kTLVType_PublicKey),newCont->LTPK,32)){ // requested Controller already exists, but LTPKs don't match - Serial.print("\n*** ERROR: Invalid request to update the LTPK of an exsiting Controller\n\n"); + LOG0("\n*** ERROR: Invalid request to update the LTPK of an exsiting Controller\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M2); // set State= tlv8.val(kTLVType_Error,tagError_Unknown); // set Error=Unknown @@ -939,9 +936,7 @@ int HAPClient::postPairingsURL(){ } if(!addController(tlv8.buf(kTLVType_Identifier),tlv8.buf(kTLVType_PublicKey),tlv8.val(kTLVType_Permissions)==1?true:false)){ - Serial.print("\n*** ERROR: Can't pair more than "); - Serial.print(MAX_CONTROLLERS); - Serial.print(" Controllers\n\n"); + LOG0("\n*** ERROR: Can't pair more than %d Controllers\n\n",MAX_CONTROLLERS); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M2); // set State= tlv8.val(kTLVType_Error,tagError_MaxPeers); // set Error=MaxPeers @@ -956,7 +951,7 @@ int HAPClient::postPairingsURL(){ LOG1("Remove...\n"); if(!tlv8.buf(kTLVType_Identifier)){ - Serial.print("\n*** ERROR: Required 'Identifier' TLV record for this step is bad or missing\n\n"); + LOG0("\n*** ERROR: Required 'Identifier' TLV record for this step is bad or missing\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M2); // set State= tlv8.val(kTLVType_Error,tagError_Unknown); // set Error=Unknown (there is no specific error type for missing/bad TLV data) @@ -964,7 +959,7 @@ int HAPClient::postPairingsURL(){ } if(!cPair->admin){ - Serial.print("\n*** ERROR: Controller making request does not have admin privileges to remove Controllers\n\n"); + LOG0("\n*** ERROR: Controller making request does not have admin privileges to remove Controllers\n\n"); tlv8.clear(); // clear TLV records tlv8.val(kTLVType_State,pairState_M2); // set State= tlv8.val(kTLVType_Error,tagError_Authentication); // set Error=Authentication @@ -987,7 +982,7 @@ int HAPClient::postPairingsURL(){ break; default: - Serial.print("\n*** ERROR: 'Method' TLV record is either missing or not set to either 3, 4, or 5 as required\n\n"); + LOG0("\n*** ERROR: 'Method' TLV record is either missing or not set to either 3, 4, or 5 as required\n\n"); badRequestError(); // return with 400 error, which closes connection return(0); break; @@ -1458,17 +1453,17 @@ int HAPClient::receiveEncrypted(){ int n=buf[0]+buf[1]*256; // compute number of bytes expected in encoded message if(nBytes+n>MAX_HTTP){ // exceeded maximum number of bytes allowed in plaintext message - Serial.print("\n\n*** ERROR: Exceeded maximum HTTP message length\n\n"); + LOG0("\n\n*** ERROR: Exceeded maximum HTTP message length\n\n"); return(0); } if(client.read(buf+2,n+16)!=n+16){ // read expected number of total bytes = n bytes in encoded message + 16 bytes for appended authentication tag - Serial.print("\n\n*** ERROR: Malformed encrypted message frame\n\n"); + LOG0("\n\n*** ERROR: Malformed encrypted message frame\n\n"); return(0); } if(crypto_aead_chacha20poly1305_ietf_decrypt(httpBuf+nBytes, NULL, NULL, buf+2, n+16, buf, 2, c2aNonce.get(), c2aKey)==-1){ - Serial.print("\n\n*** ERROR: Can't Decrypt Message\n\n"); + LOG0("\n\n*** ERROR: Can't Decrypt Message\n\n"); return(0); } @@ -1537,40 +1532,25 @@ void HAPClient::sendEncrypted(char *body, uint8_t *dataBuf, int dataLen){ ///////////////////////////////////////////////////////////////////////////////// void HAPClient::hexPrintColumn(uint8_t *buf, int n){ - - char c[16]; - for(int i=0;i\n\n"); - Serial.print("Message Logs: Level "); - Serial.print(logLevel); - Serial.print("\nStatus LED: Pin "); + LOG0("Message Logs: Level %d",logLevel); + LOG0("\nStatus LED: Pin "); if(getStatusPin()>=0){ - Serial.print(getStatusPin()); + LOG0(getStatusPin()); if(autoOffLED>0) - Serial.printf(" (Auto Off=%d sec)",autoOffLED); + LOG0(" (Auto Off=%d sec)",autoOffLED); } else - Serial.print("- *** WARNING: Status LED Pin is UNDEFINED"); - Serial.print("\nDevice Control: Pin "); - if(getControlPin()>=0) - Serial.print(getControlPin()); - else - Serial.print("- *** WARNING: Device Control Pin is UNDEFINED"); - Serial.print("\nSketch Version: "); - Serial.print(getSketchVersion()); - Serial.print("\nHomeSpan Version: "); - Serial.print(HOMESPAN_VERSION); - Serial.print("\nArduino-ESP Ver.: "); - Serial.print(ARDUINO_ESP_VERSION); - Serial.printf("\nESP-IDF Version: %d.%d.%d",ESP_IDF_VERSION_MAJOR,ESP_IDF_VERSION_MINOR,ESP_IDF_VERSION_PATCH); - Serial.printf("\nESP32 Chip: %s Rev %d %s-core %dMB Flash", ESP.getChipModel(),ESP.getChipRevision(), + LOG0("- *** WARNING: Status LED Pin is UNDEFINED"); + LOG0("\nDevice Control: Pin "); + if(getControlPin()>=0){ + LOG0(getControlPin()); + } + else{ + LOG0("- *** WARNING: Device Control Pin is UNDEFINED"); + } + LOG0("\nSketch Version: %s",getSketchVersion()); + LOG0("\nHomeSpan Version: %s",HOMESPAN_VERSION); + LOG0("\nArduino-ESP Ver.: %s",ARDUINO_ESP_VERSION); + LOG0("\nESP-IDF Version: %d.%d.%d",ESP_IDF_VERSION_MAJOR,ESP_IDF_VERSION_MINOR,ESP_IDF_VERSION_PATCH); + LOG0("\nESP32 Chip: %s Rev %d %s-core %dMB Flash", ESP.getChipModel(),ESP.getChipRevision(), ESP.getChipCores()==1?"single":"dual",ESP.getFlashChipSize()/1024/1024); #ifdef ARDUINO_VARIANT - Serial.print("\nESP32 Board: "); - Serial.print(ARDUINO_VARIANT); + LOG0("\nESP32 Board: "); + LOG0(ARDUINO_VARIANT); #endif - Serial.printf("\nPWM Resources: %d channels, %d timers, max %d-bit duty resolution", + LOG0("\nPWM Resources: %d channels, %d timers, max %d-bit duty resolution", LEDC_SPEED_MODE_MAX*LEDC_CHANNEL_MAX,LEDC_SPEED_MODE_MAX*LEDC_TIMER_MAX,LEDC_TIMER_BIT_MAX-1); - Serial.printf("\nSodium Version: %s Lib %d.%d",sodium_version_string(),sodium_library_version_major(),sodium_library_version_minor()); + LOG0("\nSodium Version: %s Lib %d.%d",sodium_version_string(),sodium_library_version_major(),sodium_library_version_minor()); char mbtlsv[64]; mbedtls_version_get_string_full(mbtlsv); - Serial.printf("\nMbedTLS Version: %s",mbtlsv); + LOG0("\nMbedTLS Version: %s",mbtlsv); - Serial.print("\nSketch Compiled: "); - Serial.print(__DATE__); - Serial.print(" "); - Serial.print(__TIME__); - - Serial.printf("\nPartition: %s",esp_ota_get_running_partition()->label); - Serial.printf("\nMAC Address: %s",WiFi.macAddress().c_str()); + LOG0("\nSketch Compiled: %s %s",__DATE__,__TIME__); + LOG0("\nPartition: %s",esp_ota_get_running_partition()->label); + LOG0("\nMAC Address: %s",WiFi.macAddress().c_str()); - Serial.print("\n\nDevice Name: "); - Serial.print(displayName); - Serial.print("\n\n"); + LOG0("\n\nDevice Name: %s\n\n",displayName); uint8_t otaRequired=0; nvs_get_u8(otaNVS,"OTA_REQUIRED",&otaRequired); nvs_set_u8(otaNVS,"OTA_REQUIRED",0); nvs_commit(otaNVS); if(otaRequired && !spanOTA.enabled){ - Serial.printf("\n\n*** OTA SAFE MODE ALERT: OTA REQUIRED BUT NOT ENABLED. ROLLING BACK TO PREVIOUS APPLICATION ***\n\n"); + LOG0("\n\n*** OTA SAFE MODE ALERT: OTA REQUIRED BUT NOT ENABLED. ROLLING BACK TO PREVIOUS APPLICATION ***\n\n"); delay(100); esp_ota_mark_app_invalid_rollback_and_reboot(); } @@ -164,7 +156,7 @@ void Span::begin(Category catID, const char *displayName, const char *hostNameBa void Span::poll() { if(pollTaskHandle){ - Serial.print("\n** FATAL ERROR: Do not call homeSpan.poll() directly if homeSpan.start() is used!\n** PROGRAM HALTED **\n\n"); + LOG0("\n** FATAL ERROR: Do not call homeSpan.poll() directly if homeSpan.start() is used!\n** PROGRAM HALTED **\n\n"); vTaskDelete(pollTaskHandle); while(1); } @@ -177,7 +169,7 @@ void Span::poll() { void Span::pollTask() { if(!strlen(category)){ - Serial.print("\n** FATAL ERROR: Cannot start homeSpan polling without an initial call to homeSpan.begin()!\n** PROGRAM HALTED **\n\n"); + LOG0("\n** FATAL ERROR: Cannot start homeSpan polling without an initial call to homeSpan.begin()!\n** PROGRAM HALTED **\n\n"); while(1); } @@ -188,12 +180,12 @@ void Span::pollTask() { HAPClient::init(); // read NVS and load HAP settings if(!strlen(network.wifiData.ssid)){ - Serial.print("*** WIFI CREDENTIALS DATA NOT FOUND. "); + LOG0("*** WIFI CREDENTIALS DATA NOT FOUND. "); if(autoStartAPEnabled){ - Serial.print("AUTO-START OF ACCESS POINT ENABLED...\n\n"); + LOG0("AUTO-START OF ACCESS POINT ENABLED...\n\n"); processSerialCommand("A"); } else { - Serial.print("YOU MAY CONFIGURE BY TYPING 'W '.\n\n"); + LOG0("YOU MAY CONFIGURE BY TYPING 'W '.\n\n"); STATUS_UPDATE(start(LED_WIFI_NEEDED),HS_WIFI_NEEDED) } } else { @@ -203,8 +195,7 @@ void Span::pollTask() { if(controlButton) controlButton->reset(); - Serial.print(displayName); - Serial.print(" is READY!\n\n"); + LOG0("%s is READY!\n\n",displayName); isInitialized=true; } // isInitialized @@ -331,11 +322,11 @@ int Span::getFreeSlot(){ void Span::commandMode(){ if(!statusDevice && !statusCallback){ - Serial.print("*** ERROR: CAN'T ENTER COMMAND MODE WITHOUT A DEFINED STATUS LED OR EVENT HANDLER CALLBACK***\n\n"); + LOG0("*** ERROR: CAN'T ENTER COMMAND MODE WITHOUT A DEFINED STATUS LED OR EVENT HANDLER CALLBACK***\n\n"); return; } - Serial.print("*** COMMAND MODE ***\n\n"); + LOG0("*** COMMAND MODE ***\n\n"); int mode=1; boolean done=false; STATUS_UPDATE(start(500,0.3,mode,1000),static_cast(HS_ENTERING_CONFIG_MODE+mode)) @@ -343,9 +334,7 @@ void Span::commandMode(){ while(!done){ if(millis()>alarmTime){ - Serial.print("*** Command Mode: Timed Out ("); - Serial.print(comModeLife/1000); - Serial.print(" seconds).\n\n"); + LOG0("*** Command Mode: Timed Out (%ld seconds)",comModeLife/1000); mode=1; done=true; } else @@ -388,7 +377,7 @@ void Span::commandMode(){ } // switch - Serial.print("*** EXITING COMMAND MODE ***\n\n"); + LOG0("*** EXITING COMMAND MODE ***\n\n"); } ////////////////////////////////////// @@ -416,9 +405,7 @@ void Span::checkConnect(){ waitTime*=2; if(waitTime==32000){ - Serial.print("\n*** Can't connect to "); - Serial.print(network.wifiData.ssid); - Serial.print(". You may type 'W ' to re-configure WiFi, or 'X ' to erase WiFi credentials. Will try connecting again in 60 seconds.\n\n"); + LOG0("\n*** Can't connect to %s. You may type 'W ' to re-configure WiFi, or 'X ' to erase WiFi credentials. Will try connecting again in 60 seconds.\n\n",network.wifiData.ssid); waitTime=60000; } else { addWebLog(true,"Trying to connect to %s. Waiting %d sec...",network.wifiData.ssid,waitTime/1000); @@ -462,25 +449,18 @@ void Span::checkConnect(){ sscanf(hostName,"%[A-Za-z0-9-]",d); if(strlen(hostName)>255|| hostName[0]=='-' || hostName[strlen(hostName)-1]=='-' || strlen(hostName)!=strlen(d)){ - Serial.printf("\n*** Error: Can't start MDNS due to invalid hostname '%s'.\n",hostName); - Serial.print("*** Hostname must consist of 255 or less alphanumeric characters or a hyphen, except that the hyphen cannot be the first or last character.\n"); - Serial.print("*** PROGRAM HALTED!\n\n"); + LOG0("\n*** Error: Can't start MDNS due to invalid hostname '%s'.\n",hostName); + LOG0("*** Hostname must consist of 255 or less alphanumeric characters or a hyphen, except that the hyphen cannot be the first or last character.\n"); + LOG0("*** PROGRAM HALTED!\n\n"); while(1); } - Serial.print("\nStarting MDNS...\n\n"); - Serial.print("HostName: "); - Serial.print(hostName); - Serial.print(".local:"); - Serial.print(tcpPortNum); - Serial.print("\nDisplay Name: "); - Serial.print(displayName); - Serial.print("\nModel Name: "); - Serial.print(modelName); - Serial.print("\nSetup ID: "); - Serial.print(qrID); - Serial.print("\n\n"); - + LOG0("\nStarting MDNS...\n\n"); + LOG0("HostName: %s.local:%d\n",hostName,tcpPortNum); + LOG0("Display Name: %s\n",displayName); + LOG0("Model Name: %s\n",modelName); + LOG0("Setup ID: %s\n\n",qrID); + MDNS.begin(hostName); // set server host name (.local implied) MDNS.setInstanceName(displayName); // set server display name MDNS.addService("_hap","_tcp",tcpPortNum); // advertise HAP service on specified port @@ -529,12 +509,8 @@ void Span::checkConnect(){ ArduinoOTA.onStart(spanOTA.start).onEnd(spanOTA.end).onProgress(spanOTA.progress).onError(spanOTA.error); ArduinoOTA.begin(); - Serial.print("Starting OTA Server: "); - Serial.print(displayName); - Serial.print(" at "); - Serial.print(WiFi.localIP()); - Serial.print("\nAuthorization Password: "); - Serial.print(spanOTA.auth?"Enabled\n\n":"DISABLED!\n\n"); + LOG0("Starting OTA Server: %s at %s\n",displayName,WiFi.localIP().toString().c_str()); + LOG0("Authorization Password: %s",spanOTA.auth?"Enabled\n\n":"DISABLED!\n\n"); } mdns_service_txt_item_set("_hap","_tcp","ota",spanOTA.enabled?"yes":"no"); // OTA status (info only - NOT used by HAP) @@ -542,19 +518,19 @@ void Span::checkConnect(){ if(webLog.isEnabled){ mdns_service_txt_item_set("_hap","_tcp","logURL",webLog.statusURL.c_str()+4); // Web Log status (info only - NOT used by HAP) - Serial.printf("Web Logging enabled at http://%s.local:%d%swith max number of entries=%d\n\n",hostName,tcpPortNum,webLog.statusURL.c_str()+4,webLog.maxEntries); + LOG0("Web Logging enabled at http://%s.local:%d%swith max number of entries=%d\n\n",hostName,tcpPortNum,webLog.statusURL.c_str()+4,webLog.maxEntries); if(webLog.timeServer) xTaskCreateUniversal(webLog.initTime, "timeSeverTaskHandle", 8096, &webLog, 1, NULL, 0); } - Serial.printf("Starting HAP Server on port %d supporting %d simultaneous HomeKit Controller Connections...\n\n",tcpPortNum,maxConnections); + LOG0("Starting HAP Server on port %d supporting %d simultaneous HomeKit Controller Connections...\n\n",tcpPortNum,maxConnections); hapServer->begin(); - Serial.print("\n"); + LOG0("\n"); if(!HAPClient::nAdminControllers()) - Serial.print("DEVICE NOT YET PAIRED -- PLEASE PAIR WITH HOMEKIT APP\n\n"); + LOG0("DEVICE NOT YET PAIRED -- PLEASE PAIR WITH HOMEKIT APP\n\n"); if(wifiCallback) wifiCallback(); @@ -582,48 +558,40 @@ void Span::processSerialCommand(const char *c){ case 's': { - Serial.print("\n*** HomeSpan Status ***\n\n"); + LOG0("\n*** HomeSpan Status ***\n\n"); - Serial.print("IP Address: "); - Serial.print(WiFi.localIP()); - Serial.print("\n\n"); - Serial.print("Accessory ID: "); + LOG0("IP Address: %s\n\n",WiFi.localIP().toString().c_str()); + LOG0("Accessory ID: "); HAPClient::charPrintRow(HAPClient::accessory.ID,17); - Serial.print(" LTPK: "); + LOG0(" LTPK: "); HAPClient::hexPrintRow(HAPClient::accessory.LTPK,32); - Serial.print("\n"); + LOG0("\n"); HAPClient::printControllers(); - Serial.print("\n"); + LOG0("\n"); for(int i=0;iclient){ - Serial.print(hap[i]->client.remoteIP()); - Serial.print(" on Socket "); - Serial.print(hap[i]->client.fd()-LWIP_SOCKET_OFFSET+1); - Serial.print("/"); - Serial.print(CONFIG_LWIP_MAX_SOCKETS); + LOG0("%s on Socket %d/%d",hap[i]->client.remoteIP().toString().c_str(),hap[i]->client.fd()-LWIP_SOCKET_OFFSET+1,CONFIG_LWIP_MAX_SOCKETS); if(hap[i]->cPair){ - Serial.print(" ID="); + LOG0(" ID="); HAPClient::charPrintRow(hap[i]->cPair->ID,36); - Serial.print(hap[i]->cPair->admin?" (admin)":" (regular)"); + LOG0(hap[i]->cPair->admin?" (admin)":" (regular)"); } else { - Serial.print(" (unverified)"); + LOG0(" (unverified)"); } } else { - Serial.print("(unconnected)"); + LOG0("(unconnected)"); } - Serial.print("\n"); + LOG0("\n"); } - Serial.print("\n*** End Status ***\n\n"); + LOG0("\n*** End Status ***\n\n"); } break; @@ -632,13 +600,9 @@ void Span::processSerialCommand(const char *c){ TempBuffer qBuf(sprintfAttributes(NULL)+1); sprintfAttributes(qBuf.buf); - Serial.print("\n*** Attributes Database: size="); - Serial.print(qBuf.len()-1); - Serial.print(" configuration="); - Serial.print(hapConfig.configNumber); - Serial.print(" ***\n\n"); + LOG0("\n*** Attributes Database: size=%d configuration=%d ***\n\n",qBuf.len()-1,hapConfig.configNumber); prettyPrint(qBuf.buf); - Serial.print("\n*** End Database ***\n\n"); + LOG0("\n*** End Database ***\n\n"); } break; diff --git a/src/HomeSpan.h b/src/HomeSpan.h index c8a0b9d..53f5f0b 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -225,7 +225,7 @@ class Span{ const char *defaultSetupCode=DEFAULT_SETUP_CODE; // Setup Code used for pairing uint16_t autoOffLED=0; // automatic turn-off duration (in seconds) for Status LED - uint8_t logLevel=DEFAULT_LOG_LEVEL; // level for writing out log messages to serial monitor + int logLevel=DEFAULT_LOG_LEVEL; // level for writing out log messages to serial monitor uint8_t maxConnections=CONFIG_LWIP_MAX_SOCKETS-2; // maximum number of allowed simultaneous HAP connections uint8_t requestedMaxCon=CONFIG_LWIP_MAX_SOCKETS-2; // requested maximum number of simultaneous HAP connections unsigned long comModeLife=DEFAULT_COMMAND_TIMEOUT*1000; // length of time (in milliseconds) to keep Command Mode alive before resuming normal operations @@ -309,7 +309,7 @@ class Span{ void setApPassword(const char *pwd){network.apPassword=pwd;} // sets Access Point Password void setApTimeout(uint16_t nSec){network.lifetime=nSec*1000;} // sets Access Point Timeout (seconds) void setCommandTimeout(uint16_t nSec){comModeLife=nSec*1000;} // sets Command Mode Timeout (seconds) - void setLogLevel(uint8_t level){logLevel=level;} // sets Log Level for log messages (0=baseline, 1=intermediate, 2=all) + void setLogLevel(int level){logLevel=level;} // sets Log Level for log messages (0=baseline, 1=intermediate, 2=all, -1=disable all serial input/output) int getLogLevel(){return(logLevel);} // get Log Level void reserveSocketConnections(uint8_t n){maxConnections-=n;} // reserves n socket connections *not* to be used for HAP void setHostNameSuffix(const char *suffix){hostNameSuffix=suffix;} // sets the hostName suffix to be used instead of the 6-byte AccessoryID diff --git a/src/Settings.h b/src/Settings.h index 2cffe73..9981f08 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -104,11 +104,11 @@ // Message Log Level Control Macros // // 0=Minimal, 1=Informative, 2=All // -#define LOG0(format,...) Serial.print ##__VA_OPT__(f)(format __VA_OPT__(,) __VA_ARGS__) -#define LOG1(format,...) if(homeSpan.getLogLevel()>0)Serial.print ##__VA_OPT__(f)(format __VA_OPT__(,) __VA_ARGS__) -#define LOG2(format,...) if(homeSpan.getLogLevel()>1)Serial.print ##__VA_OPT__(f)(format __VA_OPT__(,) __VA_ARGS__) +#define LOG0(format,...) if(homeSpan.getLogLevel()>=0)Serial.print ##__VA_OPT__(f)(format __VA_OPT__(,) __VA_ARGS__) +#define LOG1(format,...) if(homeSpan.getLogLevel()>=1)Serial.print ##__VA_OPT__(f)(format __VA_OPT__(,) __VA_ARGS__) +#define LOG2(format,...) if(homeSpan.getLogLevel()>=2)Serial.print ##__VA_OPT__(f)(format __VA_OPT__(,) __VA_ARGS__) -#define WEBLOG(format,...) homeSpan.addWebLog(false, format __VA_OPT__(,) __VA_ARGS__) +#define WEBLOG(format,...) homeSpan.addWebLog(false, format __VA_OPT__(,) __VA_ARGS__); ////////////////////////////////////////////////////// // Types of Accessory Categories // diff --git a/src/src.ino b/src/src.ino index 8f94fe4..8f9391f 100644 --- a/src/src.ino +++ b/src/src.ino @@ -52,7 +52,8 @@ void setup() { Serial.begin(115200); - homeSpan.setLogLevel(2); +// homeSpan.setLogLevel(-1); + homeSpan.enableOTA(); homeSpan.begin(Category::Lighting,"HomeSpan LED"); From 66bb13af035ba431ac577fb49ffb05506ec4657b Mon Sep 17 00:00:00 2001 From: Gregg Date: Mon, 8 May 2023 22:43:42 -0500 Subject: [PATCH 026/151] Continued change from Serial.print to LOG0() --- src/HomeSpan.cpp | 361 ++++++++++++++++++++++------------------------- src/HomeSpan.h | 20 +-- src/Network.cpp | 63 +++------ src/SRP.cpp | 5 +- src/Settings.h | 6 +- 5 files changed, 206 insertions(+), 249 deletions(-) diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index 1ff19d5..b70e27e 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -613,15 +613,11 @@ void Span::processSerialCommand(const char *c){ if(strlen(s)==4 && strlen(tBuf)==4){ sprintf(qrID,"%s",tBuf); - Serial.print("\nChanging default Setup ID for QR Code to: '"); - Serial.print(qrID); - Serial.print("'. Will take effect after next restart.\n\n"); - nvs_set_str(HAPClient::hapNVS,"SETUPID",qrID); // update data + LOG0("\nChanging default Setup ID for QR Code to: '%s'. Will take effect after next restart.\n\n",qrID); + nvs_set_str(HAPClient::hapNVS,"SETUPID",qrID); nvs_commit(HAPClient::hapNVS); } else { - Serial.print("\n*** Invalid request to change Setup ID for QR Code to: '"); - Serial.print(s); - Serial.print("'. Setup ID must be exactly 4 alphanumeric characters (0-9, A-Z, and a-z).\n\n"); + LOG0("\n*** Invalid request to change Setup ID for QR Code to: '%s'. Setup ID must be exactly 4 alphanumeric characters (0-9, A-Z, and a-z).\n\n",s); } } break; @@ -630,35 +626,33 @@ void Span::processSerialCommand(const char *c){ char textPwd[34]="\0"; - Serial.print("\n>>> New OTA Password, or to cancel request: "); + LOG0("\n>>> New OTA Password, or to cancel request: "); readSerial(textPwd,33); if(strlen(textPwd)==0){ - Serial.print("(cancelled)\n\n"); + LOG0("(cancelled)\n\n"); return; } if(strlen(textPwd)==33){ - Serial.print("\n*** Sorry, 32 character limit - request cancelled\n\n"); + LOG0("\n*** Sorry, 32 character limit - request cancelled\n\n"); return; } - Serial.print(mask(textPwd,2)); - Serial.print("\n"); + LOG0("%s\n",mask(textPwd,2).c_str()); spanOTA.setPassword(textPwd); nvs_set_str(otaNVS,"OTADATA",spanOTA.otaPwd); // update data nvs_commit(otaNVS); - Serial.print("... Accepted! Password change will take effect after next restart.\n"); + LOG0("... Accepted! Password change will take effect after next restart.\n"); if(!spanOTA.enabled) - Serial.print("... Note: OTA has not been enabled in this sketch.\n"); - Serial.print("\n"); + LOG0("... Note: OTA has not been enabled in this sketch.\n"); + LOG0("\n"); } break; case 'S': { - char buf[128]; char setupCode[10]; struct { // temporary structure to hold SRP verification code and salt stored in NVS @@ -669,23 +663,19 @@ void Span::processSerialCommand(const char *c){ sscanf(c+1," %9[0-9]",setupCode); if(strlen(setupCode)!=8){ - Serial.print("\n*** Invalid request to change Setup Code. Code must be exactly 8 digits.\n\n"); + LOG0("\n*** Invalid request to change Setup Code. Code must be exactly 8 digits.\n\n"); } else if(!network.allowedCode(setupCode)){ - Serial.print("\n*** Invalid request to change Setup Code. Code too simple.\n\n"); + LOG0("\n*** Invalid request to change Setup Code. Code too simple.\n\n"); } else { - sprintf(buf,"\n\nGenerating SRP verification data for new Setup Code: %.3s-%.2s-%.3s ... ",setupCode,setupCode+3,setupCode+5); - Serial.print(buf); + LOG0("\nGenerating SRP verification data for new Setup Code: %.3s-%.2s-%.3s ... ",setupCode,setupCode+3,setupCode+5); HAPClient::srp.createVerifyCode(setupCode,verifyData.verifyCode,verifyData.salt); // create verification code from default Setup Code and random salt nvs_set_blob(HAPClient::srpNVS,"VERIFYDATA",&verifyData,sizeof(verifyData)); // update data nvs_commit(HAPClient::srpNVS); // commit to NVS - Serial.print("New Code Saved!\n"); - - Serial.print("Setup Payload for Optional QR Code: "); - Serial.print(qrCode.get(atoi(setupCode),qrID,atoi(category))); - Serial.print("\n\n"); + LOG0("New Code Saved!\n"); + LOG0("Setup Payload for Optional QR Code: %s\n\n",qrCode.get(atoi(setupCode),qrID,atoi(category))); } } break; @@ -695,7 +685,7 @@ void Span::processSerialCommand(const char *c){ HAPClient::removeControllers(); // clear all Controller data nvs_set_blob(HAPClient::hapNVS,"CONTROLLERS",HAPClient::controllers,sizeof(HAPClient::controllers)); // update data nvs_commit(HAPClient::hapNVS); // commit to NVS - Serial.print("\n*** HomeSpan Pairing Data DELETED ***\n\n"); + LOG0("\n*** HomeSpan Pairing Data DELETED ***\n\n"); for(int i=0;iclient){ // if slot is connected @@ -706,7 +696,7 @@ void Span::processSerialCommand(const char *c){ } } - Serial.print("\nDEVICE NOT YET PAIRED -- PLEASE PAIR WITH HOMEKIT APP\n\n"); + LOG0("\nDEVICE NOT YET PAIRED -- PLEASE PAIR WITH HOMEKIT APP\n\n"); mdns_service_txt_item_set("_hap","_tcp","sf","1"); // set Status Flag = 1 (Table 6-8) if(homeSpan.pairCallback) @@ -719,7 +709,7 @@ void Span::processSerialCommand(const char *c){ case 'W': { if(strlen(network.wifiData.ssid)>0){ - Serial.print("*** Stopping all current WiFi services...\n\n"); + LOG0("*** Stopping all current WiFi services...\n\n"); hapServer->end(); MDNS.end(); WiFi.disconnect(); @@ -728,7 +718,7 @@ void Span::processSerialCommand(const char *c){ network.serialConfigure(); nvs_set_blob(wifiNVS,"WIFIDATA",&network.wifiData,sizeof(network.wifiData)); // update data nvs_commit(wifiNVS); // commit to NVS - Serial.print("\n*** WiFi Credentials SAVED! Restarting ***\n\n"); + LOG0("\n*** WiFi Credentials SAVED! Restarting ***\n\n"); reboot(); } break; @@ -736,7 +726,7 @@ void Span::processSerialCommand(const char *c){ case 'A': { if(strlen(network.wifiData.ssid)>0){ - Serial.print("*** Stopping all current WiFi services...\n\n"); + LOG0("*** Stopping all current WiFi services...\n\n"); hapServer->end(); MDNS.end(); WiFi.disconnect(); @@ -750,16 +740,16 @@ void Span::processSerialCommand(const char *c){ network.apConfigure(); nvs_set_blob(wifiNVS,"WIFIDATA",&network.wifiData,sizeof(network.wifiData)); // update data nvs_commit(wifiNVS); // commit to NVS - Serial.print("\n*** Credentials saved!\n"); + LOG0("\n*** Credentials saved!\n"); if(strlen(network.setupCode)){ char s[10]; sprintf(s,"S%s",network.setupCode); processSerialCommand(s); } else { - Serial.print("*** Setup Code Unchanged\n"); + LOG0("*** Setup Code Unchanged\n"); } - Serial.print("\n*** Restarting...\n\n"); + LOG0("\n*** Restarting...\n\n"); STATUS_UPDATE(start(LED_ALERT),HS_AP_TERMINATED) reboot(); } @@ -770,7 +760,7 @@ void Span::processSerialCommand(const char *c){ nvs_erase_all(wifiNVS); nvs_commit(wifiNVS); WiFi.begin("none"); - Serial.print("\n*** WiFi Credentials ERASED! Restarting...\n\n"); + LOG0("\n*** WiFi Credentials ERASED! Restarting...\n\n"); reboot(); } break; @@ -779,7 +769,7 @@ void Span::processSerialCommand(const char *c){ nvs_erase_all(charNVS); nvs_commit(charNVS); - Serial.print("\n*** Values for all saved Characteristics erased!\n\n"); + LOG0("\n*** Values for all saved Characteristics erased!\n\n"); } break; @@ -787,7 +777,7 @@ void Span::processSerialCommand(const char *c){ nvs_erase_all(HAPClient::hapNVS); nvs_commit(HAPClient::hapNVS); - Serial.print("\n*** HomeSpan Device ID and Pairing Data DELETED! Restarting...\n\n"); + LOG0("\n*** HomeSpan Device ID and Pairing Data DELETED! Restarting...\n\n"); reboot(); } break; @@ -809,7 +799,7 @@ void Span::processSerialCommand(const char *c){ nvs_erase_all(otaNVS); nvs_commit(otaNVS); WiFi.begin("none"); - Serial.print("\n*** FACTORY RESET! Restarting...\n\n"); + LOG0("\n*** FACTORY RESET! Restarting...\n\n"); reboot(); } break; @@ -817,7 +807,7 @@ void Span::processSerialCommand(const char *c){ case 'E': { nvs_flash_erase(); - Serial.print("\n*** ALL DATA ERASED! Restarting...\n\n"); + LOG0("\n*** ALL DATA ERASED! Restarting...\n\n"); reboot(); } break; @@ -832,22 +822,20 @@ void Span::processSerialCommand(const char *c){ if(level>2) level=2; - Serial.print("\n*** Log Level set to "); - Serial.print(level); - Serial.print("\n\n"); + LOG0("\n*** Log Level set to %d\n\n",level); delay(1000); setLogLevel(level); } break; case 'm': { - Serial.printf("Free Memory: %d bytes\n",heap_caps_get_free_size(MALLOC_CAP_DEFAULT)); + LOG0("Free Memory: %d bytes\n",heap_caps_get_free_size(MALLOC_CAP_DEFAULT)); } break; case 'i':{ - Serial.print("\n*** HomeSpan Info ***\n\n"); + LOG0("\n*** HomeSpan Info ***\n\n"); int nErrors=0; int nWarnings=0; @@ -856,25 +844,24 @@ void Span::processSerialCommand(const char *c){ char pNames[][7]={"PR","PW","EV","AA","TW","HD","WR"}; for(auto acc=Accessories.begin(); acc!=Accessories.end(); acc++){ - Serial.printf("\u27a4 Accessory: AID=%d\n",(*acc)->aid); + LOG0("\u27a4 Accessory: AID=%d\n",(*acc)->aid); boolean foundInfo=false; if(acc==Accessories.begin() && (*acc)->aid!=1) - Serial.printf(" *** ERROR #%d! AID of first Accessory must always be 1 ***\n",++nErrors); + LOG0(" *** ERROR #%d! AID of first Accessory must always be 1 ***\n",++nErrors); if(aidValues.find((*acc)->aid)!=aidValues.end()) - Serial.printf(" *** ERROR #%d! AID already in use for another Accessory ***\n",++nErrors); + LOG0(" *** ERROR #%d! AID already in use for another Accessory ***\n",++nErrors); aidValues.insert((*acc)->aid); for(auto svc=(*acc)->Services.begin(); svc!=(*acc)->Services.end(); svc++){ - Serial.printf(" \u279f Service %s: IID=%d, %sUUID=\"%s\"",(*svc)->hapName,(*svc)->iid,(*svc)->isCustom?"Custom-":"",(*svc)->type); - Serial.printf("\n"); + LOG0(" \u279f Service %s: IID=%d, %sUUID=\"%s\"\n",(*svc)->hapName,(*svc)->iid,(*svc)->isCustom?"Custom-":"",(*svc)->type); if(!strcmp((*svc)->type,"3E")){ foundInfo=true; if((*svc)->iid!=1) - Serial.printf(" *** ERROR #%d! The Accessory Information Service must be defined before any other Services in an Accessory ***\n",++nErrors); + LOG0(" *** ERROR #%d! The Accessory Information Service must be defined before any other Services in an Accessory ***\n",++nErrors); } else if((*acc)->aid==1) // this is an Accessory with aid=1, but it has more than just AccessoryInfo. So... isBridge=false; // ...this is not a bridge device @@ -882,45 +869,45 @@ void Span::processSerialCommand(const char *c){ unordered_set hapChar; for(auto chr=(*svc)->Characteristics.begin(); chr!=(*svc)->Characteristics.end(); chr++){ - Serial.printf(" \u21e8 Characteristic %s(%s): IID=%d, %sUUID=\"%s\", %sPerms=", + LOG0(" \u21e8 Characteristic %s(%s): IID=%d, %sUUID=\"%s\", %sPerms=", (*chr)->hapName,(*chr)->uvPrint((*chr)->value).c_str(),(*chr)->iid,(*chr)->isCustom?"Custom-":"",(*chr)->type,(*chr)->perms!=(*chr)->hapChar->perms?"Custom-":""); int foundPerms=0; for(uint8_t i=0;i<7;i++){ if((*chr)->perms & (1<format!=FORMAT::STRING && (*chr)->format!=FORMAT::BOOL && (*chr)->format!=FORMAT::DATA){ if((*chr)->validValues) - Serial.printf(", Valid Values=%s",(*chr)->validValues); + LOG0(", Valid Values=%s",(*chr)->validValues); else if((*chr)->uvGet((*chr)->stepValue)>0) - Serial.printf(", %sRange=[%s,%s,%s]",(*chr)->customRange?"Custom-":"",(*chr)->uvPrint((*chr)->minValue).c_str(),(*chr)->uvPrint((*chr)->maxValue).c_str(),(*chr)->uvPrint((*chr)->stepValue).c_str()); + LOG0(", %sRange=[%s,%s,%s]",(*chr)->customRange?"Custom-":"",(*chr)->uvPrint((*chr)->minValue).c_str(),(*chr)->uvPrint((*chr)->maxValue).c_str(),(*chr)->uvPrint((*chr)->stepValue).c_str()); else - Serial.printf(", %sRange=[%s,%s]",(*chr)->customRange?"Custom-":"",(*chr)->uvPrint((*chr)->minValue).c_str(),(*chr)->uvPrint((*chr)->maxValue).c_str()); + LOG0(", %sRange=[%s,%s]",(*chr)->customRange?"Custom-":"",(*chr)->uvPrint((*chr)->minValue).c_str(),(*chr)->uvPrint((*chr)->maxValue).c_str()); } if((*chr)->nvsKey) - Serial.printf(" (nvs)"); - Serial.printf("\n"); + LOG0(" (nvs)"); + LOG0("\n"); if(!(*chr)->isCustom && !(*svc)->isCustom && (*svc)->req.find((*chr)->hapChar)==(*svc)->req.end() && (*svc)->opt.find((*chr)->hapChar)==(*svc)->opt.end()) - Serial.printf(" *** WARNING #%d! Service does not support this Characteristic ***\n",++nWarnings); + LOG0(" *** WARNING #%d! Service does not support this Characteristic ***\n",++nWarnings); else if(invalidUUID((*chr)->type,(*chr)->isCustom)) - Serial.printf(" *** ERROR #%d! Format of UUID is invalid ***\n",++nErrors); + LOG0(" *** ERROR #%d! Format of UUID is invalid ***\n",++nErrors); else if(hapChar.find((*chr)->hapChar)!=hapChar.end()) - Serial.printf(" *** ERROR #%d! Characteristic already defined for this Service ***\n",++nErrors); + LOG0(" *** ERROR #%d! Characteristic already defined for this Service ***\n",++nErrors); if((*chr)->setRangeError) - Serial.printf(" *** WARNING #%d! Attempt to set Custom Range for this Characteristic ignored ***\n",++nWarnings); + LOG0(" *** WARNING #%d! Attempt to set Custom Range for this Characteristic ignored ***\n",++nWarnings); if((*chr)->setValidValuesError) - Serial.printf(" *** WARNING #%d! Attempt to set Custom Valid Values for this Characteristic ignored ***\n",++nWarnings); + LOG0(" *** WARNING #%d! Attempt to set Custom Valid Values for this Characteristic ignored ***\n",++nWarnings); if((*chr)->format!=STRING && ((*chr)->uvGet((*chr)->value) < (*chr)->uvGet((*chr)->minValue) || (*chr)->uvGet((*chr)->value) > (*chr)->uvGet((*chr)->maxValue))) - Serial.printf(" *** WARNING #%d! Value of %g is out of range [%g,%g] ***\n",++nWarnings,(*chr)->uvGet((*chr)->value),(*chr)->uvGet((*chr)->minValue),(*chr)->uvGet((*chr)->maxValue)); + LOG0(" *** WARNING #%d! Value of %g is out of range [%g,%g] ***\n",++nWarnings,(*chr)->uvGet((*chr)->value),(*chr)->uvGet((*chr)->minValue),(*chr)->uvGet((*chr)->maxValue)); hapChar.insert((*chr)->hapChar); @@ -928,65 +915,65 @@ void Span::processSerialCommand(const char *c){ for(auto req=(*svc)->req.begin(); req!=(*svc)->req.end(); req++){ if(hapChar.find(*req)==hapChar.end()) - Serial.printf(" *** WARNING #%d! Required '%s' Characteristic for this Service not found ***\n",++nWarnings,(*req)->hapName); + LOG0(" *** WARNING #%d! Required '%s' Characteristic for this Service not found ***\n",++nWarnings,(*req)->hapName); } for(auto button=PushButtons.begin(); button!=PushButtons.end(); button++){ if((*button)->service==(*svc)){ if((*button)->buttonType==SpanButton::HS_BUTTON) - Serial.printf(" \u25bc SpanButton: Pin=%d, Single=%ums, Double=%ums, Long=%ums, Type=",(*button)->pin,(*button)->singleTime,(*button)->doubleTime,(*button)->longTime); + LOG0(" \u25bc SpanButton: Pin=%d, Single=%ums, Double=%ums, Long=%ums, Type=",(*button)->pin,(*button)->singleTime,(*button)->doubleTime,(*button)->longTime); else - Serial.printf(" \u25bc SpanToggle: Pin=%d, Toggle=%ums, Type=",(*button)->pin,(*button)->longTime); + LOG0(" \u25bc SpanToggle: Pin=%d, Toggle=%ums, Type=",(*button)->pin,(*button)->longTime); if((*button)->triggerType==PushButton::TRIGGER_ON_LOW) - Serial.printf("TRIGGER_ON_LOW\n"); + LOG0("TRIGGER_ON_LOW\n"); else if((*button)->triggerType==PushButton::TRIGGER_ON_HIGH) - Serial.printf("TRIGGER_ON_HIGH\n"); + LOG0("TRIGGER_ON_HIGH\n"); #if SOC_TOUCH_SENSOR_NUM > 0 else if((*button)->triggerType==PushButton::TRIGGER_ON_TOUCH) - Serial.printf("TRIGGER_ON_TOUCH\n"); + LOG0("TRIGGER_ON_TOUCH\n"); #endif else - Serial.printf("USER-DEFINED\n"); + LOG0("USER-DEFINED\n"); if((void(*)(int,int))((*svc)->*(&SpanService::button))==(void(*)(int,int))(&SpanService::button)) - Serial.printf(" *** WARNING #%d! No button() method defined in this Service ***\n",++nWarnings); + LOG0(" *** WARNING #%d! No button() method defined in this Service ***\n",++nWarnings); } } } // Services if(!foundInfo) - Serial.printf(" *** ERROR #%d! Required 'AccessoryInformation' Service not found ***\n",++nErrors); + LOG0(" *** ERROR #%d! Required 'AccessoryInformation' Service not found ***\n",++nErrors); } // Accessories - Serial.printf("\nConfigured as Bridge: %s\n",isBridge?"YES":"NO"); + LOG0("\nConfigured as Bridge: %s\n",isBridge?"YES":"NO"); if(hapConfig.configNumber>0) - Serial.printf("Configuration Number: %d\n",hapConfig.configNumber); - Serial.printf("\nDatabase Validation: Warnings=%d, Errors=%d\n\n",nWarnings,nErrors); + LOG0("Configuration Number: %d\n",hapConfig.configNumber); + LOG0("\nDatabase Validation: Warnings=%d, Errors=%d\n\n",nWarnings,nErrors); char d[]="------------------------------"; - Serial.printf("%-30s %8s %10s %s %s %s %s %s\n","Service","UUID","AID","IID","Update","Loop","Button","Linked Services"); - Serial.printf("%.30s %.8s %.10s %.3s %.6s %.4s %.6s %.15s\n",d,d,d,d,d,d,d,d); + LOG0("%-30s %8s %10s %s %s %s %s %s\n","Service","UUID","AID","IID","Update","Loop","Button","Linked Services"); + LOG0("%.30s %.8s %.10s %.3s %.6s %.4s %.6s %.15s\n",d,d,d,d,d,d,d,d); for(int i=0;iServices.size();j++){ SpanService *s=Accessories[i]->Services[j]; - Serial.printf("%-30s %8.8s %10u %3d %6s %4s %6s ",s->hapName,s->type,Accessories[i]->aid,s->iid, + LOG0("%-30s %8.8s %10u %3d %6s %4s %6s ",s->hapName,s->type,Accessories[i]->aid,s->iid, (void(*)())(s->*(&SpanService::update))!=(void(*)())(&SpanService::update)?"YES":"NO", (void(*)())(s->*(&SpanService::loop))!=(void(*)())(&SpanService::loop)?"YES":"NO", (void(*)(int,boolean))(s->*(&SpanService::button))!=(void(*)(int,boolean))(&SpanService::button)?"YES":"NO" ); if(s->linkedServices.empty()) - Serial.print("-"); + LOG0("-"); for(int k=0;klinkedServices.size();k++){ - Serial.print(s->linkedServices[k]->iid); + LOG0("%d",s->linkedServices[k]->iid); if(klinkedServices.size()-1) - Serial.print(","); + LOG0(","); } - Serial.print("\n"); + LOG0("\n"); } } @@ -994,75 +981,75 @@ void Span::processSerialCommand(const char *c){ uint8_t channel; wifi_second_chan_t channel2; esp_wifi_get_channel(&channel,&channel2); - Serial.printf("\nFound %d SpanPoint Links:\n\n",SpanPoint::SpanPoints.size()); - Serial.printf("%-17s %18s %7s %7s %7s\n","Local MAC Address","Remote MAC Address","Send","Receive","Depth"); - Serial.printf("%.17s %.18s %.7s %.7s %.7s\n",d,d,d,d,d); + LOG0("\nFound %d SpanPoint Links:\n\n",SpanPoint::SpanPoints.size()); + LOG0("%-17s %18s %7s %7s %7s\n","Local MAC Address","Remote MAC Address","Send","Receive","Depth"); + LOG0("%.17s %.18s %.7s %.7s %.7s\n",d,d,d,d,d); for(auto it=SpanPoint::SpanPoints.begin();it!=SpanPoint::SpanPoints.end();it++) - Serial.printf("%-18s %02X:%02X:%02X:%02X:%02X:%02X %7d %7d %7d\n",(*it)->peerInfo.ifidx==WIFI_IF_AP?WiFi.softAPmacAddress().c_str():WiFi.macAddress().c_str(), + LOG0("%-18s %02X:%02X:%02X:%02X:%02X:%02X %7d %7d %7d\n",(*it)->peerInfo.ifidx==WIFI_IF_AP?WiFi.softAPmacAddress().c_str():WiFi.macAddress().c_str(), (*it)->peerInfo.peer_addr[0],(*it)->peerInfo.peer_addr[1],(*it)->peerInfo.peer_addr[2],(*it)->peerInfo.peer_addr[3],(*it)->peerInfo.peer_addr[4],(*it)->peerInfo.peer_addr[5], (*it)->sendSize,(*it)->receiveSize,uxQueueSpacesAvailable((*it)->receiveQueue)); - Serial.printf("\nSpanPoint using WiFi Channel %d%s\n",channel,WiFi.status()!=WL_CONNECTED?" (subject to change once WiFi connection established)":""); + LOG0("\nSpanPoint using WiFi Channel %d%s\n",channel,WiFi.status()!=WL_CONNECTED?" (subject to change once WiFi connection established)":""); } - Serial.print("\n*** End Info ***\n\n"); + LOG0("\n*** End Info ***\n\n"); } break; case 'P': { - Serial.printf("\n*** Pairing Data used for Cloning another Device\n\n"); + LOG0("\n*** Pairing Data used for Cloning another Device\n\n"); size_t olen; TempBuffer tBuf(256); mbedtls_base64_encode((uint8_t *)tBuf.buf,256,&olen,(uint8_t *)&HAPClient::accessory,sizeof(struct Accessory)); - Serial.printf("Accessory data: %s\n",tBuf.buf); + LOG0("Accessory data: %s\n",tBuf.buf); for(int i=0;i tBuf(200); size_t olen; tBuf.buf[0]='\0'; - Serial.print(">>> Accessory data: "); + LOG0(">>> Accessory data: "); readSerial(tBuf.buf,199); if(strlen(tBuf.buf)==0){ - Serial.printf("(cancelled)\n\n"); + LOG0("(cancelled)\n\n"); return; } mbedtls_base64_decode((uint8_t *)&HAPClient::accessory,sizeof(struct Accessory),&olen,(uint8_t *)tBuf.buf,strlen(tBuf.buf)); if(olen!=sizeof(struct Accessory)){ - Serial.printf("\n*** Error in size of Accessory data - cloning cancelled. Restarting...\n\n"); + LOG0("\n*** Error in size of Accessory data - cloning cancelled. Restarting...\n\n"); reboot(); } else { HAPClient::charPrintRow(HAPClient::accessory.ID,17); - Serial.printf("\n"); + LOG0("\n"); } for(int i=0;i>> Controller data: "); + LOG0(">>> Controller data: "); readSerial(tBuf.buf,199); if(strlen(tBuf.buf)==0){ - Serial.printf("(done)\n"); + LOG0("(done)\n"); while(i - change the HomeKit Pairing Setup Code to \n"); - Serial.print(" Q - change the HomeKit Setup ID for QR Codes to \n"); - Serial.print(" O - change the OTA password\n"); - Serial.print(" A - start the HomeSpan Setup Access Point\n"); - Serial.print("\n"); - Serial.print(" V - delete value settings for all saved Characteristics\n"); - Serial.print(" U - unpair device by deleting all Controller data\n"); - Serial.print(" H - delete HomeKit Device ID as well as all Controller data and restart\n"); - Serial.print("\n"); - Serial.print(" P - output Pairing Data that can be saved offline to clone a new device\n"); - Serial.print(" C - clone Pairing Data previously saved offline from another device\n"); - Serial.print("\n"); - Serial.print(" R - restart device\n"); - Serial.print(" F - factory reset and restart\n"); - Serial.print(" E - erase ALL stored data and restart\n"); - Serial.print("\n"); - Serial.print(" L - change the Log Level setting to \n"); - Serial.print("\n"); + LOG0("\n*** HomeSpan Commands ***\n\n"); + LOG0(" s - print connection status\n"); + LOG0(" i - print summary information about the HAP Database\n"); + LOG0(" d - print the full HAP Accessory Attributes Database in JSON format\n"); + LOG0(" m - print free heap memory\n"); + LOG0("\n"); + LOG0(" W - configure WiFi Credentials and restart\n"); + LOG0(" X - delete WiFi Credentials and restart\n"); + LOG0(" S - change the HomeKit Pairing Setup Code to \n"); + LOG0(" Q - change the HomeKit Setup ID for QR Codes to \n"); + LOG0(" O - change the OTA password\n"); + LOG0(" A - start the HomeSpan Setup Access Point\n"); + LOG0("\n"); + LOG0(" V - delete value settings for all saved Characteristics\n"); + LOG0(" U - unpair device by deleting all Controller data\n"); + LOG0(" H - delete HomeKit Device ID as well as all Controller data and restart\n"); + LOG0("\n"); + LOG0(" P - output Pairing Data that can be saved offline to clone a new device\n"); + LOG0(" C - clone Pairing Data previously saved offline from another device\n"); + LOG0("\n"); + LOG0(" R - restart device\n"); + LOG0(" F - factory reset and restart\n"); + LOG0(" E - erase ALL stored data and restart\n"); + LOG0("\n"); + LOG0(" L - change the Log Level setting to \n"); + LOG0("\n"); for(auto uCom=homeSpan.UserCommands.begin(); uCom!=homeSpan.UserCommands.end(); uCom++) // loop over all UserCommands using an iterator - Serial.printf(" @%c %s\n",uCom->first,uCom->second->s); + LOG0(" @%c %s\n",uCom->first,uCom->second->s); if(!homeSpan.UserCommands.empty()) - Serial.print("\n"); + LOG0("\n"); - Serial.print(" ? - print this list of commands\n\n"); - Serial.print("*** End Commands ***\n\n"); + LOG0(" ? - print this list of commands\n\n"); + LOG0("*** End Commands ***\n\n"); } break; @@ -1138,17 +1125,13 @@ void Span::processSerialCommand(const char *c){ else uCom->second->userFunction2(c+1,uCom->second->userArg); } else { - Serial.print("*** Undefined user command: '"); - Serial.print(c); - Serial.print("'. Type '?' for list of commands.\n"); + LOG0("*** Undefined user command: '%s'. Type '?' for list of commands.\n",c); } } break; default: - Serial.print("*** Unknown command: '"); - Serial.print(c); - Serial.print("'. Type '?' for list of commands.\n"); + LOG0("*** Unknown command: '%s'. Type '?' for list of commands.\n",c); break; } // switch @@ -1244,37 +1227,35 @@ void Span::prettyPrint(char *buf, int nsp){ case '{': case '[': - Serial.print(buf[i]); - Serial.print("\n"); + LOG0("%c\n",buf[i]); indent+=nsp; for(int j=0;jTimedWrites[pid]){ - Serial.print("\n*** ERROR: Timed Write Expired\n\n"); + LOG0("\n*** ERROR: Timed Write Expired\n\n"); twFail=true; } } else { - Serial.print("\n*** ERROR: Problems parsing JSON characteristics object - unexpected property \""); - Serial.print(t2); - Serial.print("\"\n\n"); + LOG0("\n*** ERROR: Problems parsing JSON characteristics object - unexpected property \"%s\"\n\n",t2); return(0); } } // parse property tokens @@ -1397,7 +1376,7 @@ int Span::updateCharacteristics(char *buf, SpanBuf *pObj){ if(okay==7 || okay==11 || okay==15){ // all required properties found nObj++; // increment number of characteristic objects found } else { - Serial.print("\n*** ERROR: Problems parsing JSON characteristics object - missing required properties\n\n"); + LOG0("\n*** ERROR: Problems parsing JSON characteristics object - missing required properties\n\n"); return(0); } } @@ -1626,9 +1605,7 @@ SpanAccessory::SpanAccessory(uint32_t aid){ if(!homeSpan.Accessories.empty()){ if(homeSpan.Accessories.size()==HAPClient::MAX_ACCESSORIES){ - Serial.print("\n\n*** FATAL ERROR: Can't create more than "); - Serial.print(HAPClient::MAX_ACCESSORIES); - Serial.print(" Accessories. Program Halting.\n\n"); + LOG0("\n\n*** FATAL ERROR: Can't create more than %d Accessories. Program Halting.\n\n",HAPClient::MAX_ACCESSORIES); while(1); } @@ -1685,8 +1662,8 @@ int SpanAccessory::sprintfAttributes(char *cBuf, int flags){ SpanService::SpanService(const char *type, const char *hapName, boolean isCustom){ if(homeSpan.Accessories.empty()){ - Serial.printf("\nFATAL ERROR! Can't create new Service '%s' without a defined Accessory ***\n",hapName); - Serial.printf("\n=== PROGRAM HALTED ==="); + LOG0("\nFATAL ERROR! Can't create new Service '%s' without a defined Accessory ***\n",hapName); + LOG0("\n=== PROGRAM HALTED ==="); while(1); } @@ -1803,8 +1780,8 @@ SpanCharacteristic::SpanCharacteristic(HapChar *hapChar, boolean isCustom){ this->hapChar=hapChar; if(homeSpan.Accessories.empty() || homeSpan.Accessories.back()->Services.empty()){ - Serial.printf("\nFATAL ERROR! Can't create new Characteristic '%s' without a defined Service ***\n",hapName); - Serial.printf("\n=== PROGRAM HALTED ==="); + LOG0("\nFATAL ERROR! Can't create new Characteristic '%s' without a defined Service ***\n",hapName); + LOG0("\n=== PROGRAM HALTED ==="); while(1); } @@ -2068,8 +2045,8 @@ SpanCharacteristic *SpanCharacteristic::setValidValues(int n, ...){ SpanRange::SpanRange(int min, int max, int step){ if(homeSpan.Accessories.empty() || homeSpan.Accessories.back()->Services.empty() || homeSpan.Accessories.back()->Services.back()->Characteristics.empty() ){ - Serial.printf("\nFATAL ERROR! Can't create new SpanRange(%d,%d,%d) without a defined Characteristic ***\n",min,max,step); - Serial.printf("\n=== PROGRAM HALTED ==="); + LOG0("\nFATAL ERROR! Can't create new SpanRange(%d,%d,%d) without a defined Characteristic ***\n",min,max,step); + LOG0("\n=== PROGRAM HALTED ==="); while(1); } else { homeSpan.Accessories.back()->Services.back()->Characteristics.back()->setRange(min,max,step); @@ -2084,11 +2061,11 @@ SpanButton::SpanButton(int pin, uint16_t longTime, uint16_t singleTime, uint16_t if(homeSpan.Accessories.empty() || homeSpan.Accessories.back()->Services.empty()){ if(buttonType==HS_BUTTON) - Serial.printf("\nFATAL ERROR! Can't create new SpanButton(%d,%u,%u,%u) without a defined Service ***\n",pin,longTime,singleTime,doubleTime); + LOG0("\nFATAL ERROR! Can't create new SpanButton(%d,%u,%u,%u) without a defined Service ***\n",pin,longTime,singleTime,doubleTime); else - Serial.printf("\nFATAL ERROR! Can't create new SpanToggle(%d,%u) without a defined Service ***\n",pin,longTime); + LOG0("\nFATAL ERROR! Can't create new SpanToggle(%d,%u) without a defined Service ***\n",pin,longTime); - Serial.printf("\n=== PROGRAM HALTED ==="); + LOG0("\n=== PROGRAM HALTED ==="); while(1); } @@ -2173,9 +2150,9 @@ void SpanWebLog::vLog(boolean sysMsg, const char *fmt, va_list ap){ vasprintf(&buf,fmt,ap); if(sysMsg) - Serial.printf("%s\n",buf); + LOG0("%s\n",buf); else if(homeSpan.logLevel>0) - Serial.printf("WEBLOG: %s\n",buf); + LOG0("WEBLOG: %s\n",buf); if(maxEntries>0){ int index=nEntries%maxEntries; @@ -2202,7 +2179,7 @@ void SpanWebLog::vLog(boolean sysMsg, const char *fmt, va_list ap){ int SpanOTA::init(boolean _auth, boolean _safeLoad, const char *pwd){ if(esp_ota_get_running_partition()==esp_ota_get_next_update_partition(NULL)){ - Serial.print("\n*** WARNING: Can't start OTA Server - Partition table used to compile this sketch is not configured for OTA.\n\n"); + LOG0("\n*** WARNING: Can't start OTA Server - Partition table used to compile this sketch is not configured for OTA.\n\n"); return(-1); } @@ -2219,7 +2196,7 @@ int SpanOTA::init(boolean _auth, boolean _safeLoad, const char *pwd){ int SpanOTA::setPassword(const char *pwd){ if(strlen(pwd)<1 || strlen(pwd)>32){ - Serial.printf("\n*** WARNING: Cannot change OTA password to '%s'. Password length must be between 1 and 32 characters.\n\n",pwd); + LOG0("\n*** WARNING: Cannot change OTA password to '%s'. Password length must be between 1 and 32 characters.\n\n",pwd); return(-1); } @@ -2234,7 +2211,7 @@ int SpanOTA::setPassword(const char *pwd){ /////////////////////////////// void SpanOTA::start(){ - Serial.printf("\n*** Current Partition: %s\n*** New Partition: %s\n*** OTA Starting..", + LOG0("\n*** Current Partition: %s\n*** New Partition: %s\n*** OTA Starting..", esp_ota_get_running_partition()->label,esp_ota_get_next_update_partition(NULL)->label); otaPercent=0; STATUS_UPDATE(start(LED_OTA_STARTED),HS_OTA_STARTED) @@ -2245,7 +2222,7 @@ void SpanOTA::start(){ void SpanOTA::end(){ nvs_set_u8(homeSpan.otaNVS,"OTA_REQUIRED",safeLoad); nvs_commit(homeSpan.otaNVS); - Serial.printf(" DONE! Rebooting...\n"); + LOG0(" DONE! Rebooting...\n"); homeSpan.reboot(); } @@ -2255,13 +2232,13 @@ void SpanOTA::progress(uint32_t progress, uint32_t total){ int percent=progress*100/total; if(percent/10 != otaPercent/10){ otaPercent=percent; - Serial.printf("%d%%..",progress*100/total); + LOG0("%d%%..",progress*100/total); } if(safeLoad && progress==total){ SpanPartition newSpanPartition; esp_partition_read(esp_ota_get_next_update_partition(NULL), sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) + sizeof(esp_app_desc_t), &newSpanPartition, sizeof(newSpanPartition)); - Serial.printf("Checking for HomeSpan Magic Cookie: %s..",newSpanPartition.magicCookie); + LOG0("Checking for HomeSpan Magic Cookie: %s..",newSpanPartition.magicCookie); if(strcmp(newSpanPartition.magicCookie,spanPartition.magicCookie)) Update.abort(); } @@ -2270,12 +2247,12 @@ void SpanOTA::progress(uint32_t progress, uint32_t total){ /////////////////////////////// void SpanOTA::error(ota_error_t err){ - Serial.printf("*** OTA Error[%u]: ", err); - if (err == OTA_AUTH_ERROR) Serial.println("Auth Failed\n"); - else if (err == OTA_BEGIN_ERROR) Serial.println("Begin Failed\n"); - else if (err == OTA_CONNECT_ERROR) Serial.println("Connect Failed\n"); - else if (err == OTA_RECEIVE_ERROR) Serial.println("Receive Failed\n"); - else if (err == OTA_END_ERROR) Serial.println("End Failed\n"); + LOG0("*** OTA Error[%u]: ", err); + if (err == OTA_AUTH_ERROR) LOG0("Auth Failed\n\n"); + else if (err == OTA_BEGIN_ERROR) LOG0("Begin Failed\n\n"); + else if (err == OTA_CONNECT_ERROR) LOG0("Connect Failed\n\n"); + else if (err == OTA_RECEIVE_ERROR) LOG0("Receive Failed\n\n"); + else if (err == OTA_END_ERROR) LOG0("End Failed\n\n"); } /////////////////////////////// @@ -2292,14 +2269,14 @@ boolean SpanOTA::auth; SpanPoint::SpanPoint(const char *macAddress, int sendSize, int receiveSize, int queueDepth, boolean useAPaddress){ if(sscanf(macAddress,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",peerInfo.peer_addr,peerInfo.peer_addr+1,peerInfo.peer_addr+2,peerInfo.peer_addr+3,peerInfo.peer_addr+4,peerInfo.peer_addr+5)!=6){ - Serial.printf("\nFATAL ERROR! Can't create new SpanPoint(\"%s\") - Invalid MAC Address ***\n",macAddress); - Serial.printf("\n=== PROGRAM HALTED ==="); + LOG0("\nFATAL ERROR! Can't create new SpanPoint(\"%s\") - Invalid MAC Address ***\n",macAddress); + LOG0("\n=== PROGRAM HALTED ==="); while(1); } if(sendSize<0 || sendSize>200 || receiveSize<0 || receiveSize>200 || queueDepth<1 || (sendSize==0 && receiveSize==0)){ - Serial.printf("\nFATAL ERROR! Can't create new SpanPoint(\"%s\",%d,%d,%d) - one or more invalid parameters ***\n",macAddress,sendSize,receiveSize,queueDepth); - Serial.printf("\n=== PROGRAM HALTED ==="); + LOG0("\nFATAL ERROR! Can't create new SpanPoint(\"%s\",%d,%d,%d) - one or more invalid parameters ***\n",macAddress,sendSize,receiveSize,queueDepth); + LOG0("\n=== PROGRAM HALTED ==="); while(1); } @@ -2380,8 +2357,8 @@ void SpanPoint::setChannelMask(uint16_t mask){ channel=(channelMask & (1<receiveSize){ - Serial.printf("SpanPoint Warning! %d bytes received from %02X:%02X:%02X:%02X:%02X:%02X does not match %d-byte queue size\n",len,mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],(*it)->receiveSize); + LOG0("SpanPoint Warning! %d bytes received from %02X:%02X:%02X:%02X:%02X:%02X does not match %d-byte queue size\n",len,mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],(*it)->receiveSize); return; } diff --git a/src/HomeSpan.h b/src/HomeSpan.h index 53f5f0b..392da50 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -346,7 +346,7 @@ class Span{ void autoPoll(uint32_t stackSize=8192, uint32_t priority=1, uint32_t cpu=0){ // start pollTask() xTaskCreateUniversal([](void *parms){for(;;)homeSpan.pollTask();}, "pollTask", stackSize, NULL, priority, &pollTaskHandle, cpu); - Serial.printf("\n*** AutoPolling Task started with priority=%d\n\n",uxTaskPriorityGet(pollTaskHandle)); + LOG0("\n*** AutoPolling Task started with priority=%d\n\n",uxTaskPriorityGet(pollTaskHandle)); } void setTimeServerTimeout(uint32_t tSec){webLog.waitTime=tSec*1000;} // sets wait time (in seconds) for optional web log time server to connect @@ -635,7 +635,7 @@ class SpanCharacteristic{ void setString(const char *val){ if((perms & EV) == 0){ - Serial.printf("\n*** WARNING: Attempt to update Characteristic::%s with setString() ignored. No NOTIFICATION permission on this characteristic\n\n",hapName); + LOG0("\n*** WARNING: Attempt to update Characteristic::%s with setString() ignored. No NOTIFICATION permission on this characteristic\n\n",hapName); return; } @@ -669,9 +669,9 @@ class SpanCharacteristic{ return(olen); if(ret==MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL) - Serial.printf("\n*** WARNING: Can't decode Characteristic::%s with getData(). Destination buffer is too small (%d out of %d bytes needed)\n\n",hapName,len,olen); + LOG0("\n*** WARNING: Can't decode Characteristic::%s with getData(). Destination buffer is too small (%d out of %d bytes needed)\n\n",hapName,len,olen); else if(ret==MBEDTLS_ERR_BASE64_INVALID_CHARACTER) - Serial.printf("\n*** WARNING: Can't decode Characteristic::%s with getData(). Data is not in base-64 format\n\n",hapName); + LOG0("\n*** WARNING: Can't decode Characteristic::%s with getData(). Data is not in base-64 format\n\n",hapName); return(olen); } @@ -687,9 +687,9 @@ class SpanCharacteristic{ return(olen); if(ret==MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL) - Serial.printf("\n*** WARNING: Can't decode Characteristic::%s with getData(). Destination buffer is too small (%d out of %d bytes needed)\n\n",hapName,len,olen); + LOG0("\n*** WARNING: Can't decode Characteristic::%s with getData(). Destination buffer is too small (%d out of %d bytes needed)\n\n",hapName,len,olen); else if(ret==MBEDTLS_ERR_BASE64_INVALID_CHARACTER) - Serial.printf("\n*** WARNING: Can't decode Characteristic::%s with getData(). Data is not in base-64 format\n\n",hapName); + LOG0("\n*** WARNING: Can't decode Characteristic::%s with getData(). Data is not in base-64 format\n\n",hapName); return(olen); } @@ -697,12 +697,12 @@ class SpanCharacteristic{ void setData(uint8_t *data, size_t len){ if((perms & EV) == 0){ - Serial.printf("\n*** WARNING: Attempt to update Characteristic::%s with setData() ignored. No NOTIFICATION permission on this characteristic\n\n",hapName); + LOG0("\n*** WARNING: Attempt to update Characteristic::%s with setData() ignored. No NOTIFICATION permission on this characteristic\n\n",hapName); return; } if(len<1){ - Serial.printf("\n*** WARNING: Attempt to update Characteristic::%s with setData() ignored. Size of data buffer must be greater than zero\n\n",hapName); + LOG0("\n*** WARNING: Attempt to update Characteristic::%s with setData() ignored. Size of data buffer must be greater than zero\n\n",hapName); return; } @@ -716,12 +716,12 @@ class SpanCharacteristic{ template void setVal(T val, boolean notify=true){ if((perms & EV) == 0){ - Serial.printf("\n*** WARNING: Attempt to update Characteristic::%s with setVal() ignored. No NOTIFICATION permission on this characteristic\n\n",hapName); + LOG0("\n*** WARNING: Attempt to update Characteristic::%s with setVal() ignored. No NOTIFICATION permission on this characteristic\n\n",hapName); return; } if(val < uvGet(minValue) || val > uvGet(maxValue)){ - Serial.printf("\n*** WARNING: Attempt to update Characteristic::%s with setVal(%g) is out of range [%g,%g]. This may cause device to become non-reponsive!\n\n", + LOG0("\n*** WARNING: Attempt to update Characteristic::%s with setVal(%g) is out of range [%g,%g]. This may cause device to become non-reponsive!\n\n", hapName,(double)val,uvGet(minValue),uvGet(maxValue)); } diff --git a/src/Network.cpp b/src/Network.cpp index a5f452f..bcfe676 100644 --- a/src/Network.cpp +++ b/src/Network.cpp @@ -65,33 +65,26 @@ void Network::serialConfigure(){ wifiData.ssid[0]='\0'; wifiData.pwd[0]='\0'; - Serial.print("*** WiFi Setup - Scanning for Networks...\n\n"); + LOG0("*** WiFi Setup - Scanning for Networks...\n\n"); scan(); // scan for networks - for(int i=0;i>> WiFi SSID: "); + LOG0("\n>>> WiFi SSID: "); readSerial(wifiData.ssid,MAX_SSID); if(atoi(wifiData.ssid)>0 && atoi(wifiData.ssid)<=numSSID){ strcpy(wifiData.ssid,ssidList[atoi(wifiData.ssid)-1]); } - Serial.print(wifiData.ssid); - Serial.print("\n"); + LOG0("%s\n",wifiData.ssid); } while(!strlen(wifiData.pwd)){ - Serial.print(">>> WiFi PASS: "); + LOG0(">>> WiFi PASS: "); readSerial(wifiData.pwd,MAX_PWD); - Serial.print(mask(wifiData.pwd,2)); - Serial.print("\n"); + LOG0("%s\n",mask(wifiData.pwd,2).c_str()); } return; @@ -110,25 +103,16 @@ boolean Network::allowedCode(char *s){ void Network::apConfigure(){ - Serial.print("*** Starting Access Point: "); - Serial.print(apSSID); - Serial.print(" / "); - Serial.print(apPassword); - Serial.print("\n"); + LOG0("*** Starting Access Point: %s / %s\n",apSSID,apPassword); STATUS_UPDATE(start(LED_AP_STARTED),HS_AP_STARTED) - Serial.print("\nScanning for Networks...\n\n"); + LOG0("\nScanning for Networks...\n\n"); scan(); // scan for networks - for(int i=0;itriggered(9999,3000)){ - Serial.print("\n*** Access Point Terminated. Restarting...\n\n"); + LOG0("\n*** Access Point Terminated. Restarting...\n\n"); STATUS_UPDATE(start(LED_ALERT),HS_AP_TERMINATED) homeSpan.controlButton->wait(); homeSpan.reboot(); @@ -163,17 +147,14 @@ void Network::apConfigure(){ WiFi.softAPdisconnect(true); // terminate connections and shut down captive access point delay(100); if(apStatus==1){ - Serial.print("\n*** Access Point: Exiting and Saving Settings\n\n"); + LOG0("\n*** Access Point: Exiting and Saving Settings\n\n"); return; } else { - if(apStatus==0){ - Serial.print("\n*** Access Point: Timed Out ("); - Serial.print(lifetime/1000); - Serial.print(" seconds)."); - } else { - Serial.print("\n*** Access Point: Configuration Cancelled."); - } - Serial.print(" Restarting...\n\n"); + if(apStatus==0) + LOG0("\n*** Access Point: Timed Out (%ld seconds).",lifetime/1000); + else + LOG0("\n*** Access Point: Configuration Cancelled."); + LOG0(" Restarting...\n\n"); STATUS_UPDATE(start(LED_ALERT),HS_AP_TERMINATED) homeSpan.reboot(); } @@ -202,7 +183,7 @@ void Network::apConfigure(){ if(nBytes>MAX_HTTP){ // exceeded maximum number of bytes allowed badRequestError(); - Serial.print("\n*** ERROR: Exceeded maximum HTTP message length\n\n"); + LOG0("\n*** ERROR: Exceeded maximum HTTP message length\n\n"); continue; } @@ -212,7 +193,7 @@ void Network::apConfigure(){ if(!(p=strstr((char *)httpBuf,"\r\n\r\n"))){ badRequestError(); - Serial.print("\n*** ERROR: Malformed HTTP request (can't find blank line indicating end of BODY)\n\n"); + LOG0("\n*** ERROR: Malformed HTTP request (can't find blank line indicating end of BODY)\n\n"); continue; } @@ -224,7 +205,7 @@ void Network::apConfigure(){ cLen=atoi(p+16); if(nBytes!=strlen(body)+4+cLen){ badRequestError(); - Serial.print("\n*** ERROR: Malformed HTTP request (Content-Length plus Body Length does not equal total number of bytes read)\n\n"); + LOG0("\n*** ERROR: Malformed HTTP request (Content-Length plus Body Length does not equal total number of bytes read)\n\n"); continue; } diff --git a/src/SRP.cpp b/src/SRP.cpp index bc03cd7..812224e 100644 --- a/src/SRP.cpp +++ b/src/SRP.cpp @@ -273,9 +273,8 @@ void SRP6A::print(mbedtls_mpi *mpi){ mbedtls_mpi_write_string(mpi,16,sBuf,2000,&sLen); - Serial.print((sLen-1)/2); // subtract 1 for null-terminator, and then divide by 2 to get number of bytes (e.g. 4F = 2 characters, but represents just one mpi byte) - Serial.print(" "); - Serial.println(sBuf); + LOG0("%d ",(sLen-1)/2); // subtract 1 for null-terminator, and then divide by 2 to get number of bytes (e.g. 4F = 2 characters, but represents just one mpi byte) + LOG0("%s\n",sBuf); } ////////////////////////////////////// diff --git a/src/Settings.h b/src/Settings.h index 9981f08..7cafe34 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -104,9 +104,9 @@ // Message Log Level Control Macros // // 0=Minimal, 1=Informative, 2=All // -#define LOG0(format,...) if(homeSpan.getLogLevel()>=0)Serial.print ##__VA_OPT__(f)(format __VA_OPT__(,) __VA_ARGS__) -#define LOG1(format,...) if(homeSpan.getLogLevel()>=1)Serial.print ##__VA_OPT__(f)(format __VA_OPT__(,) __VA_ARGS__) -#define LOG2(format,...) if(homeSpan.getLogLevel()>=2)Serial.print ##__VA_OPT__(f)(format __VA_OPT__(,) __VA_ARGS__) +#define LOG0(format,...) do{ if(homeSpan.getLogLevel()>=0)Serial.print ##__VA_OPT__(f)(format __VA_OPT__(,) __VA_ARGS__); }while(0) +#define LOG1(format,...) do{ if(homeSpan.getLogLevel()>=1)Serial.print ##__VA_OPT__(f)(format __VA_OPT__(,) __VA_ARGS__); }while(0) +#define LOG2(format,...) do{ if(homeSpan.getLogLevel()>=2)Serial.print ##__VA_OPT__(f)(format __VA_OPT__(,) __VA_ARGS__); }while(0) #define WEBLOG(format,...) homeSpan.addWebLog(false, format __VA_OPT__(,) __VA_ARGS__); From 7bc885dd266f2e24901bf19fcc6abe4c138a3d34 Mon Sep 17 00:00:00 2001 From: Gregg Date: Wed, 10 May 2023 22:12:21 -0500 Subject: [PATCH 027/151] Completed initial migration of Serial.print to LOG0 Finished all applicable cases in main source code. TO DO: apply LOG0 to extras --- src/HAP.cpp | 63 +++++++++++++++++++++++++++--------------------- src/HAP.h | 8 +++--- src/HomeSpan.cpp | 24 ++++++++++-------- src/HomeSpan.h | 4 +-- src/SRP.cpp | 10 +++++--- src/SRP.h | 2 +- src/TLV.h | 22 +++++++---------- src/Utils.cpp | 5 ++-- 8 files changed, 74 insertions(+), 64 deletions(-) diff --git a/src/HAP.cpp b/src/HAP.cpp index 6e27e36..39bed60 100644 --- a/src/HAP.cpp +++ b/src/HAP.cpp @@ -220,7 +220,7 @@ void HAPClient::processRequest(){ if(!strncmp(body,"POST /pair-setup ",17) && // POST PAIR-SETUP strstr(body,"Content-Type: application/pairing+tlv8") && // check that content is TLV8 tlv8.unpack(content,cLen)){ // read TLV content - if(homeSpan.logLevel>1) tlv8.print(); // print TLV records in form "TAG(INT) LENGTH(INT) VALUES(HEX)" + tlv8.print(2); // print TLV records in form "TAG(INT) LENGTH(INT) VALUES(HEX)" LOG2("------------ END TLVS! ------------\n"); postPairSetupURL(); // process URL @@ -230,7 +230,7 @@ void HAPClient::processRequest(){ if(!strncmp(body,"POST /pair-verify ",18) && // POST PAIR-VERIFY strstr(body,"Content-Type: application/pairing+tlv8") && // check that content is TLV8 tlv8.unpack(content,cLen)){ // read TLV content - if(homeSpan.logLevel>1) tlv8.print(); // print TLV records in form "TAG(INT) LENGTH(INT) VALUES(HEX)" + tlv8.print(2); // print TLV records in form "TAG(INT) LENGTH(INT) VALUES(HEX)" LOG2("------------ END TLVS! ------------\n"); postPairVerifyURL(); // process URL @@ -240,7 +240,7 @@ void HAPClient::processRequest(){ if(!strncmp(body,"POST /pairings ",15) && // POST PAIRINGS strstr(body,"Content-Type: application/pairing+tlv8") && // check that content is TLV8 tlv8.unpack(content,cLen)){ // read TLV content - if(homeSpan.logLevel>1) tlv8.print(); // print TLV records in form "TAG(INT) LENGTH(INT) VALUES(HEX)" + tlv8.print(2); // print TLV records in form "TAG(INT) LENGTH(INT) VALUES(HEX)" LOG2("------------ END TLVS! ------------\n"); postPairingsURL(); // process URL @@ -250,7 +250,7 @@ void HAPClient::processRequest(){ if(!strncmp(body,"POST /pairings ",15) && // POST PAIRINGS strstr(body,"Content-Type: application/pairing+tlv8") && // check that content is TLV8 tlv8.unpack(content,cLen)){ // read TLV content - if(homeSpan.logLevel>1) tlv8.print(); // print TLV records in form "TAG(INT) LENGTH(INT) VALUES(HEX)" + tlv8.print(2); // print TLV records in form "TAG(INT) LENGTH(INT) VALUES(HEX)" LOG2("------------ END TLVS! ------------\n"); postPairingsURL(); // process URL @@ -529,7 +529,7 @@ int HAPClient::postPairSetupURL(){ return(0); } - if(homeSpan.logLevel>1) tlv8.print(); // print decrypted TLV data + tlv8.print(2); // print decrypted TLV data LOG2("------- END DECRYPTED TLVS! -------\n"); if(!tlv8.buf(kTLVType_Identifier) || !tlv8.buf(kTLVType_PublicKey) || !tlv8.buf(kTLVType_Signature)){ @@ -609,7 +609,7 @@ int HAPClient::postPairSetupURL(){ LOG2("------- ENCRYPTING SUB-TLVS -------\n"); - if(homeSpan.logLevel>1) tlv8.print(); + tlv8.print(2); size_t subTLVLen=tlv8.pack(NULL); // get size of buffer needed to store sub-TLV uint8_t subTLV[subTLVLen]; @@ -721,7 +721,7 @@ int HAPClient::postPairVerifyURL(){ LOG2("------- ENCRYPTING SUB-TLVS -------\n"); - if(homeSpan.logLevel>1) tlv8.print(); + tlv8.print(2); size_t subTLVLen=tlv8.pack(NULL); // get size of buffer needed to store sub-TLV uint8_t subTLV[subTLVLen]; @@ -785,7 +785,7 @@ int HAPClient::postPairVerifyURL(){ return(0); } - if(homeSpan.logLevel>1) tlv8.print(); // print decrypted TLV data + tlv8.print(2); // print decrypted TLV data LOG2("------- END DECRYPTED TLVS! -------\n"); if(!tlv8.buf(kTLVType_Identifier) || !tlv8.buf(kTLVType_Signature)){ @@ -1429,7 +1429,7 @@ void HAPClient::tlvRespond(){ LOG2(client.remoteIP()); LOG2(" >>>>>>>>>>\n"); LOG2(body); - if(homeSpan.logLevel>1) tlv8.print(); + tlv8.print(2); if(!cPair){ // unverified, unencrypted session client.print(body); @@ -1531,26 +1531,35 @@ void HAPClient::sendEncrypted(char *body, uint8_t *dataBuf, int dataLen){ ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// -void HAPClient::hexPrintColumn(uint8_t *buf, int n){ +void HAPClient::hexPrintColumn(uint8_t *buf, int n, int minLogLevel){ + + if(homeSpan.logLevelLTPK,ltpk,32); slot->admin=admin; LOG2("\n*** Updated Controller: "); - if(homeSpan.logLevel>1) - charPrintRow(id,36); + charPrintRow(id,36,2); LOG2(slot->admin?" (admin)\n\n":" (regular)\n\n"); return(slot); } @@ -1599,8 +1607,7 @@ Controller *HAPClient::addController(uint8_t *id, uint8_t *ltpk, boolean admin){ memcpy(slot->LTPK,ltpk,32); slot->admin=admin; LOG2("\n*** Added Controller: "); - if(homeSpan.logLevel>1) - charPrintRow(id,36); + charPrintRow(id,36,2); LOG2(slot->admin?" (admin)\n\n":" (regular)\n\n"); return(slot); } @@ -1637,8 +1644,7 @@ void HAPClient::removeController(uint8_t *id){ if((slot=findController(id))){ // remove controller if found LOG2("\n***Removed Controller: "); - if(homeSpan.logLevel>1) - charPrintRow(id,36); + charPrintRow(id,36,2); LOG2(slot->admin?" (admin)\n":" (regular)\n"); slot->allocated=false; @@ -1660,23 +1666,26 @@ void HAPClient::removeController(uint8_t *id){ ////////////////////////////////////// -void HAPClient::printControllers(){ +void HAPClient::printControllers(int minLogLevel){ + if(homeSpan.logLevelMAX) int len(tagType tag); // returns LEN for TLV matching TAG (or 0 if TAG is found but LEN not yet set; -1 if no match at all) - void print(); // prints all defined TLVs (those with length>0). For diagnostics/debugging only + void print(int minLogLevel=0); // prints all defined TLVs (those with length>0), subject to specified minimum log level int unpack(uint8_t *tlvBuf, int nBytes); // unpacks nBytes of TLV content from single byte buffer into individual TLV records (return 1 on success, 0 if fail) int pack(uint8_t *tlvBuf); // if tlvBuf!=NULL, packs all defined TLV records (LEN>0) into a single byte buffer, spitting large TLVs into separate 255-byte chunks. Returns number of bytes (that would be) stored in buffer int pack_old(uint8_t *buf); // packs all defined TLV records (LEN>0) into a single byte buffer, spitting large TLVs into separate 255-byte records. Returns number of bytes stored in buffer @@ -192,24 +192,20 @@ uint8_t *TLV::buf(tagType tag, int len){ // TLV print() template -void TLV::print(){ - - char buf[3]; +void TLV::print(int minLogLevel){ + if(homeSpan.getLogLevel()0){ - Serial.print(tlv[i].name); - Serial.print("("); - Serial.print(tlv[i].len); - Serial.print(") "); + Serial.printf("%s(%d) ",tlv[i].name,tlv[i].len); - for(int j=0;j0 } // loop over all TLVs diff --git a/src/Utils.cpp b/src/Utils.cpp index 94dd131..7645405 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -26,6 +26,7 @@ ********************************************************************************/ #include "Utils.h" +#include "HomeSpan.h" /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // @@ -104,10 +105,10 @@ PushButton::PushButton(int pin, triggerType_t triggerType){ threshold/=calibCount; #if SOC_TOUCH_VERSION_1 threshold/=2; - Serial.printf("Touch Sensor at pin=%d used for calibration. Triggers when sensor reading < %d.\n",pin,threshold); + LOG0("Touch Sensor at pin=%d used for calibration. Triggers when sensor reading < %d.\n",pin,threshold); #elif SOC_TOUCH_VERSION_2 threshold*=2; - Serial.printf("Touch Sensor at pin=%d used for calibration. Triggers when sensor reading > %d.\n",pin,threshold); + LOG0("Touch Sensor at pin=%d used for calibration. Triggers when sensor reading > %d.\n",pin,threshold); #endif } #endif From 1c2ee2f5d23d827a7d4b6f2ed81ee256f9880bf2 Mon Sep 17 00:00:00 2001 From: frankonski Date: Thu, 11 May 2023 14:58:35 -0400 Subject: [PATCH 028/151] Update UserGuide.md - Flash patterns table --- docs/UserGuide.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 9ba9508..98168f0 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -7,6 +7,7 @@ 6. [Pairing to HomeKit](#pairing-to-homekit) 7. [Factory Reset](#factory-reset) 8. [Creating a Scannable Tag](#creating-a-scannable-tag) +9. [Status LED Flashing Reference](#status-led-flashing-reference) ## Introduction @@ -167,6 +168,20 @@ The box can be bigger or smaller as long as you keep the same proportions. For Note that if you can’t find *Scancardium* listed as a font choice in either the *Pages* or *Keynote* font dropdown boxes, select Format → Font → Show Fonts from the menu bar of the *Pages* or *Keynote* application to bring up a list of all installed fonts where you can search for, and select, *Scancardium*. +## Status LED Flashing Reference + +If a status LED has been connected and configured, HomeSpan will use flashing code to indicate different status. + +| Flash pattern | Description | +| --------------------------- | -------------------------------------------------------------------------- | +| LED off, no flashing | By default, no power, unless `setStatusAutoOff(timeout)` has been defined. | +| LED on, no flashing | All good. Device is connected to WiFi and paired. See [PAIRED](#paired). | +| 1-second flash every second | Attempting to connect to WiFi. See [CONNECTING](#connecting). | +| 1 flash every 3 seconds | No WiFi. See [NO-WIFI](#nowifi). | +| 2 flashes every 3 seconds | See [READY-TO-PAIR](#readytopair). | +| 10 flashes per second | The Control button is pressed. Once released, HomeSpan will either
- Enter [Device Configuration Mode](#device-configuration-mode).
- Exit _Device Configuration Mode_ executing the action selected based on the number of flashes.| + + --- [↩️](../README.md) Back to the Welcome page From de97faee377f61d853413b64db986a0c5e087af6 Mon Sep 17 00:00:00 2001 From: Gregg Date: Fri, 12 May 2023 21:32:21 -0500 Subject: [PATCH 029/151] Converted Serial.printf in extra classes to ESP_LOGI and ESP_LOGW Changed Serial.printf() diagnostic messages to either ESP_LOGI() or ESP_LOGW() macros in Blinker, PWM (LedPin and ServoPin), Pixel, and RFControl class --- src/src.ino | 3 +++ src/src/extras/Blinker.cpp | 2 +- src/src/extras/Blinker.h | 2 ++ src/src/extras/Pixel.h | 2 ++ src/src/extras/PwmPin.cpp | 14 ++++++++------ src/src/extras/PwmPin.h | 2 ++ src/src/extras/RFControl.cpp | 8 ++++---- src/src/extras/RFControl.h | 2 ++ src/src/extras/extras.ino | 19 +++++++++++++++++-- 9 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/src.ino b/src/src.ino index 8f9391f..03d1a50 100644 --- a/src/src.ino +++ b/src/src.ino @@ -55,6 +55,9 @@ void setup() { // homeSpan.setLogLevel(-1); homeSpan.enableOTA(); + homeSpan.setStatusPin(13); + homeSpan.setStatusAutoOff(20); + homeSpan.begin(Category::Lighting,"HomeSpan LED"); new SpanAccessory(); diff --git a/src/src/extras/Blinker.cpp b/src/src/extras/Blinker.cpp index 1bf30d4..ea5cbbe 100644 --- a/src/src/extras/Blinker.cpp +++ b/src/src/extras/Blinker.cpp @@ -134,7 +134,7 @@ void Blinker::check(){ if(pauseDuration==0 || isPaused || (millis()-pauseTime) #include +[[maybe_unused]] static const char* BLINKER_TAG = "Blinker"; + //////////////////////////////// // Blinkable Interface // //////////////////////////////// diff --git a/src/src/extras/Pixel.h b/src/src/extras/Pixel.h index 6cf4945..929b8a6 100644 --- a/src/src/extras/Pixel.h +++ b/src/src/extras/Pixel.h @@ -35,6 +35,8 @@ #include "PwmPin.h" #include "Blinker.h" +[[maybe_unused]] static const char* PIXEL_TAG = "Pixel"; + //////////////////////////////////////////// // Single-Wire RGB/RGBW NeoPixels // //////////////////////////////////////////// diff --git a/src/src/extras/PwmPin.cpp b/src/src/extras/PwmPin.cpp index d39b704..ca15e24 100644 --- a/src/src/extras/PwmPin.cpp +++ b/src/src/extras/PwmPin.cpp @@ -52,7 +52,7 @@ LedC::LedC(uint8_t pin, uint16_t freq, boolean invert){ timerList[nTimer][nMode]->duty_resolution=(ledc_timer_bit_t)res; if(ledc_timer_config(timerList[nTimer][nMode])!=0){ - Serial.printf("\n*** ERROR: Frequency=%d Hz is out of allowed range ---",freq); + ESP_LOGW(PWM_TAG,"Frequency=%d Hz is out of allowed range ---",freq); delete timerList[nTimer][nMode]; timerList[nTimer][nMode]=NULL; return; @@ -82,10 +82,12 @@ LedC::LedC(uint8_t pin, uint16_t freq, boolean invert){ LedPin::LedPin(uint8_t pin, float level, uint16_t freq, boolean invert) : LedC(pin, freq, invert){ - if(!channel) - Serial.printf("\n*** ERROR: Can't create LedPin(%d) - no open PWM channels and/or Timers ***\n\n",pin); + if(!channel){ + ESP_LOGW(PWM_TAG,"Can't create LedPin(%d) - no open PWM channels and/or Timers",pin); + return; + } else - Serial.printf("LedPin=%d: mode=%d, channel=%d, timer=%d, freq=%d Hz, resolution=%d bits %s\n", + ESP_LOGI(PWM_TAG,"LedPin=%d: mode=%d, channel=%d, timer=%d, freq=%d Hz, resolution=%d bits %s", channel->gpio_num, channel->speed_mode, channel->channel, @@ -222,9 +224,9 @@ void LedPin::HSVtoRGB(float h, float s, float v, float *r, float *g, float *b ){ ServoPin::ServoPin(uint8_t pin, double initDegrees, uint16_t minMicros, uint16_t maxMicros, double minDegrees, double maxDegrees) : LedC(pin, 50){ if(!channel) - Serial.printf("\n*** ERROR: Can't create ServoPin(%d) - no open PWM channels and/or Timers ***\n\n",pin); + ESP_LOGW(PWM_TAG,"Can't create ServoPin(%d) - no open PWM channels and/or Timers",pin); else - Serial.printf("ServoPin=%d: mode=%d channel=%d, timer=%d, freq=%d Hz, resolution=%d bits\n", + ESP_LOGI(PWM_TAG,"ServoPin=%d: mode=%d channel=%d, timer=%d, freq=%d Hz, resolution=%d bits", channel->gpio_num, channel->speed_mode, channel->channel, diff --git a/src/src/extras/PwmPin.h b/src/src/extras/PwmPin.h index fe5dae5..6528257 100644 --- a/src/src/extras/PwmPin.h +++ b/src/src/extras/PwmPin.h @@ -46,6 +46,8 @@ #include #include "Blinker.h" +[[maybe_unused]] static const char* PWM_TAG = "PwmPin"; + #define DEFAULT_PWM_FREQ 5000 ///////////////////////////////////// diff --git a/src/src/extras/RFControl.cpp b/src/src/extras/RFControl.cpp index f00d4b5..3a50402 100644 --- a/src/src/extras/RFControl.cpp +++ b/src/src/extras/RFControl.cpp @@ -36,7 +36,7 @@ RFControl::RFControl(uint8_t pin, boolean refClock, boolean installDriver){ #else if(nChannels==RMT_CHANNEL_MAX){ #endif - Serial.printf("\n*** ERROR: Can't create RFControl(%d) - no open channels ***\n\n",pin); + ESP_LOGW(RFControl_TAG,"Can't create RFControl(%d) - no open channels",pin); return; } @@ -139,17 +139,17 @@ void RFControl::enableCarrier(uint32_t freq, float duty){ uint32_t lowTime=period*(1.0-duty)+0.5; if(highTime>0xFFFF || lowTime>0xFFFF){ - Serial.printf("\n*** ERROR: Can't enable carrier frequency=%d Hz for RF Control pin=%d, duty=%0.2f. Frequency is too low!\n\n",freq,config->gpio_num,duty); + ESP_LOGW(RFControl_TAG,"Can't enable carrier frequency=%d Hz for RF Control pin=%d, duty=%0.2f. Frequency is too low!",freq,config->gpio_num,duty); return; } if(highTime==0){ - Serial.printf("\n*** ERROR: Can't enable carrier frequency=%d Hz for RF Control pin=%d, duty=%0.2f. Duty is too low or frequency is too high!\n\n",freq,config->gpio_num,duty); + ESP_LOGW(RFControl_TAG,"Can't enable carrier frequency=%d Hz for RF Control pin=%d, duty=%0.2f. Duty is too low or frequency is too high!",freq,config->gpio_num,duty); return; } if(lowTime==0){ - Serial.printf("\n*** ERROR: Can't enable carrier frequency=%d Hz for RF Control pin=%d, duty=%0.2f. Duty is too high or frequency is too high!\n\n",freq,config->gpio_num,duty); + ESP_LOGW(RFControl_TAG,"Can't enable carrier frequency=%d Hz for RF Control pin=%d, duty=%0.2f. Duty is too high or frequency is too high!",freq,config->gpio_num,duty); return; } diff --git a/src/src/extras/RFControl.h b/src/src/extras/RFControl.h index 47e5d45..7def768 100644 --- a/src/src/extras/RFControl.h +++ b/src/src/extras/RFControl.h @@ -36,6 +36,8 @@ #include "driver/rmt.h" #include +[[maybe_unused]] static const char* RFControl_TAG = "RFControl"; + using std::vector; class RFControl { diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index 072d8d9..090ae0b 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -38,9 +38,24 @@ void setup() { Serial.println("\n\nHomeSpan LED Fade Test\n"); - LedPin red(33,0); - LedPin green(32,0); + LedPin red(14,0); + LedPin green(14,0); LedPin blue(14,0); + LedPin blue2(14,0,1000); + LedPin blue3(14,0,2000); + LedPin blue4(14,0,3000); + LedPin blue5(14,0,60000); + LedPin blue6(14,0,5000); + LedPin blue7(14,0,6000); + LedPin blue8(14,0,7000); + LedPin blue9(14,0,8000); + LedPin blue10(14,0,8000); + LedPin blue11(14,0,8000); + LedPin blue12(14,0,8000); + LedPin blue13(14,0,8000); + LedPin blue14(14,0,5000); + LedPin blue15(14,0,5000); + LedPin blue16(14,0,15000); int redLevel=0; From 22defc10a1e2b342ae1f76eb02c7d08dc9d19e48 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Fri, 12 May 2023 21:42:35 -0500 Subject: [PATCH 030/151] Update PWM.md --- docs/PWM.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/PWM.md b/docs/PWM.md index dbd67dc..c0a647b 100644 --- a/docs/PWM.md +++ b/docs/PWM.md @@ -92,7 +92,9 @@ The following PWM resources are available: HomeSpan *automatically* allocates Channels and Timers to LedPin and ServoPin objects as they are instantiated. Every pin assigned consumes a single Channel; every *unique* frequency specified among all channels (within the same set, for the ESP32) consumes a single Timer. HomeSpan will conserve resources by re-using the same Timer for all Channels operating at the same frequency. *HomeSpan also automatically configures each Timer to support the maximum duty-resolution possible for the frequency specified.* -HomeSpan will report a non-fatal error message to the Arduino Serial Monitor when insufficient Channel or Timer resources prevent the creation of a new LedPin or ServoPin object. Calls to the `set()` method for objects that failed to be properly created are silently ignored. +#### Diagnostic Messages + +The **LedPin** and **ServoPin** classes output *Information \[I\]* and *Warning \[W\]* messages to the Serial Monitor based on the *Core Debug Level* selected when compiling the sketch using the Arduino IDE. A non-fatal warning message is produced when insufficient Channel or Timer resources prevent the creation of a new LedPin or ServoPin object. Calls to the `set()` method for objects that failed to be properly created are silently ignored. --- From 33a79cf51b48201b9dc509cb02f7f4d8c780230b Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Fri, 12 May 2023 21:48:33 -0500 Subject: [PATCH 031/151] Update RMT.md --- docs/RMT.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/RMT.md b/docs/RMT.md index f75cf09..00ecc0f 100644 --- a/docs/RMT.md +++ b/docs/RMT.md @@ -81,6 +81,9 @@ rf.start(4,1000); // start transmission of the pulse train; repeat for 4 cycles uint32_t pulseTrain[] = {RF_PULSE(100,50), RF_PULSE(100,50), RF_PULSE(25,500)}; // create the same pulse train in an external array rf.start(pulseTrain,3,4,1000); // start transmission using the same parameters ``` +#### Diagnostic Messages + +The **RFControl** class outputs *Warning \[W\]* messages to the Serial Monitor based on the *Core Debug Level* selected when compiling the sketch using the Arduino IDE. A non-fatal warning message is produced when insufficient Channel resources prevent the creation of a new RFControl object. Calls to the `start()` method for objects that failed to be properly created are silently ignored. ## Example RFControl Sketch From 40bb97215f73153a5e5fb97ede0e4316d0759ff5 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 13 May 2023 10:34:21 -0500 Subject: [PATCH 032/151] Added homeSpan methods setSerialInputDisable() and getSerialInputDisable() Provides ability to disable HomeSpan from reading from Serial port (which is otherwise normally enabled) --- src/HomeSpan.cpp | 12 +++++++----- src/HomeSpan.h | 3 +++ src/Utils.cpp | 6 ++++++ src/src.ino | 1 + 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index ce3b823..3b1ada5 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -206,7 +206,7 @@ void Span::pollTask() { char cBuf[65]="?"; - if(Serial.available()){ + if(!serialInputDisabled && Serial.available()){ readSerial(cBuf,64); processSerialCommand(cBuf); } @@ -708,6 +708,9 @@ void Span::processSerialCommand(const char *c){ case 'W': { + if(serialInputDisabled || logLevel<0) // do not proceed if serial input/output is not fully enabled + return; + if(strlen(network.wifiData.ssid)>0){ LOG0("*** Stopping all current WiFi services...\n\n"); hapServer->end(); @@ -817,14 +820,13 @@ void Span::processSerialCommand(const char *c){ int level=0; sscanf(c+1,"%d",&level); - if(level<0) - level=0; + if(level<-1) + level=-1; if(level>2) level=2; - LOG0("\n*** Log Level set to %d\n\n",level); - delay(1000); setLogLevel(level); + LOG0("\n*** Log Level set to %d\n\n",level); } break; diff --git a/src/HomeSpan.h b/src/HomeSpan.h index ff99ca3..5a22b59 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -216,6 +216,7 @@ class Span{ char pairingCodeCommand[12]=""; // user-specified Pairing Code - only needed if Pairing Setup Code is specified in sketch using setPairingCode() String lastClientIP="0.0.0.0"; // IP address of last client accessing device through encrypted channel boolean newCode; // flag indicating new application code has been loaded (based on keeping track of app SHA256) + boolean serialInputDisabled=false; // flag indiating that serial input is disabled int connected=0; // WiFi connection status (increments upon each connect and disconnect) unsigned long waitTime=60000; // time to wait (in milliseconds) between WiFi connection attempts @@ -309,6 +310,8 @@ class Span{ void setCommandTimeout(uint16_t nSec){comModeLife=nSec*1000;} // sets Command Mode Timeout (seconds) void setLogLevel(int level){logLevel=level;} // sets Log Level for log messages (0=baseline, 1=intermediate, 2=all, -1=disable all serial input/output) int getLogLevel(){return(logLevel);} // get Log Level + void setSerialInputDisable(boolean val){serialInputDisabled=val;} // sets whether serial input is disabled (true) or enabled (false) + boolean getSerialInputDisable(){return(serialInputDisabled);} // returns true if serial input is disabled, or false if serial input in enabled void reserveSocketConnections(uint8_t n){maxConnections-=n;} // reserves n socket connections *not* to be used for HAP void setHostNameSuffix(const char *suffix){hostNameSuffix=suffix;} // sets the hostName suffix to be used instead of the 6-byte AccessoryID void setPortNum(uint16_t port){tcpPortNum=port;} // sets the TCP port number to use for communications between HomeKit and HomeSpan diff --git a/src/Utils.cpp b/src/Utils.cpp index 7645405..7af158e 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -40,6 +40,12 @@ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// char *Utils::readSerial(char *c, int max){ + + if(homeSpan.getSerialInputDisable()){ + c[0]='\0'; + return(c); + } + int i=0; char buf; diff --git a/src/src.ino b/src/src.ino index 03d1a50..10995ba 100644 --- a/src/src.ino +++ b/src/src.ino @@ -53,6 +53,7 @@ void setup() { Serial.begin(115200); // homeSpan.setLogLevel(-1); + homeSpan.setSerialInputDisable(true); homeSpan.enableOTA(); homeSpan.setStatusPin(13); From d33bbf24775db2b93981dd37632b2f5acebc44bc Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 13 May 2023 10:36:17 -0500 Subject: [PATCH 033/151] Update src.ino --- src/src.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src.ino b/src/src.ino index 10995ba..e0f2c4f 100644 --- a/src/src.ino +++ b/src/src.ino @@ -53,7 +53,7 @@ void setup() { Serial.begin(115200); // homeSpan.setLogLevel(-1); - homeSpan.setSerialInputDisable(true); +// homeSpan.setSerialInputDisable(true); homeSpan.enableOTA(); homeSpan.setStatusPin(13); From 6bc448897612215634bd1ed1a2f94169b7c42ecb Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 13 May 2023 15:11:20 -0500 Subject: [PATCH 034/151] Update Logging.md --- docs/Logging.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/Logging.md b/docs/Logging.md index ba7c99b..16891b6 100644 --- a/docs/Logging.md +++ b/docs/Logging.md @@ -14,6 +14,8 @@ HomeSpan log messages are typically output directly to the Arduino Serial Monito You can set the *Log Level* in your sketch using the method `homeSpan.setLogLevel(uint8_t level)` as described in the [HomeSpan API Reference](API.md). Level 0 messages are always output; Level 1 messages are only output if the *Log Level* is set to 1 or greater; and Level 2 messages are only output if the *Log Level* is set to to 2. The *Log Level* can also be changed dynamically via the Serial Monitor at any time by typing either the 'L0', 'L1', or 'L2' as described in the [HomeSpan CLI](CLI.md). +You can also completely disable all Serial output messages generated by HomeSpan by setting the *Log Level* to -1, either by typing 'L-1' into the HomeSpan CLI or by calling `homeSpan.setLogLevel(-1)` in your sketch. Disabling all Serial output may be useful in cases where a separate Serial peripheral is being controlled by the ESP32. In such cases you may want to implement a physical switch on your device that automatically sets the Log Level to 0 or -1 so you don't have to recompile your sketch every time you want to enable/disable HomeSpan Log Messages. + ## User-Defined Log Messages You can add your own log messages to any sketch using HomeSpan's **LOG0()**, **LOG1()**, and **LOG2()** macros. Messages created with these macros will be output to the Arduino Serial Monitor according the *Log Level* setting described above. Each **LOGn()** macro (where n=\[0,2\]) is available in two flavors depending on the number of arguments specified: From 8db6ebe3215a0657da4deb0fd3a76612e75c631a Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 13 May 2023 15:24:44 -0500 Subject: [PATCH 035/151] Update Reference.md --- docs/Reference.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/Reference.md b/docs/Reference.md index cbd0677..87f454e 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -71,11 +71,12 @@ The following **optional** `homeSpan` methods override various HomeSpan initiali * `void setCommandTimeout(uint16_t nSec)` * sets the duration (in seconds) that the HomeSpan End-User Command Mode, once activated, stays alive before timing out (default=120 seconds) -* `void setLogLevel(uint8_t level)` +* `void setLogLevel(int level)` * sets the logging level for diagnostic messages, where: * 0 = top-level HomeSpan status messages, and any messages output by the user using `Serial.print()` or `Serial.printf()` (default) * 1 = all HomeSpan status messages, and any `LOG1()` messages specified in the sketch by the user * 2 = all HomeSpan status messages plus all HAP communication packets to and from the HomeSpan device, as well as all `LOG1()` and `LOG2()` messages specified in the sketch by the user + * -1 = supresses ALL HomeSpan messages, freeing up the Serial port for other uses * note the log level can also be changed at runtime with the 'L' command via the [HomeSpan CLI](CLI.md) * see [Message Logging](Logging.md) for complete details From bf82209a7b7164806c7e28b9a5a3537101c8a0cb Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 13 May 2023 15:38:39 -0500 Subject: [PATCH 036/151] Update Reference.md --- docs/Reference.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/Reference.md b/docs/Reference.md index 87f454e..d4c76e6 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -205,6 +205,15 @@ The following **optional** `homeSpan` methods enable additional features and pro * example: `homeSpan.processSerialCommand("A");` starts the HomeSpan Setup Access Point * example: `homeSpan.processSerialCommand("Q HUB3");` changes the HomeKit Setup ID for QR Codes to "HUB3" +* `void setSerialInputDisable(boolean val)` + * if *val* is true, disables HomeSpan from reading input from the Serial port + * if *val* is false, re-enables HomeSpan reading input from the Serial port + * useful when the main USB Serial port is needed for reading data from an external Serial peripheral, rather than being used to read input from the Arduino Serial Monitor + + * `boolean getSerialInputDisable()` + * returns *true* if HomeSpan reading from the Serial port is currently disabled + * returns *false* if HomeSpan is operating normally and will read any CLI commands input into the Arduino Serial Monitor + --- The following **optional** `homeSpan` methods provide additional run-time functionality for more advanced use cases: From 21da828f83c296e5c275231edcfeaba591e08a5d Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 13 May 2023 15:39:01 -0500 Subject: [PATCH 037/151] Update HomeSpan.cpp --- src/HomeSpan.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index 3b1ada5..1861c4e 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -2157,8 +2157,8 @@ void SpanWebLog::vLog(boolean sysMsg, const char *fmt, va_list ap){ if(sysMsg) LOG0("%s\n",buf); - else if(homeSpan.logLevel>0) - LOG0("WEBLOG: %s\n",buf); + else + LOG1("WEBLOG: %s\n",buf); if(maxEntries>0){ int index=nEntries%maxEntries; From f5eb95e4365c7a9b2ef414d8a2a205b69cd61821 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 15 May 2023 06:04:48 -0500 Subject: [PATCH 038/151] Update Reference.md --- docs/Reference.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/Reference.md b/docs/Reference.md index d4c76e6..13f2f77 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -73,10 +73,12 @@ The following **optional** `homeSpan` methods override various HomeSpan initiali * `void setLogLevel(int level)` * sets the logging level for diagnostic messages, where: - * 0 = top-level HomeSpan status messages, and any messages output by the user using `Serial.print()` or `Serial.printf()` (default) + * 0 = top-level HomeSpan status messages, and any `LOG0()` messages specified in the sketch by the user (default) * 1 = all HomeSpan status messages, and any `LOG1()` messages specified in the sketch by the user * 2 = all HomeSpan status messages plus all HAP communication packets to and from the HomeSpan device, as well as all `LOG1()` and `LOG2()` messages specified in the sketch by the user - * -1 = supresses ALL HomeSpan messages, freeing up the Serial port for other uses + * -1 = supresses ALL HomeSpan status messages, including all `LOG0()`, `LOG1()`, and `LOG2()` messages specified in the sketch by the user, freeing up the Serial port for other uses + * the log level setting has no impact on any `Serial.print()` or `Serial.printf()` statements that may be used in a sketch. Use one of the `LOG()` macros instead of `Serial.print()` or `Serial.printf()` if you want to control the output by setting the HomeSpan log level + * the log level setting has no impact on any ESP32 diagnostic messages output by the ESP32 operating system itself. To suppress these mesaages make sure to compile your sketch with the *Core Debug Level* set to "None" in the Tools menu of the Arduino IDE * note the log level can also be changed at runtime with the 'L' command via the [HomeSpan CLI](CLI.md) * see [Message Logging](Logging.md) for complete details From d24eadb207c9d9c7656d21a9d3a516158c400c18 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 15 May 2023 06:14:04 -0500 Subject: [PATCH 039/151] Update Logging.md --- docs/Logging.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/Logging.md b/docs/Logging.md index 16891b6..66d09f0 100644 --- a/docs/Logging.md +++ b/docs/Logging.md @@ -14,7 +14,9 @@ HomeSpan log messages are typically output directly to the Arduino Serial Monito You can set the *Log Level* in your sketch using the method `homeSpan.setLogLevel(uint8_t level)` as described in the [HomeSpan API Reference](API.md). Level 0 messages are always output; Level 1 messages are only output if the *Log Level* is set to 1 or greater; and Level 2 messages are only output if the *Log Level* is set to to 2. The *Log Level* can also be changed dynamically via the Serial Monitor at any time by typing either the 'L0', 'L1', or 'L2' as described in the [HomeSpan CLI](CLI.md). -You can also completely disable all Serial output messages generated by HomeSpan by setting the *Log Level* to -1, either by typing 'L-1' into the HomeSpan CLI or by calling `homeSpan.setLogLevel(-1)` in your sketch. Disabling all Serial output may be useful in cases where a separate Serial peripheral is being controlled by the ESP32. In such cases you may want to implement a physical switch on your device that automatically sets the Log Level to 0 or -1 so you don't have to recompile your sketch every time you want to enable/disable HomeSpan Log Messages. +You can also completely suppress all Log messages generated by HomeSpan (as well as all user-defined Log messages - see below) by setting the *Log Level* to -1, either by typing 'L-1' into the HomeSpan CLI or by calling `homeSpan.setLogLevel(-1)` in your sketch. Disabling all Log messages from being output to the Serial Monitor may be useful in cases where a separate Serial peripheral is being controlled by the ESP32. In such cases you may want to implement a physical switch on your device that automatically sets the Log Level to 0 or -1 so you don't have to recompile your sketch every time you want to enable/disable HomeSpan Log Messages. + +Note that the *Log Level* setting has no impact on messages output by any `Serial.print()` or `Serial.printf()` statements used in a sketch. To ensure you can control such messages via the *Log Level* setting, use the `LOG()` macros below. Also note that the *Log Level* setting has no impact on any ESP32 diagnostic messages produced by the ESP32 operating system itself. These messages are controlled according to the *Core Debug Level* specified at compile time under the Tools menu of the Arduino IDE. ## User-Defined Log Messages From 08e66e56765dab94a12298873b810e26d120987e Mon Sep 17 00:00:00 2001 From: Francois Date: Mon, 15 May 2023 13:14:58 -0400 Subject: [PATCH 040/151] Update UserGuide.md - Fixed anchor --- docs/UserGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 98168f0..4e2aa38 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -3,7 +3,7 @@ 2. [Getting Started](#getting-started) 3. [HomeSpan Device States](#homespan-device-states) 4. [Device Configuration Mode](#device-configuration-mode) -5. [Setting HomeSpan WiFi Credentials and Setup Code](#setting-homespan-wifi-credentials-and-setup-code) +5. [Setting HomeSpan’s WiFi Credentials and Setup Code](#setting-homespans-wifi-credentials-and-setup-code) 6. [Pairing to HomeKit](#pairing-to-homekit) 7. [Factory Reset](#factory-reset) 8. [Creating a Scannable Tag](#creating-a-scannable-tag) @@ -94,7 +94,7 @@ To execute the selected Action press and hold the Control Button for 3 seconds, If no Action has been executed within 120 seconds (2 minutes) of starting the Device Configuration Mode, Action 1 is automatically executed and the Device Configuration Mode is exited. -## Setting HomeSpan WiFi Credentials and Setup Code +## Setting HomeSpan’s WiFi Credentials and Setup Code To configure a HomeSpace device to connect to your home WiFi network you must first connect your iPhone directly to the device so you can input your WiFi Credentials. This connection is made via a temporary WiFi network HomeSpan launches just for this purpose. From d7aca25ac94842bb03f4ad6cbec7c21afbd8c672 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 21 May 2023 12:36:15 -0500 Subject: [PATCH 041/151] Create StepperMotorControl.ino --- .../StepperMotorControl.ino | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 examples/Other Examples/StepperMotorControl/StepperMotorControl.ino diff --git a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino new file mode 100644 index 0000000..efa2233 --- /dev/null +++ b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino @@ -0,0 +1,104 @@ +/********************************************************************************* + * MIT License + * + * Copyright (c) 2023 Gregg E. Berman + * + * https://github.com/HomeSpan/HomeSpan + * + * 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. + * + ********************************************************************************/ + +// This example demonstrates how to control a real-world Stepper Motor using HomeSpan's +// SpanStep Class. This class is found in a SEPARATE standalone library called HomeStep. +// To invoke, you include the name of the specific stepper motor controller to be used. +// You can include more than one type if needed. + +// This sketch is based on the WindowShade Accessory from Example 13. Please review +// that Example first if new to HomeSpan since it is fully commented. + +#include "HomeSpan.h" +#include "Stepper_TB6612.h" // include stepper motor control for a TB6612 driver chip + +//////////////////////////////////// + +struct DEV_WindowShade : Service::WindowCovering { + + SpanCharacteristic *current; + SpanCharacteristic *target; + + Stepper_TB6612 *motor; // create pointer to TB6612 motor controller + + DEV_WindowShade(int a1, int a2, int b1, int b2) : Service::WindowCovering(){ + + current=new Characteristic::CurrentPosition(0); + target=new Characteristic::TargetPosition(0); + + motor=new Stepper_TB6612(a1, a2, b1, b2); // instantiate motor using pins specified in set-up below + motor->setAccel(10,20); // set acceleration parameters + + LOG0("Configuring Motorized Window Shade with input pins: A1=%d, A2=%d, B1=%d, B2=%d\n",a1,a2,b1,b2); + } + + /////////// + + boolean update(){ + + // Move motor to absolute position, assuming 200 steps per revolution and 20 revolutions for full up/travel travel. + // Specify that motor should BRAKE upon moving to desired position. + + motor->moveTo(target->getNewVal()*20,5,SpanStep::BRAKE); + LOG1("Setting Shade Position=%d\n",target->getNewVal()); + return(true); + } + + /////////// + + void loop(){ + + // Check to see if target value does not equal current value. If not, AND motor has no more steps to move, update current value + + if(current->getVal()!=target->getVal() && !motor->stepsRemaining()){ + current->setVal(target->getVal()); + LOG1("Motor Stopped at Shade Position=%d\n",current->getVal()); + } + } + +}; + +//////////////////////////////////// + +void setup() { + + Serial.begin(115200); + + homeSpan.begin(Category::WindowCoverings,"Motorized Shade"); + + new SpanAccessory(); + new Service::AccessoryInformation(); + new Characteristic::Identify(); + new DEV_WindowShade(23,32,22,14); // The TB6612 driver requires 4 digital pins: AIN1, AIN2, BIN1, and BIN2. Change these pin numbers to match YOUR board! +} + +////////////////////////////////////// + +void loop(){ + + homeSpan.poll(); +} From 5e1d65f43681718d6bf3c5b3c2953c4126e00c8c Mon Sep 17 00:00:00 2001 From: Gregg Date: Tue, 30 May 2023 05:05:51 -0500 Subject: [PATCH 042/151] Renamed SpanStep to StepperControl and moved into HoneSpan Extras Also updated StepperMotorControl Example. --- .../StepperMotorControl.ino | 6 +- .../StepperMotorControl/Stepper_TB6612.h | 115 +++++++++ src/extras/StepperControl.h | 30 +++ src/src/extras/PwmPin.cpp | 6 +- src/src/extras/RFControl.cpp | 8 +- src/src/extras/StepperControl.cpp | 171 +++++++++++++ src/src/extras/StepperControl.h | 96 +++++++ src/src/extras/extras.ino | 235 +++++++++++++++--- 8 files changed, 616 insertions(+), 51 deletions(-) create mode 100644 examples/Other Examples/StepperMotorControl/Stepper_TB6612.h create mode 100644 src/extras/StepperControl.h create mode 100644 src/src/extras/StepperControl.cpp create mode 100644 src/src/extras/StepperControl.h diff --git a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino index efa2233..4f190e6 100644 --- a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino +++ b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino @@ -33,8 +33,8 @@ // This sketch is based on the WindowShade Accessory from Example 13. Please review // that Example first if new to HomeSpan since it is fully commented. -#include "HomeSpan.h" -#include "Stepper_TB6612.h" // include stepper motor control for a TB6612 driver chip +#include "HomeSpan.h" +#include "Stepper_TB6612.h" //////////////////////////////////// @@ -63,7 +63,7 @@ struct DEV_WindowShade : Service::WindowCovering { // Move motor to absolute position, assuming 200 steps per revolution and 20 revolutions for full up/travel travel. // Specify that motor should BRAKE upon moving to desired position. - motor->moveTo(target->getNewVal()*20,5,SpanStep::BRAKE); + motor->moveTo(target->getNewVal()*20,5,Stepper_TB6612::BRAKE); LOG1("Setting Shade Position=%d\n",target->getNewVal()); return(true); } diff --git a/examples/Other Examples/StepperMotorControl/Stepper_TB6612.h b/examples/Other Examples/StepperMotorControl/Stepper_TB6612.h new file mode 100644 index 0000000..25f097c --- /dev/null +++ b/examples/Other Examples/StepperMotorControl/Stepper_TB6612.h @@ -0,0 +1,115 @@ +/********************************************************************************* + * MIT License + * + * Copyright (c) 2023 Gregg E. Berman + * + * https://github.com/HomeSpan/HomeSpan + * + * 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. + * + ********************************************************************************/ + + #include "extras/StepperControl.h" + +////////////////////////// + +struct Stepper_TB6612 : StepperControl { + + int pins[4]; + uint8_t phase; + uint8_t nPhases; + uint32_t runCode; + +////////////////////////// + + Stepper_TB6612(int a1Pin, int a2Pin, int b1Pin, int b2Pin) : StepperControl(){ + pins[3]=a1Pin; + pins[2]=a2Pin; + pins[1]=b1Pin; + pins[0]=b2Pin; + + for(int i=0;i<4;i++) + pinMode(pins[i],OUTPUT); + + setStepType(FULL_STEP_TWO_PHASE); + } + +////////////////////////// + + void onEnable() override { + setPinCode((runCode>>(phase*4)) & 0xF); + } + +////////////////////////// + + void onDisable() override { + setPinCode(0); + } + +////////////////////////// + + void onBrake() override { + setPinCode(0xF); + } + +////////////////////////// + + void onStep(boolean direction){ + if(direction) + phase=(phase+1)%nPhases; + else + phase=(phase+nPhases-1)%nPhases; + + setPinCode((runCode>>(phase*4)) & 0xF); + } + +////////////////////////// + + void setPinCode(uint8_t pinCode){ + for(int i=0;i<4;i++) + digitalWrite(pins[i],(pinCode>>i)&1); + } + +////////////////////////// + + void setStepType(int mode) override { + switch(mode){ + case FULL_STEP_ONE_PHASE: + phase=0; + nPhases=4; + runCode=0x2418; + break; + case FULL_STEP_TWO_PHASE: + phase=0; + nPhases=4; + runCode=0x659A; + break; + case HALF_STEP: + phase=0; + nPhases=8; + runCode=0x2645198A; + break; + default: + ESP_LOGE(TAG,"Unknown StepType=%d. Stepper Unchanged",mode); + } + } + +}; + +////////////////////////// diff --git a/src/extras/StepperControl.h b/src/extras/StepperControl.h new file mode 100644 index 0000000..0e685ca --- /dev/null +++ b/src/extras/StepperControl.h @@ -0,0 +1,30 @@ +/********************************************************************************* + * MIT License + * + * Copyright (c) 2020-2023 Gregg E. Berman + * + * https://github.com/HomeSpan/HomeSpan + * + * 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. + * + ********************************************************************************/ + +#pragma once + +#include "../src/extras/StepperControl.h" diff --git a/src/src/extras/PwmPin.cpp b/src/src/extras/PwmPin.cpp index ca15e24..d3eaf96 100644 --- a/src/src/extras/PwmPin.cpp +++ b/src/src/extras/PwmPin.cpp @@ -52,7 +52,7 @@ LedC::LedC(uint8_t pin, uint16_t freq, boolean invert){ timerList[nTimer][nMode]->duty_resolution=(ledc_timer_bit_t)res; if(ledc_timer_config(timerList[nTimer][nMode])!=0){ - ESP_LOGW(PWM_TAG,"Frequency=%d Hz is out of allowed range ---",freq); + ESP_LOGE(PWM_TAG,"Frequency=%d Hz is out of allowed range ---",freq); delete timerList[nTimer][nMode]; timerList[nTimer][nMode]=NULL; return; @@ -83,7 +83,7 @@ LedC::LedC(uint8_t pin, uint16_t freq, boolean invert){ LedPin::LedPin(uint8_t pin, float level, uint16_t freq, boolean invert) : LedC(pin, freq, invert){ if(!channel){ - ESP_LOGW(PWM_TAG,"Can't create LedPin(%d) - no open PWM channels and/or Timers",pin); + ESP_LOGE(PWM_TAG,"Can't create LedPin(%d) - no open PWM channels and/or Timers",pin); return; } else @@ -224,7 +224,7 @@ void LedPin::HSVtoRGB(float h, float s, float v, float *r, float *g, float *b ){ ServoPin::ServoPin(uint8_t pin, double initDegrees, uint16_t minMicros, uint16_t maxMicros, double minDegrees, double maxDegrees) : LedC(pin, 50){ if(!channel) - ESP_LOGW(PWM_TAG,"Can't create ServoPin(%d) - no open PWM channels and/or Timers",pin); + ESP_LOGE(PWM_TAG,"Can't create ServoPin(%d) - no open PWM channels and/or Timers",pin); else ESP_LOGI(PWM_TAG,"ServoPin=%d: mode=%d channel=%d, timer=%d, freq=%d Hz, resolution=%d bits", channel->gpio_num, diff --git a/src/src/extras/RFControl.cpp b/src/src/extras/RFControl.cpp index 3a50402..4fe8951 100644 --- a/src/src/extras/RFControl.cpp +++ b/src/src/extras/RFControl.cpp @@ -36,7 +36,7 @@ RFControl::RFControl(uint8_t pin, boolean refClock, boolean installDriver){ #else if(nChannels==RMT_CHANNEL_MAX){ #endif - ESP_LOGW(RFControl_TAG,"Can't create RFControl(%d) - no open channels",pin); + ESP_LOGE(RFControl_TAG,"Can't create RFControl(%d) - no open channels",pin); return; } @@ -139,17 +139,17 @@ void RFControl::enableCarrier(uint32_t freq, float duty){ uint32_t lowTime=period*(1.0-duty)+0.5; if(highTime>0xFFFF || lowTime>0xFFFF){ - ESP_LOGW(RFControl_TAG,"Can't enable carrier frequency=%d Hz for RF Control pin=%d, duty=%0.2f. Frequency is too low!",freq,config->gpio_num,duty); + ESP_LOGE(RFControl_TAG,"Can't enable carrier frequency=%d Hz for RF Control pin=%d, duty=%0.2f. Frequency is too low!",freq,config->gpio_num,duty); return; } if(highTime==0){ - ESP_LOGW(RFControl_TAG,"Can't enable carrier frequency=%d Hz for RF Control pin=%d, duty=%0.2f. Duty is too low or frequency is too high!",freq,config->gpio_num,duty); + ESP_LOGE(RFControl_TAG,"Can't enable carrier frequency=%d Hz for RF Control pin=%d, duty=%0.2f. Duty is too low or frequency is too high!",freq,config->gpio_num,duty); return; } if(lowTime==0){ - ESP_LOGW(RFControl_TAG,"Can't enable carrier frequency=%d Hz for RF Control pin=%d, duty=%0.2f. Duty is too high or frequency is too high!",freq,config->gpio_num,duty); + ESP_LOGE(RFControl_TAG,"Can't enable carrier frequency=%d Hz for RF Control pin=%d, duty=%0.2f. Duty is too high or frequency is too high!",freq,config->gpio_num,duty); return; } diff --git a/src/src/extras/StepperControl.cpp b/src/src/extras/StepperControl.cpp new file mode 100644 index 0000000..a6e3224 --- /dev/null +++ b/src/src/extras/StepperControl.cpp @@ -0,0 +1,171 @@ +/********************************************************************************* + * MIT License + * + * Copyright (c) 2023 Gregg E. Berman + * + * https://github.com/HomeSpan/HomeStep + * + * 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. + * + ********************************************************************************/ + + #include "StepperControl.h" + +////////////////////////// + +StepperControl::StepperControl(uint32_t priority, uint32_t cpu){ + + upLinkQueue = xQueueCreate(1,sizeof(upLink_t)); + downLinkQueue = xQueueCreate(1,sizeof(downLink_t)); + xTaskCreateUniversal(motorTask, "motorTaskHandle", 8096, this, priority, &motorTaskHandle, cpu); +} + +////////////////////////// + +void StepperControl::setAccel(float accelSize, float accelSteps){ + if(accelSize<0.0){ + ESP_LOGE(TAG,"accelSize cannot be less than 0.0"); + return; + } + + if(accelSteps<1.0){ + ESP_LOGE(TAG,"accelSteps cannot be less than 1.0"); + return; + } + + this->accelSize=accelSize; + this->accelSteps=accelSteps; +} + +////////////////////////// + +void StepperControl::move(int nSteps, uint32_t msDelay, endAction_t endAction){ + if(msDelay==0){ + ESP_LOGE(TAG,"msDelay must be greater than zero"); + return; + } + + upLink_t upLinkData = { .nSteps=nSteps, .msDelay=msDelay, .absoluteStep=false, endAction=endAction }; + xQueueReceive(downLinkQueue,&downLinkData,0); + downLinkData.stepsRemaining=nSteps; + xQueueOverwrite(upLinkQueue,&upLinkData); +} + +////////////////////////// + +void StepperControl::moveTo(int nPosition, uint32_t msDelay, endAction_t endAction){ + if(msDelay==0){ + ESP_LOGE(TAG,"msDelay must be greater than zero"); + return; + } + + upLink_t upLinkData = { .nSteps=nPosition, .msDelay=msDelay, .absoluteStep=true, .endAction=endAction }; + xQueueReceive(downLinkQueue,&downLinkData,0); + downLinkData.stepsRemaining=nPosition-downLinkData.position; + xQueueOverwrite(upLinkQueue,&upLinkData); +} + +////////////////////////// + +int StepperControl::stepsRemaining(){ + xQueuePeek(downLinkQueue,&downLinkData,0); + return(downLinkData.stepsRemaining); +} + +////////////////////////// + +int StepperControl::position(){ + xQueuePeek(downLinkQueue,&downLinkData,0); + return(downLinkData.position); +} + +////////////////////////// + +void StepperControl::brake(){ + move(0,10,BRAKE); + while(stepsRemaining()); +} + +////////////////////////// + +void StepperControl::disable(){ + move(0,10,DISABLE); + while(stepsRemaining()); +} + +////////////////////////// + +void StepperControl::enable(){ + move(0,10); + while(stepsRemaining()); + +}////////////////////////// + +void StepperControl::motorTask(void *args){ + StepperControl *motor = (StepperControl *)args; + upLink_t upLinkData = { .nSteps=0, .msDelay=10, .absoluteStep=false, .endAction=NONE }; + downLink_t downLinkData = { .stepsRemaining=0, .position=0 }; + boolean running=false; + + for(;;){ + + if(xQueueReceive(motor->upLinkQueue, &upLinkData, 0)){ + if(upLinkData.absoluteStep) + upLinkData.nSteps-=downLinkData.position; + downLinkData.stepsRemaining=upLinkData.nSteps; + motor->onEnable(); + running=true; + } + + uint32_t msDelay=upLinkData.msDelay; + + if(running==false){ + vTaskDelay(msDelay); + continue; + } + + if(downLinkData.stepsRemaining!=0) + msDelay+=msDelay * motor->accelSize * (exp(-fabs(upLinkData.nSteps-downLinkData.stepsRemaining)/motor->accelSteps) + exp(-(fabs(downLinkData.stepsRemaining)-1.0)/motor->accelSteps)); + + ESP_LOGD(TAG,"Position: %d Steps Remaining: %d Delay=%d ms",downLinkData.position,downLinkData.stepsRemaining,(int)(msDelay)); + + int dStep=0; + + if(downLinkData.stepsRemaining>0){ + dStep=-1; + motor->onStep(1); + } else if(downLinkData.stepsRemaining<0){ + dStep=1; + motor->onStep(0); + } else { + if(upLinkData.endAction==DISABLE) + motor->onDisable(); + else if(upLinkData.endAction==BRAKE) + motor->onBrake(); + running=false; + } + + xQueueOverwrite(motor->downLinkQueue,&downLinkData); + downLinkData.stepsRemaining+=dStep; + downLinkData.position-=dStep; + vTaskDelay(msDelay); + } +} + +////////////////////////// diff --git a/src/src/extras/StepperControl.h b/src/src/extras/StepperControl.h new file mode 100644 index 0000000..23bb415 --- /dev/null +++ b/src/src/extras/StepperControl.h @@ -0,0 +1,96 @@ +/********************************************************************************* + * MIT License + * + * Copyright (c) 2023 Gregg E. Berman + * + * https://github.com/HomeSpan/HomeStep + * + * 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. + * + ********************************************************************************/ + +#pragma once + +#include + +[[maybe_unused]] static const char* TAG = "StepperControl"; + +////////////////////////// + +class StepperControl { + + public: + + enum { + FULL_STEP_ONE_PHASE=0, + FULL_STEP_TWO_PHASE=1, + HALF_STEP=2, + QUARTER_STEP=4, + EIGHTH_STEP=8 + }; + + enum endAction_t { + NONE, + DISABLE, + BRAKE + }; + + private: + + struct upLink_t { + int nSteps; + uint32_t msDelay; + boolean absoluteStep; + endAction_t endAction; + }; + + struct downLink_t { + int stepsRemaining; + int position; + }; + + float accelSteps=1; + float accelSize=0; + downLink_t downLinkData = { .stepsRemaining=0, .position=0 }; + + TaskHandle_t motorTaskHandle; + QueueHandle_t upLinkQueue; + QueueHandle_t downLinkQueue; + + virtual void onStep(boolean direction)=0; + virtual void onEnable(){}; + virtual void onDisable(){}; + virtual void onBrake(){}; + static void motorTask(void *args); + + public: + + StepperControl(uint32_t priority=2, uint32_t cpu=0); + virtual void setStepType(int mode){}; + void setAccel(float accelSize, float accelSteps); + void move(int nSteps, uint32_t msDelay, endAction_t endAction=NONE); + void moveTo(int nPosition, uint32_t msDelay, endAction_t endAction=NONE); + int position(); + int stepsRemaining(); + void enable(); + void disable(); + void brake(); +}; + +////////////////////////// diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index 090ae0b..e7be939 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -28,57 +28,210 @@ // This is a placeholder .ino file that allows you to easily edit the contents of this files using the Arduino IDE, // as well as compile and test from this point. This file is ignored when the library is included in other sketches. -#include "PwmPin.h" +#include "StepperControl.h" -void setup() { - - Serial.begin(115200); // start the Serial interface - Serial.flush(); - delay(1000); // wait for interface to flush +////////////////////////// - Serial.println("\n\nHomeSpan LED Fade Test\n"); +struct Stepper_TB6612 : StepperControl { - LedPin red(14,0); - LedPin green(14,0); - LedPin blue(14,0); - LedPin blue2(14,0,1000); - LedPin blue3(14,0,2000); - LedPin blue4(14,0,3000); - LedPin blue5(14,0,60000); - LedPin blue6(14,0,5000); - LedPin blue7(14,0,6000); - LedPin blue8(14,0,7000); - LedPin blue9(14,0,8000); - LedPin blue10(14,0,8000); - LedPin blue11(14,0,8000); - LedPin blue12(14,0,8000); - LedPin blue13(14,0,8000); - LedPin blue14(14,0,5000); - LedPin blue15(14,0,5000); - LedPin blue16(14,0,15000); + int pins[4]; + uint8_t phase; + uint8_t nPhases; + uint32_t runCode; - int redLevel=0; +////////////////////////// - for(int i=100;i<=100;i+=10){ - while(red.fadeStatus()==LedPin::FADING); - red.fade(i,1000,LedPin::PROPORTIONAL); + Stepper_TB6612(int a1Pin, int a2Pin, int b1Pin, int b2Pin) : StepperControl(){ + pins[3]=a1Pin; + pins[2]=a2Pin; + pins[1]=b1Pin; + pins[0]=b2Pin; + + for(int i=0;i<4;i++) + pinMode(pins[i],OUTPUT); + + setStepType(FULL_STEP_TWO_PHASE); } - while(1); +////////////////////////// - - while(1){ - delay(1000); - if(red.fade(redLevel,5000)) - Serial.printf("Failed\n"); - else{ - Serial.printf("Success\n"); - redLevel=100-redLevel; + void onEnable() override { + setPinCode((runCode>>(phase*4)) & 0xF); + } + +////////////////////////// + + void onDisable() override { + setPinCode(0); + } + +////////////////////////// + + void onBrake() override { + setPinCode(0xF); + } + +////////////////////////// + + void onStep(boolean direction){ + if(direction) + phase=(phase+1)%nPhases; + else + phase=(phase+nPhases-1)%nPhases; + + setPinCode((runCode>>(phase*4)) & 0xF); + } + +////////////////////////// + + void setPinCode(uint8_t pinCode){ + for(int i=0;i<4;i++) + digitalWrite(pins[i],(pinCode>>i)&1); + } + +////////////////////////// + + void setStepType(int mode) override { + switch(mode){ + case FULL_STEP_ONE_PHASE: + phase=0; + nPhases=4; + runCode=0x2418; + break; + case FULL_STEP_TWO_PHASE: + phase=0; + nPhases=4; + runCode=0x659A; + break; + case HALF_STEP: + phase=0; + nPhases=8; + runCode=0x2645198A; + break; + default: + ESP_LOGE(TAG,"Unknown StepType=%d. Stepper Unchanged",mode); } - } - + +}; + +////////////////////////// + + struct Stepper_A3967 : StepperControl { + + int m1Pin; + int m2Pin; + int stepPin; + int dirPin; + int enablePin; + +////////////////////////// + + Stepper_A3967(int m1Pin, int m2Pin, int stepPin, int dirPin, int enablePin) : StepperControl(){ + this->m1Pin=m1Pin; + this->m2Pin=m2Pin; + this->stepPin=stepPin; + this->dirPin=dirPin; + this->enablePin=enablePin; + + pinMode(m1Pin,OUTPUT); + pinMode(m2Pin,OUTPUT); + pinMode(stepPin,OUTPUT); + pinMode(dirPin,OUTPUT); + pinMode(enablePin,OUTPUT); + + setStepType(FULL_STEP_TWO_PHASE); + } + +////////////////////////// + + void onStep(boolean direction){ + digitalWrite(dirPin,direction); + digitalWrite(stepPin,HIGH); + digitalWrite(stepPin,LOW); + } + +////////////////////////// + + void onEnable() override { + digitalWrite(enablePin,0); + } + +////////////////////////// + + void onDisable() override { + digitalWrite(enablePin,1); + } + +////////////////////////// + + void setStepType(int mode) override { + switch(mode){ + case FULL_STEP_TWO_PHASE: + digitalWrite(m1Pin,LOW); + digitalWrite(m2Pin,LOW); + break; + case HALF_STEP: + digitalWrite(m1Pin,HIGH); + digitalWrite(m2Pin,LOW); + break; + case QUARTER_STEP: + digitalWrite(m1Pin,LOW); + digitalWrite(m2Pin,HIGH); + break; + case EIGHTH_STEP: + digitalWrite(m1Pin,HIGH); + digitalWrite(m2Pin,HIGH); + break; + default: + ESP_LOGE(TAG,"Unknown StepType=%d. Stepper Unchanged",mode); + } + } + +}; + +////////////////////////// + +StepperControl *motor[2]; + +void setup() { + + Serial.begin(115200); + delay(1000); + Serial.printf("\nReady.\n\n"); + + motor[0]=new Stepper_A3967(16,17,21,19,18); + motor[1]=new Stepper_TB6612(23,32,22,14); + + motor[0]->setStepType(Stepper_A3967::QUARTER_STEP); + motor[1]->setStepType(Stepper_TB6612::HALF_STEP); + + motor[0]->setAccel(10,20); + motor[1]->setAccel(50,100); + } -void loop(){ +void loop() { + motor[0]->move(1000,5); + motor[1]->move(2000,2); + + do { + for(int i=0;i<2;i++) + Serial.printf("Motor %d - %5d %5d ",i,motor[i]->stepsRemaining(),motor[i]->position()); + Serial.printf("\n"); + delay(500); + } while(motor[0]->stepsRemaining() || motor[1]->stepsRemaining()); + + motor[0]->moveTo(0,5); + motor[1]->moveTo(0,2); + + do { + for(int i=0;i<2;i++) + Serial.printf("Motor %d - %5d %5d ",i,motor[i]->stepsRemaining(),motor[i]->position()); + Serial.printf("\n"); + delay(500); + } while(motor[0]->stepsRemaining() || motor[1]->stepsRemaining()); + } + +////////////////////////// From 94cec6153bf3fad3f71f0ea0783ccd2e5529447e Mon Sep 17 00:00:00 2001 From: Gregg Date: Wed, 31 May 2023 21:21:53 -0500 Subject: [PATCH 043/151] Update StepperMotorControl.ino --- .../StepperMotorControl.ino | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino index 4f190e6..3745239 100644 --- a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino +++ b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino @@ -26,15 +26,24 @@ ********************************************************************************/ // This example demonstrates how to control a real-world Stepper Motor using HomeSpan's -// SpanStep Class. This class is found in a SEPARATE standalone library called HomeStep. -// To invoke, you include the name of the specific stepper motor controller to be used. -// You can include more than one type if needed. +// StepperControl Class. Note the StepperControl Class serves as a generic interface +// and cannot be instantiatiated directly. Rather, you must create a child class derived +// from StepperClass that implements the details of a specific Stepper Motor Driver Board. -// This sketch is based on the WindowShade Accessory from Example 13. Please review +// In this example we will implement a child class of StepperControl designed to operate +// the Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board using only the 4 control +// pins AIN1, AIN2, BIN1, and BIN2 (https://www.adafruit.com/product/2448) + +// The implementation of this class is found in the file "Stepper_TB6612.h" included +// with this sketch. By separating the details of the Stepper Motor Driver Board from the +// HomeSpan logic below, you can easily change the code that operates the Stepper Motor Driver Board +// without very little modification to the HomeSpan sketch itself. + +// Note this sketch is based on the WindowShade Accessory from Example 13. Please review // that Example first if new to HomeSpan since it is fully commented. #include "HomeSpan.h" -#include "Stepper_TB6612.h" +#include "Stepper_TB6612.h" // Here we include the implementation of thge Adafruit TB6612 Stepper Motor Driver Board //////////////////////////////////// @@ -61,7 +70,7 @@ struct DEV_WindowShade : Service::WindowCovering { boolean update(){ // Move motor to absolute position, assuming 200 steps per revolution and 20 revolutions for full up/travel travel. - // Specify that motor should BRAKE upon moving to desired position. + // Specify that motor should enter the BRAKE state upon reaching to desired position. motor->moveTo(target->getNewVal()*20,5,Stepper_TB6612::BRAKE); LOG1("Setting Shade Position=%d\n",target->getNewVal()); @@ -72,7 +81,8 @@ struct DEV_WindowShade : Service::WindowCovering { void loop(){ - // Check to see if target value does not equal current value. If not, AND motor has no more steps to move, update current value + // If the current window shade position does NOT equal the target position, BUT the motor has stopped moving, + // we must have reached the target position, so set the current position equal to the target position if(current->getVal()!=target->getVal() && !motor->stepsRemaining()){ current->setVal(target->getVal()); From 2fb1eab51c8cf82c0352977bf2def2aa97a1e994 Mon Sep 17 00:00:00 2001 From: Gregg Date: Thu, 1 Jun 2023 06:18:15 -0500 Subject: [PATCH 044/151] Create Stepper.md --- docs/Stepper.md | 145 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 docs/Stepper.md diff --git a/docs/Stepper.md b/docs/Stepper.md new file mode 100644 index 0000000..00ecc0f --- /dev/null +++ b/docs/Stepper.md @@ -0,0 +1,145 @@ +# Remote Control Radio Frequency / Infrared Signal Generation + +The ESP32 has an on-chip signal-generator peripheral designed to drive an RF or IR transmitter. HomeSpan includes an easy-to-use library that interfaces with this peripheral so that with a few additional electronic components you can create a HomeSpan device that controls an RF or IR appliance directly from the Home App on your iPhone, or via Siri. The library is accessed by placing the following near the top of your sketch: + +`#include "extras/RFControl.h"` + +## *RFControl(int pin, boolean refClock=true)* + +Creating an instance of this **class** initializes the RF/IR signal generator and specifies the ESP32 *pin* to output the signal. You may create more than one instance of this class if driving more than one RF/IR transmitter (each connected to different *pin*), subject to the following limitations: ESP32 - 8 instances; ESP32-S2 and ESP32-S3 - 4 instances; ESP32-C3 - 2 instances. The optional parameter *refClock* is more fully described further below under the `start()` method. + +Signals are defined as a sequence of HIGH and LOW phases that together form a pulse train where you specify the duration, in *ticks*, of each HIGH and LOW phase, shown respectively as H1-H4 and L1-L4 in the following diagram: + +![Pulse Train](images/pulseTrain.png) + +Since most RF/IR signals repeat the same train of pulses more than once, the duration of the last LOW phase should be extended to account for the delay between repeats of the pulse train. Pulse trains are encoded as sequential arrays of 32-bit words, where each 32-bit word represents an individual pulse using the following protocol: + + * bits 0-14: the duration, in *ticks* from 0-32767, of the first part of the pulse to be transmitted + * bit 15: indicates whether the first part of the pulse to be trasnmitted is HIGH (1) or LOW (0) + * bits 16-30: the duration, in *ticks* from 0-32767, of the second part of the pulse to be transmitted + * bit 31: indicates whether the second part of the pulse to be trasnmitted is HIGH (1) or LOW (0) + +HomeSpan provides two easy methods to create, store, and transmit a pulse train. The first method relies on the fact that each instance of RFControl maintains its own internal memory structure to store a pulse train of arbitrary length. The functions `clear()`, `add()`, and `pulse()`, described below, allow you to create a pulse train using this internal memory structure. The `start()` function is then used to begin transmission of the full pulse train. This method is generally used when pulse trains are to be created on-the-fly as needed, since each RFControl instance can only store a single pulse train at one time. + +In the second method, you create one or more pulse trains in external arrays of 32-bit words using the protocol above. To begin transmission of a specific pulse train, call the `start()` function with a pointer reference to the external array containing that pulse train. This method is generally used when you want to pre-compute many different pulse trains and have them ready-to-transmit as needed. Note that this method requires the array to be stored in RAM, not PSRAM. + +Details of each function are as follows: + +* `void clear()` + + * clears the pulse train memory structure of a specific instance of RFControl + +* `void phase(uint32_t numTicks, uint8_t phase)` + + * appends either a HIGH or LOW phase to the pulse train memory buffer for a specific instance of RFControl + + * *numTicks* - the duration, in *ticks* of the pulse phase. Durations of greater than 32767 ticks allowed (the system automatically creates repeated pulses of a maximum of 32767 ticks each until the specified duration of *numTicks* is reached) + + * *phase* - set to 0 to create a LOW phase; set to 1 (or any non-zero number) to create a HIGH phase + + * repeated phases of the same type (e.g. HIGH followed by another HIGH) are permitted and result in a single HIGH or LOW phase with a duration equal to the sum of the *numTicks* specified for each repeated phase (this is helpful when generating Manchester-encoded signals) + +* `void add(uint32_t onTime, uint32_t offTime)` + + * appends a single HIGH/LOW pulse with duration *onTime* followed by *offTime* to the pulse train of a specific instance of RFControl. This is functionally equivalent to calling `phase(onTime,HIGH);` followed by `phase(offTime,LOW);` as defined above + +* `void enableCarrier(uint32_t freq, float duty=0.5)` + + * enables modulation of the pulse train with a "square" carrier wave. In practice this is only used for IR signals (not RF) + + * *freq* - the frequency, in Hz, of the carrier wave. If freq=0, carrier wave is disabled + + * *duty* - the duty cycle of the carrier wave, from 0-1. Default is 0.5 if not specified + + * RFControl will report an error if the combination of the specified frequency and duty cycle is outside the range of supported configurations + +* `void disableCarrier()` + + * disables the carrier wave. Equivalent to `enableCarrier(0);` + +* `void start(uint8_t _numCycles, uint8_t tickTime)` +* `void start(uint32_t *data, int nData, uint8_t nCycles, uint8_t tickTime)` + + * in the first variation, this starts the transmission of the pulse train stored in the internal memory structure of a given instance of RFControl that was created using the `clear()`, `add()`, and `phase()` functions above. In the second variation, this starts the transmission of the pulse train stored in an external array *data* containing *nData* 32-bit words. The signal will be output on the pin specified when RFControl was instantiated. Note this is a blocking call—the method waits until transmission is completed before returning. This should not produce a noticeable delay in program operations since most RF/IR pulse trains are only a few tens-of-milliseconds long + + * *numCycles* - the total number of times to transmit the pulse train (i.e. a value of 3 means the pulse train will be transmitted once, followed by 2 additional re-transmissions). This is an optional argument with a default of 1 if not specified. + + * *tickTime* - the duration, in ***clock units***, of a *tick*. This is an optional argument with a default of 1 *clock unit* if not specified. Valid range is 1-255 *clock units*, or set to 0 for 256 *clock units*. The duration of a *clock unit* is determined by the *refClock* parameter (the second, optional argument, in the RFControl constructor described above). If *refClock* is set to true (the default), RFControl uses the ESP32's 1 MHz Reference Clock for timing so that each *clock unit* equals 1𝛍s. If *refClock* is set to false, RFControl uses the ESP32's faster 80 MHz APB Clock so that each *clock unit* equals 0.0125𝛍s (1/80 of microsecond) + +* To aid in the creation of a pulse train stored in an external array of 32-bit words, RFControl includes the macro *RF_PULSE(highTicks,lowTicks)* that returns a properly-formatted 32-bit value representing a single HIGH/LOW pulse of duration *highTicks* followed by *lowTicks*. This is basically an analog to the `add()` function. For example, the following code snippet shows two ways of creating and transmitting the same 3-pulse pulse-train --- the only difference being that one uses the internal memory structure of RFControl, and the second uses an external array: + +```C++ + +RFControl rf(11); // create an instance of RFControl + +rf.clear(); // clear the internal memory structure +rf.add(100,50); // create pulse of 100 ticks HIGH followed by 50 ticks LOW +rf.add(100,50); // create a second pulse of 100 ticks HIGH followed by 50 ticks LOW +rf.add(25,500); // create a third pulse of 25 ticks HIGH followed by 500 ticks LOW +rf.start(4,1000); // start transmission of the pulse train; repeat for 4 cycles; one tick = 1000𝛍s + +uint32_t pulseTrain[] = {RF_PULSE(100,50), RF_PULSE(100,50), RF_PULSE(25,500)}; // create the same pulse train in an external array +rf.start(pulseTrain,3,4,1000); // start transmission using the same parameters +``` +#### Diagnostic Messages + +The **RFControl** class outputs *Warning \[W\]* messages to the Serial Monitor based on the *Core Debug Level* selected when compiling the sketch using the Arduino IDE. A non-fatal warning message is produced when insufficient Channel resources prevent the creation of a new RFControl object. Calls to the `start()` method for objects that failed to be properly created are silently ignored. + +## Example RFControl Sketch + +Below is a complete sketch that produces two different pulse trains with the signal output linked to the ESP32 device's built-in LED (rather than an RF or IR transmitter). For illustrative purposes the tick duration has been set to a very long 100𝛍s, and pulse times range from of 1000-10,000 ticks, so that the individual pulses are easily discernable on the LED. Note this example sketch is also available in the Arduino IDE under [*File → Examples → HomeSpan → Other Examples → RemoteControl*](../examples/Other%20Examples/RemoteControl). + +```C++ +/* HomeSpan Remote Control Example */ + +#include "HomeSpan.h" // include the HomeSpan library +#include "extras/RFControl.h" // include RF Control Library + +void setup() { + + Serial.begin(115200); // start the Serial interface + Serial.flush(); + delay(1000); // wait for interface to flush + + Serial.print("\n\nHomeSpan RF Transmitter Example\n\n"); + + RFControl rf(13); // create an instance of RFControl with signal output to pin 13 on the ESP32 + + rf.clear(); // clear the pulse train memory buffer + + rf.add(5000,5000); // create a pulse train with three 5000-tick high/low pulses + rf.add(5000,5000); + rf.add(5000,10000); // double duration of final low period + + Serial.print("Starting 4 cycles of three 500 ms on pulses..."); + + rf.start(4,100); // start transmission of 4 cycles of the pulse train with 1 tick=100 microseconds + + Serial.print("Done!\n"); + + delay(2000); + + rf.clear(); + + for(int i=1000;i<10000;i+=1000) + rf.add(i,10000-i); + rf.add(10000,10000); + + Serial.print("Starting 3 cycles of 100-1000 ms pulses..."); + + rf.start(3,100); // start transmission of 3 cycles of the pulse train with 1 tick=100 microseconds + + Serial.print("Done!\n"); + + Serial.print("\nEnd Example"); + +} // end of setup() + +void loop(){ + +} // end of loop() +``` + +--- + +[↩️](../README.md) Back to the Welcome page From 8be3b7ab6cd5323df942a35d89f88f79528d5b58 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Thu, 1 Jun 2023 06:19:25 -0500 Subject: [PATCH 045/151] Update Stepper.md --- docs/Stepper.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 00ecc0f..dbe73ff 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -1,9 +1,16 @@ -# Remote Control Radio Frequency / Infrared Signal Generation +# Stepper Motor Control The ESP32 has an on-chip signal-generator peripheral designed to drive an RF or IR transmitter. HomeSpan includes an easy-to-use library that interfaces with this peripheral so that with a few additional electronic components you can create a HomeSpan device that controls an RF or IR appliance directly from the Home App on your iPhone, or via Siri. The library is accessed by placing the following near the top of your sketch: `#include "extras/RFControl.h"` + + + + +.... + + ## *RFControl(int pin, boolean refClock=true)* Creating an instance of this **class** initializes the RF/IR signal generator and specifies the ESP32 *pin* to output the signal. You may create more than one instance of this class if driving more than one RF/IR transmitter (each connected to different *pin*), subject to the following limitations: ESP32 - 8 instances; ESP32-S2 and ESP32-S3 - 4 instances; ESP32-C3 - 2 instances. The optional parameter *refClock* is more fully described further below under the `start()` method. From 44e48a453411edcb81aee72c3074abc2ee5e242d Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 4 Jun 2023 09:20:37 -0500 Subject: [PATCH 046/151] Update extras.ino --- src/src/extras/extras.ino | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index e7be939..55aac2a 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -200,6 +200,11 @@ void setup() { delay(1000); Serial.printf("\nReady.\n\n"); + pinMode(33,OUTPUT); + pinMode(27,OUTPUT); + digitalWrite(33,HIGH); + digitalWrite(27,HIGH); + motor[0]=new Stepper_A3967(16,17,21,19,18); motor[1]=new Stepper_TB6612(23,32,22,14); From 536de53075715cad6027890f68a0bc292cfb6f8d Mon Sep 17 00:00:00 2001 From: Gregg Date: Fri, 9 Jun 2023 23:11:38 -0500 Subject: [PATCH 047/151] Added Stepper_TB6612 and Stepper_A3967 directly to HomeSpan HomeSpan now includes both drivers as part of the "extras" functionality. The StepperMotorControl Window Shade Example has been updated accordingly to use the built-in TB6612 driver. --- .../StepperMotorControl.ino | 21 +- src/extras/Stepper_A3967.h | 30 +++ src/extras/Stepper_TB6612.h | 30 +++ src/src/extras/StepperControl.cpp | 12 +- src/src/extras/StepperControl.h | 2 +- .../src/extras/Stepper_A3967.h | 116 +++++----- src/src/extras/Stepper_TB6612.h | 181 +++++++++++++++ src/src/extras/extras.ino | 214 ++---------------- 8 files changed, 333 insertions(+), 273 deletions(-) create mode 100644 src/extras/Stepper_A3967.h create mode 100644 src/extras/Stepper_TB6612.h rename examples/Other Examples/StepperMotorControl/Stepper_TB6612.h => src/src/extras/Stepper_A3967.h (51%) create mode 100644 src/src/extras/Stepper_TB6612.h diff --git a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino index 3745239..e66ea5f 100644 --- a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino +++ b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino @@ -26,24 +26,19 @@ ********************************************************************************/ // This example demonstrates how to control a real-world Stepper Motor using HomeSpan's -// StepperControl Class. Note the StepperControl Class serves as a generic interface -// and cannot be instantiatiated directly. Rather, you must create a child class derived -// from StepperClass that implements the details of a specific Stepper Motor Driver Board. +// generic StepperControl Class. -// In this example we will implement a child class of StepperControl designed to operate -// the Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board using only the 4 control -// pins AIN1, AIN2, BIN1, and BIN2 (https://www.adafruit.com/product/2448) +// For this sketch we will use an implementation of StepperControl designed to operate an +// Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board (https://www.adafruit.com/product/2448) +// using only its 4 control pins: AIN1, AIN2, BIN1, and BIN2 -// The implementation of this class is found in the file "Stepper_TB6612.h" included -// with this sketch. By separating the details of the Stepper Motor Driver Board from the -// HomeSpan logic below, you can easily change the code that operates the Stepper Motor Driver Board -// without very little modification to the HomeSpan sketch itself. +// See HomeSpan's StepperControl documentation for a list of built-in driver boards, as well as for +// detailed instructions on how you can easily use StepperControl to implement a custom driver for any board. -// Note this sketch is based on the WindowShade Accessory from Example 13. Please review -// that Example first if new to HomeSpan since it is fully commented. +// Note this example is based on the fully-commented WindowShade Accessory sketch from Tutorial Example 13. #include "HomeSpan.h" -#include "Stepper_TB6612.h" // Here we include the implementation of thge Adafruit TB6612 Stepper Motor Driver Board +#include "extras/Stepper_TB6612.h" // this contains HomeSpan's StepperControl Class for the Adafruit TB6612 Driver Board //////////////////////////////////// diff --git a/src/extras/Stepper_A3967.h b/src/extras/Stepper_A3967.h new file mode 100644 index 0000000..a5fb2b0 --- /dev/null +++ b/src/extras/Stepper_A3967.h @@ -0,0 +1,30 @@ +/********************************************************************************* + * MIT License + * + * Copyright (c) 2020-2022 Gregg E. Berman + * + * https://github.com/HomeSpan/HomeSpan + * + * 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. + * + ********************************************************************************/ + +#pragma once + +#include "../src/extras/Stepper_A3967.h" diff --git a/src/extras/Stepper_TB6612.h b/src/extras/Stepper_TB6612.h new file mode 100644 index 0000000..14365d9 --- /dev/null +++ b/src/extras/Stepper_TB6612.h @@ -0,0 +1,30 @@ +/********************************************************************************* + * MIT License + * + * Copyright (c) 2020-2022 Gregg E. Berman + * + * https://github.com/HomeSpan/HomeSpan + * + * 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. + * + ********************************************************************************/ + +#pragma once + +#include "../src/extras/Stepper_TB6612.h" diff --git a/src/src/extras/StepperControl.cpp b/src/src/extras/StepperControl.cpp index a6e3224..d5aac4e 100644 --- a/src/src/extras/StepperControl.cpp +++ b/src/src/extras/StepperControl.cpp @@ -25,7 +25,7 @@ * ********************************************************************************/ - #include "StepperControl.h" +#include "StepperControl.h" ////////////////////////// @@ -40,12 +40,12 @@ StepperControl::StepperControl(uint32_t priority, uint32_t cpu){ void StepperControl::setAccel(float accelSize, float accelSteps){ if(accelSize<0.0){ - ESP_LOGE(TAG,"accelSize cannot be less than 0.0"); + ESP_LOGE(STEPPER_TAG,"accelSize cannot be less than 0.0"); return; } if(accelSteps<1.0){ - ESP_LOGE(TAG,"accelSteps cannot be less than 1.0"); + ESP_LOGE(STEPPER_TAG,"accelSteps cannot be less than 1.0"); return; } @@ -57,7 +57,7 @@ void StepperControl::setAccel(float accelSize, float accelSteps){ void StepperControl::move(int nSteps, uint32_t msDelay, endAction_t endAction){ if(msDelay==0){ - ESP_LOGE(TAG,"msDelay must be greater than zero"); + ESP_LOGE(STEPPER_TAG,"msDelay must be greater than zero"); return; } @@ -71,7 +71,7 @@ void StepperControl::move(int nSteps, uint32_t msDelay, endAction_t endAction){ void StepperControl::moveTo(int nPosition, uint32_t msDelay, endAction_t endAction){ if(msDelay==0){ - ESP_LOGE(TAG,"msDelay must be greater than zero"); + ESP_LOGE(STEPPER_TAG,"msDelay must be greater than zero"); return; } @@ -143,7 +143,7 @@ void StepperControl::motorTask(void *args){ if(downLinkData.stepsRemaining!=0) msDelay+=msDelay * motor->accelSize * (exp(-fabs(upLinkData.nSteps-downLinkData.stepsRemaining)/motor->accelSteps) + exp(-(fabs(downLinkData.stepsRemaining)-1.0)/motor->accelSteps)); - ESP_LOGD(TAG,"Position: %d Steps Remaining: %d Delay=%d ms",downLinkData.position,downLinkData.stepsRemaining,(int)(msDelay)); + ESP_LOGD(STEPPER_TAG,"Position: %d Steps Remaining: %d Delay=%d ms",downLinkData.position,downLinkData.stepsRemaining,(int)(msDelay)); int dStep=0; diff --git a/src/src/extras/StepperControl.h b/src/src/extras/StepperControl.h index 23bb415..2c63266 100644 --- a/src/src/extras/StepperControl.h +++ b/src/src/extras/StepperControl.h @@ -29,7 +29,7 @@ #include -[[maybe_unused]] static const char* TAG = "StepperControl"; +[[maybe_unused]] static const char* STEPPER_TAG = "StepperControl"; ////////////////////////// diff --git a/examples/Other Examples/StepperMotorControl/Stepper_TB6612.h b/src/src/extras/Stepper_A3967.h similarity index 51% rename from examples/Other Examples/StepperMotorControl/Stepper_TB6612.h rename to src/src/extras/Stepper_A3967.h index 25f097c..1279e97 100644 --- a/examples/Other Examples/StepperMotorControl/Stepper_TB6612.h +++ b/src/src/extras/Stepper_A3967.h @@ -3,7 +3,7 @@ * * Copyright (c) 2023 Gregg E. Berman * - * https://github.com/HomeSpan/HomeSpan + * https://github.com/HomeSpan/HomeStep * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,89 +24,93 @@ * SOFTWARE. * ********************************************************************************/ + +// Implementation of StepperControl for a Sparkfun A3967 EasyDriver Stepper Motor Driver +// Breakout Board (https://www.sparkfun.com/products/12779) + +// This implementation uses the driver board's MS1, MS2, STEP, DIR, and ENABLE pins. +// Separate PWM pins on the ESP32 are NOT needed since the driver board contains its own +// waveform generation. Supported modes include FULL_STEP (double-phase only), HALF_STEP, +// QUARTER_STEP, and EIGHTH_STEP. + +// The motor outputs can be enabled (current running through the coils) or +// disabled (no current / high impedence). The EasyDriver board does NOT support +// the short brake mode. + +#pragma once + +#include "StepperControl.h" + +////////////////////////// - #include "extras/StepperControl.h" +struct Stepper_A3967 : StepperControl { + + int m1Pin; + int m2Pin; + int stepPin; + int dirPin; + int enablePin; ////////////////////////// -struct Stepper_TB6612 : StepperControl { + Stepper_A3967(int m1Pin, int m2Pin, int stepPin, int dirPin, int enablePin) : StepperControl(){ + this->m1Pin=m1Pin; + this->m2Pin=m2Pin; + this->stepPin=stepPin; + this->dirPin=dirPin; + this->enablePin=enablePin; - int pins[4]; - uint8_t phase; - uint8_t nPhases; - uint32_t runCode; - -////////////////////////// - - Stepper_TB6612(int a1Pin, int a2Pin, int b1Pin, int b2Pin) : StepperControl(){ - pins[3]=a1Pin; - pins[2]=a2Pin; - pins[1]=b1Pin; - pins[0]=b2Pin; - - for(int i=0;i<4;i++) - pinMode(pins[i],OUTPUT); + pinMode(m1Pin,OUTPUT); + pinMode(m2Pin,OUTPUT); + pinMode(stepPin,OUTPUT); + pinMode(dirPin,OUTPUT); + pinMode(enablePin,OUTPUT); setStepType(FULL_STEP_TWO_PHASE); } +////////////////////////// + + void onStep(boolean direction){ + digitalWrite(dirPin,direction); + digitalWrite(stepPin,HIGH); + digitalWrite(stepPin,LOW); + } + ////////////////////////// void onEnable() override { - setPinCode((runCode>>(phase*4)) & 0xF); + digitalWrite(enablePin,0); } ////////////////////////// void onDisable() override { - setPinCode(0); - } - -////////////////////////// - - void onBrake() override { - setPinCode(0xF); - } - -////////////////////////// - - void onStep(boolean direction){ - if(direction) - phase=(phase+1)%nPhases; - else - phase=(phase+nPhases-1)%nPhases; - - setPinCode((runCode>>(phase*4)) & 0xF); - } - -////////////////////////// - - void setPinCode(uint8_t pinCode){ - for(int i=0;i<4;i++) - digitalWrite(pins[i],(pinCode>>i)&1); + digitalWrite(enablePin,1); } ////////////////////////// void setStepType(int mode) override { switch(mode){ - case FULL_STEP_ONE_PHASE: - phase=0; - nPhases=4; - runCode=0x2418; - break; case FULL_STEP_TWO_PHASE: - phase=0; - nPhases=4; - runCode=0x659A; + digitalWrite(m1Pin,LOW); + digitalWrite(m2Pin,LOW); break; case HALF_STEP: - phase=0; - nPhases=8; - runCode=0x2645198A; + digitalWrite(m1Pin,HIGH); + digitalWrite(m2Pin,LOW); + break; + case QUARTER_STEP: + digitalWrite(m1Pin,LOW); + digitalWrite(m2Pin,HIGH); + break; + case EIGHTH_STEP: + digitalWrite(m1Pin,HIGH); + digitalWrite(m2Pin,HIGH); break; default: - ESP_LOGE(TAG,"Unknown StepType=%d. Stepper Unchanged",mode); + ESP_LOGE(STEPPER_TAG,"Unknown StepType=%d",mode); } } diff --git a/src/src/extras/Stepper_TB6612.h b/src/src/extras/Stepper_TB6612.h new file mode 100644 index 0000000..bf53133 --- /dev/null +++ b/src/src/extras/Stepper_TB6612.h @@ -0,0 +1,181 @@ +/********************************************************************************* + * MIT License + * + * Copyright (c) 2023 Gregg E. Berman + * + * https://github.com/HomeSpan/HomeSpan + * + * 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. + * + ********************************************************************************/ + +// Implementation of StepperControl for an Adafruit TB6612 1.2A DC/Stepper Motor Driver +// Breakout Board (https://www.adafruit.com/product/2448) + +// This implementation supports two constructors reflecting implementations both with and +// without the use of PWM pins. The first operates the driver board using only its +// four digital control pins: AIN1, AIN2, BIN1, BIN2. In this configuration the +// PWMA, PWMB, and STBY pins on the driver board should be directly connected to Vcc. + +// The second configuration uses the four digital control pins (AIN1, AIN2, BIN1, and BIN2) +// as well as the PWMA and PWMB pins. In this configuration only the STBY pin on the +// driver board should be directly connected to Vcc. + +// The first configuration supports both single-phase and double-phase FULL_STEP modes, +// as well as a HALF_STEP mode. The second configuration also includes QUARTER_STEP +// and EIGHTH_STEP modes, made possible by the use of the PWM pins to micro-step the motor. + +// In either configuration the motor outputs can be enabled (current running through the coils) +// disabled (no current / high impedence) or set to a short brake. + +#pragma once + +#include "StepperControl.h" +#include "PwmPin.h" + +////////////////////////// + +struct Stepper_TB6612 : StepperControl { + + int ain1, ain2, bin1, bin2; + uint8_t phase, nPhases; + double offset; + LedPin *pwmA=NULL, *pwmB; + +////////////////////////// + + Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2) : StepperControl(){ + + ain1=AIN1; + ain2=AIN2; + bin1=BIN1; + bin2=BIN2; + + pinMode(ain1,OUTPUT); + pinMode(ain2,OUTPUT); + pinMode(bin1,OUTPUT); + pinMode(bin2,OUTPUT); + + setStepType(FULL_STEP_TWO_PHASE); + } + +////////////////////////// + + Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB) : Stepper_TB6612(AIN1,AIN2,BIN1,BIN2){ + + pwmA=new LedPin(PWMA,0,50000); + pwmB=new LedPin(PWMB,0,50000); + } + +////////////////////////// + + void onEnable() override { + setPins(); + } + +////////////////////////// + + void onDisable() override { + digitalWrite(ain1,0); + digitalWrite(ain2,0); + digitalWrite(bin1,0); + digitalWrite(bin2,0); + } + +////////////////////////// + + void onBrake() override { + digitalWrite(ain1,1); + digitalWrite(ain2,1); + digitalWrite(bin1,1); + digitalWrite(bin2,1); + } + +////////////////////////// + + void onStep(boolean direction){ + if(direction) + phase=(phase+1)%nPhases; + else + phase=(phase+nPhases-1)%nPhases; + + setPins(); + } + +////////////////////////// + + void setPins(){ + float levelA=cos(phase*TWO_PI/nPhases+offset)*100.0; + float levelB=sin(phase*TWO_PI/nPhases+offset)*100.0; + digitalWrite(ain1,levelA>0.01); + digitalWrite(ain2,levelA<-0.01); + digitalWrite(bin1,levelB>0.01); + digitalWrite(bin2,levelB<-0.01); + if(pwmA){ + pwmA->set(fabs(levelA)); + pwmB->set(fabs(levelB)); + } + } + +////////////////////////// + + void setStepType(int mode) override { + + switch(mode){ + case FULL_STEP_ONE_PHASE: + phase=0; + nPhases=4; + offset=0; + break; + case FULL_STEP_TWO_PHASE: + phase=0; + nPhases=4; + offset=TWO_PI/8.0; + break; + case HALF_STEP: + phase=0; + nPhases=8; + offset=0; + break; + case QUARTER_STEP: + if(!pwmA){ + ESP_LOGE(STEPPER_TAG,"QUARTER_STEP requires PWM pins"); + return; + } + phase=0; + nPhases=16; + offset=0; + break; + case EIGHTH_STEP: + if(!pwmA){ + ESP_LOGE(STEPPER_TAG,"EIGHTH_STEP requires PWM pins"); + return; + } + phase=0; + nPhases=32; + offset=0; + break; + default: + ESP_LOGE(STEPPER_TAG,"Unknown StepType=%d",mode); + } + } + +}; + +////////////////////////// diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index 55aac2a..c80d93a 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -28,215 +28,35 @@ // This is a placeholder .ino file that allows you to easily edit the contents of this files using the Arduino IDE, // as well as compile and test from this point. This file is ignored when the library is included in other sketches. -#include "StepperControl.h" +#include "Stepper_TB6612.h" +#include "Stepper_A3967.h" -////////////////////////// +StepperControl *motor; -struct Stepper_TB6612 : StepperControl { - - int pins[4]; - uint8_t phase; - uint8_t nPhases; - uint32_t runCode; - -////////////////////////// - - Stepper_TB6612(int a1Pin, int a2Pin, int b1Pin, int b2Pin) : StepperControl(){ - pins[3]=a1Pin; - pins[2]=a2Pin; - pins[1]=b1Pin; - pins[0]=b2Pin; - - for(int i=0;i<4;i++) - pinMode(pins[i],OUTPUT); - - setStepType(FULL_STEP_TWO_PHASE); - } - -////////////////////////// - - void onEnable() override { - setPinCode((runCode>>(phase*4)) & 0xF); - } - -////////////////////////// - - void onDisable() override { - setPinCode(0); - } - -////////////////////////// - - void onBrake() override { - setPinCode(0xF); - } - -////////////////////////// - - void onStep(boolean direction){ - if(direction) - phase=(phase+1)%nPhases; - else - phase=(phase+nPhases-1)%nPhases; - - setPinCode((runCode>>(phase*4)) & 0xF); - } - -////////////////////////// - - void setPinCode(uint8_t pinCode){ - for(int i=0;i<4;i++) - digitalWrite(pins[i],(pinCode>>i)&1); - } - -////////////////////////// - - void setStepType(int mode) override { - switch(mode){ - case FULL_STEP_ONE_PHASE: - phase=0; - nPhases=4; - runCode=0x2418; - break; - case FULL_STEP_TWO_PHASE: - phase=0; - nPhases=4; - runCode=0x659A; - break; - case HALF_STEP: - phase=0; - nPhases=8; - runCode=0x2645198A; - break; - default: - ESP_LOGE(TAG,"Unknown StepType=%d. Stepper Unchanged",mode); - } - } - -}; - -////////////////////////// - - struct Stepper_A3967 : StepperControl { - - int m1Pin; - int m2Pin; - int stepPin; - int dirPin; - int enablePin; - -////////////////////////// - - Stepper_A3967(int m1Pin, int m2Pin, int stepPin, int dirPin, int enablePin) : StepperControl(){ - this->m1Pin=m1Pin; - this->m2Pin=m2Pin; - this->stepPin=stepPin; - this->dirPin=dirPin; - this->enablePin=enablePin; - - pinMode(m1Pin,OUTPUT); - pinMode(m2Pin,OUTPUT); - pinMode(stepPin,OUTPUT); - pinMode(dirPin,OUTPUT); - pinMode(enablePin,OUTPUT); - - setStepType(FULL_STEP_TWO_PHASE); - } - -////////////////////////// - - void onStep(boolean direction){ - digitalWrite(dirPin,direction); - digitalWrite(stepPin,HIGH); - digitalWrite(stepPin,LOW); - } - -////////////////////////// - - void onEnable() override { - digitalWrite(enablePin,0); - } - -////////////////////////// - - void onDisable() override { - digitalWrite(enablePin,1); - } - -////////////////////////// - - void setStepType(int mode) override { - switch(mode){ - case FULL_STEP_TWO_PHASE: - digitalWrite(m1Pin,LOW); - digitalWrite(m2Pin,LOW); - break; - case HALF_STEP: - digitalWrite(m1Pin,HIGH); - digitalWrite(m2Pin,LOW); - break; - case QUARTER_STEP: - digitalWrite(m1Pin,LOW); - digitalWrite(m2Pin,HIGH); - break; - case EIGHTH_STEP: - digitalWrite(m1Pin,HIGH); - digitalWrite(m2Pin,HIGH); - break; - default: - ESP_LOGE(TAG,"Unknown StepType=%d. Stepper Unchanged",mode); - } - } - -}; - -////////////////////////// - -StepperControl *motor[2]; +//////////////////////////////////// void setup() { Serial.begin(115200); delay(1000); - Serial.printf("\nReady.\n\n"); + Serial.printf("\nHomeSpan Steppers\n\n"); - pinMode(33,OUTPUT); - pinMode(27,OUTPUT); - digitalWrite(33,HIGH); - digitalWrite(27,HIGH); + motor=new Stepper_TB6612(23,32,22,14,33,27); +// motor=new Stepper_TB6612(23,32,22,14); - motor[0]=new Stepper_A3967(16,17,21,19,18); - motor[1]=new Stepper_TB6612(23,32,22,14); - - motor[0]->setStepType(Stepper_A3967::QUARTER_STEP); - motor[1]->setStepType(Stepper_TB6612::HALF_STEP); - - motor[0]->setAccel(10,20); - motor[1]->setAccel(50,100); - + motor->setStepType(StepperControl::EIGHTH_STEP); + motor->setAccel(10,100); + motor->move(1600,2); + while(motor->stepsRemaining()); + motor->moveTo(0,2,StepperControl::BRAKE); } -void loop() { - motor[0]->move(1000,5); - motor[1]->move(2000,2); - - do { - for(int i=0;i<2;i++) - Serial.printf("Motor %d - %5d %5d ",i,motor[i]->stepsRemaining(),motor[i]->position()); - Serial.printf("\n"); - delay(500); - } while(motor[0]->stepsRemaining() || motor[1]->stepsRemaining()); - - motor[0]->moveTo(0,5); - motor[1]->moveTo(0,2); - - do { - for(int i=0;i<2;i++) - Serial.printf("Motor %d - %5d %5d ",i,motor[i]->stepsRemaining(),motor[i]->position()); - Serial.printf("\n"); - delay(500); - } while(motor[0]->stepsRemaining() || motor[1]->stepsRemaining()); +////////////////////////////////////// +void loop(){ } +////////////////////////////////////// + + ////////////////////////// From 2eb70f1d1bad950c8e147bd74cdba4076a952316 Mon Sep 17 00:00:00 2001 From: Gregg Date: Fri, 9 Jun 2023 23:15:38 -0500 Subject: [PATCH 048/151] Changed links from HomeStep to HomeSpan --- src/src/extras/StepperControl.cpp | 2 +- src/src/extras/StepperControl.h | 2 +- src/src/extras/Stepper_A3967.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/src/extras/StepperControl.cpp b/src/src/extras/StepperControl.cpp index d5aac4e..92f0e37 100644 --- a/src/src/extras/StepperControl.cpp +++ b/src/src/extras/StepperControl.cpp @@ -3,7 +3,7 @@ * * Copyright (c) 2023 Gregg E. Berman * - * https://github.com/HomeSpan/HomeStep + * https://github.com/HomeSpan/HomeSpan * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/src/extras/StepperControl.h b/src/src/extras/StepperControl.h index 2c63266..5e325b7 100644 --- a/src/src/extras/StepperControl.h +++ b/src/src/extras/StepperControl.h @@ -3,7 +3,7 @@ * * Copyright (c) 2023 Gregg E. Berman * - * https://github.com/HomeSpan/HomeStep + * https://github.com/HomeSpan/HomeSpan * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/src/extras/Stepper_A3967.h b/src/src/extras/Stepper_A3967.h index 1279e97..216859f 100644 --- a/src/src/extras/Stepper_A3967.h +++ b/src/src/extras/Stepper_A3967.h @@ -3,7 +3,7 @@ * * Copyright (c) 2023 Gregg E. Berman * - * https://github.com/HomeSpan/HomeStep + * https://github.com/HomeSpan/HomeSpan * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal From 480af6cf8505ae1f09a11a20d95f1e9e343e4fcc Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sun, 18 Jun 2023 17:55:29 -0500 Subject: [PATCH 049/151] Added setPosition() to StepperControl Needs testing and debugging --- src/src/extras/StepperControl.cpp | 11 +++++++++++ src/src/extras/StepperControl.h | 1 + src/src/extras/extras.ino | 12 ++++++++---- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/src/extras/StepperControl.cpp b/src/src/extras/StepperControl.cpp index 92f0e37..a491e6e 100644 --- a/src/src/extras/StepperControl.cpp +++ b/src/src/extras/StepperControl.cpp @@ -97,6 +97,17 @@ int StepperControl::position(){ ////////////////////////// +void StepperControl::setPosition(int pos){ + if(!stepsRemaining()){ + downLinkData.position=pos; + xQueueOverwrite(downLinkQueue,&downLinkData); + } else { + ESP_LOGE(STEPPER_TAG,"can't set Position while motor is running"); + } +} + +////////////////////////// + void StepperControl::brake(){ move(0,10,BRAKE); while(stepsRemaining()); diff --git a/src/src/extras/StepperControl.h b/src/src/extras/StepperControl.h index 5e325b7..12c5581 100644 --- a/src/src/extras/StepperControl.h +++ b/src/src/extras/StepperControl.h @@ -87,6 +87,7 @@ class StepperControl { void move(int nSteps, uint32_t msDelay, endAction_t endAction=NONE); void moveTo(int nPosition, uint32_t msDelay, endAction_t endAction=NONE); int position(); + void setPosition(int pos); int stepsRemaining(); void enable(); void disable(); diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index c80d93a..e72f5a8 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -41,13 +41,17 @@ void setup() { delay(1000); Serial.printf("\nHomeSpan Steppers\n\n"); - motor=new Stepper_TB6612(23,32,22,14,33,27); -// motor=new Stepper_TB6612(23,32,22,14); +// motor=new Stepper_TB6612(23,32,22,14,33,27); + motor=new Stepper_TB6612(23,32,22,14); - motor->setStepType(StepperControl::EIGHTH_STEP); + motor->setStepType(StepperControl::HALF_STEP); motor->setAccel(10,100); - motor->move(1600,2); + motor->move(100,2); + motor->setPosition(200); while(motor->stepsRemaining()); + motor->setPosition(200); + delay(10); + Serial.printf("Position=%d\n",motor->position()); motor->moveTo(0,2,StepperControl::BRAKE); } From fe4d83140f182a1af316dd988f46b52a329200c2 Mon Sep 17 00:00:00 2001 From: Gregg Date: Mon, 19 Jun 2023 21:24:23 -0500 Subject: [PATCH 050/151] Completed motor control setPosition() Updated logic of setPosition(), move(), and moveTo() to use waitForAck() so that an initial acknowledgment is received from the motorTask() before proceeding. --- src/src/extras/StepperControl.cpp | 47 +++++++++++++++++++++---------- src/src/extras/StepperControl.h | 16 ++++++++--- src/src/extras/extras.ino | 10 +++---- 3 files changed, 49 insertions(+), 24 deletions(-) diff --git a/src/src/extras/StepperControl.cpp b/src/src/extras/StepperControl.cpp index a491e6e..6992c16 100644 --- a/src/src/extras/StepperControl.cpp +++ b/src/src/extras/StepperControl.cpp @@ -61,10 +61,9 @@ void StepperControl::move(int nSteps, uint32_t msDelay, endAction_t endAction){ return; } - upLink_t upLinkData = { .nSteps=nSteps, .msDelay=msDelay, .absoluteStep=false, endAction=endAction }; - xQueueReceive(downLinkQueue,&downLinkData,0); - downLinkData.stepsRemaining=nSteps; + upLink_t upLinkData = { .nSteps=nSteps, .msDelay=msDelay, .action=MOVE, endAction=endAction }; xQueueOverwrite(upLinkQueue,&upLinkData); + waitForAck(); } ////////////////////////// @@ -75,10 +74,9 @@ void StepperControl::moveTo(int nPosition, uint32_t msDelay, endAction_t endActi return; } - upLink_t upLinkData = { .nSteps=nPosition, .msDelay=msDelay, .absoluteStep=true, .endAction=endAction }; - xQueueReceive(downLinkQueue,&downLinkData,0); - downLinkData.stepsRemaining=nPosition-downLinkData.position; + upLink_t upLinkData = { .nSteps=nPosition, .msDelay=msDelay, .action=MOVETO, .endAction=endAction }; xQueueOverwrite(upLinkQueue,&upLinkData); + waitForAck(); } ////////////////////////// @@ -99,15 +97,24 @@ int StepperControl::position(){ void StepperControl::setPosition(int pos){ if(!stepsRemaining()){ - downLinkData.position=pos; - xQueueOverwrite(downLinkQueue,&downLinkData); + upLink_t upLinkData = { .nSteps=pos, .msDelay=10, .action=SET_POSITION, .endAction=NONE }; + xQueueOverwrite(upLinkQueue,&upLinkData); + waitForAck(); } else { - ESP_LOGE(STEPPER_TAG,"can't set Position while motor is running"); + ESP_LOGE(STEPPER_TAG,"can't set position while motor is running"); } } ////////////////////////// +void StepperControl::waitForAck(){ + downLinkData.ack=false; + while(downLinkData.ack==false) + xQueueReceive(downLinkQueue,&downLinkData,0); +}; + +////////////////////////// + void StepperControl::brake(){ move(0,10,BRAKE); while(stepsRemaining()); @@ -130,18 +137,27 @@ void StepperControl::enable(){ void StepperControl::motorTask(void *args){ StepperControl *motor = (StepperControl *)args; - upLink_t upLinkData = { .nSteps=0, .msDelay=10, .absoluteStep=false, .endAction=NONE }; - downLink_t downLinkData = { .stepsRemaining=0, .position=0 }; + upLink_t upLinkData; + downLink_t downLinkData; boolean running=false; for(;;){ if(xQueueReceive(motor->upLinkQueue, &upLinkData, 0)){ - if(upLinkData.absoluteStep) - upLinkData.nSteps-=downLinkData.position; - downLinkData.stepsRemaining=upLinkData.nSteps; - motor->onEnable(); + switch(upLinkData.action){ + case SET_POSITION: + downLinkData.position=upLinkData.nSteps; + break; + case MOVETO: + upLinkData.nSteps-=downLinkData.position; + [[fallthrough]]; + case MOVE: + downLinkData.stepsRemaining=upLinkData.nSteps; + motor->onEnable(); + break; + } running=true; + downLinkData.ack=true; } uint32_t msDelay=upLinkData.msDelay; @@ -175,6 +191,7 @@ void StepperControl::motorTask(void *args){ xQueueOverwrite(motor->downLinkQueue,&downLinkData); downLinkData.stepsRemaining+=dStep; downLinkData.position-=dStep; + downLinkData.ack=false; vTaskDelay(msDelay); } } diff --git a/src/src/extras/StepperControl.h b/src/src/extras/StepperControl.h index 12c5581..b4b4f9e 100644 --- a/src/src/extras/StepperControl.h +++ b/src/src/extras/StepperControl.h @@ -51,28 +51,36 @@ class StepperControl { BRAKE }; + enum action_t { + MOVE, + MOVETO, + SET_POSITION + }; + private: struct upLink_t { int nSteps; uint32_t msDelay; - boolean absoluteStep; + action_t action; endAction_t endAction; }; struct downLink_t { - int stepsRemaining; - int position; + int stepsRemaining=0; + int position=0; + boolean ack=false; }; float accelSteps=1; float accelSize=0; - downLink_t downLinkData = { .stepsRemaining=0, .position=0 }; + downLink_t downLinkData; TaskHandle_t motorTaskHandle; QueueHandle_t upLinkQueue; QueueHandle_t downLinkQueue; + void waitForAck(); virtual void onStep(boolean direction)=0; virtual void onEnable(){}; virtual void onDisable(){}; diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index e72f5a8..d371102 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -45,14 +45,14 @@ void setup() { motor=new Stepper_TB6612(23,32,22,14); motor->setStepType(StepperControl::HALF_STEP); - motor->setAccel(10,100); + motor->setAccel(10,10); + motor->setPosition(200); motor->move(100,2); - motor->setPosition(200); while(motor->stepsRemaining()); - motor->setPosition(200); - delay(10); - Serial.printf("Position=%d\n",motor->position()); + motor->setPosition(-200); motor->moveTo(0,2,StepperControl::BRAKE); + while(motor->position()<-11); + motor->disable(); } ////////////////////////////////////// From e422d3c9de937609cedc15c36064ea9545f70778 Mon Sep 17 00:00:00 2001 From: Gregg Date: Tue, 20 Jun 2023 21:23:03 -0500 Subject: [PATCH 051/151] Updated StepperMotorControl Window Shade Example to use setPosition() Example now saves window shade position in NVS and uses setPosition() accordingly upon initialization. --- .../StepperMotorControl/StepperMotorControl.ino | 12 ++++++++---- src/src/extras/extras.ino | 9 +++------ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino index e66ea5f..80a4fef 100644 --- a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino +++ b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino @@ -51,23 +51,27 @@ struct DEV_WindowShade : Service::WindowCovering { DEV_WindowShade(int a1, int a2, int b1, int b2) : Service::WindowCovering(){ - current=new Characteristic::CurrentPosition(0); - target=new Characteristic::TargetPosition(0); + current=new Characteristic::CurrentPosition(0,true); + target=new Characteristic::TargetPosition(0,true); motor=new Stepper_TB6612(a1, a2, b1, b2); // instantiate motor using pins specified in set-up below motor->setAccel(10,20); // set acceleration parameters LOG0("Configuring Motorized Window Shade with input pins: A1=%d, A2=%d, B1=%d, B2=%d\n",a1,a2,b1,b2); + LOG0("Initial Position: %d\n",current->getVal()); + motor->setPosition(current->getVal()*10); } /////////// boolean update(){ - // Move motor to absolute position, assuming 200 steps per revolution and 20 revolutions for full up/travel travel. + // Move motor to absolute position, assuming 200 steps per revolution and 5 revolutions for full up/travel travel, + // for a total of 1000 steps of full travel. + // Specify that motor should enter the BRAKE state upon reaching to desired position. - motor->moveTo(target->getNewVal()*20,5,Stepper_TB6612::BRAKE); + motor->moveTo(target->getNewVal()*10,5,Stepper_TB6612::BRAKE); LOG1("Setting Shade Position=%d\n",target->getNewVal()); return(true); } diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index d371102..7dba94b 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -45,14 +45,11 @@ void setup() { motor=new Stepper_TB6612(23,32,22,14); motor->setStepType(StepperControl::HALF_STEP); - motor->setAccel(10,10); - motor->setPosition(200); - motor->move(100,2); + motor->setAccel(10,30); + motor->move(400,2); while(motor->stepsRemaining()); - motor->setPosition(-200); + motor->setPosition(800); motor->moveTo(0,2,StepperControl::BRAKE); - while(motor->position()<-11); - motor->disable(); } ////////////////////////////////////// From 6bf1b0af900c937a0c0eeb42ed61e7f6b3f9b166 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Tue, 20 Jun 2023 21:38:28 -0500 Subject: [PATCH 052/151] Update RMT.md --- docs/RMT.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/RMT.md b/docs/RMT.md index 00ecc0f..5be3d6e 100644 --- a/docs/RMT.md +++ b/docs/RMT.md @@ -15,9 +15,9 @@ Signals are defined as a sequence of HIGH and LOW phases that together form a pu Since most RF/IR signals repeat the same train of pulses more than once, the duration of the last LOW phase should be extended to account for the delay between repeats of the pulse train. Pulse trains are encoded as sequential arrays of 32-bit words, where each 32-bit word represents an individual pulse using the following protocol: * bits 0-14: the duration, in *ticks* from 0-32767, of the first part of the pulse to be transmitted - * bit 15: indicates whether the first part of the pulse to be trasnmitted is HIGH (1) or LOW (0) + * bit 15: indicates whether the first part of the pulse to be transmitted is HIGH (1) or LOW (0) * bits 16-30: the duration, in *ticks* from 0-32767, of the second part of the pulse to be transmitted - * bit 31: indicates whether the second part of the pulse to be trasnmitted is HIGH (1) or LOW (0) + * bit 31: indicates whether the second part of the pulse to be transmitted is HIGH (1) or LOW (0) HomeSpan provides two easy methods to create, store, and transmit a pulse train. The first method relies on the fact that each instance of RFControl maintains its own internal memory structure to store a pulse train of arbitrary length. The functions `clear()`, `add()`, and `pulse()`, described below, allow you to create a pulse train using this internal memory structure. The `start()` function is then used to begin transmission of the full pulse train. This method is generally used when pulse trains are to be created on-the-fly as needed, since each RFControl instance can only store a single pulse train at one time. From 44b0a878ec6ef2715c5ac4258ef024d922943591 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Tue, 20 Jun 2023 21:45:23 -0500 Subject: [PATCH 053/151] Update Stepper.md --- docs/Stepper.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/Stepper.md b/docs/Stepper.md index dbe73ff..18874a3 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -1,5 +1,7 @@ # Stepper Motor Control +HomeSpan includes dedicated classes that provide integrated control of popular stepper motor driver boards. These classes spawn dedicated background tasks for each stepper motor allowing parallel background...background allow for the simultaneous operation of one or more stepper motors in the background without blocking HomeSpan's normal operation. + The ESP32 has an on-chip signal-generator peripheral designed to drive an RF or IR transmitter. HomeSpan includes an easy-to-use library that interfaces with this peripheral so that with a few additional electronic components you can create a HomeSpan device that controls an RF or IR appliance directly from the Home App on your iPhone, or via Siri. The library is accessed by placing the following near the top of your sketch: `#include "extras/RFControl.h"` From 0fa0579578de86f8775811701f16f71e96956ab1 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Wed, 21 Jun 2023 06:06:08 -0500 Subject: [PATCH 054/151] Update Stepper.md --- docs/Stepper.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 18874a3..a12a5ef 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -1,6 +1,8 @@ # Stepper Motor Control -HomeSpan includes dedicated classes that provide integrated control of popular stepper motor driver boards. These classes spawn dedicated background tasks for each stepper motor allowing parallel background...background allow for the simultaneous operation of one or more stepper motors in the background without blocking HomeSpan's normal operation. +HomeSpan includes dedicated classes that provide for easy control of stepper motors connected to an ESP32 via a stepper motor driver board. These classes allow stepper motors to operate smoothly and asynchronously in the background while HomeSpan continues to run in the foreground. On devices with dual processors, stepper-motor control can be run either on the same or a different processor from HomeSpan. To add stepper-motor control to your sketch, simply instantiate one or more of the classes below matching your motor driver board (or boards). + + The ESP32 has an on-chip signal-generator peripheral designed to drive an RF or IR transmitter. HomeSpan includes an easy-to-use library that interfaces with this peripheral so that with a few additional electronic components you can create a HomeSpan device that controls an RF or IR appliance directly from the Home App on your iPhone, or via Siri. The library is accessed by placing the following near the top of your sketch: From c5a40c6e3467acca5d24f6905b21848063d2f5a5 Mon Sep 17 00:00:00 2001 From: Gregg Date: Thu, 22 Jun 2023 21:25:18 -0500 Subject: [PATCH 055/151] Added ability to set cpu and priority for motor task using pair {} --- src/src/extras/StepperControl.cpp | 1 + src/src/extras/StepperControl.h | 2 +- src/src/extras/Stepper_A3967.h | 2 +- src/src/extras/Stepper_TB6612.h | 4 ++-- src/src/extras/extras.ino | 36 +++++++++++++++++++++++++------ 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/src/extras/StepperControl.cpp b/src/src/extras/StepperControl.cpp index 6992c16..5887d7e 100644 --- a/src/src/extras/StepperControl.cpp +++ b/src/src/extras/StepperControl.cpp @@ -34,6 +34,7 @@ StepperControl::StepperControl(uint32_t priority, uint32_t cpu){ upLinkQueue = xQueueCreate(1,sizeof(upLink_t)); downLinkQueue = xQueueCreate(1,sizeof(downLink_t)); xTaskCreateUniversal(motorTask, "motorTaskHandle", 8096, this, priority, &motorTaskHandle, cpu); + ESP_LOGI(STEPPER_TAG,"motor task started with priority %d on cpu %d",priority,cpu); } ////////////////////////// diff --git a/src/src/extras/StepperControl.h b/src/src/extras/StepperControl.h index b4b4f9e..e876bd8 100644 --- a/src/src/extras/StepperControl.h +++ b/src/src/extras/StepperControl.h @@ -89,7 +89,7 @@ class StepperControl { public: - StepperControl(uint32_t priority=2, uint32_t cpu=0); + StepperControl(uint32_t priority=1, uint32_t cpu=0); virtual void setStepType(int mode){}; void setAccel(float accelSize, float accelSteps); void move(int nSteps, uint32_t msDelay, endAction_t endAction=NONE); diff --git a/src/src/extras/Stepper_A3967.h b/src/src/extras/Stepper_A3967.h index 216859f..1dca3f6 100644 --- a/src/src/extras/Stepper_A3967.h +++ b/src/src/extras/Stepper_A3967.h @@ -53,7 +53,7 @@ struct Stepper_A3967 : StepperControl { ////////////////////////// - Stepper_A3967(int m1Pin, int m2Pin, int stepPin, int dirPin, int enablePin) : StepperControl(){ + Stepper_A3967(int m1Pin, int m2Pin, int stepPin, int dirPin, int enablePin, std::pair taskParams = {1,0}) : StepperControl(taskParams.first,taskParams.second){ this->m1Pin=m1Pin; this->m2Pin=m2Pin; this->stepPin=stepPin; diff --git a/src/src/extras/Stepper_TB6612.h b/src/src/extras/Stepper_TB6612.h index bf53133..2f243d1 100644 --- a/src/src/extras/Stepper_TB6612.h +++ b/src/src/extras/Stepper_TB6612.h @@ -60,7 +60,7 @@ struct Stepper_TB6612 : StepperControl { ////////////////////////// - Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2) : StepperControl(){ + Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, std::pair taskParams = {1,0}) : StepperControl(taskParams.first,taskParams.second){ ain1=AIN1; ain2=AIN2; @@ -77,7 +77,7 @@ struct Stepper_TB6612 : StepperControl { ////////////////////////// - Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB) : Stepper_TB6612(AIN1,AIN2,BIN1,BIN2){ + Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB, std::pair taskParams = {1,0}) : Stepper_TB6612(AIN1,AIN2,BIN1,BIN2,taskParams){ pwmA=new LedPin(PWMA,0,50000); pwmB=new LedPin(PWMB,0,50000); diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index 7dba94b..d6be4fc 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -41,15 +41,39 @@ void setup() { delay(1000); Serial.printf("\nHomeSpan Steppers\n\n"); -// motor=new Stepper_TB6612(23,32,22,14,33,27); + +// motor=new Stepper_TB6612(23,32,22,14,33,27,{1,1}); motor=new Stepper_TB6612(23,32,22,14); - motor->setStepType(StepperControl::HALF_STEP); - motor->setAccel(10,30); - motor->move(400,2); - while(motor->stepsRemaining()); + motor->setStepType(StepperControl::FULL_STEP_ONE_PHASE); + motor->setAccel(10,5); + + motor->enable(); + while(1); + + for(int i=0;i<100;i++){ + motor->disable(); + delay(10); + motor->enable(); + delay(10); + } + Serial.printf("Done\n"); + while(1); + + delay(1000); + for(int i=0;i<10;i++){ + motor->move(1,100); + while(motor->stepsRemaining()); + motor->move(-0,5); + while(motor->stepsRemaining()); + } + while(1); + + delay(100); + motor->move(-400,5,StepperControl::BRAKE); + while(1); motor->setPosition(800); - motor->moveTo(0,2,StepperControl::BRAKE); + motor->moveTo(0,5,StepperControl::BRAKE); } ////////////////////////////////////// From bb556f82615f434c06fc9aa52935f55dec8b147c Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Thu, 22 Jun 2023 22:02:15 -0500 Subject: [PATCH 056/151] Update Stepper.md --- docs/Stepper.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index a12a5ef..ad34916 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -1,9 +1,21 @@ # Stepper Motor Control -HomeSpan includes dedicated classes that provide for easy control of stepper motors connected to an ESP32 via a stepper motor driver board. These classes allow stepper motors to operate smoothly and asynchronously in the background while HomeSpan continues to run in the foreground. On devices with dual processors, stepper-motor control can be run either on the same or a different processor from HomeSpan. To add stepper-motor control to your sketch, simply instantiate one or more of the classes below matching your motor driver board (or boards). +HomeSpan includes dedicated classes that provide for easy control of stepper motors connected to an ESP32 via a stepper motor driver board. These classes allow stepper motors to operate smoothly and asynchronously in the background while HomeSpan continues to run in the foreground. On devices with dual processors, stepper-motor control can be run either on the same or a different processor from HomeSpan. HomeSpan natively supports the following driver chips: + +* Toshiba TB6612 (or equivalent), such as found on [Adafruit's TB6612 1.2A DC/Stepper Motor Driver Breakout Board](www.adafruit.com/product/2448) + +such as To add stepper-motor control to your sketch, simply instantiate one or more of the classes below matching your motor driver board (or boards). + +### *Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2 [, taskParams])* +### *Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB [,taskParams])* + +Create an instance the **Stepper_TB6612** class using either of the constructors above to control a stepper motor driven by a Toshiba TB6612, such as found on an [Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board](www.adafruit.com/product/2448). +### *Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB [,taskParams])* + +These two classes instantiate control for a stepper motor driven by a Toshiba TB6612, such as found on this [Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board](www.adafruit.com/product/2448) The ESP32 has an on-chip signal-generator peripheral designed to drive an RF or IR transmitter. HomeSpan includes an easy-to-use library that interfaces with this peripheral so that with a few additional electronic components you can create a HomeSpan device that controls an RF or IR appliance directly from the Home App on your iPhone, or via Siri. The library is accessed by placing the following near the top of your sketch: `#include "extras/RFControl.h"` From 5bd06ee370ceac0ef787072859f376da7526e8a5 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Fri, 23 Jun 2023 06:25:49 -0500 Subject: [PATCH 057/151] Update Stepper.md --- docs/Stepper.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index ad34916..5f76432 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -1,8 +1,22 @@ # Stepper Motor Control -HomeSpan includes dedicated classes that provide for easy control of stepper motors connected to an ESP32 via a stepper motor driver board. These classes allow stepper motors to operate smoothly and asynchronously in the background while HomeSpan continues to run in the foreground. On devices with dual processors, stepper-motor control can be run either on the same or a different processor from HomeSpan. HomeSpan natively supports the following driver chips: +HomeSpan includes dedicated classes that provide for easy control of stepper motors connected to an ESP32 via a stepper motor driver board. These classes allow stepper motors to operate smoothly and asynchronously in the background while HomeSpan continues to run in the foreground. On devices with dual processors, stepper-motor control can be run either on the same or a different processor from HomeSpan. -* Toshiba TB6612 (or equivalent), such as found on [Adafruit's TB6612 1.2A DC/Stepper Motor Driver Breakout Board](www.adafruit.com/product/2448) +The HomeSpan class that contains all the methods to control a stepper motor is called **StepperControl**. However, this is a virtual class and cannot be instantiated directly. Instead you instantiate one or more driver-specific child-classes that are derived from **StepperControl** and include all the logic needed to configure and operate a specific stepper motor driver chip: +HomeSpan supports the following stepper motor driver chips: + + +* **Stepper_TB6612** + * This class is used to operate stepper motors driven by a ***Toshiba TB6612*** chip, either with or without the use of ESP32 PWM pins + * Example driver board: [Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board](www.adafruit.com/product/2448) + * To use, add the following to the top of your sketch: `#include "extras/Stepper_TB6612.h"` + * Contructors: + * *Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2)* + +* **Stepper_A3967** + * This class is used to operate stepper motors driven by an ***Allegro A3967*** chip + * Example driver board: [Sparkfun EasyDriver - Stepper Motor Driver](https://www.sparkfun.com/products/12779) + * To use, add the following to the top of your sketch: `#include "extras/Stepper_A3967.h"` such as To add stepper-motor control to your sketch, simply instantiate one or more of the classes below matching your motor driver board (or boards). From fec2b3d9f7c542208ea39efc7332b49e45f1771c Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 24 Jun 2023 08:25:28 -0500 Subject: [PATCH 058/151] Update Stepper.md --- docs/Stepper.md | 49 ++++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 5f76432..2160ba6 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -1,47 +1,58 @@ # Stepper Motor Control -HomeSpan includes dedicated classes that provide for easy control of stepper motors connected to an ESP32 via a stepper motor driver board. These classes allow stepper motors to operate smoothly and asynchronously in the background while HomeSpan continues to run in the foreground. On devices with dual processors, stepper-motor control can be run either on the same or a different processor from HomeSpan. - -The HomeSpan class that contains all the methods to control a stepper motor is called **StepperControl**. However, this is a virtual class and cannot be instantiated directly. Instead you instantiate one or more driver-specific child-classes that are derived from **StepperControl** and include all the logic needed to configure and operate a specific stepper motor driver chip: -HomeSpan supports the following stepper motor driver chips: +HomeSpan includes dedicated classes that provide for easy control of a stepper motor connected to an ESP32 via a stepper motor driver board. These classes allow one or more stepper motors to operate smoothly and asynchronously in the background while HomeSpan continues to run in the foreground. On devices with dual processors, stepper-motor control can be run either on the same or a different processor from HomeSpan. +The HomeSpan class that contains all the methods to control a stepper motor is called **StepperControl**. However, this is a virtual class and cannot be instantiated directly. Instead you instantiate stepper motor objects using driver-specific child-classes (derived from **StepperControl**) that contain all the logic to configure and operate a particular driver board. Each child class supports one or more constructors allowing you to specify which output pins on your ESP32 device will be connected to the required pins on your driver board: * **Stepper_TB6612** - * This class is used to operate stepper motors driven by a ***Toshiba TB6612*** chip, either with or without the use of ESP32 PWM pins - * Example driver board: [Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board](www.adafruit.com/product/2448) + * This class is used to operate stepper motors driven by a [Toshiba TB6612](www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins * To use, add the following to the top of your sketch: `#include "extras/Stepper_TB6612.h"` * Contructors: - * *Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2)* + * *Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2)* - controls the driver board using only 4 digital pins + * *Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB)* - adds PWM control of the motor, allowing for additional stepping modes * **Stepper_A3967** - * This class is used to operate stepper motors driven by an ***Allegro A3967*** chip - * Example driver board: [Sparkfun EasyDriver - Stepper Motor Driver](https://www.sparkfun.com/products/12779) + * This class is used to operate stepper motors driven by an [Allegro A3967](https://www.sparkfun.com/products/12779) chip * To use, add the following to the top of your sketch: `#include "extras/Stepper_A3967.h"` + * Contructor: *Stepper_A3967(int M1, int M2, int STEP, int DIR, int ENABLE)* + +Click on either of the driver-specific classes above for complete details on how to wire and configure a particular driver board. -such as To add stepper-motor control to your sketch, simply instantiate one or more of the classes below matching your motor driver board (or boards). +## StepperControl Methods -### *Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2 [, taskParams])* -### *Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB [,taskParams])* +The **StepperControl** class provides the following methods to operate and control a stepper motor object instantiated with one of the driver-specific classes described above: -Create an instance the **Stepper_TB6612** class using either of the constructors above to control a stepper motor driven by a Toshiba TB6612, such as found on an [Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board](www.adafruit.com/product/2448). +* `void enable()` + + * enables current flow to the stepper motor coils, actively locking the position of the motor +* `void disable()` + + * disables current flow to the stepper motor coils and leaves in a state of high impedence, allowing the motor to turn freely +* `void brake()` + + * disables current flow to the stepper motor coils and leaves in a state of low impedence, creating "friction" that prevents the motor from freely turning + * applicable only for driver chips that support a "short brake" mode, otherwise has no effect -### *Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB [,taskParams])* +* `void move(int nSteps, uint32_t msDelay, endAction_t endAction=NONE)` + + * moves the stepper motor an absolute number of steps + + * *nSteps* - the number of steps to move. A positive number moves the motor in one direction; a negative number moved the motor in the opposite direction; a value of zero causes the motor to stop if it is already moving + * *msDelay* - the delay, in milliseconds, to pause between steps. Must be greater than zero. The lower the number, the faster the motor moves, subject to limitations of the motor itself + * *msDelay* -an optional action to be performed once the motor has finished moving *nStep* steps. Choices include in milliseconds, to pause between steps. Must be greater than zero. The lower the number, the faster the motor moves, subject to limitations of the motor itself + + * disables current flow to the stepper motor coils and leaves in a state of high impedence, allowing the motor to turn freely -These two classes instantiate control for a stepper motor driven by a Toshiba TB6612, such as found on this [Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board](www.adafruit.com/product/2448) -The ESP32 has an on-chip signal-generator peripheral designed to drive an RF or IR transmitter. HomeSpan includes an easy-to-use library that interfaces with this peripheral so that with a few additional electronic components you can create a HomeSpan device that controls an RF or IR appliance directly from the Home App on your iPhone, or via Siri. The library is accessed by placing the following near the top of your sketch: -`#include "extras/RFControl.h"` -.... -## *RFControl(int pin, boolean refClock=true)* Creating an instance of this **class** initializes the RF/IR signal generator and specifies the ESP32 *pin* to output the signal. You may create more than one instance of this class if driving more than one RF/IR transmitter (each connected to different *pin*), subject to the following limitations: ESP32 - 8 instances; ESP32-S2 and ESP32-S3 - 4 instances; ESP32-C3 - 2 instances. The optional parameter *refClock* is more fully described further below under the `start()` method. From d9de368a8adeede768df63fb7a70b1e1816b6d54 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 24 Jun 2023 15:48:02 -0500 Subject: [PATCH 059/151] Update Stepper.md --- docs/Stepper.md | 183 ++++++------------------------------------------ 1 file changed, 23 insertions(+), 160 deletions(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 2160ba6..23a7e32 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -8,13 +8,13 @@ The HomeSpan class that contains all the methods to control a stepper motor is c * This class is used to operate stepper motors driven by a [Toshiba TB6612](www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins * To use, add the following to the top of your sketch: `#include "extras/Stepper_TB6612.h"` * Contructors: - * *Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2)* - controls the driver board using only 4 digital pins - * *Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB)* - adds PWM control of the motor, allowing for additional stepping modes + * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2)` - controls the driver board using only 4 digital pins + * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB)` - adds PWM control of the motor, allowing for additional stepping modes * **Stepper_A3967** * This class is used to operate stepper motors driven by an [Allegro A3967](https://www.sparkfun.com/products/12779) chip * To use, add the following to the top of your sketch: `#include "extras/Stepper_A3967.h"` - * Contructor: *Stepper_A3967(int M1, int M2, int STEP, int DIR, int ENABLE)* + * Contructor: `Stepper_A3967(int M1, int M2, int STEP, int DIR, int ENABLE)` Click on either of the driver-specific classes above for complete details on how to wire and configure a particular driver board. @@ -23,170 +23,33 @@ Click on either of the driver-specific classes above for complete details on how The **StepperControl** class provides the following methods to operate and control a stepper motor object instantiated with one of the driver-specific classes described above: * `void enable()` - - * enables current flow to the stepper motor coils, actively locking the position of the motor + * enables current flow to the stepper motor coils, actively holding the motor in its position * `void disable()` - - * disables current flow to the stepper motor coils and leaves in a state of high impedence, allowing the motor to turn freely + * disables current flow to the stepper motor coils and leaves in a state of high impedence, allowing the motor to turn freely -* `void brake()` - - * disables current flow to the stepper motor coils and leaves in a state of low impedence, creating "friction" that prevents the motor from freely turning - * applicable only for driver chips that support a "short brake" mode, otherwise has no effect +* `void brake()` + * disables current flow to the stepper motor coils and leaves in a state of low impedence, creating "friction" that prevents the motor from freely turning + * applicable only for driver chips that support a "short brake" mode, otherwise has no effect * `void move(int nSteps, uint32_t msDelay, endAction_t endAction=NONE)` - - * moves the stepper motor an absolute number of steps - - * *nSteps* - the number of steps to move. A positive number moves the motor in one direction; a negative number moved the motor in the opposite direction; a value of zero causes the motor to stop if it is already moving + * enables the stepper motor and moves it *nSteps* steps. Note this is a **non-blocking** function and returns immediately after being called while the stepper turns for *nSteps* steps in the background + + * *nSteps* - the number of steps to move. A positive number moves the motor in one direction; a negative number moved the motor in the opposite direction; a value of zero causes the motor to *stop* if it is already moving * *msDelay* - the delay, in milliseconds, to pause between steps. Must be greater than zero. The lower the number, the faster the motor moves, subject to limitations of the motor itself - * *msDelay* -an optional action to be performed once the motor has finished moving *nStep* steps. Choices include in milliseconds, to pause between steps. Must be greater than zero. The lower the number, the faster the motor moves, subject to limitations of the motor itself - - * disables current flow to the stepper motor coils and leaves in a state of high impedence, allowing the motor to turn freely - - - - - - - - - - -Creating an instance of this **class** initializes the RF/IR signal generator and specifies the ESP32 *pin* to output the signal. You may create more than one instance of this class if driving more than one RF/IR transmitter (each connected to different *pin*), subject to the following limitations: ESP32 - 8 instances; ESP32-S2 and ESP32-S3 - 4 instances; ESP32-C3 - 2 instances. The optional parameter *refClock* is more fully described further below under the `start()` method. - -Signals are defined as a sequence of HIGH and LOW phases that together form a pulse train where you specify the duration, in *ticks*, of each HIGH and LOW phase, shown respectively as H1-H4 and L1-L4 in the following diagram: - -![Pulse Train](images/pulseTrain.png) - -Since most RF/IR signals repeat the same train of pulses more than once, the duration of the last LOW phase should be extended to account for the delay between repeats of the pulse train. Pulse trains are encoded as sequential arrays of 32-bit words, where each 32-bit word represents an individual pulse using the following protocol: - - * bits 0-14: the duration, in *ticks* from 0-32767, of the first part of the pulse to be transmitted - * bit 15: indicates whether the first part of the pulse to be trasnmitted is HIGH (1) or LOW (0) - * bits 16-30: the duration, in *ticks* from 0-32767, of the second part of the pulse to be transmitted - * bit 31: indicates whether the second part of the pulse to be trasnmitted is HIGH (1) or LOW (0) - -HomeSpan provides two easy methods to create, store, and transmit a pulse train. The first method relies on the fact that each instance of RFControl maintains its own internal memory structure to store a pulse train of arbitrary length. The functions `clear()`, `add()`, and `pulse()`, described below, allow you to create a pulse train using this internal memory structure. The `start()` function is then used to begin transmission of the full pulse train. This method is generally used when pulse trains are to be created on-the-fly as needed, since each RFControl instance can only store a single pulse train at one time. - -In the second method, you create one or more pulse trains in external arrays of 32-bit words using the protocol above. To begin transmission of a specific pulse train, call the `start()` function with a pointer reference to the external array containing that pulse train. This method is generally used when you want to pre-compute many different pulse trains and have them ready-to-transmit as needed. Note that this method requires the array to be stored in RAM, not PSRAM. - -Details of each function are as follows: - -* `void clear()` - - * clears the pulse train memory structure of a specific instance of RFControl - -* `void phase(uint32_t numTicks, uint8_t phase)` - - * appends either a HIGH or LOW phase to the pulse train memory buffer for a specific instance of RFControl - - * *numTicks* - the duration, in *ticks* of the pulse phase. Durations of greater than 32767 ticks allowed (the system automatically creates repeated pulses of a maximum of 32767 ticks each until the specified duration of *numTicks* is reached) + * *endAction* - an optional action to be performed *after* the motor has finished moving *nSteps* steps. Choices include: + * **StepperControl::NONE** - no action is taken; the stepper motor is left in the enabled state (this is the default) + * **StepperControl::DISABLE** - current to the stepper motor is disabled + * **StepperControl::BRAKE** - the stepper motor is placed in a brake state + * if this method is called while the stepper motor is moving, the number of steps to turn will be reset to the new *nSteps* value. It is okay to change the sign of *nSteps* to reverse the motor while it is moving, though this may not be desireable depending on what your motor is connected to in the real world + * calling this method with a value of *nSteps=0* causes the motor to stop, if it is moving. If the motor is not moving, calling this method with *nSteps=0* simply enables the motor and the immediately performs the *endAction* (if specified). + * example: `myMotor.move(200,5,StepperControl::BRAKE);` starts the motor turning for 200 steps with a delay of 5ms between steps. When the motor has completed all 200 steps, it is placed in the brake state where inductive "friction" holds it in place - * *phase* - set to 0 to create a LOW phase; set to 1 (or any non-zero number) to create a HIGH phase - - * repeated phases of the same type (e.g. HIGH followed by another HIGH) are permitted and result in a single HIGH or LOW phase with a duration equal to the sum of the *numTicks* specified for each repeated phase (this is helpful when generating Manchester-encoded signals) - -* `void add(uint32_t onTime, uint32_t offTime)` - - * appends a single HIGH/LOW pulse with duration *onTime* followed by *offTime* to the pulse train of a specific instance of RFControl. This is functionally equivalent to calling `phase(onTime,HIGH);` followed by `phase(offTime,LOW);` as defined above - -* `void enableCarrier(uint32_t freq, float duty=0.5)` - - * enables modulation of the pulse train with a "square" carrier wave. In practice this is only used for IR signals (not RF) - - * *freq* - the frequency, in Hz, of the carrier wave. If freq=0, carrier wave is disabled - - * *duty* - the duty cycle of the carrier wave, from 0-1. Default is 0.5 if not specified - - * RFControl will report an error if the combination of the specified frequency and duty cycle is outside the range of supported configurations - -* `void disableCarrier()` - - * disables the carrier wave. Equivalent to `enableCarrier(0);` - -* `void start(uint8_t _numCycles, uint8_t tickTime)` -* `void start(uint32_t *data, int nData, uint8_t nCycles, uint8_t tickTime)` - - * in the first variation, this starts the transmission of the pulse train stored in the internal memory structure of a given instance of RFControl that was created using the `clear()`, `add()`, and `phase()` functions above. In the second variation, this starts the transmission of the pulse train stored in an external array *data* containing *nData* 32-bit words. The signal will be output on the pin specified when RFControl was instantiated. Note this is a blocking call—the method waits until transmission is completed before returning. This should not produce a noticeable delay in program operations since most RF/IR pulse trains are only a few tens-of-milliseconds long - - * *numCycles* - the total number of times to transmit the pulse train (i.e. a value of 3 means the pulse train will be transmitted once, followed by 2 additional re-transmissions). This is an optional argument with a default of 1 if not specified. - - * *tickTime* - the duration, in ***clock units***, of a *tick*. This is an optional argument with a default of 1 *clock unit* if not specified. Valid range is 1-255 *clock units*, or set to 0 for 256 *clock units*. The duration of a *clock unit* is determined by the *refClock* parameter (the second, optional argument, in the RFControl constructor described above). If *refClock* is set to true (the default), RFControl uses the ESP32's 1 MHz Reference Clock for timing so that each *clock unit* equals 1𝛍s. If *refClock* is set to false, RFControl uses the ESP32's faster 80 MHz APB Clock so that each *clock unit* equals 0.0125𝛍s (1/80 of microsecond) - -* To aid in the creation of a pulse train stored in an external array of 32-bit words, RFControl includes the macro *RF_PULSE(highTicks,lowTicks)* that returns a properly-formatted 32-bit value representing a single HIGH/LOW pulse of duration *highTicks* followed by *lowTicks*. This is basically an analog to the `add()` function. For example, the following code snippet shows two ways of creating and transmitting the same 3-pulse pulse-train --- the only difference being that one uses the internal memory structure of RFControl, and the second uses an external array: - -```C++ - -RFControl rf(11); // create an instance of RFControl - -rf.clear(); // clear the internal memory structure -rf.add(100,50); // create pulse of 100 ticks HIGH followed by 50 ticks LOW -rf.add(100,50); // create a second pulse of 100 ticks HIGH followed by 50 ticks LOW -rf.add(25,500); // create a third pulse of 25 ticks HIGH followed by 500 ticks LOW -rf.start(4,1000); // start transmission of the pulse train; repeat for 4 cycles; one tick = 1000𝛍s - -uint32_t pulseTrain[] = {RF_PULSE(100,50), RF_PULSE(100,50), RF_PULSE(25,500)}; // create the same pulse train in an external array -rf.start(pulseTrain,3,4,1000); // start transmission using the same parameters -``` -#### Diagnostic Messages - -The **RFControl** class outputs *Warning \[W\]* messages to the Serial Monitor based on the *Core Debug Level* selected when compiling the sketch using the Arduino IDE. A non-fatal warning message is produced when insufficient Channel resources prevent the creation of a new RFControl object. Calls to the `start()` method for objects that failed to be properly created are silently ignored. - -## Example RFControl Sketch - -Below is a complete sketch that produces two different pulse trains with the signal output linked to the ESP32 device's built-in LED (rather than an RF or IR transmitter). For illustrative purposes the tick duration has been set to a very long 100𝛍s, and pulse times range from of 1000-10,000 ticks, so that the individual pulses are easily discernable on the LED. Note this example sketch is also available in the Arduino IDE under [*File → Examples → HomeSpan → Other Examples → RemoteControl*](../examples/Other%20Examples/RemoteControl). - -```C++ -/* HomeSpan Remote Control Example */ - -#include "HomeSpan.h" // include the HomeSpan library -#include "extras/RFControl.h" // include RF Control Library - -void setup() { - - Serial.begin(115200); // start the Serial interface - Serial.flush(); - delay(1000); // wait for interface to flush - - Serial.print("\n\nHomeSpan RF Transmitter Example\n\n"); - - RFControl rf(13); // create an instance of RFControl with signal output to pin 13 on the ESP32 - - rf.clear(); // clear the pulse train memory buffer - - rf.add(5000,5000); // create a pulse train with three 5000-tick high/low pulses - rf.add(5000,5000); - rf.add(5000,10000); // double duration of final low period - - Serial.print("Starting 4 cycles of three 500 ms on pulses..."); - - rf.start(4,100); // start transmission of 4 cycles of the pulse train with 1 tick=100 microseconds - - Serial.print("Done!\n"); - - delay(2000); - - rf.clear(); - - for(int i=1000;i<10000;i+=1000) - rf.add(i,10000-i); - rf.add(10000,10000); - - Serial.print("Starting 3 cycles of 100-1000 ms pulses..."); - - rf.start(3,100); // start transmission of 3 cycles of the pulse train with 1 tick=100 microseconds - - Serial.print("Done!\n"); - - Serial.print("\nEnd Example"); - -} // end of setup() - -void loop(){ - -} // end of loop() -``` +* `int stepsRemaining()` + * returns the number of steps remaining to turn + * may be positive or negative depending on the direction the motor is turning + * returns zero when the motor is not turning + * example: `myMotor.move(200,5,StepperControl::BRAKE); while(myMotor.stepsRemaining()!=0);` starts the motor turning and then waits until is completes all 200 steps --- From 740a56b9f80ca32f0fb4910d26616ef52191c215 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 24 Jun 2023 16:40:57 -0500 Subject: [PATCH 060/151] Update Stepper.md --- docs/Stepper.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 23a7e32..d49fed8 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -49,7 +49,35 @@ The **StepperControl** class provides the following methods to operate and contr * returns the number of steps remaining to turn * may be positive or negative depending on the direction the motor is turning * returns zero when the motor is not turning - * example: `myMotor.move(200,5,StepperControl::BRAKE); while(myMotor.stepsRemaining()!=0);` starts the motor turning and then waits until is completes all 200 steps + * example: `myMotor.move(200,5); while(myMotor.stepsRemaining()!=0); myMotor.move(-300,5);` starts the motor turning, waits until it completes all 200 steps, and then turns the motor in the opposite direction for 300 steps + +* `int position()` + * returns the absolute position of the stepper motor, which is defined as the cumulative sum of the all positive and negative steps turned since initial start-up + * can be called when the stepper motor is moving or when it is stopped + * example: `myMotor.move(-800,5); while(myMotor.stepsRemaining()); myMotor.move(200,5); while(myMotor.stepsRemaining()); Serial.print(myMotor.position())` would print a value of -600 after the motor finishes turning (first one direction for 800 steps, and then the other for 200 steps) + +* `void setPosition(int pos)` + * resets the current position counter to *pos* + * this method does *not* move the motor; it only resets the internal position counter as returned by `position()` + * this method can only be called when the motor is **not** moving (if called when the motor is turning it is ignored and the internal position counter is **not** changed) + * example: `myMotor.move(300,5); while(myMotor.stepsRemaining()); myMotor.setPosition(-200); myMotor.move(600,5); while(myMotor.stepsRemaining()); Serial.print(myMotor.position())` would print a value of +400 after the motor finishes turning + +* `void moveTo(int nPosition, uint32_t msDelay, endAction_t endAction=NONE)` + * enables the stepper motor and moves it to the position *nPosition*. Note this is a **non-blocking** function and returns immediately after being called while the stepper motor turns until it reaches *nPosition* + + * *nPosition* - the position to which the stepper move should move, where position is defined as the cumulative number of positive and negative steps the motor has turned since initial start-up, as returned by `position()` + * *msDelay* - the delay, in milliseconds, to pause between steps. Must be greater than zero. The lower the number, the faster the motor moves, subject to limitations of the motor itself + * *endAction* - an optional action to be performed *after* the motor has reached *nPosition*. Choices include: + * **StepperControl::NONE** - no action is taken; the stepper motor is left in the enabled state (this is the default) + * **StepperControl::DISABLE** - current to the stepper motor is disabled + * **StepperControl::BRAKE** - the stepper motor is placed in a brake state + * it is okay to call this method while the stepper motor is already turning; the motor will either continue turning in the same direction, or reverse direction, until it reaches the *nPosition* specified + * calls to `stepsRemaining()` after calling `moveTo()` work as expected - the value returned will be the number of steps remaining until the motor reaches the *nPosition* specified + * note that `moveTo(nPosition)` is mathematically the same as `move(nPosition-position())`, but the `moveTo()` method is more accurate since it computes the position of the motor directly inside the task that is actually controlling the motor + +* `void setAccel(float accelSize, float accelSteps)` + +* `void setStepType(int mode)` --- From df02332afed887e3328c6957fc3335024378d6fc Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 24 Jun 2023 22:16:06 -0500 Subject: [PATCH 061/151] Update Stepper.md --- docs/Stepper.md | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index d49fed8..7915da7 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -26,47 +26,47 @@ The **StepperControl** class provides the following methods to operate and contr * enables current flow to the stepper motor coils, actively holding the motor in its position * `void disable()` - * disables current flow to the stepper motor coils and leaves in a state of high impedence, allowing the motor to turn freely + * disables current flow to the stepper motor coils and leaves them in a state of high impedence, allowing the motor to turn freely * `void brake()` - * disables current flow to the stepper motor coils and leaves in a state of low impedence, creating "friction" that prevents the motor from freely turning + * disables current flow to the stepper motor coils but leaves them in a state of low impedence, preventing the motor from freely turning * applicable only for driver chips that support a "short brake" mode, otherwise has no effect * `void move(int nSteps, uint32_t msDelay, endAction_t endAction=NONE)` - * enables the stepper motor and moves it *nSteps* steps. Note this is a **non-blocking** function and returns immediately after being called while the stepper turns for *nSteps* steps in the background + * enables the stepper motor and turns it *nSteps* steps. Note this is a **non-blocking** function and returns immediately after being called while the motor turns for *nSteps* steps in the background - * *nSteps* - the number of steps to move. A positive number moves the motor in one direction; a negative number moved the motor in the opposite direction; a value of zero causes the motor to *stop* if it is already moving - * *msDelay* - the delay, in milliseconds, to pause between steps. Must be greater than zero. The lower the number, the faster the motor moves, subject to limitations of the motor itself + * *nSteps* - the number of steps to turn. A positive number turns the motor in one direction; a negative number turns the motor in the opposite direction; a value of zero causes the motor to *stop* if it is already turning + * *msDelay* - the delay, in milliseconds, to pause between steps. Must be greater than zero. The lower the number, the faster the motor turns, subject to limitations of the motor itself * *endAction* - an optional action to be performed *after* the motor has finished moving *nSteps* steps. Choices include: * **StepperControl::NONE** - no action is taken; the stepper motor is left in the enabled state (this is the default) * **StepperControl::DISABLE** - current to the stepper motor is disabled * **StepperControl::BRAKE** - the stepper motor is placed in a brake state - * if this method is called while the stepper motor is moving, the number of steps to turn will be reset to the new *nSteps* value. It is okay to change the sign of *nSteps* to reverse the motor while it is moving, though this may not be desireable depending on what your motor is connected to in the real world - * calling this method with a value of *nSteps=0* causes the motor to stop, if it is moving. If the motor is not moving, calling this method with *nSteps=0* simply enables the motor and the immediately performs the *endAction* (if specified). - * example: `myMotor.move(200,5,StepperControl::BRAKE);` starts the motor turning for 200 steps with a delay of 5ms between steps. When the motor has completed all 200 steps, it is placed in the brake state where inductive "friction" holds it in place + * if this method is called while the stepper motor is already turning, the number of steps to turn will be reset to the new *nSteps* value. It is okay to change the sign of *nSteps* to reverse the direction of motor while it is turning, though this may not be desireable depending on what your motor is connected to in the real world + * calling this method with a value of *nSteps=0* causes the motor to stop, if it is already turning. If the motor is not turning, calling this method with *nSteps=0* simply enables the motor and the immediately performs the *endAction* (if specified). + * example: `myMotor.move(200,5,StepperControl::BRAKE);` starts the motor turning for 200 steps with a delay of 5ms between steps. When the motor has completed all 200 steps, it is placed in the brake state. * `int stepsRemaining()` * returns the number of steps remaining to turn * may be positive or negative depending on the direction the motor is turning - * returns zero when the motor is not turning + * returns zero if the motor is not turning * example: `myMotor.move(200,5); while(myMotor.stepsRemaining()!=0); myMotor.move(-300,5);` starts the motor turning, waits until it completes all 200 steps, and then turns the motor in the opposite direction for 300 steps * `int position()` * returns the absolute position of the stepper motor, which is defined as the cumulative sum of the all positive and negative steps turned since initial start-up - * can be called when the stepper motor is moving or when it is stopped - * example: `myMotor.move(-800,5); while(myMotor.stepsRemaining()); myMotor.move(200,5); while(myMotor.stepsRemaining()); Serial.print(myMotor.position())` would print a value of -600 after the motor finishes turning (first one direction for 800 steps, and then the other for 200 steps) + * can be called when the stepper motor is turning or when it is stopped + * example: `myMotor.move(-800,5); while(myMotor.stepsRemaining()); myMotor.move(200,5); while(myMotor.stepsRemaining()); Serial.print(myMotor.position())` would print a value of -600 after the motor finishes turning (first one direction for 800 steps, and then the other for 200 steps) * `void setPosition(int pos)` * resets the current position counter to *pos* - * this method does *not* move the motor; it only resets the internal position counter as returned by `position()` - * this method can only be called when the motor is **not** moving (if called when the motor is turning it is ignored and the internal position counter is **not** changed) + * this method does *not* turn the motor; it only resets the internal position counter as returned by `position()` + * this method is only effective when the motor is **not** turning (if called when the motor is turning the internal position counter remainms unchanged) * example: `myMotor.move(300,5); while(myMotor.stepsRemaining()); myMotor.setPosition(-200); myMotor.move(600,5); while(myMotor.stepsRemaining()); Serial.print(myMotor.position())` would print a value of +400 after the motor finishes turning * `void moveTo(int nPosition, uint32_t msDelay, endAction_t endAction=NONE)` - * enables the stepper motor and moves it to the position *nPosition*. Note this is a **non-blocking** function and returns immediately after being called while the stepper motor turns until it reaches *nPosition* + * enables the stepper motor and turns it to the position *nPosition*. Note this is a **non-blocking** function and returns immediately after being called while the stepper motor turns until it reaches *nPosition* - * *nPosition* - the position to which the stepper move should move, where position is defined as the cumulative number of positive and negative steps the motor has turned since initial start-up, as returned by `position()` - * *msDelay* - the delay, in milliseconds, to pause between steps. Must be greater than zero. The lower the number, the faster the motor moves, subject to limitations of the motor itself + * *nPosition* - the position to which the stepper move should turn, where position is defined as the cumulative number of positive and negative steps the motor has turned since initial start-up, as returned by `position()` + * *msDelay* - the delay, in milliseconds, to pause between steps. Must be greater than zero. The lower the number, the faster the motor turns, subject to limitations of the motor itself * *endAction* - an optional action to be performed *after* the motor has reached *nPosition*. Choices include: * **StepperControl::NONE** - no action is taken; the stepper motor is left in the enabled state (this is the default) * **StepperControl::DISABLE** - current to the stepper motor is disabled @@ -75,8 +75,12 @@ The **StepperControl** class provides the following methods to operate and contr * calls to `stepsRemaining()` after calling `moveTo()` work as expected - the value returned will be the number of steps remaining until the motor reaches the *nPosition* specified * note that `moveTo(nPosition)` is mathematically the same as `move(nPosition-position())`, but the `moveTo()` method is more accurate since it computes the position of the motor directly inside the task that is actually controlling the motor -* `void setAccel(float accelSize, float accelSteps)` - +* `void setAccel(float accelSize, float accelSteps)` + * adds an additional set of delays between steps so that the motor gradually accelerates when it starts and decelerates when it stops + * *accelSize* - the maximum size of the additional delay, expressed as a factor to be multiplied by the *msDelay* parameter used in `move()` and `moveTo()`. Must be a value greater or equal to 0.0. The larger the value, the greater the magnitude of the acceleration and deceleration. A value of zero yields no acceleration/deceleration + * *accelSteps* - the number of steps over which the *accelSize* factor exponentially decays so that the motor begins turning at the full speed specified by the *msDelay* parameter. Must be a value greater or equal to 1.0. The larger the value, the longer the acceleration and deceleration period + * example: `myMotor.setAccel(10,20); myMotor.move(200,5);` adds an additional 50ms delay (=10*5ms) after the first step, an additional 47ms after the second step, an additional 45ms after the third step, and so forth, until at step 82 the additional has fully decayed and the delay between steps remains fixed at the 5ms *msDelay* parameter specified. Then, starting at step 118 an additional delay of 1ms is added, at step 134 this increases to 2ms, and so forth, until the additional delay reaches 50ms once again at step 199 just before the motor stops turning at step 200 + * `void setStepType(int mode)` --- From bd1149f088f1fa3598f699cf3db13f3fe124dd94 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 24 Jun 2023 22:38:06 -0500 Subject: [PATCH 062/151] Update Stepper.md --- docs/Stepper.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 7915da7..c78519f 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -5,7 +5,7 @@ HomeSpan includes dedicated classes that provide for easy control of a stepper m The HomeSpan class that contains all the methods to control a stepper motor is called **StepperControl**. However, this is a virtual class and cannot be instantiated directly. Instead you instantiate stepper motor objects using driver-specific child-classes (derived from **StepperControl**) that contain all the logic to configure and operate a particular driver board. Each child class supports one or more constructors allowing you to specify which output pins on your ESP32 device will be connected to the required pins on your driver board: * **Stepper_TB6612** - * This class is used to operate stepper motors driven by a [Toshiba TB6612](www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins + * This class is used to operate stepper motors driven by a [Toshiba TB6612](https://www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins * To use, add the following to the top of your sketch: `#include "extras/Stepper_TB6612.h"` * Contructors: * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2)` - controls the driver board using only 4 digital pins @@ -77,9 +77,11 @@ The **StepperControl** class provides the following methods to operate and contr * `void setAccel(float accelSize, float accelSteps)` * adds an additional set of delays between steps so that the motor gradually accelerates when it starts and decelerates when it stops - * *accelSize* - the maximum size of the additional delay, expressed as a factor to be multiplied by the *msDelay* parameter used in `move()` and `moveTo()`. Must be a value greater or equal to 0.0. The larger the value, the greater the magnitude of the acceleration and deceleration. A value of zero yields no acceleration/deceleration - * *accelSteps* - the number of steps over which the *accelSize* factor exponentially decays so that the motor begins turning at the full speed specified by the *msDelay* parameter. Must be a value greater or equal to 1.0. The larger the value, the longer the acceleration and deceleration period - * example: `myMotor.setAccel(10,20); myMotor.move(200,5);` adds an additional 50ms delay (=10*5ms) after the first step, an additional 47ms after the second step, an additional 45ms after the third step, and so forth, until at step 82 the additional has fully decayed and the delay between steps remains fixed at the 5ms *msDelay* parameter specified. Then, starting at step 118 an additional delay of 1ms is added, at step 134 this increases to 2ms, and so forth, until the additional delay reaches 50ms once again at step 199 just before the motor stops turning at step 200 + * *accelSize* - the maximum size of the additional delay, expressed as a factor to be multiplied by the *msDelay* parameter used in `move()` and `moveTo()`. Must be a value greater or equal to 0. The larger the value, the greater the magnitude of the acceleration and deceleration. A value of zero yields no acceleration/deceleration + * *accelSteps* - the number of steps over which the *accelSize* factor exponentially decays, at which point he motor begins turning at the full speed specified by the *msDelay* parameter. Must be a value greater or equal to 1. The larger the value, the longer the acceleration and deceleration period + * example: `myMotor.setAccel(10,20); myMotor.move(200,5);` adds an additional 50ms delay (=10\*5ms) after the first step, an additional 47ms after the second step, an additional 45ms after the third step, and so forth, until at step 82 the additional delay has fully decayed and the delay between steps remains fixed at the 5ms *msDelay* parameter specified. Then, starting at step 118 an additional delay of 1ms is added, at step 134 this increases to 2ms, and so forth, until the additional delay reaches 50ms once again at step 199 just before the motor stops turning at step 200 + * for reference, the total delay between each step equals the sum of *msDelay* plus two exponential curves as follows: + * msDelay \* accelSize \* \[ exp(-abs(nSteps-stepsRemaining)/accelSteps) + exp(-(abs(stepsRemaining)-1)/accelSteps) \] * `void setStepType(int mode)` From 81b725e7a580f01b0e1a155ffea55d861200352b Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sun, 25 Jun 2023 05:39:17 -0500 Subject: [PATCH 063/151] Update Stepper.md --- docs/Stepper.md | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index c78519f..3882503 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -7,14 +7,19 @@ The HomeSpan class that contains all the methods to control a stepper motor is c * **Stepper_TB6612** * This class is used to operate stepper motors driven by a [Toshiba TB6612](https://www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins * To use, add the following to the top of your sketch: `#include "extras/Stepper_TB6612.h"` - * Contructors: - * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2)` - controls the driver board using only 4 digital pins - * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB)` - adds PWM control of the motor, allowing for additional stepping modes + * Constructor 1: `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2)` + * controls the driver board using only 4 digital pins from the ESP32 + * does not provide ability to microstep the motor + * Constructor 2: `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB)` + * controls the driver board using 4 digital pins and 2 PWM pins from the ESP32 + * the addition of the PWM pins provides the ability to microstep the motor * **Stepper_A3967** * This class is used to operate stepper motors driven by an [Allegro A3967](https://www.sparkfun.com/products/12779) chip * To use, add the following to the top of your sketch: `#include "extras/Stepper_A3967.h"` * Contructor: `Stepper_A3967(int M1, int M2, int STEP, int DIR, int ENABLE)` + * controls the driver board using 5 digital pins from the ESP32 + * microstepping is built into the driver board (separate ESP32 PWM pins are not needed) Click on either of the driver-specific classes above for complete details on how to wire and configure a particular driver board. @@ -38,6 +43,7 @@ The **StepperControl** class provides the following methods to operate and contr * *nSteps* - the number of steps to turn. A positive number turns the motor in one direction; a negative number turns the motor in the opposite direction; a value of zero causes the motor to *stop* if it is already turning * *msDelay* - the delay, in milliseconds, to pause between steps. Must be greater than zero. The lower the number, the faster the motor turns, subject to limitations of the motor itself * *endAction* - an optional action to be performed *after* the motor has finished moving *nSteps* steps. Choices include: + * **StepperControl::NONE** - no action is taken; the stepper motor is left in the enabled state (this is the default) * **StepperControl::DISABLE** - current to the stepper motor is disabled * **StepperControl::BRAKE** - the stepper motor is placed in a brake state @@ -68,6 +74,7 @@ The **StepperControl** class provides the following methods to operate and contr * *nPosition* - the position to which the stepper move should turn, where position is defined as the cumulative number of positive and negative steps the motor has turned since initial start-up, as returned by `position()` * *msDelay* - the delay, in milliseconds, to pause between steps. Must be greater than zero. The lower the number, the faster the motor turns, subject to limitations of the motor itself * *endAction* - an optional action to be performed *after* the motor has reached *nPosition*. Choices include: + * **StepperControl::NONE** - no action is taken; the stepper motor is left in the enabled state (this is the default) * **StepperControl::DISABLE** - current to the stepper motor is disabled * **StepperControl::BRAKE** - the stepper motor is placed in a brake state @@ -83,7 +90,19 @@ The **StepperControl** class provides the following methods to operate and contr * for reference, the total delay between each step equals the sum of *msDelay* plus two exponential curves as follows: * msDelay \* accelSize \* \[ exp(-abs(nSteps-stepsRemaining)/accelSteps) + exp(-(abs(stepsRemaining)-1)/accelSteps) \] -* `void setStepType(int mode)` +* `void setStepType(int mode)` + * sets the step type of the motor to one of the following *mode* enumerations: + + * **StepperControl::FULL_STEP_ONE_PHASE** (0) + * **StepperControl::FULL_STEP_TWO_PHASE** (1) + * **StepperControl::HALF_STEP** (2) + * **StepperControl::QUARTER_STEP** (4) + * **StepperControl::EIGHTH_STEP** (8) + * *mode* can be specified using either the name of the enumeration or its integer equivalent + * smaller step types provide for smother operation of the motor, but require more steps (and therefore more time) to turn a complete revolution + * the quarter- and eighth-step modes require microstepping PWM functionality (either provided by the ESP32, or built into the driver chip) + * it is possible, though not recommended, to change the step type *mode* while the motor is turning + * see Stepper Motor Modes for a brief primer on how stepper motors are typically driven --- From a08906450620703a588a38f87672882675eccbcc Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sun, 25 Jun 2023 05:43:09 -0500 Subject: [PATCH 064/151] Update Stepper.md --- docs/Stepper.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Stepper.md b/docs/Stepper.md index 3882503..fe43630 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -100,6 +100,7 @@ The **StepperControl** class provides the following methods to operate and contr * **StepperControl::EIGHTH_STEP** (8) * *mode* can be specified using either the name of the enumeration or its integer equivalent * smaller step types provide for smother operation of the motor, but require more steps (and therefore more time) to turn a complete revolution + * not all *modes* are supported by all driver chips * the quarter- and eighth-step modes require microstepping PWM functionality (either provided by the ESP32, or built into the driver chip) * it is possible, though not recommended, to change the step type *mode* while the motor is turning * see Stepper Motor Modes for a brief primer on how stepper motors are typically driven From 9eeace389b4fb475046be1c1a6ebde2bc397ae8d Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sun, 25 Jun 2023 06:36:43 -0500 Subject: [PATCH 065/151] Update Stepper.md --- docs/Stepper.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index fe43630..5516069 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -84,11 +84,16 @@ The **StepperControl** class provides the following methods to operate and contr * `void setAccel(float accelSize, float accelSteps)` * adds an additional set of delays between steps so that the motor gradually accelerates when it starts and decelerates when it stops + * *accelSize* - the maximum size of the additional delay, expressed as a factor to be multiplied by the *msDelay* parameter used in `move()` and `moveTo()`. Must be a value greater or equal to 0. The larger the value, the greater the magnitude of the acceleration and deceleration. A value of zero yields no acceleration/deceleration + * *accelSteps* - the number of steps over which the *accelSize* factor exponentially decays, at which point he motor begins turning at the full speed specified by the *msDelay* parameter. Must be a value greater or equal to 1. The larger the value, the longer the acceleration and deceleration period - * example: `myMotor.setAccel(10,20); myMotor.move(200,5);` adds an additional 50ms delay (=10\*5ms) after the first step, an additional 47ms after the second step, an additional 45ms after the third step, and so forth, until at step 82 the additional delay has fully decayed and the delay between steps remains fixed at the 5ms *msDelay* parameter specified. Then, starting at step 118 an additional delay of 1ms is added, at step 134 this increases to 2ms, and so forth, until the additional delay reaches 50ms once again at step 199 just before the motor stops turning at step 200 - * for reference, the total delay between each step equals the sum of *msDelay* plus two exponential curves as follows: - * msDelay \* accelSize \* \[ exp(-abs(nSteps-stepsRemaining)/accelSteps) + exp(-(abs(stepsRemaining)-1)/accelSteps) \] + + * the total delay between steps (when *stepsRemaining* is not zero) is given by the following formula: + $$totalDelay = msDelay \times (1 + accelSize \times (e^{\frac{-\mid nSteps-stepsRemaining \mid}{accelSteps}} + e^{\frac{-(\mid stepsRemaining \mid - 1)}{accelSteps}}))$$ + + * example: `myMotor.setAccel(10,20); myMotor.move(200,5);` yields a 55ms delay after the first step, a 52ms delay after the second step, a 50ms delay after the third step, and so forth, until at step 82 the additional delay has fully decayed such that the delay between steps remains fixed at the 5ms *msDelay* parameter specified. Then, starting at step 118 (with 82 steps remaining) the delay increases to 6ms; at step 134 it further increases to 7ms, and so forth, until the delay reaches its maxmimum of 55ms once again at step 199 just before the motor stops turning at step 200 + * `void setStepType(int mode)` * sets the step type of the motor to one of the following *mode* enumerations: From c904b11126f97756badac0b81882a5a4dff4306b Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sun, 25 Jun 2023 20:38:54 -0500 Subject: [PATCH 066/151] Update Stepper.md --- docs/Stepper.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 5516069..96fbb4f 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -93,20 +93,19 @@ The **StepperControl** class provides the following methods to operate and contr $$totalDelay = msDelay \times (1 + accelSize \times (e^{\frac{-\mid nSteps-stepsRemaining \mid}{accelSteps}} + e^{\frac{-(\mid stepsRemaining \mid - 1)}{accelSteps}}))$$ * example: `myMotor.setAccel(10,20); myMotor.move(200,5);` yields a 55ms delay after the first step, a 52ms delay after the second step, a 50ms delay after the third step, and so forth, until at step 82 the additional delay has fully decayed such that the delay between steps remains fixed at the 5ms *msDelay* parameter specified. Then, starting at step 118 (with 82 steps remaining) the delay increases to 6ms; at step 134 it further increases to 7ms, and so forth, until the delay reaches its maxmimum of 55ms once again at step 199 just before the motor stops turning at step 200 - - + * `void setStepType(int mode)` * sets the step type of the motor to one of the following *mode* enumerations: - - * **StepperControl::FULL_STEP_ONE_PHASE** (0) + + * **StepperControl::FULL_STEP_ONE_PHASE** (0) * **StepperControl::FULL_STEP_TWO_PHASE** (1) * **StepperControl::HALF_STEP** (2) * **StepperControl::QUARTER_STEP** (4) - * **StepperControl::EIGHTH_STEP** (8) + * **StepperControl::EIGHTH_STEP** (8) * *mode* can be specified using either the name of the enumeration or its integer equivalent - * smaller step types provide for smother operation of the motor, but require more steps (and therefore more time) to turn a complete revolution + * smaller step types provide for smoother operation of the motor, but require more steps to turn a complete revolution * not all *modes* are supported by all driver chips - * the quarter- and eighth-step modes require microstepping PWM functionality (either provided by the ESP32, or built into the driver chip) + * the quarter- and eighth-step modes require microstepping PWM functionality (either via ESP32 pins, or onboard the driver chip) * it is possible, though not recommended, to change the step type *mode* while the motor is turning * see Stepper Motor Modes for a brief primer on how stepper motors are typically driven From bc2672d862973d5e587d40ffa644577e274d7997 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sun, 25 Jun 2023 21:47:17 -0500 Subject: [PATCH 067/151] Create StepperModes.md --- docs/StepperModes.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/StepperModes.md diff --git a/docs/StepperModes.md b/docs/StepperModes.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/docs/StepperModes.md @@ -0,0 +1 @@ + From 9bfc07041d248d7a5830624578c0878daf3db374 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 25 Jun 2023 21:50:10 -0500 Subject: [PATCH 068/151] Creating Stepper Motor images --- docs/images/fullStepTwoPhase.png | Bin 0 -> 10805 bytes documents/HomeSpanDiagrams.key | Bin 630443 -> 682221 bytes src/src/extras/extras.ino | 31 ++----------------------------- 3 files changed, 2 insertions(+), 29 deletions(-) create mode 100644 docs/images/fullStepTwoPhase.png diff --git a/docs/images/fullStepTwoPhase.png b/docs/images/fullStepTwoPhase.png new file mode 100644 index 0000000000000000000000000000000000000000..faa4075597a377535561326fc7f5b3ed19c84ba3 GIT binary patch literal 10805 zcmeIXby!qy_cuC(q;!{*v@moxLwCuL0)jAfhqNLLC7^VtG)Q+UUD7Q|IuexJ@)>?Z!+R~Tr( z?|QDB3cX>X{+S&94X@ zw)@&_ZT;QaSau(~*=psx!visV;3Tx}*#TK$GOZQUN!iI-5|Z$tYIWh;A~6QPa(9!D z9vI-JYh=6gzW#b~_sz8cOo(F%vN!aEG`(pDrr;Td1+PYWIoNzGeZYk|jPIYH{zm&pE#_fraI)&a*TT)*#9JgFv7Qi?e+@&wh@ z{gbc|qo{{ycu90rq4v5l; z-lGwR37u-X7;rA{Mq{L+HKvG{pq`?iA`6Jv+vAwTM=`a@4}Wvf!(r42)V9;t-><3B zFN=;Od_@WRn~xypqygzmf(#m53f9^N$#s6eMfS--8<0jP2N9VgIfO8}Jj&`KLk-5q zN3xV=fMN&-aqCXDg(K zeuI@6JSJz5`{dV?X*?V`=Ugy1GIN&|lvXg@rrRS0DZGd02w50sEac=TgO7yCqq!dR zpRX>&{b@RIhJTP9u_Dvy;S+}v^pMIZauX21pF-GWqoEP3GI|Vl1TkKecY?x2P zMKpv_S&4m;6cO=Qp^rgifO6K;5nbeBX z?k!fCmYjB-W}0@KrrSZGjQNxUvla5-7A44hZx+TScPK5CJD%(J4ds{iW3>FY)qOq| z4BQUUsJhV$VIpvmC`9jLOGyj;&tXtS2RcDaj<2Ma9Mz}ueDh{|_+F2T-t&F&{lVa3 zvaGX=wrplXb%5rCFBCS{HFacmLGCXaDA0km3hxXJf(I4l(iq%sXGp*i8}&2EYpX@v37C%)cg$m zHT*;TI|7w<;!|I3)9le~-2|fe&uz`VQPa^YF+XLFkTa57RBeG!KFuHG=Z(tH;9{a> z@Qzok7_npPDQ6mglX|%a!OpigrFpyYcC> znJrkdtq^Q=_BKy$2J_qCw}pbKyb~p|68l0i1MlhsjTO}vu+0aX*JB$a&r*G@wgM!e z<0@bk=hW{{+BMp>15j@00^)B4Z?LbxIIL(LXb3bCG@Hj^ILcw)!;rsVeW?u_FEP?X z6ZmK(->yW%Gs%Y~_4GWW zg}$Utj9$Dl9u*ytOq&{6ADv5UOp(fmO+oAYjZpS;A5HZ1GxX=pt|c)oesD^)X#P^O zgw^0yy=FWEUHKeVVOsHMR;=95K}+yJP&VBtU917sILtB2@vUPgO)u9-<+sY-gPCVj zhRU^qqdO_5E8lx1rvj^PP|(%G@xx`q1;ZQPKYvf%PuXv*0V$F$($}caaL%a6^c@q+ zJZyPz6O>JRnb@XnPW0_(^SpVTTVD*+d*FPv)mhx+Qtt9^5 zr|qonbmXY~++Q$VFkQ&+a1ROm65KH71Wpy25nH&naZZhm$6G3z-Hxb=0MB`6AL4)c z5I-h7;InCS$Z{rja2}87Ht81Mjy=LV2LC?9`t}%(Q;h3FZA+a(I*%_*xItL=?3W2Q zyD-0x?h#FrWYm|^mocGD@5(Wn$yG37a4T>F2w#yfXg4Xh{rQla_cs)F^uc5!BcQm#v z>YDtJ_QeyhYD(f~hM%wVobu?Z1u#DnC)a^t9%fx_oF{18ts~&9)yCik^T9V|*q&ss zxWwC)90~j;Cam<_{M`bM4ZKiWlO)o5R2H&$do0`<+{|18nn{)|vdF43gc5cVjk2zu zjdD1;FLJMjzZeW+Gsh}@j{FdLZcOUfY=kgr zw&w^e^C&B4FE8~>M>NDNbv!>QbDq1H;dh){>TtU5r&*?H7YpzfJeXY7Z`mClf0KQ9 zfV;S2VsB>LjNZ=TJU-R#>L(VMd#BT=>HPxH;e7q>+8R9%*QDINtgLLVZ1o#RNQo*8 zZ%k@FVBk*6KHqWufLTQsVc`OOeQ{Ye*m*{SDKQzC5Lov+Wubb%U%6j3EqAMMl#%l< zsiD24{dhzi(LV5C^=mF>E(Z<$(i??UOi_*f7$?r8kV+5o`jhc%dH4jjjlM`$FVz(1 z@^iMgnXHxTomq>U$kFjTT!sDx4l@G{)6=HcYm_%e!=7`yqnTWp{Xy=R`##C`1}8X; zR23@+D~=Mieq(>G{$zC`f=-S(XDfCax0eqPQTwfaHn%hjrUxrF=e&pQ&Dq{TdotZ} z(_cO)?!>aw?n+eNtQ?;+rRfaV?uy7T*iPvbb$^&NcBbG{sA5Sw={L6`FOG=(j{bxWmcKRc&5KAS?>vb!>AM zmd&)uR-#1{3)@Qr6~j{ph@Xp%@&|E3j?SV1TcjFK4-L8k?tx@<<&>3yUiYP&wY8JGt+R&(sO~c`fa#)S z=nevrGTk>MWu2!-fc{yS9@GP>t|t1@*^$e_%GuJI%g52>UJppzM-(6(tvxL0d>kE| z+(msP7#=u80s4Lz%s}_R;$bhr09DtblXG^nrW54i=Hh0M#G<346L+(EC8`5a_?I~F zPlCbL!^1@s4EFZ+=JMv_a(1%;^N5IufVp|Wyu6$M2dBHQlZS;5r;|J5KT7^b55(I2 zr5nt}1Lo{RcdysN(%I8Pf`Q@Q(7&&L{IvFg{l}7%`@g0IOb~p32h7984gR-oKvevG zR8$M*W9?uFfjI(e2H23~72pdnX1vm{S^J3siucf;XSf+KcofY$lp>wwd}?e zd&WQyebue=#QYT0pr6&>GxcV~p62mu?Rm1n?s_J z{y)m>6WtZGdedCz->I6GeEX|Tug9_7v{U!U;jA2Wj|q}9_E^CL7i2p9nCbu zFz0$qu1ynV5LLOl=dWS(eV#6Vw%s^tE8MYm?kjcu>$i376lNn9Vub540b#E8s4Wfc z)f3T$-j-@f)1@*X#!|Fi^7@HZ+fQ}v9g-%DMi&`%6pUC?e=VOHDwhb?3MovJuAxVF zjHUMd?V(X+>duMtM&)KWd>YXp7cfg4NP6&Hne)775^ehh7;oT5j-is(LRyShYrs=N z%#+pfqJ7fFAG2bMA9-K;SH9seI?nbVse>&|t1Q_rY?(4H=(mdV-wJWS5sRG1Mb5dG z!PTz=iWR0?2lfzY5_t_mWu1x%HVz*3k23=owxhEQ8^Q*)ZWFo3dex{*PaIzfJR|MQ zm(V_gvNOQS&3fRLOg2YWIucaYIp?dFkto@waaPv`Ogw>>f#03@vhC74&cFDls*veO z>@uy)rTg-wv)*I}?pZQBj_fV3w(KNNwz7I5EXig_8%M z?*!<@+M5bSu{q3a;|`K3-35>(R{3~dTy}ls-%5f>kmdXQoikHPOBqLv6wvvpH;zWJ zchl46P&5(>H6>D*3&SK@X$XB<&Tm< zZR3i`yK0X+)%Zem+7xN#lnIV_a(>s38gfM*voTngooAT}2s5p$%JXaW5xgfUaTK4p z4hh$)is@dxcU;cq$!p^HoA6iXu#*$f>dh3-KXqhobTxi!`a!pY3rAP#j_*`` z+Z7Qk(05SRi2Y`B`mk00V8v6nAhZ5zJmW){O_9p+!g~is!7UY{6ZAqMQQ1MTx<=6D zh`&R_Nn%7Iw@CB0|I=En&np^yH0vLD?RDHjpGP@A;jX^*fOQEv+}fNqsYKkxR4Fa+ zVEZM!?p*ryx}TyfGnzJwrzLRom#AY4xppQ`-LvZw{&qc)brT1wDTLjWpc-w~Wjcl8 zRDr8qxUo=rLA|}Tz9lZX^4;GO>kMBjrS#2mq=nO;7v9m%afU>k@jqgtEBlaE7;78T z?F*s)t=^_iBPQ3bL4EMGN|&y`uf;kYxu`Gn)p3iWrxRH<3Sy^|o17ZA;ft~z(A;tA zH2Z)|_aIjq-I)<=#!}`{@;Z`tY!DvhKIu|vHmK>+GJ5oA$d0~F)3|>z%+p}hRltgg zT41^t&Ro6CZC^>Ialt}{P;uX7YF+quZ1|tl zoyZ>>+kKUy9pK!^-xS(zM2&V1;zQ6_X#D9XUG<+^fu5CD9yn&6RPL#wx zrT+)%OY*r+!c7-EuRwDz60?|>VJuu<+|0I16EKzC@~w>UeoWpEGtGn3wYa~9T!Gl$ zcRiarylkzcn%Q){#QbwPcb<70>plgNdUnR(Ol`NKcc}sZrIad^k#B-a2UF$TwIB0X zh5<{9g~Us5r$`sClm@QDo#hHv$&wmjtzranRde&@;FBwjs%%ZUKGNo>Z` zII~UuLKI@3aC#ps$G=6#8*1^~Wp_y2DJ0aghES(*ctW)*$AF_og5k9@&1U%7JVY&B zR6p?gyWjDdvGZWt<;mtB#1u)L$_yQ<2L(a+)|+UYp;xcKN>h$-T$&FR#*Hms z+&{8tCf(i!ig+JnjHL1vy-6xDVn;GnDA;yMWHwc$*>&X#CrB)DVo&_Qru%8&?%;c3 zEZ8J&q1I;jcyoC3YXs3`dx`Pct%Y+cr!FT3l6vx`U0OzSt!$jP%uRAHd}#WpD+Hw` z@XKr8->u*wK+cpyG4@GfB8P#B-?fkXL{DcyNlD4bY{_$WB=yw_ZEHy6Sa_o7?79gq zBfIX(<(A2}R6ZN4@hpiN-;-B!L+yU&R+9zFZr5jyB5oV-a-;gve}tL0b(CieMATbm zlX>eAoCI5@}S<5J#RAMIa_rU|%R99bCF*~Vvx`|>uXZc`F`^T1$% zIsN7<-ckgenxtswH!7G4L=hy?C$FF^wt8omq$U+yI)%5BDEIuW-G%uX6V}?!fnRhy zn<~--Ga~D&Fy$aV@--)kva=dE16U9oDdBU}Wm@2}JIhHS=2gz0(w?`B8eh%ey2?^x zFn;>y&%k>cF=T}tAADqyGnt)fdqcMhgUw&(Q^1C5GU^>&h0_N98oP<6nmgc9vUPIe zVx=Do_S#?Ee7w6@Z$DO^#rid@6yMyf5=-Hba>9ck())<<7rp{9{?%G<)Jk)943*H( z?ag&~MF3)w$v1HJy4np{+5LQ9M!wYxbL^tbt*EL*P($6y9{{Jl`>oj0Suf2tO)%UnKdtr!Dv0)jO- zE^Uonj%0}Fa+$S3>$W-quC1m%sZY+&vz{GgwC^Iv?hpaKO6t-YO&65mwdEh60Omqo z_P-yTDKoG>SZ5HnjPw*SNViSkZ&Q}w} zcx=WX3XKl_q&e2&Wb^eL9vO4p)E-9AtFCQ*Y0JytrZ3n;QW!yg^hS}4<=y%rbwI7XlbX5@qoz({DOcL>2eVGxC;C|bms0W zL|yP5Guai);pG`8k#Mu%%AM!8%l5xf-m$Bd(yw6vt15gQTxe zU<;P{SUJ(={x>p`;Ia_C9aE_*i&3Ru^xS?#>bk7yOyq9hM#m!XOWdPtj+TYjPWBxR zUi6(=CF{>=m(Ge!Dl@s)it7LBHBFpivPt~7E7qKuS-q(_iThdNNC4oj@TDve7mlJq z3LB|(9_T=b2o?muRIqoD?4Gs(GRAS#T(SFjQAf}PuVd5bxTnP#g9&_@F;+r=(2)}Z zQYcV&J-!cXKPZr*2l!-u;ob)&M?lyy@+0`39tVzZ7N)HCeSES7gkicF{`3It1EBA* z8h#535VoYLkfN2+*8sf7knZ9Gys&xmjpjavEds)e#4IoF=`6qtaiY+J`-Oee4(m&3HO69}G^OJ)u<&&07G^%(qavm&7E)O0! zL0X)qz!@fp-zaOBr}vYdkWj~WU5-=dNApk2+ysa)6B`(nUZ&*hoU!&&N;opk>i7NT zTCrV$vp%ufm#e8Fo$@|5HV4b@HrUnynBa#zA~=`@`BCTqk?+X;i3ygL z2GKJRJfs_497v%99D&jQ6o#@8-21%=4mLo>h&T949)6!)AcexIAIe3fDpY)istX?6 zhfD{9K;%AO0U?`V(m~9AzoZ7_Kmdc=y#f$w8=*A3ZLR;G(vl9c@t_IAhbb7}w>Q@H z!7FL_z=Hz(BNY(+aU|{fy&PRIemu$p@gor=yFnt=cYoCG9Y+6ub{N4ISnFL|SK+I@ z_~Ih)iZb~v=}n{e$GR$C*z)D~y_=G{0Qbx~Z=$(srTp|N=cKdk7atl94rAm`o2!WE zhXUaFB0eu?WK-K*qtpWGg%;l@I7Ld|l~xVvZHjHq%%!tu>*WT<>`tpo@NRCe+Y6PP z6}4wkm5~i3#2Eji;?u&=R&()PsR*j~f>I$q_px^*;tv0&d6CzetONQ1kNs}fru zF6^{+EDvA%FpLO%DZs$aQPoj~qBHrf<`zu+r}LI0QMJWny2440q|^yJdE1+KV*$5O z;`^}vm6CgxJ;^1H=djJS@pPCj#az5F zkK5rvtg+W&x6MsXM9C=I!0rkRNeQ&dFBUR;``e7}_2!$`(*-xDrbHWaFS5yp zU)^Xle&5sXxGNQY{%oMDFiK}HrSi_kt~zr4W6&RLm~nkWU}I9Uv%Lvzz$aHuQhgtN z*2=$fSehEi5mPpgvNIVpZ(Vo2P&$I#{AZ}P-(PJU_uXLUnZ(#1HNU?bR%ITt=RETC zY89xI5uWj?J)85E0CwOT?+fqcgsVHoylthi!;oRJLT>d-NdY;{%4uWAZ_uyxn_)$D z$f2x-Arw`wRs#K66AqSVQ53~+C32o*Ttb;gUMnzSZ?%{!E}pBZQ+^{D zj2K3dp{bm5smd9ioY30bYp!W1=-E!fT7m$SK;UJk z?)W^}DBM}7&U1HvuE6EookHt+5pVddrc``{d&jfhA~BS^sGXoCY^k^g=ej|CX3{lroqSS{3YaT z8K>sLp<%}~A@$3#$BYC{uv-cEuC;op-Ad)Uw}N7=l;#P{75kF7;d9UVN$Dt(?*(GD zK-i|T&(moph~&z%f>tQEy{(fG;v4G%xm#{Wt@Kn3CCzQB@)Hp9`0#Zjrqha0B@`;p zwsWC@$^3Q?UPEPF2B3hB1qPCLY_Xd(Ppch9N~q*TyJCURRKIV7ne4pIi@Z7>^irfP{F3I zWh%alDYaRMlpLLjb>bW}G6iVb@{2bLR31puy3)kxwe2T1N#d>gTr6)Cw6r$ya99Za z1A)>e$QartZhPntm=l374JYhYVtPOt{A7?UaWeJwKV=pJDt;b>TL<%@Hv0+yRxeY3 z-~(SA22v<1L9`z7g9=vw_gn|7X&?BW%7W-sP#F^+;Pd~bsZUje=W^a}!HwloYR?0x zOkNn;eHNXc_gPvuX3wq=Z~1(7vL%q>DZWD*j{l?~aA4L*{S+I=Yl0!xx#ZfUQTS`m z=To_c+4Ks|@YeZ=vJ;;pk}IhuW|P+qy();ENQ+(c#-wPeVMCZp7qv0Qj0i@#AkXx?es1Q*V2E~Cd)X|K8*p6U&uyD;T%=? zcK$<^eEW#~=45S2j#&0XfZ~m&Tj=^2ScA*2w#Vm=SXmk;&*^Gkc7-Ot;xN@cBur8%)MVDjnZWF4%=1EI6f;#oG5 zCDHnPtmjS1Al4O=<|qDba2WxE6puWd!ELqCIoo0Bj3Z#HAaE|{=Nt|euk&{k#P06L z%ad)zy111!U{O_x_|$r5zF{h)y`~Ihwd6lLT&0cnBIPn+J?y;e2t|h}cMkZTY^h&f zOtW3CP&p5@w|ZMoZH)rO%}+RKjj^~@yeVFqvq*>FIJ+tnXRm;|s|=h$VI8Q&Ca0zt z$2~m9c#Yr<1b*2uc_@DtHXGKy z8vfoMRE)E^B9V7Hezo}(on_I5EAzOfg+|Dbp3pVJalp-!|yn4Eze7VF@FJ}y4N@>=ESUDhC^lN*NWQVzWv^$#Y0&mTaw1V-|FV-aLDiQrujMZA@(Ox8@c2%K*2fVTxSr5 z_E&OY`o&K#o_p4Aaq*`Jcpq;lBg|T#A4vJo*^Fl;ZVo3a)_oXVOB!STEs!oEYE;IV zsTR{`Dc;BkA%KN5<_%fBi?UI7*EX%TlA*S|OJ z=Bm6I_^=z1UjA)qNzCfd@BH9V?2U-~R&*tJ04OdumYdyqm1)E5ep;)-FJ$eXxG(D9 z7O@3B*h=17KG8UZOyIn>t1{ndxGuovFep#(#_QzB%*?Fc_kHo%Ll9Q-g`v_{$_=Pa z@#Uktd!xuU-x9GrA8*4F%~IeqtBj*$WQ-Ypv4ei4c9+nuGEpCPi% zSLq+in(eCo(Evj`Eie9e1GL4&+OFnJ2|;|OqEO*~kR}PAqJ_UGIptDdF`71m%~?`5 z;TU9H;)|i3lsDsV%-K6Lxw*N;XTGP(0C_n+AN@#`CaFZ#JxKu)=C7{XANnsOH zXdcqqc3=yinqHxUz#`~Z7N2kB4%3t!WR zvZ_xE_!vK<`RXx7p*f2-+DJTyhS6580BQHK}Shq_Kx-UWp z>jE8#=Iw>?up9?C^#Aou_O4g7CfqQA5l`l|gK?YaF&U-uc_hxtd(Uw(ZcCqvEeBONi zd}2O1-(Wwr$lh=D&OiGNykhcCXBk2)xgmu7LZU)iPmOYP^>3?gr*7ls=OrQ=i=hnM&<0{=jQ7h;Oyq&=;6_h+3m(#-PpF1ukY}ly?X?7>gta$Mu=z5s4wwl zhK~`3f7~Ava*6LOsr+|SQoH!T6A}B5_LzCoyfu??iQh`&JaW>MD1@*B9NBYP)FgI) z7VMi$88C1V>@R2c$7uIAv-_di{e#>weS7=DG3Q|4a^%>MQLtYL`wpQEJ|ELyKVm}k zNcf)pV?`5%P1FSUfgKYd1@c4TXeye7CZG^B16iV;sLi)O;Es3Yj`u~8aP$l`1%5XM zjYU!L8#R2watMR{PG}+;iJXuF?5mJ7kP2kCgx|v7o2#4%eDsIIzGU7L9y213KU&kO zv_nMA+xz(^A|*KsI%q16Ht{<;eb#4W{~7f>khk2fo$sTw_Jz$K-z<*#l(S*jy^`9d z1vLT74-ZY+I&IV8+v<)RM)mCMC*83?HL8CT>sx!(OIJByi}TSYE;%DF78us}77uS6 zb&}Pwg)?GKZ-(%ikiki>6e&X2vMsbCf(=Ya~ z?!K(NYGl_M_nqRcBIf4NJBcTMb3NO{G_hh?*CW0Q_B)t&`F#(;^Z2KAoR?uuU~FMC zP3ZJXgLdUi)odI0A^k~MtMkN|K38@{rn;sEWlVc{ZBqQw@D+laWTW7aQ=K~HCB5~o z8J1XaUVQK5-NtJ@`*%CqH}%@{%VS5+t*}5=12zZRpP83F@8XE@n|CMGnoghgCgWX? z`@c3?nCjK6Ixok7d3;)SWo=c}k>3+r9p2~XI>X0Bq{<9L|BSq*C@fxDIPA_>YVBf9x`z7QN~+!>cM`%TR-Jb`D*3p$;EjdMV!3uD7hYlXK$ZXC!_$ zh-b=K8sWa08#iDMV{u&6y_ymsK}E{o$`gQI7pjZ;-T(UgBxk zYgwP9iiCp`_#do4c32zC)F)m)FQHE_CbBC@ooZ zNgX+9Z(vNqiWa9QC3TDoYBks8wmjn5Il;$*&BLX0RDsnmPR@*+Kk{;P)5tzo%MTUg z=U=XxUzrz@*L(2kNiUgHn?8phyA4mX&YR@zRyDcf8u^+1yY7pdY`Hk{#W2JB_vWo{ zRaV<#@T|@?7neGH3XC3^edkH)o-^U$;}w(do*(aeVb-FnYxaek56MG!ihpTwZ|rZk zTW8Hpu-$CQO#Vd>$QXGOhGQ~k+)q+BKD=G#fGwMDUz$Esv~s897e^^Zro=@fDB$Ex^K}D}K7LU&zm$2>awO)Un zTVpn!@EGBIzO2Wgi@cqE#@(75;&0NMF;)nIH2lwhXcgLGWUtiOM~6==J5yTIXjw-pI@09dv3AZ~1%a6a9FzaJjYMa74C!XVjX!qsU-Mf4Y+HG2VOM2Kf;ovX!n|V{0 zPE$l@YEE=NeWr2kr8zD3S3i1_Hsk&xX4t+OoBa5I)%i6Cwx5X}6FF1JJGN2w0v=rc@g$z@Ut^ct~V+=JxIOr zZ&GU~XX#zX^vZS@USzp-jK7BhlP;Fr8Sec@;G&RQTh?_RtQq0N50vC}T9R^cb*}Bw z=7kbcfrk~i9d%jjmo)UTYhXld{_hXtEn}yyXw>z=(O=!)&s09r929)> zq$qakyxU`rPS?z@HLG>Mcu)9AJ+0y%_4lA*3%7Q@IL7Uq#6i`3f9Z;Xkl5x9D<(`c ze3^>Yr~kIva%n<;asTo0CcV7pGLzeawj^#M1e%IjzmJX_o`u&wd>2>4%{B^Fwwd6zAE{7BZF8k(e>w% zpV5Sl=3UA)5mu*9$Sor>jJ;`y95TR8y8G| zEn07P?B5lie6v28y<1Ezh-z&xzWu^QyZ%WGXzG1)Mk~jE4$pVL81A^=IWVu)N^|4e z?i~uYRs9lq=UR;Wps41f|0oY?LH*jI=k}HN5bj#|M^sgJr8p~`m`3L)!@Tb|AL8ta zt2HM+Bf}wcuCKSMzJB`Hl0wt!lE3C>l)Y}}x}^WAr!PB48*Xo#RDP}Eg6&AFR&CBj zw0zM9=Plh(2sy&00hv9wZA7RDB5H4cQNJ1oiLIZvEI0u1H=-z+4dcC7(3FYoEpXOo zK3`>xX5)&-H|;j%r}_`Hxlm%wyA{yA?8^Nqlf4_44a2)`&-vrY?mNwm227tg)OCny z{>Sba(Tbh)&~1C|2Lzd{e5LqxM72QH|Ngy`%`K*%?NifseywGvks&*$kLIW6Wt2}D@9Pc;WxI?SW@4{V=cDg%$>|a-&7o6ak zE)G67bHgqk=a-$o1#JFGk~aUIDCIw@Y&7hBj(PU( zDWfVY6QA1K4jmP59Vj*E=_?9}YZ}n*an@FICbu8)3scmOFlS$A4gP$swzk!}s~uXD zuNyz~j}G0o5A>hBW$dYbxd)@q-dgj=*;S{0GwYFZG_dKj%w4U9)I>jD_MmB_<9o)w zWtKl{KJHcI#-0(Cg%{1EKl)0A?@v}OLys1=+bF(PIPP6>^{^L1YBntJa-8LSIm)GC zC%^CbGrOYcbJC%M&*TifVZQb$tqEHl@zJLpp-OIcw_S@BHTkDJf4l$JsV?1qeK2OR zYhv5tn?3Bu1GaS5z#J%=>`{(|hUPA+W zADix2mHEnMZGeB@pqJ+=OC}k3)pQtnd7HrV&fGx}TVL)@@-m+l@$Qe`%B!e~3oFZe zY09hG^q<$~XoAP{$hFb=o!n1a9^9YQf(i2&{eJRt0k81D<*0S7)PGo(Mg2Np$BwFA zp$ll^kqNH7;`{pJVDI|~$!f;L&$0c~|J{>{7sj8_iH`4b)Ly2SMb5YG-MKO3UfR}O z6=qWN>;=!SIqos&>n*Ffx_V_?O!K98TfYmbnWO2r@YsIM;(xjf_UwH5?yD|G_a8{> zmNb}Ivr~RP@%;JA9yXhzg@1os9Zg`fD}}-1Z&w!Dd}@4+Dv6*Tj43|f!h6~9J%j&_ zrV0ZNta#q4^g+)-kMCNH3SD6HeuyM+Qr|HfYVuDsO57lKYa|}K!F2yJ;b(OG*Q}@2 zPp2(E?RoxVcg-Gu`yD=pOM)^zru9jUWGqm6|Ep%7QP}0ECkH%x|65hHGxSx(?tjxK}LV zBQe@8>(RZ-yMNxbxH>9na8{zT4BGDmT@L*G$WHJ2}pxV(`IXjjgs%>b$U&nwK=bq(iUj zWp5VML@tPKE_|vnc72_9rE2v4Ri`(i@|HeJ`=(Xk;&!DiJQHX4@JFHVBK?<~7}j)8 zbyY#4!_3+H`~ChR@tl=+T$*B3+{z&uP044pFtMh8`Gu_e?OxpKy5e2H$io9pX4@%K zS_Zh};!_WsFfHJ3=geRe{4zhG)_BgPTIcG*ta8U56;A6@Z)WYdwqpNGB$h_G~q05O69fmc#G$D#^n$@Mr^qp7ly>MRa!<&4nyK4Nf1jJ^jEHO>oc>ejv z^7yfs8R5n=)TBe@_bKD!#X(AhSdv05(rMzTu<5P+B1c9?giVZc3ZE8&`YBOmOm$Z` z8cSV(_!yDq#fDafLQ=@*V`B;59NC*QX&HDm&>EmcZ!_^)*rowVNt)fr^9_a1gjQtO z#Nokx+LJVHjXE<_D@rUpBNS3D9&Ot?Ip;TTMV0V}&^?2C;$KiM`3upvKbD*HwVunT zg}9WEVu20aue%?%A-2!O`z!~j1EfTNZ-AO?(|3TcpOo+K3x|q@`~f`zq*Opf>~6A| zgCV@_3CH;c^b8<3Fs)ltX1qmjnV{B`r{***r0?$hNFZY}NFo)|e-dYmdK%M>=q;EY zK=-Aa(amWuOJq-{VK=%3%@bIS8fI_4XiWybz9|!DywAkvlQVES4DWJsMzIn%lE`H+ zUTjUXufK4w_U){MMhI2=L1n$r&mKN^Gx0`2s23uc53MPAqrsx(7&!>~5;nBacI#eD z3unrnSM9}gcc!e{qo-I#uelxnapSrL8Rb~AIjj6b^}$a^u>(z>mCZrZ1kvtuknI%^ zN5w1b%%0Y;`y8}9)S7WNqFM|!+DsI79=#d$yjYla@NvzVY=LCm`QH;ukM7D$#tt@P zEjIVI!o-I6c(Y_)ckQn?BReZ%UiZ8?h&ac$sg+1i!t8fyC3D_so@S8W8_$|;op!Yx@fIb3!0{R!I7U(ljET~Bw z&|IK-K=Xm(fffKQj2lcFNE%^mBD^G%8>yUn5y&chf7jmTG;SLALDSI&q1cX&(eE@J z-LMdi5Xh~Y8uaTp&PD;Rj+k_kBjT&YTqth;VJ>SfazUL3K|$rZ&> z$Oe-Lj-Db%1VTo09UkA<;bk-XgSw;R=g;oxNHKfvFYRqEwXq5Sb`MtMyV}H@uJm#| zu%*2!o!O(JQg8_q(1zM)?3`&(ArcOg4xy3MS{P#9n=y2y@~O50lqx<#Go`MSf)vGe z9D$j~uGDjl=-pLYubJ(@+_Kyy$Wq~m1ntamXHs_Ml1oB6WYT7zsoJucQ#)i1qx7;O zX>qKOW;gS+n+4jI01#`3MhKsiVX2mBgOm` z8Mr-ZL&pm!@iw6d3~`}Aj26MWeL`D!mjK`Ukn|GxpnzHFPPuA`>&fI|^b**-f)Aew zMJkeh4ZnE!!bk=mi-#IYU=x=rT`g9C z+OZBM0ZzOHn4bb-PyQZGlEjcMXa~G00sxd)=Ml(!KF{=#k)#Ef5E2+7D+@!U1ZrZzc($Xu z8C6fVpRi(O23`e}!Z7Wq{+cHs%~POf>`|~$z$DG!r=_sbtcK$A=m1b2 zP(IK>phIe(4zM`_^a9Ra4OEly7jj;l9?s74FiT#D$IqvAhBZD-jKG=JeEc%R8ovSh z08|@dt>nR0^PLZsPVl7)$X&!vgR;Gdodu0E>zcWU^QVI?1J%B+z1bPG{h1r8~4z$Fp2ssI6 zX?14ke~*_Q!5b$~>$Rsi2oD3Ifxa_XbRLEYqr9LLnqX2xUtF0HW{obL4y?B0cJ;|RS=k}+TtK352#KT;Ci=*_g?I0K%9Q)ufOz9BX;l`xxpU<$3jRy)Gim* z{cpKkWHRX~h+QcjA#jH6bD(EH)yeLwM5s2T9X1!i+ZsaL+i(K&tOIC*c$}dFeDo3M z6VShS1Uuj=pywgB$kl$50NJjeg9h5-bWSx|t`^|~oO3DVoXc6xxm@6!%g7lH_$)nw zXs8uEK`VNKR`i4+JAh3%fK51nO*kkGVE>Kg+Ye#P4oY{R_CQ`hK0tM!)y+k%#NC09 zGQu77&Y-73t^U8Nr-5HA1dO>r^MK|9#jSF;JRA+CdqSO#yG z10{>+Njt!HCD2QlhgU%VgxIR01e}S8`!(_@X!K(TtMvqACd|`!?0{Id%Cw*nv7CEN zUS%33(EEsAl?`+NB`W8LzzrlRd()gZ(7Oul@QH0$I@QEPnu+Q3UrZ~c%ziIwHQ&@& z#&qvUDXAVU&?@OhQ|6vGrIJb@5ag_q2AQ$}5}y~p7c+-DQffSw`P7kWVjvEZN?lBu zX5N&kV&f1P@(G}mKqWw@fKCIQQSWDZdQ;8tIVRGZ@}*7pn8F!an=(hdsfD~XLdH)` zx$(}MGQX**=DZhXOuCwCDc$4%KYb2V4OEjcrg|`QRZR`yn=UYC<+Nn3dQ%-pah`=; zAk#!mS$eUV#V3IazQ^fT1^4=hd;ObxeOBy(QoxmhN<$Qn(=m8 zFh;&qDpT!8IW-cuG(#y_L(wV-a4B}y%%ndlbLJmkY7}pLll(z`R4>f4Ys&2Or`FP9 zx27mXI#|K<3ZT03`iq$j0n~6!Ml(ptT;w|*?zJVSEi$c`h| zE;5f)4yMbSLk`~u5_WW&oP*BdIq(yBa~58Pn9@D=UwT-SlU$uqg(VBG9xQnN>|EIr z>>yp#+#djuSjirLtvIoW*yBHLHtu)SQ5t6%^BJKJAVjWSh+Gh22%|hs%QPw2 z!SsV=4E$gjqn?HK;#fFoEJAxH#-hFt-e+%JaQbZK87x_OX5NjzerGB_!SPd-vRKr! z`)7=HlCkK9^0W3QH%5QPJsZ>21)E>j-YQc{n5`=pCDuGz&v!6=qLj_<{RyLDayGhy zXT$Nc5xN5}ngKF;|F+b%u{)Bo?_kM+HS=i8o&9}JTL;sgEn+kpM8vOF&p-$Cb8}##2K9WFykh>2*Q;{oVabNm z3*yT@-FZbjn3lExk!E4Ej?_q&sI@Z|ol_ItDJ`0g!1o_*3qB?jHRw8el?S-o9(;JBQ-Sn_Ei`e9pglIBt2Ry#p=H<9=|9 zoFiG}qCEwaUW;7DeL`KC+?8}=jf2$D#$rzI={)orxLy%Evib+-xFWW8b-K{T>A6AA zV<%EJq@PU7R7(~;+OYrHhO_f_U^8i?jWwjDhoEFPRkg7)Vl|b zns=28#eQLl;QHukc2nA2!G^zoJtfqy{gm!>M^ovHw*QS+3+JU~+$nIR%JJ^a6@`c#I z99s!k=mBGqg`u?()S{AXV4I^XWI{VrtqgV(Qqtd@shLVOW%hKY8Zk|yC?#{hGZjSp zi#plUx4T_uoV!rXv6{)4K{eL+`%5KKFPf5uMJp<>6)hx$JezGMLZN|>z;@e>MK(K} zli>s_fRccgDR&Teu*Yua`=5{c$bySI1E6WdQ|^`^l<#Z4emBPbX-KefsN-%N=DAze zCv-P9vV!{3af6YB$oDmpD3i&QiE!L?!ipp{l*AcJc*f)krwtgc%yyU`)P!{M%oPo_ zr*F9DVkGa}jqg^19d4H3kc)*S*f|x%V1QNvt@0{?%qS#^4t5rYL?L8Xf=shZ>V+r) zAxdO@JWI@bZUYR$dz(v^AleIrHT5VVosp@#dkH2@2=8r^qqG8X^6*)C_SMOwAe{)Q zEINihgYC0&L%K#xWA;p>RPylC=w|U=Zyw!9$fKJ9wFc^_vYmXLiQ7z>GOd#-1I=50 z@zO#S&p896%>-Hpw82ZovqY%S2Sn=co1wNjO2=CHWxnO>C$F0dhxw>@BKTC^KAWVy z?SxyiIldNNYtlT8xdcD+;$L?>9$EqQfQsUe+azm>p+U!Q8Kp}V;t``lz~ ze)$0(c}j=Ugw#EE3%ZiDg*2g8gJ5fvTg@+GVF4EUJ?f#DcR$ikb}w>%*ex3qsJoyZ zx53oR9+YDm?(dmqSz`IOT6XE}GqqP5J}{S#EfT90?9@tBY6{v4BtB^vdMaM4@fr3? za}$f3kV5xq82#-&k#w5|a!kX7F)bb9a;NFn}fn@vr zB43I0iGb;qNSStEtx#||WyVGWgjfRPP6yk4VTFz=cUNckb}o)8&K}bZ5F@|D?CDN5 zx7Y~-Jpq&pWbd#YUJHPnOcC>>JJrW6l#931xC}1}wHL^^z2&f{=-b<YQGE;g`Q@VjAzhf;q0FiHLp}A0SuB)_>Iy!1>_eTr5R!*}M1m0(AF)I<<;XHWr;mt~bpD8tzkh;=^$wjZhzi`z!j^SE zTGxQd3S*J~FMW5x)a};53+o(q015A4;qN&37jss-y+wYwknp~NKY{66d>Z!)PlS4d zchLC=8zBL2!jRn4*tn0Iv8A8#kd17trLdK84YmSR0yPJZVM#iZ5)Wh21iK zF0jPyZ}`b(ZwT_qEW)@i=LCm47U59OB3U1|BIOjPb9~YY%N+NR5*%+N!A%4bk0KZp z=~9HRa2BGWov|^w+-V2vdA4djp@U~3=eFGovD-EjJBNWmN_i@{8sXVmNPPQ{_yuHgZZkDl1H^pssvvcgS zyMa65JYl_O)_KB6))PMZBgAF$B#42YZ8mW8L3@3?kO*&bpZyq+Tsp?*|?d_d)Wqz1F$EByEu; z#vZj5R_#=)Kr8g}4pgz?{?z-CP8#1XFI=Eo8t#(S&ha-9ctM}etP`Ak-pHAd z_;mG5GlE|qnDsp`IA{>b`9NeWodcL0xIpuEJ4Y_@UmM7jkT6Uc|bgzrhU=sK2r;F~kqN z5c4B1M4(bU!Q!JpLX`TbK0*`$H$?l>XG4zB-}giQHk=DTK_4boJPWkJ<+|X!ajIES4E*OKE8cWn7@Px(~x#4EtaXer79hJ`U^s}e`OuSa- zc${|Y9nS=8qjfy5b&khdmxaYk3JbCGC6K!eh_&Yny$iAE_9vmAdY00I4l=lsU09#i z6oP@k+dgiEmNVQsZIc~bWp3}X9NuK-@opShKzspyHuPareWk11gD`)n8;Z zPAZ-;*z{3sZZF$=;PV#Y&QE$bKg3UFNg#WHWS|OChyOO~+0_z_HmNxUNlo+vy-}~` zQko1%X)<&v&1IcUm!)V;I$OWp z)|)znG9hVLAFyC7hEUd$r!cLLfb4A_qzZ(_rc93^R9`BBOH-!jZyQ4W!gCS{6I6jJq+DXHYWXEUXK!6By+P z%39;=FV{xXDRt4bP!~;)LNqOKehY(o2gF9x*UAF-Ls<0cMtffuKT)#VN}tR_^lS$MSI>&)w#+TVxBiuH5RfOu1Vp z1v@v07d@6V5wYL2{~rSBST2wbDtDh8uITO)IckPw*RbMP5tG}MQdrdmRdin*Mt^IE zlXVex_HDd9hKsUpT$FtU1NjGtHOCq-N692V*}-nzRKx&3n{}BGS9RGJ8)jAId?PT) z+_j1x?PA#qDRv-xoR0+gTWvkeCSHga%*I*2AI4dYwqn!9S=Cyy-WZ{T)JNDZx(Hj< zpuq68)E5|j83}Q(>n$?I_nQ)fjjv>X$KP0sEYCxzJy&PUg6N04NIcSHoJD?XkPQMX zX{f6)V)OyldzddN5CuQ9h6vkLZR9JVvl*8ulsOk*ts|yhiiPrmrEg7?EA+V%qpiD2 z7hq=@pm@`K%}5I11{7r{W0r+cRT2}fVDJxf)|y`Nm!@}UbiL`txqQd;T92X3&9#0# z-q`X>>l?@j6Da4V-B=xp9}?HDgFeyKYf{KkttK(QkD;KN-xGI|Sr$)q*Z4z=8YGY^ zp6h2&kyu6>aQ;p0&ShlVd|Zx#&#UnHN>y|jSud5f_07+=vhzOovxP(dBOl`m`v%o0 zTS%K|f>qXRgoI4-kK~MC7pGl(WbcxLZIH@sty>{(H>VKOOPGw~5D}MxaEU;yE++(3 z^R>DhQH=&1u8%E_5Dry^*a*U5of^-m)~a#XeY?9{{lJDpKNmI}YV_48S1Z@YLl$-@ z)RxM?%`F#V3cwGZ(mXb%Opas|MSW0NP_M>WYwFcFWDHCk>z(wmC1wrzb+PQ0Hc+d| z4N}E{T&l=siU5?bvE^G$c6a0J3T8+aOLX<})^oN3u3l!9SR(c2A`GX#Tkfr(vLL#! z^i%b1*G8wl85G)~V1|vOtW8$Jgl__}cSvRgLTrk%jpPh7j_PX^%>|utTt%#5-i@Pr z&?0s{6JHQ9J;zg%&HFkDdqsytScZ(WoDe=HdP0chl<=w1Q;nIM z3(bUreuPvkFctNQ4vkW~AYXqdhgrO<)4LzwT{k$qYcq(J#fkWS0%dP-9T2auP}X*| zh?mGxAG@SY`!FF9lsQR5?&rhIilF?B{0Ff9U#ohUap?j-dKN*+00$Fu7HYTkM=+RV zHJo!zT&4(AF_lBX+V95NC?RoQWaalY_~ivrgDtlPUAdYgYgH)NRu?LClZCP z^4)UFEtj+KXK|+;_p-oK8$K_i592(DGQnIX#sN*FW}phf03=^t@$Izfe5W?(ey=tm zmpgg-+n}7{eUNM7cxZ9h3R@NNkK-%H=qr8@8;bnVaRBk`ANTW+gEkj9K8C$LIX6xIAxP`V}Nc;?4AF@d)d|#JVbgbtP&sG_y zhJ7ZKO$q7PI9dEtn{e#K!4)(r^@)4xW+;%LQq@xeYh>M7z@nscVOK)33Wk`H*cGkl z4Q~+I<|9>}&RRf#PwPtP$7Lf#Bz(=eI=~+G7mc))4WiSxxKw_TM-LRSd318u26;5+ z)f%S$PDlS0X;_!${x6B-PD`k(LTqzWXdqrMVAJ}IAWa4k>%`Uv6k;?fWCkj=DTI0m zi<}Pg#7zu`9p-V}33~7pJerfx06>vKMa$Q7w#njVj|QGBCIWLfq)b@n(p)*0R)?hi z*roM5LU9g_@PvLEL-1%dN6?jIe{q1J)1j zb&!g=l){pAh1df5lNYt#XyBLm!oI2X`GWEcmoG5KI>Yj%auXYNL_#smv#{dQBNl77 z#I4|Crdt%{*|?i%fIWS;TU1?D>dr9hq9_Y2&@TimDlEdzc`%rKAhrbE?^T2?IhZ=w z*}_jb*sh2$^<~j5y_OaMx(?_T90mxw%SIit-o6MU)6Uw@iW-;==iGLEg{r$1vCb`Q zKLO=u@i*mX+?sFG-Uj7o+%hOXC50gFv51$b05TMGKkOw9pi=Z~4pDEI?Dl@i*W&3f z`E=|Sq3R_cl1TO_Bg>F0ESipZUN8AX?3N#9y4pl{_De2D(4?Lj-JtR;=?Ny4y9o-< zO}fJKV1pbXtwHU{7AslqT!tV*(wHb%d!}ZlCGJZ5%o9%ABKp@GZvU=!z$?j9z2SVD+(oc<}jovtdNwi9KknxyC zH8(v2Q+*Yv1jyd@1e+a5v7CvRM)ft;YI!K&463L1o_(lAm+tHOsAT#g=z!~h^I}b+8V;_v4D6n zNWe_)Pnj{X!zrTKX?P3EPN!fq0*%EkIP8lG)_4Y`U{aS+#yqv-f7GnfpVzF{;0)J+ z*qZgq&uUhhmE$@N_4@x*ts0WjVZi@YwZ=~<9Ltyd4w9UW7>i2(my*>)Te7Og^0|W5 zZ8zvTL{F$#S;&Qknl;)HM6Sy{znhFib0urmoQy$}!#Q&`tSeJ99y62TASwB}EG-$x zf<%`=)IWgOAb9CJRVncYleHFy{=6t1s%lu0PA+dC?ROTwzEhIgv$=dt7cf(OMS8B@ zOdtKcB4t;|02it^RBcg;giqYQQ9eUEOfpt; zs0p4jp+G@MMRwElk;zVl#~;uLc1+&?2;?`MotPJIn|$5{>jCuPUF9f zQ?KUK$0_x#@6@&7nmU90$Qh(#H&K5`pd#kf#V6HnJ)RVSTXLu=exyZB)vtBSHU1V_ zW1U(DFdfqYOoae29d&*VgMR_U8f&HUsQY0Zz~rw5m=4ziOozcx;cXwc!^#O9ytEcp z6hGm*@b?8z?o)#0RH{0U9UzjboUh~L?HQA>i@-raTWdHt- z$?EffhBlj4SAhePJD^ws9o~Q>9cgH`KaH=jUaecPu@E!}uhKW1;dTYX?W%*49yTys zzxrJDD=5kD=TK7qfmv*}s^X9&)?x$y8%cVtH`!@ABq_Mch)q)=A!S#q&$6ZXT&@)7 ztT`wl@#FuLj@B(!LpqvfyoKpFk7_OfRmbmv?5$sM(UzGwk5Y3PCUY;1GStDqlbF(Z zluIYBX&C3sp^+#PTIcXBVlU4^BPr#f%RE7f$y1&^8)J8OkQ!>ku{Hsf3I$e3YSFGf z>m2c=HAl{`w`S!f&YC+k46i2gzL0ogEOkH-Vn(D2x3YOCtev6<*U+QmW+ntGgD{$prLTGi1`c4RBEtB0nv zp!Iha3%?6a1*hNkJc6Ik^K9rCBeO(H* zIB~-j8u*S~p8<1#TeSd3R8?!ku4Cc1wHvpRtuNg)4Z2`-aMYRcj)ee`=@F@tK5VYp zaFOFv$QXU!MngObN;$}uzQv=E{LqrG!&u$gr4PG!`Ts3?VcHwG)7@Gp-;l79(gr_sfi>UAp z7D7Q1A(i0W3d`_`qa&w8geVDGXe1Q0hAh#W%PC*FexdLFWUaQgV!qV!5sT}!TupIW zZvR~^*Uc$cY}F|_^L{a<*6OssRQbG4r)O$)+SmU#ZK!&z4^{puZK&$xVr1y=?7S9+ zmn-eP9C3zd$Q4n8Vc$@E>0Owx<#9G`U2vfIN z?FO6M4JAv(SN#NfbgK>vc3Bp3o69R3qFa-1YcsT;w0Uu`NiHVjhDQeg_-k{s5Elot zs7WeF!T_<+XBD6(=G-zyj;~Fj`2ar|w=NS=x4hT@0=CqzWNdX@4~Z>{nP3epUj2vJ zeQR~5ezaF4UylN}{3df;-XH+^*7XZyna0KGu@Wfnv`ZNi8@5a7*D}5f03-C;?Faa8 zJz&Bv*mM0-G1gKJF^SrI5F(Id`?*#Sd$wvjrMQ*GLvnK3D6l=2zO_H5Y>l9?0UAM~ z&9eNBiBubG<126xaXp8-euBX=2FoZ{N}0^|8k)0~qD5XE8X~W*+MocyBDf$s86L*j zi!s;M!*zoaWk)u=9&AOJvzB}YXU)jpv zj1}G=*K@8YyBb=V3TZH~5D0%@U!)dms++oRdkzQ)XDhTFO?ADUx~OJ4h>mzszs%B+HLx$D z+Li_e7F1_oI;7CdMG^d$CN zbJxI6Lhs^M3ON(|c(>GzZFpqqJ0{k1C1qmZNuf8*?la?7Qq2{IV9JjI**oXMYbnqL zpesPeawco#7unqmu3($Rd|pY}H?yt4Vjy1? zh`kCXY^n$L#w<*s+I*+~$F5aZh#|7t&l}WmRIF0U>iSh*XaU;x-4>u>(C(9Qb_*UM z`v{5oLU&yY5c2XLnjq(yT!d-5w7QcVl|ggCQimlDz2sf*&j+3x)4}RBMkuzMpG@r- z>1Xj`ro3*Y8~-~{F4HYubd#ffcmlelmYXkefOU(d4(x%>9?cQ-JQ5o(xi^Q-pU%zM znl9CeZn#phUd~fsr1F&w+83>CWiGLTv0Q26B8rY#7LF%kpH9UoVz{K4Vpa9cWc<>Su)UAR5G~lVHm>^AT}{L2wQD$ zRkGS#+rqpJf1(jId8TV56+Y&C8|8ZFsu^tXMXRS;dqX(%dLHrzCt_?_mpGJJa&-d8 zRNq()FQK=(??n?U)^_sU{kKX=`>p zMp6hvI0hMYLBB#w#OB0Z0mJP?qgbn`;z}V~gr5Ro zPXn=O&`Ag#l6P$5eK!@t#~Y&CTIWp2`+8Lh2%%W&3`O0cPtZmeYc)_Mb{1j@bYB6= z2f_HK^*6MOYpQjN;MIIxF9*A3^bl4pzI4w;`fkZH!us;NyvPL+<|yggh40Wb%w;@I z=>}}c4Lwy00ok6IhQD^jL0p4)T`Lu=cNZ9GnAqYZ)HIrcm7$)`y&(-6Eau7(Zb>LOexMrzDG*EF`sn&@4v%(vL~SLBj>``Aq;J90 zOFQY8gwnrU5_$k%-UG6?y#ue$x%y=6GuZtL=r+)vvUH03(bP7I$NuU2Wuy4;@A_wG6eo(nJ##IZ3;pyhn$TSK zUW){N+bOQ=(7X@Qmao=my~tg7qwmnn*R&~}Qa!z%56cZ%0}kNQq=z4!QOr?|1n z_d3P7{ouN!1KriP&T!COwYCQge*xXag>lf`83mgYbIIn9Tfn%5F^v;6WpX{40Cm(ifzA9T zt$SS8ky-CHGS)njG;Ff|UQZ@lH*wf3*9FG*WpZ6$xl3>>0@lWU1^DjA4Kz>O>l_Mu z$H{bkZzkXs(x=*jiEErWwZp?_3={+`{lrtaIM*#6k0j81V`fSQ^^ee>JfJYL&l#46B&6aG^hgVtxX}6oF#; z0usp8$MxB}UL7Ot{>hP@xFUc+1{rIch6Ve#x%-b4l3lRf9WZzTElEAN{S!{i=(GWtj*$N?37WeF@9bH^QSDL7MrV8Hx5}neP_2_k zbhikO6R~%!D91T`d50j|F~ub3u+_RRRO>cZw5j~#9Lgl1VYRMZvy1CjVv2F7s+jHNE4C~-zG9oq z)FybFTLzKJ3Q|{R7IV#f#X7)CS&WxE?fzmFrdSeeuc4E27651Kgks!14~HDg%fqgl zx57g*fX;w0*;`e4*nC(gU)hB}Ux!aaA<8_Inw?iKOCHFQ$I6li8KAeFtaO7zj$^70 zR06$7b;;upgFLoH$R$rNP9BJ}87hT3_|3sR52Lt*X?$#b8TJNbjh0Az(M4uk9TjV# zvxL3pGOL9^m|?|y+)B0irK7^KYp}0uM6Ezss<@vM;VX+B@JDJX)+W@Gxm$~7IhHcP z+u)f)G3>a*SylHHgzxn;Fj@Q>Eba9fKO+6L(|Mldh-H;(8OnXCj-Th_XHfk2AU^{o zsRt7s$yz^yYkmeg$<^mU@-_`8a_D(D0J!?M@F+%G7m&2`3Sj^2A6RxS&%jHS#Tt~_ zjHDGs5zpZ)p)zGLJ!X+CE(s>b+=`@UvKO}4k9eKo0@sz0yOvvv?46`Si#~+h@_jLZ zWaR~kN%Y$1t3jYAAkf`MkQx2s)Rr&0(W1=9B}OT-G1hlkm@XBLYs=Sb|Wc#h3NTR`GSy5u$?W;I4ArbS$b>@%yRxC3zk(8aRW=N;pH@>u?pCAGgJ7 zrzmcdOH4>h|D$25q?mfXFwdo&QKWgZ5})9 z@m=6jH|LH=a40QbhKoljd=_EhOkqo*c%m34SQh*DavbJw$@JSv_0^OegIfjJgeW8t zA9N~XC%a6q1P^Kx`TY|4Qa7Q;<%C4OWC4tNSwtdQu1e%9?(Z7}t|T{8>8~`mX&RP@ zP{J_-{RMZt?3KtTHkuV5LshlM3}(VNy3r?oIeHE0;JFQr3P|KT3ssY%grSjBMuknW zZzOLoDLyHJyL*Y}r3Pn8rLPS4!i~rYAi!&wj*1r$e?yo9y%ie+O?_pP9149^P*#ZXUK?40L39qd_2v|cH8Ee`pxU|{6bD7}iGvGjBl$`2*%fVTbO?KruT^4PKqTK= zq5=gM_8A#6ab(DpQQ^@MUeSC+CKTbBoI_)k%LDTuC4a{eyx&2Lcfio0`=In0dhgS_M;X z`*to(M%dGNb2I0{LDtV#^21k(oh|YpPM%!~=Rda;9t8)r-T9>u1r;ySL8&j;`^<2H zTm6R7i`QgKT-vDa+~86@ixm&DPJsROFm_rl3tI`;+B>*~PWb>byF55lD@DdIkfJ_7 zDo9ukl37s}Cfl(+eQlZhaU5&uJ0&b6ifNfkDa2bE;r4kqFb$8@6F0VCdgfBCHRCC< zTa!E^fFD4>_uY)p2bB>|fr=DPiNS0@`UUjHj^4kXSz^&Tq`0ChuM1xWPO}I z3so+Zk(HH~fO|N@>s}E0@_p?CB;s^KsehwpTSZ?ZaM0V?V5RIb>wInu3W6uPB{bDg z@Zd=hc%OA)E_Pl8$$knDiy5YR!2+L|voe=(7Kg>z<-#)>a_hTDbD@hg7oO3OYodKd zgO!_={uvFq+%p<-0cJ+tE#0h$H5tlWT>prM`Wuts-VJvRoMd^rYPQ_!0Q)tOwstC6zgnbiZ5FYQHi(%m}$lkrHLT(DT z_yaY9&$N#?_5#iY~+LaFv1!n!hI zT|~n&A~c^0S3Jfx4^5t>2 z5Fxv4!HGJuixkQ|((rfj0}+br5cgzU1fh2Vjvv}b5M&?G{T@5jwGl)Ne53U+aS`BQ zzDS$bMM&6g>vH!9g60Ler1ZraMQvX;YlXWMA&+ip;J2kJ6BmOBN3%0=EbI$YC+}0l zw#X=w^_)qB>=W%8eM_B{8@7+$?;|~Pd)${dLqaB<;aZYHD=@ti88;1jaCz0=B&E6PnvIOMGud<6l391+@ zDykTveq5hG*2ZAB7=4N!13Bp^EoTn=ae!~<#^9{yz(%qahI7ALB}#_8noc2nSSA|1 zC;cC|JQ~V!`4fcM?HGenKo+_>C+X?`PZa4n8n~cS$|;GVXk)o1`OppG+W!A9lV63b zD6c`3rOKHixK!yNjff_1`8*D-Q;h#*W;D`mhAgWDV09cu^_k@(%5CiX?F@_a#6)GL z&DT@hMmxn)3nP|K67Wd{K54**UVYEw2Ln@A>MoR~u9(uXStJHFXrZ{Y5pYRVb*B`u z&p&y~s#~Xv!;NV2Nw)nS!=!K{z4G^q!BCX!G5ik&kiKoiO1BF%UDPf>OMc0Ro-Y2zo&f(x+=XYW!Y8$+ZFQmLbQzKJL%sXpU3c9owmZLqdR7U;^`{Wudj(t z?WKMuEUWb}>P*o43>AA#@-GBey0ysEG1EY;`9BSIpNwU-2&6g>gDn77qKAV6ePOVN zDe`c=(rGWq*TejFlvZZI51rE}r(l9rV1^ZL?4Z{vp$Fpi!hvjBcK@N*@;rnhV49_{LFuqkqu86oZ}j0HZjVwoeerc7kN)(+AA+ zm2J6wb3|Q=-K`RbzJa&@aS0-uu!21WewQo3gB=29wBq4XyAhl zYpqx&cY()V;Bi9*qAWdd@mn5T?H(8Ul_+2)8a6yg1=cK^C%|SQuvrckM_)cy@dGw6 zQQr+R(&;uVmz8jd{*a%f(LorIdC{fCzOs$~G|(H+XscVs+38|VbKuU3AM*RFCGbPF z;=Q&Y)W7W5LWisrca=9__CJ|!KU-F=Eik&Pz=-uHH1T(OaHW--ai(UGG43n=WYba# z&yf&=D`hQL{8U!e{i{LhW?Xa(*yI7bldxU4^9FkFUdbbF?|xeEoN6n1!Ie6*sPpq* zyLs1Edn zc*daA1b63pzG7>|&`RL^-=6qF8Q2wmT%vXb1cy^Isj}N&vrM{>?gkS#r3?cnMG}P7Okd8Il?|w^?(2A7I1L02q z^Ud%*y?j^UQy59{DdIPT?lSboh>C+HM@_!Mcr=U$kDLm*}fFukaHs4<`q+FFShsF9<% zk@Kl_w0@>xo?rfa76L#zSDmck9X$>uO!t&9FuNt<0ku}D_fp^ zT6u_GUl4V8roH|Qj_~vrdyS6~Xtj@#&H}~f48iZ|Y7=c%<{4i*-Lv0xPw5SBP{<4e z$!3tgIPq_EMj2x@h^E)aZ;ozFkC-$coCa=|;UhW@GE98#W$MrZ4|j}dpJ71usm<|T zkmIeJ{E*h1QnG<{tCItq1aL1}Dx;g3_?tWc;Op}<_buMeqKeq;DPfZU{DPh6_PAx< zD}pg7rQ$UU{Rv-MZ0eim56hP|nK%K6U1W%_ajNv8-G2>@J|fC&TcFM}7VC%F%^!w3 zFc1Xs=PmGuhHUYXMnp}fzdu_bHt5H0Gy6qvWAUM=T1Tqf5w({#=_Hc2p^wVF0*NPB z?ixtIQvf>)#a@A3MVasj=1o9s!-tAE)cJ5{p{YS9OUI$1elnxHMZV(XAcZ##ePSrh zx8+=O@&B>*CU8w0@BjF0vLTxghOj`00hAyjA|Pi#R4S-ct=gp)!O4z zS@6L7!UJ!s2zb=9UiE0z9@bl_)k?jOR;>qGt8H!9|9f_W8nvz8*Z-H-KKsnhWS@EF z+1c57o_S{G#r8Rv=&DTMe?b{3>SkY7+IgowQo5PJo4doHLhACZbY|13u)x+fzgD!n znT@RZXGOL{=W$*P+`)Zx8)6`?HsZ$i%5b)2cw2aeML$h*+Sl5hUT*JWvcH&UK7lo6 zPXd^g=M-)64Auty>=_LHd_MmvvV@j<1;H;2%WkbYU2$1@y4L<=@1iWFl{eVK|Ao*S zZ9?u%+K6l5nlhsLfrY=?o>{-^zTNs^D^x0Dveut;u)s!#j!w$%+ZqaOnl7_%Yw-Sh z2UwxZ=fK%CBZ}$!T(Yw&U{83*YTc_s(m3xCwak6HKZfgV$e7y zSeKEC&w8wpYTUDmk!o)avr$z(d*4QN>ECQroqZ+6NcD(~ifzNQqh$4@$s8dJeDB$) zvU}yd_rgFdnW@;RCZIdbzZoE~?RBuOZHGaT**cH z{eXm{fNH>x>vfgfvGtXuWqb55dibzm=d@CJkKQVof9JU28ZOK{QA6fvxBlqI<@Kr3dO5E``7?S700Bh*)detn0y| zt%iE+FQ-^Iz~F-gtvNFmP>mq5TncH4EpVPAoylvMqf)oPBzg*yy_#B=b4Iqmi#?3E zHfF)1bIVH??bX{~33?H=GQBhD-aV6${O&eF2C&nIINi7QF-Zny)mgb-i)Awb_tz(` zb#QYuO^#1ir1`0q6noXQ%M|AQQ96FDzFz3Zvlem_E|hcMZK~kbpeSSSVDaHhO8bw}`<8B9pf~uc?E~{0#gk`KyX~D651A)hgUnv6c*sO`Wb3-PmK0*U zqOcV|)x|zv#lrvbSnQKKqRt-W8rLp(U}P=CZz#Z0v=G0fPsv#2a-V6gy3gFVQRhF} zHo$!*{DIbiXp+!AC<}jKp4LCk%w%?IWQrC-;tsK~$5b3u59quoimAkjr6TSmmZb-_ApT&92a$lZ9 zwP?Q^p&GO!gr$Ej=pSXaF@yHIahx4(1x9___fK~ZgnZew^zXg;P^oJ?DJFT8|Ue-$+7B4V_OuP2gaPNpA%PTiA$_YsRta$Qf zZ|nXI#k;tWHJ{GkL?c!WshI7F)Oe(p?%jVuW4$tCU5P2AZ0(|X+KAG#dlpcn#vye_ z&DzUGYtiZ1GrdDb?>P9SCgR}j@8&Veu}GbB@aq*`*6OR$gk5~d&`r~~>m$~kC|RHd z(@ntiwB>)S^{_74FfJ#gc=)AbG-CFzS4OgYV{mWLcNcc+t-q|9Fw+$B#kFnY^bxBT zmrvkvYcy^hd!l%X!FuD{iZe81*_h9pM97E!x+@?t3W;MLPLyg>8zZ&i;ndp1NF zr^H4`9QjX)5l9^OPl*l10LfhZP^y2bIUF~Q@3x$n8z3;ETQD()Auu#MnAFS*66!+) zXXpI2(r7(4ec@_jNXgGr#|RM{?~c3T4FQEBbEpPj!!fZ!%tOQ^FXREQZFo8e@0{7 zb7{qDuaL20_LXrF`*vR4#%h|#V_+Yf0(SF-Ygs96*7JAH6UM#r#XM|2sr!{OOwa!(uP#dtNd6O@!MBt zINa-nd#CT*SHoHVx;3WSJ7nyry>mPxW|n=klD%3cq*h_cgUxc%4Q1@ z6AL%~oW3&16NyKWh-Y9nB7Boc(tyAb77!3P%mR7@eq;d;QL>s3Aw+cczgPsuBF*2k zfEIy+2-M_i5L$d;_4k5x<1g!X=|a{Iy*5GLZdE8@T{70FhG-+ztrcTO-5Phh;+O67x}-M7 ztS5gVcUDd2sH-#Q-{#D$!mk+l+s!sMGo~yBibkUV0pJ56kao>~m_2?**w^V!?{sVe z(W^&plU8ry{6^n=GC(J=HXGZ6bthtj=P|cRScET(R%5g-mpG$E*tVo_@%W1iFLP!z zSSwEL-*tBaXO6ZSLP;cvH(}LjVk4aCxm1!G1sBP?cRBN2{Pb3YLUcxAb7EXJV|5G( zX|FL7C+QA~Nf{GKBC;kQ600I`(Z_$A^#~Wqe+#ki5YP~2CX;RuB0U!4ZFov^hwEhVOvG$%_X=et_D&3uV~dXek-#+)b>FtU8S9dbIf- zE7ALjB3_|TlMp82(NMdI57EdwI2`diIPRbTdDyGCAHcg$i+utW8cFtj;J6AA;jA!A zI^MEcaI=WDF2i^cMa2Sn8nZ?$|2s|Q$T(*LCq!6{vdrPgM2z_L`m}9?6g#&Op`leP zZzDLewvp5Q5lv%F8QXLwbGX&>UIJ|_u#`ilOx)4HD)DLxt}sdEJRIGPQ`7mkjX4>5 zlQ|4q8g3=TZ+M~~u^K`=Y(;5!+!=V>7Z>Wn8!kdk9o^U2l$lgJ=P3Bfv^6+$zm*VLfzkWw-U`ngx=o+ugQ&?)(^*`wp5%cii z#gnGsZF%KX?~_rkCH3StG}Uit`XDHZrCz~buGg-)UO9`n+^4yNy`JWbgP#^6gu1y; z4_Ra4gGF(Gx0H4f&5JqnB1iP{0mGRCh5?9(GPk&B{uDHiG`dJr{jexLXnE_Zy>|YeA5iP#98G5Ui$`kbo|JaL_eQ}Wh47)GiSUu4DcBN<7$|WzKQuX_hksfc zM{RX7(ohgN+E5*B=!2jre(oRqh4{8W8wF&3t|2m(8#v>f z9YTuWIedpB!C!Y8FXw4zD}UZ7ikkwudJY$8R$#_14GECH<*UEt2kp|(cdWr*kg2qv zu`T-$UAsE760VE*4pkO@bNvuKZ^DChc4-*Ta`d9Q)@p;j|NL&*i3hz6kbF_B1lRKPc* z09Z|_T5=U-RTcOnpZA`hGnbsIMiMq- z#8Xyw6I$q1kGC3g8U(S~B?oMNXpc_BiDI4lWN`EwX#AW%Y6M$dV@?tuB=XQmI9qVH z`k0<))>t{+Q_hJtUgS@wk&nLq!z{il)WjGj#O`zL`C~-eY{2%E0_;tmM2{Uabu__f zu#2x9tZ(q-N(2%r&|0 z7v!?za14F(drhnR>i0ZoXEssbx&3WR`@f1Ug18qIJK}4~ie_J-(R>BnF)*SdBiqVX+X> z46BGG7V-J<(anL;k)O=#=K6_ac;R}CWqS}mN#96nPO_Ui$%`nrv%x#W*FK75>O4b) zWhl{dfWbkYtJ9b~i}Wl&M?eR_Gl2Ghc7V2krvYsMtpTk78Gv*^OTbfrG(ZbLbDgKy zIGpD#s3!h8Q=5`k$@6wY&F08&xnks20jLCw0E`5T0gMBT2TTA=1dIYq0xSZI1&jvV z+t_q6+~EL|0asurygI3LWr{vcx{PoI;vU@bbTRH*0$2+81h8yYqwVGu2&~N2*EA1H zipy}cj!%k>PL4}&6P?&9GbuVFp;bzBN=iyXTx?2gn>LxP&_iN5hmPaez9%BK!^7=B zc8%Fa5tV+&?(1hR)L>0y!S2JJsojswIkyK`Q@EC-y$3ePs>>56)de7-I})1s_2Y-Y z24uHKF;fsLcL}>}YMRMVJJSM&I+~U+)W)=0iF_qimtxG&cgpRK&2!?4IA-Z7v^?E% z6uKd#a8OH5Y9~M*2BdPake-X#s~XRwz>-9QQx?4O#t#_o$k zKN2;PnG8X*R*5`E12c)A0WQV$CE)a^=WYPaz~!I7Y#Z1i@W-3Q#S-3dn3RC8nScd= zC0>GQHUE(@XB^Lq-C>{;>KiTD)t-J<5=%04!=s3eYv9~MdA#=xiaMG%g3fHaG;R?v z+a7io@Lb?3V75JMH89&A_6+cR;7h>icg#0{%DCGmpoKs>Z0Nz==5?>O>m`UU8FN0; znb5W4PmeXnBimHb7ECg}eu}i;HXRRh+vfvG4sXUZ-R`^@ef)e_gV0s%Ck)|uv))Qd zboSNsW#9H|!tATf3v^cS|8;gdWjt9HyU`-(G+P*0zoV~s zwjKHVH&<#_l$X6@p7Z_k9e>Fq(Y0z)b6~~IF+a|_IsV*c&iwnR4F^vyxcMb?3=P_I z&g@|p%m%a8j2<|oD_AvFVuc^2)nL_H^;RA|UO(Z&_-hNwb`~yaU_N{2+|-k6rS-#o z;o5s+ea)G@i*{@%=`u3QSr+3}{NU=vv%uUO z!uk6Zwv2CxZj-2s?5-oGkoLH5rKkKd$$FXi@nRP!Y`Bn|FQc;HipNDZ!X60gTwy)J z9xkfrH6YfYhIwq|S3J0_X(2Cga$9ZBwp#K`Nn0&n_{FX=E%8LK>SgRa zB45$;yrLnr&6R>ReAPOMnRvPg!Vsj9ecn3WS1e!GHQBU*6Et$NrXX2^yd+(gq~im` zuRnC`#_E*vZi1s~H{mVf`Ly8O01un%fSzf8ZB~D+&>p?1;l}vBWaj|6 zFUjtU#~@xY4)*7-YQ`;<2O69M4Y~aY2ezvgbELuf7V@ha=c}xX8ENbpX%xamfxcmC zQN&NyEX$RPIA;+@e=`z|9L{BjbHu+SoU1y<@sW}!7JE6ux%3X;UrD1|JrTHpbPpZh zP!!8)i*VtpMzCK;bWS)&zxOQOt3~PQ9|jPxpGsmHZtDkK(?tP%B#7b#zZT*0H-3Y@@td~Fs|u_v6>#|vhvawl8$a5} zI=C&rQ)}x)|rWcN2>Z@3-^+@{HkOqCk(G6d|gqL>$Er~zvYMH z%v*k_3gUJfs>i(;u{bciFc6o6@SnoK{K7zrnciCX6J(<*G-7n%+aRq&Pk$ZBUWbh$ z<-WF_eQkW4kC;(6{x4t4x?uS)-|WA9p#&|di>jc~qGG+l{$#S{Ex+PGQx&h-7A3bb z-)LoKTtT{VA$XdLJ!G?=dSsjZPT-+EXGb*6^OU#Kob8l;5| zRPEK$hT(V)YkhH0+y?W>1o7$wQJf&U?wj8b^+iIOJkTR&pogr{=4-U_ddt=I7ID1= z4~~xu5Sw6vtywr{I~>7OkM(q86MXp5Bt|psBV0J|Rgb)CSqzWw@HMeS%XNyjqL2)L|`Y<$tBbyVZg*j#|Zwyk^10Lwc9LGrkR<;qRQ@ z%nZG&m67H-LPt453mutkA&|Nyj?`sXWL)&oO^F%h07uJQ+ST%ySq^e^<19zeS+MXK zV3aJ+k{t3Zc3hq1sA(zxT+SUw!gjz2z#q6C1zZdm4Y-TzLf|66?+A|v{u6j8u%hRH z(9Btm=AYvF3&0-0R6yKz^D>~a+<=K;ty{&n$w+9L9Gx8N$cRpq;xm(@Gg2}Vqf_ED z6B6TFC$?#tn3OTg!QEyuwQJV)v->XY=dPk;^wSB*e||rElg0hWczaX&j>B%pj*0>} zEAMA-H@}|%KFj+F;I6!17~?NipCV=$Y>+{;Jjbzbj>G;m#YuW5W{!itniW(#K0@of zBw&1mZhJWr$uro0=9vD}$YMlqQ0M8f-Q%g6bc0(UESEFFGc8|=N;|OJ4iR%c?X|u%s#A>&pE_%4!WUD`#qfH zoI?mO`a5T|qh}qt2g%0nXC3L?Q_ni+xz<_vq)l<;SqERHlg~OVXB{=UW4CNMdUe(2 z1x1{>_{)7Y;g)wNa=`sp+{llVC|CvWf< zM%~%D>%@X73y*Q;iXU&T{rRuW+rrR)|9bupt2WFiD|^8_eblB2r;aUNn~3had@(uy zVsbw%I@=x*I;FeKqob{hg`ODefo`|v1UG!ESv<@M^D)OY?7Rk6g-fWFzew~?Llmrx zmvM0gaJ8sz&GtzZ+%<%20M`LG0KWom0)7MB0^A1t4miHGf;#~?2{;8f4LClzk~;x7 z3HSs5`4eyqdE5d13-C8!6Y`LOrMoy4Uc@^M7y=jy7zP*)CRe|3_yT3BwF?8x-+(cz&Y)0K+{x<@O z0^^>Nvxq*2=-Vv%Cq%OXP$Hd1A787e0Q;2lLFIf%IUiBZ)yny}az4e>1SV5G`4czJ zH{tRQG>pG+u_Oo=Os=9XH}XRt*$_6!5GFqxod0YvY^u1tcf=dQ_->-SKSkazrR>|E zLS7TA?DC{Q=cGXD^b-tbgZxT-)+_ORcQJ1PdS>fAY&U|@<#z5SLPw|(7mT>b+D)dt z9#-{2eM@9h`Smd8>tXz0Q4VO{J)pUjiaCOZSu6MEvU+oTAt(PD((~64voE5JL)Me3 zZ!rOgTTi^?W|BR-nH`<}ug?!|&)4YXU$xqUEU`zR$J*JL z-Ps5qwO5ERWEfY4GOkA06XncD*gPc0198Geka38P<{DbkNN%pV(Ogp%$Tv7uJkO&l zf+L^UPho^dF9-2iLA-7Q@f>o9XOyHh+y=p9_5iUQT*6Xr>DnAhi>*@=dA`m$Uq_qy zLCq1gRUph$aC1kOeMhJ0NBsiY8)M}xjWbKbw}<`_&|)gTTPvq|_et}n@A?-{<*K%5 z=)0|p4`{1uI8y)~nB2#h)5j==!;}oIBD+!}36sJ1Evw@MCvT7aaC>a=39f1=NB$?i z*-mc6I~!rC4*3Mv^8_a@G9i$Ef}?wF_;+ru?9n*Kqw(nrh|NK4Yf;{;&DpF~|744# z@(ge14DZ~{bYW176QrVUrKjwnb$V#2T&H+keAP@HDG*Ik98)l$e0GupcpOy$yr?%L zkRQO)!*#nhIuY6&tIMexGK9WomIv}Uz8T1iKl#Yb zH2KXm)M)S8jNhXb?&1>%S1G=V=-N!E#H}yaM@;u-8o75^_ugT|ucU)jPSvQ#@>Gr3*oJU^ zs)pW z)YB@bN9CkP;bt6XDw1hHGqk{kIyD040TszrFsNk7&VZiI0BQ{_hGk`w9^+CK$wMlV z3!0`@tylEpvKCz@lPU5whk6XU=BS#ip>^sMH+~s4n2riBo(%mHb@_!71Yl?>qSiWc zUR+LI9C<~|i<1p;PD7k{%~3qrQRT~#(R7G`1$S`*8eg$h`rt~kL7wcuabmKADd75y z;N5D(6Q9xlpX|t*?4Ug|=k!2u&}0W`FMd}?-j(azl`GCmC~o7$TEdmvR>Kfvh|e~} zqxJG0@|8Dhy*6+g7)SYfVG}1>rne=Yq5kia#dWVm%IE7l&)09)9JVRv%cQ|DjCa11 zlKoB!S#BQ&jsK=5|E31Us0|YPR*-ev2HCS&j%PF4-JdRdrfc&D`Og7&dpaOy2?B{7 zTTCT2b?5Yy2Wg#yw3a9;Z}D?(@w50uFe6hZ9a)-dl?A^X!7tY;pi>hwl;bOTImLma zI>kXVM7gCUr=`VyLcx;7mf|Q#)l|jnzwTKKJWV5D(=qYvbAz|A#&n7UNA(m3z38L9 zMc?3+o8l-y%tmL66KXo0;;2Hq<_wdEMdb{OA}@;O05pb9G=}f+`S0+q8!mV1+7!X@ zpxH!lHWB15iL%rsvARnlc#x-QoYORDsQNfPgcaZ*E~gsK%DvawkoV>2?82HE6G0*-HR?vPy2 zA(@VRxob0W%@R;3skd0R#>lHYoU1%&_ujH8IL8!BCkXOaVfkN$QEk^2L-?UO`MP7! zb%(qzvHQA2n)8y}+nCeaC}+gtsLqJB)i~rAJe)6hkWYa>e8EFNhcOie>X3}%FwO|q z9+}fLqyq2iF?)`5%r1v{_6hS8)}qYz?pvbJ;LD4W2Q5mbN1u{E*E&Ck$FhBxj1{YD z4@b1FW2qc0ID-ZHi$8twbu{yM#EX-0R4-1Rc95^CG?7tqeNP;RaZc6X3Dc21UG2_G zzK9=C-?QLdzDnxmH4RVwWg^cv;HaK&u$^rx_u-s!955I|vUNeKnhG*xGH^Hgx~kK##uNHI)fjmx7~Om%^CJ)vEuj?x{zEcz|b(z-BaX0}k*oLv(l- z+aJV`LQ+ZVeQ?hx6p4s#7R~=Mfj7Yr6g4P2YLH?G>c*@S*>@${=)LUo60P?hGx&Td zy`OqeqGR4`-*6E1EfC5sl&8VcGxa^y(i1Q^@~%{qSp_4{-_Qd#qvN|8AR~MiFys<+ z1;B7XF<=Cs5HJ!@4TWPUa1o#c_k0hPV8c3E_6;a<(-^;|8)0ZQkWW8NN26X%FS09KWryV zi4A6s~UP2;1JUeNoYn15^qfCEyqYOz&o3+l$a_KLvm^b1gYZ8Pg1 zkK_vNGbv7UVUBsz*e&RIqSz7U7%bo{wlTIcrho`v$JlNCv5j}7bSykBWumfQSVu-= z*{j40>y+xgj*QPrBsNW9`g&zJ_9+SL)mgNKMKk3K>jqs|=iGMWDqkq_g{EL*fSLLp z%50)RGW~fSsmKcEC|{WSeNVnHJueccRQkWe?O|jYNyPA<){$NEPwVa-(-4l7aFj$! z{9G>Y7haqe9x2sKy~)8P{clJ~2Hf2wRd9uyE4U)S5WrBtFu-s?F<=B>Bw!R^G++#1 zEMOd9JYWJ~B484r1TYye1uzvb4NwZ04wwO$377?#4VVL%3lLg;h_N@OxpVI-TKD_P z`G3l}KsgsF=V8iugmNCOoX0W!9DHnhzx2(c*!3Ng|0=evw+AbFa)@%Subjh`b0hkU z$q)%I0w~FhbG_Y*DbEw3JWqo1Y+)CZF-|vSGyR}|%Z)@Y@4L)F-(}LYe0fAr&WIpf zKK7W4_yEx<1&A(nnN;8VAMURjZJ|~5WwB9?*hqL*>>|G&+U@mFIyks^yS2)PBY|Sv z8o5N{EYZNSy{$-23vi|dFok$z*DL&55BWr&J}3H6Yro>wy{h*6PwUYU<22K*urCIU zdPT0EoKruUI5A!#6|~hBlxRRQx2@dvgPgV>K${I5(kF0;xYIDWEqZGEGDq*rlruMV z%iKiA8H0C&x@~?+0R{#(X!AEHqjLl0Hyu6SbU<-EzF5Adb6(StK}hYnLCdWxCi<%0 z9C=?R`kqA3t&@HE9ABP%2;9?`7bFWty!LsauX>l4Gd~)X`H}p?SKWX3iuA~9E6ZA^ ztfhZ1Dt|*X(!dL5TzxPuO4swYh zzrtU-r+>}^6u`JcT>?*o|uv|F@+Bo#m)gOj*+W! z@b)3W+l!wuS9R2p=j0lpXN^Go#p9l`*2AgwPzLgSjr=9S;gi!>~$H?68f!}k=$N}J;tN9VmNKNFwxOgwG)w2Q}=HEWWM!M-q zRk!z}VNbs|tP7R%3ykX$M5+V3{#;#Ul}SBDcT++-Nf<@dnl-LrVgIPqmkCeEE{y2< zBSpssD%X+TQKGX-|r%qSF*eM(GC1y^w>A>N;3kGm^lWaD2*q{i5W6pKNUW5*` zGC)k;Z*YvM%&<%L#y>q6;S!Chp(F}pGN44jgrn&R{92o2j0!r#u>mvwreS}>xTkNM z64aM`U%tSH13%>Ll4K3LJw_D9;_f0}xeuSyhbM+M$pz~0WpIOI7<6=E=&=uzUy)!+5QXuO zzKIQ{f8D+SRlib$v1;T8Wr#+VT*p`HXDlxRT zpp1q~7(6dp0~b|AN~Z3jFu~DQYr2ckaJ&HO3*J!<)AbC~$z|GnrorX4E$D(Cpbn~= zGAJ%&BgZS6Zdc$V1(^wWHL`s;Q(aM*=zxr>br=#axqqag$uPDlDJavPL9A4*%fV~# z0>;&$58?$W!R<~T4pS_;;MM6S=}fPP!X(EP4I5k6;>A;*&f+j|U*?ll=3~MOT!H~q z0b-%YFgArc&}TP6`%u*ZJ38P!>{((UmJ)~y4{nfL?$xv0i!}pcj;}~}N+SM|Q({1j zf~k+U8enuMLlgo;L3ethsmj67ZhN`f)U(=z!TGiYJNc?|57I~#0_pX2x!i?!cH!+l zkg*~H44IUB^ep!<4G@JX5Cv-=t^^bu z2<`z`N=y%D0B2t!h(amXH@t5U2CYRuDyMQeQYuIBifiQ>F1v=4D+2N>0_b|9{FztI zXI|uW*-zioPj6}{3e!>bFraJGdcoDe*;T>ur7%l^2y}B>dvM-c5 zDwKxEyY)D}*{!EreB}twoCr@`=I_><`isI`yuNINdtYerzEJsHv-4fpXv2q`4p*C= zh`0cO^%#|5=$nyj9^VCA8qsBVa2Q&OdNtI*cFp!-)9wtOuEFTp<8Ui>E_!!~&fQ4HsB(4I1O28t(V!#5x62KlnIiL*i2X3m^ z)L<(4j>`$T=bKqO<{hHAX0oZUTrcLF$+~4O)hGqS-^hh?IcM_rx*MD%2mVfoLw~zs z3p$djeHJ zpQl0$78ArsIcG59OZE@rrwMGp5w&}e%fyXj z=|o;5y~$ln5P9@ifKOS3F1}Es>-fK*mLLP(2-Z&^T7x~Ptyx1P4iTI;7si?91`#eX zy*ev}^g-x#F2of|oC{x_)Lf62tWq||H1L6BBKd@TOU}VC{^+s9LmLu#K)@@av02mO zeYhACSr#D&=pH>51n8s;j+nqtX@E72L6sLLgxD=-`M}8&X zoAv_cB0T0Oc!4J&X~{e$I}d*v<2Fz8j~-XCVg-b&l|v;ehyLT?2&MF-khX}A2{dpa zw7`prDF(u^($1cr1GnXx*9u97TUWnjBOgocRwzY3XushxhqT{Nu-_0LN{ikrnl<&) z$KH;}v`}h-PcnCZ_WUK(xY%WvU(8?+6i^4?R^wXd4$SS)>z#qh{P{FOnqT%2m=`!I z@Ncd<7b(Dz)x)O8vl47vV+1tNOu2NM0UtBLraelWfx$rTVdl^7_Fny8%u54ZwIs=%dp1YGjeD$)?auv&{ssR3MZK1|!<{&r z1mGf$_D^T!F<0dw>drssyz`{gYxiJs37$=>aAV#0F!9`HJg&NkOaCeO6nEa)gbg?9 zo)1%B^vud(Ps(~z$(=fz2I58?4Z?k~vo}A(FL3J{s4on{0B&tg+q_(?KmWqOz5{aK z$jf-Q$6I-7^V0)cS#cdifz3vN5_!wj{tSa7H|O1&`1gEcJHbKYj>F6JPI*fXo*-J0s4aFSZe<|~WMV6E{`rcOFnB42v z!AD?jk;tg_IcbCkDgn!;VS2QZ#S>?v=2BZ6S1zlOi}Y{Vtor1KU!qYG2K4}Lb&d6? z6fq?w*V09U+;F;0V2+)luTa~wGCka}A`g5?VMrycL<29R+w4zQE7grUKF9a#Ib*%${`1ZLf%+rFA8KVM z%*L7^Zq(gAc8vPD&;uS%_KiqNu5D&r-w5U?>mtrRc9@L$=r=+-w4}rSC*}U3hL$<& zx-tLA7f$!$%F=&lUP2GaRf}pHS{L`s)z^*t$9&-~eeBIWDf3O;TUzF24DwQKUyK(X z`NBm`oqXX5si)L-vRt)>`7gVP=8+Ga=EHvDL0o!*K2p-X=D|gsc}BZYf8+~yw`*X? z6R|GECZ*KAzAoy_=h}_>BVRa2*JbUWh&qTr^s+KX?gxoWtWvtaPj4R0JMd)GlQGy7 zuk^27tTPw!2dQIKg9nHYSaLM``tx1GYKhy?_DF7R+Wn>=InLp5BtA%+c`m!rc4Peb zCr7it@m+bUH)t|owEvBCl0y1TJpZ>3G!&S}G!`POt&43U{T}X;4=ci`3p~M;Zn-Dx zirb^^b<0`b-OEpFHnI2w6YH4kytwA9hptn4=k4qK}GZ>iLH|Ax3&7;RHf7L*s#ccn_9t8zLt${!sAmMS!uXsFqTzbXB z%$_zckN5reW8-*V`j%IkK{t1RuRKV^F?SK+&QT9v?gFeTDQsO494AhZy*nSFBr)Q* z#`|KV!0h?hqrmJ*qGI$q`npefAggr(hiO`Mm@FTm#)#b*?`wj6#N)BX5k$g1BKPpF zJ*0af7AWrF{g9b~y{pv~#@!FLS^v_mB*#72WU+}CZcUckcY={lmHHb~pOm&+Q_CiF zxY2g|N-)~u+>5XLCu!(EN=uONAm41Fh#PIUUJ+|xZrz%5m8t&>{-gCuR-0Ov0f5cv zc%b$2Vc#FEVgLwz!~nnwaemwSHUC)%R~b?sECZYT;#LN??gcBu3-5o}E`#-dnfd6y z3ei-do#rwlxzmOj$z??{)mo8YPU@>zkxc(&MPh{;w6|Q^^Ms{KajRKudXHP_+`4{@ zcKa7f!aqa782n4&B=+=E)S9)Hkp0}m0D;XJ!mvT@*U%@DKMt=Tww{IZ#pBxJE9b)p zz=Utc-*&|s8im;+`8(Ik)zO84HXko6nM6b*mQLcZa1xeJswc2y(JCDDHpGA1DbmDN z3HS~mT|zv@4Am7NVS7^+fn>IH_7AoWq-qUL^$Fk-NrsOX*Ft!X8{i)vv7Nh@=>BPK z`sIblCl#tgda%y0iBWD+eWd%6-sY_tOzC3~1#oK$9;5v$H8VM0m2a)ur{{lHlR*`u_ul0>)wDUnPmyAB`}0 zat0l0Ycqk6yUgIirp1AcS}|Pa1jXL+%1gT#haN0{&VT6Gx|~;to>?&b!+RD!iP41^ zn61OePM+*!Vka+lqU_|&PG+3Kd>F-tj5F*Rr%%x*M>F}e(?567n#QZ;acTCMZ>S@z>wWI0k%rkdEx3|GfuV=I~=Uja8Uue6LR@bq0k!D_q zDrres{F7%!cK5fqyezfjlhSr;_?ai88{2LlFUEFA+v(a`tyub(wh>KZ(|EPvclEuQ z!=j7!V>Nn4{qA!;Mn56r39kOPODfDS(~a{-8ue{Y{a#Yb`F}8;pnfl0j5C)`H^ys~ z2FbPc7~_2Us=dZ1<=m|=!kkIn7DGScJf40z+Qq@~_@4;pEh$P?W9BFstEjkcR6 z&uBL)eDw*tXH65_G)m_C%It5oA39!mq<_}=;GZiV%lBj0R^L?Dvt&NCZloXSp52MAW~AMl5Rjh#%t!ZzjUeKGw7+BJ@q}2nMw@vpyU})k%R$?F z$?Nxw$p7{DTx~Y$KO1ypp3rWz-QPse7OI*bev+n-vF+AoGlyyy>BrbhkUy(R{G!ts)@Z(**t>D*`C@+kY$?gzW&>mH_|Q#gbT=)mI2>-jt@p3dX$lAFzVmY5AxX z?Ejr(iu8}3DIA`bYUzSu%cpr3%w5bo1$M0z=AF{~bD;nKt|`*L_@=-$<(?snJhw~_ z2aQrgVEKP|r~KcnSknI+GuFRavGBBbxuf{lLsDZM9Yt#Nf~SidC#naH6Jx$&W~{eG zX2ybN%i}2A>L|i;^;pjq#jypJt5!U%Z!T&!sTFh&%qR^|3|IGPN%uk>#Ty;P|Fm5F zgR@TYBmOb$#ot#pZ_a;MX(TrMqrCWTW*SWHsBKhOqv?ZB)IYgtu#AjdZa(#djaQOe z|tNyjH+Bux2kyEJL$4$3rX$>oaiuY=?u&O{bmzhUK*)$*hiw_X|ZH$@5V z>lyboY4-hRv{zP-`RYk&yD1vXkJXK~yCx0Njrc!%{3B`Ufgv|0BsWEa`JlSdc2}iA z`|^mOV^7vAOG;56s!Jhd4y=qclmFvYX;6<0%DVKAoIk|4n+<@u+`2LTNH^H4$8jIV z_BiCz%Vbi}qvslj_s-vv|3Ua=Mub-58gWnyURtmy*Q1k=;0dq?65kzPjBL z3Z4usOwO{Zbb({8jM>AyeqjOlUxTZt_(>t+F9 zwAEMDB@*V8?MB;Ol}0`Ju*JX|Pbw0(7jp^ozjmYjh$_~lWcsU5M%xkZRtK3ww;O4< zFI$&)wmer_eWJRw?E(F>zHBR~I-tTS7B_j`R)uNquj16&7uQF=91A5i+-VSR|_ zIb5FwoW~#g9@aPY{23QN0WKh-l0{s>#bv-%M4V(1zvAKs;O4Cb>jRGH?Of@=IK5e_ zE&6{I?Y~3=wPha$9)R|%=zxk2s)!9)AnlNfzE{yt@;Sw(kM zRERwhkyfOlAu1ZGqG2jx+a}^K#VQ)1qLC^ZrJ~U)8l$4I3Q85msh8tbG(klZRWwOO zB`TWix|-ae9zS`quC&KdeOG>dJCm{WtEcoyrMph*y-M}f`n%i@rQS#NL56LMP2gyh zftEJ@Q6HW0yGg($y<=jr)3MFT41=Cpy_CqMO5|)r&cV7>a{=>^xKX{Mh5DbCUZpdC z)Q7$DKd;@XFLP|;`=jq_r8d}@fKlaIEhBCTMNV z)Q9NF--yejrGdxw|4Zzth4{lEC7}W_SUwml2kYr6C1wf8Y(A>5 zQ+oEeK8pLJ)OEpI#-hb+e%^rc-->La*LrNt-pO*C!%O4py%&oJ@8jClppj>OZQcy z^`ZZ>C^;6WsE&$;sc3|XMyqI?iY8i^d}YH^Y&A4G!;-$7+}2gG)zD}zO<#^;V=**R z3>bmc(n{~@;skkR88%EPTBTDLOG7-Hf-T%BUnpUrwILOVAFalb>AAha3T5VK#Cea2fC`0E?sXMU}b&fz3o1OR5p|3!*Mw$F4zm&I0pesz3eO zQGD5=jbS}<`wi^Xx6eD#rQJ{IZBO^Y=827sp#z!_zfQdd_RbSW`6Y_jkD0 z49pu4ZOD##^MihQ1A6!B^A<*U=_>&yG1%yr7DlXn-tFC+MZFhLy7iPkSo#S2-B^rX z{&qjyJy6t%D-jWZdT9=ej*ae}_eNfy*G0>AMB1UA)(Pu}Jl+_P+waX6xEs1obe=K4 zKH=j;%O<1GkKC)NnS{h)dC`xJeZnwng>GRO`>N^0Y8JxsyO!HZAW^jVVObNb?~o)~ z;#i1xh?XoRkSto>VgVrq_l;Ddnu?Zk&-^i*y&iqal>am#@%AzFJWB%Bn1H$7v>wB_ zZtlWeO!-F$_cZnP0*_oKZOpL!0DW4)`)LngiP-m1Nr~7?XDN6OUGIh6GK~TKKa3iX z*E4TGUY{O$9eVZY^#SdLggQpEPpJ7FY=@NB>jLdc+XoW+XSBb9SJL4MevQshaA&$q z!Ozic)FcKOeSH>~2j%vDH*e}V8sLo$tvG2Bjq#qbhs0&>;b|K>V-Ft}t;^$4@DFf7 z;%4ljV`$TNNnBbnpZ+I(ld_^rr^9HMRT-IN_#WDevck8e#SGgg(J}?kq+1nSMvp7_ z6Z$8^>3<_zhGm+lV5|V~JPQa-kz*fkRl`RlYx% zRr%gz81gmyFub2eDR>`ktKhxxD`N3`XrT`)S$h;X-bb3zhQ!4n7%r-UOjYnonx){^ zXmE|4>E8;zOKrZ0&m}b3SC!jA zUsZ1Jv3SUB3d4}wD%bTs7yiXpmD_wjR{u~jw;;d-cT~aq>2C_&M}7QR{9YQZ;61dR zKPwg!+#Ns2EuP8kn!hSHt%c#0G(f?x(Z&kyOrKKlbMyrZ3j~+I1otP)9D=i0Y6W-4pOvdEwOUv?C($GY&!kQTm(jio{)CQY z7;;;zV3~fS;JfrJ!;l*Z$R8uIS9)fED!7&bjNlmBm0<|(L)Uew3$F=K1($DSEM?MS zh9S2F3f@mYSMWYst>C@%mV)J1C)fpfvVsVf>gmh%P<7@R*=L3`{@WJVjnG2@Lu|bg7?rLgIEC} zIda6_EHu`aBr@3*1*>&#s)AS2#R`6nZc%V&dQid7(euF&T_O`*v%0G2oOMAjiHWXP zFbhqU_Ru*>2(nud4A~_?cI3SMh0uD|45i*J3hwfKW_?26^QGg0S^3)1B@9D=I}|*V zo>OocM@}mq}C8siirx|PoGopKH6Ksd+A68@1YArSW%e}WqY%! z2r?PAw<|KtqTQ6hN;*KnuhC)!ccwEH{2X0whY*vP5cyD5h=HNv&q3zCz2AMik4*^n zdp)mb?z_F|nE*N~xKz5Jw@7n>@Z}U(XI!jn^v~=6ZZ2IJY{loi*W0;o_=nK7Ato`< zDC+#v;1DyMYvCVEusR_j#qqd~ci=RFg%Vh3Bnu_7&?pv4VxiGouwXO#c-4e|P}ho_ zn4W^M&Nyb$_#-9=rnYz%{1f9TAcE5!7D{BHzgQ@Vh5qJ(tYG5pzJq$%vvoq;WHN^P zTHypajJ?OnxO<$8zsJdhdz?(y>zO35w2#{MtC* z%kX866mpmRUrN2gks=mxl_NtKzQ)m;3A&er-o0MeE$4)|`gB!T9Vr+eair2YVMRKf zzYrZ4>!?fUyJ5j~Q=1by78n9TsEmaYSlUJwN@SsfVRb%D?Lug~26ci{I}`dU!!Hrx zuW9pxgCV(rgbr&^CzUwxAm~gal4KTI$wDaz@jsSIF#`!{%3_Z-Xf8$??e7fi)#I%X zTJ?SV?YutmbL3C$4rQ1-Mq9dYw}$wmL=xz5Px_G(x023eaU}8dUb;cK>l{6< z#3b2YqnZelSl?(%+o~yd9PCRbr+*e!&uDpP&>Owp?$=i=2-Dfy9A}-OmT^6qGuDZQGhWxCWMe4HeGl~hrB^~z2lsH-=jwwa7X(@pfVdGs5x-} zLJ0`PDWOD!oJuGOp?4DP$6~%EAwB!{MfY36%|2J?ro^<4#QLT(Q?ZqpV)Tiimspe` zBDf>9B&9VV=H9v8^Loc5b5xtuvjK@tq;>_z(Wev~L%S-tG5uc>eLW(kG3VE>*Py-w zGt#Yo@4o$Z?tl*(VRKWRI3Us_Mi}e$iT?kH`x3aOj_v=MEaY+tmv9XMBgB9N0Zj}6 zBA_H8APORCP*ki4DpXWJP-vyq0Ihqq?x{=NLLPG=TK@qK`LPY8F}I@OrPO(hOi%pb=%3~bytr49dL+|dU)l?)ioqyLaT?pl!!|E4)es)5Q^?VTL;Vc1%@A zM;r1X?}_#h1S=9L3mH}oLC^3^h>avc_(mc4dq>j9e*|hE;wy6sFV4|S{}{yTvV`Pj zI1?X3+B}lUcKAh%HHNfQM_OwACdScJsE)Z!f{vC3#X4K+70b0$?eHU*?haqW6gd2L z%;Z={J4i$8IzW(X=pz#38miQi43VUvw_-^{N418AGB}Q-W{}kp7|tX*{E_IW*_$6% zL&!NXjx;ioG;)8Op$y0gH8Bt38rvA!$=ODqPFx!!9exDU+u>`NVu#<3nbFD71ky%} z4uV`8-ylKHaBJp59tFT&9JDfuwDONmq?NG&q?Mx1Tq{Ez{%|J6;g4iSIQ$}JdS}wa zC}<+OVm=EM^l-G17Y}VDzq2OZ*~C`yToYp*egxCc;cJ+(cq>V0$IOi0`=-47!uM?tZ(n4&|-@_qptw;+!4O|N~4u3e))8UV#rp#Mb4nKJjGuuF#7)_{n z*x;ffWpq&S3ms#PGCJEBXyn>xbodd>AcwDEUUT^E;An&lK|4D9p%_JzW@uXXw-9a(iG>pW-F7N>uR^U;AFLj`T=I0H|!lGNm%L@JLYCF-0x zuR47;2_9yJJW(V7ex@UD6v<0Dqr#nj8t0=2mPMGWcvey}tm8&QX7qN|M)Pl2L+U`Y zsvT8LN-DRID%Uv6?@eMNeJ0jX>A8iB%!iHiQG6m{zUm5RMj-hlxpyGb8^TCFjRb#9 zCc&8`Sm+4OfgrF$iv_LefK~DZBw=b7R!yy+uK1;uSe;&6#N72k|6;;hQNeU8PbC_y zI26bF$pq>?@_C)mAsj-cZea+D2>GT}sM-vuMjoIS)K4&tTVcxc3`*~Y#LA39u+iHI z9mee`747fd9%&6~B<@`X{K8^%61UxP5Pyy$!iVVHm-r=&9a~y3qzvpJlllJ?Rwr15 z>hP~3+|?m(bw;Og7zI#_dsw(qtqVgzGdrU*xC7OmZsXn|{Eg7K4oHyqYM>iBi#1lC zLE&fG=rt(99i77+d|plfxp(MtOV|Nj)@38}6r|~Z znA?Hqimn4P`|!x!n3m}G$9ExebQN9`&?QxLxUjXqIxTN3OmTTkt^xgwgDJqFJcHv* z{D>I!By-e`*+6#N5UvMx})go}6c?Dv2xKjm1FEcqYIF#}5#i8a+JW0mb z+_8C#cK~^bV>sN~lDwWL$QxQX9UaG^a5|t|XfeOXqmpxn;vVQ%4a_r(c+AHDWx=@z zSk=4M{0z6{DNNVJkdd5MDXEli(;E^k7zx0!KE5Pf+$3g3XUXd2I6Q*MNpx2*wl0A^(Gr!Iu_oaSf~w_E%_K+8SCfR1fwiQ} zs>~&b zndS&fLP*Rfj&NH?__QNzaD=_PW=4VhqaPB383Tk7>No_lkL+ss7tRMpPt*;boUg}B zq$3cGnZb@g6lSJ70+E>c#1YV8^pN>cmL9`LF+=h&QS1KBD-M3Qkj?Ovwf4}*bhCYPLo|cBkVf@KF>7D8y>wHg^m!>q z5H0|;Q%oCaM(+#fA1^v0w9URLYG`+j3EsoQhjbpBq* zhv`W(f>d3kmu>MaQJVa{p5yn6Z^7dkA^f~wVY(d~RJxzfMpL#&w?rYrmF~clP0Fif|Z;bj?>?ir6*S?_c) zSb}W(?eCJaJi0ZTWli^tl2l(4Y_olFTh!m$e-;nb@OT?}exLH#Jv`LF!&9yaz|#7r zo|Ff*R6R~I#h;e3`d@m+juxD2r5Y_|Hwb7^k~}%G^CV1rBo~YtrA*8#f&q;^u@|9l z`}RIaRT|}3wyIK4X*|(@;9p=2g0smb>izrn8Gzs|y9y&fQ~*0;I51U431Eb4 zbOK1NR}=C!__Nb6?UhteDogg3+OA5eB*E^J5wF^Q)lf29PamqiE%vS`&%=M!P~8fg zDnloF*e?4}(YE7vMR0(OZQ?yqJM3lq@SaFz9mOzK22f+h;67x%&w?KrYB(xos-((F z<3vzeR3^;8ZoSO2Fsi|xYcT&R_MAwRFii(VxQuDVkOP;?hZ6&2HS$)BcpUA^#vL9M z0>{j~L?bx#2TolN->?lWD3BqY%s(5o3$pv5&#S@uBpt{O8I^7I+#=}}ll4B9*ZT;% znbYfi0zJ%dR*DCE)`La)3b;tZJ=lu}ec&qilqdViM*=?q(y>7!z(ROL5sFw|gaz*R z3lEFc{JT~~tv5thgYEEg#Eb(=ni!JN2h57L1CF9?laBIGknHUi0R9Etm9pjlLCe7r z>Bq?NipO{^r#r@DALQB^?u-1Q0*ma$IJy|=>^(s1(CMms2$-qGTtejXVr&l=aqf7y zh`Bb}*8UHXoHwA<*6j~bFmJ~gThSk|e)nxFyE|R&PD8_>6FA@vwaCW=|7TrwK@XX@X5@0`_8& z&HI7KHzs;C)DTgezRN3b@@pv@ z>&Ro@<>hjdc6qTw%51YC*=>C}&{S=kWuWA?Z{ca8#BuhcydFnw*IH6OR(56uNiJIb zE(@`oI}Su&XHONpo0`6awexA0)AMOIc)X*ueKG5D6Be_`TQ+(Ee8#Kg{e#6;TFGWF zoghEgf_#+&=<@!-f(GN)XCwVsLc@Wfa#1b9LTs%7@rY95NDVMTd}t&c&J90irz!JO<~JKD5XwIDA9`l&6>pZ`JI zIMol4LCkI2v4+89 z9*J7`y_|#$I~vd?&v*RCjqPDj^|=?Ndy8UfY`;AcMOo|O{oHwb+=c7tg5#D#9Q-Mb zYH75WMknR%JS-uwotin@L9@~gYVYL+538^!1pZSz&^sPzy+`go!B!9VhxYMEGaj|y z<3Tle;L9G17Pd4ni?wJLyVbx}O{>`Ap*Y$~P<_q5#lz($ZSl~4_tg%ARh7|pfKlD8 z?EuA|Wcd~kPyuRsMV6G^Pee6M=E4dn7J#^`>j6yz8z2Mb)u&L9C%X@-TLv~}J&GW_ z1~8vWottMMGiivMGw}g(CDvV|=0MRB62rNza4W#|g?wk`5+0Y?z6NR5kS37ocauoX z77uZD;b{XK+)b>$@yM!pi-K6r0iDfIQ3%v)^;inA4*F$o@nHQIQ~KkY;kUxx&59-$xMb+09*ysxxp=pWfUhydc0n%Ia$$<$HaU zZxfOjgCs)bZ1W`R7YKIKJd@pK-bj`h#U^FODKwMlLJYs z(w#Cb5KB9>kF}3cRs7Fg@#P?!jBwnVdHe291j%4LK0 z4LD<8F}|r|R*YwOzhtc#k0N9fHph-`n)b}F^_j8%cac^{`?szb&rbi@vSPeqAqQimXwza6FsGAp><^r7+JhW+%Hi0e z4Zjwefn{n!qG?d=Px|hH+r>EjIL~g+fumG%IH$Mgpo74tX^OF8TUQrj3W0p!?S6Kq zl*Laf#+I6v_HDxIZ9>8*ewx4O(|q)cGhGu2<(n4P_Ykm;eg&5ET06zLP)N)y9c5Yg zlKnWZ`Z&*0Zbb`@^H8lnQDO~-1v=Uj!JiKn`p*YZq0;y+#$vQe=!Vt{-L7`ti(&B# zAHu|Bgco#o<>JIDG^cHMuy?f;Zt_VC6Rl4M%09 zwd2X965|?-H)6b7cv1{q_n7doxB=r^LN@d+titio6drzuhtCLc8m{5tjXYe-Lm>Ns z$aEZJEq-}8K3+tD)O$b^YML6?wArj6{18eJPf_0qqaE!MJ zM4)4O5R|q-=gbcm33OT_eKe7Y^pNAY^KlW7mI?i#i%`lD*S?S%v5>OlK*NsnHbEEp zmCKplLm;@C;F69Ypa~bD24^*qsnDq#MJfnD=R+r)X;I+2Ts6GLK6sbwwq-=d*bg64 zd{O#QUS^m`@XaIpPA|^=yweNSInrPqJXMehpIIPfw>jN38->1iq^@4dT0WCNkdqSa zLV6QOsRy{UC*+nN9I?&h7MoU1x#1seJ%TA;>&d_(35Y3hJVIdv+wy@yaoOs$u}6mUG!l)WoW7lN$~POhPL;@O;F zBX!6%67M-uhf3HO&2$t>r>3z&DP74_TVREoDQW5KE+E6U{1CafQ(aS z`#l7XbrRe(PsFy?ZK;^{J>HhU+n9)~gLrvcCV&U>PWEJheky-~OWr{~fuCyD*cOSY zwq|`VykHGNiz1%ik9w5Oc{?rkc7A;|d3IL8C?eq*l zRY701L}ejgwX_)@iLAV;Tec~l)KKf*1494WKNX4uKIq4D_)n#w{!OJJg6_;B2oLqu zG+;!YB@HPX#Y3YtH%Zaf{b?TLe=ZAw#Cj5>AYe%xgal@ZlLP)sF{r8333YPr2{y#V zg`i#2tU#fsBp~gnIiEzS%D?%|px(SDE)MvZ=7QqW6| zJ|C&dTxBt+OQUxi0H|5d3- z`&vJ3lN<3LygK;Zfrc#}u&o^4 z|1VuZ*hmjR+!g5cv`7RoE~$uQ>&vU(3g-b?JxaHDWUWEh;R*v$7k79QE(Qjo1(2@^ z989b|&?B(npLfy{u%1gvq!?dCztIiX1VPi<5u)tEaS4eGm5Kao!5khAMY`G!D6 zg*X|mAy!oXK)4fRxJFb4eJKMfE|(`IOC7RN3q?}0ze625_tgTOLrPLOr6kEzO{~$$ zT*+UO)$;_LxU@7I6*Ar8#UL+X*}P6T%RUTw4`X`fG!vSlM1nn-vF;iyxQdy%IZ025 zO|VSB@H@j9IkgK)@U!HmI{X~D37rQqO6pjPkfodq*1^iw*u0mEOUD_`@ThG(&xALT z++M{?uHyNHqCBl%4BI2&6_f{O9+sl&9@Da0;<{-(S?8f*I4)yT#UNByj)QA4K7e6C z8=Ys@4AC}Q(O}*f+T$WR9X1XvoiR}ASj+H?9>)|9mAA7Hz?Cd%*eaxyGNje8k}cfI z1xT3_OWF3_*cL+&S-6lo7A|zSm3+uB+ei)7iqB5yZaX2RGTcvG35)=%Aam1foqVW% zg3~Est8G2+iuAU9K9nDCnZNC<54Dn4WU)nPsa`xwk?pvQ(prBcs}iaZSd>uI6|%+d zUw@q8SeH07y6L(^%oFPp%ojZbj&%v4HylE929_rPLniAI60$DAuq*@1>dx&3kC!Oc zcx<}g5A?7njqXF~sH=E7YBwxMUAp1WP^5!l2x&dHOln`sElbQCTs?CzVb^C4-ZXPC zy5?XHAIo$up0WsU0&e;~u+*GbhsY{}{q4anr+<5}?KfYl4R2dlo3|h3XXRuy0QFt6 z+BV@P;MwgQN33|3tOm!Va3UZls|iLnk=2~6xS(?W$*9+p7g4K)Bkd;&Id}X-A*$kv zu67$~;d$7PTR91@k%6z~Qqx5vn+l|Q5J=zPQtZ@7mzzM11j1d11&Ze_O~9Gj$9RK| zHLZ&Xw-cRDfrScNF-7^bn&gZCsi5CDm(%wfhbG$+3{*?o#FkWif{Wun4jlh2j&J`5 z`y{h}n@e~Wvu|^gQx*{BVO3|v_@BYQ5cnw5dFyIp-HP!J(EBmwJvC1LT{@X2}B14VY>E7Jn54tv)(FaJjXLzBbZy|u7`4g>J{S& z{PcSm6nyj=Ver-%p;VDiBH&MT{bCiDOPpMvE3%hq4pa_xodV$Z0IQfyD zP2c*(!;1fcKGrLL_liMOWLqDDs>S|cM)lhdB%S1qGd9fI&mfR>Jc30O^c$hj(_C_w z=^w|d4z7F|NPW1cqJepFnl#P%XY_&o2fyEc(SiN~=LZjh{v-Zl(l_z4pf*&*$9amk ztYqzmbI+g-N1V%qI8QOj+FN&4by68OoiwQ9mz|3H4+RL2TpAafSZK(K@i5>$v0$+G zzgjK$H*B$0(YOEy0eC#1!CKzctDRICZv`9G`(jlbyLW$-ZxD>I&l9q)5DGQph{+P1 z_Qt8TQL4H1p+@!M>HyMxo+i>?9e*AZsqtsye!RW#4K`h`d{HsfG5$amTcP|53J;WG zz|@NopK6!Bd@M@!wdYGlbz+wuO&McgqMu8tv%nXpH<{!(FdGODNH#j>WKx@;&-Wqv zZRV2{ z3s^+*`sCfVgKxvr2|Lj2RlkOacU*j)d)X7%Jz7SXycOf0f!!~6ax(yP&Km4;npuN^ zTUuf7{55>4Jhy3kuMC zT-GPKzBSHhw~_W&Jvev#RS&e5i+%>Xw{8xAuOB)P|Ep!R1DC#-IL0$2Zlqdx3bb>Ql` zvt5Y)ao*D7JPz^afc5pxAIbr&1H5jzhwPsVIX4ZE{SD5lo`tRd)0q|}hk(lwaD5TC zP|!}4&mruK9o?Nn*n=N0s=yLNm}qI3i1e~B(WWpFTH?sq2)ElqMVvbxDnjpaNqVAw zbA1Q z?7v6Y^Rrq!hSwK*HG|hs%+G2Fls`* z3AAp|E|dj72Gte+kad0@qQ1Zf5cR-0wyPmjm>VGKES#oGAa%KXrubQyI_MDDrirO+ zqAuhuY7hey-XL~B;kHShR2wl)ZB$2CcFA`6kw`~2$OXFzXH>uH_CEv2XOr3YSpa!n zIAxu2x`i&B-;^EW!v9CmILz-(A?fdc#?4zilq=r|GXl_&W(fJno16RpjPB?Nhj)sOn-A4NvhE(vW=S8p`L%l|H3pX2Xc4THdj|BzF2 za_KL~sKJAP2>#_(h18%{&rKuznM0)muFqx8<`L37#pp+MNRKwEJlsEzS6e=<)9Io8 zFTPY@ZOp2GVof-Gfw(5~f21GOjF)xb3(rxxgC;%J4~iO6HQcCrt^W6T^@z6wkwk2C zaM<;b>CY5}(0oF)r+9zmuz$E4Rn@F@bbKmMypak|k3-Lkd4gUDXF+qGr6m;iY%L+D zl91#5{|d@PXM+;Nag30vvqPlQ?+LVEKt2jX3zLw%4STBGNN3dPh0aaWLC@unP}o z$5Jv;RAArccsOXsbVZfS-9ffO4b`#{6;I(a>-4stG*l|l)AtskJ+ekzJlr<40~Kbw z;6p8I1jYT_MhJqW=`yq++yixE;8GJ9%`O+qZP#Q}0D;O=Jvpe{Y6PfUL-hgm-_t!L zpvRBK<7_{d8vmcepg@ML&&|gZ79+CIg|#GP2N?5D5w%PJFx=1D{OV?9ki?Wf4b4ke3j$ zd|hGL>;@6da{R#MaAD*S;9&Av;I%iniD$_Poa^ZxL-Hx9El=Ch5JP0}! zV7RoeZ3;Q%XFC%Gf+dlOqo4^y82$v$CfGQ+b-6mgYW@+BW>oEs4l$@tYVIg<3*=Q< zE>yfJLjLDrg#!}jt^h4_&gu$5U<2g%pM&8|v2g8=)?Ogcoju#rp#IS&5C6ktzgzPSX7XN; z4hKvH7c^k%bLXVb2$`C*#519~i7iGORY%_5ZcyL&qb-o>MWDH-XKzIlKBp;lT;UCn z;f0Voho0|$sYt^NPFAWGM1E&b_fo!?M#NS^90z-Bbv2n#=lh=njH+1~4F>hQ0ckJZ ziJCJ$e~CB_*5yTU%)iVXLkDV~TLgOxx~GYa>I1!k`hDSgU#{m^9lI?&mO}S)E$e?y zsPhzutmVDd(x_@ZWly}ivigfSz^j|T_S3!O>6oUZ0pSP+xo1F=i?}5@*RGWR4RxR? z@OTEGNp1877+$w;5gOFCtq+I{0ZCgt>bH0}7vrEWI|QtyO^LLP5a}t7SSzYC8ddA} zgYweL{R>`Ty#V&sKQ%5v)0#>VuBo7D;O`<*8`E&-gkr{7uBM5GNJkt>r{21_|8t|i=zAJV@*Yionvo7|H!@i$Tf%x6UzBPRm z;aILZITnZNdNa-SYh21RG}o^?QmmL`=qx`Cdy<>G;Vk-0b%>kJ#HP5oQ+2&jvEde% zg=6s`+>B|v?M$?CN)b<_-r-UmOkdM?)xo>o<R-s;#1!2#G89i6)o zz&>%*3>xE4@Wq$7ECk5rboZHw?vAa-09P+R>fqct2KqNHBf+x?du?sp|2hpY?aN#m zfwW!QUm*ZHV9^yWDHc4Jt0=;tz+?|B;*js2j1&1j;U3dmw_K}EbLy7oGhUC8?>2yZ zTTHsPu=kZ{mS6Baz+5_?2dJZu5<@sDZF0Z9<;0tN63X zwnmk8eLJIi;>#WWKHl~*1I_(18=!SB#Q76>>Az(BwTRar#K)MugN*7=7Y%tKuH*zE z(9_8H=7#g}sxPjbk5@;mzZNf_t9+U*dv?r!DL`^721Wm&^a#SE_0M)%Ydf4?Vonln&Ta-3yT6-3ow}o2 zQ?mUxRBHy4Tbu2v{d1iB?^>h-k~#Ip3wB!f8dSgU+iOs}@7U|27j(1dcCaJ=5mqi| zgIr4E!ptU00+7>x9gBe`knyxgsS zH*0sg4J`osW_hf1sKbVlDRCcTMgbgu;;y#i3rJEW}bDFBYy9?D3U-k=m;g(+bvME|yrEhf0XKSpB<* z5@fw3pKZ)ujPz~zRlbwFO%q$$u6Cn>Jl{(YRKCkh?uKgQ?sgf3`Gel6Inv)3YAyJO$dpLshc!iH3qno6Rh%4?BjU`G8s_ksnb zwiPK<8|G$ry@@CM@x#gKo;`(9+kq4+&MFx*Ja=^7?)VQ6i0Q1^*#3iX#1F#K8l1Wp z?MI<>R%;2?Nnzh>C3C8$pwhIXH8L^cOtHxVM~xmrF+w*18xhoQFtwZ?BnuoYXy=y& zH{pVR1$u))B2i-Q=p9K)Rxvj3RoKR=3yB-7@<(bR5XSDRUMoU7NKlAdQfsh(Bu)i zOxWfc^5zJ%(bB~uP`_$%?rU&JdKV9SWzN~k9BMQr7;$5yROk~=+l*K4j%4o8fvM~r znt3>qvPGs-19@6M+pKgdA~bWk42buhBE?H=N(grkno=Z)^UEGzY)68#NPtF`BEj_= z#kqgjZlqIff+;5Jb$N$Oi&2Q!^0mHo3GQcp4_fQ%&t$a&O(h(}j`Yj4b?!-N2433< z)o$uNT#U@&(!Rq(iPDm~N8Yf4vcfK7EJOR*$MCAh5dNR}$QzB6ZSn?IyE;6-6t>pp zm$Lb#sbhHPQ8HXE8OHF^^S$H7@WijkgN%$vmhFq4)Cc^ahaR@#UQ~biVNU_e3OyMc zoC+tDe&|NwEPuI;vV@n~F889oa6=J_sQwz;rruOrfdZv#Y)5-j{=$8Unrdu&*qf5` z-ifufv{3$?(!YHTRobhu%OzK1SbwR;`PDeRxB|^`B|w0r?ErsBHMR_$Y%8}=(|Ycx z)JVkkWz)dTf$KEUmT4kX>#Trsvp;+j+#I-8<1J8pCs!OrDXKeZ1bh^1>G&2D;@tIV zB3qvfYK)cX_c{zKV4t`m1XiXJwZek(Nzt;>POvTH{F|tf1=~KB7(XV1Myh0+*qG=T5*%pa6dA1d^ z)SS8O34`Er!+w{dSuqdZ`K&~-V}QL6()2-(13l+C zV-`*!bKpu0i?x5uCBbPdl;;v*2M=(huu*oabHnUTyRD`#73tM22{3{_2=qJPbFY|h zJK2{SV9j5Yy@U_B75R&};)+9qp+e?s_mGU93vOk?tuww!1}+9olLt8qp*a)!puM#- z5xFN1SPu6HX@bQI(!i7xNrXpyy?Dq?cM7v_9K@Q)svgMk)tM-+Aad>~MCM4`3Z zUTsh*?(8?HCrv)5_@Z}xht>*sPe&JmEOp>s_9ih8kOqDXE(z!lY2da$k?`;0xl(^} zH9&<+_?jhr1@|QA$Il4B`!_c5iMlo%QDoo6b?s?aF~|V#>0DlFtcxqP9c~@3#pMB! z>V$MRzVf1wlo_216b0l_}U|IZFsKNN^!TCm8VdhcBzLGt`X_ahaGM%pU2#B;yS zdkiPkiQ9u8>!D(K_Vg3P(S&#!;oyII+H=LhCt2et^31owH+O_KW{K{cNX zplRTf$!w0(cTH~2`*rp;>@zXY(NwuM%rg=imJfUqzE)`_;>~o@;{eg*lOT=7Y zLjGU`JRcl7;SUB~cQ)%j=L@QZYfbnk_{_W?JbnPQqZ=Q3^5dBrYVUY#kJsH3Pq$)Oa#BK` zI!Z01dSwtRJdNnTlf9C&3Tf29`Czi^<bRf!8s$9C_G^gU9Vdeoa>rMaJqVK_ z`dSO;7r_N=1Nu-itYlzKqBTjh{UULTF4C@{_C-e8dKeD7-T=VztNr0dHMJ;A5lc+V ze%R*h5k+$WYlc@nH=}Wu0iENbl}vK@x`XBra?MrR-P;q5s>E*qk6Hai;{CgrBy!9h zJh7Qx%%HTo4UTErF{pke%!h>pdu(%EkFg7;J?ihYynujqJBC}0G7=D3| zw^q&@0z+%`geT{E#X8T`M-zylmiB3vuL{ncAw zC%N+fN#Vbttd+DHI&rp8S(hkRz?91S*CB)I%F#mx^_CwF-M7hsTCQH{`o+1AoDdQy z>R=L~59qN~QOM*YlzkaRgnP&ac6yjIO6GiYOH(>ceig`0WQZg1`!{x5 zQdKX~&mr>yN5J(I*K@&c&w?5<%e(TBiX1VnJbw~^%ujSw$1LC2NuXX=VaTdC2^ahu zZuC$4>Rqg#<+dP3ir|b~CCsb{tOsAuZdR0`;j+D~#$o^HQJhMi4u|B!3CyS9p%iFA-@gwL1)|sguE6 z?}Q}-XMzo_JwTBOB_dmN9&lQx_0?{U+{;Tumg>l&)_in|P^5%V!~(^Y>On@;SY5VJ zy}m>C%=t7rLkLs?1e#MK%GB^jNCfC0&J_8{U{W7Re&OAP8a!CmKQ^nJ0f-3Tx-#E5vnJz4(8C}Ue7bCypq~4hqpdL;-muq zTU7&%s&!unlenWK&R5{SadK~?Dmf*9#2q7Xa)JMd8C^kY`Ob&L9U>H{bwiOuri)H) z=AmEoCCI#)H*J;3Z}(`hKYQ4qKQpvwJ|F$84;+ikXOR2Y{8b`XPXbY z%n|K^Z>iQxJKGm@(BjUA8q|Bux7+!g8Sxq){RX8u+CiH`JAn3Ghv2$+wcE`vNGH2V zs5f0?8~ieC+k?uMxW&OQ9kqPA$TB0hv^AfQY`TMFQ2OXcpaeMfQnFE9a5Q;l3IiS5LsQ7@ zL+34;O74)rne|OVg=I1n4ZWozghp?WG3G9u;kExE^#6)1fYrz#(@*4`1>=Qw@$yXg zc@?mxD@x6U5e7`D!kfbA5;~j;>r&Vc-Ea;t(aZaZc21U|>#hL?K3NiRvvGu(10#%v zKct_CilLSfgX8d=1fIYbEB6sh1#YrpkjFaI@w+>ptLeE zG33cuUlXGkYPr1*r`KUkTcK@z0o984rkiaq_^nTfAfc(-REJ>`Gnd)mZWD~4K9Y5L z%g>3b?`*-M8fMe$_S4?wpX?g}s};Pc4z}M$QgeC3)V8Wo)Yj-wI0q;X7LCXvjqK1; z#Af*+#miX~KPzLzf(gt&bM?K4Gd`u0W)%7L;%E86T8(9Tu5DByHG?-}h3$_*svnzf zTz5W3W|j$115>%OJYa3zCwWCw4i=CI+n!>|C_q@X&_<7@v_6(~Z#OQzEJ&xB?bMIy zw8fS^no4#<)%N2aGi_@|Q?Kyl+A+4k5=v$bp$-NvLal>nFX^v59a~Eqc*vg)p@k{1 z%Ei3m!yJ|%U3h?(&@W;X<<=iV@={+fVd!>$FEKg$A;jOy&Y(>U@}Gu!2Z%e@$K0h(K5EQ%cpc!?$(xC_2p@-ewa<%o6H(YV%M8(j>79vy<#EbZ9kgc)J-~S zGnZ2B1haZ&&$5-2QZ4$=l4ziOWbAtTw%Ddlwk;N2)o;gWMLk@iBDR~iNHioAyS*Y^ zX!%u}wZg+5-sfa^AImDl{OEBn+`fo^aS;Ioe-1nva?5tKl#0^clp`_IAV(IknEDp{ z{}cXyg#TMuC>AG`ikYj`;rHas&{iRrJb=y>woYTHw&9;La;2~Nu0RuvBIerndw{Fo z?;(FpVxR0YZL$wM;+Mb$hTA;Z3ENv^sPMK_2U^4&%96lBC>t>GHFG;R&(;xB2mNLj z%Uv!Rw&xrhL$&UGMCKD1J1gj|0Ks{){jC6Sd*2F}I5F#2nSEyvxCuLh;O9B6zl4{6 z=O=}lGxCNqcUl#`l6+j|-r9Z+b1veXeQhwfD{E~%#!~W@?R~L-?1`W$A%cp;E#C!f zw*;a#_9-FBQ*4!EDQPT|F-83=9P)HP0@;2=8x;%X$h5kj)ZRj|poPLBZN=z3t8+uw zwQEB~nfJ;+lQ1n6_BZ?&y>MWDjOhSYx=ct*c-Qs25uL`oh3Zlj`Uq&EH z2U|INcE!uPwUPM1sSZYS2=ZU$b3a~PvpmP=9mX1=gS^V6Undz=KQX)F+3!bsr{N*O z5aB3+673&N<(RIqwor^is{qP6X9zbKs|4VgvbWwgeu!y5WcfD9^r3L~ zZ1G`}=`g0HIqwGlPBKd&*Ina19~#JaNB1Q*UE;SacSyTaMWY@ zS6JFQYc-$tiT%p2PhM#$&{nmJ8qdBKy;Cydbhmh?RlZnwtZpZk+*kD{QDB{F-_YnK z6g(wR6@6avMP42k9nnEk+6zl+BKP+H84FraoS zR9>^CQe?71ua{Pi&I&Lsgn;S9{Q%Q49~!O2be9h3LrVbGKX1^I%+kUg( zP=m_vzypIiVTtCa-FiC~&-!$dp`ey}$vXedLBVi<#v;CUfd)|NEt`^{!&J%R?fPJz z_Q(&Q(aHSM(x^UrXUU*cWYVSbv<0tyX;2OSDaNQiF>Y5t2&!}s(J$h|Z^GPl7o)nC z(v%o6kT=s1!;|E^z4NlMOR!Y=(%ZLxue2V@AuDYRAeRl$+sN;!}=+CM5*R9i? zz`_v!F3}3G3T}=_^htxr@W5H~g%JC_Z7@hs-BdnlSf=SK)GoqQkFrr?3r3F`w-xV5 z6>mOnHM)1C-tg_@-Emc^M0vmWPUG5A$(i&E#@V?S;B`O{z9Fvte#CX~a<+JUA9h$= zbNi;7`Y`pV$APILaqat}M{8F~axCAvo2=@?p_R#|^I&CPfbR)#ALt&zrmC_FXex9A zN9XAA!@rEsIfQs(qJK_u=mDcQRjvCKi{BB@CZ?!WaM75&vC5>fqP#KbU-4lLtX3%g zflvFHYlVKvqsA4N=at5t#oFp0A`Pm37!7I}tf50)y8sy7agjaN@y@O{~3>Lq?#U2m!13PiejPIR z+tl4XM5w&g2^FlmB+em_mRzI~^|PE*QzEwe5Om#w<~6+iBhaL0O*6_%Gd&u8r=A)R?ih~ChJ z^OBbFX%j8(QCwOCldUqNtTaD898N_o59di`S@k^HV+OtIw5CC%?RMh6K~*&$7Mo73 zYE{zz#8zE{NcFw{m0bAQJDnN_BcC;JZ`l#;8@1s^73d2Y)g!j`2?)_IAip}DQJg-=Ja-ZCM0J z-leIXVW?>-QkVaP{l`TJjOwc${Q^SLhhVYEYN}#19zvYgM~EW^psNKYb}Y@V5R(Q7 z!n%lSMt_kmbKExMfFFlELVhFD%OqU{mhGZ~6N`&SDb1yMc@>sj6w;SR;YGVB?cEFz zrsrSl35OM(sEB9u6hGKn5}#^R{jvgdm$6Xst=ItBjM3Rf)u~lS4C?&+)nytI#lBH% zP~D%93OmydX8NQh+&$B)$4Rt^B&94U0ic4JU{sH3Il;SQ+*~Zq@jm_g)N|qn-_3T} zT$nsM1fC9iPu#Gw)B6QTQn{lSV`AT>#SQJfe=M*fan0pkcfxjy8v?xo!glYjXQ9EU z2rgGi74`2Qn0iivh7W0B(wq~(;po4T_iNv)taS9KJY^;vJD!^^<)e<}py1Vd!!Am> z`#so%+4q~1hPWAC`m?zG%nnrs)pxBj4C?pS9{!%9Z;jQhqy4{p{WpW^!$Cjkt!aqj z|8NREZ0ZbaU~CdUu)3tb|3RnTI>T8kf8+&E6IXU;huQ&22hC(-X0 zYlp7r9&1&7vJ$|J;2j|)Ip%$o|CAm}^s3rn+w>2y!Cj#JB%0S*HQDyIUcI(kj87Vg z`aSNwj;bMvvpcCLWG|oJA-xSxT$8aRpFKxo+@+1g1X_P4W)UN;S-9{s<2Z(9sq+yh z3u;%rtaww5(wFab`|NG$6cOK>x~H3pqpY(8bSIFTii%%RCgqMxorWvA(NycKx*@^eLcqctJWqHAS3bwzH}!7_-GdYe+k9 zypqMrvRLuHk&!0wscpZ-$%@4xBz51u>qa&Uj@!#D7Kh#^N>el?C+BMHq0vu~HAv`Z zUB)B4SbAP@kuqcSsN6Bb2`fvKFq<4+8AT4SylQE-o<~0F=kT=fkvkY#vch{|$7#@5 z{NZJT`d;4&jfZc*>M%mY%9qj88lnYW!KnJ={7QrRl`kg*gn(i!Ny0)2oS=pV;EupP z=9sFmJIygtf-0W76gaCBp703)3ko*^(}%!+k}(1JPoY%YkYhUR4vfWll8JJ#o=M)+ zA5Gq0=(j)+7#W(HYaN!SOdJLMa!hI@7DTH{BMA>m=Fiy3G$#-0oJAe{1&)r5>C)9V zUiIysZk^RWhDnC#z@XGvtPQ2T4XXJ&U>IoGSrr{C1}4Lxid7E|?sh7|s2cu9DRhjk z-W;C+Fp_r&$I)6r4uu}$9fEbjGz5Tu*u>5bhBX&xP&x7q)>MFmn39;r2`Mu8O$}Ti zsTut+(G*wXVpwaW4LxUEaxkorBf!P5hHdw2sNZ+m2wbZ_$F&A-Z;xDTt8`h|YO&Qc z!1Mzl?Nv}}Lsz5gn(?eBIi3~tN6`Qi;aPKbr$v~Wv8?b!8OO2$sT+*IvPuZc`al=T z6MVx@2o25{TU=T=PMMLHn;y!8p*WPMm1R})X%7bnXU!XvXVJIfX^YS(gDUA|;M%$_ z4~YIAuSWs78ucyhl;}`{s&gl+L2chRr*DD*vi^GfxIuO9>{)~Q;e!V-TSL^esbJk@ zS&b4bJ1&w3l8#nw?{3WnvS+Q|_9GlsEpCXAKi>{4#1Ts0Ps_K<@BRQ8AeS>CN!)sgZx`hW5f z$_Hw3r;SU|_p zZs~bL%0}g;=7553c@FtXZW2i?XMJ{_$suTbHZV%|(ZpSD~na z^3STsN77I*B)v+ABzYl{n)}Q}BV?_u5#L-3HMnKoF`nruuAS<4V+)jQunyR#T3aPH zbuVQgx%RyBQ^*bDB@}<8OXi`^&a4eKkAic2;XLo+k?HUAQLMc?uXlGzroThVBp+{f zcb@jp^)vCRJ~z(9tG#cWfj$XQ+XuuMRHm#r82Sdp4N^f=HgI0ud3a{}J1Dt3PuwtP zbsuZq9SWv{Tl)}7=`LQJ&`^1%FfZ5vA_|6o$Xf%We@gdz`v_Nky+?OUXLjdNH)k(nZn_K3c*$4dA(OJIFE@O(8TQo^`?;Vr2EDmb%BFv!1ub0pWsk_%^my1!m5l4_8A1dQ#c?AxRfpe)u6we2Yz{UGg_9ePRIKo4{5{(pY z)UU*TysW;k52Cl~dTtleUeaUUoi8?lb`P0Ea={_oWh)l994F>w?Z6dj0)ff+b($bFZWP_iaSAK# znR{kprE^26pGjZ>=D_yoRWM=HKAbKdomZsHEiEm6rE06#kNWO}?k*DS=lwsf-aD*~ zGwTDLF~S~UJRS=dz<^O)l6cpOjU8;qCB|_Q;*hM9IEn2z*|3Q>n{1NZbSIlE2qBsf zAcPn|6m`*&5WV-_dlMjf@4en5?f2a0x%UrABaLR}yyrdjcg{O=V2x6?=k6L}YV;^+ z&(0bGn{dbDT41QZT_cS@C&a{EYJS^6%^a^0HxnT0*=~X zhwMyGpQZFWH{mrH$jMJAa=>nPukJ0ZS0`aK?L+Pd@+ek&9$g34+;Rx@!i>K=h(7}F zX#?hL!SW{)=l7FS;4wRTfcr=!3e)9uw?5;IJzfRemw7ZTXUk6@C3Cg4U1bX`B^|OcnKkabmj$SoA zegFK|9*dB(dM-kI?YU@UgkQK1;z7TUEh=RA9qb*dUgT%qp~66@duXjDPyS0`DwAJC zD7PHY4a}vnOa7Jp9`qZ;#K8ro{O6bK_uPFSJv4xyq~7*N(Wl7d%v0pRQwYyaU)VnC zkO+V!i)!%{Xhff4?o7qT9CAL8N_+YAZzi;t&uvp_H=iQ<>o;K&^KyC+^8<;+@fY+D#W{zP6~AHhXP<{c!=AZqOYC*p zQH=G$|DF=(zXx>C$OJXgKNAi^EPeKn@BRln{esCJBdD_+ZgTzVgHh8#TVK^vJmvoQ zch_T=TnN;nHM!FF=9x~1XN(S@d-VS!h5x}UO-lPH9q=0*OA`OVY{<<2V5caC-M_(C z7l&sKW%=@7c*&^slxqC?XPn98FKV`(=w=0QMy`qR*#CRR{~O5vjpOtO*{A!Y2%>+{ z;I}uxqCS1$ttUS^fA0LFGvmu&oRMxRA}uxYqGNk#*4WPb{~OvsfzkiQWj1lKrc8SI=K2 zKmQ#&?c!k;jiQz}F=?&>r5(JlZ`1qXg*$L*CrBbKkNy9CIA?d+?(&OQEo(TzOHyEzUBaU130W&1kRmT6}B0p_9<%FypW0Cer!4-j+vtLHCWzHrX|0b;&RgQ2;ONoEkl z{-qFj7&Cec@k3{jg9m>9Sz&}-yl@^8VeBU6mG~_Rfr$Rv_E;e5`tun*akoF&gWZQm zvaO9MP$2K}Mf*z>gvI<3iq3V2{qK8Dzm2faV86Ff7uaim+5Q${?rvu3jbc3dK|cq? z)b8@d3xC}Bvz-YR4uuS&8Qk9?Q@w&5F-2xjb7Y_KDJye$R^cNnEYdmZ{t=8^P4mia z$d>h>L>^zev7I@@dn@J^RJ=`5dkK2l6k!8@t*a^b5cC#MmP~hA7(fv_dzbS@#=$VK z5B!`_3`lwD=w6sZk61B^oVRyHN`onDqY9M~Vt@Ms^l|K7tdImle&GI-Zy+iB@yUB% zLzHTH%@toFWpj9WfGf~CX;hq=c4DYPh&8p=}k#5Lyr^U-mv9bNeJ zFecNi=d7-Kimnr(+mqUq;!rIe_LWkt9|(h8n^%1s#cvUc-Bd+mKvdTOU``oo4X12u zj^eG3iA2Cj*S@B#n&FzV+i+MpYV+xy!x;IgCwBOxHCBRJ|Klj8O3}torqqf8QNoX3 zU%L{^obf^7&#mYQ(!>+HwATu2quM+sd0yDzj~`iMEvU`?qu6L_T~5brj4}ZwG?lXn z4MTzi5=>zwdIE@ET2Ef{n2l1J6R!Tz0j=3#WyU~SwShE_YI4a}S^;jIV9zd1d3X8e zybousKyCg(x_ZD}0>M#Zjd1OoUU0v)o1U1}V=JuLaOkja%5Hm%PJWxSw}fuKRv(8{uhuWSt^#Dzm;A+nYvU$hCSH4s#~kd#s(=vMwg_-HD-C!3~*e}}8o zz*)(9Pq-$0DWclkC+9q%d;im^LM;fyG^8T-2lqai1`!5Ly=rH@4{Edrx)+5R>7_zh#n79q%a>mtOCJK{o_>{{QecO1(!q|w?OV=84w%nyUF z0`aHrP`VZ(6O6Gd=P%ubUNBvRWCy`6gGGUlTNoL83$hZs1>-mL+NgDKUwC~VVs9UV z9cG!qmHlHuuP@*2LO_ju6FX4*a3j4%v&VLHZ+v^z1pka`uQvGvaYwTdUSbyf^|c_> zlxK`3FrWIcpgYWthrYx6gr#3Pi8OCtLwc=E8Nz)?lJ51lh8g+$hW~kXl8RVTRgcZE zxg6Q@PIn`nAY=Gm-1*^1BM>PyTJtH{=nW-QYb+VH1~J;!Huo{JgB9@D_z<1YKQgW< zXsYlcl8c_WcLYnTEoqJjm=WJ4n8jHW8~r7#B!q_=5XND@njqhdbjfQ(_MkG68yV&q zq!-ydknh7--h6pnBqu@g6OofC?rHT6E4&0!qB2}BL_Ew~>Y6*N@J9)C>UiE#x~^SS z_%4!4J>it^)5rB<4v0yV5Vp%(dxCY)YG$?-}V#O_8 z!=d#J5G|74KA5#_zTx!bZmM9SO(9JO;T{a=UKkg;X(0a20dYRzgIQk7gp;UaveH)C zT%}iu>{*ZAwe_M(Iogb57=&2s#cLhg4wFMskEt1RuWKKlXhT0j644VNn_j@T!U>pV zzr?mZ$feiX_86>jfRTNuN$FW+!#Ut~{9fc3yg5Uvc$2C*ZGgyvfwh z4Z(jU>=XBW4)cBvBlSh&V-DYb`>!9J^;nm~Pe1%lslslApQr}Of9(ep z`v6PU^?m!9(Ae!T0ncAu-iMvX6u&({>}n8X6^A|vZsIn2`82ez3~E?=|@H0JGo@}4o{m@(s;@l2bk{I3bWFa}JKL43e8_ZQ3x5-GhoB-) zwmwgoF*0ANpb`GI2*P=wAdXuedX-?S(RE`^{%#T`*8LZXFULuk@Bi&dHp1m&vl?w(c z=Sw;R`uaN+lPD3Jo8Plq8n%&+Hj|M7m?f5qETJd#Ono^JJ95Gbn+E|*3~3qePmPfL zjfiet3k{zPj%)-On?Y^J1YqbMSUzsT!{{y#j$-p0B}2noI@vNxNLjhrslMy{Ak^Cx z2~2dQAXi>%sy?ho#_t^K;w%*>!XBzrxgZ+ZqglFgYMr(V~=sRC~A1w6)hP_ScAG z;mOe_J|*9gVn_DES$g1JRW~H?xHxN!ERBpb!>$YCJ2!yt(>MZIj+V3U}K5>b_dHTi{Q>_sqt zonXF>V6#cPIkf_=G7M~EU*`N)OuU?qo10N>%q1lSRs8ZAam@LY>V)hlpWW)CaLQ%_ z1E&0ogA#fpr6DL0qu%NFOeYiF#9t##pn|%Xu4PgkBX`LMgDp%>>D0Dza?v!T0>*wA z%WU#c1NV~p`DaVK z!8})d^Z^zA$BgZO@ZG+HY7S1DZ;Z|3znXeH0I|3K!}z;3#@~)I){Gd>Q5e5dE+g6q zD~5_nStLVmFF0-(31|%+{vNxeLdr(N!zAac44_MQTCxkLTIEeSw|N92MAh4ufgTQR$5ghUQ=Qf>OwGCtHTxZ-Z^|{cyc23#^Vwe zPdwW@udGA~ZguFFEb4VfZd1Ik zYp7U!pHSDk4pzuCqa)7W!86A7qw^NV@nU8;a`48S^1QK$x!lcc^aip`{pj)enyRdj zjFlF}CQ2mFuK9(x)du_sm)imh)}EDLC@k8Q{DlZ4N0r;dA`z=(4BirobM-2=uYBgW@O z3@anXEhEP7MhxG5j4TU;uk)Q&F+@g;seOzU3xxMa5bfT9@4QZdjaWPfHbOy8S0GCk z_!Ai-N4J0p1I2$E$ygVTDEAQDn2LT*wV$+xzJo}?x=#d(yE;nLB44oXWSn?Q&?Y?& zqX{`+^B|p{)1%f(8$rdT6&0O{v-4lU9vO^tbFpHwB0f~{6_M<@F*6#fN~lF2k^NlE z(&{)SL2aB4V-q?}QDK~$@**MGRZK?3_p8xsq%D~Kea>1W7`1soTKj>QJiYG}pakQh zR=0ZDeBrXKfBQ~6TTi_Iw)Q=u)hR-*+ zg+wbqB!t5y@%f37dID8z+{ONwnGyco0rDF^%$yFw5=6DRljGl1sFiLhZ3z|Mzcp<# zS3>)n86p4%lJEFqNA6ogs;n2B+<}GZ)EOUn9C+rwJa^gdh(C``AR_7s+c~CeD_pG= ziSZT-^BrD=hO^j@oP_<_U0!`* zVk$wdCa}i)-P~#Ss7RQ>1BZ3Vr#70!;;)Ec_7s0GHM8kA7-@jP?)l9Ka>o|R;rpU3kZ=2~|mw-ZJV~Ag(8*=w+3lLcs zPU3C2Im>JB;TRqBKyNdGkJ)`qLp*TiF+>oXf!lwGJ^wu1_QMN(a{GDo(Z3HM=NU?b zr=v7>ok_qM+ZM>AwK=kQlxk@XUUCG(QVVB2RL00vdoA_Qzw%VZ@_Pxs44E+_#F)`y z%*Zij^cz#sL(YD6LNCs3HyI$$6(I>Bv`-Hpb%$`;?+1?H$Q*hWX*pyCrXD|X1(`>2 zs+Has9)I47w040TwpY`ylD7ZFj=t|4h~7tS?o`yTh?TR_r$kos*p6HhxijTF4Sw}H zOxQ?}FtwnfNR*5cY0G3q>Jl?#SZsx|(5LsSH&a4lXGIhu(_g%p9u=B-733=y6x!7l zB=-?gWtefFoYI!$I!{p+@VIbfVIo&H#6(F1vQ$vKur^UlYgLC_4MsM0fEec!^|3G*bw`@=H(hCC7RB*|9 zxm5FtyW{F2Bw$?Q3hP-)x6}r22&gLlz^wKh$H=Syg*z{18C1uuFq~5`o+=qa2}!A& zFkod=ycYzj4Yjd7igCRY+?dMcLa9|AS-v#Gi%c^zc^mCebV%HXB@KyxatjxW}WLQ&#nuiBu-h|J=q zzrem6s*O{(h812(hR7hwji}8jXc}zHzmIRw4N@=YXf5-K@lo6$^0Sw_x>D4uUyzFb zVm4RbM9TFkQ|;D#{Y<(N`0mEsT6M3UABzEAl%OXd;;rfn<9dd8$j=bcs9I8(SDs7j zv_!~vKypY9Fv8dh;AU&G-v#oT($`GO_hB)3Ebj3o1u|AkW8S$>zN9b?m@pctjH?vJ z4HKm2toH%NGL^xke4;yqbXZ?U;_&xP&RUq5Z(RlH%?ai*kxdJn{f6-tWPt*8IX7mr zK=vzY<8TJd=Tq=yKmzgJ^<9Y19Vy@n(h4lFFochl8Y%8wAP{0aAJUYUe| zJRu1nAz9^Azic}|Vo#_hYqFBH?4JL?8RHG|#+_-N&@G8%yC@OtT^qJsmE86<99E3l zKp=6{lT{(8obVQ%BLe0N$ppW;C>#9ZNs?QFS&>eq*zvcMVKmy-%<-&%N{KrNH+!XD znBS?wxhDFA+_A2;qqnS%E&T_5A~%#k7OB~Sd3eMO1G$$-6C9BYf+1Jqi%SC4U!GP>1>eS@W9%V@&FOD-sjc7 zn!4~ve9thR_|TYTVUR+^MG0O~d%$8wiNFd5n+lg~m|2XCU+R-(f=8_!=l3iR@$hMD zBn7p3?kKhvJeF9QH6|{=UG5Txvt#mjl45oT5^K<{sl+OFbl$M|DWMt+l=Kfz@`xFa{e( zx^WBqyQL=`#uXrrt95)qmtsc#4Uy2AqS>uWV7}u5#VU|}Hb)>^%uzL)n93M>|2o9@p1Phi?yC{>6t;Z#S zEKdXLI!Akz)!YpEzlk7k*8;DYfjoBy0Wx5ayRk-va&Egyas#;PpQ)A1^B=$nWnSjjW_( zKK-t3kXWGG?eJ`vpdUcSfqYiP-0J3}Sh4~tB`B_`O;6KxqqE3_f&7Z{hRKWoU&U2I zJRULcd8iSt6Q@zhyTS_d^eCbs{E6*dN5y~NFxT+V8h+7PZhex)FkH%vpH zgF8Cw?KMy3RY8vM727Bgq)8S;t*NW(=m(J@eSWp$h8+d)vkP22Nr!D0+>~Yt(;uOG z&*QWaIB`3VQ*WO(VwCP-!29wZ#v4Y+z#lglZ|q~7-lzW(h5PNdY}=0vLU6P1Ou#wh zI8`qS85{jkjrBFM=ZNISl!1vvuWlR+zXlx!medCblWK}x>HDnmqIUZigYxCH-=0C# zhH<;J&jxD~LOSI)2(^ECZQg2IOfuaWQ5aN6ET~v*;f^Wp5n0M6SJuK>GJehm0gw&E zYi&z9(9E5X0#xqm8C%;QD+t2H=7`cT3F5Gp#3JPqE~47{H`cCKwQOxqfD=@K2|tV_ zX$Ha?Qu~zW3GdbN*J=uwMR|og5bWwP=KkdS_kaggWXBj008z17Fis zOxb+@qCP%LE}v)TD6{8U9R7`n;jCnXJ9hXw?chm70s_ZsSG)QpOTa>=cC&>YLH#>i z;1)#8j(+2z3nAbuJm$szqt zpU>yTNRxyRR>T-M-q7PeUdC(`L1@nO9OaGnGl%dUb0pfpxXS3*7MINNG58|oLxQX z7-5&~?cViEYOh&8nW zB!#_QRvTrfV&fg>Y=cu3b&}?Y1Ofdn!e;&(*r5$bTp3%+5r0F3B%}_92zz}fFgGl{ zC>IoAM@$0g#Q^gfkReeq@DUCX^=w2|RK!%kQ90f?R_yLP)+5HEd^ z2u;dOXshA~Bhes)1Ctm#m((Gc4N`c5{q}smNiAC)n)n_rxQ#x73$|2}lSADK={`a| z%AB2!)bQSfeZG*}Fp3SJ9~ZT@J%WX>Q@7;hbvWzU^QrZ^v1rYN*Y_|^AH&oR<`(D{ z7t-Z(fJW@P@!h%X##;Il#M2-z$t&UjcUP{2LWFSo8@3hw%qu{&2WssInYb_68!;57 z_$%Qz-6iN2ci>?MvE$e#HQ7bg2>TA^gN!^}{{>qtQ^kHP1dljlb?6o6uRnuEB0TcUpI`m< z3s?&CjFHhEle4I?t(`F@hw7xAG41MA48GvEu2AfZjT`iDB)qxMKE6!A@7!$Tvj9x* zgFJg59{4BNL$k6lg&khhBe<=-eyf;@<5rjTds1ICoa!sXmy}ETpU$1rzaO{Izu&xM z*!|F2|E1=l{@vdSy+Rq2qxTmAQ|&l&y_deO!3nRZqGJ_|{f%1X0p%?W;dQ)+VH21U#vJQJvF6n>r zq*@_b7+Ey+B(g(2iRmI_=t(^1S^XtHb$LPmk@t-L{fDc(|6r5Q(rAXicJ+`MGC?)N zE%Y1Xs2MkbqTrtyu|lSBTkL>2B8L=7hME$_7#S{ur?X3`W=OEL85kln{Hr5}UWFvl z%-I%>6~PY`&%s6%Yo;@;TUuK+O)gM9?Nr9xz3wty2*JdI~Y7?LBbl1VX}p z7$@m|Z@f#17M}hKQuO>k@fXe?dI1TizJPyp0uBzMniba5f45#hgj7r1(#pZf+7bza z&8TAz>#!LLo0pI2$L|Z@La3Gqml}=>PaJYXf??P5hF!y`OUZ$4gb#bY&`Sr*kU$uQ zCu&9kL8(0NOj2<~0rGJE7|rL@DJ9&S#vHZVhecWPPnm*DGi279~76-@AZ zgY4#lwv>8(%@I;vFkbGB`5Ntbtdvgh{IzS$+_ZcQ_o0I+J&L*VlYM1fE|c;tsQW29 z>l?V03A89{qyzuf7ET+T)i%Yh$dg0^T2;N{Q_|wTXb;yE;V)pYH+N`F?baG4aU?`a zo`5ULY?#+W`OWA@pz-NT^v!X4M+M@AKvj?uHTfD=tR#Faiq_f zS}dA%p?zk7NYRJjp>$1UDDfd4uFP za8Ll%CSZDOh0~m?ku3r?mN(lje&nzQ-+#KlT*)rOhv4y zIS^*$7Ym}oON0^!!fQAxr7fzOMH@MUtfO7P_R+%f&FTgp(HH=JNt&d`*a^O zJc~}f;pCpdc1!o&P)wji{H&*_tc%MjcK8U{hKkOv4`vQ&;SSY?)Nvq6aQ+jrYX~Zr z^PAnYX$b&mve=Uv59v(70U&eBfWDNmi#P?5U7`rE^O|%Y(!Vl)8enenpT5{}(ubpu z5`IOP2DhBB5$>6@R4n>|$YDmVMU!!p@57y14S}k3&9iz(*`T;dWGoJpuzNj}G`xO)D@%XV(2N872UIeW2gw8QOz5qAFSm3QAVW326& zaWZ;xsrCdT_Bb*Q#nliz)%3tAMC<(fcc0q=M&ot?lH3`akmCr`0tbBA=eY3@naBss zbDoZZt6h!g=X;lqif2(Gx_hB#Ocqe@@Gtbf9_L6LsVbfcbCWzELfa!|yoamY{2lJ; z!%|T8F|t9^E!kGSLU>K{RDE4FK_~GdGeg`I8Wh#&SE5ro69M_-;j)<7WKZ-V0u{A8 z$$gF9K~+j=HZWw{B{EgwH%6P;kIaE;>6!{c;(N0cc0{bVyF7rm=sk!2g7g_?aifss z+R>UJqY!TEVrgJiSi=LD#eRcj5iCS;Wz2bb3>4{Da`xKV&KB+6i-?YT!ZE$JH?XNE zPAmkJ*gK$iU6#I1`}aYl*ASx#SIN)#*rAimcl04WNac=pH*3s2LOzHRNz)U9>D|e2 z4^;wkm=k1S5N7#c(hx7V`Ls*tRPb;QB3xX!y|5sxqI*CBqYrFJZHrsbZl5RtpejCZ zb}B2Adl~d)+AxH{){ODtl@_Q+skN#YKS_7CzOiBgl5bKM1kD51`f?;t;h7MyTvFXF zssX4`?z7veRBzE{=m?Z8VXFAWO+}gAW6}?ZWPz@<$t`kh39_3WL)21QnzSR?s+FXm zgjX&vwt^iNF+r<4irl9mrYmixfQ|IOgfMa2Yq5#;7IM<}ZQH zRYsK&^o?3vr=+=AoMNmJNIJBv3>Z=3xfbV<3G1hn^%;x%BsCZ+gERXm1G5(ADSk=| zQ-o#hi0s_3MY!}UykHQ^ICvVhSj>FcG2OQ$C#-r_;YcKp7H>q4hNOEqS74FLVm$W5 zr%FGS|9n}U>@X1#7g`(KktO*%NJ1W0qU$kN#!E`40`qXq^R}sr0SV12Wqu{|7UB)! z3MDDQ*cUUaq7ms6B3_*n%T5T-EP=E@LVfDE>XnxuUzru*gfhFQxS(!YvG8h#0eo~_ zN)ZHkRx1HJOzImcpHh)kfE`kHmW;_eF%#RPaf#KCppu=j5lM4v(fGfuC_K4w6G;fM z!w;c{Z^KuD&Nm~w28XVQM3WGMjs1?*Wx%UWA$N~&lTC4Udc zVD)6(5hR8tqJB!&1a-B=Wy&GpNiXNQu5S$bOZ6_=3;h*bbYkoDwl0}3!-=d(iHEnA zoAL)-%nty7x5Kcb59xnKYUy7BH&(JbdPc(7qB8IclS$l)9Bup1#AoJdS^eH~uK!ZplYK&!P)C!>LW)*W?-nVk5Kv> zkyG5JU5<+y)u4??5Zw{z?_6_VS819>UlLKn+iPL*@fFvA!GWme)59*9xTcVq;~OXc zD-qP!z8ly*@9_lapG1EGDmBBxE!I}Q^$r6fRnl89l~ z`tR%yP15SoQPxC`m_~ev&~WCX7kg7WPvMpa(0Vw`H++oW!0Z=05&n(5fiT(Bn!Yit8~qTpq=_8K zmrf6eK&j=k2^q|?QJ**PFVCUZU>+-j7SeoN6;g6A0v=FrjS1-3J@SP}An3`j5Sc%9 z>>%BCJ$A+<(8-ee4KH0W2waGGKZ^j*qC_eOFlw!FqSz&a7ygJqOqhA8m$^F~O~^I?lCF z_A(*S4pjJwMz(3f(*UvEfT4G*)SF$E*)j!6Wa<+A>LL`fR~+usdm!b`iddYC$kG-n z&SwsXMabtP{I9_Ec<3XzUZfxYSZm^nSkZwJIS~t^!k+%|DhR%Usq-We1ee%db(G6CB>AU=VSGi@CajM1LAnfxZN!`eiPbrxlIM zZ3$sxYR*uJB)5?i!-i(h_vr*%y2N47_c9Ek8u7nw50hm(VMUVzm9+MWK)!2!RfUeRG9 zD?Kx1w@Ot(%X$V`r3xPBdhHYoGF#* zupP=<2z?h+X5OJ1c(YLDUFR3YQeG!KLX()$UR%>N*tbZvzQe1?$jERRa#Q@BNbigv zOxJ3B@FfdqI8npE61N3@oQ4b~L~4oas)4SY`kaSw+$w5=XF1*rpH5OpB=?96bxvN= zYDo575S+FDh45Q-+0E`;DO3luGgUq=ews5CEL%F%K(1$fy>E1&G1cwRy3 zj*jbM2sL9A6$zYLt>~|W=j0H(Vxz5XfZmM+KcDwlHj!2xR~V-Fk_anr5^>vwQy;>p zWBf{^9(UFxEVl7H)UB$qODzRn2B~8QW{V?5wDxm|KN<{* zHnLn*shb=Uze|XB*BdJ`Lkmt9AU^s~nYpXtkki1CDCK;3Wm-|PzUD48gn>RWi$UX1 z0Biv=Cx>N|NtH8F+J-45a4+q&=}RtGi8DT?HfLaI=h^@6|K!gE!_E{cV&@ruGi3zt zXPhx*@Sgo7=HzR^`|*BLK(Frfus1~!9%3ED33A=WT*g+eg9#$RosNT~?uvFdH~l;% z;FB~`X4On!-zM`0=&a4-;zIRuZ(N#q2r7fSz47dvt}T7Dj~v|ty|T;#Q0Og(=V6q3 z#It0eZKkYFD*hMY&&if8L`mWvF&{%%oD|aIU0a{2_>|xl4r>avoHi3U1=P&}!`uxh ziq@@qDKE zAEtMTM}k)3-Ku0?5W*zZ`beQ-5jTAi5rOF<&+9pYzkCj0B%3>7Iqj>-8SbK23Au71 z(l;P&k@nrofG62JuI%F$P0JUR&{gNd)NB>h#4r2^MEtMKK;63=xt2XFe?-J|wq+(S zY{~zCeW9RueZI5v(dv59`-D#@ImlWLXX0--LGzm);m=wRXU-4_JdMgXV<9SDgU^Bl@t6CWnr6S9VxCHyMd84Lg}=tc|- zPLb!#imnj3oArU?BuCld(2e*(U3#`)VX-inEdeVTUmZN##oJa===BDRo{(3;+>9xa zUm!wCV~diaw-^2dlco0`WTO-+HR~93ZRj(t%AK;vi0MYCOD4zZhFQKdZgmi}`@;M* z$1OGT^6C^nLBODC;cB=mw4WG=H&7JWIuIaHq$~8TI_&}4@Wgc{&VIq5v1zM$$-+&! z0>W2$sc=+L7Z;3sUN_*`rOClzo?NlC8*KV#?LHj$?Jh4HAj%81IR$9_;6mnTWq}kA zc-v~bjvH4vw$Q+&LSxGbCpTENSih35jDqBZ)398%Q_~&>U2MSybbcvpI!5BfQG&zE zZcnWcP1le74LA;c(B!lf(g$lS2nKx=%hZg0@}m7Avr~XrHP~S-(Bfu!$n01D@9tTy z&~W7|hs+qC88JRS`N?NSl-}VpHZ;b+j1czOJ!Y_Q>&*8w#!qI9L>i@AXK@Ny`@<92 zf@bn28mtJjIL}D2gx+#TMz;|o(2N%Ls%4!S(gvsmvd{AAv(Et*l64obkf;?2e)RiW zNTvl&gO3UN+vGP%z>~Nu_&(En0DE{(l@HctYNdw>MQ9PbZhS~iGrs_7w!U92d3|9w zexO4ZAytq4sFw*fHzwTi&oEF(Oj}Q8=$>X*mVg6w zq*(5p%1yK|zT)s2r1bhetWLf_Je=7m*-M=F;PhuC)Gx*0SMLBMp?4j@6$wkZTa99< z#wP9t)g{lSMai76V3ku6{97|8QkM+r4f-pkaGF+1b(|q}J)_%2@=|cweVmBN`j&Bg z(G(a{cA$TIwePe7FtK>;K3!(;f%2cfa%k<)NCyRv_FN(x||cs$!DIzs6F2&Wtbk8+Ph zld&V#wDBuQCVJwzBbXOIbGb2^qf{~bo(qh3AFSxGA&R(PuZB#S^ zdX?|mJ)IG-fIl<^4u3@cI}`A%A~{AteKuU36EJrIbdrT$134HRaP6625=j0Vxn-<4sm!BAdXxyCcJ0qh6Y^=-k0M!A7aQ{iZ$U<{ zrVF>(f8KR^uzP1Zb>q(*9+=-$^d_*cucJ{@lhUm?O(c01R<)-13GlLGP?Ndt zw8{(D74&;3(p(@w6E_Q>1lqoeh9G$cvpreO8X6W)OLAaYOGI>a_`(MJAn*^;R+vmh zUeu=0YeNord~lyiUgw%J=mAHvAdU8YD1PwY3+x^`Fapn)uAqS zTj7iDz`7A~uxZw}UB-dzWx1+Z*pm+&-jg z(Vz`3g*&xnOKBNOEnsHVwd?cDtVA$^$Sjb!!x>jsRs~5w;YF;bT93&=HT3WyNz_oM z>I$#CHLn=SFw~hmlle)*6GaUUIase$g1cGXiSu2qDi%u=bRxIDwLZbaRgHgc1_$s85~T zW@C$XGn*A~J$_;6RP<&yH-;Vur_{IRZ&WQTtJCvjOkhf!d-ZCvu;eGa;w|b&RuS2W zA&px?C9XJaMTSNyYciNe@HJSauQ!8n{HnELlA^%~mvxAsI|`Y?-nnJvLqfvW29L2c z{m^I$cMbUYPJTj3IIBBU@>e2ZwkN2?Eg_DUjv*!JHLzY|fI_H)-IRYNvKJ>g3!CMg zApjcX!(eJtLwhD? zM|o0o4j)?NUNDNCF)&{)yZ|JJ7~uNx((q8` ze1y0Q@Z*SV{&GdhSdzoX0JZB|k|G5ejWUm5xfP)ppQ)`XpXTG{41L9yOj1Me_lX5G zL_G!REamaqYg^hB6oL(9&DDbZ+QT4?DS(!Ejcob)v-g6rp~I~FwCifsHn zn!f4sj!IG*-O?N+0zaZjRSrzdYH4o}urwyvY1viQP`Vi*hUOY&b?dB4oV#1qm-v%s z40^jfqFEY9^i{k?Xy*GDqAImH?*V554T)slO31c6e?s;K;oiAbCggt^S0<0!o7PM)-#8+jDj*0peZ1L z!^N&&jAZqU>DMr2SL=$y`)ai`>$6ZCx#76LDr&CUEEPkGP8`|2yj~nC#a%3*^YezI z?~baouOUWJ4Z#w$?}fIKrAPB#g=HvB8eVBuK$uLeUt>94BFpUVbpp{zfXXu2pQSGp zWSM+gGX)FD%rHgoa%5j+JXrLEvb3@^xz7*yJt_`sV~=8!#gQbNKQ04+*3Yvnvvo43 zDI8ru(hL)o7}g%`-NKQL18X~18uGHT{BgVekmucSTIH^b2La-mgyzzO=5U`G=}tZU z5G?V$0VfUJ%I|hb^-Py1f^lXyr)_($FYG|+!wWqD5gsczhdZ;zd6wW6Hutf#xm^6( zAtVm90_jqdl@&>2xe~ndC9A=)%Am-#ZXF=C`b7&>HOYA@maA9;vBdH=Gew)W-U|VW z#9)+Kwkv9ya=R3!goipOrz5H&khU+_8rIL+d``}(fEjd{+Q{kQT}OUmRW3)ICO<%M zN)>L~YC&HL6mzT4YyUWcaolP~Rk>M8P+D>@c4s12mGKg=bVy30<5p>rgNc0!Ei(M8 z_pGLC)77)NyKT;2f*sZieojV5abswp@_Xphs)|uB6!(CF2Lk>*o-1`%xFx%YmSBa3 z|5B|iskjzD2~RnM*m}OID7SY>EB>7jbql?iqKw?n#a|i{r2)_Ww2aYm8N^NbTGz_1 zqy#}fz_{@cRDniUrYYhJ3T5vT{jk09)3%4zRocWSqK)ZTTmVi;ZVTr+Q4 zR)OC#h2va;Kmy&<>bg37+?4Ck|Hx}^Z1zftdvy+aJRicojJld!rE)?ERTt0l*rAvh zpD5bb`@!Vv!@u%0PLnLNO7>5}JH4PgwW?W#4<3ZBq3cd{Jh##A%2@@p81o0^krPEt zss(yKQmfDBJ#vROGk29x$X0o~Fn#^~lQYKYo)9j41okmvV|XOnuU%iwV^#VN3Ov&l zg-rmG=tH&1vc&c@Pfz*hgmOE*M((lPDSiWRfJfkbN)qcO-D7joe-mnHTt>=vnuaz7 z%SXTnM2mORgxW!<g6QaJ4CsXU^QnTHhB)Uqt$8goc#)NVs{9P-6 z-k`V^azb(NC@9Q zAhStECA>A0TY_ySdxXx0MkjsSrbOu?%N!#Hbx=_(6 z2mCLD=Q1|tU$a)?;qVI*^t{J|`L2jGS<#sITOyUr>_~2kt@#`1$FLy{&M%m&?U>93 zQTFRh=}IaH%xVG+WEz&mMWs)bWpZTVL2#n#qFSy`dN14~0Z>1EI@sCa&CgeiDt;rv zRyWp$N~Z=afRjBC5os%qEr;hs2g~0jB-7cFuCBRphD-@p&sxOjAlXC zRj-h%rPFYF-DbA8dy7Jh3Xo-RwmmuR>fXQzF)R-yL+7){f~Qt!Dhw%ufinGLruni+ zIW$QJHIMm*<_-6i(@S9?uig){nG5+c;fxq8n6fXgM5=7(;;$b?iqH_)DOk$xU0rc$ zQc{WJYC&yPmTHoP{)YL?O7J(E%st);`5;MC+mqT2o zSCFt+St%?aP<~8shg(@$gH2Po^d;!keF%O1tqXpV*vU+3IR3?z!-f9MaXxvpHMozK z%y^!BI~p*-c~}@~7y+|?QKKwYfd5F^ZFQe4DvPJhFhGJo2G01#Ea%5?<+8sKk&T&( zRao=fK=(#E(HjtWyZ7#vM(}0gT_`?j*x`*Med^<2C1J%5Okt_VM27p)h7us2?7^kJ z6~2^R3obAn3fu1OJCXICE&`=7;W4=Y+fTF3K>yit5dl>h?+nL`CgvG~p}q=b>ud>Y9_LTh*^`i$*^r3zH$Pf)ZSVA)X{7S_jI!x8#6cGr8N1 zYw_{xG^6JbHT9|R_MB~CW7j~lWOZc)0)#sBCU7sMv1FjJrBJd8T{WBh z?xYrO?OULG0t0KO`vYa_<`60LG32agWS5oH34a4c@pf2v47V#;3s<^C>8iw+p@bk@ zX;N^K&cl&3TXUGOpcSySLJVyO=wZ#FBH?*5rdH;5uV{l^M& z!$-e^!@{V7I}ttWWzxWH#Zw|_U0X9KO_kDu4kLwNbLs-weeCKa*(l6$`}BgWsc;nE z`xnIHfuXgiX)rb=xJjXRB;lc6velY`44V4^q>H`-l&sfg%+zL$>lfGrYBR?tQZs$= zo$Cl2Vum_lNpeg^fEe;CCfl`hMOp3<3@#j+ft<(-(cqZL1w^)rJ5e%rk_U z%mD&~8N!$_&r_J^FwgTme(UhQ_y65{zx%(>r_X{za`qY4UVE***YMlBjR^ni1>vG| zK(jzIK-2r^+Xz!|Pz_WHR032CR0LEAQ~;E}ZyO>Q8S4`S;{8y&@izk!t`8d!R&?wLd&@j*t&>+wN zP(M%~P%lt7kP4^^s1pbvS_thxZ9uI+I3Q6oP!mw&W=2>tI!f1#*-B`D#O7^;dicB! zNC{L6R0D+fOBGNhPz6vqP#MsF^wodsCqf>4mkXo-k^|-ZOM(PfjloGo+-2}4Aqzgu z07?gv?b}8tq`^TdPzq2oP!dogPy$dqP#lmH=)d=T6nyr7dLM9w)yePc!(Bw1clqyP z@P8EnI$Y&Hi-122j@kLQVl@6OpCAlGBS@Z`Ix4h;K;o|L3;(NBIK$=sC&|F23Lks_ zc`Vw%-{W*BIZ`K&Tkl*TjKPz`Hd65E8oFc-IqRFla`VkTy8$`o%W(H&|8;!Ax&JrG znSk%`0bbQUOqe{{tq0Oad<&*rT?em8y(GAMT$eERvaknR{jXHgXXB0R3Y`c7=}s9*na0*cBwWzViTi=audBW8_!yljbbpq=0>w z$)Wg3BG7bYpZ~+q?<%l_VyJc%1|G!_yGlNAW&4+8OT5A1tMH=}KRStK zz~H738iA65@U}@nc-ure{Jez1A*_i~DmN1D%8e286oo9$&LKWegP+;?>{x%J}_u*^+)zP|a2-6O2 z0^NQ;*AnLNh>!&BVu%k2&O6P(qlXC5J4H~2iU{(ZNVARzt!8(cX}VazK?r=}h^M5t zK$8UGR|I!xl8qFGghmv0ju=5mgbO#RYm?JWzU;K)<2XR$juT#4tPsIzEY@RHwNk%c zOP>1@+=2V)R)v1;juT7HumrG49UPWaWe!Fo&K}~^TY#M-k@}C$1o?`!FsHsDxAGYq z=_B+&j}SmUZeiupGLkb=n?ylQfxLwh<_Xe4Vh)x=QxO>!jD{R(q%?aFmSfINq|*&k2Q5wcS}= zi!0JaF*!zu>Tnxgp;_LS#hfbT!VHjKwIS_k?Hl+Uy>^4(M`oK-sHMI!h+kApFTA`W`hzb+CDM$o>7AnN$B}0i?{I5PK$eQWG;Pv1}`q> zvjdcV{Kg1WL!thHetB2ZPVO@=nMXtVIyvp)-c|d&;xyu2YAkx?j&(wFabAftEWj~w zeC|4@uP{~n&OXae@iz=mu8+q8IGPmlXU2j(>)9%0J#p4zH+ttI%^|r@uxt_?I;hQ6 zjD!ao1;nLS}#aBOf?6^@ew+)%)e?D0M5X4Rcv?-t2X2%+LS z!Y^-KP(5CbY|Jh8q3;i9uD8g8H`36D3~kX!k8*8tF%#`LVX=qqv9G<#1khNlKL*9SnsxA6<1oSPv5;E2 zuvQRJMg1P!eV;=XfjUX^A}p0NsW-r3#OhvXk8qpe?8iL3f>rbRZU8v7pE3LmJe#=A zrlG_JFleCCqC}cB&sk{u?am$z;+xmmJ6|X5qU)p4y_y#_)&XbBn{J9@jheil{~QTF zxU}~EoxpE3P8pcI#W&RwzX$cK{;~3p-yM2SZB4D<8x6AhN8~*$T}>wBWHIpr*ZFKbc z&7Jy&L8g0!By}SVWrhfC{Se*62$aYSwZ3KYor5&n^ooV#SUKMe3u|r94J#HGJe*N; zTT$O{nLdmH4&W&Pz*&)({nScFng|@xIWZ2RD0iQs5DOQm z9EX5m#(ZvF#Q@5n>d=E4Sqr_@{WXc8oxufjJ*u*8pmd>AoD8eJlI57J)a2!X2M57L z_1sEQn9P<(h4GJK&Kq`;7^Wl>P_fh`OX`6-8yx?UfgXk+4ZWs!cw8x#_J{8Pkx~)w zf}?DGjS)E~m2%V36C=$MVcY1UH=1}CCgkU@LymQ8Q)@71(np|<`A)@4%Sr}3P|`b~ zj`3jla>r0Yc$E?gp&}--S>f{OS#rg70**B?-RaTYkeMMmhGkB1t9)e15)t^2AdBN( zZcb7))VlIlVCh{Hl;K;o?*0c13cy1Erer(S7?iQ6caC?Tn$_^ z1vS|hdwOSa|G*NM&Vk9*J@R3)(SGcrMpTx_pY|#S*tlm+Kl1^URg`xIYE*9BQX}u( z+weZYs*>(bIQ#h!=@Yfm7navG$Yk2ylKncHTW9?8-NT1SxgR#lQtsD>y?M65Mvh=e z(3Nd!7>P``ejkN@fa?H`dwhD4PotQQ`LZfU`x4gLOcD9AT8ogn<$8801`_O@~-r7|Ws@2ox zhYhS`4@Cgfq}q%~{eYFw+k0fvrAI(lK+^M4LiCb*ehK;fDM(1N{KU#LJuJ#KP9gpW z7Qh9+len(cmC8fA%#hke^CpkVk*RjUPRutnfL+RV_9cJ*GgQ&2pQp&mqO$CyIjH}# zc2ZSNONKD58SQ)vqUd;?QZUaaK9V0H0I`Y{N-APfYW&Es;axQSJ>1X?I0SU8x#aS} zOXb{|-?8Y>?Qe;EP7ub)0~cu7Zll%gv_RoYOp+I0=*}FRL5nvK>pdjW*KAxAdbJgy zut%m&b3z+=g1qND5WDV)zNCADmE*;35qTo;ve>A&PSv(y${#=u7-$#n7gK}`a8h^* z0UcuP?jFl41ir-SH(zkK=k)adWY=;1A5T*=fN$&?(|= zcvi~ z7@(i2h)$#RhUSb9aw62Q*ag|pLRo9WF!6U}Pql`t+VS$(qmdQTFR-A_xDr`$RLg^H z$ZzwSOD)AQzKbQX#vta|4u#2M1yKKh#8ljBIhDz~^6F$UFR(z5EW5e#0S7BOFlq@^ zp8~g8z=oigIVp<0k9pO{Pe#S0=e&-;e+kth_I69-Xy2@h6jBa_V-c~1Yl2ic5ljFI z(X}FzHCzJfn~GXu0kmexy)&8{jSMZ3L>GU8|GHKuPxVn$t&0ZF(sC=7SsU(>*DzmcS6WxFs7(t^{yaDs)(neS!s7*vIwQyTgpph+vDN zUxMc9ZFbJ}Xv~Uqgb=k;=-hOvu)rTMWstre(mG@vG%(uHoE`HKU}DzIw|KfHKgDI} zlpb>V$~vF7=$8`)JoO2k>EzaqdL6;<*s}SGoTBk*zFl?%=)?4>?x}odW)m9PN^r91 z{}NKt205jk3n~tHN*i7g?8YL5b>i-bq!Et?_fQ(NgCLGmLwI#)m*@w~Pnui3v?dJDApi3Oa>rma zOipWPJ^0%Uad)AUXK#hAO-+l|aRgLXnP;7&|4jP<{FO^J@CgAUaCK%pHJ!T%=^yP= z@hjY{TD+tR?a{qLR1QUo(uCofjOd}wXz5cL>3poywYtpma)>%^nn+gLm^zD;GHpY$2taFne2gXTVJ z>y_pxfH|GdK!i)iV#FZ1&=OHGBzZ>5PhCr64huD~_(-{jQ(vo11l0iD+KbrlSqTNP zVhO#On*(Zc#wmX-H9Y)2;@m=yw}MC3KC7EoyyDFJ5=&+busani3P2S@S-Wx8g%q?o zxsUY;ExfDT)^j@g zXZeud=goEO6J!t9P`mace@(^*G>3++-l-(s4U8S{Ebl37sAwU+t@_7zWVXChgR+0f z>!GF9q|-)e7f-_d0<#_H%SpAVN_T+K%-eE{9Y2Hv%zSj3^tKL@zdTeVN)vk_gYAb~ zBZ8|G&3Ay~{b1XAZ6_4A6UidTjF2VwikM#61xUGxWdjkA0RTf+#SU?%s2!S)e)jSa z0r~hbRJ0rK7KmppXLj>=Fy|Ap5~cl^*m%l93ZTt>)RotfZrJ>=n1z$ zifcMC3!D+hj5@^zOu7c~xK~tNZ-$*r2m!wI#L@YP^*$Dl-7w;fRsB7{xn!rlB)nlcGgl}T~UT85Pg3FX&yl4nD(O5zn+)Fk)o#O zhik@%OB>`TprIFW8idTH!7jg?mB;%V3u5=DIJ>f1qlkXU?7*f$i0}w$${N67={!8V z?0OVj6AmyA(pnHA9pXh`4smCEb zOTJ;p?a7Z6!-~MyYdqM^CN=6L3i*07nWHAUdx$l}fyyvnX$o_`Vmt(cM_b;Exm8aV z^-RFNxyRqpNo31YM8oXhkI?daFeB`9>I_*_*7NBj@VaZu4bv*F_-h#Q1Dj#C1h;no zc}0w9ALQN7dG_Vjg`zQ2)U*#@V1@b*`_$XHE1n(?23)D(p+Gmh0ssx~!v{xW=itbS z&5{V_0*r))1-ouO>UtZk?8D7N`Sip@QcEiz($;MK6q17asvPpWbOWeD{{tk!zj3sG zAfOceYO3uwkk!@^?=?XVBBQJO(2WbU&fcKWhGi~9oE#Z^7u(8^3^Eb+N#2JDCRXfF zUUKRL2NWCEX)XfNm^c+wA^Kq-`ar{cN^W0MGXkJB8H$pEfRyPV_2=l>z6Z`U&)MmO zyi%SVfE?lr9DJ&yXC}zM-9#??(ELkHH$jjKHw4MZIucb#GOxh7h(WxEc-m;k*;|d` z;L+4IjuLVj#Nh+eK0OZS@wZRX#ua6@xX&%VXq=T`WHQ}8bfv{8+jxypHd z-cv5p!o+sjEj~&W57F!hX>{sNhylj;mkxz5FoioI6Q#T&vD7IReMUwD+GzbdTAR5il@07?rgxRm9PmIqFSCK!y z3VGmo4xtT)AJfv1M?X+R~gVCb!YHoSgCm`RJmb={sn}^^xI0&LUGRL>wQIIMtn+ZD9t} z9MpQ{R@Z22)?5P51-R!nW5ZR&X5Gb=$lH4OfM02CAL>!GL2YuXkDQ;ECmVt#9lD{1 zo64ERpop2NDlW|TQ(DW0gU6bp-^W|t*Mt3nY2%8P@nl!rmBTu|G3@0WI8}t8dh4kk zT0LRjERRX7sSuiC%y9cgS*Jvb9G@avJ@{$GuIa;5o{$sVUsGc}B!97gah#(8^Rv;! zjj%{>3q;*|?Y5OqW0lH2C5#6J0I^G>5zZ`?iu|TI+M$Qr!m@x8K|tfW;1On@;a;CJ z=r%(B#0XJ0zvFu^2ohX_xKA;WGB$i8sk(q{O9E&>+^9%XJiL4d7X?%7=n{>sco1Wj z_!o3XgD^Kb-BvF69dq&EEd-4Qj|d^tcNCDG+k9&MT;gX?#E05UseJ~sub=>>XrXmo zM1Dha+^#egCR>?S6i0r8O)4i;>y9QmqDTHylNK*m37Q44s81XaFo)~IH!2|IYKC|Z zWTwo0W3;8HRd}C{1xGrj*RVKV=*&)3pr>Ne67p=FCIzDHSX`d4JHRWL5e3$^Q4b%i zg3hUhDP@7c67wyJ4t0#5uEFcD(V!l(d_b$tj~MpoQO+gIAuH84$|jP5cAtm9h!4CqeTEs4JX?|pD&m9I`+oq`n#^Ls49=?!kvN1S3y;yyGwI)FD$>G>!Ffuv}`Y@ zNIxgRt5`7CpPgz~TFz0mA%{)oHz(&#G-g+bc(9l&XquJ?=)pWdzD76o(4JkIobh>w z*)c@gs*_%j7@8|?&)fhd_CgQkU#6`z%tcq`^2@-($1iIO^!Myk_@M?p#NTZm#bw4+ zEpT+8nAk4GE0e#05ouWp!y)WtH{l=|$ABS7l3Etq4ksnioPjO-xH%fh?jv7;*`ksXN$Svl_e2Ro|eq z`sf^u=G4Mku3hI+Fz(cZptnZiDIiv%q)i#j@NZ~u9$OF}##}NuSxw=w^W;(uC(Qq>kh2~t)41ijUOLvcA%GdCFx6#Z z(Ro?0V^imEa%C_lbu>SdP3hCvMpxWI?XdLNV%}RT$g-7i?_mYBiw5e0+Eb&Ho*H3jvOliwjE(}{`DRBjtI z$Vl1{Lh_JrUe2gwrLjX5ioS%FyEO{u=T>FG6_CIntM6E~AMhJWd7y!Q)<=UhT8e)` zUVoMVj9HS(Q<)_X<&odGf|#3k^ywMo*DOT|VAjj287wOD@60FPyoC5c)!Nd8u<>B-wHg`amE3b%$mjq*^UbhT;uhA9j?>P{&f2g)h$PFA@hC#>Q0lzLLN@@U>O@Fl9pp8kLOxZ5 zP98+B?yzQ8RpF(gW^m?ijrR56!J>k85&>Wm*nH57((frEMo#V_yi|TNXEo5 z68}QcZ1z0$5h~wgOI+xzZMtu`FatElg6-Hkzp$7bsD+gJ5A3a4tGm3*ySZXm7A-W5 z_B7{qK0%_pR0JMGXjID>hlHitI4 z+bnYzpi1#=^SQD0j+Uer;a!X|)*=lm=WCsRj@Jm^w(~3J&Pn~nbzr&jgrUwk{eC!L z7P@v2AD$}b&|=lN5;C5B8Qex`aPSHsOQXA+9QtTt**iQ}kbz!1qwS$uZc1JY%OXc> zpdXGG|*^ZF1p${JS5Iq3XYHbLu+U88Lid zlB^;y(mS?cMGd|jhFF1Z1}C7vn%`EtihHp_+o42x{9 ztF4Yr$}iAF28Yr1&&}&yGeSZuIQtAR-pEA!Qnzh9`92BhA41Qy%m>*X4H@ww1I#}) zeW5mcPDvK+f!+1U&$Za`{TiC2-*%xXT#8@|hZ=Z;WJ~n$IPp*OT8Hw4fhmBeNNsHj zk!CKk$kES`8w(#ztB#S1#aTA*9u|}uP*RgPUn-%#i`d7|?aSuu?7IHM6hPOB&T_R2 zw^Ml_V~nt>#UfLb$zD^7oF(*-p%Yy(B1~zl?YM&K&Qg!VyiJ-nljP?Pn7S}8b`}oz z%=K5blLs`=JEy6SXvJ}M>&1Ps-LRCYsA%Shqsox}0n`cWF)fYKWp1))V1^61zLMq~ zVE`w^m3-wPp#(~kk{uT36{Cs5cd^VhH=9rnQ$e1*ibfCN&6d`t0*Z$V@G2=Wt7j~v zJtdY*_z>Os`_?}Ac0R7Jd9L1#2a|0Nm2|;7e0f9t9@_RP_%?`h_~fB^mKE?DqE9hSYGAa`&ddSqp&na6pdOhpt3VKgBjkP z3t>!0F8H!oF^Yt4l}{A8{u-jbrTWg?LByK#nBqLdBvX}PV{&$ga0B0NjR-K$3yv(i z1$RE=u#26%21Lz4D;6&R9XOeiQnu19&lu&3wfTK?-@2fp{89Ab-%vGs{@z&2s4OjD zoePX+`3Sll!IU3{!88iF(n(Hf9mC}t+g;?e*g;%VKxqyFBJ2hW8tlhy^bqojR=%?=v(MM#e7z>=rvg(IESUX zwTn^;D^*-Mpw6Ac@lKk6@E&P23l`PxV-U_Zz@BSO1*^WhJ3kr@mN2;Ip?xOJaJIreZk7D0+16=f z{w3m_Rehs966h5^!{r8`UR_FgT3TQU*VEz`lzbLfv?YR?M3=Ha-Y-}n-=nIaU(q+S*Q-iyp)LV@i3V-t3_TSYyqfMW)}IFZZyU$HpMP z)uTP9*UO2X&wZ-ZW~rAmxP#yk);)_jGwtWz~VyeAiZo!l3LFzAV1WC0@S;}bC;Fkn%e#fFs3n` znTu^54U&UANVM30Ptxz9a8TuO!TI7K3=^;%Gaau2S0N+w9vvL%88WxQl}^C17p}RA znt5!W{W#0_9aYh-8Dr~mxdZzF@Dy|ELk1=j)isL3^X+7w$zIK#fkBA*o z*+;I~ftruuCOAq(5ktp{wDdnQ-ng%*CZ+Hc&xd zpL`%gA)Bol6?5&KN{r_EdGG*T~aPf`1=IlG_yLB=7Fh79Ps~n=;a|Q9oN# zg(h~WF?i&U^{&h9`#)+>C=&4^8HtBOey^x9jzP_Z+S|>-9?#m<7Pd+V3)&o~kSv=S zeqeCF-LprssV zs(6k5gCaEgg2GNIQ{?BilTSmw%yHZ=R?sX>spt9f+8~?1J>RCOdfLMpb<&7`Lb`ds zcsSOtY?AXK7CA7}wZd&Jq@!21llI+`jTZF|1~YgEF-gh1M|nd+8IE9uvX0{`KVE2Q znr~h{oqHAYn+eRw=$Cfsken6b~q++yx} z31=JT$?Wi(%4iR-0oQirab%-uB_58q%c|jlTO-nKdcLJKJV!>i@y{k7q@aUFTuYkwjK3^%h~ohvG5)f=b3!!0xQ%XKMD$O0(Xxf@{oFLsbC^@s zwF)KWGm+GP66~%eTe-=-RAV_&TZlQZSHtQN%SwX&x1s~zp0Fd77#88e`!v)cKc>b;CGnxK{@)Yj3n2%RsvamFa z9zuQq0K`VP1djH{qVTev`u})*O*JKWhO)($lc%74= zI_DBT=&l&zlYG}U@!)J>0{Y{TPDX~aGA6M$rv)571%|jYMpV(*GnrBZZktFcD{*kF zqRYy)4z_HmOx=5x{W(WaXOscHPYmcpqBkw(g5-#9&yFPoUu-|o-1C@QAev^t4 z*PK}L;7!Qxzi8DWiDP*w-FXAR8JC{b;YE%u*$2=UkLi6P9MVb&BajQSd)i<5S9Q_)xkBudk^Q;?daJA3TjxUmUOT*od_& zTf_JH^o0_yv|eUqMqHG@1dCsAo%RYY8!4rV5#7*2hn5hkl!kQjtVY3Ph6ksI^5v;0 zV+UHlNZha4Iqm}cJ)-h$+O{K{wuY&u0tmc(YlyaMTG_;urmAwq;3jc%nMf`4%cyaO z8tm{#AF!udK$|eFAYL{JmSednDaTvvjN@l!yM-3CW)+5eftu766WRfQ zR4i^_&Se+(ltVxN4c}>MjAxa{O>@?{2+Lpy(p_yU<|%0K0LV9F6~&5ehU$yB>tKvz znT;}6Ru#Is7sb4TzTQsD8*-h`(Nut&Iccn365zG!A%w!ZI2^Z-+6+&I#{Y&I-p^

5Qf(D~K=SHAxJ3eDLNnqy?{)Qrv5KIo&vvPL~ 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 g3Dj?n%~iy2;2oWNQfI!=GkXA&(1SD&pb2p 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®dx_F;M*XUhC!YC1IOadM8R} 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 S5LFCQhu?7^8f=HwCI16X8#G-2 diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index d6be4fc..36f66bc 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -41,39 +41,12 @@ void setup() { delay(1000); Serial.printf("\nHomeSpan Steppers\n\n"); - // motor=new Stepper_TB6612(23,32,22,14,33,27,{1,1}); motor=new Stepper_TB6612(23,32,22,14); motor->setStepType(StepperControl::FULL_STEP_ONE_PHASE); - motor->setAccel(10,5); - - motor->enable(); - while(1); - - for(int i=0;i<100;i++){ - motor->disable(); - delay(10); - motor->enable(); - delay(10); - } - Serial.printf("Done\n"); - while(1); - - delay(1000); - for(int i=0;i<10;i++){ - motor->move(1,100); - while(motor->stepsRemaining()); - motor->move(-0,5); - while(motor->stepsRemaining()); - } - while(1); - - delay(100); - motor->move(-400,5,StepperControl::BRAKE); - while(1); - motor->setPosition(800); - motor->moveTo(0,5,StepperControl::BRAKE); + motor->setAccel(10,20); + motor->move(200,5); } ////////////////////////////////////// From 19e0661139a4f99202548f3fd3ca7ba7f0069a7e Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 25 Jun 2023 21:53:49 -0500 Subject: [PATCH 069/151] more stepper images --- docs/images/fullStepOnePhase.png | Bin 0 -> 13971 bytes docs/images/halfStep.png | Bin 0 -> 15849 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/fullStepOnePhase.png create mode 100644 docs/images/halfStep.png diff --git a/docs/images/fullStepOnePhase.png b/docs/images/fullStepOnePhase.png new file mode 100644 index 0000000000000000000000000000000000000000..f73eae6f160fa6d1e5f03168c74b5d90b5eeb979 GIT binary patch literal 13971 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 B*er?u0?h@W9I#ShC0jWsRy;&pmLKRWwuD;-;l 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 literal 0 HcmV?d00001 From 1269ce7d80f07789631fe719772bd3c677b422cd Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sun, 25 Jun 2023 21:54:56 -0500 Subject: [PATCH 070/151] Update StepperModes.md --- docs/StepperModes.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 8b13789..36e3516 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -1 +1,7 @@ +# Stepper Motor Modes +![fullStep2](images/fullStepTwoPhase.png) + +![fullStep1](images/fullStepOnePhase.png) + +![halfStep2](images/halfStep.png) From 7aae290f405c537a69000e66f07d7ebf5cf4a0a4 Mon Sep 17 00:00:00 2001 From: Gregg Date: Mon, 26 Jun 2023 20:59:49 -0500 Subject: [PATCH 071/151] more images --- docs/images/StepperPWM.png | Bin 0 -> 159557 bytes documents/HomeSpanDiagrams.key | Bin 682221 -> 898503 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/StepperPWM.png diff --git a/docs/images/StepperPWM.png b/docs/images/StepperPWM.png new file mode 100644 index 0000000000000000000000000000000000000000..dfb1b1abbadcfab92b9c4a5179346ce8bf049f7b GIT binary patch literal 159557 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 literal 0 HcmV?d00001 diff --git a/documents/HomeSpanDiagrams.key b/documents/HomeSpanDiagrams.key index fabdcf316b087c2b1dacb82cdcea2f17c4c830de..94c304dc144b4f4d01af7c14718c8df2698252cd 100755 GIT binary patch delta 273973 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%0AF?#RU4*2f;=w9pnP)HBi3 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

  • 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%0AqnK@QfxL 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%0AnG17D@)VCz4Qz@F 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 Za!?uPMN!p|Gs&4WuS+7;pHzmT{vY%PeAWN} From 7fb3503b126a55911470e487786bd0272f1ac5a8 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 26 Jun 2023 21:01:41 -0500 Subject: [PATCH 072/151] Update StepperModes.md --- docs/StepperModes.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 36e3516..3c966a9 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -4,4 +4,6 @@ ![fullStep1](images/fullStepOnePhase.png) -![halfStep2](images/halfStep.png) +![halfStep](images/halfStep.png) + +![pwmSteps](images/StepperPWM.png) From fd1d46efca1445b339b70482e83bbb06fcff30fe Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 26 Jun 2023 21:20:34 -0500 Subject: [PATCH 073/151] Update StepperModes.md --- docs/StepperModes.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 3c966a9..bbdea00 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -1,5 +1,7 @@ # Stepper Motor Modes +A typical 4-wire stepper motors has 2 independent sets of coils, *A* and *B*. A driver chip, which usually contains two full-bridge circuits, controls the amount and direction of current flowing through each coil. When one or both coils are energized, a magnetic field is created with a repeating pattern of peaks and valleys + ![fullStep2](images/fullStepTwoPhase.png) ![fullStep1](images/fullStepOnePhase.png) From c07caf3bef9da8797fadfe21a001bce80e21e960 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 26 Jun 2023 21:41:16 -0500 Subject: [PATCH 074/151] Update StepperModes.md --- docs/StepperModes.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index bbdea00..50904fe 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -1,6 +1,12 @@ # Stepper Motor Modes -A typical 4-wire stepper motors has 2 independent sets of coils, *A* and *B*. A driver chip, which usually contains two full-bridge circuits, controls the amount and direction of current flowing through each coil. When one or both coils are energized, a magnetic field is created with a repeating pattern of peaks and valleys +A typical 4-wire stepper motor has two sets of coils, *A* and *B*. A driver chip, which usually contains two full-bridge circuits, independently controls the amount and direction of current flowing through each coil. When current flows through one or both coils, a magnetic field is created with a repeating pattern of peaks and valleys. The precise pattern depends on the amount and direction of the current in each coil. + +A rotor at the center of the motor (which may itself be magnetic, or is constructed out of a ferromagnetic material such as iron) aligns itself with the valleys of the magnetic field created by the coils. As long as current continues flowing, the magnetic field keeps the rotor in a fixed position, preventing the motor from being turned. + +Changing the current through the coils changes the pattern of the magnetic peaks and valleys, and the rotor moves to follow the valleys. By carefully choosing how to change the current flow, you can cause the rotor to make a small "step" in either the clockwise or counterclockwise direction. Changing the current according to different patterns yields step sizes and different performance characteristics for thre of the motor. + +type of "steps" the current in In this fashion the motor can be turned from one "step" to another. ![fullStep2](images/fullStepTwoPhase.png) From 94ef082ddfc78091c219484ea302ec55149d36c2 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 26 Jun 2023 21:49:21 -0500 Subject: [PATCH 075/151] Update StepperModes.md --- docs/StepperModes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 50904fe..ddeb005 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -4,7 +4,7 @@ A typical 4-wire stepper motor has two sets of coils, *A* and *B*. A driver chi A rotor at the center of the motor (which may itself be magnetic, or is constructed out of a ferromagnetic material such as iron) aligns itself with the valleys of the magnetic field created by the coils. As long as current continues flowing, the magnetic field keeps the rotor in a fixed position, preventing the motor from being turned. -Changing the current through the coils changes the pattern of the magnetic peaks and valleys, and the rotor moves to follow the valleys. By carefully choosing how to change the current flow, you can cause the rotor to make a small "step" in either the clockwise or counterclockwise direction. Changing the current according to different patterns yields step sizes and different performance characteristics for thre of the motor. +Changing the current through the coils changes the pattern of the magnetic peaks and valleys, which causes the rotor to move since it follows the valleys. By repeatedly chaning the current through each coil in a specific pattern, you can cause the rotorcarefully choosing how to change the current flow, you can cause the rotor to make a small "step" in either the clockwise or counterclockwise direction. Changing the current according to different patterns yields step sizes and different performance characteristics for thre of the motor. type of "steps" the current in In this fashion the motor can be turned from one "step" to another. From ffbf3364e3af1dcd2225617e63b0cb1bfd5f8454 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Tue, 27 Jun 2023 06:02:07 -0500 Subject: [PATCH 076/151] Update StepperModes.md --- docs/StepperModes.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index ddeb005..9be7379 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -1,6 +1,8 @@ # Stepper Motor Modes -A typical 4-wire stepper motor has two sets of coils, *A* and *B*. A driver chip, which usually contains two full-bridge circuits, independently controls the amount and direction of current flowing through each coil. When current flows through one or both coils, a magnetic field is created with a repeating pattern of peaks and valleys. The precise pattern depends on the amount and direction of the current in each coil. +A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen determines the size of the step, the direction of rotation, and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. + +causes the motor to lock into positon. A driver chip, which usually contains two full-bridge circuits, independently controls the amount and direction of current flowing through each coil. When current flows through one or both coils, a magnetic field is created with a repeating pattern of peaks and valleys. The precise pattern depends on the amount and direction of the current in each coil. A rotor at the center of the motor (which may itself be magnetic, or is constructed out of a ferromagnetic material such as iron) aligns itself with the valleys of the magnetic field created by the coils. As long as current continues flowing, the magnetic field keeps the rotor in a fixed position, preventing the motor from being turned. From 9d08432acc1956eb1adc545d360df86565d67899 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Tue, 27 Jun 2023 06:07:46 -0500 Subject: [PATCH 077/151] Update StepperModes.md --- docs/StepperModes.md | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 9be7379..c6bfba3 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -2,18 +2,10 @@ A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen determines the size of the step, the direction of rotation, and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. -causes the motor to lock into positon. A driver chip, which usually contains two full-bridge circuits, independently controls the amount and direction of current flowing through each coil. When current flows through one or both coils, a magnetic field is created with a repeating pattern of peaks and valleys. The precise pattern depends on the amount and direction of the current in each coil. +[fullStep2](images/fullStepTwoPhase.png) -A rotor at the center of the motor (which may itself be magnetic, or is constructed out of a ferromagnetic material such as iron) aligns itself with the valleys of the magnetic field created by the coils. As long as current continues flowing, the magnetic field keeps the rotor in a fixed position, preventing the motor from being turned. +[fullStep1](images/fullStepOnePhase.png) -Changing the current through the coils changes the pattern of the magnetic peaks and valleys, which causes the rotor to move since it follows the valleys. By repeatedly chaning the current through each coil in a specific pattern, you can cause the rotorcarefully choosing how to change the current flow, you can cause the rotor to make a small "step" in either the clockwise or counterclockwise direction. Changing the current according to different patterns yields step sizes and different performance characteristics for thre of the motor. +[halfStep](images/halfStep.png) -type of "steps" the current in In this fashion the motor can be turned from one "step" to another. - -![fullStep2](images/fullStepTwoPhase.png) - -![fullStep1](images/fullStepOnePhase.png) - -![halfStep](images/halfStep.png) - -![pwmSteps](images/StepperPWM.png) +[pwmSteps](images/StepperPWM.png) From 626e1c9713258f5b01b61409e3b1b4647d75f68f Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Tue, 27 Jun 2023 06:10:01 -0500 Subject: [PATCH 078/151] Update Stepper.md --- docs/Stepper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 96fbb4f..6d4b8a1 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -107,7 +107,7 @@ The **StepperControl** class provides the following methods to operate and contr * not all *modes* are supported by all driver chips * the quarter- and eighth-step modes require microstepping PWM functionality (either via ESP32 pins, or onboard the driver chip) * it is possible, though not recommended, to change the step type *mode* while the motor is turning - * see Stepper Motor Modes for a brief primer on how stepper motors are typically driven + * see [Stepper Motor Modes](StepperModes.md) for a brief primer on how stepper motors are typically driven --- From 0c76a9e214f29ae8de12fb2cc14d2b90f5449585 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Tue, 27 Jun 2023 06:33:09 -0500 Subject: [PATCH 079/151] Update StepperModes.md --- docs/StepperModes.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index c6bfba3..bc3f602 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -1,11 +1,13 @@ # Stepper Motor Modes -A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen determines the size of the step, the direction of rotation, and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. +A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen, known as the *step mode* in the **StepperControl** class, determines the size of the step and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. -[fullStep2](images/fullStepTwoPhase.png) +**StepperControl** supports two different types of step modes: those that simply set the direction of the current flow to either fully on or off, and those that use PWM to also modulate the magnitude of the current flow. -[fullStep1](images/fullStepOnePhase.png) +![fullStep2](images/fullStepTwoPhase.png) -[halfStep](images/halfStep.png) +![fullStep1](images/fullStepOnePhase.png) -[pwmSteps](images/StepperPWM.png) +![halfStep](images/halfStep.png) + +![pwmSteps](images/StepperPWM.png) From c84bd97b225974ba103cccc7659423da7930688e Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Tue, 27 Jun 2023 06:34:14 -0500 Subject: [PATCH 080/151] Update StepperModes.md --- docs/StepperModes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index bc3f602..4755b2a 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -2,7 +2,7 @@ A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen, known as the *step mode* in the **StepperControl** class, determines the size of the step and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. -**StepperControl** supports two different types of step modes: those that simply set the direction of the current flow to either fully on or off, and those that use PWM to also modulate the magnitude of the current flow. +**StepperControl** supports two different types of step modes: those that simply set the direction of the current flow to either fully on or off, and those that also use PWM to modulate the magnitude of the current flow. ![fullStep2](images/fullStepTwoPhase.png) From caeb94f13236db84f253963b961200a9e95d2b87 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Tue, 27 Jun 2023 22:04:25 -0500 Subject: [PATCH 081/151] Update StepperModes.md --- docs/StepperModes.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 4755b2a..63cfb32 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -2,12 +2,13 @@ A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen, known as the *step mode* in the **StepperControl** class, determines the size of the step and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. -**StepperControl** supports two different types of step modes: those that simply set the direction of the current flow to either fully on or off, and those that also use PWM to modulate the magnitude of the current flow. +**StepperControl** supports two different types of step modes: digital-only modes that simply set the direction of the current flow to either fully on or off, and PWM modes that use a PWM signal to also modulate the magnitude of the current flow. -![fullStep2](images/fullStepTwoPhase.png) -![fullStep1](images/fullStepOnePhase.png) +image
    + +image
    + +image
    -![halfStep](images/halfStep.png) - -![pwmSteps](images/StepperPWM.png) +image
    From 815e1c0ff76bc5ab2e70673915d09dbda49d456f Mon Sep 17 00:00:00 2001 From: Gregg Date: Tue, 27 Jun 2023 22:19:41 -0500 Subject: [PATCH 082/151] Update HomeSpanDiagrams.key --- documents/HomeSpanDiagrams.key | Bin 898503 -> 898452 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/documents/HomeSpanDiagrams.key b/documents/HomeSpanDiagrams.key index 94c304dc144b4f4d01af7c14718c8df2698252cd..cd164e0d60d2b0caf35c638ef209e4853f06574d 100755 GIT binary patch delta 69036 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 delta 69841 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 Date: Wed, 28 Jun 2023 05:56:13 -0500 Subject: [PATCH 083/151] Update StepperModes.md --- docs/StepperModes.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 63cfb32..07d1da2 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -2,8 +2,11 @@ A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen, known as the *step mode* in the **StepperControl** class, determines the size of the step and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. -**StepperControl** supports two different types of step modes: digital-only modes that simply set the direction of the current flow to either fully on or off, and PWM modes that use a PWM signal to also modulate the magnitude of the current flow. +**StepperControl** supports two different types of step modes: constant-current modes only set the direction of the current flow to either fully on or off, and PWM modes that use a PWM signal to also modulate the magnitude of the current flow. +### Constant-Current Stepper Modes + +The most basic pattern you can use to drive a stepper motor is to sequentiually flip the direction of a constant current applied to both coils by changing the voltage across the coil wires from positive to negative. Given two possibly choices for each coil, there are four possible combinations of current flow yielding the following pattern: image
    From 6fc6356cf25c0c6709f0d1f14573495bb5cb1a64 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Wed, 28 Jun 2023 06:15:00 -0500 Subject: [PATCH 084/151] Update StepperModes. --- docs/StepperModes.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 07d1da2..0f36643 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -6,9 +6,14 @@ A typical stepper motor has two sets of coils, *A* and *B*. Applying a current ### Constant-Current Stepper Modes -The most basic pattern you can use to drive a stepper motor is to sequentiually flip the direction of a constant current applied to both coils by changing the voltage across the coil wires from positive to negative. Given two possibly choices for each coil, there are four possible combinations of current flow yielding the following pattern: +The most basic pattern you can use to drive a stepper motor is to sequentiually flip the direction of a constant current applied to the *A* and *B* coils by changing the voltage across their coil wires from positive to negative in the following manner: + +image + +Each flip of the direction of the current in one of the coils results in the motor moving a full step. The pattern repeats after four steps, though note it is not symmetrical - running the pattern from left to right ght to leftwill cuad tis not that same as runnign it from riBecause current is always applied to both coils (or phases) of the motor, **StepperControl** calls this pattern the **FULL_STEP_TWO_PHASE** mode. + + -image
    image
    From c5887b05eb1a257f4fb6129025b03b07a63d6098 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Wed, 28 Jun 2023 06:24:17 -0500 Subject: [PATCH 085/151] Update StepperModes.md --- docs/StepperModes.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 0f36643..b1b6083 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -10,8 +10,11 @@ The most basic pattern you can use to drive a stepper motor is to sequentiually image -Each flip of the direction of the current in one of the coils results in the motor moving a full step. The pattern repeats after four steps, though note it is not symmetrical - running the pattern from left to right ght to leftwill cuad tis not that same as runnign it from riBecause current is always applied to both coils (or phases) of the motor, **StepperControl** calls this pattern the **FULL_STEP_TWO_PHASE** mode. +**StepperControl** refers to this pattern as the **FULL_STEP_TWO_PHASE** mode because each flip of the direction of the current in one of the coils (or phases) results in the motor moving a full step, and both phases are always powered. +Note that though the pattern repeats after four steps, it is not symmetrical - running the pattern from left to right causes the motor to rotate in one direction, whereas running the pattern from right to left will cause it to rotate in the opposite direction. Many stepper motors are constructed to have 200 distinct steps, which means you need to repeat te above pattern 25 times to cause the motor to complete a single revolution. + +One advantage of the **FULL_STEP_TWO_PHASE** mode is that it is easy to implement since you only need a single. From 34b2a42f9578fe3fda3cd7c27db59574b9b80cc5 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Wed, 28 Jun 2023 20:42:25 -0500 Subject: [PATCH 086/151] Update StepperModes.md --- docs/StepperModes.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index b1b6083..ae15ff4 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -1,20 +1,16 @@ # Stepper Motor Modes -A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen, known as the *step mode* in the **StepperControl** class, determines the size of the step and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. +A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen, known as the *step mode* in the **StepperControl** class, determines the size of the step and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. The modes supported by **StepperControl** are as described below. -**StepperControl** supports two different types of step modes: constant-current modes only set the direction of the current flow to either fully on or off, and PWM modes that use a PWM signal to also modulate the magnitude of the current flow. +#### FULL_STEP_TWO_PHASE -### Constant-Current Stepper Modes - -The most basic pattern you can use to drive a stepper motor is to sequentiually flip the direction of a constant current applied to the *A* and *B* coils by changing the voltage across their coil wires from positive to negative in the following manner: +In this mode, a constant current is applied to both coils *A* and *B*. The motor is then stepped by alternatively flipping the direction of the current flow (from "positive" to "negative") in the *A* coil, then the *B* coil, as follows: image -**StepperControl** refers to this pattern as the **FULL_STEP_TWO_PHASE** mode because each flip of the direction of the current in one of the coils (or phases) results in the motor moving a full step, and both phases are always powered. +This is called a two-phase mode becuase both coils (phases) of the motor are powered at the same time. Note that though the pattern repeats after four steps, it is not symmetrical - running the pattern from left to right causes the motor to rotate in one direction, whereas running the pattern from right to left will cause it to rotate in the opposite direction. Many stepper motors are constructed to have 200 full steps, which means you need to repeat the above pattern 25 times to cause the motor to complete a single revolution. -Note that though the pattern repeats after four steps, it is not symmetrical - running the pattern from left to right causes the motor to rotate in one direction, whereas running the pattern from right to left will cause it to rotate in the opposite direction. Many stepper motors are constructed to have 200 distinct steps, which means you need to repeat te above pattern 25 times to cause the motor to complete a single revolution. - -One advantage of the **FULL_STEP_TWO_PHASE** mode is that it is easy to implement since you only need a single. +One advantage of the **FULL_STEP_TWO_PHASE** mode is that it is easy to implement since you only need a single digital signal to control the direction From 99e7e2ea76660e3f49ff12016ad0d5611b363c22 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Wed, 28 Jun 2023 20:50:15 -0500 Subject: [PATCH 087/151] Update StepperModes.md --- docs/StepperModes.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index ae15ff4..4c3c980 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -4,18 +4,17 @@ A typical stepper motor has two sets of coils, *A* and *B*. Applying a current #### FULL_STEP_TWO_PHASE -In this mode, a constant current is applied to both coils *A* and *B*. The motor is then stepped by alternatively flipping the direction of the current flow (from "positive" to "negative") in the *A* coil, then the *B* coil, as follows: +In this mode, a constant current is applied to both coils *A* and *B*. The motor is then stepped by alternatively flipping the direction of the current flow (from "positive" to "negative") in the *A* coil, then the *B* coil, as follows: image This is called a two-phase mode becuase both coils (phases) of the motor are powered at the same time. Note that though the pattern repeats after four steps, it is not symmetrical - running the pattern from left to right causes the motor to rotate in one direction, whereas running the pattern from right to left will cause it to rotate in the opposite direction. Many stepper motors are constructed to have 200 full steps, which means you need to repeat the above pattern 25 times to cause the motor to complete a single revolution. One advantage of the **FULL_STEP_TWO_PHASE** mode is that it is easy to implement since you only need a single digital signal to control the direction - - - + image
    image
    image
    + From 3476101fbe750ec5fdb243d7b266b17241cc76a0 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Thu, 29 Jun 2023 05:59:57 -0500 Subject: [PATCH 088/151] Update StepperModes.md --- docs/StepperModes.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 4c3c980..70aa255 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -1,16 +1,22 @@ # Stepper Motor Modes -A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen, known as the *step mode* in the **StepperControl** class, determines the size of the step and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. The modes supported by **StepperControl** are as described below. +A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen, known as the *step mode* in the **StepperControl** class, determines the size of the step and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. The modes supported by **StepperControl** are described below. -#### FULL_STEP_TWO_PHASE +### FULL STEP TWO PHASE -In this mode, a constant current is applied to both coils *A* and *B*. The motor is then stepped by alternatively flipping the direction of the current flow (from "positive" to "negative") in the *A* coil, then the *B* coil, as follows: +In this mode, a constant current is applied to both coils *A* and *B*. The motor is stepped by alternatively flipping the direction of the current flow in each coil as follows: -image +image
    -This is called a two-phase mode becuase both coils (phases) of the motor are powered at the same time. Note that though the pattern repeats after four steps, it is not symmetrical - running the pattern from left to right causes the motor to rotate in one direction, whereas running the pattern from right to left will cause it to rotate in the opposite direction. Many stepper motors are constructed to have 200 full steps, which means you need to repeat the above pattern 25 times to cause the motor to complete a single revolution. +Note that though the pattern repeats after four steps, it is not symmetrical - running the pattern from left to right causes the motor to rotate in one direction, whereas running the pattern from right to left will cause it to rotate in the opposite direction. +Many stepper motors are constructed to have 200 full steps, which means you need to repeat the above pattern 25 times to cause the motor to complete a single revolution. -One advantage of the **FULL_STEP_TWO_PHASE** mode is that it is easy to implement since you only need a single digital signal to control the direction +Since in this mode each coil has only two possible states (i.e. the direction of the current flow), only one digital signal per coil is required to fully specify the stepping pattern. +However, fully flipping the direction of the current flow in a coil changes the magnetic fields very rapidly, which creates a rather clunky motion when stepping the motor. + +### FULL STEP ONE PHASE + +In this mode, image
    From 12033bcc22e92d9fde7ab44589261f9214ac0f14 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Thu, 29 Jun 2023 06:03:42 -0500 Subject: [PATCH 089/151] Update StepperModes.md --- docs/StepperModes.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 70aa255..25171f8 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -8,15 +8,13 @@ In this mode, a constant current is applied to both coils *A* and *B*. The motor image
    -Note that though the pattern repeats after four steps, it is not symmetrical - running the pattern from left to right causes the motor to rotate in one direction, whereas running the pattern from right to left will cause it to rotate in the opposite direction. -Many stepper motors are constructed to have 200 full steps, which means you need to repeat the above pattern 25 times to cause the motor to complete a single revolution. +Note that though the pattern repeats after four steps, it is not symmetrical - running the pattern from left to right causes the motor to rotate in one direction, whereas running the pattern from right to left will cause it to rotate in the opposite direction. Many stepper motors are constructed to have 200 full steps, which means you need to repeat the above pattern 25 times to cause the motor to complete a single revolution. -Since in this mode each coil has only two possible states (i.e. the direction of the current flow), only one digital signal per coil is required to fully specify the stepping pattern. -However, fully flipping the direction of the current flow in a coil changes the magnetic fields very rapidly, which creates a rather clunky motion when stepping the motor. +Since in this mode each coil has only two possible states (i.e. the direction of the current flow), only one digital signal per coil is required to fully specify the stepping pattern. However, fully flipping the direction of the current flow in a coil changes the magnetic fields very rapidly, which creates a rather clunky motion when stepping the motor. ### FULL STEP ONE PHASE -In this mode, +In this mode, each coil can be in one of three state - image
    From 98aeae84d176e1375d33d2e8ab73f0108603553c Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Thu, 29 Jun 2023 06:14:50 -0500 Subject: [PATCH 090/151] Update StepperModes.md --- docs/StepperModes.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 25171f8..bf01dd6 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -6,7 +6,7 @@ A typical stepper motor has two sets of coils, *A* and *B*. Applying a current In this mode, a constant current is applied to both coils *A* and *B*. The motor is stepped by alternatively flipping the direction of the current flow in each coil as follows: -image
    +image
    Note that though the pattern repeats after four steps, it is not symmetrical - running the pattern from left to right causes the motor to rotate in one direction, whereas running the pattern from right to left will cause it to rotate in the opposite direction. Many stepper motors are constructed to have 200 full steps, which means you need to repeat the above pattern 25 times to cause the motor to complete a single revolution. @@ -14,11 +14,10 @@ Since in this mode each coil has only two possible states (i.e. the direction of ### FULL STEP ONE PHASE -In this mode, each coil can be in one of three state - - -image
    +In this mode, a constant current is applied to only one coil, either *A* or *B*, at the same time. The motor is stepped by alternatively applying the current to each coil, while also flipping its direction as follows: + +image
    image
    image
    - From 4c651370214776a303e28132e5dcf5c0e0845abd Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Thu, 29 Jun 2023 04:36:25 -0700 Subject: [PATCH 091/151] updated --- docs/StepperModes.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index bf01dd6..3f0bec8 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -10,13 +10,17 @@ In this mode, a constant current is applied to both coils *A* and *B*. The motor Note that though the pattern repeats after four steps, it is not symmetrical - running the pattern from left to right causes the motor to rotate in one direction, whereas running the pattern from right to left will cause it to rotate in the opposite direction. Many stepper motors are constructed to have 200 full steps, which means you need to repeat the above pattern 25 times to cause the motor to complete a single revolution. -Since in this mode each coil has only two possible states (i.e. the direction of the current flow), only one digital signal per coil is required to fully specify the stepping pattern. However, fully flipping the direction of the current flow in a coil changes the magnetic fields very rapidly, which creates a rather clunky motion when stepping the motor. +Since in this mode each coil has only two possible states (i.e. the direction of the current flow), only one digital signal per coil is required to implement the stepping pattern. However, fully flipping the direction of the current flow in a coil changes the magnetic fields very rapidly, which creates a rather clunky motion when stepping the motor. ### FULL STEP ONE PHASE In this mode, a constant current is applied to only one coil, either *A* or *B*, at the same time. The motor is stepped by alternatively applying the current to each coil, while also flipping its direction as follows: image
    + +This mode uses only half the power as the FULL STEP TWO PHASE mode since current only flows through one coil at a time. Also, though the step size is the same, the transtition from one step to another is not as harsh since the direction of the current is never flipped while flowing. However, since in this mode each coil has three possible states for current flow (positive, negative, and off), two digital signals per coil are required to implement the stepping pattern. + +### HALF STEP image
    From cc0569b9e2b8a05ed8896ce263ea22a34211a099 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Fri, 30 Jun 2023 07:15:00 -0500 Subject: [PATCH 092/151] Update StepperModes.md --- docs/StepperModes.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 3f0bec8..93c586b 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -2,7 +2,7 @@ A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen, known as the *step mode* in the **StepperControl** class, determines the size of the step and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. The modes supported by **StepperControl** are described below. -### FULL STEP TWO PHASE +### FULL STEP TWO PHASE (withouth PWM) In this mode, a constant current is applied to both coils *A* and *B*. The motor is stepped by alternatively flipping the direction of the current flow in each coil as follows: @@ -12,16 +12,18 @@ Note that though the pattern repeats after four steps, it is not symmetrical - Since in this mode each coil has only two possible states (i.e. the direction of the current flow), only one digital signal per coil is required to implement the stepping pattern. However, fully flipping the direction of the current flow in a coil changes the magnetic fields very rapidly, which creates a rather clunky motion when stepping the motor. -### FULL STEP ONE PHASE +### FULL STEP ONE PHASE (without PWM) -In this mode, a constant current is applied to only one coil, either *A* or *B*, at the same time. The motor is stepped by alternatively applying the current to each coil, while also flipping its direction as follows: +In this mode, a constant current is alternatively applied to either *A* or *B*, while also flipping its direction as follows: image
    -This mode uses only half the power as the FULL STEP TWO PHASE mode since current only flows through one coil at a time. Also, though the step size is the same, the transtition from one step to another is not as harsh since the direction of the current is never flipped while flowing. However, since in this mode each coil has three possible states for current flow (positive, negative, and off), two digital signals per coil are required to implement the stepping pattern. +This mode uses only half the power as the FULL STEP TWO PHASE mode since current only flows through one coil at a time. Also, though the step size is the same, the transtition from one step to another is not as harsh since the current to each coil transtions from one direction to zero before flipping to the other direction. However, since in this mode each coil has three possible states for current flow (positive, negative, and off), two digital signals per coil are required to implement the stepping pattern. -### HALF STEP - +### HALF STEP (without PWM) + +Though the the step sizes for the two modes above are the same, the + image
    image
    From 2ed5f144faec42cc7afd542bf237288e49a6de80 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Fri, 30 Jun 2023 05:34:01 -0700 Subject: [PATCH 093/151] update stepperModes --- docs/StepperModes.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index 93c586b..a56bb85 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -2,7 +2,7 @@ A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen, known as the *step mode* in the **StepperControl** class, determines the size of the step and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. The modes supported by **StepperControl** are described below. -### FULL STEP TWO PHASE (withouth PWM) +## FULL STEP TWO PHASE (without PWM) In this mode, a constant current is applied to both coils *A* and *B*. The motor is stepped by alternatively flipping the direction of the current flow in each coil as follows: @@ -12,18 +12,22 @@ Note that though the pattern repeats after four steps, it is not symmetrical - Since in this mode each coil has only two possible states (i.e. the direction of the current flow), only one digital signal per coil is required to implement the stepping pattern. However, fully flipping the direction of the current flow in a coil changes the magnetic fields very rapidly, which creates a rather clunky motion when stepping the motor. -### FULL STEP ONE PHASE (without PWM) +## FULL STEP ONE PHASE (without PWM) -In this mode, a constant current is alternatively applied to either *A* or *B*, while also flipping its direction as follows: +In this mode, a constant current is alternatively applied to either *A* **or** *B*, while also flipping its direction as follows: image
    This mode uses only half the power as the FULL STEP TWO PHASE mode since current only flows through one coil at a time. Also, though the step size is the same, the transtition from one step to another is not as harsh since the current to each coil transtions from one direction to zero before flipping to the other direction. However, since in this mode each coil has three possible states for current flow (positive, negative, and off), two digital signals per coil are required to implement the stepping pattern. -### HALF STEP (without PWM) +## HALF STEP (without PWM) -Though the the step sizes for the two modes above are the same, the +Though the the step sizes for the two modes above are the same, the set of positions they represent as the motor rotates are out of sync by 1/2 step. This means that by interleaving the four steps of the two modes together, we can create the following 8-step pattern where the step size is *half* that of a full step: -image
    +image
    + +The advantage of this mode is that the motor moves much more smoothly, and can be stopped in half-step increments for more precise control. However, it takes twice as many steps for the motor to complete a full rotation (and thus moves twice as slow given the same delay between steps). + +One other disadvantage of this mode is that in four of the steps both coils are powered, whereas in the other four only one coil is powered. This results in uneven motor torque as the motor rotates, as well as different holding torques depending on which step the motor lies when stopped. Depending on your specific application (raising a shade, closing a door, etc.) this may or may not be of concern. image
    From 6cc63a3e561715f4785018f5dbf8b0f440abf5b1 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Fri, 30 Jun 2023 09:27:05 -0700 Subject: [PATCH 094/151] updated stepperModes.md --- docs/StepperModes.md | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index a56bb85..cb22b02 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -2,7 +2,7 @@ A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen, known as the *step mode* in the **StepperControl** class, determines the size of the step and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. The modes supported by **StepperControl** are described below. -## FULL STEP TWO PHASE (without PWM) +## FULL STEP TWO PHASE Mode(without PWM) In this mode, a constant current is applied to both coils *A* and *B*. The motor is stepped by alternatively flipping the direction of the current flow in each coil as follows: @@ -12,7 +12,7 @@ Note that though the pattern repeats after four steps, it is not symmetrical - Since in this mode each coil has only two possible states (i.e. the direction of the current flow), only one digital signal per coil is required to implement the stepping pattern. However, fully flipping the direction of the current flow in a coil changes the magnetic fields very rapidly, which creates a rather clunky motion when stepping the motor. -## FULL STEP ONE PHASE (without PWM) +## FULL STEP ONE PHASE Mode (without PWM) In this mode, a constant current is alternatively applied to either *A* **or** *B*, while also flipping its direction as follows: @@ -20,7 +20,7 @@ In this mode, a constant current is alternatively applied to either *A* **or** * This mode uses only half the power as the FULL STEP TWO PHASE mode since current only flows through one coil at a time. Also, though the step size is the same, the transtition from one step to another is not as harsh since the current to each coil transtions from one direction to zero before flipping to the other direction. However, since in this mode each coil has three possible states for current flow (positive, negative, and off), two digital signals per coil are required to implement the stepping pattern. -## HALF STEP (without PWM) +## HALF STEP Mode (without PWM) Though the the step sizes for the two modes above are the same, the set of positions they represent as the motor rotates are out of sync by 1/2 step. This means that by interleaving the four steps of the two modes together, we can create the following 8-step pattern where the step size is *half* that of a full step: @@ -30,4 +30,24 @@ The advantage of this mode is that the motor moves much more smoothly, and can b One other disadvantage of this mode is that in four of the steps both coils are powered, whereas in the other four only one coil is powered. This results in uneven motor torque as the motor rotates, as well as different holding torques depending on which step the motor lies when stopped. Depending on your specific application (raising a shade, closing a door, etc.) this may or may not be of concern. +## QUARTER STEP and EIGHTH STEP Modes (including PWM versions of the above modes) + +In the above modes, current to each coil is either "fully on" in one direction, fully on in the other direction, or completely off. As a result, there is a trade-off between step granularity and smoothness of rotation versus power and torque consistency. The solution to this problem is to drive the current in each coil with a PWM signal (or an equivalent limiting mechanism) that allows the *magnitude* of the current flow to be controlled in addition to its direction. + +Typically this is done by setting the magnitude of the current in each coil based on sinusoidal patterns offset by 90° as follows: + image
    + +Here, the blue dots perfectly replicate the steps of the FULL STEP ONE PHASE mode (e.g. positive/off/negative/off for coil *A*), the red dots replicate the steps of the FULL STEP TWO PHASE MODE, and the combined set of both the red blue and red dots taken together replicate the steps of the HALF STEP mode. Each non-PWM mode above can therefore be replicated using a single set of PWM-based sinusoidal curves, but with one important difference: the PWM method yields the same power for every step in every mode, avoiding the problems of inconsistent torque described above for the non-PWM modes. This is because power is typically proportional to the *square* of the magnitude of the current running through a coil; coil *A* follows a cosine curve; coil *B* follows a sine curve; and and $cos^2+sin^2=1$, which is a constant. + +It is generally preferable to use the PWM method when running a motor in any of the three modes above, rather than running with just a constant current applied to each coil, provided that PWM signals are available. Fortunately, many stepper motor driver boards contain a built-in PWM module. And if they don't, you can have **StepperControl** generate the required PWM signals using the ESP32's built-in PWM peripheral. + +In addition to providing better motor performance, the PWM method also provides for even more granular stepping modes by adding "microsteps" to the step pattern. For example, adding 8 additional steps between the half-steps, as indicated on the curves by the 8 black diamonds placed between the blue and red dots, yields a QUARTER STEP mode. This mode is twice as "smooth" as the HALF STEP mode, but requires twice as many steps for the motor to complete a full rotation. Halving the steps even further (not shown on the diagram) yields the EIGHTH STEP mode where each cycle contains 32 individual stepping points. **StepperControl** supports both the QUARTER STEP and EIGHTH STEP modes, though you can easily extend this further by adding modes with 64 or 128 steps per cycle. For motors designed to operate a window shade, such granularity is generally not needed, and too fine a granularity can cause misteps depending on the specific characteristics of the motor. + + + + + + + + From d729aaa5dcab205027c83056fb44943b66f1fef5 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Fri, 30 Jun 2023 11:30:55 -0500 Subject: [PATCH 095/151] Update StepperModes.md --- docs/StepperModes.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index cb22b02..e024721 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -2,7 +2,7 @@ A typical stepper motor has two sets of coils, *A* and *B*. Applying a current to one or both coils creates a magnetic field that fixes the motor's position. Any changes to the direction and/or magnitude of the current flowing through the coils causes the motor to "step" to a new fixed position. By repeatedly changing the current flow according to a specific pattern the motor can be made to continuously step clockwise or counterclockwise. The specific pattern chosen, known as the *step mode* in the **StepperControl** class, determines the size of the step and overall performance of the motor. The speed at which changes to the current flow are made determines the speed at which the motor rotates. The modes supported by **StepperControl** are described below. -## FULL STEP TWO PHASE Mode(without PWM) +## FULL STEP TWO PHASE MODE (without PWM) In this mode, a constant current is applied to both coils *A* and *B*. The motor is stepped by alternatively flipping the direction of the current flow in each coil as follows: @@ -12,7 +12,7 @@ Note that though the pattern repeats after four steps, it is not symmetrical - Since in this mode each coil has only two possible states (i.e. the direction of the current flow), only one digital signal per coil is required to implement the stepping pattern. However, fully flipping the direction of the current flow in a coil changes the magnetic fields very rapidly, which creates a rather clunky motion when stepping the motor. -## FULL STEP ONE PHASE Mode (without PWM) +## FULL STEP ONE PHASE MODE (without PWM) In this mode, a constant current is alternatively applied to either *A* **or** *B*, while also flipping its direction as follows: @@ -20,7 +20,7 @@ In this mode, a constant current is alternatively applied to either *A* **or** * This mode uses only half the power as the FULL STEP TWO PHASE mode since current only flows through one coil at a time. Also, though the step size is the same, the transtition from one step to another is not as harsh since the current to each coil transtions from one direction to zero before flipping to the other direction. However, since in this mode each coil has three possible states for current flow (positive, negative, and off), two digital signals per coil are required to implement the stepping pattern. -## HALF STEP Mode (without PWM) +## HALF STEP MODE (without PWM) Though the the step sizes for the two modes above are the same, the set of positions they represent as the motor rotates are out of sync by 1/2 step. This means that by interleaving the four steps of the two modes together, we can create the following 8-step pattern where the step size is *half* that of a full step: @@ -30,7 +30,7 @@ The advantage of this mode is that the motor moves much more smoothly, and can b One other disadvantage of this mode is that in four of the steps both coils are powered, whereas in the other four only one coil is powered. This results in uneven motor torque as the motor rotates, as well as different holding torques depending on which step the motor lies when stopped. Depending on your specific application (raising a shade, closing a door, etc.) this may or may not be of concern. -## QUARTER STEP and EIGHTH STEP Modes (including PWM versions of the above modes) +## QUARTER STEP and EIGHTH STEP MODES (including PWM versions of the above modes) In the above modes, current to each coil is either "fully on" in one direction, fully on in the other direction, or completely off. As a result, there is a trade-off between step granularity and smoothness of rotation versus power and torque consistency. The solution to this problem is to drive the current in each coil with a PWM signal (or an equivalent limiting mechanism) that allows the *magnitude* of the current flow to be controlled in addition to its direction. @@ -44,7 +44,9 @@ It is generally preferable to use the PWM method when running a motor in any of In addition to providing better motor performance, the PWM method also provides for even more granular stepping modes by adding "microsteps" to the step pattern. For example, adding 8 additional steps between the half-steps, as indicated on the curves by the 8 black diamonds placed between the blue and red dots, yields a QUARTER STEP mode. This mode is twice as "smooth" as the HALF STEP mode, but requires twice as many steps for the motor to complete a full rotation. Halving the steps even further (not shown on the diagram) yields the EIGHTH STEP mode where each cycle contains 32 individual stepping points. **StepperControl** supports both the QUARTER STEP and EIGHTH STEP modes, though you can easily extend this further by adding modes with 64 or 128 steps per cycle. For motors designed to operate a window shade, such granularity is generally not needed, and too fine a granularity can cause misteps depending on the specific characteristics of the motor. - +--- + +[↩️](../Stepper.md) Back to the Stepper Control page From a519cff85ebe45f1dda51fc33e75af29b50775e7 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Fri, 30 Jun 2023 11:33:34 -0500 Subject: [PATCH 096/151] Update StepperModes.md --- docs/StepperModes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/StepperModes.md b/docs/StepperModes.md index e024721..56aa328 100644 --- a/docs/StepperModes.md +++ b/docs/StepperModes.md @@ -46,7 +46,7 @@ In addition to providing better motor performance, the PWM method also provides --- -[↩️](../Stepper.md) Back to the Stepper Control page +[↩️](Stepper.md) Back to the Stepper Motor Control page From 75aa0f8906e14ab89c93195a5453180e015a0ae5 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Fri, 30 Jun 2023 11:36:49 -0500 Subject: [PATCH 097/151] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 29474ed..48cbe36 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ HomeSpan includes the following documentation: * [HomeSpan PWM](docs/PWM.md) - integrated control of standard LEDs and Servo Motors using the ESP32's on-chip PWM peripheral * [HomeSpan RFControl](docs/RMT.md) - easy generation of RF and IR Remote Control signals using the ESP32's on-chip RMT peripheral * [HomeSpan Pixels](docs/Pixels.md) - integrated control of addressable one- and two-wire RGB and RGBW LEDs and LED strips +* [HomeSpan Stepper Motor Control](docs/Stepper.md) - integrated control of stepper motors, including PWM microstepping * [HomeSpan SpanPoint](docs/NOW.md) - facilitates point-to-point, bi-directional communication between ESP32 Devices using ESP-NOW * [HomeSpan Television Services](docs/TVServices.md) - how to use HomeKit's undocumented Television Services and Characteristics * [HomeSpan Message Logging](docs/Logging.md) - how to generate log messages for display on the Arduino Serial Monitor as well as optionally posted to an integrated Web Log page From 003560a92a72ee1a70b47de1ee0721322d57f902 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Fri, 30 Jun 2023 12:40:17 -0500 Subject: [PATCH 098/151] Update README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 48cbe36..f416c69 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ HomeSpan requires version 2.0.0 or later of the [Arduino-ESP32 Board Manager](ht * Touch pads/sensors connected to an ESP32 pin (for ESP32 devices that support touch pads) * Integrated access to the ESP32's on-chip Remote Control peripheral for easy generation of IR and RF signals * Dedicated classes to control one- and two-wire addressable RGB and RGBW LEDs and LED strips +* Dedicated classes to control stepper motors that can run smoothly in the background without interfering with HomeSpan * Dedicated class that faciliates seemless point-to-point communication between ESP32 devices using ESP-NOW * Integrated Web Log for user-defined log messages * Extensively-commented Tutorial Sketches taking you from the very basics of HomeSpan through advanced HomeKit topics @@ -50,6 +51,16 @@ HomeSpan requires version 2.0.0 or later of the [Arduino-ESP32 Board Manager](ht ## ❗Latest Update - HomeSpan 1.7.3 (MM/DD/2023) +* **New Stepper Motor Control!** + + * adds new **StepperControl** class that allows for smooth, uninterrupted operation of one or more stepper motors running in the background while HomeSpan continues to run simultaneously in the foreground + * supports driver boards with or without PWM, including microstepping modes + * supports automatic acceleration and deceleration for smooth starts and stops + * motors can be set to an absolute position or instructucted to move a specified number of steps + * provides options to automatically enter into a "brake" state after motor stops to conserve power + * includes a fully worked example of a motorized window shade + * see [Stepper Motor Control](docs/Stepper.md) for details + * **Upgrades to HomeSpan Web Log output** * adds new method `void homeSpan.setWebLogCSS(const char *css)` that allows you to define *Custom Style Sheets (CSS)* for the Web Log text, tables, and background From 280044bdd1bb8fa95cbdbb4a73e5af740340221b Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Fri, 30 Jun 2023 12:49:12 -0500 Subject: [PATCH 099/151] Update Tutorials.md --- docs/Tutorials.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/Tutorials.md b/docs/Tutorials.md index 558f9a4..924237b 100644 --- a/docs/Tutorials.md +++ b/docs/Tutorials.md @@ -138,6 +138,9 @@ Demonstrates how *SpanPoint* can be used to transmit messages from battery-power ### [FadingLED](../examples/Other%20Examples/FadingLED) Demonstrates how the *LedPin* class can use the ESP32's built-in fading control to automatically fade an LED from from one level of brightness to another over a specified period of time. See the [LedPin](PWM.md#pulse-width-modulation-pwm) page for full details +### [StepperMotorControl](../examples/Other%20Examples/StepperMotorControl) +Demonstrates how to use the *StepperControl* class to operate a stepper motor. Implements a motorized window shade based on [Example 13](../examples/13-TargetStates) above. See the [Stepper Motor Control](Stepper.md) page for full details + --- [↩️](../README.md) Back to the Welcome page From 75ac6a31b7ad2038c352ca777a27f091e42cc471 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Fri, 30 Jun 2023 17:28:18 -0500 Subject: [PATCH 100/151] Update Stepper.md --- docs/Stepper.md | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/docs/Stepper.md b/docs/Stepper.md index 6d4b8a1..3d0e31a 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -109,6 +109,59 @@ The **StepperControl** class provides the following methods to operate and contr * it is possible, though not recommended, to change the step type *mode* while the motor is turning * see [Stepper Motor Modes](StepperModes.md) for a brief primer on how stepper motors are typically driven +## Example Sketches + +Below is a simple sketch demonstrating the above methods: + +```C++ +// StepperControl Example using TB6612-based Driver Board with HALF STEP PWM MODE + +#include "Stepper_TB6612.h" // include the driver for a TB6612 chip + +StepperControl *motor; // create a global pointer to StepperControl so it can be accessed in both setup() and loop() + +/////////////////// + +void setup() { + + Serial.begin(115200); + delay(1000); + Serial.printf("\nHomeSpan Stepper Control\n\n"); + + motor=new Stepper_TB6612(23,32,22,14,33,27); // instantiate the motor object with optional PWM pin specified (33 and 27) + + motor->setStepType(StepperControl::HALF_STEP); // set the mode to HALF STEP, which means 400 steps are needed for a complete revolution of a 200-step motor + motor->setAccel(10,20); // add acceleration parameters: extra delay is 10x, decaying over 20 steps + + Serial.printf("Moving motor 400 steps and waiting until motor stops...\n"); + + motor->move(-400,5); // move the motor -400 steps (1 revolution), with 5ms between steps. + while(motor->stepsRemaining()); // wait until there no remaining steps + + Serial.printf("Moving motor to absolute position of +1200 (i.e reverse direction for 1600 steps, or 4 revolutions) without waiting...\n"); + + motor->moveTo(1200,2,StepperControl::BRAKE); // move the motor to an absolute position of 1200 steps with 2ms between steps; enter brake state when done + + // Motor will continue moving in background even once setup() exits and loop() below starts +} + +/////////////////// + +void loop(){ + + Serial.printf("Motor has %d remaining steps\n",motor->stepsRemaining()); + + delay(1000); // motor is unaffected by delay() + + if(motor->position()==1200){ + Serial.printf("Motor has reached final position and is now stopped.\n"); + while(1); + } +} +``` + +A fully worked example showing how to use the *StepperControl* class within a complete HomeSpan sketch to control a Motorize Window Shade can be found in the Arduino IDE under [*File → Examples → HomeSpan → Other Examples → StepperMotorControl*](../examples/Other%20Examples/StepperMotorControl). + --- [↩️](../README.md) Back to the Welcome page From 6ab047b011eeceddacdad89e36f982c195c1bec8 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 1 Jul 2023 09:01:11 -0500 Subject: [PATCH 101/151] Update extras.ino --- src/src/extras/extras.ino | 44 +++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index 36f66bc..da92fc2 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -28,33 +28,45 @@ // This is a placeholder .ino file that allows you to easily edit the contents of this files using the Arduino IDE, // as well as compile and test from this point. This file is ignored when the library is included in other sketches. -#include "Stepper_TB6612.h" -#include "Stepper_A3967.h" +#include "Stepper_TB6612.h" // include the driver for a TB6612 chip -StepperControl *motor; +StepperControl *motor; // create a global pointer to StepperControl so it can be accessed in both setup() and loop() -//////////////////////////////////// +/////////////////// void setup() { Serial.begin(115200); delay(1000); - Serial.printf("\nHomeSpan Steppers\n\n"); + Serial.printf("\nHomeSpan Stepper Control\n\n"); -// motor=new Stepper_TB6612(23,32,22,14,33,27,{1,1}); - motor=new Stepper_TB6612(23,32,22,14); + motor=new Stepper_TB6612(23,32,22,14,33,27); // instantiate the motor object (with PWM pins 33 and 27 specified) - motor->setStepType(StepperControl::FULL_STEP_ONE_PHASE); - motor->setAccel(10,20); - motor->move(200,5); + motor->setStepType(StepperControl::HALF_STEP); // set the mode to half-step, which means 400 steps are needed for a complete revolution for a 200-step motor + motor->setAccel(10,20); // add acceleration parameters of 10x spread of 20 steps + + Serial.printf("Moving motor 400 steps and waiting until motor stops...\n"); + + motor->move(-400,5); // move the motor -400 steps (1 revolution), with 2ms between steps. + while(motor->stepsRemaining()); // wait until there no remaining steps + + Serial.printf("Moving motor to absolute position of +1200 (reversing a total of 1600 steps, or 4 revolutions) without waiting...\n"); + + motor->moveTo(1200,2,StepperControl::BRAKE); // move the motor to an absolute position of 1200 steps with 3ms between steps; enter brake state when done + + // Motor will continue moving in background even once setup() exits and loop() below starts } -////////////////////////////////////// +/////////////////// void loop(){ + + Serial.printf("Motor has %d remaining steps\n",motor->stepsRemaining()); + + delay(1000); // motor is unaffected by delay() + + if(motor->position()==1200){ + Serial.printf("Motor has reached final position and is now stopped.\n"); + while(1); + } } - -////////////////////////////////////// - - -////////////////////////// From f7cd705a319d2169dae7c393c0bb975bd95446c9 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 1 Jul 2023 09:43:35 -0500 Subject: [PATCH 102/151] Deleted unused stepper motor images --- docs/images/StepperPWM.png | Bin 159557 -> 0 bytes docs/images/fullStepOnePhase.png | Bin 13971 -> 0 bytes docs/images/fullStepTwoPhase.png | Bin 10805 -> 0 bytes docs/images/halfStep.png | Bin 15849 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/images/StepperPWM.png delete mode 100644 docs/images/fullStepOnePhase.png delete mode 100644 docs/images/fullStepTwoPhase.png delete mode 100644 docs/images/halfStep.png diff --git a/docs/images/StepperPWM.png b/docs/images/StepperPWM.png deleted file mode 100644 index dfb1b1abbadcfab92b9c4a5179346ce8bf049f7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159557 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 diff --git a/docs/images/fullStepOnePhase.png b/docs/images/fullStepOnePhase.png deleted file mode 100644 index f73eae6f160fa6d1e5f03168c74b5d90b5eeb979..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13971 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 S={|iIDJd!^QuuexJ@)>?Z!+R~Tr( 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 B*er?u0?h@W9I#ShC0jWsRy;&pmLKRWwuD;-;l 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 From 23394203a9b65fa04b2bac81a953429aab2663f4 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 1 Jul 2023 09:47:23 -0500 Subject: [PATCH 103/151] Adding documentation for specific Stepper Driver Boards --- docs/StepperDrivers/Stepper_A3967.md | 85 ++++++++++++++++++++++ docs/StepperDrivers/Stepper_TB6612 copy.md | 85 ++++++++++++++++++++++ 2 files changed, 170 insertions(+) create mode 100644 docs/StepperDrivers/Stepper_A3967.md create mode 100644 docs/StepperDrivers/Stepper_TB6612 copy.md diff --git a/docs/StepperDrivers/Stepper_A3967.md b/docs/StepperDrivers/Stepper_A3967.md new file mode 100644 index 0000000..7f528df --- /dev/null +++ b/docs/StepperDrivers/Stepper_A3967.md @@ -0,0 +1,85 @@ +# HomeSpan Status + +The optional ***homeSpan*** method, `void setStatusCallback(void (*func)(HS_STATUS status))`, can be used to create a callback function, *func*, that HomeSpan calls whenever its status changes. HomeSpan passes *func* a single argument, *status*, of type *HS_STATUS*, defined as follows: + +```C++ +enum HS_STATUS { + HS_WIFI_NEEDED, // WiFi Credentials have not yet been set/stored + HS_WIFI_CONNECTING, // HomeSpan is trying to connect to the network specified in the stored WiFi Credentials + HS_PAIRING_NEEDED, // HomeSpan is connected to central WiFi network, but device has not yet been paired to HomeKit + HS_PAIRED, // HomeSpan is connected to central WiFi network and ther device has been paired to HomeKit + HS_ENTERING_CONFIG_MODE, // User has requested the device to enter into Command Mode + HS_CONFIG_MODE_EXIT, // HomeSpan is in Command Mode with "Exit Command Mode" specified as choice + HS_CONFIG_MODE_REBOOT, // HomeSpan is in Command Mode with "Reboot" specified as choice + HS_CONFIG_MODE_LAUNCH_AP, // HomeSpan is in Command Mode with "Launch Access Point" specified as choice + HS_CONFIG_MODE_UNPAIR, // HomeSpan is in Command Mode with "Unpair Device" specified as choice + HS_CONFIG_MODE_ERASE_WIFI, // HomeSpan is in Command Mode with "Erase WiFi Credentials" specified as choice + HS_CONFIG_MODE_EXIT_SELECTED, // User has selected "Exit Command Mode" + HS_CONFIG_MODE_REBOOT_SELECTED, // User has select "Reboot" from the Command Mode + HS_CONFIG_MODE_LAUNCH_AP_SELECTED, // User has selected "Launch AP Access" from the Command Mode + HS_CONFIG_MODE_UNPAIR_SELECTED, // User has seleected "Unpair Device" from the Command Mode + HS_CONFIG_MODE_ERASE_WIFI_SELECTED, // User has selected "Erase WiFi Credentials" from the Command Mode + HS_REBOOTING, // HomeSpan is in the process of rebooting the device + HS_FACTORY_RESET, // HomeSpan is in the process of performing a Factory Reset of device + HS_AP_STARTED, // HomeSpan has started the Access Point but no one has yet connected + HS_AP_CONNECTED, // The Access Point is started and a user device has been connected + HS_AP_TERMINATED, // HomeSpan has terminated the Access Point + HS_OTA_STARTED // HomeSpan is in the process of recveived an Over-the-Air software update +}; +``` + +The ***homeSpan*** method `char* statusString(HS_STATUS s)`, is a convenience function for converting any of the above enumerations to short, pre-defined character string messages as follows: + +```C++ +const char* Span::statusString(HS_STATUS s){ + switch(s){ + case HS_WIFI_NEEDED: return("WiFi Credentials Needed"); + case HS_WIFI_CONNECTING: return("WiFi Connecting"); + case HS_PAIRING_NEEDED: return("Device not yet Paired"); + case HS_PAIRED: return("Device Paired"); + case HS_ENTERING_CONFIG_MODE: return("Entering Command Mode"); + case HS_CONFIG_MODE_EXIT: return("1. Exit Command Mode"); + case HS_CONFIG_MODE_REBOOT: return("2. Reboot Device"); + case HS_CONFIG_MODE_LAUNCH_AP: return("3. Launch Access Point"); + case HS_CONFIG_MODE_UNPAIR: return("4. Unpair Device"); + case HS_CONFIG_MODE_ERASE_WIFI: return("5. Erase WiFi Credentials"); + case HS_CONFIG_MODE_EXIT_SELECTED: return("Exiting Command Mode..."); + case HS_CONFIG_MODE_REBOOT_SELECTED: return("Rebooting Device..."); + case HS_CONFIG_MODE_LAUNCH_AP_SELECTED: return("Launching Access Point..."); + case HS_CONFIG_MODE_UNPAIR_SELECTED: return("Unpairing Device..."); + case HS_CONFIG_MODE_ERASE_WIFI_SELECTED: return("Erasing WiFi Credentials..."); + case HS_REBOOTING: return("REBOOTING!"); + case HS_FACTORY_RESET: return("Performing Factory Reset..."); + case HS_AP_STARTED: return("Access Point Started"); + case HS_AP_CONNECTED: return("Access Point Connected"); + case HS_AP_TERMINATED: return("Access Point Terminated"); + case HS_OTA_STARTED: return("OTA Update Started"); + default: return("Unknown"); + } +} +``` + +### Example: + +```C++ +#include "HomeSpan.h" + +void setup(){ + homeSpan.setStatusCallback(statusUpdate); // set callback function + ... + homeSpan.begin(); + ... +} + +// create a callback function that simply prints the pre-defined short messages on the Serial Monitor whenever the HomeSpan status changes + +void statusUpdate(HS_STATUS status){ + Serial.printf("\n*** HOMESPAN STATUS CHANGE: %s\n",homeSpan.statusString(status)); +} +``` + +You can of course create any alternative messsages, or take any actions desired, in *func* and do not need to use the pre-defined strings above. + +--- + +[↩️](Reference.md) Back to the Reference API page diff --git a/docs/StepperDrivers/Stepper_TB6612 copy.md b/docs/StepperDrivers/Stepper_TB6612 copy.md new file mode 100644 index 0000000..7f528df --- /dev/null +++ b/docs/StepperDrivers/Stepper_TB6612 copy.md @@ -0,0 +1,85 @@ +# HomeSpan Status + +The optional ***homeSpan*** method, `void setStatusCallback(void (*func)(HS_STATUS status))`, can be used to create a callback function, *func*, that HomeSpan calls whenever its status changes. HomeSpan passes *func* a single argument, *status*, of type *HS_STATUS*, defined as follows: + +```C++ +enum HS_STATUS { + HS_WIFI_NEEDED, // WiFi Credentials have not yet been set/stored + HS_WIFI_CONNECTING, // HomeSpan is trying to connect to the network specified in the stored WiFi Credentials + HS_PAIRING_NEEDED, // HomeSpan is connected to central WiFi network, but device has not yet been paired to HomeKit + HS_PAIRED, // HomeSpan is connected to central WiFi network and ther device has been paired to HomeKit + HS_ENTERING_CONFIG_MODE, // User has requested the device to enter into Command Mode + HS_CONFIG_MODE_EXIT, // HomeSpan is in Command Mode with "Exit Command Mode" specified as choice + HS_CONFIG_MODE_REBOOT, // HomeSpan is in Command Mode with "Reboot" specified as choice + HS_CONFIG_MODE_LAUNCH_AP, // HomeSpan is in Command Mode with "Launch Access Point" specified as choice + HS_CONFIG_MODE_UNPAIR, // HomeSpan is in Command Mode with "Unpair Device" specified as choice + HS_CONFIG_MODE_ERASE_WIFI, // HomeSpan is in Command Mode with "Erase WiFi Credentials" specified as choice + HS_CONFIG_MODE_EXIT_SELECTED, // User has selected "Exit Command Mode" + HS_CONFIG_MODE_REBOOT_SELECTED, // User has select "Reboot" from the Command Mode + HS_CONFIG_MODE_LAUNCH_AP_SELECTED, // User has selected "Launch AP Access" from the Command Mode + HS_CONFIG_MODE_UNPAIR_SELECTED, // User has seleected "Unpair Device" from the Command Mode + HS_CONFIG_MODE_ERASE_WIFI_SELECTED, // User has selected "Erase WiFi Credentials" from the Command Mode + HS_REBOOTING, // HomeSpan is in the process of rebooting the device + HS_FACTORY_RESET, // HomeSpan is in the process of performing a Factory Reset of device + HS_AP_STARTED, // HomeSpan has started the Access Point but no one has yet connected + HS_AP_CONNECTED, // The Access Point is started and a user device has been connected + HS_AP_TERMINATED, // HomeSpan has terminated the Access Point + HS_OTA_STARTED // HomeSpan is in the process of recveived an Over-the-Air software update +}; +``` + +The ***homeSpan*** method `char* statusString(HS_STATUS s)`, is a convenience function for converting any of the above enumerations to short, pre-defined character string messages as follows: + +```C++ +const char* Span::statusString(HS_STATUS s){ + switch(s){ + case HS_WIFI_NEEDED: return("WiFi Credentials Needed"); + case HS_WIFI_CONNECTING: return("WiFi Connecting"); + case HS_PAIRING_NEEDED: return("Device not yet Paired"); + case HS_PAIRED: return("Device Paired"); + case HS_ENTERING_CONFIG_MODE: return("Entering Command Mode"); + case HS_CONFIG_MODE_EXIT: return("1. Exit Command Mode"); + case HS_CONFIG_MODE_REBOOT: return("2. Reboot Device"); + case HS_CONFIG_MODE_LAUNCH_AP: return("3. Launch Access Point"); + case HS_CONFIG_MODE_UNPAIR: return("4. Unpair Device"); + case HS_CONFIG_MODE_ERASE_WIFI: return("5. Erase WiFi Credentials"); + case HS_CONFIG_MODE_EXIT_SELECTED: return("Exiting Command Mode..."); + case HS_CONFIG_MODE_REBOOT_SELECTED: return("Rebooting Device..."); + case HS_CONFIG_MODE_LAUNCH_AP_SELECTED: return("Launching Access Point..."); + case HS_CONFIG_MODE_UNPAIR_SELECTED: return("Unpairing Device..."); + case HS_CONFIG_MODE_ERASE_WIFI_SELECTED: return("Erasing WiFi Credentials..."); + case HS_REBOOTING: return("REBOOTING!"); + case HS_FACTORY_RESET: return("Performing Factory Reset..."); + case HS_AP_STARTED: return("Access Point Started"); + case HS_AP_CONNECTED: return("Access Point Connected"); + case HS_AP_TERMINATED: return("Access Point Terminated"); + case HS_OTA_STARTED: return("OTA Update Started"); + default: return("Unknown"); + } +} +``` + +### Example: + +```C++ +#include "HomeSpan.h" + +void setup(){ + homeSpan.setStatusCallback(statusUpdate); // set callback function + ... + homeSpan.begin(); + ... +} + +// create a callback function that simply prints the pre-defined short messages on the Serial Monitor whenever the HomeSpan status changes + +void statusUpdate(HS_STATUS status){ + Serial.printf("\n*** HOMESPAN STATUS CHANGE: %s\n",homeSpan.statusString(status)); +} +``` + +You can of course create any alternative messsages, or take any actions desired, in *func* and do not need to use the pre-defined strings above. + +--- + +[↩️](Reference.md) Back to the Reference API page From 59cd3cb44100350f934fb5a7f8d7491ec0311a81 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 09:48:52 -0500 Subject: [PATCH 104/151] Update Stepper.md --- docs/Stepper.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 3d0e31a..9421eb0 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -4,7 +4,7 @@ HomeSpan includes dedicated classes that provide for easy control of a stepper m The HomeSpan class that contains all the methods to control a stepper motor is called **StepperControl**. However, this is a virtual class and cannot be instantiated directly. Instead you instantiate stepper motor objects using driver-specific child-classes (derived from **StepperControl**) that contain all the logic to configure and operate a particular driver board. Each child class supports one or more constructors allowing you to specify which output pins on your ESP32 device will be connected to the required pins on your driver board: -* **Stepper_TB6612** +* **[Stepper_TB6612](StepperDrivers/Stepper_TB6612.md)** * This class is used to operate stepper motors driven by a [Toshiba TB6612](https://www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins * To use, add the following to the top of your sketch: `#include "extras/Stepper_TB6612.h"` * Constructor 1: `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2)` @@ -14,7 +14,7 @@ The HomeSpan class that contains all the methods to control a stepper motor is c * controls the driver board using 4 digital pins and 2 PWM pins from the ESP32 * the addition of the PWM pins provides the ability to microstep the motor -* **Stepper_A3967** +* **[Stepper_A3967](StepperDrivers/Stepper_A3967.md)** * This class is used to operate stepper motors driven by an [Allegro A3967](https://www.sparkfun.com/products/12779) chip * To use, add the following to the top of your sketch: `#include "extras/Stepper_A3967.h"` * Contructor: `Stepper_A3967(int M1, int M2, int STEP, int DIR, int ENABLE)` From 9a31a11164bb448529e541dd0320db968a34cfa0 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 1 Jul 2023 09:50:38 -0500 Subject: [PATCH 105/151] filename change --- docs/StepperDrivers/{Stepper_TB6612 copy.md => Stepper_TB6612.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/StepperDrivers/{Stepper_TB6612 copy.md => Stepper_TB6612.md} (100%) diff --git a/docs/StepperDrivers/Stepper_TB6612 copy.md b/docs/StepperDrivers/Stepper_TB6612.md similarity index 100% rename from docs/StepperDrivers/Stepper_TB6612 copy.md rename to docs/StepperDrivers/Stepper_TB6612.md From 32ef8e1987319aae4178f5c63a2122d4b96ff962 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 09:53:15 -0500 Subject: [PATCH 106/151] Update Stepper_TB6612.md --- docs/StepperDrivers/Stepper_TB6612.md | 84 +-------------------------- 1 file changed, 2 insertions(+), 82 deletions(-) diff --git a/docs/StepperDrivers/Stepper_TB6612.md b/docs/StepperDrivers/Stepper_TB6612.md index 7f528df..628d27a 100644 --- a/docs/StepperDrivers/Stepper_TB6612.md +++ b/docs/StepperDrivers/Stepper_TB6612.md @@ -1,85 +1,5 @@ -# HomeSpan Status - -The optional ***homeSpan*** method, `void setStatusCallback(void (*func)(HS_STATUS status))`, can be used to create a callback function, *func*, that HomeSpan calls whenever its status changes. HomeSpan passes *func* a single argument, *status*, of type *HS_STATUS*, defined as follows: - -```C++ -enum HS_STATUS { - HS_WIFI_NEEDED, // WiFi Credentials have not yet been set/stored - HS_WIFI_CONNECTING, // HomeSpan is trying to connect to the network specified in the stored WiFi Credentials - HS_PAIRING_NEEDED, // HomeSpan is connected to central WiFi network, but device has not yet been paired to HomeKit - HS_PAIRED, // HomeSpan is connected to central WiFi network and ther device has been paired to HomeKit - HS_ENTERING_CONFIG_MODE, // User has requested the device to enter into Command Mode - HS_CONFIG_MODE_EXIT, // HomeSpan is in Command Mode with "Exit Command Mode" specified as choice - HS_CONFIG_MODE_REBOOT, // HomeSpan is in Command Mode with "Reboot" specified as choice - HS_CONFIG_MODE_LAUNCH_AP, // HomeSpan is in Command Mode with "Launch Access Point" specified as choice - HS_CONFIG_MODE_UNPAIR, // HomeSpan is in Command Mode with "Unpair Device" specified as choice - HS_CONFIG_MODE_ERASE_WIFI, // HomeSpan is in Command Mode with "Erase WiFi Credentials" specified as choice - HS_CONFIG_MODE_EXIT_SELECTED, // User has selected "Exit Command Mode" - HS_CONFIG_MODE_REBOOT_SELECTED, // User has select "Reboot" from the Command Mode - HS_CONFIG_MODE_LAUNCH_AP_SELECTED, // User has selected "Launch AP Access" from the Command Mode - HS_CONFIG_MODE_UNPAIR_SELECTED, // User has seleected "Unpair Device" from the Command Mode - HS_CONFIG_MODE_ERASE_WIFI_SELECTED, // User has selected "Erase WiFi Credentials" from the Command Mode - HS_REBOOTING, // HomeSpan is in the process of rebooting the device - HS_FACTORY_RESET, // HomeSpan is in the process of performing a Factory Reset of device - HS_AP_STARTED, // HomeSpan has started the Access Point but no one has yet connected - HS_AP_CONNECTED, // The Access Point is started and a user device has been connected - HS_AP_TERMINATED, // HomeSpan has terminated the Access Point - HS_OTA_STARTED // HomeSpan is in the process of recveived an Over-the-Air software update -}; -``` - -The ***homeSpan*** method `char* statusString(HS_STATUS s)`, is a convenience function for converting any of the above enumerations to short, pre-defined character string messages as follows: - -```C++ -const char* Span::statusString(HS_STATUS s){ - switch(s){ - case HS_WIFI_NEEDED: return("WiFi Credentials Needed"); - case HS_WIFI_CONNECTING: return("WiFi Connecting"); - case HS_PAIRING_NEEDED: return("Device not yet Paired"); - case HS_PAIRED: return("Device Paired"); - case HS_ENTERING_CONFIG_MODE: return("Entering Command Mode"); - case HS_CONFIG_MODE_EXIT: return("1. Exit Command Mode"); - case HS_CONFIG_MODE_REBOOT: return("2. Reboot Device"); - case HS_CONFIG_MODE_LAUNCH_AP: return("3. Launch Access Point"); - case HS_CONFIG_MODE_UNPAIR: return("4. Unpair Device"); - case HS_CONFIG_MODE_ERASE_WIFI: return("5. Erase WiFi Credentials"); - case HS_CONFIG_MODE_EXIT_SELECTED: return("Exiting Command Mode..."); - case HS_CONFIG_MODE_REBOOT_SELECTED: return("Rebooting Device..."); - case HS_CONFIG_MODE_LAUNCH_AP_SELECTED: return("Launching Access Point..."); - case HS_CONFIG_MODE_UNPAIR_SELECTED: return("Unpairing Device..."); - case HS_CONFIG_MODE_ERASE_WIFI_SELECTED: return("Erasing WiFi Credentials..."); - case HS_REBOOTING: return("REBOOTING!"); - case HS_FACTORY_RESET: return("Performing Factory Reset..."); - case HS_AP_STARTED: return("Access Point Started"); - case HS_AP_CONNECTED: return("Access Point Connected"); - case HS_AP_TERMINATED: return("Access Point Terminated"); - case HS_OTA_STARTED: return("OTA Update Started"); - default: return("Unknown"); - } -} -``` - -### Example: - -```C++ -#include "HomeSpan.h" - -void setup(){ - homeSpan.setStatusCallback(statusUpdate); // set callback function - ... - homeSpan.begin(); - ... -} - -// create a callback function that simply prints the pre-defined short messages on the Serial Monitor whenever the HomeSpan status changes - -void statusUpdate(HS_STATUS status){ - Serial.printf("\n*** HOMESPAN STATUS CHANGE: %s\n",homeSpan.statusString(status)); -} -``` - -You can of course create any alternative messsages, or take any actions desired, in *func* and do not need to use the pre-defined strings above. +# Stepper_TB6612.md --- -[↩️](Reference.md) Back to the Reference API page +[↩️](../Stepper.md) Back to the Stepper Motor Control page From 3985bed06d5b5fbf2ca143f1cb41f96694990a0d Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 10:59:53 -0500 Subject: [PATCH 107/151] Update Stepper_TB6612.md --- docs/StepperDrivers/Stepper_TB6612.md | 38 ++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/docs/StepperDrivers/Stepper_TB6612.md b/docs/StepperDrivers/Stepper_TB6612.md index 628d27a..9248094 100644 --- a/docs/StepperDrivers/Stepper_TB6612.md +++ b/docs/StepperDrivers/Stepper_TB6612.md @@ -1,5 +1,41 @@ -# Stepper_TB6612.md +# Stepper_TB6612 +This is a derived class of **StepperControl** designed to operate stepper motors driven by a [Toshiba TB6612](https://www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins. To use, add `#include "extras/Stepper_TB6612.h"` to the top of your sketch. + +The Toshiba TB6612 is a generic motor driver providing direct control of two full H-bridges. Wiring is as follows (using Toshiba's names for each pin): + +#### **Power Connections** + * *VCC* - connect to +3.3V on ESP32 + * *VM* - connect to external DC power supply that will drive stepper motor (5-13V) + * *GND* (and *PGND1/PGND2*) - connect to GND on the ESP32, and to ground of external DC power supply +#### **Motor Connections** + * *AO1, AO2* - connect to the "A" coil of the stepper motor + * *BO1, BO2* - connect to the "B" coil of the stepper motor +#### **Control Connections** + * *AIN1, AIN2* - connect to two digital pins on the ESP32 - will control direction and state of coil *A* + * *BIN1, BIN2* - connect to two digital pins on the ESP32 - will control direction and state of coil *B* + * *PWMA, PWMB* - if using PWM, connect to two digital pins on the ESP32; if not, connect to +3.3V on ESP32 to pull high + * *STBY* - connect to +3.3V on ESP32 to pull high + +The **Stepper_TB6612** class includes two constructors: + * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2 [,{uint32_t priority, uint32_t cpu}] )` + * controls the driver board using only 4 digital pins from the ESP32, where the parameters specify the pin numbers. Supports the following step type modes: + + * FULL_STEP_ONE_PHASE + * FULL_STEP_TWO_PHASE + * HALF_STEP + + * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB, [,{uint32_t priority, uint32_t cpu}])` + * controls the driver board using 4 digital pins and 2 PWM pins from the ESP32, where the parameters specify the pin numbers. Supports the following step type modes: + + * FULL_STEP_ONE_PHASE + * FULL_STEP_TWO_PHASE + * HALF_STEP + * QUARTER_STEP + * EIGHTH_STEP + +Both constructors support an *optional* final parameter consisting of a *brace-enclosed* pair of numbers. The first number in the braces specifies the *priority* of the background task used to control the stepper motor. The second number in the braces specifies the CPU (0 or 1) that **StepperControl** will use to run the background control task (this number is ignored for single-processor chips). The default (and recommended) value of this optional final parameter is {1,0}. + --- [↩️](../Stepper.md) Back to the Stepper Motor Control page From 78fc05f6018885874c8840ddcc1fec7396b4be6f Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 11:01:25 -0500 Subject: [PATCH 108/151] Update Stepper_A3967.md --- docs/StepperDrivers/Stepper_A3967.md | 116 +++++++++------------------ 1 file changed, 36 insertions(+), 80 deletions(-) diff --git a/docs/StepperDrivers/Stepper_A3967.md b/docs/StepperDrivers/Stepper_A3967.md index 7f528df..c98aaca 100644 --- a/docs/StepperDrivers/Stepper_A3967.md +++ b/docs/StepperDrivers/Stepper_A3967.md @@ -1,85 +1,41 @@ -# HomeSpan Status +# Stepper_A3967 -The optional ***homeSpan*** method, `void setStatusCallback(void (*func)(HS_STATUS status))`, can be used to create a callback function, *func*, that HomeSpan calls whenever its status changes. HomeSpan passes *func* a single argument, *status*, of type *HS_STATUS*, defined as follows: +This is a derived class of **StepperControl** designed to operate stepper motors driven by a [Toshiba TB6612](https://www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins. To use, add `#include "extras/Stepper_TB6612.h"` to the top of your sketch. -```C++ -enum HS_STATUS { - HS_WIFI_NEEDED, // WiFi Credentials have not yet been set/stored - HS_WIFI_CONNECTING, // HomeSpan is trying to connect to the network specified in the stored WiFi Credentials - HS_PAIRING_NEEDED, // HomeSpan is connected to central WiFi network, but device has not yet been paired to HomeKit - HS_PAIRED, // HomeSpan is connected to central WiFi network and ther device has been paired to HomeKit - HS_ENTERING_CONFIG_MODE, // User has requested the device to enter into Command Mode - HS_CONFIG_MODE_EXIT, // HomeSpan is in Command Mode with "Exit Command Mode" specified as choice - HS_CONFIG_MODE_REBOOT, // HomeSpan is in Command Mode with "Reboot" specified as choice - HS_CONFIG_MODE_LAUNCH_AP, // HomeSpan is in Command Mode with "Launch Access Point" specified as choice - HS_CONFIG_MODE_UNPAIR, // HomeSpan is in Command Mode with "Unpair Device" specified as choice - HS_CONFIG_MODE_ERASE_WIFI, // HomeSpan is in Command Mode with "Erase WiFi Credentials" specified as choice - HS_CONFIG_MODE_EXIT_SELECTED, // User has selected "Exit Command Mode" - HS_CONFIG_MODE_REBOOT_SELECTED, // User has select "Reboot" from the Command Mode - HS_CONFIG_MODE_LAUNCH_AP_SELECTED, // User has selected "Launch AP Access" from the Command Mode - HS_CONFIG_MODE_UNPAIR_SELECTED, // User has seleected "Unpair Device" from the Command Mode - HS_CONFIG_MODE_ERASE_WIFI_SELECTED, // User has selected "Erase WiFi Credentials" from the Command Mode - HS_REBOOTING, // HomeSpan is in the process of rebooting the device - HS_FACTORY_RESET, // HomeSpan is in the process of performing a Factory Reset of device - HS_AP_STARTED, // HomeSpan has started the Access Point but no one has yet connected - HS_AP_CONNECTED, // The Access Point is started and a user device has been connected - HS_AP_TERMINATED, // HomeSpan has terminated the Access Point - HS_OTA_STARTED // HomeSpan is in the process of recveived an Over-the-Air software update -}; -``` - -The ***homeSpan*** method `char* statusString(HS_STATUS s)`, is a convenience function for converting any of the above enumerations to short, pre-defined character string messages as follows: - -```C++ -const char* Span::statusString(HS_STATUS s){ - switch(s){ - case HS_WIFI_NEEDED: return("WiFi Credentials Needed"); - case HS_WIFI_CONNECTING: return("WiFi Connecting"); - case HS_PAIRING_NEEDED: return("Device not yet Paired"); - case HS_PAIRED: return("Device Paired"); - case HS_ENTERING_CONFIG_MODE: return("Entering Command Mode"); - case HS_CONFIG_MODE_EXIT: return("1. Exit Command Mode"); - case HS_CONFIG_MODE_REBOOT: return("2. Reboot Device"); - case HS_CONFIG_MODE_LAUNCH_AP: return("3. Launch Access Point"); - case HS_CONFIG_MODE_UNPAIR: return("4. Unpair Device"); - case HS_CONFIG_MODE_ERASE_WIFI: return("5. Erase WiFi Credentials"); - case HS_CONFIG_MODE_EXIT_SELECTED: return("Exiting Command Mode..."); - case HS_CONFIG_MODE_REBOOT_SELECTED: return("Rebooting Device..."); - case HS_CONFIG_MODE_LAUNCH_AP_SELECTED: return("Launching Access Point..."); - case HS_CONFIG_MODE_UNPAIR_SELECTED: return("Unpairing Device..."); - case HS_CONFIG_MODE_ERASE_WIFI_SELECTED: return("Erasing WiFi Credentials..."); - case HS_REBOOTING: return("REBOOTING!"); - case HS_FACTORY_RESET: return("Performing Factory Reset..."); - case HS_AP_STARTED: return("Access Point Started"); - case HS_AP_CONNECTED: return("Access Point Connected"); - case HS_AP_TERMINATED: return("Access Point Terminated"); - case HS_OTA_STARTED: return("OTA Update Started"); - default: return("Unknown"); - } -} -``` - -### Example: - -```C++ -#include "HomeSpan.h" - -void setup(){ - homeSpan.setStatusCallback(statusUpdate); // set callback function - ... - homeSpan.begin(); - ... -} - -// create a callback function that simply prints the pre-defined short messages on the Serial Monitor whenever the HomeSpan status changes - -void statusUpdate(HS_STATUS status){ - Serial.printf("\n*** HOMESPAN STATUS CHANGE: %s\n",homeSpan.statusString(status)); -} -``` - -You can of course create any alternative messsages, or take any actions desired, in *func* and do not need to use the pre-defined strings above. +The Toshiba TB6612 is a generic motor driver providing direct control of two full H-bridges. Wiring is as follows (using Toshiba's names for each pin): +#### **Power Connections** + * *VCC* - connect to +3.3V on ESP32 + * *VM* - connect to external DC power supply that will drive stepper motor (5-13V) + * *GND* (and *PGND1/PGND2*) - connect to GND on the ESP32, and to ground of external DC power supply +#### **Motor Connections** + * *AO1, AO2* - connect to the "A" coil of the stepper motor + * *BO1, BO2* - connect to the "B" coil of the stepper motor +#### **Control Connections** + * *AIN1, AIN2* - connect to two digital pins on the ESP32 - will control direction and state of coil *A* + * *BIN1, BIN2* - connect to two digital pins on the ESP32 - will control direction and state of coil *B* + * *PWMA, PWMB* - if using PWM, connect to two digital pins on the ESP32; if not, connect to +3.3V on ESP32 to pull high + * *STBY* - connect to +3.3V on ESP32 to pull high + +The **Stepper_A3967** class includes two constructors: + * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2 [,{uint32_t priority, uint32_t cpu}] )` + * controls the driver board using only 4 digital pins from the ESP32, where the parameters specify the pin numbers. Supports the following step type modes: + + * FULL_STEP_ONE_PHASE + * FULL_STEP_TWO_PHASE + * HALF_STEP + + * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB, [,{uint32_t priority, uint32_t cpu}])` + * controls the driver board using 4 digital pins and 2 PWM pins from the ESP32, where the parameters specify the pin numbers. Supports the following step type modes: + + * FULL_STEP_ONE_PHASE + * FULL_STEP_TWO_PHASE + * HALF_STEP + * QUARTER_STEP + * EIGHTH_STEP + +Both constructors support an *optional* final parameter consisting of a *brace-enclosed* pair of numbers. The first number in the braces specifies the *priority* of the background task used to control the stepper motor. The second number in the braces specifies the CPU (0 or 1) that **Stepper_A3967** will use to run the background control task (this number is ignored for single-processor chips). The default (and recommended) value of this optional final parameter is {1,0}. + --- -[↩️](Reference.md) Back to the Reference API page +[↩️](../Stepper.md) Back to the Stepper Motor Control page From cd2df62647fc9d870cc56a1904779d532af7f069 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 11:02:29 -0500 Subject: [PATCH 109/151] Update Stepper_A3967.md --- docs/StepperDrivers/Stepper_A3967.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/StepperDrivers/Stepper_A3967.md b/docs/StepperDrivers/Stepper_A3967.md index c98aaca..bd6ff27 100644 --- a/docs/StepperDrivers/Stepper_A3967.md +++ b/docs/StepperDrivers/Stepper_A3967.md @@ -1,5 +1,8 @@ # Stepper_A3967 +TO BE EDITED + + This is a derived class of **StepperControl** designed to operate stepper motors driven by a [Toshiba TB6612](https://www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins. To use, add `#include "extras/Stepper_TB6612.h"` to the top of your sketch. The Toshiba TB6612 is a generic motor driver providing direct control of two full H-bridges. Wiring is as follows (using Toshiba's names for each pin): From 0f0bc641c83daa51b7cefb530f80fc81728d8270 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 12:32:51 -0500 Subject: [PATCH 110/151] Update Stepper_TB6612.md --- docs/StepperDrivers/Stepper_TB6612.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/StepperDrivers/Stepper_TB6612.md b/docs/StepperDrivers/Stepper_TB6612.md index 9248094..e3f17b0 100644 --- a/docs/StepperDrivers/Stepper_TB6612.md +++ b/docs/StepperDrivers/Stepper_TB6612.md @@ -18,14 +18,14 @@ The Toshiba TB6612 is a generic motor driver providing direct control of two ful * *STBY* - connect to +3.3V on ESP32 to pull high The **Stepper_TB6612** class includes two constructors: - * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2 [,{uint32_t priority, uint32_t cpu}] )` + * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2)` * controls the driver board using only 4 digital pins from the ESP32, where the parameters specify the pin numbers. Supports the following step type modes: * FULL_STEP_ONE_PHASE * FULL_STEP_TWO_PHASE * HALF_STEP - * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB, [,{uint32_t priority, uint32_t cpu}])` + * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB)` * controls the driver board using 4 digital pins and 2 PWM pins from the ESP32, where the parameters specify the pin numbers. Supports the following step type modes: * FULL_STEP_ONE_PHASE @@ -33,9 +33,7 @@ The **Stepper_TB6612** class includes two constructors: * HALF_STEP * QUARTER_STEP * EIGHTH_STEP - -Both constructors support an *optional* final parameter consisting of a *brace-enclosed* pair of numbers. The first number in the braces specifies the *priority* of the background task used to control the stepper motor. The second number in the braces specifies the CPU (0 or 1) that **StepperControl** will use to run the background control task (this number is ignored for single-processor chips). The default (and recommended) value of this optional final parameter is {1,0}. - + --- [↩️](../Stepper.md) Back to the Stepper Motor Control page From 935104570c9babdf4a7a4cd6f5f1fc761d71af58 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 12:44:50 -0500 Subject: [PATCH 111/151] Update Stepper.md --- docs/Stepper.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 9421eb0..5b7df19 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -20,7 +20,7 @@ The HomeSpan class that contains all the methods to control a stepper motor is c * Contructor: `Stepper_A3967(int M1, int M2, int STEP, int DIR, int ENABLE)` * controls the driver board using 5 digital pins from the ESP32 * microstepping is built into the driver board (separate ESP32 PWM pins are not needed) - + Click on either of the driver-specific classes above for complete details on how to wire and configure a particular driver board. ## StepperControl Methods @@ -109,6 +109,12 @@ The **StepperControl** class provides the following methods to operate and contr * it is possible, though not recommended, to change the step type *mode* while the motor is turning * see [Stepper Motor Modes](StepperModes.md) for a brief primer on how stepper motors are typically driven +### CPU and Task Priority + +All **StepperControl** constructors support an *optional* final parameter consisting of a *brace-enclosed* pair of numbers (not shown above). The first number in the braces specifies the *priority* of the background task used to control the stepper motor. The second number in the braces specifies the CPU (0 or 1) that **StepperControl** will use to run the background control task (this number is ignored for single-processor chips). The default (and recommended) value of this optional final parameter is {1,0}. Example: + +* `new Stepper_TB6612(23,32,22,14,{0,1})` instantiates control of a stepper motor driven by a TB6612 chip, where ESP32 pins 23, 32, 22, and 14 are connected to the AIN1, AIN2, BIN1, and BIN2 pins on the TB6612, respectively; the priority of the background task is set to 0; and the task will be run on cpu 1 (applicable only for a dual-processor chip) + ## Example Sketches Below is a simple sketch demonstrating the above methods: From 82e6d9683c582ef348b294d402d91067193bffc8 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 16:23:42 -0500 Subject: [PATCH 112/151] Update Stepper_A3967.md --- docs/StepperDrivers/Stepper_A3967.md | 47 +++++++++++----------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/docs/StepperDrivers/Stepper_A3967.md b/docs/StepperDrivers/Stepper_A3967.md index bd6ff27..8c74fc0 100644 --- a/docs/StepperDrivers/Stepper_A3967.md +++ b/docs/StepperDrivers/Stepper_A3967.md @@ -1,44 +1,33 @@ # Stepper_A3967 -TO BE EDITED +This is a derived class of **StepperControl** designed to operate stepper motors driven by an [Allegro A3967](https://www.sparkfun.com/products/12779) chip. To use, add `#include "extras/Stepper_A3967.h"` to the top of your sketch. - -This is a derived class of **StepperControl** designed to operate stepper motors driven by a [Toshiba TB6612](https://www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins. To use, add `#include "extras/Stepper_TB6612.h"` to the top of your sketch. - -The Toshiba TB6612 is a generic motor driver providing direct control of two full H-bridges. Wiring is as follows (using Toshiba's names for each pin): +The Allegro A3967 is a specialized driver designed for stepper motors. It contains a built-in PWM generator and pre-programmed stepping modes. Wiring for the [EasyDriver Sparkfun](https://learn.sparkfun.com/tutorials/easy-driver-hook-up-guide?_ga=2.152816825.1841726212.1688220137-156607829.1686369274) board that uses this chip is as follows: #### **Power Connections** - * *VCC* - connect to +3.3V on ESP32 - * *VM* - connect to external DC power supply that will drive stepper motor (5-13V) - * *GND* (and *PGND1/PGND2*) - connect to GND on the ESP32, and to ground of external DC power supply + * *GND* - connect to GND on the ESP32, and to ground of external DC power supply + * *M+* - connect to external DC power supply that will drive stepper motor. An on-board regulator also uses this supply to provide VCC to the rest of the board. For use with an ESP32, you must short the 3.3V/5V jumper with a blob of solder to select 3.3V #### **Motor Connections** - * *AO1, AO2* - connect to the "A" coil of the stepper motor - * *BO1, BO2* - connect to the "B" coil of the stepper motor + * *Motor A* - connect to the "A" coil of the stepper motor + * *Motor B* - connect to the "B" coil of the stepper motor #### **Control Connections** - * *AIN1, AIN2* - connect to two digital pins on the ESP32 - will control direction and state of coil *A* - * *BIN1, BIN2* - connect to two digital pins on the ESP32 - will control direction and state of coil *B* - * *PWMA, PWMB* - if using PWM, connect to two digital pins on the ESP32; if not, connect to +3.3V on ESP32 to pull high - * *STBY* - connect to +3.3V on ESP32 to pull high + * *ENABLE* - connect to a digital pin on the ESP32 - used to enable/disable to motor driver + * *STEP, DIR* - connect to two digital pins on the ESP32 - used to step the motor and set the direction + * *MS1, MS2* - connect to two digital pins on the ESP32 - used set the step mode + * *SLEEP, RESET* - already pulled high on the EasyDriver board, so no connection neeed. If using a different driver board, ensure these pins are pulled high, else connect to VCC + * *PFD* - not used -The **Stepper_A3967** class includes two constructors: - * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2 [,{uint32_t priority, uint32_t cpu}] )` - * controls the driver board using only 4 digital pins from the ESP32, where the parameters specify the pin numbers. Supports the following step type modes: - - * FULL_STEP_ONE_PHASE - * FULL_STEP_TWO_PHASE - * HALF_STEP - - * `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB, [,{uint32_t priority, uint32_t cpu}])` - * controls the driver board using 4 digital pins and 2 PWM pins from the ESP32, where the parameters specify the pin numbers. Supports the following step type modes: - - * FULL_STEP_ONE_PHASE +The **Stepper_A3967** class includes the following constructor: + * `Stepper_A3967(int M1, int M2, int STEP, int DIR, int ENABLE)` + * controls the driver board using 5 digital pins from the ESP32, where the parameters specify the pin numbers. Supports the following step type modes: + * FULL_STEP_TWO_PHASE * HALF_STEP * QUARTER_STEP * EIGHTH_STEP - -Both constructors support an *optional* final parameter consisting of a *brace-enclosed* pair of numbers. The first number in the braces specifies the *priority* of the background task used to control the stepper motor. The second number in the braces specifies the CPU (0 or 1) that **Stepper_A3967** will use to run the background control task (this number is ignored for single-processor chips). The default (and recommended) value of this optional final parameter is {1,0}. - + +❗Note: The A3967 chip does not support a short brake state. Calls to the `brake()` method, as well as setting the *endAction* parameter in the `move()` and `moveTo()` methods to **StepperControl::BRAKE** have no effect on the motor driver. + --- [↩️](../Stepper.md) Back to the Stepper Motor Control page From 26099951340f5c621d041127eb47921c0302c291 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 16:24:35 -0500 Subject: [PATCH 113/151] Update Stepper_TB6612.md --- docs/StepperDrivers/Stepper_TB6612.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/StepperDrivers/Stepper_TB6612.md b/docs/StepperDrivers/Stepper_TB6612.md index e3f17b0..6257170 100644 --- a/docs/StepperDrivers/Stepper_TB6612.md +++ b/docs/StepperDrivers/Stepper_TB6612.md @@ -12,8 +12,8 @@ The Toshiba TB6612 is a generic motor driver providing direct control of two ful * *AO1, AO2* - connect to the "A" coil of the stepper motor * *BO1, BO2* - connect to the "B" coil of the stepper motor #### **Control Connections** - * *AIN1, AIN2* - connect to two digital pins on the ESP32 - will control direction and state of coil *A* - * *BIN1, BIN2* - connect to two digital pins on the ESP32 - will control direction and state of coil *B* + * *AIN1, AIN2* - connect to two digital pins on the ESP32 - used to control direction and state of coil *A* + * *BIN1, BIN2* - connect to two digital pins on the ESP32 - used to control direction and state of coil *B* * *PWMA, PWMB* - if using PWM, connect to two digital pins on the ESP32; if not, connect to +3.3V on ESP32 to pull high * *STBY* - connect to +3.3V on ESP32 to pull high From f51649fa56afc4fdafe08e96a91a0422cee445f8 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 16:25:18 -0500 Subject: [PATCH 114/151] Update Stepper_A3967.md --- docs/StepperDrivers/Stepper_A3967.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/StepperDrivers/Stepper_A3967.md b/docs/StepperDrivers/Stepper_A3967.md index 8c74fc0..ad42f1e 100644 --- a/docs/StepperDrivers/Stepper_A3967.md +++ b/docs/StepperDrivers/Stepper_A3967.md @@ -13,7 +13,7 @@ The Allegro A3967 is a specialized driver designed for stepper motors. It contai #### **Control Connections** * *ENABLE* - connect to a digital pin on the ESP32 - used to enable/disable to motor driver * *STEP, DIR* - connect to two digital pins on the ESP32 - used to step the motor and set the direction - * *MS1, MS2* - connect to two digital pins on the ESP32 - used set the step mode + * *MS1, MS2* - connect to two digital pins on the ESP32 - used to set the step type mode * *SLEEP, RESET* - already pulled high on the EasyDriver board, so no connection neeed. If using a different driver board, ensure these pins are pulled high, else connect to VCC * *PFD* - not used From 12d59636b1e9d26c3e7840507f44a91e12cd41ef Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 16:28:00 -0500 Subject: [PATCH 115/151] Update Stepper_TB6612.md --- docs/StepperDrivers/Stepper_TB6612.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/StepperDrivers/Stepper_TB6612.md b/docs/StepperDrivers/Stepper_TB6612.md index 6257170..5bccca4 100644 --- a/docs/StepperDrivers/Stepper_TB6612.md +++ b/docs/StepperDrivers/Stepper_TB6612.md @@ -2,7 +2,7 @@ This is a derived class of **StepperControl** designed to operate stepper motors driven by a [Toshiba TB6612](https://www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins. To use, add `#include "extras/Stepper_TB6612.h"` to the top of your sketch. -The Toshiba TB6612 is a generic motor driver providing direct control of two full H-bridges. Wiring is as follows (using Toshiba's names for each pin): +The Toshiba TB6612 is a generic motor driver providing direct control of two full H-bridges. Wiring for the [Adafruit Motor Driver board](https://learn.adafruit.com/adafruit-tb6612-h-bridge-dc-stepper-motor-driver-breakout) that uses this chip is as follows: #### **Power Connections** * *VCC* - connect to +3.3V on ESP32 From 427b2157d4d7adab4c5b16dba052b61053e87abf Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 16:31:56 -0500 Subject: [PATCH 116/151] Update Stepper_TB6612.md --- docs/StepperDrivers/Stepper_TB6612.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/StepperDrivers/Stepper_TB6612.md b/docs/StepperDrivers/Stepper_TB6612.md index 5bccca4..a9e5bc9 100644 --- a/docs/StepperDrivers/Stepper_TB6612.md +++ b/docs/StepperDrivers/Stepper_TB6612.md @@ -2,15 +2,15 @@ This is a derived class of **StepperControl** designed to operate stepper motors driven by a [Toshiba TB6612](https://www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins. To use, add `#include "extras/Stepper_TB6612.h"` to the top of your sketch. -The Toshiba TB6612 is a generic motor driver providing direct control of two full H-bridges. Wiring for the [Adafruit Motor Driver board](https://learn.adafruit.com/adafruit-tb6612-h-bridge-dc-stepper-motor-driver-breakout) that uses this chip is as follows: +The Toshiba TB6612 is a generic motor driver providing direct control of two full H-bridges. Wiring for the [Adafruit Motor Driver](https://learn.adafruit.com/adafruit-tb6612-h-bridge-dc-stepper-motor-driver-breakout) board that uses this chip is as follows: #### **Power Connections** * *VCC* - connect to +3.3V on ESP32 - * *VM* - connect to external DC power supply that will drive stepper motor (5-13V) - * *GND* (and *PGND1/PGND2*) - connect to GND on the ESP32, and to ground of external DC power supply + * *VM+* - connect to external DC power supply that will drive stepper motor (5-13V) + * *GND* - connect to GND on the ESP32, and to ground of external DC power supply #### **Motor Connections** - * *AO1, AO2* - connect to the "A" coil of the stepper motor - * *BO1, BO2* - connect to the "B" coil of the stepper motor + * *MOTORA* - connect to the "A" coil of the stepper motor + * *MOTORB* - connect to the "B" coil of the stepper motor #### **Control Connections** * *AIN1, AIN2* - connect to two digital pins on the ESP32 - used to control direction and state of coil *A* * *BIN1, BIN2* - connect to two digital pins on the ESP32 - used to control direction and state of coil *B* From fac400c3d5c1f047b315989df3f127d4d7297b50 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 16:32:46 -0500 Subject: [PATCH 117/151] Update Stepper_TB6612.md --- docs/StepperDrivers/Stepper_TB6612.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/StepperDrivers/Stepper_TB6612.md b/docs/StepperDrivers/Stepper_TB6612.md index a9e5bc9..a8d24e1 100644 --- a/docs/StepperDrivers/Stepper_TB6612.md +++ b/docs/StepperDrivers/Stepper_TB6612.md @@ -1,6 +1,6 @@ # Stepper_TB6612 -This is a derived class of **StepperControl** designed to operate stepper motors driven by a [Toshiba TB6612](https://www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins. To use, add `#include "extras/Stepper_TB6612.h"` to the top of your sketch. +This is a derived class of **StepperControl** designed to operate stepper motors driven by a [Toshiba TB6612]([https://www.adafruit.com/product/2448](https://cdn-shop.adafruit.com/datasheets/TB6612FNG_datasheet_en_20121101.pdf)) chip, either with or without the use of ESP32 PWM pins. To use, add `#include "extras/Stepper_TB6612.h"` to the top of your sketch. The Toshiba TB6612 is a generic motor driver providing direct control of two full H-bridges. Wiring for the [Adafruit Motor Driver](https://learn.adafruit.com/adafruit-tb6612-h-bridge-dc-stepper-motor-driver-breakout) board that uses this chip is as follows: From 8a4be7668ea9ab84d8b96ebb20ac3d94d3a2e9bb Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 16:33:19 -0500 Subject: [PATCH 118/151] Update Stepper_TB6612.md --- docs/StepperDrivers/Stepper_TB6612.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/StepperDrivers/Stepper_TB6612.md b/docs/StepperDrivers/Stepper_TB6612.md index a8d24e1..14fc51a 100644 --- a/docs/StepperDrivers/Stepper_TB6612.md +++ b/docs/StepperDrivers/Stepper_TB6612.md @@ -1,6 +1,6 @@ # Stepper_TB6612 -This is a derived class of **StepperControl** designed to operate stepper motors driven by a [Toshiba TB6612]([https://www.adafruit.com/product/2448](https://cdn-shop.adafruit.com/datasheets/TB6612FNG_datasheet_en_20121101.pdf)) chip, either with or without the use of ESP32 PWM pins. To use, add `#include "extras/Stepper_TB6612.h"` to the top of your sketch. +This is a derived class of **StepperControl** designed to operate stepper motors driven by a [Toshiba TB6612](https://cdn-shop.adafruit.com/datasheets/TB6612FNG_datasheet_en_20121101.pdf) chip, either with or without the use of ESP32 PWM pins. To use, add `#include "extras/Stepper_TB6612.h"` to the top of your sketch. The Toshiba TB6612 is a generic motor driver providing direct control of two full H-bridges. Wiring for the [Adafruit Motor Driver](https://learn.adafruit.com/adafruit-tb6612-h-bridge-dc-stepper-motor-driver-breakout) board that uses this chip is as follows: From ad977a5029ab308c4f27b1ec1357726e70da32b6 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 16:40:22 -0500 Subject: [PATCH 119/151] Update Stepper.md --- docs/Stepper.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 5b7df19..c24ff6b 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -5,7 +5,8 @@ HomeSpan includes dedicated classes that provide for easy control of a stepper m The HomeSpan class that contains all the methods to control a stepper motor is called **StepperControl**. However, this is a virtual class and cannot be instantiated directly. Instead you instantiate stepper motor objects using driver-specific child-classes (derived from **StepperControl**) that contain all the logic to configure and operate a particular driver board. Each child class supports one or more constructors allowing you to specify which output pins on your ESP32 device will be connected to the required pins on your driver board: * **[Stepper_TB6612](StepperDrivers/Stepper_TB6612.md)** - * This class is used to operate stepper motors driven by a [Toshiba TB6612](https://www.adafruit.com/product/2448) chip, either with or without the use of ESP32 PWM pins + * This class is used to operate stepper motors driven by a [Toshiba TB6612](https://cdn-shop.adafruit.com/datasheets/TB6612FNG_datasheet_en_20121101.pdf) chip, either with or without the use of ESP32 PWM pins + * See, for example, the [Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board](https://www.adafruit.com/product/2448) * To use, add the following to the top of your sketch: `#include "extras/Stepper_TB6612.h"` * Constructor 1: `Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2)` * controls the driver board using only 4 digital pins from the ESP32 From cd17268ca12495bf556e7a05744c96457b07f1ec Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 16:43:02 -0500 Subject: [PATCH 120/151] Update Stepper.md --- docs/Stepper.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index c24ff6b..2c38930 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -16,7 +16,8 @@ The HomeSpan class that contains all the methods to control a stepper motor is c * the addition of the PWM pins provides the ability to microstep the motor * **[Stepper_A3967](StepperDrivers/Stepper_A3967.md)** - * This class is used to operate stepper motors driven by an [Allegro A3967](https://www.sparkfun.com/products/12779) chip + * This class is used to operate stepper motors driven by an [Allegro A3967](https://cdn.sparkfun.com/datasheets/Robotics/A3967-Datasheet.pdf) chip + * See, for example, the [Sparkfun EasyDriver Stepper Motor Board](https://www.sparkfun.com/products/12779) * To use, add the following to the top of your sketch: `#include "extras/Stepper_A3967.h"` * Contructor: `Stepper_A3967(int M1, int M2, int STEP, int DIR, int ENABLE)` * controls the driver board using 5 digital pins from the ESP32 From 145bd1193e1299bfeae1e2df0b73b8471861efbe Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 16:44:26 -0500 Subject: [PATCH 121/151] Update Stepper_A3967.md --- docs/StepperDrivers/Stepper_A3967.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/StepperDrivers/Stepper_A3967.md b/docs/StepperDrivers/Stepper_A3967.md index ad42f1e..862e15c 100644 --- a/docs/StepperDrivers/Stepper_A3967.md +++ b/docs/StepperDrivers/Stepper_A3967.md @@ -2,7 +2,7 @@ This is a derived class of **StepperControl** designed to operate stepper motors driven by an [Allegro A3967](https://www.sparkfun.com/products/12779) chip. To use, add `#include "extras/Stepper_A3967.h"` to the top of your sketch. -The Allegro A3967 is a specialized driver designed for stepper motors. It contains a built-in PWM generator and pre-programmed stepping modes. Wiring for the [EasyDriver Sparkfun](https://learn.sparkfun.com/tutorials/easy-driver-hook-up-guide?_ga=2.152816825.1841726212.1688220137-156607829.1686369274) board that uses this chip is as follows: +The Allegro A3967 is a specialized driver designed for stepper motors. It contains a built-in PWM generator and pre-programmed stepping modes. Wiring for the [Sparkfun EasyDriver Stepper Motor Board](https://learn.sparkfun.com/tutorials/easy-driver-hook-up-guide?_ga=2.152816825.1841726212.1688220137-156607829.1686369274) that uses this chip is as follows: #### **Power Connections** * *GND* - connect to GND on the ESP32, and to ground of external DC power supply From a52b4ad050cbaaed881600a4e539d55a12711477 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 16:46:07 -0500 Subject: [PATCH 122/151] Update Stepper_TB6612.md --- docs/StepperDrivers/Stepper_TB6612.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/StepperDrivers/Stepper_TB6612.md b/docs/StepperDrivers/Stepper_TB6612.md index 14fc51a..960679e 100644 --- a/docs/StepperDrivers/Stepper_TB6612.md +++ b/docs/StepperDrivers/Stepper_TB6612.md @@ -2,7 +2,7 @@ This is a derived class of **StepperControl** designed to operate stepper motors driven by a [Toshiba TB6612](https://cdn-shop.adafruit.com/datasheets/TB6612FNG_datasheet_en_20121101.pdf) chip, either with or without the use of ESP32 PWM pins. To use, add `#include "extras/Stepper_TB6612.h"` to the top of your sketch. -The Toshiba TB6612 is a generic motor driver providing direct control of two full H-bridges. Wiring for the [Adafruit Motor Driver](https://learn.adafruit.com/adafruit-tb6612-h-bridge-dc-stepper-motor-driver-breakout) board that uses this chip is as follows: +The Toshiba TB6612 is a generic motor driver providing direct control of two full H-bridges. Wiring for the [Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board](https://learn.adafruit.com/adafruit-tb6612-h-bridge-dc-stepper-motor-driver-breakout) that uses this chip is as follows: #### **Power Connections** * *VCC* - connect to +3.3V on ESP32 From 314af57b28731edb9e651e74acc03fd3f5f2b2c2 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 17:12:24 -0500 Subject: [PATCH 123/151] Update Stepper.md --- docs/Stepper.md | 93 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/docs/Stepper.md b/docs/Stepper.md index 2c38930..3f356f4 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -170,6 +170,99 @@ void loop(){ A fully worked example showing how to use the *StepperControl* class within a complete HomeSpan sketch to control a Motorize Window Shade can be found in the Arduino IDE under [*File → Examples → HomeSpan → Other Examples → StepperMotorControl*](../examples/Other%20Examples/StepperMotorControl). +## Creating your own **StepperControl** Driver + +If neither of the above motor driver classes works for your specific chip or driver board, it is relatively straightfoward to create a new driver to use in your sketch. This is because all the logic to operate a stepper motor in the background is already embedded in the parent **StepperControl** class. To create your own driver, start by creating a child class derived from **StepperControl**. Next, add a constructor that defines the pins and performs any initializations if needed. Finally, define the following methods that **StepperControl** calls to operate the motor: + +* `void onStep(boolean direction)` - contains the logic to advance the motor by a single step based on the *direction* parameter +* `void onEnable()` - contains the logic that enables the motor driver +* `void onDisable()` - contains the logic that disables the motor driver +* `void onBrake()` - contains the logic that puts the motor into a short brake state +* `void setStepType(int mode)` - contains the logic to set the step type mode based on the *mode* parameter + +Only the first method, `onStep()`, is required to be defined. You can leave any of the other methods undefined if they are not applicable for your specific driver board. You can of course create additional methods to reflect any other features your driver board may support. + +As an example, below is the complete code for the **Stepper_A3967** class: + +```C++ +#include "StepperControl.h" + +////////////////////////// + +struct Stepper_A3967 : StepperControl { + + int m1Pin; + int m2Pin; + int stepPin; + int dirPin; + int enablePin; + +////////////////////////// + + Stepper_A3967(int m1Pin, int m2Pin, int stepPin, int dirPin, int enablePin, std::pair taskParams = {1,0}) : StepperControl(taskParams.first,taskParams.second){ + this->m1Pin=m1Pin; + this->m2Pin=m2Pin; + this->stepPin=stepPin; + this->dirPin=dirPin; + this->enablePin=enablePin; + + pinMode(m1Pin,OUTPUT); + pinMode(m2Pin,OUTPUT); + pinMode(stepPin,OUTPUT); + pinMode(dirPin,OUTPUT); + pinMode(enablePin,OUTPUT); + + setStepType(FULL_STEP_TWO_PHASE); + } + +////////////////////////// + + void onStep(boolean direction){ + digitalWrite(dirPin,direction); + digitalWrite(stepPin,HIGH); + digitalWrite(stepPin,LOW); + } + +////////////////////////// + + void onEnable() override { + digitalWrite(enablePin,0); + } + +////////////////////////// + + void onDisable() override { + digitalWrite(enablePin,1); + } + +////////////////////////// + + void setStepType(int mode) override { + switch(mode){ + case FULL_STEP_TWO_PHASE: + digitalWrite(m1Pin,LOW); + digitalWrite(m2Pin,LOW); + break; + case HALF_STEP: + digitalWrite(m1Pin,HIGH); + digitalWrite(m2Pin,LOW); + break; + case QUARTER_STEP: + digitalWrite(m1Pin,LOW); + digitalWrite(m2Pin,HIGH); + break; + case EIGHTH_STEP: + digitalWrite(m1Pin,HIGH); + digitalWrite(m2Pin,HIGH); + break; + default: + ESP_LOGE(STEPPER_TAG,"Unknown StepType=%d",mode); + } + } + +}; +``` + --- [↩️](../README.md) Back to the Welcome page From 7f512984b36fe8a6b104230128ae73e7fc1720a3 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 17:15:07 -0500 Subject: [PATCH 124/151] Update Stepper_A3967.md --- docs/StepperDrivers/Stepper_A3967.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/StepperDrivers/Stepper_A3967.md b/docs/StepperDrivers/Stepper_A3967.md index 862e15c..7d0ef6a 100644 --- a/docs/StepperDrivers/Stepper_A3967.md +++ b/docs/StepperDrivers/Stepper_A3967.md @@ -1,6 +1,6 @@ # Stepper_A3967 -This is a derived class of **StepperControl** designed to operate stepper motors driven by an [Allegro A3967](https://www.sparkfun.com/products/12779) chip. To use, add `#include "extras/Stepper_A3967.h"` to the top of your sketch. +This is a derived class of **StepperControl** designed to operate stepper motors driven by an [Allegro A3967](https://cdn.sparkfun.com/datasheets/Robotics/A3967-Datasheet.pdf) chip. To use, add `#include "extras/Stepper_A3967.h"` to the top of your sketch. The Allegro A3967 is a specialized driver designed for stepper motors. It contains a built-in PWM generator and pre-programmed stepping modes. Wiring for the [Sparkfun EasyDriver Stepper Motor Board](https://learn.sparkfun.com/tutorials/easy-driver-hook-up-guide?_ga=2.152816825.1841726212.1688220137-156607829.1686369274) that uses this chip is as follows: From fdfc4749d31e05d2b170f9e035e5fc2df0c1369a Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 1 Jul 2023 17:39:55 -0500 Subject: [PATCH 125/151] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index f416c69..a22d689 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,11 @@ HomeSpan requires version 2.0.0 or later of the [Arduino-ESP32 Board Manager](ht * the process for retrieving the time and date from an NTP server upon booting now runs in the background as a separate task * HomeSpan is no longer blocked from running during the NTP query + +* **Adds new methods to disable HomeSpan's use of the USB Serial port** + + * new Log Level, -1, causes HomeSpan to suppress all OUTPUT messages + * new homeSpan method, `setSerialInputDisable(boolean val)` disables/re-enables HomeSpan's reading of CLI commands INPUT into the Arduino Serial Monitor See [Releases](https://github.com/HomeSpan/HomeSpan/releases) for details on all changes and bug fixes included in this update. From 195095c8915e675bb3e1c1e32f2c67dcea219584 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 2 Jul 2023 11:13:55 -0500 Subject: [PATCH 126/151] Changed setAccel() and setStepType() to return StepperControl* Allows for daisy-chaining of configuration parameters. Also added initialization of upLinkData in motorTask to prevent time-outs if setMove() is never called (by initializing msDelay=10) --- src/src/extras/StepperControl.cpp | 11 ++++---- src/src/extras/StepperControl.h | 4 +-- src/src/extras/Stepper_A3967.h | 3 +- src/src/extras/Stepper_TB6612.h | 7 +++-- src/src/extras/extras.ino | 47 +++++++++++++++---------------- 5 files changed, 37 insertions(+), 35 deletions(-) diff --git a/src/src/extras/StepperControl.cpp b/src/src/extras/StepperControl.cpp index 5887d7e..9c961c5 100644 --- a/src/src/extras/StepperControl.cpp +++ b/src/src/extras/StepperControl.cpp @@ -39,19 +39,20 @@ StepperControl::StepperControl(uint32_t priority, uint32_t cpu){ ////////////////////////// -void StepperControl::setAccel(float accelSize, float accelSteps){ +StepperControl *StepperControl::setAccel(float accelSize, float accelSteps){ if(accelSize<0.0){ ESP_LOGE(STEPPER_TAG,"accelSize cannot be less than 0.0"); - return; + return(this); } if(accelSteps<1.0){ ESP_LOGE(STEPPER_TAG,"accelSteps cannot be less than 1.0"); - return; + return(this); } this->accelSize=accelSize; this->accelSteps=accelSteps; + return(this); } ////////////////////////// @@ -62,7 +63,7 @@ void StepperControl::move(int nSteps, uint32_t msDelay, endAction_t endAction){ return; } - upLink_t upLinkData = { .nSteps=nSteps, .msDelay=msDelay, .action=MOVE, endAction=endAction }; + upLink_t upLinkData = { .nSteps=nSteps, .msDelay=msDelay, .action=MOVE, .endAction=endAction }; xQueueOverwrite(upLinkQueue,&upLinkData); waitForAck(); } @@ -138,7 +139,7 @@ void StepperControl::enable(){ void StepperControl::motorTask(void *args){ StepperControl *motor = (StepperControl *)args; - upLink_t upLinkData; + upLink_t upLinkData = { .nSteps=0, .msDelay=10, .action=MOVE, .endAction=NONE }; downLink_t downLinkData; boolean running=false; diff --git a/src/src/extras/StepperControl.h b/src/src/extras/StepperControl.h index e876bd8..d25c608 100644 --- a/src/src/extras/StepperControl.h +++ b/src/src/extras/StepperControl.h @@ -90,8 +90,8 @@ class StepperControl { public: StepperControl(uint32_t priority=1, uint32_t cpu=0); - virtual void setStepType(int mode){}; - void setAccel(float accelSize, float accelSteps); + virtual StepperControl *setStepType(int mode){return(this);}; + StepperControl *setAccel(float accelSize, float accelSteps); void move(int nSteps, uint32_t msDelay, endAction_t endAction=NONE); void moveTo(int nPosition, uint32_t msDelay, endAction_t endAction=NONE); int position(); diff --git a/src/src/extras/Stepper_A3967.h b/src/src/extras/Stepper_A3967.h index 1dca3f6..5820881 100644 --- a/src/src/extras/Stepper_A3967.h +++ b/src/src/extras/Stepper_A3967.h @@ -91,7 +91,7 @@ struct Stepper_A3967 : StepperControl { ////////////////////////// - void setStepType(int mode) override { + StepperControl *setStepType(int mode) override { switch(mode){ case FULL_STEP_TWO_PHASE: digitalWrite(m1Pin,LOW); @@ -112,6 +112,7 @@ struct Stepper_A3967 : StepperControl { default: ESP_LOGE(STEPPER_TAG,"Unknown StepType=%d",mode); } + return(this); } }; diff --git a/src/src/extras/Stepper_TB6612.h b/src/src/extras/Stepper_TB6612.h index 2f243d1..fe495c1 100644 --- a/src/src/extras/Stepper_TB6612.h +++ b/src/src/extras/Stepper_TB6612.h @@ -135,7 +135,7 @@ struct Stepper_TB6612 : StepperControl { ////////////////////////// - void setStepType(int mode) override { + StepperControl *setStepType(int mode) override { switch(mode){ case FULL_STEP_ONE_PHASE: @@ -156,7 +156,7 @@ struct Stepper_TB6612 : StepperControl { case QUARTER_STEP: if(!pwmA){ ESP_LOGE(STEPPER_TAG,"QUARTER_STEP requires PWM pins"); - return; + return(this); } phase=0; nPhases=16; @@ -165,7 +165,7 @@ struct Stepper_TB6612 : StepperControl { case EIGHTH_STEP: if(!pwmA){ ESP_LOGE(STEPPER_TAG,"EIGHTH_STEP requires PWM pins"); - return; + return(this); } phase=0; nPhases=32; @@ -174,6 +174,7 @@ struct Stepper_TB6612 : StepperControl { default: ESP_LOGE(STEPPER_TAG,"Unknown StepType=%d",mode); } + return(this); } }; diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index da92fc2..2b58d4e 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -29,8 +29,13 @@ // as well as compile and test from this point. This file is ignored when the library is included in other sketches. #include "Stepper_TB6612.h" // include the driver for a TB6612 chip +#include "Stepper_A3967.h" -StepperControl *motor; // create a global pointer to StepperControl so it can be accessed in both setup() and loop() +StepperControl *bigMotor; +StepperControl *smallMotor; + +#define BIG_MOTOR_POSITION 1600 +#define SMALL_MOTOR_POSITION 2064 /////////////////// @@ -40,33 +45,27 @@ void setup() { delay(1000); Serial.printf("\nHomeSpan Stepper Control\n\n"); - motor=new Stepper_TB6612(23,32,22,14,33,27); // instantiate the motor object (with PWM pins 33 and 27 specified) + bigMotor=(new Stepper_TB6612(23,32,22,14,33,27))->setStepType(StepperControl::HALF_STEP)->setAccel(10,20);; + smallMotor=new Stepper_A3967(17,16,19,18,21); - motor->setStepType(StepperControl::HALF_STEP); // set the mode to half-step, which means 400 steps are needed for a complete revolution for a 200-step motor - motor->setAccel(10,20); // add acceleration parameters of 10x spread of 20 steps - - Serial.printf("Moving motor 400 steps and waiting until motor stops...\n"); - - motor->move(-400,5); // move the motor -400 steps (1 revolution), with 2ms between steps. - while(motor->stepsRemaining()); // wait until there no remaining steps - - Serial.printf("Moving motor to absolute position of +1200 (reversing a total of 1600 steps, or 4 revolutions) without waiting...\n"); - - motor->moveTo(1200,2,StepperControl::BRAKE); // move the motor to an absolute position of 1200 steps with 3ms between steps; enter brake state when done - - // Motor will continue moving in background even once setup() exits and loop() below starts +// bigMotor->setStepType(StepperControl::HALF_STEP); +// bigMotor->setAccel(10,20); } /////////////////// void loop(){ - - Serial.printf("Motor has %d remaining steps\n",motor->stepsRemaining()); - - delay(1000); // motor is unaffected by delay() - - if(motor->position()==1200){ - Serial.printf("Motor has reached final position and is now stopped.\n"); - while(1); - } + + if(smallMotor->position()==0) + smallMotor->moveTo(SMALL_MOTOR_POSITION,2); + else if(smallMotor->position()==SMALL_MOTOR_POSITION) + smallMotor->moveTo(0,2); + + if(bigMotor->position()==0) + bigMotor->moveTo(BIG_MOTOR_POSITION,4); + else if(bigMotor->position()==BIG_MOTOR_POSITION) + bigMotor->moveTo(0,4); + + delay(1000); + Serial.printf("Small Motor: %d Big Motor %d\n",smallMotor->stepsRemaining(),bigMotor->stepsRemaining()); } From afd06b12a272b89db4d2c95921dca1beb2cc4bcc Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sun, 2 Jul 2023 11:27:57 -0500 Subject: [PATCH 127/151] Update Stepper.md --- docs/Stepper.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 3f356f4..7091c18 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -84,7 +84,7 @@ The **StepperControl** class provides the following methods to operate and contr * calls to `stepsRemaining()` after calling `moveTo()` work as expected - the value returned will be the number of steps remaining until the motor reaches the *nPosition* specified * note that `moveTo(nPosition)` is mathematically the same as `move(nPosition-position())`, but the `moveTo()` method is more accurate since it computes the position of the motor directly inside the task that is actually controlling the motor -* `void setAccel(float accelSize, float accelSteps)` +* `StepperControl *setAccel(float accelSize, float accelSteps)` * adds an additional set of delays between steps so that the motor gradually accelerates when it starts and decelerates when it stops * *accelSize* - the maximum size of the additional delay, expressed as a factor to be multiplied by the *msDelay* parameter used in `move()` and `moveTo()`. Must be a value greater or equal to 0. The larger the value, the greater the magnitude of the acceleration and deceleration. A value of zero yields no acceleration/deceleration @@ -93,10 +93,14 @@ The **StepperControl** class provides the following methods to operate and contr * the total delay between steps (when *stepsRemaining* is not zero) is given by the following formula: $$totalDelay = msDelay \times (1 + accelSize \times (e^{\frac{-\mid nSteps-stepsRemaining \mid}{accelSteps}} + e^{\frac{-(\mid stepsRemaining \mid - 1)}{accelSteps}}))$$ + + * example: `myMotor.setAccel(10,20); myMotor.move(200,5);` + * yields a 55ms delay after the first step, a 52ms delay after the second step, a 50ms delay after the third step, and so forth, until at step 82 the additional delay has fully decayed such that the delay between steps remains fixed at the 5ms *msDelay* parameter specified. Then, starting at step 118 (with 82 steps remaining) the delay increases to 6ms; at step 134 it further increases to 7ms, and so forth, until the delay reaches its maxmimum of 55ms once again at step 199 just before the motor stops turning at step 200 - * example: `myMotor.setAccel(10,20); myMotor.move(200,5);` yields a 55ms delay after the first step, a 52ms delay after the second step, a 50ms delay after the third step, and so forth, until at step 82 the additional delay has fully decayed such that the delay between steps remains fixed at the 5ms *msDelay* parameter specified. Then, starting at step 118 (with 82 steps remaining) the delay increases to 6ms; at step 134 it further increases to 7ms, and so forth, until the delay reaches its maxmimum of 55ms once again at step 199 just before the motor stops turning at step 200 + * returns pointer to itself so methods can be daisy-chained + * example: `myMotor=(new Stepper_TB6612(23,32,22,14,33,27))->setAccel(10,20);` -* `void setStepType(int mode)` +* `StepperControl *setStepType(int mode)` * sets the step type of the motor to one of the following *mode* enumerations: * **StepperControl::FULL_STEP_ONE_PHASE** (0) @@ -105,9 +109,11 @@ The **StepperControl** class provides the following methods to operate and contr * **StepperControl::QUARTER_STEP** (4) * **StepperControl::EIGHTH_STEP** (8) * *mode* can be specified using either the name of the enumeration or its integer equivalent + * returns pointer to itself so methods can be daisy-chained + * example: `myMotor=(new Stepper_TB6612(23,32,22,14,33,27))->setStepType(StepperControl::HALF_STEP);` * smaller step types provide for smoother operation of the motor, but require more steps to turn a complete revolution - * not all *modes* are supported by all driver chips - * the quarter- and eighth-step modes require microstepping PWM functionality (either via ESP32 pins, or onboard the driver chip) + * not all *modes* are supported by all driver chips + * the quarter- and eighth-step modes require microstepping PWM functionality * it is possible, though not recommended, to change the step type *mode* while the motor is turning * see [Stepper Motor Modes](StepperModes.md) for a brief primer on how stepper motors are typically driven From d3912b6ec928bf12c90ae0ea0c4b85e088474f6b Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sun, 2 Jul 2023 11:33:38 -0500 Subject: [PATCH 128/151] Update Stepper.md --- docs/Stepper.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 7091c18..fcbe6a7 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -184,7 +184,7 @@ If neither of the above motor driver classes works for your specific chip or dri * `void onEnable()` - contains the logic that enables the motor driver * `void onDisable()` - contains the logic that disables the motor driver * `void onBrake()` - contains the logic that puts the motor into a short brake state -* `void setStepType(int mode)` - contains the logic to set the step type mode based on the *mode* parameter +* `StepperControl *setStepType(int mode)` - contains the logic to set the step type mode based on the *mode* parameter Only the first method, `onStep()`, is required to be defined. You can leave any of the other methods undefined if they are not applicable for your specific driver board. You can of course create additional methods to reflect any other features your driver board may support. @@ -223,7 +223,7 @@ struct Stepper_A3967 : StepperControl { ////////////////////////// - void onStep(boolean direction){ + void onStep(boolean direction) override { digitalWrite(dirPin,direction); digitalWrite(stepPin,HIGH); digitalWrite(stepPin,LOW); @@ -243,7 +243,7 @@ struct Stepper_A3967 : StepperControl { ////////////////////////// - void setStepType(int mode) override { + StepperControl *setStepType(int mode) override { switch(mode){ case FULL_STEP_TWO_PHASE: digitalWrite(m1Pin,LOW); @@ -264,6 +264,7 @@ struct Stepper_A3967 : StepperControl { default: ESP_LOGE(STEPPER_TAG,"Unknown StepType=%d",mode); } + return(this); } }; From 9a42f0885c6e7006f4c91d123a8164e925fd6e8e Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 2 Jul 2023 11:39:31 -0500 Subject: [PATCH 129/151] Added [override] to onStep --- src/src/extras/Stepper_A3967.h | 2 +- src/src/extras/Stepper_TB6612.h | 2 +- src/src/extras/extras.ino | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/src/extras/Stepper_A3967.h b/src/src/extras/Stepper_A3967.h index 5820881..e13beca 100644 --- a/src/src/extras/Stepper_A3967.h +++ b/src/src/extras/Stepper_A3967.h @@ -71,7 +71,7 @@ struct Stepper_A3967 : StepperControl { ////////////////////////// - void onStep(boolean direction){ + void onStep(boolean direction) override { digitalWrite(dirPin,direction); digitalWrite(stepPin,HIGH); digitalWrite(stepPin,LOW); diff --git a/src/src/extras/Stepper_TB6612.h b/src/src/extras/Stepper_TB6612.h index fe495c1..b8bf06a 100644 --- a/src/src/extras/Stepper_TB6612.h +++ b/src/src/extras/Stepper_TB6612.h @@ -109,7 +109,7 @@ struct Stepper_TB6612 : StepperControl { ////////////////////////// - void onStep(boolean direction){ + void onStep(boolean direction) override { if(direction) phase=(phase+1)%nPhases; else diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index 2b58d4e..4fe4556 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -45,7 +45,7 @@ void setup() { delay(1000); Serial.printf("\nHomeSpan Stepper Control\n\n"); - bigMotor=(new Stepper_TB6612(23,32,22,14,33,27))->setStepType(StepperControl::HALF_STEP)->setAccel(10,20);; + bigMotor=(new Stepper_TB6612(23,32,22,14,33,27))->setStepType(StepperControl::HALF_STEP)->setAccel(10,20); smallMotor=new Stepper_A3967(17,16,19,18,21); // bigMotor->setStepType(StepperControl::HALF_STEP); From 518640dd539c2312265aa65e99d62338b7745b9c Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 2 Jul 2023 16:08:02 -0500 Subject: [PATCH 130/151] Replaced StepperMotorControl Example with MotorizedWindowShare MotorizedWindowShade is more advanced and uses two motors --- .../MotorizedWindowShade.ino | 139 ++++++++++++++++++ .../StepperMotorControl.ino | 25 ++-- 2 files changed, 153 insertions(+), 11 deletions(-) create mode 100644 examples/Other Examples/MotorizedWindowShade/MotorizedWindowShade.ino diff --git a/examples/Other Examples/MotorizedWindowShade/MotorizedWindowShade.ino b/examples/Other Examples/MotorizedWindowShade/MotorizedWindowShade.ino new file mode 100644 index 0000000..bb68ec7 --- /dev/null +++ b/examples/Other Examples/MotorizedWindowShade/MotorizedWindowShade.ino @@ -0,0 +1,139 @@ +/********************************************************************************* + * MIT License + * + * Copyright (c) 2023 Gregg E. Berman + * + * https://github.com/HomeSpan/HomeSpan + * + * 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. + * + ********************************************************************************/ + +// This example demonstrates how to control real-world Stepper Motors using HomeSpan's +// StepperControl Class through the implemention of a Motorized Window Shade Accessory. + +// The sketch below is based on the more-fully commented WindowShade Accessory included in +// Tutorial Example 13 (this sketch only contains comments related to the use of the stepper motors). + +// The Accessory we will use two stepper motors: + +// * one motor to open/close the window shade, driven by an Adafruit TB6612 driver board (https://www.adafruit.com/product/2448) +// * one motor to tilt the window shade slats, driven by a SparkFun A3967 driver board (https://www.sparkfun.com/products/12779) + +// See HomeSpan's StepperControl documentation for details on the classes used to control these driver boards, +// as well as for instructions on how you can easily extend StepperControl to create a custom driver for any board. + +#include "HomeSpan.h" +#include "extras/Stepper_TB6612.h" // this contains HomeSpan's StepperControl Class for the Adafruit TB6612 driver board +#include "extras/Stepper_A3967.h" // this contains HomeSpan's StepperControl Class for the Sparkfun A3967 driver board + +//////////////////////////////////// + +struct DEV_WindowShade : Service::WindowCovering { + + Characteristic::CurrentPosition currentPos{0,true}; + Characteristic::TargetPosition targetPos{0,true}; + Characteristic::CurrentHorizontalTiltAngle currentTilt{0,true}; + Characteristic::TargetHorizontalTiltAngle targetTilt{0,true}; + + StepperControl *mainMotor; // motor to open/close shade + StepperControl *slatMotor; // motor to tilt shade slats + + DEV_WindowShade(StepperControl *mainMotor, StepperControl *slatMotor) : Service::WindowCovering(){ + + this->mainMotor=mainMotor; + this->slatMotor=slatMotor; + + mainMotor->setAccel(10,20); // set acceleration parameters for main motor + mainMotor->setStepType(StepperControl::HALF_STEP); // set step type to HALF STEP for main motor + + LOG0("Initial Open/Close Position: %d\n",currentPos.getVal()); + LOG0("Initial Slat Position: %d\n",currentTilt.getVal()); + + mainMotor->setPosition(currentPos.getVal()*20); // define initial position of main motor + slatMotor->setPosition(currentTilt.getVal()*11.47); // define initial position of slat motor + } + + /////////// + + boolean update(){ + + if(targetPos.updated()){ + + // Move motor to absolute position, assuming 400 steps per revolution and 5 revolutions for full open/close travel, + // for a total of 2000 steps of full travel. Specify that motor should enter the BRAKE state upon reaching to desired position. + // Must multiply targetPos, which ranges from 0-100, by 20 to scale to number of motor steps needed + + mainMotor->moveTo(targetPos.getNewVal()*20,5,StepperControl::BRAKE); + LOG1("Setting Shade Position=%d\n",targetPos.getNewVal()); + } + + if(targetTilt.updated()){ + + // Move motor to absolute position, assuming 2064 steps per revolution and 1/2 revolution for full travel of slat tilt in either direction + // Must multiply targetPos, which ranges from -90 to 90, by 11.47 to scale number of motor steps needed + + slatMotor->moveTo(targetTilt.getNewVal()*11.47,5,StepperControl::BRAKE); + LOG1("Setting Shade Position=%d\n",targetTilt.getNewVal()); + } + + return(true); + } + + /////////// + + void loop(){ + + // If the current window shade position or tilt does NOT equal the target position, BUT the motor has stopped moving, + // we must have reached the target position, so set the current position equal to the target position + + if(currentPos.getVal()!=targetPos.getVal() && !mainMotor->stepsRemaining()){ + currentPos.setVal(targetPos.getVal()); + LOG1("Main Motor Stopped at Shade Position=%d\n",currentPos.getVal()); + } + + if(currentTilt.getVal()!=targetTilt.getVal() && !slatMotor->stepsRemaining()){ + currentTilt.setVal(targetTilt.getVal()); + LOG1("Slat Motor Stopped at Shade Tilt=%d\n",currentTilt.getVal()); + } + + } + +}; + +//////////////////////////////////// + +void setup() { + + Serial.begin(115200); + + homeSpan.begin(Category::WindowCoverings,"Motorized Shade"); + + new SpanAccessory(); + new Service::AccessoryInformation(); + new Characteristic::Identify(); + new DEV_WindowShade(new Stepper_TB6612(23,32,22,14,33,27), new Stepper_A3967(17,16,19,18,21)); // instantiate drivers for each board and specify pins used on ESP32 +} + +////////////////////////////////////// + +void loop(){ + + homeSpan.poll(); +} diff --git a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino index 80a4fef..17af5ab 100644 --- a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino +++ b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino @@ -44,22 +44,25 @@ struct DEV_WindowShade : Service::WindowCovering { - SpanCharacteristic *current; - SpanCharacteristic *target; +// SpanCharacteristic *current; +// SpanCharacteristic *target; + + Characteristic::CurrentPosition currentPos{0,true}; + Characteristic::TargetPosition targetPos{0,true}; Stepper_TB6612 *motor; // create pointer to TB6612 motor controller DEV_WindowShade(int a1, int a2, int b1, int b2) : Service::WindowCovering(){ - current=new Characteristic::CurrentPosition(0,true); - target=new Characteristic::TargetPosition(0,true); +// current=new Characteristic::CurrentPosition(0,true); +// target=new Characteristic::TargetPosition(0,true); motor=new Stepper_TB6612(a1, a2, b1, b2); // instantiate motor using pins specified in set-up below motor->setAccel(10,20); // set acceleration parameters LOG0("Configuring Motorized Window Shade with input pins: A1=%d, A2=%d, B1=%d, B2=%d\n",a1,a2,b1,b2); - LOG0("Initial Position: %d\n",current->getVal()); - motor->setPosition(current->getVal()*10); + LOG0("Initial Position: %d\n",currentPos.getVal()); + motor->setPosition(currentPos.getVal()*10); } /////////// @@ -71,8 +74,8 @@ struct DEV_WindowShade : Service::WindowCovering { // Specify that motor should enter the BRAKE state upon reaching to desired position. - motor->moveTo(target->getNewVal()*10,5,Stepper_TB6612::BRAKE); - LOG1("Setting Shade Position=%d\n",target->getNewVal()); + motor->moveTo(targetPos.getNewVal()*10,5,Stepper_TB6612::BRAKE); + LOG1("Setting Shade Position=%d\n",targetPos.getNewVal()); return(true); } @@ -83,9 +86,9 @@ struct DEV_WindowShade : Service::WindowCovering { // If the current window shade position does NOT equal the target position, BUT the motor has stopped moving, // we must have reached the target position, so set the current position equal to the target position - if(current->getVal()!=target->getVal() && !motor->stepsRemaining()){ - current->setVal(target->getVal()); - LOG1("Motor Stopped at Shade Position=%d\n",current->getVal()); + if(currentPos.getVal()!=targetPos.getVal() && !motor->stepsRemaining()){ + currentPos.setVal(targetPos.getVal()); + LOG1("Motor Stopped at Shade Position=%d\n",currentPos.getVal()); } } From cf2d695c916d8d4e6095cfc5ae3a387de4a91d03 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 2 Jul 2023 16:08:56 -0500 Subject: [PATCH 131/151] Delete StepperMotorControl.ino --- .../StepperMotorControl.ino | 116 ------------------ 1 file changed, 116 deletions(-) delete mode 100644 examples/Other Examples/StepperMotorControl/StepperMotorControl.ino diff --git a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino deleted file mode 100644 index 17af5ab..0000000 --- a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino +++ /dev/null @@ -1,116 +0,0 @@ -/********************************************************************************* - * MIT License - * - * Copyright (c) 2023 Gregg E. Berman - * - * https://github.com/HomeSpan/HomeSpan - * - * 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. - * - ********************************************************************************/ - -// This example demonstrates how to control a real-world Stepper Motor using HomeSpan's -// generic StepperControl Class. - -// For this sketch we will use an implementation of StepperControl designed to operate an -// Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board (https://www.adafruit.com/product/2448) -// using only its 4 control pins: AIN1, AIN2, BIN1, and BIN2 - -// See HomeSpan's StepperControl documentation for a list of built-in driver boards, as well as for -// detailed instructions on how you can easily use StepperControl to implement a custom driver for any board. - -// Note this example is based on the fully-commented WindowShade Accessory sketch from Tutorial Example 13. - -#include "HomeSpan.h" -#include "extras/Stepper_TB6612.h" // this contains HomeSpan's StepperControl Class for the Adafruit TB6612 Driver Board - -//////////////////////////////////// - -struct DEV_WindowShade : Service::WindowCovering { - -// SpanCharacteristic *current; -// SpanCharacteristic *target; - - Characteristic::CurrentPosition currentPos{0,true}; - Characteristic::TargetPosition targetPos{0,true}; - - Stepper_TB6612 *motor; // create pointer to TB6612 motor controller - - DEV_WindowShade(int a1, int a2, int b1, int b2) : Service::WindowCovering(){ - -// current=new Characteristic::CurrentPosition(0,true); -// target=new Characteristic::TargetPosition(0,true); - - motor=new Stepper_TB6612(a1, a2, b1, b2); // instantiate motor using pins specified in set-up below - motor->setAccel(10,20); // set acceleration parameters - - LOG0("Configuring Motorized Window Shade with input pins: A1=%d, A2=%d, B1=%d, B2=%d\n",a1,a2,b1,b2); - LOG0("Initial Position: %d\n",currentPos.getVal()); - motor->setPosition(currentPos.getVal()*10); - } - - /////////// - - boolean update(){ - - // Move motor to absolute position, assuming 200 steps per revolution and 5 revolutions for full up/travel travel, - // for a total of 1000 steps of full travel. - - // Specify that motor should enter the BRAKE state upon reaching to desired position. - - motor->moveTo(targetPos.getNewVal()*10,5,Stepper_TB6612::BRAKE); - LOG1("Setting Shade Position=%d\n",targetPos.getNewVal()); - return(true); - } - - /////////// - - void loop(){ - - // If the current window shade position does NOT equal the target position, BUT the motor has stopped moving, - // we must have reached the target position, so set the current position equal to the target position - - if(currentPos.getVal()!=targetPos.getVal() && !motor->stepsRemaining()){ - currentPos.setVal(targetPos.getVal()); - LOG1("Motor Stopped at Shade Position=%d\n",currentPos.getVal()); - } - } - -}; - -//////////////////////////////////// - -void setup() { - - Serial.begin(115200); - - homeSpan.begin(Category::WindowCoverings,"Motorized Shade"); - - new SpanAccessory(); - new Service::AccessoryInformation(); - new Characteristic::Identify(); - new DEV_WindowShade(23,32,22,14); // The TB6612 driver requires 4 digital pins: AIN1, AIN2, BIN1, and BIN2. Change these pin numbers to match YOUR board! -} - -////////////////////////////////////// - -void loop(){ - - homeSpan.poll(); -} From 5a85ee7be88ead785218e808dcf27086cea0ef9e Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sun, 2 Jul 2023 16:38:01 -0500 Subject: [PATCH 132/151] Update Stepper.md --- docs/Stepper.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index fcbe6a7..54366ee 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -174,7 +174,9 @@ void loop(){ } ``` -A fully worked example showing how to use the *StepperControl* class within a complete HomeSpan sketch to control a Motorize Window Shade can be found in the Arduino IDE under [*File → Examples → HomeSpan → Other Examples → StepperMotorControl*](../examples/Other%20Examples/StepperMotorControl). +### Motorized Window Shade Example + +A fully worked example showing how to use the *StepperControl* class within a complete HomeSpan sketch to control a Motorize Window Shade using both the TB6612 and A3967 driver boards can be found in the Arduino IDE under [*File → Examples → HomeSpan → Other Examples → MotorizedWindowShade*](../examples/Other%20Examples/MotorizedWindowShade). ## Creating your own **StepperControl** Driver From f92048ec19867f3bbb2fe949915a3bcb9bd51d53 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 2 Jul 2023 16:38:31 -0500 Subject: [PATCH 133/151] Update MotorizedWindowShade.ino --- .../MotorizedWindowShade/MotorizedWindowShade.ino | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/Other Examples/MotorizedWindowShade/MotorizedWindowShade.ino b/examples/Other Examples/MotorizedWindowShade/MotorizedWindowShade.ino index bb68ec7..33bc9f5 100644 --- a/examples/Other Examples/MotorizedWindowShade/MotorizedWindowShade.ino +++ b/examples/Other Examples/MotorizedWindowShade/MotorizedWindowShade.ino @@ -57,7 +57,7 @@ struct DEV_WindowShade : Service::WindowCovering { DEV_WindowShade(StepperControl *mainMotor, StepperControl *slatMotor) : Service::WindowCovering(){ - this->mainMotor=mainMotor; + this->mainMotor=mainMotor; // save pointers to the motors this->slatMotor=slatMotor; mainMotor->setAccel(10,20); // set acceleration parameters for main motor @@ -88,8 +88,9 @@ struct DEV_WindowShade : Service::WindowCovering { // Move motor to absolute position, assuming 2064 steps per revolution and 1/2 revolution for full travel of slat tilt in either direction // Must multiply targetPos, which ranges from -90 to 90, by 11.47 to scale number of motor steps needed + // Note this driver board for this motor does not support a "short brake" state - slatMotor->moveTo(targetTilt.getNewVal()*11.47,5,StepperControl::BRAKE); + slatMotor->moveTo(targetTilt.getNewVal()*11.47,5); LOG1("Setting Shade Position=%d\n",targetTilt.getNewVal()); } @@ -125,6 +126,9 @@ void setup() { homeSpan.begin(Category::WindowCoverings,"Motorized Shade"); + // MAKE SURE TO CHANGE THE PINS NUMBERS BELOW TO MATCH YOUR ESP32 DEVICE!!! + // THE PINS NUMBER SPECIFIED IN THIS EXAMPLE WORK WITH THE ORIGINAL ESP32, BUT WILL LIKELY CRASH AN ESP32-S2, -S3, or -C3. + new SpanAccessory(); new Service::AccessoryInformation(); new Characteristic::Identify(); From 794d9e09b598310e2bfeafed422bf50c806385fb Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sun, 2 Jul 2023 16:39:50 -0500 Subject: [PATCH 134/151] Update Tutorials.md --- docs/Tutorials.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Tutorials.md b/docs/Tutorials.md index 924237b..9b38147 100644 --- a/docs/Tutorials.md +++ b/docs/Tutorials.md @@ -138,7 +138,7 @@ Demonstrates how *SpanPoint* can be used to transmit messages from battery-power ### [FadingLED](../examples/Other%20Examples/FadingLED) Demonstrates how the *LedPin* class can use the ESP32's built-in fading control to automatically fade an LED from from one level of brightness to another over a specified period of time. See the [LedPin](PWM.md#pulse-width-modulation-pwm) page for full details -### [StepperMotorControl](../examples/Other%20Examples/StepperMotorControl) +### [MotorizedWindowShade](../examples/Other%20Examples/MotorizedWindowShade) Demonstrates how to use the *StepperControl* class to operate a stepper motor. Implements a motorized window shade based on [Example 13](../examples/13-TargetStates) above. See the [Stepper Motor Control](Stepper.md) page for full details --- From 568c13fee3a580b851dac1a88de869a3e0c6f81a Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 2 Jul 2023 17:12:58 -0500 Subject: [PATCH 135/151] Tested homeSpan.setStatusDevice() to create a reverseLED --- src/src.ino | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/src.ino b/src/src.ino index e0f2c4f..8eeafc0 100644 --- a/src/src.ino +++ b/src/src.ino @@ -47,6 +47,17 @@ struct LED_Service : Service::LightBulb { ////////////////////////////////////// +struct reverseLED : Blinkable { + + int pin; + + reverseLED(int pin) : pin{pin} {pinMode(pin,OUTPUT);digitalWrite(pin,1);} + void on() override {digitalWrite(pin,LOW);} + void off() override {digitalWrite(pin,HIGH);} + int getPin() override {return(pin);} +}; + +////////////////////////////////////// void setup() { @@ -56,8 +67,8 @@ void setup() { // homeSpan.setSerialInputDisable(true); homeSpan.enableOTA(); - homeSpan.setStatusPin(13); - homeSpan.setStatusAutoOff(20); + homeSpan.setStatusDevice(new reverseLED(13)); + homeSpan.setStatusAutoOff(30); homeSpan.begin(Category::Lighting,"HomeSpan LED"); From fd64273a6d08f6ff5056fd7ac2c758c0aea74429 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sun, 2 Jul 2023 17:24:12 -0500 Subject: [PATCH 136/151] Update Reference.md --- docs/Reference.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/Reference.md b/docs/Reference.md index 13f2f77..9e2e33c 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -37,10 +37,11 @@ The following **optional** `homeSpan` methods override various HomeSpan initiali * `void setStatusPin(uint8_t pin)` * sets the ESP32 pin to use for the HomeSpan Status LED * assumes a standard LED will be connected to *pin* - * if neither this method nor `setStatusPixel()` is called, HomeSpan will assume there is no Status LED + * if neither this method nor any equivalent method is called, HomeSpan will assume there is no Status LED * `void setStatusPixel(uint8_t pin, float h=0, float s=100, float v=100)` * sets the ESP32 pin to use for the HomeSpan Status LED + * this method is an *alternative* to using `setStatusPin()` above * assumes an RGB NeoPixel (or equivalent) will be connected to *pin* * works well with ESP32 boards that have a built-in NeoPixel LED, though adding an external NeoPixel is fine * users can optionally specify the color HomeSpan will use with the NeoPixel by providing the following HSV values: @@ -49,7 +50,14 @@ The following **optional** `homeSpan` methods override various HomeSpan initiali * v = Brightness percentage from 0-100 * color defaults to *red* if unspecified * example: `homeSpan.setStatusPixel(8,120,100,20)` sets the Status LED to light green using a NeoPixel attached to pin 8 - * if neither this method nor `setStatusPin()` is called, HomeSpan will assume there is no Status LED + * if neither this method nor any equivalent method is called, HomeSpan will assume there is no Status LED + +* `void setStatusDevice(Blinkable *sDev)` + * sets the Status LED to a user-specified Blinkable device, *sDev* + * this method is an *alternative* to using either `setStatusPin()` or `setStatusPixel()` above + * see [Blinkable](Blinkable.md) for details on how to create generic Blinkable devices + * useful when using an LED connected to a pin expander, or other specialized driver, as the Status LED + * if neither this method nor any equivalent method is called, HomeSpan will assume there is no Status LED * `void setStatusAutoOff(uint16_t duration)` * sets Status LED to automatically turn off after *duration* seconds From c05f6d67e041b026a1b3e74fa9287161f3fdb164 Mon Sep 17 00:00:00 2001 From: Gregg Date: Mon, 3 Jul 2023 05:22:42 -0500 Subject: [PATCH 137/151] Create Blinkable.md --- docs/Blinkable.md | 85 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 docs/Blinkable.md diff --git a/docs/Blinkable.md b/docs/Blinkable.md new file mode 100644 index 0000000..7f528df --- /dev/null +++ b/docs/Blinkable.md @@ -0,0 +1,85 @@ +# HomeSpan Status + +The optional ***homeSpan*** method, `void setStatusCallback(void (*func)(HS_STATUS status))`, can be used to create a callback function, *func*, that HomeSpan calls whenever its status changes. HomeSpan passes *func* a single argument, *status*, of type *HS_STATUS*, defined as follows: + +```C++ +enum HS_STATUS { + HS_WIFI_NEEDED, // WiFi Credentials have not yet been set/stored + HS_WIFI_CONNECTING, // HomeSpan is trying to connect to the network specified in the stored WiFi Credentials + HS_PAIRING_NEEDED, // HomeSpan is connected to central WiFi network, but device has not yet been paired to HomeKit + HS_PAIRED, // HomeSpan is connected to central WiFi network and ther device has been paired to HomeKit + HS_ENTERING_CONFIG_MODE, // User has requested the device to enter into Command Mode + HS_CONFIG_MODE_EXIT, // HomeSpan is in Command Mode with "Exit Command Mode" specified as choice + HS_CONFIG_MODE_REBOOT, // HomeSpan is in Command Mode with "Reboot" specified as choice + HS_CONFIG_MODE_LAUNCH_AP, // HomeSpan is in Command Mode with "Launch Access Point" specified as choice + HS_CONFIG_MODE_UNPAIR, // HomeSpan is in Command Mode with "Unpair Device" specified as choice + HS_CONFIG_MODE_ERASE_WIFI, // HomeSpan is in Command Mode with "Erase WiFi Credentials" specified as choice + HS_CONFIG_MODE_EXIT_SELECTED, // User has selected "Exit Command Mode" + HS_CONFIG_MODE_REBOOT_SELECTED, // User has select "Reboot" from the Command Mode + HS_CONFIG_MODE_LAUNCH_AP_SELECTED, // User has selected "Launch AP Access" from the Command Mode + HS_CONFIG_MODE_UNPAIR_SELECTED, // User has seleected "Unpair Device" from the Command Mode + HS_CONFIG_MODE_ERASE_WIFI_SELECTED, // User has selected "Erase WiFi Credentials" from the Command Mode + HS_REBOOTING, // HomeSpan is in the process of rebooting the device + HS_FACTORY_RESET, // HomeSpan is in the process of performing a Factory Reset of device + HS_AP_STARTED, // HomeSpan has started the Access Point but no one has yet connected + HS_AP_CONNECTED, // The Access Point is started and a user device has been connected + HS_AP_TERMINATED, // HomeSpan has terminated the Access Point + HS_OTA_STARTED // HomeSpan is in the process of recveived an Over-the-Air software update +}; +``` + +The ***homeSpan*** method `char* statusString(HS_STATUS s)`, is a convenience function for converting any of the above enumerations to short, pre-defined character string messages as follows: + +```C++ +const char* Span::statusString(HS_STATUS s){ + switch(s){ + case HS_WIFI_NEEDED: return("WiFi Credentials Needed"); + case HS_WIFI_CONNECTING: return("WiFi Connecting"); + case HS_PAIRING_NEEDED: return("Device not yet Paired"); + case HS_PAIRED: return("Device Paired"); + case HS_ENTERING_CONFIG_MODE: return("Entering Command Mode"); + case HS_CONFIG_MODE_EXIT: return("1. Exit Command Mode"); + case HS_CONFIG_MODE_REBOOT: return("2. Reboot Device"); + case HS_CONFIG_MODE_LAUNCH_AP: return("3. Launch Access Point"); + case HS_CONFIG_MODE_UNPAIR: return("4. Unpair Device"); + case HS_CONFIG_MODE_ERASE_WIFI: return("5. Erase WiFi Credentials"); + case HS_CONFIG_MODE_EXIT_SELECTED: return("Exiting Command Mode..."); + case HS_CONFIG_MODE_REBOOT_SELECTED: return("Rebooting Device..."); + case HS_CONFIG_MODE_LAUNCH_AP_SELECTED: return("Launching Access Point..."); + case HS_CONFIG_MODE_UNPAIR_SELECTED: return("Unpairing Device..."); + case HS_CONFIG_MODE_ERASE_WIFI_SELECTED: return("Erasing WiFi Credentials..."); + case HS_REBOOTING: return("REBOOTING!"); + case HS_FACTORY_RESET: return("Performing Factory Reset..."); + case HS_AP_STARTED: return("Access Point Started"); + case HS_AP_CONNECTED: return("Access Point Connected"); + case HS_AP_TERMINATED: return("Access Point Terminated"); + case HS_OTA_STARTED: return("OTA Update Started"); + default: return("Unknown"); + } +} +``` + +### Example: + +```C++ +#include "HomeSpan.h" + +void setup(){ + homeSpan.setStatusCallback(statusUpdate); // set callback function + ... + homeSpan.begin(); + ... +} + +// create a callback function that simply prints the pre-defined short messages on the Serial Monitor whenever the HomeSpan status changes + +void statusUpdate(HS_STATUS status){ + Serial.printf("\n*** HOMESPAN STATUS CHANGE: %s\n",homeSpan.statusString(status)); +} +``` + +You can of course create any alternative messsages, or take any actions desired, in *func* and do not need to use the pre-defined strings above. + +--- + +[↩️](Reference.md) Back to the Reference API page From 7861494e1afd8bc01d218e55fc9af1dcd5e14df0 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 3 Jul 2023 05:54:14 -0500 Subject: [PATCH 138/151] Update Stepper.md --- docs/Stepper.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 54366ee..41bd94f 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -2,7 +2,7 @@ HomeSpan includes dedicated classes that provide for easy control of a stepper motor connected to an ESP32 via a stepper motor driver board. These classes allow one or more stepper motors to operate smoothly and asynchronously in the background while HomeSpan continues to run in the foreground. On devices with dual processors, stepper-motor control can be run either on the same or a different processor from HomeSpan. -The HomeSpan class that contains all the methods to control a stepper motor is called **StepperControl**. However, this is a virtual class and cannot be instantiated directly. Instead you instantiate stepper motor objects using driver-specific child-classes (derived from **StepperControl**) that contain all the logic to configure and operate a particular driver board. Each child class supports one or more constructors allowing you to specify which output pins on your ESP32 device will be connected to the required pins on your driver board: +The HomeSpan class that contains all the methods to control a stepper motor is called **StepperControl**. However, this is an abstract class and cannot be instantiated directly. Instead you instantiate stepper motor objects using driver-specific child-classes (derived from **StepperControl**) that contain all the logic to configure and operate a particular driver board. Each child class supports one or more constructors allowing you to specify which output pins on your ESP32 device will be connected to the required pins on your driver board: * **[Stepper_TB6612](StepperDrivers/Stepper_TB6612.md)** * This class is used to operate stepper motors driven by a [Toshiba TB6612](https://cdn-shop.adafruit.com/datasheets/TB6612FNG_datasheet_en_20121101.pdf) chip, either with or without the use of ESP32 PWM pins @@ -180,7 +180,7 @@ A fully worked example showing how to use the *StepperControl* class within a co ## Creating your own **StepperControl** Driver -If neither of the above motor driver classes works for your specific chip or driver board, it is relatively straightfoward to create a new driver to use in your sketch. This is because all the logic to operate a stepper motor in the background is already embedded in the parent **StepperControl** class. To create your own driver, start by creating a child class derived from **StepperControl**. Next, add a constructor that defines the pins and performs any initializations if needed. Finally, define the following methods that **StepperControl** calls to operate the motor: +If neither of the above motor driver classes works for your specific chip or driver board, it is relatively straightfoward to create a new driver to use in your sketch. This is because all the logic to operate a stepper motor in the background is already embedded in the abstract **StepperControl** class. To create your own driver, start by creating a child class derived from **StepperControl**. Next, add a constructor that defines the pins and performs any initializations if needed. Finally, define the following methods that **StepperControl** calls to operate the motor: * `void onStep(boolean direction)` - contains the logic to advance the motor by a single step based on the *direction* parameter * `void onEnable()` - contains the logic that enables the motor driver From 866225757fce3289928d7583deacc6357416fe98 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 3 Jul 2023 07:00:21 -0500 Subject: [PATCH 139/151] Update Blinkable.md --- docs/Blinkable.md | 96 +++++++++++++++-------------------------------- 1 file changed, 30 insertions(+), 66 deletions(-) diff --git a/docs/Blinkable.md b/docs/Blinkable.md index 7f528df..9737e91 100644 --- a/docs/Blinkable.md +++ b/docs/Blinkable.md @@ -1,85 +1,49 @@ -# HomeSpan Status +# Creating a Custom Status LED with the Blinkable Interface -The optional ***homeSpan*** method, `void setStatusCallback(void (*func)(HS_STATUS status))`, can be used to create a callback function, *func*, that HomeSpan calls whenever its status changes. HomeSpan passes *func* a single argument, *status*, of type *HS_STATUS*, defined as follows: +The HomeSpan Status LED conveys information about the device to the user through different blinking patterns. The *homeSpan* `setStatusPin()` and `setStatusPixel()` methods allow you to choose, respectively, either a standard LED or a NeoPixel LED as the Status LED. However, the Status LED can be set to any object that implements the **Blinkable** interface[^1] using the *homeSpan* method `setStatusDevice(Blinkable *sDev)`, where *sDev* is a Blinkable object. + +To create your own Blinkable object, start by creating a child class derived from **Blinkable**. Next, add a constructor that defines the pins and performs any initializations if needed. Finally, define the following methods that **Blinkable** calls to blink the device: + +* `void on()` - turns on the device (e.g. causes an LED to light) +* `void off()` - turns off the device (e.g. causes an LED to go dark) +* `virtual getPin()` - returns the pin number of the device (any number is fine; does not have to be an actual ESP32 pin) + +For example, the following defines a Blinkable object for an inverted LED that turns *on* when an ESP32 pin is LOW, and turns *off* when the ESP32 pin is HIGH: ```C++ -enum HS_STATUS { - HS_WIFI_NEEDED, // WiFi Credentials have not yet been set/stored - HS_WIFI_CONNECTING, // HomeSpan is trying to connect to the network specified in the stored WiFi Credentials - HS_PAIRING_NEEDED, // HomeSpan is connected to central WiFi network, but device has not yet been paired to HomeKit - HS_PAIRED, // HomeSpan is connected to central WiFi network and ther device has been paired to HomeKit - HS_ENTERING_CONFIG_MODE, // User has requested the device to enter into Command Mode - HS_CONFIG_MODE_EXIT, // HomeSpan is in Command Mode with "Exit Command Mode" specified as choice - HS_CONFIG_MODE_REBOOT, // HomeSpan is in Command Mode with "Reboot" specified as choice - HS_CONFIG_MODE_LAUNCH_AP, // HomeSpan is in Command Mode with "Launch Access Point" specified as choice - HS_CONFIG_MODE_UNPAIR, // HomeSpan is in Command Mode with "Unpair Device" specified as choice - HS_CONFIG_MODE_ERASE_WIFI, // HomeSpan is in Command Mode with "Erase WiFi Credentials" specified as choice - HS_CONFIG_MODE_EXIT_SELECTED, // User has selected "Exit Command Mode" - HS_CONFIG_MODE_REBOOT_SELECTED, // User has select "Reboot" from the Command Mode - HS_CONFIG_MODE_LAUNCH_AP_SELECTED, // User has selected "Launch AP Access" from the Command Mode - HS_CONFIG_MODE_UNPAIR_SELECTED, // User has seleected "Unpair Device" from the Command Mode - HS_CONFIG_MODE_ERASE_WIFI_SELECTED, // User has selected "Erase WiFi Credentials" from the Command Mode - HS_REBOOTING, // HomeSpan is in the process of rebooting the device - HS_FACTORY_RESET, // HomeSpan is in the process of performing a Factory Reset of device - HS_AP_STARTED, // HomeSpan has started the Access Point but no one has yet connected - HS_AP_CONNECTED, // The Access Point is started and a user device has been connected - HS_AP_TERMINATED, // HomeSpan has terminated the Access Point - HS_OTA_STARTED // HomeSpan is in the process of recveived an Over-the-Air software update -}; -``` -The ***homeSpan*** method `char* statusString(HS_STATUS s)`, is a convenience function for converting any of the above enumerations to short, pre-defined character string messages as follows: +// CREATE THIS STRUCTURE SOMEWHERE NEAR TOP OF SKETCH -```C++ -const char* Span::statusString(HS_STATUS s){ - switch(s){ - case HS_WIFI_NEEDED: return("WiFi Credentials Needed"); - case HS_WIFI_CONNECTING: return("WiFi Connecting"); - case HS_PAIRING_NEEDED: return("Device not yet Paired"); - case HS_PAIRED: return("Device Paired"); - case HS_ENTERING_CONFIG_MODE: return("Entering Command Mode"); - case HS_CONFIG_MODE_EXIT: return("1. Exit Command Mode"); - case HS_CONFIG_MODE_REBOOT: return("2. Reboot Device"); - case HS_CONFIG_MODE_LAUNCH_AP: return("3. Launch Access Point"); - case HS_CONFIG_MODE_UNPAIR: return("4. Unpair Device"); - case HS_CONFIG_MODE_ERASE_WIFI: return("5. Erase WiFi Credentials"); - case HS_CONFIG_MODE_EXIT_SELECTED: return("Exiting Command Mode..."); - case HS_CONFIG_MODE_REBOOT_SELECTED: return("Rebooting Device..."); - case HS_CONFIG_MODE_LAUNCH_AP_SELECTED: return("Launching Access Point..."); - case HS_CONFIG_MODE_UNPAIR_SELECTED: return("Unpairing Device..."); - case HS_CONFIG_MODE_ERASE_WIFI_SELECTED: return("Erasing WiFi Credentials..."); - case HS_REBOOTING: return("REBOOTING!"); - case HS_FACTORY_RESET: return("Performing Factory Reset..."); - case HS_AP_STARTED: return("Access Point Started"); - case HS_AP_CONNECTED: return("Access Point Connected"); - case HS_AP_TERMINATED: return("Access Point Terminated"); - case HS_OTA_STARTED: return("OTA Update Started"); - default: return("Unknown"); +struct invertedLED : Blinkable { // create a child class derived from Blinkable + + int pin; // variable to store the pin number + + invertedLED(int pin) : pin{pin} { // constructor that initializes the pin parameter + pinMode(pin,OUTPUT); // set the pin to OUTPUT + digitalWrite(pin,HIGH); // set pin HIGH (which is off for an inverted LED) } -} -``` -### Example: + void on() override { digitalWrite(pin,LOW); } // required function on() - sets pin LOW + void off() override { digitalWrite(pin,HIGH); } // required function off() - sets pin HIGH + int getPin() override { return(pin); } // required function getPin() - returns pin number +}; -```C++ -#include "HomeSpan.h" +... + +// THEN USE THE STRUCTURE IN SETUP() TO SET THE STATUS LED void setup(){ - homeSpan.setStatusCallback(statusUpdate); // set callback function - ... - homeSpan.begin(); - ... -} -// create a callback function that simply prints the pre-defined short messages on the Serial Monitor whenever the HomeSpan status changes + homeSpan.setStatusDevice(new invertedLED(13)); // set Status LED to be a new Blinkable device attached to pin 13 -void statusUpdate(HS_STATUS status){ - Serial.printf("\n*** HOMESPAN STATUS CHANGE: %s\n",homeSpan.statusString(status)); +... } ``` -You can of course create any alternative messsages, or take any actions desired, in *func* and do not need to use the pre-defined strings above. +[^1]: In C++, an *interface* is any abstract class that contains only pure virtual functions. You cannot instantiate an interface, but you can instantiate any derived child classes from the interface provided that you define each of the required virtual functions. --- [↩️](Reference.md) Back to the Reference API page + + From 0997c2561b8cb769b4a5a52e8c1f6a835458a27d Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 3 Jul 2023 07:05:12 -0500 Subject: [PATCH 140/151] Update Blinkable.md --- docs/Blinkable.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Blinkable.md b/docs/Blinkable.md index 9737e91..5362609 100644 --- a/docs/Blinkable.md +++ b/docs/Blinkable.md @@ -1,12 +1,12 @@ # Creating a Custom Status LED with the Blinkable Interface -The HomeSpan Status LED conveys information about the device to the user through different blinking patterns. The *homeSpan* `setStatusPin()` and `setStatusPixel()` methods allow you to choose, respectively, either a standard LED or a NeoPixel LED as the Status LED. However, the Status LED can be set to any object that implements the **Blinkable** interface[^1] using the *homeSpan* method `setStatusDevice(Blinkable *sDev)`, where *sDev* is a Blinkable object. +The HomeSpan Status LED conveys information about the state of HomeSpan to the user through different blinking patterns. The *homeSpan* `setStatusPin()` and `setStatusPixel()` methods allow you to choose, respectively, either a standard LED or a NeoPixel LED as the Status LED. However, the Status LED can be set to any object that implements the **Blinkable** interface[^1] using the *homeSpan* method `setStatusDevice(Blinkable *sDev)`, where *sDev* is a Blinkable object. -To create your own Blinkable object, start by creating a child class derived from **Blinkable**. Next, add a constructor that defines the pins and performs any initializations if needed. Finally, define the following methods that **Blinkable** calls to blink the device: +To create your own Blinkable object, start by creating a child class derived from **Blinkable**. Next, add a constructor that defines the pins and performs any initializations if needed. Finally, define the following *required* methods that **Blinkable** calls to blink the device: * `void on()` - turns on the device (e.g. causes an LED to light) * `void off()` - turns off the device (e.g. causes an LED to go dark) -* `virtual getPin()` - returns the pin number of the device (any number is fine; does not have to be an actual ESP32 pin) +* `int getPin()` - returns the pin number of the device (any number is fine; does not have to be an actual ESP32 pin) For example, the following defines a Blinkable object for an inverted LED that turns *on* when an ESP32 pin is LOW, and turns *off* when the ESP32 pin is HIGH: From 62b1e9bd3502fe02552a6362d3ba8d76fd78fa1e Mon Sep 17 00:00:00 2001 From: Gregg Date: Mon, 3 Jul 2023 07:05:51 -0500 Subject: [PATCH 141/151] Update src.ino --- src/src.ino | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/src.ino b/src/src.ino index 8eeafc0..d82cf30 100644 --- a/src/src.ino +++ b/src/src.ino @@ -47,16 +47,21 @@ struct LED_Service : Service::LightBulb { ////////////////////////////////////// -struct reverseLED : Blinkable { +struct invertedLED : Blinkable { // create a child class derived from Blinkable - int pin; + int pin; // variable to store the pin number - reverseLED(int pin) : pin{pin} {pinMode(pin,OUTPUT);digitalWrite(pin,1);} - void on() override {digitalWrite(pin,LOW);} - void off() override {digitalWrite(pin,HIGH);} - int getPin() override {return(pin);} + invertedLED(int pin) : pin{pin} { // constructor that initializes the pin parameter + pinMode(pin,OUTPUT); // set the pin to OUTPUT + digitalWrite(pin,HIGH); // set pin HIGH (which is off for an inverted LED) + } + + void on() override { digitalWrite(pin,LOW); } // required function on() - sets pin LOW + void off() override { digitalWrite(pin,HIGH); } // required function off() - sets pin HIGH + int getPin() override { return(pin); } // required function getPin() - returns pin number }; + ////////////////////////////////////// void setup() { @@ -67,7 +72,7 @@ void setup() { // homeSpan.setSerialInputDisable(true); homeSpan.enableOTA(); - homeSpan.setStatusDevice(new reverseLED(13)); + homeSpan.setStatusDevice(new invertedLED(13)); // set Status LED to be a new Blinkable device attached to pin 13 homeSpan.setStatusAutoOff(30); homeSpan.begin(Category::Lighting,"HomeSpan LED"); From 3d45c7d12083e445c2b21e9db40654204aed6603 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Mon, 3 Jul 2023 09:01:28 -0500 Subject: [PATCH 142/151] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a22d689..066cc1d 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,13 @@ HomeSpan requires version 2.0.0 or later of the [Arduino-ESP32 Board Manager](ht * **Adds new methods to disable HomeSpan's use of the USB Serial port** * new Log Level, -1, causes HomeSpan to suppress all OUTPUT messages - * new homeSpan method, `setSerialInputDisable(boolean val)` disables/re-enables HomeSpan's reading of CLI commands INPUT into the Arduino Serial Monitor + * new homeSpan method `setSerialInputDisable(boolean val)` disables/re-enables HomeSpan's reading of CLI commands INPUT into the Arduino Serial Monitor + +* **Adds ability to use a non-standard LED as the HomeSpan Status LED** + + * new homeSpan method `setStatusDevice(Blinkable *sDev)` sets the Status LED to the Blinkable object *sDev* + * allows an LED connected to a pin expander, or any other non-standard LED controller (such as an inverted LED that lights when a pin is LOW instead of HIGH) to be used as the HomeSpan Status LED + * see [Blinkable.md](docs/Blinkable.md) for details (including an example) on how to create Blinkable objects See [Releases](https://github.com/HomeSpan/HomeSpan/releases) for details on all changes and bug fixes included in this update. From db0f5222977082f57282845b80da08503d3543c7 Mon Sep 17 00:00:00 2001 From: Gregg Date: Wed, 5 Jul 2023 06:05:10 -0500 Subject: [PATCH 143/151] Added DRAM/IRAM memory stats to 'm' CLI command --- src/HomeSpan.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index 1861c4e..07dd911 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -831,7 +831,13 @@ void Span::processSerialCommand(const char *c){ break; case 'm': { - LOG0("Free Memory: %d bytes\n",heap_caps_get_free_size(MALLOC_CAP_DEFAULT)); + multi_heap_info_t heapInfo; + heap_caps_get_info(&heapInfo,MALLOC_CAP_INTERNAL); + LOG0("Total Heap=%d ",heapInfo.total_free_bytes); + heap_caps_get_info(&heapInfo,MALLOC_CAP_DEFAULT); + LOG0("DRAM-Capable=%d ",heapInfo.total_free_bytes); + heap_caps_get_info(&heapInfo,MALLOC_CAP_EXEC); + LOG0("IRAM-Capable=%d\n",heapInfo.total_free_bytes); } break; From f7419da35b5bf824addbbfbc45b186587a7a9dfb Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 8 Jul 2023 16:55:22 -0500 Subject: [PATCH 144/151] Final test of motorized shades --- .../MotorizedWindowShade/MotorizedWindowShade.ino | 2 +- src/src/extras/extras.ino | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/Other Examples/MotorizedWindowShade/MotorizedWindowShade.ino b/examples/Other Examples/MotorizedWindowShade/MotorizedWindowShade.ino index 33bc9f5..39314ff 100644 --- a/examples/Other Examples/MotorizedWindowShade/MotorizedWindowShade.ino +++ b/examples/Other Examples/MotorizedWindowShade/MotorizedWindowShade.ino @@ -132,7 +132,7 @@ void setup() { new SpanAccessory(); new Service::AccessoryInformation(); new Characteristic::Identify(); - new DEV_WindowShade(new Stepper_TB6612(23,32,22,14,33,27), new Stepper_A3967(17,16,19,18,21)); // instantiate drivers for each board and specify pins used on ESP32 + new DEV_WindowShade(new Stepper_TB6612(23,32,22,14,33,27), new Stepper_A3967(18,21,5,4,19)); // instantiate drivers for each board and specify pins used on ESP32 } ////////////////////////////////////// diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index 4fe4556..9a8d440 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -46,7 +46,9 @@ void setup() { Serial.printf("\nHomeSpan Stepper Control\n\n"); bigMotor=(new Stepper_TB6612(23,32,22,14,33,27))->setStepType(StepperControl::HALF_STEP)->setAccel(10,20); - smallMotor=new Stepper_A3967(17,16,19,18,21); + smallMotor=new Stepper_A3967(18,21,5,4,19); + +// smallMotor->setStepType(StepperControl::EIGHTH_STEP); // bigMotor->setStepType(StepperControl::HALF_STEP); // bigMotor->setAccel(10,20); From 6aedec5a2d56cec1cde73f50aa712d8c1522f07a Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 8 Jul 2023 17:56:33 -0500 Subject: [PATCH 145/151] Added ability to chain enable(), disable(), and brake() --- src/src/extras/StepperControl.cpp | 14 +++++++++----- src/src/extras/StepperControl.h | 6 +++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/src/extras/StepperControl.cpp b/src/src/extras/StepperControl.cpp index 9c961c5..31d33ea 100644 --- a/src/src/extras/StepperControl.cpp +++ b/src/src/extras/StepperControl.cpp @@ -117,25 +117,29 @@ void StepperControl::waitForAck(){ ////////////////////////// -void StepperControl::brake(){ +StepperControl *StepperControl::brake(){ move(0,10,BRAKE); while(stepsRemaining()); + return(this); } ////////////////////////// -void StepperControl::disable(){ +StepperControl *StepperControl::disable(){ move(0,10,DISABLE); while(stepsRemaining()); + return(this); } ////////////////////////// -void StepperControl::enable(){ +StepperControl *StepperControl::enable(){ move(0,10); while(stepsRemaining()); - -}////////////////////////// + return(this); +} + +////////////////////////// void StepperControl::motorTask(void *args){ StepperControl *motor = (StepperControl *)args; diff --git a/src/src/extras/StepperControl.h b/src/src/extras/StepperControl.h index d25c608..05f7bc4 100644 --- a/src/src/extras/StepperControl.h +++ b/src/src/extras/StepperControl.h @@ -97,9 +97,9 @@ class StepperControl { int position(); void setPosition(int pos); int stepsRemaining(); - void enable(); - void disable(); - void brake(); + StepperControl *enable(); + StepperControl *disable(); + StepperControl *brake(); }; ////////////////////////// From d78f6a2ce3d8232c2babab5009a9ac7a12c5342a Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 8 Jul 2023 18:00:47 -0500 Subject: [PATCH 146/151] Update Stepper.md --- docs/Stepper.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 41bd94f..06146d3 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -31,13 +31,19 @@ The **StepperControl** class provides the following methods to operate and contr * `void enable()` * enables current flow to the stepper motor coils, actively holding the motor in its position - + * returns pointer to itself so methods can be daisy-chained + * example: `myMotor=(new Stepper_TB6612(23,32,22,14,33,27))->enable();` + * `void disable()` * disables current flow to the stepper motor coils and leaves them in a state of high impedence, allowing the motor to turn freely + * returns pointer to itself so methods can be daisy-chained + * example: `myMotor=(new Stepper_TB6612(23,32,22,14,33,27))->disable();` * `void brake()` * disables current flow to the stepper motor coils but leaves them in a state of low impedence, preventing the motor from freely turning * applicable only for driver chips that support a "short brake" mode, otherwise has no effect + * returns pointer to itself so methods can be daisy-chained + * example: `myMotor=(new Stepper_TB6612(23,32,22,14,33,27))->brake();` * `void move(int nSteps, uint32_t msDelay, endAction_t endAction=NONE)` * enables the stepper motor and turns it *nSteps* steps. Note this is a **non-blocking** function and returns immediately after being called while the motor turns for *nSteps* steps in the background From e958e07d0bbb366db4df336d9e98e431a9b3e7f5 Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 8 Jul 2023 18:30:29 -0500 Subject: [PATCH 147/151] Update Stepper.md --- docs/Stepper.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Stepper.md b/docs/Stepper.md index 06146d3..3f89bea 100644 --- a/docs/Stepper.md +++ b/docs/Stepper.md @@ -29,17 +29,17 @@ Click on either of the driver-specific classes above for complete details on how The **StepperControl** class provides the following methods to operate and control a stepper motor object instantiated with one of the driver-specific classes described above: -* `void enable()` +* `StepperControl *enable()` * enables current flow to the stepper motor coils, actively holding the motor in its position * returns pointer to itself so methods can be daisy-chained * example: `myMotor=(new Stepper_TB6612(23,32,22,14,33,27))->enable();` -* `void disable()` +* `StepperControl *disable()` * disables current flow to the stepper motor coils and leaves them in a state of high impedence, allowing the motor to turn freely * returns pointer to itself so methods can be daisy-chained * example: `myMotor=(new Stepper_TB6612(23,32,22,14,33,27))->disable();` -* `void brake()` +* `StepperControl *brake()` * disables current flow to the stepper motor coils but leaves them in a state of low impedence, preventing the motor from freely turning * applicable only for driver chips that support a "short brake" mode, otherwise has no effect * returns pointer to itself so methods can be daisy-chained From 57a85bf0c8810edfc5cbbad39fafe877a74d195c Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 8 Jul 2023 21:09:48 -0500 Subject: [PATCH 148/151] Bumped version to 1.8.0 in preparation for release --- src/Settings.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Settings.h b/src/Settings.h index 7cafe34..4f9841f 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -35,8 +35,8 @@ // HomeSpan Version // #define HS_MAJOR 1 -#define HS_MINOR 7 -#define HS_PATCH 3 +#define HS_MINOR 8 +#define HS_PATCH 0 #define STRINGIFY(x) _STR(x) #define _STR(x) #x From ff622b507b3b607f0c46d56adf9deded3c7a213b Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 8 Jul 2023 21:17:36 -0500 Subject: [PATCH 149/151] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 066cc1d..6855abf 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ HomeSpan requires version 2.0.0 or later of the [Arduino-ESP32 Board Manager](ht * Launch the WiFi Access Point * A standalone, detailed End-User Guide -## ❗Latest Update - HomeSpan 1.7.3 (MM/DD/2023) +## ❗Latest Update - HomeSpan 1.8.0 (7/8/2023) * **New Stepper Motor Control!** From 16e6db47c1e2dd306c5a99ad443e13b754728f7b Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 8 Jul 2023 21:22:43 -0500 Subject: [PATCH 150/151] Update Reference.md --- docs/Reference.md | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/docs/Reference.md b/docs/Reference.md index 9e2e33c..472c8cb 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -614,24 +614,6 @@ If REQUIRED is defined in the main sketch *prior* to including the HomeSpan libr #include "HomeSpan.h" ``` - --- - -#### Deprecated functions (available for backwards compatibility with older sketches): - -* `SpanRange(int min, int max, int step)` - - * this legacy class was limited to integer-based parameters and has been re-coded to simply call the more generic `setRange(min, max, step)` method - * last supported version: [v1.2.0](https://github.com/HomeSpan/HomeSpan/blob/release-1.2.0/docs/Reference.md#spanrangeint-min-int-max-int-step) - * **please use** `setRange(min, max, step)` **for all new sketches** - -* `void homeSpan.setMaxConnections(uint8_t nCon)` - * this legacy method was used to set the total number of HAP Controller Connections HomeSpan implements upon start-up to ensure there are still free sockets available for user-defined code requiring separate network resources - * last supported version: [v1.4.2](https://github.com/HomeSpan/HomeSpan/blob/release-1.4.2/docs/Reference.md) - * this method has been replaced by the more flexible method, `reserveSocketConnections(uint8_t nSockets)` - * allows you to simply reserve network sockets for other custom code as needed - * upon calling `homespan.begin()`, HomeSpan automatically determines how many sockets are left that it can use for HAP Controller Connections - * **please use** `homeSpan.reserveSocketConnections(uint8_t nSockets)` **for all new sketches** - --- [↩️](../README.md) Back to the Welcome page From 510c3474087002f942c3a3f8d1c3d8798bcaae8f Mon Sep 17 00:00:00 2001 From: HomeSpan Date: Sat, 8 Jul 2023 21:24:04 -0500 Subject: [PATCH 151/151] Update library.properties --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index 6ef42cc..1209647 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=HomeSpan -version=1.7.3 +version=1.8.0 author=Gregg maintainer=Gregg sentence=A robust and extremely easy-to-use HomeKit implementation for the Espressif ESP32 running on the Arduino IDE.
  • EntryUp TimeLog TimeClientMessage
    Up Time:" + String(uptime) + "
    Current Time:" + String(clocktime) + "
    Boot Time:" + String(homeSpan.webLog.bootTime) + "
    Reset Reason Code:" + String(esp_reset_reason()) + "
    Reset Reason Code:" + String(esp_reset_reason()) + " - "; + switch(esp_reset_reason()) { + case ESP_RST_UNKNOWN: + response += "Reset reason can not be determined."; + break; + case ESP_RST_POWERON: + response += "Reset due to power-on event."; + break; + case ESP_RST_EXT: + response += "Reset by external pin (not applicable for ESP32)."; + break; + case ESP_RST_SW: + response += "Software reset via esp_restart."; + break; + case ESP_RST_PANIC: + response += "Software reset due to exception/panic."; + break; + case ESP_RST_INT_WDT: + response += "Reset (software or hardware) due to interrupt watchdog."; + break; + case ESP_RST_TASK_WDT: + response += "Reset due to task watchdog."; + break; + case ESP_RST_WDT: + response += "Reset due to other watchdogs."; + break; + case ESP_RST_DEEPSLEEP: + response += "Reset after exiting deep sleep mode."; + break; + case ESP_RST_BROWNOUT: + response += "Brownout reset (software or hardware)."; + break; + case ESP_RST_SDIO: + response += "Reset over SDIO."; + break; + /* HomeSpan not yet upgraded to support this one.. + case ESP_RST_USB: + response += "Reset by USB peripheral."; + break; + */ + default: + response += "No description available, contact HomeSpan maintainers."; + } + response+="
    WiFi Disconnects:" + String(homeSpan.connected/2) + "
    WiFi Signal:" + String(WiFi.RSSI()) + " dBm
    WiFi Gateway:" + WiFi.gatewayIP().toString() + "
    Current Time:" + String(clocktime) + "
    Boot Time:" + String(homeSpan.webLog.bootTime) + "
    Reset Reason Code:" + String(esp_reset_reason()) + " - "; + response+="
    Reset Reason:"; switch(esp_reset_reason()) { case ESP_RST_UNKNOWN: - response += "Reset reason can not be determined."; + response += "Cannot be determined"; break; case ESP_RST_POWERON: - response += "Reset due to power-on event."; + response += "Power-on event"; break; case ESP_RST_EXT: - response += "Reset by external pin (not applicable for ESP32)."; + response += "External pin"; break; case ESP_RST_SW: - response += "Software reset via esp_restart."; + response += "Software reboot via esp_restart"; break; case ESP_RST_PANIC: - response += "Software reset due to exception/panic."; + response += "Software Exception/Panic"; break; case ESP_RST_INT_WDT: - response += "Reset (software or hardware) due to interrupt watchdog."; + response += "Interrupt watchdog"; break; case ESP_RST_TASK_WDT: - response += "Reset due to task watchdog."; + response += "Task watchdog"; break; case ESP_RST_WDT: - response += "Reset due to other watchdogs."; + response += "Other watchdogs"; break; case ESP_RST_DEEPSLEEP: - response += "Reset after exiting deep sleep mode."; + response += "Exiting deep sleep mode"; break; case ESP_RST_BROWNOUT: - response += "Brownout reset (software or hardware)."; + response += "Brownout"; break; case ESP_RST_SDIO: - response += "Reset over SDIO."; + response += "SDIO"; break; - /* HomeSpan not yet upgraded to support this one.. - case ESP_RST_USB: - response += "Reset by USB peripheral."; - break; - */ default: - response += "No description available, contact HomeSpan maintainers."; + response += "Unknown Reset Code"; } - response+="
    WiFi Disconnects:" + String(homeSpan.connected/2) + "
    WiFi Signal:" + String(WiFi.RSSI()) + " dBm