
// ███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
// ██                                                   ██                                                                                                          ██
// ██     ██╗          ████████╗           ███████╗     ██   Micro OS pour Arduino R4 Minima et Ethernet Shield version 2 (W5500)              Biechy Jean-Marc     ██
// ██     ██║  ██████  ╚══██╔══╝  ██████   ██╔════╝     ██    - Shell CLI en Serial et Telnet                                                radiobiechy@gmail.com  ██
// ██     ██║ ██    ██╗   ██║    ██    ██╗ ███████╗     ██    - Serveur WEB FTP (index.htm confIP.htm sur carte SD)                                                 ██
// ██     ██║ ██    ██║   ██║    ██    ██║      ██║     ██    - Gestionnaire de Fichier : SDCARD                                                                    ██
// ██     ██║  ██████╔╝   ██║     ██████╔╝ ███████║     ██    - Datalogger                                                                                          ██
// ██     ╚═╝   ╚════╝    ╚═╝      ╚════╝  ╚══════╝     ██   Institution Saint-Jean -- Ecole d'Electronique Informatique et Reseau -- Colmar France 2026            ██
// ██                                                   ██                                                                                                          ██
// ███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████     
/*
* Version Arduino UNO Rev 4 Minima - Ethernet Shield version 2 (W5500) - Grove Base Shield 
*
*
*
*
*  ┌───────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ 
*  │ [ IoToS ] │ Internet of Things OS                                        Arduino UNO Rev 4 Minima - Renesas RA4M1                           │
*  ├───────────┼──────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────┤ 
*  │   [CLI]   │ Shell cmdLine : Serial / Telnet / Bluetooth (ESP32)      │ - TAB : Autocompletion                                               │ 
*  │           │ - Fleches Haut/Bas : Historique                          │ - login / password sur Serial et Telnet                              │ 
*  │           │ (Mini MS-DOS)                                            │ - dir -- rename -- del -- type -- copie                              │ 
*  ├───────────┼──────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤ 
*  │   [SD]    │ Gestion Fichiers Micro SD  ou  LittleFS sur ESP          │ - Arduino UNO SD Card sur Ethernet Shield V2 port SD                 │ 
*  ├───────────┼──────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤ 
*  │   [NET]   │ Config : ip -- subnet -- gateway -- mac -- dhcp          │ - Outils : Ping complet  --  tracert <URL>  --  netstat              │ 
*  │           │          port WEB (80)                                   │ - Horloge NTP (synchronisation temps Internet)                       │ 
*  ├-──────────┼──────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤ 
*  │   [WEB]   │ Serveur HTTP AJAX (port 80)                              │ - Authentification Login/Password Base64  ON/OFF                     │ 
*  │           │ Pages htm/css stockees sur Micro SD Card                 │ - Modification Login:Password : base64encode.org                     │ 
*  │           │ Commande LED Arduino par boutons CSS                     │ - Configuration IP Ethernet par page WEB                             │ 
*  ├───────────┼──────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤ 
*  │   [FTP]   │ Serveur FTP (port 21)                                    │ - Acces Micro SD Card  (site WEB + fichiers Datalogger)              │ 
*  ├───────────┼──────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤ 
*  │   [LOG]   │ Datalogger Excel (csv) sur Micro SD                      │ - Horodatage NTP  --  Etat LED  --  Evenements                       │ 
*  ├───────────┼──────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤ 
*  │   [EEP]   │ Sauvegarde des Parametres Systeme sur EEPROM Interne     │ - Fonctions : save -- reload -- defaults reset (reboot + load EEPROM)│ 
*  └-──────────┴──────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────┘ 
*
* Mini DOC a la fin du fichier 
*
************************************************************************************************************************************************************
* IDE 2.3.7 (IDE 1.x.x Bug ethernet IP Fixe)
* Carte : Outils --> Type de carte --> Arduino UNO R4 Minima
* Fichier sur carte Micro SD : Micro SD FAT32 System MSDOS : Nom Fichiers Long
* Ethernet - Arduino UNO R4 Minima Librairie : 1.5.3 -- Ethernet@2.0.2
* Copier les autre Libraire dans le sous repertoire \Mes Documents\Arduino\libraries\
* Attention certaine librairies ont ete mis a jours pour l'Arduino R4 Minima
*
* Le croquis utilise 142980 octets (54%) de l'espace de stockage de programmes. Le maximum est de 262144 octets.
* Les variables globales utilisent 13820 octets (42%) de memoire dynamique, ce qui laisse 18948 octets pour les variables locales. Le maximum est de 32768 octets.
* Le maximum est de 32768 octets.
* Un double appui rapide sur RESET active le bootloader : permet de televerser le programme 
************************************************************************************************************************************************************
* 
************************************************************************************************************************************************************
*     ## Librairie :
************************************************************************************************************************************************************
* Arduino Serial Commande Line (cmdLine)                   : Attention Librairie Modifiee a cause du Telnet !!!!!!
* Version originale : https://github.com/IndustrialShields/arduino-cmdLine
* Rechercher version : cmdLineTelnet_SD
*
* Lib Gestion carte SDFat version 2.3.1
* GitHub - greiman-SdFat- Arduino FAT16-FAT32 exFAT Library
*
* Arduino SimpleFTPServer-master
* https://github.com/xreef/SimpleFTPServer
* https://mischianti.org/category/my-libraries/simple-ftp-server/#google_vignette
*
* NTPClient2 (temps Internet)
* https://phatiphatt.wordpress.com/esp32-date-and-time-ntp-client/
*
* LCD TFT - I2C - 128x64 - GM12864-59N VER2.0 -----  ST7567S -- U8g2-2.35.30
* U8G2_ST7567_ENH_DG128064I_F_SW_I2C u8g2(U8G2_R0, SCL, SDA, U8X8_PIN_NONE);
* https://www.arduinolibraries.info/libraries/u8g2?utm_source=chatgpt.com
*
* Ping EthernetICMP
* https://github.com/andrew-susanto/Arduino-Ethernet-Icmp?utm_source=chatgpt.com
* 
* 
* MemoryFree  
* https://github.com/mpflaga/Arduino-MemoryFree
*
* Watchdog 
*
***********************************************************************************************************************************************************
* IoToS - Internet of Things Operating System                                                                                                             *
* Firmware : Telnet CLI | Serveur WEB | FTP | NTP | SD | Ethernet W5500 | OLED ST7567                                                                     *
* Plateforme : Arduino UNO R4 Minima - Renesas RA4M1 / ARM Cortex-M4                                                                                      *
* Licence    : GNU LGPL v2.1  https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html                                                                     *
***********************************************************************************************************************************************************
* DROITS ACCORDES                                OBLIGATIONS (redistribution uniquement)                                                                  *
* - Usage libre y compris commercial             - Distribuer les sources IoToS modifiees                                                                 *
* - Modification des fichiers IoToS              - Conserver les en-tetes de copyright                                                                    *
* - Integration dans un firmware proprietaire    - Mentionner l'usage d'IoToS et sa licence                                                               *
* - Code applicatif (.ino) reste votre propriete - Ne pas ajouter de restrictions suppl.                                                                  *
*                                                                                                                                                         *
***********************************************************************************************************************************************************
* BIBLIOTHEQUES TIERCES - chacune conserve sa licence d'origine                                                                                           *
*----------------------+---------+-------------------+-------+------------------------------------------+-------------------------------------------------*
* Bibliotheque         | Version | Licence           | Mod.  | Depot                                    | Obligation                                      *
*----------------------+---------+-------------------+-------+------------------------------------------+-------------------------------------------------*
* Arduino-MemoryFree   | -       | Beerware          | Non   | github.com/sudar/MemoryFree              | Aucune                                          *
* EthernetICMP         | -       | LGPL v2.1 (*)     | OUI   | Bluebird-Software/Arduino-Ethernet-Icmp  | Distribuer .h/.cpp modifies                     *
* NTPClient2           | -       | MIT               | OUI   | arduino-libraries/NTPClient              | Conserver copyright                             *
* SdFat                | v2.x    | MIT (**)          | Non   | github.com/greiman/SdFat                 | Conserver copyright                             *
* SimpleFTPServer      | -       | MIT               | Non   | github.com/xreef/SimpleFTPServer         | Conserver copyright                             *
* U8g2 (code)          | 2.35.30 | BSD 2-Clause      | Non   | github.com/olikraus/U8g2_Arduino         | Conserver copyright                             *
* U8g2 (polices)       | 2.35.30 | OFL/MIT/BSD/Adobe | Non   | olikraus/u8g2/wiki/fntgrp (par police)   | Verifier par police                             *
*----------------------+---------+-------------------+-------+------------------------------------------+-------------------------------------------------*
*                                                                                                                                                         *
* (*) EthernetICMP : licence duale GPL v2 / LGPL v2.1 - IoToS choisit LGPL v2.1.                                                                          *
*     Modif. RA4M1  : ping W5500, TRACERT TTL 1-30, timeout ARM, socket AVR->EthernetUDP.                                                                 *
*                                                                                                                                                         *
* (**) SdFat v1.x etait GPL v3 - utiliser exclusivement v2.x (MIT).                                                                                       *
*      Modif. RA4M1 : SPI_SD_ON/ETH_ON dans FtpServer.cpp, SPI->SD->Wire, SdFat/SdFile v2.                                                                *
*                                                                                                                                                         *
* NTPClient2      mod. : getFormattedDateTime() JJ/MM/AAAA HH:MM:SS, getDayOfWeek() FR,                                                                   *
*                        backend EthernetUDP W5500, offset UTC+1/+2.                                                                                      *
* SimpleFTPServer mod. : fix DEBUG_PRINT (#ifndef guard), SPI_SD_ON/OFF autour acces SD.                                                                  *
* U8g2            mod. : boot I2C apres SPI (SPI>SD>Wire>LCD>ETH), adr 0x3F*2, PROGMEM logo.                                                              *
*                                                                                                                                                         *
***********************************************************************************************************************************************************
* GARANTIE : FOURNI EN L'ETAT SANS GARANTIE. AUTEUR NON RESPONSABLE DES DOMMAGES RESULTANTS.                                                              *
***********************************************************************************************************************************************************
* Auteur   : Jean-Marc Biechy     ---     Ecole d'Electronique Informatique et Reseau : Institution Saint-Jean Colmar France      ---    Date : 1/03/2026 *
***********************************************************************************************************************************************************/

//
// ██╗       ██████╗   █████╗  ██████╗        ███████╗ ██╗ ██████╗  ███    ███╗ ██     ██╗  █████╗  ██████╗  ███████╗
// ██║      ██╔═══██╗ ██   ██╗ ██╔══██╗       ██╔════╝ ██║ ██   ██╗ ████  ████║ ██     ██║ ██   ██╗ ██   ██╗ ██╔════╝
// ██║      ██║   ██║ ███████║ ██║  ██║       █████╗   ██║ ██████╔╝ ██║████╔██║ ██  █  ██║ ███████║ ██████╔╝ █████╗
// ██║      ██║   ██║ ██╔══██║ ██║  ██║       ██╔══╝   ██║ ██╔══██╗ ██║ ██╔╝██║ ██ ███ ██║ ██╔══██║ ██╔══██╗ ██╔══╝
// ███████╗ ╚██████╔╝ ██║  ██║ ██████╔╝       ██║      ██║ ██║  ██║ ██║ ╚═╝ ██║  ███╔███╔╝ ██║  ██║ ██║  ██║ ███████╗
// ╚══════╝  ╚═════╝  ╚═╝  ╚═╝ ╚═════╝        ╚═╝      ╚═╝ ╚═╝  ╚═╝ ╚═╝     ╚═╝  ╚══╝╚══╝  ╚═╝  ╚═╝ ╚═╝  ╚═╝ ╚══════╝
//
/***********************************************************************************************************************************************************/
// #####   ----   Declaration Librairie   ----    #####
/***********************************************************************************************************************************************************/
// Declaration Librairie
const char* hostname = "PriseIP_UNO_R4";                                            // Nom de l'Arduino en DHCP ?????

// ---------->  Watchdog UNO R4


// ---------->  EEPROM bus SPI
#include <EEPROM.h>                                                                 // 8ko EEPROM -- Librairie LOCAL de l'IDE d'Arduino : Librairie eeprom 
#include <SPI.h>                                                                    // SPI I2C    -- Librairie LOCAL de l'IDE d'Arduino

// ---------->  Librairie Commande Line CmdLine CLI -- serial / Telnet
#include <CmdLine.h>
                                                                                      //            CmdLineKey.h detecte ARDUINO_ARCH_RENESAS → inclut Ethernet.h + typedef EthernetClient/Server

// ---------->  Initialisation Carte Reseau : Arduino UNO rev4 minima et shield ethernet2 (A000024 W5500)
// #include <Ethernet.h>
// Define Chip Select for your SD card according to hardware // #define CS_SDCARD 4       // SD card reader of Ehernet shield
// Define Reset pin for W5200 or W5500  // set to -1 for other ethernet chip or if Arduino reset board is used
// #define W5x00_RESET -1

// ---------->  Initialisation Carte SD : SdFat-master SdFat version 2.3.1
// Activer les noms longs (LFN) dans SdFat : Ouvrir SdFatConfig.h et chercher les lignes suivantes #define USE_LONG_FILE_NAMES 1 -- #define SDFAT_FILE_TYPE 1  ou #define SDFAT_FILE_TYPE 3 off    mais bug carte micro sd
//#include <SPI.h>
#include <SdFat.h>
#define SD_CS   4                                                                   // Selection carte SD
#define ETH_CS 10                                                                   // Selection carte Reseau

SdFat sd;                                                                           // SdFs sd;
FsFile root;
boolean microSD = 0;                                                                // 0 OFF / 1 ON Micro SD Card et partion Fichiers

// ---------->  DNS
#include <Dns.h>
IPAddress timeServer;                                                               // https://services.renater.fr/ntp/serveurs_francais
DNSClient dns;                                                                      // initialisation pour dns.begin(Ethernet.dnsServerIP());

// ---------->  Time NTP : Temps Internet
#include <NTPClient.h>                                                              // A besoin du DNS
//#include <EthernetUdp.h>
EthernetUDP ntpUDP;
NTPClient timeClient(ntpUDP);
// Vous pouvez specifier le pool de serveurs de temps et le decalage (en secondes, peut etre change plus tard avec setTimeOffset ()). De plus, vous pouvez specifier le
// intervalle de mise a jour (en millisecondes, peut etre modifiee a l'aide de setUpdateInterval ()). NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);
// NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);   // IPAddress timeServer;     // NTP server address
char date[10] = {0};

// ---------->  FTP _DOC Version ---   SimpleFTPServer 3.0.2 ok UNO Rev4 ok
// A mettre dans le fichier D:\Documents\Arduino\libraries\SimpleFTPServer-master\FtpServer.h
//#undef DEFAULT_STORAGE_TYPE_ARDUINO
//#define DEFAULT_STORAGE_TYPE_ARDUINO  STORAGE_SDFAT2                                //#define DEFAULT_STORAGE_TYPE_ARDUINO STORAGE_SDFAT1 off
#include <FtpServer.h>
FtpServer ftpSrv;                                                                     //set #define FTP_DEBUG in ESP8266FtpServer.h to see ftp verbose on serial
char etatFTP = 2;                                                                     // Met etatFTP a 2 au cas ou il est en off  ::  etatFTP = 2 pas connecte -- 3 4 5 109 en cours connexion -- 5 connecte -- 77 copie en cours

// Fichier CSV
String fileTxt; 
EthernetServer serverFTP(21);
//EthernetClient hasClient;

// ---------->  Initialisation de la Librairie Ethernet WEB Server -------------------
//#include <EthernetClient.h> //#include <EthernetUdp.h>
EthernetServer server(80);

// ---------->  Initialisation de la Librairie Client Telnet 
CmdLineServer serverTelnet(23);
CmdLineClient clientTelnet;
boolean premiereConnexionTelnet = 1;                                                  // variable de demarrage (pour nexecuter qu'une foi l intro
unsigned long timeoutDeconnexionTelnet = 0;                                           // pour remettre premiereConnexionTelnet = 1 execute intro
const int telnetTimeDuree = 2 * 60 * 1000;                                            // duree 

// ---------->  Librairie Commande Line CmdLine CLI -- serial / Telnet
CmdLine cmdLine(Serial);
#define countof(commands) (sizeof(commands)/sizeof(commands[0]))
boolean cliEcho = true;                                                               // Desactive l'echo de la lib cmdLine pour MobaXtern (evite bug de double lettre 

// ---------->  Print RAM Free
#include <MemoryFree.h>
#include <pgmStrToRAM.h>

// ---------->  Ping ICMP ----------                                                  // Version LIB modifiee pour tracert
#include <utility/w5100.h>                                                            // Pour Netstat
#include <EthernetICMP.h>
SOCKET pingSocket = 7;
char buffer [256];
EthernetICMPPing ping(pingSocket, (uint16_t)random(0, 255));
//EthernetICMPPing *ping;     // objet cree plus tard dans setup()


/***********************************************************************************************************************************************************/
// #####   ----   Variables et Constantes Globales Programme    ----    #####
/***********************************************************************************************************************************************************/
// Parametre de la carte Reseau                             
IPAddress myDNS(1,1,1,1);                               // Cloudflare
//const byte DNS1[] = { 4, 4, 4, 4 };                   // DNS  //const byte dnsIP0[] = { 8, 8, 8, 8 };   const byte DNS1[] = { 212, 27, 40, 240 }; // DNS Free  //const byte DNS0[] = { 89, 2, 0, 1 };                  // DNS

// Variable Structure EEPROM
#define VALID        100000101                          // Pour valider les Info dans l'EEPROM : si on reprogramme une ancienne version sur une nouvelle il faut un nombre qui permet de voir que ce n'est pas la meme strucure sinon bug et les valeurs de l'ancien se melange avec la nouvelle structure

typedef struct {                                        // https://www.squalenet.net/fr/ti/tutorial_c/14-structures-unions.php5
  uint32_t validity;                                    // ID Cette variable permet de verifier que l'EEPROM a deja ete programme par ce programme Valeur de test pour savoir si des donnes sont valid en EEPROM (de type Adresse IP)
  char nameSystem[40];                                  // Nom du system
  char telnetPassword[40];                              // Mot de passe connexion cmdLine et Telnet  
  boolean login_cmdTelnetSwitch;                        // Validation a l acces du cmdLine et au telnet 1 Active password // 0 Desactive
 
  boolean SrvWEBswitch;                                 // Switch Serveur WEB
  boolean SrvFTPswitch;                                 // Switch Serveur FTP
     
  uint8_t mac[6];                                       // local MAC address
  boolean dhcp;                                         // Arduino configure en IP STATC = 0 // Arduino configure en IP DHCP = 1 
  uint8_t ip[4];                                        // local IP address
  uint8_t subnet[4];  
  uint8_t gateway[4];
  uint16_t port;                                        // Port serveur WEB

  boolean loginWEB;                                     // ON / OFF : Login et Password du site WEB
  char loginPasswordWEB[40];                            // dXNlcjpwYXNz = 'user:pass' (user:pass) base64  /////  (admin:01_Admin YWRtaW46MDFfQWRtaW4=)   https://www.base64encode.org/ 

  char loginFTP[40];
  char passwordFTP[40];
  
// Datalogger
  boolean dataloggerSwitch;                             // Valide Datalogger
  char fichierEnCours[40];
  unsigned char lcdRetro;                               // retroeclairage
  char timeReboot[25];                                  // temps du dernier reboot "YYYY-MM-DDTHH:MM:SSZ"

} conf_t;
conf_t conf;                                            // conf est la variable structure avec les information conf.ip[] , conf.subnet[] ....
conf_t conf_TMP;

// Definition des valeurs Reseau par defaut
// Shell_CmdLine_SD.h et Driver_Ethernet_Reseau.h utilisent default_conf
// IoToS_User.h est inclus APRES les .h internes → la definition y est visible au bon moment
extern const conf_t default_conf;

// Nom du Fichier ino : Attention il faut creer le __FILE__ dans le fichier principal (ino)   // https://forum.arduino.cc/t/filename-ino-as-string-variable/583738/20
  String ino = __FILE__;
//  ino = (ino.substring((ino.indexOf(".")), (ino.lastIndexOf("\\")) + 1));
  String date_ino = __DATE__;
  String time_ino = __TIME__;
  
// Declaration Valeurs programme (Etiquette = Valeur) 
unsigned char adressBase = 5;                               // Adresse de base de depart de l'ecriture des DATA en EEPROM
boolean etatWAN = 0;                                        // Etat connexion Internet (google DNS)
boolean dhcpEtat = 0;                                       // Etat du mode de la carte reseau ( basculement automatique en mode dhcp si l aconfiguration reseau de l'Arduino est fausse)

const char * fichierSD_datalogger = "datalogger.csv";       // Nom du Fichier copier dans la partition SD !!! Voir procedure pour televerser le fichier !!!!
const char * formatCSV = "Date ; Heure ; Etat LED";         // Entete du Fichier Excel

// Serial
unsigned long startSerial = millis();
boolean premiereConnexionSerial = 1;
boolean connexionTelnet = 0;
boolean etatPrecedentConnexionSerial = 0;
boolean etatActuelConnexionSerial = 0;

// Login Telnet
unsigned long nbrEssaiLoginTelnet = 30;                     // Nombre d'essai login Telnet : base 30 sec
unsigned long previousMillisTelnet = 0;                     // Time entre deux essai Telnet


// Coeur LED LED_BUILTIN
boolean toggle = 0;                                         // Variable de bascule pour le clignotement LED coeur
unsigned long previousMillisCoeur = 0;               // Horodatage pour clignotement LED coeur (mode WiFi)

// Variable commune a plusieurs Fonctions (Variable de Transfert inter Fonctions)


/***********************************************************************************************************************************************************/
// #####   ----   Declaration Include et Fonctions    ----    #####
/***********************************************************************************************************************************************************/
// Fonction utilisee par plusieurs header .h               // Creation de la Fonction pour que la compilation ne BUG pas -- Les Fonctions sont plus bas 
void InfoVersion();                                        // Fonction Affichage Version
void Datalogger();                                         // SousProg : Appel Datalogger enregistrement dans conf.fichierEnCours
void ServeurWEB(EthernetClient &client);                   // SousProg : ServeurWEB             
byte parseNibble(const char *arg);                         // Affichage Adresse MAC
byte parseByte(const char *arg);                           // Affichage Adresse MAC
void PrintMAC(uint8_t mac[6]);                             // Affichage Adresse MAC
boolean TestValidityIPadress(IPAddress ip, IPAddress subnet, IPAddress gateway); // Fonction Test validite adresse IP <--> MSR  <--> Pass

// -----------------------------------------------------------------------
// Forward declarations IoToS_User.h
// IoToS_User.h est inclus APRES IoToS_Firmware.h dans le sketch.
// Shell_CmdLine_SD.h appelle PrintConf_user() → doit etre declaree ici.
// IoToS_Boot_Driver.h appelle addCommands(user_commands, ...) → extern ici.
// -----------------------------------------------------------------------
void PrintConf_user(const char *arg);
extern const cmd_t user_commands[];
extern size_t user_commands_count;

// Fichier include header (en .h) (Sous Programme)
// Ordre obligatoire : chaque fichier utilise ce qui est defini avant lui
#include <Utils_Common.h>          // 1) Utilitaires communs : OK/FAILED/INIT/VIDE, Datalogger, PrintMAC, TestValidityIPadress
#include <Shell_CmdLine_SD.h>      // 2) Shell CLI : commands[] systeme + toutes les fonctions CLI — appelle PrintConf_user()
#include <App_ServeurWEB.h>        // 3) Serveur WEB : ServeurWEB, PageWEB, SendFile -- extern user_routes[] declares dans App_ServeurWEB.h
#include <Driver_Ethernet_Reseau.h>// 4) Init Ethernet + NTP : Initialisation_Ethernet
#include <IoToS_Boot_Driver.h>     // 5) IoToS_Boot() : setup complet — appelle addCommands(user_commands, user_commands_count)
#include <IoToS_Kernel.h>          // 6) IoToS_Kernel() : loop complet
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
