diff --git a/examples/utility/Provisioning_2.0/CSRHandler.cpp b/examples/utility/Provisioning_2.0/CSRHandler.cpp index 1a6101e4b..8235db14a 100644 --- a/examples/utility/Provisioning_2.0/CSRHandler.cpp +++ b/examples/utility/Provisioning_2.0/CSRHandler.cpp @@ -193,6 +193,42 @@ uint32_t CSRHandlerClass::getTimestamp() { return ts; } +bool CSRHandlerClass::parseDateFromStr(char *str) { + char *tok[3]; + int i = 1; + tok[0] = strtok(str, "-"); + for (; i < 3; i++) { + char *t = strtok(NULL, "-"); + if(t == NULL){ + break; + } + tok[i] = t; + } + if (i < 3) { + return false; + } + + char *day = strtok(tok[2], "T"); + char *time = strtok(NULL, "T"); + + if(time == NULL){ + return false; + } + + char *hour = strtok(time, ":"); + + if(strlen(tok[0]) != 4 || strlen(tok[1]) != 2 || strlen(day) != 2 || strlen(hour) != 2){ + return false; + } + + _issueYear = atoi(tok[0]); + _issueMonth = atoi(tok[1]); + _issueDay = atoi(day); + _issueHour = atoi(hour); + + return true; +} + CSRHandlerClass::CSRHandlerStates CSRHandlerClass::handleBuildCSR() { if (!_certForCSR) { _certForCSR = new ECP256Certificate(); @@ -296,7 +332,7 @@ CSRHandlerClass::CSRHandlerStates CSRHandlerClass::handleParseResponse() { if(i < 6 || strlen(token[0]) != 36 || strlen(token[1]) != 40 || strlen(token[2]) < 10 || strlen(token[3]) != 32 || strlen(token[4]) != 64 || strlen(token[5]) != 64 - || sscanf(token[2], "%4d-%2d-%2dT%2d", &_issueYear, &_issueMonth, &_issueDay, &_issueHour) != 4){ + || !parseDateFromStr(token[2])){ updateNextRequestAt(); DEBUG_ERROR("CSRH::%s Error parsing response, retrying in %d ms", __FUNCTION__, _nextRequestAt - millis()); return CSRHandlerStates::REQUEST_SIGNATURE; diff --git a/examples/utility/Provisioning_2.0/CSRHandler.h b/examples/utility/Provisioning_2.0/CSRHandler.h index ae5956b7e..dcc2bc479 100644 --- a/examples/utility/Provisioning_2.0/CSRHandler.h +++ b/examples/utility/Provisioning_2.0/CSRHandler.h @@ -63,6 +63,7 @@ class CSRHandlerClass { uint32_t jitter(uint32_t base = JITTER_BASE, uint32_t max = JITTER_MAX); bool postRequest(const char *url, String &postData); uint32_t getTimestamp(); + bool parseDateFromStr(char *str); CSRHandlerStates handleBuildCSR(); CSRHandlerStates handleRequestSignature(); CSRHandlerStates handleWaitingResponse(); diff --git a/examples/utility/Provisioning_2.0/FactoryTester.h b/examples/utility/Provisioning_2.0/FactoryTester.h new file mode 100644 index 000000000..c29e152ba --- /dev/null +++ b/examples/utility/Provisioning_2.0/FactoryTester.h @@ -0,0 +1,80 @@ +/* + Copyright (c) 2025 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#pragma once +#include +#include + +#ifdef BOARD_USE_NINA +#include "WiFiNINA.h" +#include "utility/wifi_drv.h" +#endif + +inline void LedFactoryTest() { +#if defined(BOARD_HAS_RGB) +#if defined(BOARD_USE_NINA) + // MKR WiFi 1010, RP2040 Connect + WiFiDrv::pinMode(GREEN_LED, OUTPUT); + WiFiDrv::digitalWrite(GREEN_LED, LED_OFF); + WiFiDrv::pinMode(BLUE_LED, OUTPUT); + WiFiDrv::digitalWrite(BLUE_LED, LED_OFF); + WiFiDrv::pinMode(RED_LED, OUTPUT); + WiFiDrv::digitalWrite(RED_LED, LED_OFF); + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, LED_OFF); + + for(uint8_t i = 0; i<2; i++){ + digitalWrite(LED_BUILTIN, LED_ON); + WiFiDrv::digitalWrite(RED_LED, LED_ON); + delay(300); + digitalWrite(LED_BUILTIN, LED_OFF); + WiFiDrv::digitalWrite(RED_LED, LED_OFF); + WiFiDrv::digitalWrite(GREEN_LED, LED_ON); + delay(300); + digitalWrite(LED_BUILTIN, LED_ON); + WiFiDrv::digitalWrite(GREEN_LED, LED_OFF); + WiFiDrv::digitalWrite(BLUE_LED, LED_ON); + delay(300); + digitalWrite(LED_BUILTIN, LED_OFF); + WiFiDrv::digitalWrite(BLUE_LED, LED_OFF); + delay(200); + } +#else + // Portenta H7, Giga, Nicla Vision, Portenta C33 + pinMode(GREEN_LED, OUTPUT); + digitalWrite(GREEN_LED, LED_OFF); + pinMode(RED_LED, OUTPUT); + digitalWrite(RED_LED, LED_OFF); + pinMode(BLUE_LED, OUTPUT); + digitalWrite(BLUE_LED, LED_OFF); + for(uint8_t i = 0; i<2; i++){ + digitalWrite(RED_LED, LED_ON); + delay(300); + digitalWrite(RED_LED, LED_OFF); + digitalWrite(GREEN_LED, LED_ON); + delay(300); + digitalWrite(GREEN_LED, LED_OFF); + digitalWrite(BLUE_LED, LED_ON); + delay(300); + digitalWrite(BLUE_LED, LED_OFF); + delay(200); + } +#endif +#else // Nano 33 IoT + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, LED_OFF); + uint32_t start = millis(); + while(millis() - start < 2000) { + digitalWrite(LED_BUILTIN, LED_ON); + delay(300); + digitalWrite(LED_BUILTIN, LED_OFF); + delay(300); + } +#endif + +} diff --git a/examples/utility/Provisioning_2.0/Provisioning_2.0.ino b/examples/utility/Provisioning_2.0/Provisioning_2.0.ino index 7f8f44ceb..c06e3d087 100644 --- a/examples/utility/Provisioning_2.0/Provisioning_2.0.ino +++ b/examples/utility/Provisioning_2.0/Provisioning_2.0.ino @@ -14,8 +14,8 @@ #include #include #include "utility/LEDFeedback.h" - -const char *SKETCH_VERSION = "0.3.3"; +#include "FactoryTester.h" +const char *SKETCH_VERSION = "0.5.0"; enum class DeviceState { HARDWARE_CHECK, @@ -57,6 +57,11 @@ void setup() { setDebugMessageLevel(4); initProperties(); + + #if !defined(ARDUINO_OPTA) && !defined(ARDUINO_UNOR4_WIFI) + LedFactoryTest(); + #endif + AgentsManagerClass::getInstance().begin(); LEDFeedbackClass::getInstance().begin(); DEBUG_INFO("Starting Provisioning version %s", SKETCH_VERSION); diff --git a/examples/utility/Provisioning_2.0/SecretsHelper.h b/examples/utility/Provisioning_2.0/SecretsHelper.h index bdb6354d1..fba33e25b 100644 --- a/examples/utility/Provisioning_2.0/SecretsHelper.h +++ b/examples/utility/Provisioning_2.0/SecretsHelper.h @@ -14,6 +14,11 @@ inline String GetUHWID() { UniqueHWId Id; if (Id.begin()) { +#ifdef ARDUINO_NANO_RP2040_CONNECT + /*Delay added for avoiding device crashes + on Nano RP2040 Connect when reading the UHWID */ + delay(100); +#endif return Id.get(); } return ""; diff --git a/examples/utility/Provisioning_2.0/thingProperties.h b/examples/utility/Provisioning_2.0/thingProperties.h index 7f51fa6ca..9d2a6cdd7 100644 --- a/examples/utility/Provisioning_2.0/thingProperties.h +++ b/examples/utility/Provisioning_2.0/thingProperties.h @@ -12,6 +12,7 @@ #include #include #include +#include "Arduino_NetworkConfigurator.h" #include "configuratorAgents/agents/BLEAgent.h" #include "configuratorAgents/agents/SerialAgent.h" diff --git a/src/AIoTC_Config.h b/src/AIoTC_Config.h index b0fba96a3..bd1187765 100644 --- a/src/AIoTC_Config.h +++ b/src/AIoTC_Config.h @@ -155,7 +155,8 @@ #endif #if defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_OPTA) || defined(ARDUINO_GIGA) \ - || defined(ARDUINO_UNOR4_WIFI) || defined(ARDUINO_PORTENTA_C33) + || defined(ARDUINO_UNOR4_WIFI) || defined(ARDUINO_PORTENTA_C33) || defined(ARDUINO_NANO_RP2040_CONNECT) \ + || defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) #define NETWORK_CONFIGURATOR_ENABLED (1) #else #define NETWORK_CONFIGURATOR_ENABLED (0)