
// ███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
// ██                                                   ██                                                                                                          ██
// ██     ██╗          ████████╗           ███████╗     ██   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            ██
// ██                                                   ██                                                                                                          ██
// ███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████     


void InfoSerial() {
  Serial.println(); Serial.println(); Serial.println(); Serial.println();
  Serial.println(F(" -- La vitesse de transmission SERIAL est de 115200 Bauds -- "));
  Serial.println(F(" --       Configurer votre PC (IDE Arduino ou PUTTY)      -- ")); 
  Serial.println(); Serial.println(); Serial.println(); Serial.println();
}
//
//  ██████╗    ██████╗    ██████╗  ████████╗       ██╗       ██████╗   █████╗  ██████╗  ███████╗ ██████╗ 
//  ██╔══██╗  ██╔═══██╗  ██╔═══██╗ ╚══██╔══╝       ██║      ██╔═══██╗ ██   ██╗ ██╔══██╗ ██╔════╝ ██╔══██╗
//  ██████╔╝  ██║   ██║  ██║   ██║    ██║          ██║      ██║   ██║ ███████║ ██║  ██║ █████╗   ██████╔╝
//	██╔══██╗  ██║   ██║  ██║   ██║    ██║          ██║      ██║   ██║ ██╔══██║ ██║  ██║ ██╔══╝   ██╔══██╗
//  ██████╔╝  ╚██████╔╝  ╚██████╔╝    ██║          ███████╗ ╚██████╔╝ ██║  ██║ ██████╔╝ ███████╗ ██║  ██║
//  ╚═════╝    ╚═════╝    ╚═════╝     ╚═╝          ╚══════╝  ╚═════╝  ╚═╝  ╚═╝ ╚═════╝  ╚══════╝ ╚═╝  ╚═╝
// 
/***********************************************************************************************************************************************************/
//#####   ----   Initialisation (Setup)       
/***********************************************************************************************************************************************************/
void IoToS_Boot() {
// Configuration PORT IO Arduino IO LED_BUILTIN  
  OK();   Serial.print  (F("## PORT I/O Initialisation LED_BUILTIN "));
  pinMode(LED_BUILTIN, OUTPUT);                                                                     // LED de l'Arduino D13
  digitalWrite(LED_BUILTIN, HIGH);                                                                   // LED de l'Arduino -->  1 : ON  // 0 : OFF
  
  delay(2000);
  
  
// Initialisation Liaison série Arduino --> USB --> PC : Pour DEBUG 

//   Serial.begin(9600);   while (!Serial) { ; /* wait for serial port to connect. Needed for native USB */ }          delay(100);  InfoSerial();  delay(250);    Serial.flush();
//   Serial.begin(57600);  while (!Serial) { ; /* wait for serial port to connect. Needed for native USB */ }          delay(100);  InfoSerial();  delay(100);    Serial.flush();
//   Serial.begin(19200);  while (!Serial) { ; /* wait for serial port to connect. Needed for native USB */ }          delay(100);  InfoSerial();  delay(100);    Serial.flush();

  Serial.begin(115200);   // while (!Serial) { ; /* wait for serial port to connect. Needed for native USB */ } 
  while (!Serial && millis() - startSerial < 2000)   { ;    /* attend max x seconde */  }
  delay(100);
  Serial.println(F("######################################################################################################################"));
  InfoVersion();
  INIT();   Serial.println(F("## Boot IoToS pour Arduino UNO Rev 4  (setup run) ............... "));
// Affichage du Nom du Fichier ino :                                                                // https://forum.arduino.cc/t/filename-ino-as-string-variable/583738/20
  String ino = __FILE__;
  ino = (ino.substring((ino.indexOf(".")), (ino.lastIndexOf("\\")) + 1));
  VIDE(); Serial.print  (F("   Nom du Programme source ino : "));  Serial.println(ino);                      // Print le nom du Fichier ino
  OK();   Serial.println(F("## Serial ok !"));                        

// Load EEPROM configuration
  OK();   Serial.print   (F("## EEPROM Loading"));
  boolean login_cmdTelnetSwitchTemp = conf.login_cmdTelnetSwitch;                                   // Cree une variable temporaire qui enregistre la valeur de //login_cmdTelnetSwitch
  conf.login_cmdTelnetSwitch = 0;										                            // Deractive le login telnet																					
  LoadConfEEPROM(nullptr);
  conf.login_cmdTelnetSwitch = login_cmdTelnetSwitchTemp;                                           // Remet l'etat du login telnet	
 

  // Initialisation de la partition SD  ---- BUS SPI
  // Ethernet W5500	pin SS (D10) --  SD card	D4
  INIT();   Serial.println (F("## SPI Initialisation"));
  pinMode(SS, OUTPUT);           digitalWrite(SS,     HIGH);       // D10
  pinMode(SD_CS, OUTPUT);        digitalWrite(SD_CS,  HIGH);       // D4
  pinMode(ETH_CS, OUTPUT);       digitalWrite(ETH_CS, HIGH);       // D10
  SPI.begin();
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));

  SdSpiConfig spiConfig(SD_CS, SHARED_SPI, SD_SCK_MHZ(1));                                          // SdSpiConfig spiConfig(SD_CS, DEDICATED_SPI, SD_SCK_MHZ(25));   // Erreur DEDICATED_SPI 

  INIT();  Serial.println(F("## Test partition Fichiers SD : .......  "));
  if (!sd.begin(spiConfig)) {
	  FAILED();    Serial.println(F("   - ERROR Erreur de Lecture de la partition Micro SD Card !"));
      VIDE();    Serial.println(F("\033[;37;41m###     ATTENTION  !!! ###     : La carte Micro SD est absente ou mal formate !!! (FAT) \033[0;39;49m")); 
      VIDE();    Serial.print  (F("    o Erreur SD. Code : 0x"));        Serial.println(sd.card()->errorCode(), HEX);
      VIDE();    Serial.print  (F("    o Data            : 0x"));        Serial.println(sd.card()->errorData(), HEX);
      microSD = 0;
      //while (true); // on ne va pas plus loin
  }
  else
  { 
     OK();    Serial.println(F("## Partition et fichiers sur Micro SD : OK !"));
     VIDE();  Serial.println(F("   FAT32 Les noms fichiers sont de type DOS etendu"));
     microSD = 1;
     //Ddir(nullptr);                                                                                // Liste des Fichiers Info Partition SD
  }

// Initialisation de la Liaison Ethernet avec le Shield Ethernet 2 --> Includ Ethjernet_Reseau       // 
  VIDE(); Serial.println();
  INIT(); Serial.println(F("## Initialisation Reseau Ethernet....."));
  Initialisation_Ethernet();                                                                         // ---> Execute Fichier Ethernet_Reseau.h
  if (etatWAN == 1) 
  {
	  OK();      Serial.println(F("## Internet ok "));
  }
  else
  {
	  FAILED();  Serial.println(F("## Internet Down "));
  }	  
  
// Initialisation Fonction Librairie --->  Telnet                                                    // Demarrage Telnet Connexion // serverTelnet = EthernetServer(23);
  serverTelnet.begin();                                                                              //serverTelnet.setNoDelay(true);                                                                                                   
  OK();        Serial.println(F("## Telnet Serveur : OK !"));                                        // Serial.println(F("Dans Putty ou Kytty : Telnet port 23"));
  Serial.println();                                                                                  // Serial.println(F("Si besoin : Dans le menu Telnet decocher : Return key sends Telnet New Line instead of ^M  "));
                                                                                                     // Si on ne parammetre pas Putty : le caractere seront duplique : pprriinntt

// Serveur FTP START 
  if (microSD  == 1) {
      OK();        Serial.println(F("## FTP START : OK !"));                                         //      ftpSrv.setCallback(_callback);   //      ftpSrv.setTransferCallback(_transferCallback);      
      ftpSrv.begin(conf.loginFTP,conf.passwordFTP);                                                  // username, password for ftp.  set ports in ESP8266FtpServer.h  (default 21, 50009 for PASV)                                                                            // Liste des Fichiers Info Partition SD
      VIDE();      Serial.println(F("   - Sur FileZilla : ")); 
      VIDE();      Serial.println(F("     Cliquer sur Fichier --> Gestion de sites --> Parametre de Transfert --> Limiter le nombre de connexion a 1")); 

  }
  else{ FAILED();  Serial.println(F("## Partition FS ERROR : FTP Down !!")); }
  
// Demmarage du serveur WEB
  server = EthernetServer(conf.port);                                                                 // Change le port du serveur
  server.begin();
  OK();            Serial.print(F("## Serveur WEB START port : "));    Serial.print(conf.port);    Serial.println(F("  ...... OK !"));
  Serial.println(); Serial.println(); Serial.println();

// Start Serial Commande Line (CmdLine)
  Serial.println(F("## Telnet Commande Line : OK !"));
  Serial.println(F("     Avec MobaXtern taper cli off pour eviter les doubles caracteres"));
  Serial.println(F("     Putty ou Kitty configurer en Telnet port 23")); 
  Serial.println(F("     Si besoin : Dans PUTTY le menu Telnet decocher"));
  Serial.println(F("     Return key sends Telnet New Line instead of ^M"));    
  Serial.println(F("## Serial Commande Line (CmdLine) START : OK !"));
  Serial.println(F("     Putty ou Kitty configurer en serial : Flow control selectionner None"));   
  Serial.println();
  Serial.println(F("     Taper help pour voir les commandes disponibles"));
  Serial.println(F("     Taper print pour voir la configuration reseau"));
  Serial.println(F("\033[1;32;40m## -= IoToS =- System OK --> Start Loop()  \033[0;39;49m")); 
  Serial.println();  Serial.println();  Serial.println();  Serial.println();
  if ( conf.login_cmdTelnetSwitch == 1 ) 
     { Serial.print  (F("## Activer ou desactiver Login CmdLine ou Telnet - Etat : "));                Serial.println(conf.login_cmdTelnetSwitch == 0 ? "OFF" : "ON");   
       Serial.println(F("     Entrer le code de connexion entrer la commande : login <motDePasse>"));
       Serial.println(F("     pour acceder a la ligne de commande"));
       Serial.print  (F("     Le mot de passe actuel de l'acces au Telnet est : "));                  Serial.println(conf.telnetPassword);  
       previousMillisTelnet = millis();
       nbrEssaiLoginTelnet = 5; 
       Serial.println();    
     }
  cmdLine.begin(commands, countof(commands));
  cmdLine.addCommands(user_commands, user_commands_count);

// Initialisation Watchdog hardware
// Pas implmenter

// LED_BUILTIN
   digitalWrite(LED_BUILTIN, LOW); // OFF
}
