By giving a pattern to AutoConnectInput, you can find errors in data styles while typing in custom Web pages. The pattern is specified by regular expression.2 If the value during input of AutoConnectInput does not match the regular expression specified in the pattern, its background color changes to pink. The following example shows the behavior when checking the IP address in the AutoConnectInput field.
The lifetime of AutoConnectAux and AutoConnectElements must remain in the period when the custom Web page can be manipulated. The implementation of the custom Web page inherits from requestHandler driven from ESP8266WebServer (WebServer for ESP32), so the instance of AutoConnectAux and AutoConnectElements must exist for the duration of effect of handleClient. The following example is incorrect for manipulating custom Web pages. Its AutoConnectAux instance will be destructed at the exit of the setup().
The transition of the custom Web page follows the URI of the page, but the ESP8266WebServer class does not know the URI of an AutoConnectAux page. (Registering a custom Web page does not use the ESP8266WebServer::on/WebServer::on function.) Therefore ESP8266WebServer class does not detect its URI access. If you want to detect an http request to AutoConnectAux's custom Web page, you need to register its URI with the AutoConnectAux::on function.
In addition to this, there are restrictions in the handler for the custom Web page as shown in the following section.
@@ -1446,12 +1557,21 @@ ESP8266WebServer class will parse the query string and rebuilds its arguments wh
302 Redirect Alternatives
To transition from a custom Web page to a sketch owned page, execute the link function of JavaScript with the AutoConnectElement element.
+
+
The valid scope of the name is within an AutoConnectAux. ↩
+
+
The pattern of AutoConnectInput conforms to javascript specification. ↩
You can embed custom Web pages written in JSON into AutoConnect without declaring AutoConnectAux & AutoConnectElements in sketches. Custom Web page declaration in JSON can be included in the sketch in advance as the fixed string, or it can be stored in the external file such as SPIFFS for stream loading. You can also load and save AutoConnectElements objects individually.1
+
You can embed custom Web pages written in JSON into AutoConnect without declaring AutoConnectAux & AutoConnectElements in sketches. Custom Web page declaration in JSON can be included in the sketch in advance as the fixed string, or it can be stored in the external file such as SPIFFS for stream loading. You can also load and save AutoConnectElements objects individually.1
By providing the following JSON document to AutoConnect, you can include the custom Web page as the bellow:
-
A JSON document for AutoConnect can also contain declarations of multiple custom web pages. If you fit those multiple pages in one JSON document, sketch processing for loading AutoConnectAux will degenerate further.
+
A JSON document for AutoConnect can also contain declarations of multiple custom Web pages. If you fit those multiple pages in one JSON document, sketch processing for loading AutoConnectAux will degenerate further.
Need ArduinoJson v5
To process the AutoConnectAux & AutoConnectElements written in the JSON is you need to install the ArduinoJson version 5 library.
This is a Boolean value indicating whether to include the custom web page in the AutoConnect menu. If the page only responds to another page and you want to prevent the direct use from the menu, you can exclude from the AutoConnect menu. If this key is false, it will not appear in the menu.
+
This is a Boolean value indicating whether to include the custom Web page in the AutoConnect menu. If the page only responds to another page and you want to prevent the direct use from the menu, you can exclude from the AutoConnect menu. If this key is false, it will not appear in the menu.
The order in which AutoConnectElements are placed on a custom web page is the order in the JSON document.
+
The order in which AutoConnectElements are placed on a custom Web page is the order in the JSON document.
Multiple custom Web pages declaration in JSON document¶
You can put declarations of multiple custom Web pages in one JSON document. In that case, declare an array of each custom Web page with JSON. The following JSON document contains three custom Web pages:
@@ -1377,7 +1372,7 @@ An example of using each function is as follows.
AutoConnect passes the given JSON document directly to the parseObject() function of the ArduinoJson library for parsing. Therefore, the constraint of the parseObject() function is applied as it is in the parsing of the JSON document for the AutoConnect. That is, if the JSON string is read-only, duplicating the input string occurs and consumes more memory.
However, AutoConnect does not support saving AutoConnectAux as a whole custom Web page. If you want to persist an AutoConnectElements object, you need to save it as an AutoConenctElement object unit. AutoConnectAux has a function to write multiple elements to the stream in a batch.
+
The sketch can persist AutoConnectElements as a JSON document and also uses this function to save the values entered on the custom Web page. And you can reload the saved JSON document into AutoConnectElements as the field in a custom Web page using the load function.
@@ -1182,18 +1196,18 @@ Also, if you want to stop AutoConnect completely when the captive portal is time
}
-
Cast items of your sketch own into the AutocCnnect menu¶
-
If your sketch is handling your own web page, you can call that page from the AutoConnect menu. Unlike the custom Web pages by AutoConnectAux, this allows AutoConnect menu to legacy web pages registered by ESP8266WebServer::on/WebServer::on function.
-
To implement this with your sketch, use only the AutoConnectAux constructed with the URI of that page. AutoConnectElements is not required. The basic procedure for this as follows.
+
Cast the legacy HTML pages as the add-on menu items¶
+
If your sketch handles web pages, you can embed the pages into the AutoConnect menu with keeping the WiFi connection feature. Unlike the custom Web pages by AutoConnectAux, this allows to legacy web pages registered by ESP8266WebServer::on or WebServer::on function.
+
To implement embedding the your sketch web pages, use only the AutoConnectAux constructed with the URI of that page. AutoConnectElements is not required. The basic procedure for this as follows:
Declare AutoConnectAux for each legacy page. It includes the URI of the page and item string which will display in the AutoConnect menu.
-
Sketch legacy page handlers.
+
Sketch the legacy page handlers.
Register those handler functions to ESP8266WebServer/WebServer with the on function.
Register AutoConnectAux declared with #1 to AutoConnect using AutoConnect::join function. It serves as a menu item.
Although the default menu title is AutoConnect, you can change the title by setting AutoConnectConfig::title. To set the menu title properly, you must set before calling AutoConnect::begin.
The handleClient function of AutoConnect can include the response of the URI handler added by the user using the "on" function of ESP8266WebServer/WebServer. If ESP8266WebServer/WebServer is assigned internally by AutoConnect, the sketch can obtain that reference with the host function.
Parameters
-
webServerA reference of ESP8266WebServer or WebServer instance.
+
webServerA reference of ESP8266WebServer or WebServer instance.
@@ -1079,7 +1093,7 @@
Returns a pointer to AutoConnectAux with the URI specified by uri. If AutoConnectAux with that URI is not bound, it returns nullptr.
Parameters
-
uriA string of the URI.
+
uriA string of the URI.
Return value
A Pointer of the AutoConnectAux instance.
@@ -1095,12 +1109,12 @@ AutoConnect first invokes WiFi.begin. If the ssid and the
The captive portal will not be started if the connection has been established with first WiFi.begin. If the connection cannot establish, switch to WIFI_AP_STA mode and activate SoftAP. Then DNS server starts.
Parameters
-
ssidSSID to be connected.
-
passphrasePassword for connection.
-
timeoutA time out value in milliseconds for waiting connection.
+
ssidSSID to be connected.
+
passphrasePassword for connection.
+
timeoutA time out value in milliseconds for waiting connection.
Return value
-
trueConnection established, AutoConnect service started with WIFI_STA mode.
-
falseCould not connected, Captive portal started with WIFI_AP_STA mode.
+
trueConnection established, AutoConnect service started with WIFI_STA mode.
+
falseCould not connected, Captive portal started with WIFI_AP_STA mode.
voidend()
@@ -1141,13 +1155,13 @@ The captive portal will not be started if the connection has been established wi
The handleRequest function is not supposed to use with AutoConnect::handleClient. It should be used with ESP8266WebServer::handleClient or WebServer::handleClient.
@@ -1185,7 +1199,7 @@ or
Join the AutoConnectAux object to AutoConnect. AutoConnectAux objects can be joined one by one, or joined altogether. The AutoConnectAux object joined by the join function can be handled from the AutoConnect menu.
Parameters
-
auxReference to AutoConnectAux. It can be std::vector of std::reference_wrapper of AutoConnectAux with list initialization.
+
auxReference to AutoConnectAux. It can be std::vector of std::reference_wrapper of AutoConnectAux with list initialization.
boolload(constString&aux)
@@ -1197,10 +1211,10 @@ Join the AutoConnectAux object to AutoConnect. AutoConnectAux objects can be joi
Load JSON document of AutoConnectAux which contains AutoConnectElements. If there is a syntax error in the JSON document, false is returned.
Parameters
-
auxThe input string to be loaded.
+
auxThe input string to be loaded.
Return value
-
trueThe JSON document as AutoConnectAux successfully loaded.
-
falseLoading JSON document unsuccessful, probably syntax errors have occurred or insufficient memory. You can diagnose the cause of loading failure using the ArduinoJson Assistant.
+
trueThe JSON document as AutoConnectAux successfully loaded.
+
falseLoading JSON document unsuccessful, probably syntax errors have occurred or insufficient memory. You can diagnose the cause of loading failure using the ArduinoJson Assistant.
@@ -1272,12 +1285,12 @@ Register the function which will call from AutoConnect at the start of the capti
Register the handler function for undefined URL request detected.
-Returns a pointer to the AutoConnectAux object of the custom web page that caused the request to that page. This function is available only for the AutoConnectAux object. It is invalid for HTTP requests from individual pages registered with the on handler of ESP8266WebServer/ESP32. In other words, this function only returns the last AutoConnecAux page called.
+Returns a pointer to the AutoConnectAux object of the custom Web page that caused the request to that page. This function is available only for the AutoConnectAux object. It is invalid for HTTP requests from individual pages registered with the on handler of ESP8266WebServer/ESP32. In other words, this function only returns the last AutoConnecAux page called.
Retuen value
A pointer to the AutoConnectAux that caused the request the page.
-Add an element to the AutoConnectAux. An added element is displayed on the custom Web page invoked from the AutoConnect menu.
+Add an element to the AutoConnectAux. An added element is displayed on the custom Web page invoked from the AutoConnect menu.
+
+
Parameters
+
addonReference of AutoConnectElements. Specifies one of the AutoConnectElements classes.
+
addonsAn array list of reference of AutoConnectElements. An list initialization of the std::vector can be used for the addons parameter cause the actual definition of type AutoConnectElementVT is std::vector<std::reference_wrapper<AutoConnectElement>>.
Get registered AutoConnectElement as specified name.
+
+Get a registered AutoConnectElement as specified name. If T is specified as an actual type of AutoConnectElements, it returns a reference to that instance.
+
-Get vector of reference of all elements.
+Get vector of reference of all elements.
+
+
Return value
+
A reference to std::vector of reference to AutoConnecctElements.
+
+
The getElements returns a reference to std::vector of reference to AutoConnecctElements. This function is provided to handle AutoConnectElemets owned by AutoConnectAux in bulk, and you can use each method of std::vector for a return value.
+
// An example of getting type and name of all AutoConnectElements registered in AutoConnectAux.
+AutoConnectAuxaux;
+// some code here...
+AutoConnectElementVt&elements=aux.getElements();
+for(AutoConnectElement&elm:elements){
+ Serial.printf("name<%s> as type %d\n",elm.name.c_str(),(int)elm.typeOf());
+}
+
@@ -959,7 +999,24 @@ Get vector of reference of all elements.
boolload(Stream&in)
-Load whole elements to AutoConnectAux Pages.
+Load all AutoConnectElements elements from JSON document into AutoConnectAux as custom Web pages. The JSON document specified by the load function must be the document structure of AutoConnectAux. Its JSON document can describe multiple pages as an array.
+
+
Parameters
+
inSpecifies the JSON document to be load. The load function can input the following objects.
+
+
String : Read-only String
+
PROGMEM : Character array contained in the flash
+
Stream : An entity that inherits stream class, generally SPIFFS or SD.
+
+
Return value
+
trueJSON document as the custom Web pages successfully loaded.
+
falseJSON document loading failed.
+
+
+
+
Load multiple custom Web pages separately
+
Multiple custom Web pages can be loaded at once with JSON as an array. But it will consume a lot of memory. By loading a JSON document by page as much as possible, you can reduce memory consumption.
-Load specified element.
+Load specified element from JSON document into AutoConnectAux. The JSON document specified by the loadElement function must be the AutoConnectElement document structure. When loading from a JSON document that describes multiple elements, its description must be an array syntax.
+
+
Parameters
+
inSpecifies the JSON document to be load. The load function can input the following objects.
+
+
String : Read-only String
+
PROGMEM : Character array contained in the flash
+
Stream : An entity that inherits stream class, generally SPIFFS or SD.
+
+
nameSpecifies the name to be load. If the name is not specified, the loadElement function will load all elements contained in the JSON document.
Please note that the JSON document that is the input for loadElement is an array syntax of AutoConnectElements when there are multiple elements. For example, the following JSON document has a syntax error:
-Set or reset the display as menu item for this AutoConnectAux.
+Set or reset the display as menu item for this AutoConnectAux. This function programmatically manipulates the menu parameter of the AutoConenctAux constructor.
+
voidon(constAuxHandlerFunctionThandler,constAutoConnectExitOrder_torder=AC_EXIT_AHEAD)
@@ -979,9 +1071,8 @@ Set or reset the display as menu item for this AutoConnectAux.
Register the handler function of the AutoConnectAux.
Parameters
-
handlerA function that behaves when a request to the AutoConnectAux page occurs. AuxHandlerFunctionT type is defined by the following declaration.
-
String handler(AutoConnectAux&, PageArgument&)
-
orderSpecifies when the handler is called with the following enumeration value.
+
handlerA function that behaves when a request to the AutoConnectAux page occurs. AuxHandlerFunctionT type is defined by the following declaration.
String handler(AutoConnectAux&, PageArgument&)
+
orderSpecifies when the handler is called with the following enumeration value.
AC_EXIT_AHEAD :
@@ -997,7 +1088,7 @@ Called after AutoConnect generates the HTML of the page. You can append to HTML
AC_EXIT_BOTH :
-Called even before generating HTML and after generated.
+Called even before generating HTML and after generated.
@@ -1006,20 +1097,70 @@ Called even before generating HTML and after generated.
-Release a specified AutoConnectElement.
+Release a specified AutoConnectElement from AutoConenctAux. The release function is provided to dynamically change the structure of the custom Web pages with the sketch. By combining the release function and the add function or the loadElement function, the sketch can change the style of the custom Web page according to its behavior.
+
+
Parameters
+
nameSpecifies the name of AutoConnectElements to be released.
-Write elements of AutoConnectAux to the stream.
+Write elements of AutoConnectAux to the stream. The saveElement function outputs the specified AutoConenctElements as a JSON document using the prettyPrintTo function of the ArduinoJson library.
+
+
Parameters
+
outOutput stream to be output. SPIFFS, SD also Serial can be specified generally.
+
namesThe array of the name of AutoConnectElements to be output. If the names parameter is not specified, all AutoConnectElements registered in AutoConnectAux are output.
+
Return value
+
The number of bytes written.
+
+
+
The output format is pretty
+
The saveElement function outputs a prettified JSON document.
+Sets the value of the specified AutoConnectElement. If values is specified as a std::vector of String, the element that can set the values is the AutoConnectRadio or the AutoConnectSelect.
+
+
Parameters
+
nameSpecifies the name of the AutoConnectElements that you want to set the value.
+
valueSpecifies the value to be set.
+
valuesSpecifies a reference of a std::vector of String. It contains the values of the AutoConnectRadio or the AutoConnectSelect.
+
Return value
+
trueThe value has been set.
+
falseAutoConnectElements with the specified name are not registered. Or the type of the value is not consistent with the specified AutoConnectElements.
+
+
+
You can directly access the value member variable.
+
If you are gripping with the sketch to the AutoConnectElements of the target that sets the value, you can access the value member variable directly. The following sketch code has the same effect.
+
AutoConnectAuxaux;
+// ... Griping the AutoConnectText here.
+aux.setElementValue("TEXT_FIELD","New value");
+
+The difference between the setElementValue and the value access with the getElement is the certainty of the registration state for the element. The getElement returns an empty object if the element is not registered then a sketch assigns the value to it. May occur unexpected results and crashes. You should use the setElementValue if its registration is unsettled.
+
-Set the title string of the AutoConnectAux page.
+Set the title string of the custom Web page. This title will be displayed as the menu title of the custom Web page.
+
+
Parameter
+
titleTitle string to be display.
+
+
+
Not the menu title
+
The setTitle function is not set for the AutoConnect menu title. The effect of this function is that custom Web page only. To change the AutoConnect menu title use AutoConnectConfig::title.
Sets IP address for Soft AP in captive portal. When AutoConnect fails the initial WiFi.begin, it starts the captive portal with the IP address specified this.
Automatically will try to reconnect with the past established access point (BSSID) when the current configured SSID in ESP8266/ESP32 could not be connected. By enabling this option, AutoConnect::begin() function will attempt to reconnect to a known access point using credentials stored in the EEPROM, even if the connection failed by current SSID.
@@ -1158,8 +1172,8 @@ If the connection fails, starts the captive portal in SoftAP + STA mode.
Type
bool
Value
-
trueReconnect automatically.
-
falseStarts Captive Portal in SoftAP + STA mode without trying to reconnect. This is the default.
+
trueReconnect automatically.
+
falseStarts Captive Portal in SoftAP + STA mode without trying to reconnect. This is the default.
When the autoReconnect option is enabled, an automatic connection will behave if the following conditions are satisfied.
@@ -1172,8 +1186,8 @@ If the connection fails, starts the captive portal in SoftAP + STA mode.
Captive portal activation switch. False for disabling the captive portal. It prevents starting the captive portal even if the connection at the first WiFi.begin fails.
@@ -1181,8 +1195,8 @@ If the connection fails, starts the captive portal in SoftAP + STA mode.
Type
bool
Value
-
trueEnable the captive portal. This is the default.
-
falseDisable the captive portal.
+
trueEnable the captive portal. This is the default.
The credential saved automatically at the connection establishment.
@@ -1190,8 +1204,8 @@ If the connection fails, starts the captive portal in SoftAP + STA mode.
Type
AC_SAVECREDENTIAL_t
Value
-
AC_SAVECREDENTIAL_AUTOThe credential saved automatically. This is the default.
-
AC_SAVECREDENTIAL_NEVERThe credential no saved.
+
AC_SAVECREDENTIAL_AUTOThe credential saved automatically. This is the default.
Specify the location to be redirected after module reset in the AutoConnect menu. It is given as an enumeration value of AC_ONBOOTURI_t indicating either the AutoConnect root path or the user screen home path.
@@ -1199,8 +1213,8 @@ If the connection fails, starts the captive portal in SoftAP + STA mode.
Type
AC_ONBOOTURI_t
Value
-
AC_ONBOOTURI_ROOTResetting the module redirects it to the AutoConnect root path. The root path is assumed to be AUTOCONNECT_URI defined in AutoConnectDefs.h.
AC_ONBOOTURI_ROOTResetting the module redirects it to the AutoConnect root path. The root path is assumed to be AUTOCONNECT_URI defined in AutoConnectDefs.h.
Sets the offset address of the credential storage area for EEPROM. This value must be between greater than 4 and less than flash sector size. (4096 by SDK)
@@ -1241,7 +1255,7 @@ The default value is 0.
Sets gateway address for Soft AP in captive portal. When AutoConnect fails the initial WiFi.begin, it starts the captive portal with the IP address specified this.
Sets the home path of user sketch. This path would be linked from 'HOME' in the AutoConnect menu. The default for homeUri is "/".
@@ -1270,20 +1284,20 @@ The default value is 0.
Sets subnet mask for Soft AP in captive portal. When AutoConnect fails the initial WiFi.begin, it starts the captive portal with the IP address specified this.
Specify the timeout value of the captive portal in [ms] units. It is valid when the station is not connected and does not time out if the station is connected to the ESP module in SoftAP mode (ie Attempting WiFi connection with the portal function). If 0, the captive portal will not be timed-out.
Type
-
unsigned longCaptive portal timeout value. The default value is 0.
+
unsigned longCaptive portal timeout value. The default value is 0.
Sets password for SoftAP. The length should be from 8 to up to 63. The default value is 12345678.
@@ -1297,8 +1311,8 @@ The default value is 0.
Type
bool
Value
-
trueContinue the portal function even if the captive portal times out. The STA + SoftAP mode of the ESP module continues and accepts the connection request to the AP.
-
falseWhen the captive portal times out, STA + SoftAP mode of the ESP module is stopped. This is default.
+
trueContinue the portal function even if the captive portal times out. The STA + SoftAP mode of the ESP module continues and accepts the connection request to the AP.
+
falseWhen the captive portal times out, STA + SoftAP mode of the ESP module is stopped. This is default.
A label is an optional string. A label is always arranged on the right side of the checkbox. Specification of a label will generate an HTML <label> tag with an id attribute. The checkbox and the label are connected by the id attribute.
Value of the element. It becomes a value attribute of an HTML <inputtype="text"> tag. An entered text in the custom Web page will be sent with a query string of the form. The value set before accessing the page is displayed as the initial value.
A label is an optional string. A label is always arranged on the left side of the input box. Specification of a label will generate an HTML <label> tag with an id attribute. The input box and the label are connected by the id attribute.
An array of String type for the radio button options. It is an initialization list can be used. The <inputtype="radio"> tags will be generated from each entry in the values.
Specifies the direction to arrange the radio buttons. A label will place in the left or the top according to the order. It is a value of ACArrange_t type and accepts one of the following:
-
-
AC_Horizontal : Horizontal arrangement.
-
AC_Vertical : Vertical arrangement.
+
Specifies the direction to arrange the radio buttons. A label will place in the left or the top according to the order. It is a value of ACArrange_t type and accepts one of the following:
voidcheck(constString&value)
@@ -1849,7 +2054,7 @@ Adds an option for the radio button.
Indicates the check of the specified option for the radio buttons. You can use the check function for checking dynamically with arbitrary of the radio button.
voidempty(constsize_treserve=0)
@@ -1857,7 +2062,7 @@ Indicates the check of the specified option for the radio buttons. You can use t
Clear the array of option strings that AutoConnectRadio has in values. When a reserve parameter is specified, a vector container of that size is reserved.
Parameters
-
reserveReserved size of a container for option strings.
+
reserveReserved size of a container for option strings.
An array of String type for the selection options. It is an initialization list can be used. The <optionvalue> tags will be generated from each entry in the options.
+
Convert AutoConnectElements value to actual data type¶
+
The value of the AutoConnectElements field of the custom Web pages consists of String type for all. Sketches will need to convert them to the actual data type. And then if the data type required for processing in the sketch is not a String type, it is necessary to convert to String type when storing to the AutoConenctElements value.
+
AutoConnect library does not provide the data conversion utility, and its function depends on Arduino language functions or functions of the type class. However, commonly used data conversion methods are generally similar.
+
Here, represent examples the typical method for the data type conversion for the AutoConnectElements value of custom Web pages.
The easiest way is to use the Arduino Time Library. Sketches must accommodate differences in date and time formats depending on the time zone. You can absorb the difference in DateTime format by using sscanf function.1
In order for data to be correctly converted from a string, the input data must be consistent with the format. How to implement strict validation in sketches depends on various perspectives and the power of tiny devices is not enough to implement a complete lexical analysis. But you can reduce the burden for data verification using the pattern of AutoConnectInput.
+
By giving a pattern to AutoConnectInput, you can find errors in data styles while typing in custom Web pages. The pattern is specified by regular expression. If the value during input of AutoConnectInput does not match the regular expression specified in the pattern, its background color changes to pink. Refer to Handling the custom Web pages section.
+
+
Regular Expressions for JavaScript
+
Regular expressions specified in the AutoConnectInput pattern conforms to the JavaScript specification.
+
+
Here, represent examples the typical regular expression for the input validation.
It consumes about 2K bytes in the static and about 12K bytes are consumed at the moment when menu executed.
I cannot complete to Wi-Fi login from smartphone.¶
Because AutoConnect does not send a login success response to the captive portal requests from the smartphone. The login success response varies iOS, Android and Windows. By analyzing the request URL of different login success inquiries for each OS, the correct behavior can be implemented, but not yet. Please resets ESP8266 from the AutoConnect menu.
If the sketch is correct, a JSON syntax error may have occurred. In this case, activate the AC_DEBUG and rerun. If you take the message of JSON syntax error, the Json Assistant helps syntax checking. This online tool is provided by the author of ArduinoJson and is most consistent for the AutoConnect.
AutoConnect behaves not stable with my sketch yet.¶
If AutoConnect behavior is not stable with your sketch, you can try the following measures.
4. Reports the issue to AutoConnect repository on Github¶
-
If you can not solve AutoConnect problems please report to Issues. And please make your question comprehensively, not a statement. Include all relevant information.
+
If you can not solve AutoConnect problems please report to Issues. And please make your question comprehensively, not a statement. Include all relevant information as follows.
+
+
Hardware module
+
Arduino core Version (including the upstream tag ID.)
+
Operating System which you use
+
lwIP variant
+
Problem description
+
If you have a STACK DUMP decoded result with formatted by the code block tag
+
The sketch code with formatted by the code block tag