From 8b99e50098052847c2881896486e0399fefa862d Mon Sep 17 00:00:00 2001
From: Francois <thiebolt@irit.fr>
Date: Thu, 11 Feb 2021 23:36:58 +0100
Subject: [PATCH] undertaking some cleanup ...

---
 README.md                                     |  28 +-
 library.json => old/library.json              |   0
 library.properties => old/library.properties  |   0
 .../tool/EspExceptionDecoder.jar              | Bin 12289 -> 0 bytes
 work/.gitkeep                                 |   0
 work/README.md                                |  14 -
 work/neocampus_libs.orig/log_levels.h         |  40 --
 work/neocampus_libs.orig/neocampus.h          | 150 -----
 work/neocampus_libs.orig/neocampus_OTA.cpp    | 185 ------
 work/neocampus_libs.orig/neocampus_OTA.h      |  64 --
 work/neocampus_libs.orig/neocampus_debug.h    |  64 --
 work/neocampus_libs.orig/neocampus_eeprom.cpp | 148 -----
 work/neocampus_libs.orig/neocampus_eeprom.h   |  73 ---
 work/neocampus_libs.orig/neocampus_i2c.cpp    | 225 -------
 work/neocampus_libs.orig/neocampus_i2c.h      |  57 --
 work/neocampus_libs.orig/neocampus_utils.cpp  | 572 ------------------
 work/neocampus_libs.orig/neocampus_utils.h    |  93 ---
 work/neocampus_libs.orig/sensocampus.cpp      | 290 ---------
 work/neocampus_libs.orig/sensocampus.h        |  82 ---
 .../neocampus_libs.orig/wifiParametersMgt.cpp | 478 ---------------
 work/neocampus_libs.orig/wifiParametersMgt.h  |  89 ---
 21 files changed, 19 insertions(+), 2633 deletions(-)
 rename library.json => old/library.json (100%)
 rename library.properties => old/library.properties (100%)
 delete mode 100644 tools/EspExceptionDecoder/tool/EspExceptionDecoder.jar
 delete mode 100644 work/.gitkeep
 delete mode 100644 work/README.md
 delete mode 100644 work/neocampus_libs.orig/log_levels.h
 delete mode 100644 work/neocampus_libs.orig/neocampus.h
 delete mode 100644 work/neocampus_libs.orig/neocampus_OTA.cpp
 delete mode 100644 work/neocampus_libs.orig/neocampus_OTA.h
 delete mode 100644 work/neocampus_libs.orig/neocampus_debug.h
 delete mode 100644 work/neocampus_libs.orig/neocampus_eeprom.cpp
 delete mode 100644 work/neocampus_libs.orig/neocampus_eeprom.h
 delete mode 100644 work/neocampus_libs.orig/neocampus_i2c.cpp
 delete mode 100644 work/neocampus_libs.orig/neocampus_i2c.h
 delete mode 100644 work/neocampus_libs.orig/neocampus_utils.cpp
 delete mode 100644 work/neocampus_libs.orig/neocampus_utils.h
 delete mode 100644 work/neocampus_libs.orig/sensocampus.cpp
 delete mode 100644 work/neocampus_libs.orig/sensocampus.h
 delete mode 100644 work/neocampus_libs.orig/wifiParametersMgt.cpp
 delete mode 100644 work/neocampus_libs.orig/wifiParametersMgt.h

diff --git a/README.md b/README.md
index ab61cac1..263f5c4b 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,17 @@
-# neOCampus-arduino library
-neOCampus IoT support library for Arduino. This library will provides support for the following neOCampus boards:
-  * neOSensor boards based on ESP8266 (rev. >= V2)
+# neOCampus-arduino | home of the neOSensor end-devices #
+________________________________________________________________
+
+This repository provides support for the following neOCampus boards:
   * neOSensor boards based on ESP32
   * neOSensor-AirQuality board (ESP32) from CNRS' LCC lab.
+  * neOSensor boards based on ESP8266 (rev. >= V2)
+
+All this work was undertaken at Université Toulouse 3 / IRIT laboratory in the context of the [neOCampus](https://neocampus.org "neOCampus corporate") operation.
 
 ## NEWS ##
- * **[Dec.20]** added PCB from ESP8266 version 4 (KiCad) :)\
- * **[Aug.20]** new definition board for neOSensor-AirQuality board :)\
+ * **[Feb.21]** added KiCad PCB for neOSensor v5 (ESP32 based) :)\
+ * **[Dec.20]** added PCB from ESP8266 version 4 (KiCad)\
+ * **[Aug.20]** new definition board for neOSensor-AirQuality board\
 added definition board for (future) neOSensor esp32 based board\
 added suppport for boards configuration via sensOCampus JSON config\
 added Arduino IDE support for our various neOSensor boards\
@@ -21,10 +26,13 @@ This board comes from CNRS LCC lab, it's a PhD work undertaken by Aymen Sendi (a
 The board features four specific sensors able to measure NO2, CO, CH20, NO2 alternate.
 
 ## Getting started ##
-First of all, you ought to install esp32 or esp8266  support in your Arduino IDE.
+First of all, you ought to install esp32, esp8266 or CubeCell support in your Arduino IDE.
 
-  - esp8266 https://arduino.esp8266.com/stable/package_esp8266com_index.json
-  - esp32 https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
+| Device   | Arduino Board Manager json file                                                             |
+|----------|---------------------------------------------------------------------------------------------|
+| esp8266  | https://arduino.esp8266.com/stable/package_esp8266com_index.json                            |
+| esp32    | https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json |
+| CubeCell | https://resource.heltec.cn/download/package_CubeCell_index.json                             |
 
 Then, run script './deploy.sh' and boards will get added to your Arduino boards list :)
 
@@ -45,7 +53,9 @@ Once you've launched the Arduino IDE, before compiling and uploading sketches to
   - debug serial link speed 115200
 
 ### WiFi setup ###
-Once started the board will provides a WiFi Access Point (AP) named: `neOSensor_xxxx` where xxxx are the MAC address last bytes.
+Only for ESP based boards.
+
+Once started, the board will provides a WiFi Access Point (AP) named: `neOSensor_xxxx` where xxxx are the MAC address last bytes.
 
 **First time setup**\
 In this case, AP will get available for 5mn for you to configure SSID along with WPA2 key.
diff --git a/library.json b/old/library.json
similarity index 100%
rename from library.json
rename to old/library.json
diff --git a/library.properties b/old/library.properties
similarity index 100%
rename from library.properties
rename to old/library.properties
diff --git a/tools/EspExceptionDecoder/tool/EspExceptionDecoder.jar b/tools/EspExceptionDecoder/tool/EspExceptionDecoder.jar
deleted file mode 100644
index 0c4e69bd2027ce567a705d66f90a581fdcc91267..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12289
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

diff --git a/work/.gitkeep b/work/.gitkeep
deleted file mode 100644
index e69de29b..00000000
diff --git a/work/README.md b/work/README.md
deleted file mode 100644
index 68146458..00000000
--- a/work/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Work area: temporary space to hold orig files'n dirs #
-
-## TODO ##
-**library**
-  - mainly from sensocapus files, create the neOCampus lib
-  - take care of logging facility (maybe to integrate it with our lib)
-  - OTA, I2C, EEPROM ?? part of the library ???
-  - continuous integration
-
-**examples**
-  - simple app that connect to sensocampus to retrieve and store both credentials and config
-  - sample app featuring a SSL connexion to the neOCampus MQTT broket
-  - ...
-
diff --git a/work/neocampus_libs.orig/log_levels.h b/work/neocampus_libs.orig/log_levels.h
deleted file mode 100644
index 482abd2d..00000000
--- a/work/neocampus_libs.orig/log_levels.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * neOCampus operation
- * 
- * Debug levels definitions
- * 
- * Thiebolt F. July 17
- * 
- */
-
-
-#ifndef _LOG_LEVELS_H_
-#define _LOG_LEVELS_H_
-
-/*
- * Includes
- */
-
-
-
-/*
- * Definitions
- */
-/*
- * Logging levels:
- *  1: ERROR    errors
- *  3: WARN     errors and warnings
- *  5: INFO     errors, warnings and informational (default)
- *  4: DEBUG    errors, warnings, informational and debug
- */
-#define LOG_LVL_ERROR     1
-#define LOG_LVL_WARNING   3
-#define LOG_LVL_INFO      5
-#define LOG_LVL_DEBUG     10
-
-#define DEFL_LOG_LVL      LOG_LVL_INFO
-
-
-#endif /* _LOG_LEVELS_H_ */
-
-
diff --git a/work/neocampus_libs.orig/neocampus.h b/work/neocampus_libs.orig/neocampus.h
deleted file mode 100644
index 8d304d92..00000000
--- a/work/neocampus_libs.orig/neocampus.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * neOCampus operation
- * 
- * neOCampus *all-in-one* base definitions
- * 
- * F.Thiebolt   Nov.19  add MQTT socket timeout definition
- *                      add WIFI_AP_MODE_CREDENTIALS
- * F.Thiebolt   Jun.18  start to merge boards types
- *                      manage sensocampus sandbox through wifi parameters options
- * Thiebolt F. July 17  initial release
- * 
- */
-
-
-#ifndef _NEOCAMPUS_H_
-#define _NEOCAMPUS_H_
-
-/*
- * Includes
- */
-
-#include <Arduino.h>
-
-#include "log_levels.h"
-
-
-/*
- * Generic types definitions
- */
-typedef void (*voidFuncPtr)(void);
-typedef uint32_t firmwareRev_t;
-
-
-/*
- * Simultaneous TCP connexions
- */
-#ifndef MAX_TCP_CONNECTIONS
-#define MAX_TCP_CONNECTIONS              8       // maximum number of simultaneous TCP connexions (5 as default)
-#endif
-
-
-
-/*
- * >>>                 <<<
- * >>> BOARD SELECTION <<<
- * >>>                 <<<
- * 
- * Select proper board definition to include
- * - neOSensor.h          all ESP8266 based hardware :)
- */
-#include "neOSensor.h"
-
-
-
-/*
- * LOGS definitions
- */
-// set neOCampus logging level (min. is 1)
-#ifndef LOG_LEVEL
-#define LOG_LEVEL               LOG_LVL_DEBUG
-#endif /* LOG_LEVEL */
-
-/* I2C low-level msg debug
- * WARNING: display a lot of information about I2C messages! */
-//#define DEBUG_I2C
-
-// WiFi Manager debug mode on/off (default is on)
-#define DEBUG_WIFI_MANAGER
-
-/* MQTT low-level msg debug
- * WARNING: display a lot of information about MQTT messages! */
-#define MQTT_LOWLEVEL_DEBUG
-
-
-
-
-/*
- * SensOCampus
- */
-/*
- * WARNING: TESTING PURPOSES ONLY
- * Activating definition below means that sensOCampus 
- * won't get contacted thus using defaults (i.e neOCampus sandbox)
- *
- * [Jun.18] removed in favour of customizable WiFiManager option :)
- * 
- * #define DISABLE_SENSOCAMPUS             // comment out to activate sensOCampus (normal mode)
- *
- */
-// sensOCampus credentials & config related definitions
-#define MQTT_SERVER_NAME_LENGTH         64    // max length of MQTT server name
-#define MQTT_BASE_TOPIC_LENGTH          64    // max length of MQTT base topic (i.e building/room)
-#define SENSO_MQTT_LOGIN_LENGTH         32    // max length of sensOCampus MQTT login
-#define SENSO_MQTT_PASSWD_LENGTH        64    // max length of sensOCampus MQTT password
-
-// defaults values for testing purposes
-#define DEFL_MQTT_SERVER                "neocampus.univ-tlse3.fr"
-#define DEFL_MQTT_STD_PORT              1883
-#define DEFL_MQTT_ABROAD_PORT           10883           // for abroad access
-#define DEFL_MQTT_LOGIN                 "test"          // for SANDBOX mode
-#define DEFL_MQTT_PASSWD                "test"          // for SANDBOX mode
-#define DEFL_MQTT_TOPIC                 "TestTopic"     // for SANDBOX mode
-
-
-/*
- * PubSub MQTT client (re)definitions
- * Note: this file OUGHT to get included within PubSubClient.h
- */
-#define MQTT_KEEPALIVE          60
-#define MQTT_SOCKET_TIMEOUT     60
-#define MQTT_MAX_PACKET_SIZE    256
-
-
-/*
- * WiFi (and loosely related to) definitions
- */
-// type for mac address in raw format
-typedef uint8_t mac_addr_t[6];
-
-/* --- SPIFFS WiFi related definitions
- * Note: remember there's no directory support @ SPIFFS level!
- */
-#define WIFI_CONFIG_FILE        "/wifi.json"        // (optional) WiFi configuration file for large-scale deployment in well-known env
-
-/*
-typedef struct { 
-    uint8_t bytes[6]; 
-} mac_addr_t;
-*/
-
-// type for mac address in string format
-typedef char mac_str_t[18];
-
-/* WiFi AP mode credentials:
- *   Password required to get connected to the WiFi settings mode.
- */
-#define WIFI_AP_CREDENTIALS     "neOSensor"
-
-
-/*
- * Modules related definitions
- */
-/* a module's config file will be something like
- * "/module_luminosity.json"
- */
-#define MCFG_FILE_PREFIX        "/module_"
-#define MCFG_FILE_SUFFIX        ".json"
-
-
-#endif /* _NEOCAMPUS_H */
diff --git a/work/neocampus_libs.orig/neocampus_OTA.cpp b/work/neocampus_libs.orig/neocampus_OTA.cpp
deleted file mode 100644
index cced73a7..00000000
--- a/work/neocampus_libs.orig/neocampus_OTA.cpp
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * neOCampus operation
- * 
- * Over The Air (OTA) firmware upgrade utilities
- * 
- * Thiebolt F. Nov.19   upgrade to Arduino JSON6
- * Thiebolt F. August 17
- * 
- */
-
-
-
-/* ----------------------------------------------------------------------------
- * --- Includes ---------------------------------------------------------------
- * ----------------------------------------------------------------------------
- */
-#include <Arduino.h>
-#include <EEPROM.h>
-#include <ArduinoJson.h>          // https://github.com/bblanchon/ArduinoJson
-#include <ESP8266httpUpdate.h>
-
-
-#include "neocampus.h"
-#include "neocampus_debug.h"
-
-#include "neocampus_OTA.h"
-#include "neocampus_utils.h"
-
-
-
-/* ----------------------------------------------------------------------------
- * --- Global shared variables/functions --------------------------------------
- * ----------------------------------------------------------------------------
- */
-extern bool _need2reboot;
-
-
-
-/* ----------------------------------------------------------------------------
- * --- Definitions ------------------------------------------------------------
- * ----------------------------------------------------------------------------
- */
-#define OTA_JSON_SIZE       (JSON_OBJECT_SIZE(10))    // no more than 10 fields in JSON structure
-
-
-
-/* ----------------------------------------------------------------------------
- * --- Functions --------------------------------------------------------------
- * ----------------------------------------------------------------------------
- */
-
-/*
- * Main firmware update function
- */
-bool neOCampusOTA( void ) {
-  
-  if( _need2reboot ) return false;
-  
-  log_info(F("\n[OTA] start checking for firmware update ..."));
-  
-  // build url to json file
-  char ota_url[OTA_URL_LENGTH];
-  unsigned int _wlen;
-  _wlen=snprintf(ota_url, sizeof(ota_url),
-                 "%s/%s/%s/%s", OTA_BASE_URL,getHardware(),getBoardName(),OTA_JSON_FILE);
-  if( _wlen >= sizeof(ota_url) ) {
-    log_error(F("\n[OTA] error OTA_URL buffer undersized!")); log_flush();
-    return false;
-  }
-  
-  // get url's ArduinoJson file content
-  char ota_json[OTA_JSON_LENGTH];
-  if( http_get( ota_url, ota_json, sizeof(ota_json) ) != true ) {
-    return false;
-  }
-
-  // get firmware revision from json and compare to current
-  StaticJsonDocument<OTA_JSON_SIZE> root;
-  auto err = deserializeJson( root, ota_json );
-  if( err ) {
-    log_error(F("\n[OTA] ERROR parsing JSON file!"));
-    log_error(F("\n[OTA] ERROR msg: ")); log_error(err.c_str()); log_flush();
-    return false;
-  }
-
-  // check for revision field
-  if( (root.containsKey(F("revision"))==false) ) {
-    log_error(F("\n[OTA] ERROR no 'revision' field' in JSON file ?!?!"));
-    return false;
-  }
-  // ok, let's acquire this revision field 
-  firmwareRev_t remoteFWver = (firmwareRev_t)(root[F("revision")].as<unsigned int>());
-  
-  if( remoteFWver <= getFirmwareRev() ) {
-    // nothing todo, we're already with the latest version
-    log_info(F("\n[OTA] current firmware version "));
-    log_info(getFirmwareRev(),DEC); log_info(F(" is equal or higher than remote ")); log_info(remoteFWver,DEC);
-    log_flush();
-    return false;
-  }
-
-  // check for image field
-  if( (root.containsKey(F("image"))==false) ) {
-    log_error(F("\n[OTA] ERROR no 'image' field' in JSON file ?!?!"));
-    return false;
-  }
-
-  log_info(F("\n[OTA] on way to Firmware upgrade from "));
-  log_info(getFirmwareRev(),DEC); log_info(F(" revision to new version ")); log_info(remoteFWver,DEC);
-  log_flush();
-  
-  yield();
-  /*
-   * WARNING: root["image"] is a pointer to ArduinoJson inner buffer
-   */
-  return neOCampusOTA_url(root[F("image")]);
-}
-
-
-// upgrade from image's url
-bool neOCampusOTA_url( const char *img_url ) {
-
-  bool status = false;
-  
-  log_debug(F("\n[OTA] choosen firmware: "));log_debug(img_url);log_flush();
-  // disable reboot on update
-  ESPhttpUpdate.rebootOnUpdate(false);
-
-  t_httpUpdate_return ret = ESPhttpUpdate.update(img_url);
-  switch(ret) {
-    case HTTP_UPDATE_FAILED:
-      log_error(F("[OTA] ERROR update failed (!!): ")); log_error(ESPhttpUpdate.getLastErrorString());
-      log_error(F(" ... continuing ...")); log_flush();
-      break;
-    case HTTP_UPDATE_NO_UPDATES:
-      log_error(F("[OTA] no update ?!?!: ")); log_error(ESPhttpUpdate.getLastErrorString());
-      log_error(F("... continuing ...")); log_flush();
-      break;
-    case HTTP_UPDATE_OK:
-      log_info(F("\n[OTA] Update ok :)")); log_flush();
-      status = true;
-      break;
-  }
-
-  // check status
-  if( ! status ) {
-    return status;
-  }
-  
-  // closing things before restart
-  log_info(F("\n[OTA] prepare things before restarting with new firmware ..."));
-  _need2reboot = true;
-  
-  return status;
-}
-
-
-// get current firmwre revision
-firmwareRev_t getFirmwareRev() {
-  return BOARD_FWREV;
-}
-
-// get hardware (e.g ESP8266, ESP32, unknown ...)
-const char *getHardware( void ) {
-#ifdef ESP8266
-  static const char hardware[] = "esp8266";
-#elif ESP32
-  static const char hardware[] = "esp32";
-#else
-  static const char hardware[] = "unknown";
-#endif
-  return hardware;
-}
-
-// get board name (e.g neOSensor)
-const char *getBoardName( void ) {
-  return BOARD_NAME;
-}
-
-// get board revision
-uint8_t getBoarRev( void ) {
-  return (uint8_t)(BOARD_REVISION);
-}
-
-
diff --git a/work/neocampus_libs.orig/neocampus_OTA.h b/work/neocampus_libs.orig/neocampus_OTA.h
deleted file mode 100644
index 1bb32254..00000000
--- a/work/neocampus_libs.orig/neocampus_OTA.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * neOCampus operation
- * 
- * Over The Air (OTA) firmware upgrade utilities
- * 
- * Thiebolt F. August 17
- * 
- */
-
-
-
-#ifndef _NEOCAMPUS_OTA_H_
-#define _NEOCAMPUS_OTA_H_
-
-
-
-/* ----------------------------------------------------------------------------
- * --- Includes ---------------------------------------------------------------
- * ----------------------------------------------------------------------------
- */
-#include <Arduino.h>
-
-
-
-/* ----------------------------------------------------------------------------
- * --- Definitions ------------------------------------------------------------
- * ----------------------------------------------------------------------------
- */
-/*
- * OTA URL is something like
- * http://neocampus.univ-tlse3.fr/images/${hardware}/${board_name}/default.json
- */
-#define OTA_BASE_URL          "http://neocampus.univ-tlse3.fr/images"
-#define OTA_JSON_FILE         "default.json"    // name of file to look after @ neocampus server
-#define OTA_URL_LENGTH        128               // maximum length of OTA's url
-#define OTA_JSON_LENGTH       512               // maximum size of json file retrieved from server
-
-
-/* ----------------------------------------------------------------------------
- * --- Functions prototypes ---------------------------------------------------
- * ----------------------------------------------------------------------------
- */
-/*
- * Main firmware update function
- */
-bool neOCampusOTA( void );
-
-// upgrade from image's url
-bool neOCampusOTA_url( const char * );
-
-// get current revision firmware
-firmwareRev_t getFirmwareRev();
-
-// get hardware (e.g ESP8266, ESP32, unknown ...)
-const char *getHardware( void );
-
-// get board name (e.g neOSensor)
-const char *getBoardName( void );
-
-// get board revision
-uint8_t getBoarRev( void );
-
-#endif /* _NEOCAMPUS_OTA_H */
-
diff --git a/work/neocampus_libs.orig/neocampus_debug.h b/work/neocampus_libs.orig/neocampus_debug.h
deleted file mode 100644
index 146f6e4b..00000000
--- a/work/neocampus_libs.orig/neocampus_debug.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * neOCampus operation
- * 
- * Debug definitions
- * 
- * Thiebolt F. June 17
- * 
- */
-
-
-#ifndef _NEOCAMPUS_DEBUG_H_
-#define _NEOCAMPUS_DEBUG_H_
-
-/*
- * Includes
- */
-#include <Arduino.h>
-
-#include "log_levels.h"
-
-
-
-/*
- * Definitions
- */
-
-// define minimum messages
-#if !defined(LOG_LEVEL)
-  #define LOG_LEVEL       DEFL_LOG_LVL
-#endif
-
-
-// define macros related to various log levels
-#define log_flush()                 { Serial.flush(); }
-
-
-#if (LOG_LEVEL >= LOG_LVL_DEBUG)
-  #define log_debug(X, ...)         { Serial.print(X, ## __VA_ARGS__); }
-#else
-  #define log_debug(X, ...)         {}
-#endif
-
-#if (LOG_LEVEL >= LOG_LVL_INFO)
-  #define log_info(X, ...)          { Serial.print(X, ## __VA_ARGS__); }
-#else
-  #define log_info(X, ...)          {}
-#endif
-
-#if (LOG_LEVEL >= LOG_LVL_ERROR)
-  #define log_error(X, ...)          { Serial.print(X, ## __VA_ARGS__); }
-#else
-  #define log_error(X, ...)          {}
-#endif
-
-#if (LOG_LEVEL >= LOG_LVL_WARNING)
-  #define log_warning(X, ...)          { Serial.print(X, ## __VA_ARGS__); }
-#else
-  #define log_warning(X, ...)          {}
-#endif
-
-
-#endif /* _NEOCAMPUS_DEBUG_H */
-
-
diff --git a/work/neocampus_libs.orig/neocampus_eeprom.cpp b/work/neocampus_libs.orig/neocampus_eeprom.cpp
deleted file mode 100644
index 63eb7daa..00000000
--- a/work/neocampus_libs.orig/neocampus_eeprom.cpp
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * neOCampus operation
- * 
- * EEPROM operations to store / retrieve keys
- * 
- * THiebolt F. May.18   replace min() with _min() due to esp8266 arduino release >= 2.4.0
- * Thiebolt F. July 17  initial release
- * 
- */
-
-
-
-/*
- * Includes
- */
-#include <EEPROM.h>
-
-// neOCampus specific includes
-#include "neocampus_eeprom.h"
-
-
-
-
-/*
- * Functions
- */
-// HEX DUMP of EEPROM content
-void hexdumpEEPROM( void ) {
-  log_debug(F("\n### EEPROM HEX DUMP (only first 20bytes) ###")); log_flush();
-  for(uint8_t i=0; i < 20; i++ ){
-    char _line[30];
-    snprintf(_line,sizeof(_line),"\nEEPROM[%u] = 0x%02x '%c'", i, EEPROM.read(i), EEPROM.read(i));
-    log_debug(_line); delay(20); log_flush();
-  }
-}
-
-
-// EEPROM setup for sensOCampus purpose
-bool setupEEPROM( void ) {
-  log_info(F("\n[EEPROM] starting setup with size = ")); log_info(NEOCAMPUS_EEPROM_SIZE,DEC); log_flush();
-
-  // declare EEPROM size
-  EEPROM.begin( NEOCAMPUS_EEPROM_SIZE );
-
-  // check if already initialized ?
-  if( checkEEPROMvalidity() ) {
-    log_debug(F("\n[EEPROM] already initialized :) "));
-    return true;
-  }
-
-  // format EEPROM
-  formatEEPROM();
-
-  // set validity flag
-  setEEPROMvalidity();
-
-  return true;
-}
-
-// check EEPROM is valid
-inline bool checkEEPROMvalidity( void ) {
-  if( EEPROM.read(EEPROM_ADDR_CHECK) != (uint8_t)EEPROM_VALIDITY_CHECK ) return false;
-  if( EEPROM.read(EEPROM_ADDR_SIZE) != (uint8_t)EEPROM_ADDR_LAST ) return false;
-  return true;
-}
-
-// invalidate EEPROM content
-void clearEEPROMvalidity( void ) {
-  EEPROM.write(EEPROM_ADDR_CHECK, (uint8_t)0x00);
-  delay(20);
-  EEPROM.commit();
-}
-
-// format EEPROM for neOCampus use
-bool formatEEPROM( void ) {
-  log_debug(F("\n[EEPROM] nb bytes cleared is "));log_debug(EEPROM_ADDR_LAST,DEC); log_flush();
-  for( uint16_t i=0; i<EEPROM_ADDR_LAST; i++ ) {
-    EEPROM.write(i, 0);
-  }  
-  delay(20);
-  return EEPROM.commit();
-}
-
-// set EEPROM validity flag
-inline void setEEPROMvalidity( void ) {
-  EEPROM.write(EEPROM_ADDR_CHECK, (uint8_t)EEPROM_VALIDITY_CHECK);
-  EEPROM.write(EEPROM_ADDR_SIZE, (uint8_t)EEPROM_ADDR_LAST);
-  delay(20);
-  EEPROM.commit();
-}
-
-
-/* 
- * low-level write EEPROM function
- */
-void _writeEEPROM( uint16_t start, uint16_t maxsize, const char *buf ) {
-  //log_debug(F("\n[EEPROM] from addr : "));log_debug(start,DEC); log_flush();
-  //log_debug(F("\n[EEPROM] writing string : ")); log_debug(buf); log_flush();
-  for( uint16_t i=start; i<(uint16_t)(start+maxsize); i++ ) {
-    EEPROM.write(i, buf[i-start]);
-    if( buf[i-start] == '\0' ) break;
-  }
-  delay(20);
-  EEPROM.commit();
-}
-
-// store 'login' within EEPROM
-void setEEPROMlogin( const char *buf ) {
-  // call to low-level write EEPROM function
-  _writeEEPROM( (uint16_t)EEPROM_ADDR_MQTT_LOGIN, (uint16_t)SENSO_MQTT_LOGIN_LENGTH, buf );
-}
-
-// store 'passwd' within EEPROM
-void setEEPROMpasswd( const char *buf ) {
-  // call to low-level write EEPROM function
-  _writeEEPROM( (uint16_t)EEPROM_ADDR_MQTT_PASSWD, (uint16_t)SENSO_MQTT_PASSWD_LENGTH, buf );
-}
-
-
-/* 
- * low-level read EEPROM function
- */
-bool _readEEPROM( uint16_t start, uint16_t maxsize, char *buf ) {
-  uint16_t i;
-  for( i=(uint16_t)start; i<(uint16_t)(start+maxsize); i++ ) {
-    buf[i-start] = EEPROM.read(i);
-    if( buf[i-start] == '\0' ) break;
-  }
-  // check for zero sized strings
-  if( i == start ) return false;
-  return true;
-}
-
-// retrieve 'login' from EEPROM
-bool getEEPROMlogin( char *buf, size_t bufsize ) {
-  if( !buf or bufsize==0 ) return false;
-  // call to low-level read EEPROM function
-  return _readEEPROM( (uint16_t)EEPROM_ADDR_MQTT_LOGIN, (uint16_t)(_min(SENSO_MQTT_LOGIN_LENGTH,bufsize)), buf );
-}
-
-// retrieve 'passwd' from EEPROM
-bool getEEPROMpasswd( char *buf, size_t bufsize ) {
-  if( !buf or bufsize==0 ) return false;
-  // call to low-level read EEPROM function
-  return _readEEPROM( (uint16_t)EEPROM_ADDR_MQTT_PASSWD, (uint16_t)(_min(SENSO_MQTT_PASSWD_LENGTH,bufsize)), buf );  
-}
-
-
diff --git a/work/neocampus_libs.orig/neocampus_eeprom.h b/work/neocampus_libs.orig/neocampus_eeprom.h
deleted file mode 100644
index fcab5833..00000000
--- a/work/neocampus_libs.orig/neocampus_eeprom.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * neOCampus operation
- * 
- * EEPROM operations to store / retrieve keys
- * 
- * Thiebolt F. July 17
- * 
- */
-
-
-#ifndef _NEOCAMPUS_EEPROM_H_
-#define _NEOCAMPUS_EEPROM_H_
-
-/*
- * Includes
- */
-
-#include <Arduino.h>
-
-
-#include "neocampus.h"
-#include "neocampus_debug.h"
-
-
-
-/*
- * Definitions
- */
-#define NEOCAMPUS_EEPROM_SIZE           256
-
-#define EEPROM_ADDR_CHECK               0                         // ought to contain value EEPROM_CHECK_VAL
-#define EEPROM_ADDR_SIZE                (EEPROM_ADDR_CHECK + 1)   // ought to get equal to EEPROM_ADDR_LAST (in case EEPROM structure change, we reset everything)
-#define EEPROM_ADDR_MQTT_LOGIN          (EEPROM_ADDR_SIZE + 1)
-#define EEPROM_ADDR_MQTT_PASSWD         (EEPROM_ADDR_MQTT_LOGIN + SENSO_MQTT_LOGIN_LENGTH)
-#define EEPROM_ADDR_LAST                (EEPROM_ADDR_MQTT_PASSWD + SENSO_MQTT_PASSWD_LENGTH)
-
-#define EEPROM_VALIDITY_CHECK           42
-
-/*
- * Functions
- */
-// initialize EEPROM
-bool setupEEPROM( void );
-
-// verify EEPROM content validity
-inline bool checkEEPROMvalidity( void );
-
-// clear EEPROM validity (invalidation)
-void clearEEPROMvalidity( void );
-
-// format EEPROM for neOCampus use
-bool formatEEPROM( void );
-
-// set EEPROM validity flag
-inline void setEEPROMvalidity( void );
-
-// store 'login' within EEPROM
-void setEEPROMlogin( const char * );
-
-// store 'passwd' within EEPROM
-void setEEPROMpasswd( const char * );
-
-// retrieve 'login' from EEPROM
-bool getEEPROMlogin( char *, size_t );
-
-// retrieve 'passwd' from EEPROM
-bool getEEPROMpasswd( char *, size_t );
-
-// HEX DUMP of EEPROM content
-void hexdumpEEPROM( void );
-
-#endif /* _NEOCAMPUS_EEPROM_H_ */
-
diff --git a/work/neocampus_libs.orig/neocampus_i2c.cpp b/work/neocampus_libs.orig/neocampus_i2c.cpp
deleted file mode 100644
index 7dc6bc30..00000000
--- a/work/neocampus_libs.orig/neocampus_i2c.cpp
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * neOCampus library
- * 
- * - I2C synchronous functions read/write 8 and 16bits
- */
-
-
-/*
- * Includes
- */
-#include <Wire.h>
-
-// neOCampus specific includes
-#include "neocampus.h"
-#include "neocampus_debug.h"
-
-#include "neocampus_i2c.h"
-
-
-
-/* I2C scanner: it starts to scan I2C bus according to specified start parameter
- *  Scan stops whenever a device respond and we send back it address. You can continue scanning 
- *  giving previous answered addr+1
- */
-uint8_t i2c_scan(uint8_t start) {
-
-  // check that i2c addr is within range ...
-  if( (start < I2C_ADDR_START) || (start > I2C_ADDR_STOP) ) {
-    log_debug("\n###ERROR I2C scan start addr is wrong!"); log_flush();
-    return -1;
-  }
-  
-  // ... then let's start to scan i2c bus :)
-  int res;
-  for( uint8_t _addr=start; _addr <= I2C_ADDR_STOP; _addr++ ) {
-
-    // i2c quick_write :)
-    res = i2c_quick_write( _addr );
-    delay(20);  // usefull ?  
- 
-    if( res==0 ) return _addr;
-    else if( res==4 ) {
-      log_debug("\n###ERROR I2C scan err="); log_debug(DEC,res);log_flush();
-      return -1;
-    }
-  }
-
-  // nothing detected
-  return -1;
-}
-
-/**************************************************************************/
-/*! 
-    @brief  Low level I2C read and write functions!
-*/
-/**************************************************************************/
-int i2c_quick_write( uint8_t adr ) {
-  int res;
-  Wire.beginTransmission( adr );
-  res = Wire.endTransmission();
-
-#ifdef DEBUG_I2C
-  if( res==0 ) {
-    char _msg[255];
-    snprintf(_msg, sizeof(_msg), "\n[I2C-Qwrite] adr=0x%02x device detected ...", adr);
-    log_debug(_msg);log_flush();
-  }
-#endif
-  return res;
-}
-
-void write8(uint8_t adr, uint8_t value) {
-#ifdef DEBUG_I2C
-  char _msg[255];
-  snprintf(_msg, sizeof(_msg), "\n[I2C-write8] adr=0x%02x (no reg) val=0x%02x", adr, value);
-  log_debug(_msg);log_flush();
-#endif
-  Wire.beginTransmission(adr);
-  Wire.write(value);
-  Wire.endTransmission();
-}
-
-void write8(uint8_t adr, uint8_t reg, uint8_t value) {
-#ifdef DEBUG_I2C
-  char _msg[255];
-  snprintf(_msg, sizeof(_msg), "\n[I2C-write8] adr=0x%02x reg=%d val=0x%02x", adr, reg, value);
-  log_debug(_msg);log_flush();
-#endif
-  Wire.beginTransmission(adr);
-  Wire.write((uint8_t)reg);
-  Wire.write(value);
-  Wire.endTransmission();
-}
-
-uint8_t read8(uint8_t adr, uint8_t reg) {
-  uint8_t val;
-  Wire.beginTransmission(adr);
-  Wire.write((uint8_t)reg);
-  Wire.endTransmission();
-
-  Wire.requestFrom(adr, (uint8_t)1);
-  val= Wire.read();
-
-#ifdef DEBUG_I2C
-  char _msg[255];
-  snprintf(_msg, sizeof(_msg), "\n[I2C-read8] adr=0x%02x reg=%d val=0x%02x", adr, reg, val);
-  log_debug(_msg);log_flush();
-#endif
-
-  return val;
-}
-
-void write16(uint8_t adr, uint8_t reg, uint16_t value) {
-#ifdef DEBUG_I2C
-  char _msg[255];
-  snprintf(_msg, sizeof(_msg), "\n[I2C-write16] adr=0x%02x reg=%d val=0x%04x", adr, reg, value);
-  log_debug(_msg);log_flush();
-#endif
-  Wire.beginTransmission(adr);
-  Wire.write((uint8_t)reg);
-  Wire.write(value >> 8);
-  Wire.write(value & 0xFF);
-  Wire.endTransmission();
-}
-
-uint16_t read16(uint8_t adr, uint8_t reg) {
-  uint16_t val;
-
-  Wire.beginTransmission(adr);
-  Wire.write((uint8_t)reg);
-  Wire.endTransmission();
-  
-  Wire.requestFrom(adr, (uint8_t)2);
-  val = Wire.read();
-  val <<= 8;
-  val |= Wire.read();  
-
-#ifdef DEBUG_I2C
-  char _msg[255];
-  snprintf(_msg, sizeof(_msg), "\n[I2C-read16] adr=0x%02x reg=%d val=0x%04x", adr, reg, val);
-  log_debug(_msg);log_flush();
-#endif
-
-  return val;  
-}
-
-
-
-/*
- * I2C write16 little-endian
- */
-void write16le(uint8_t adr, uint8_t reg, uint16_t value) {
-#ifdef DEBUG_I2C
-  char _msg[255];
-  snprintf(_msg, sizeof(_msg), "\n[I2C-write16le] adr=0x%02x reg=%d val=0x%04x", adr, reg, value);
-  log_debug(_msg);log_flush();
-#endif
-  Wire.beginTransmission(adr);
-  Wire.write((uint8_t)reg);
-  Wire.write(value & 0xFF);
-  Wire.write(value >> 8);
-  Wire.endTransmission();
-}
-
-/*
- * I2C read16 little-endian
- */
-uint16_t read16le(uint8_t adr, uint8_t reg) {
-  uint16_t val;
-
-  Wire.beginTransmission(adr);
-  Wire.write((uint8_t)reg);
-  Wire.endTransmission();
-  
-  Wire.requestFrom(adr, (uint8_t)2);
-  uint8_t lsb = Wire.read();
-  uint8_t msb = Wire.read();
-  val = msb << 8;
-  val |= lsb;  
-
-#ifdef DEBUG_I2C
-  char _msg[255];
-  snprintf(_msg, sizeof(_msg), "\n[I2C-read16le] adr=0x%02x reg=%d val=0x%04x", adr, reg, val);
-  log_debug(_msg);log_flush();
-#endif
-
-  return val;  
-}
-
-
-
-/*
- * I2C bulk transfers
- * involving the 'i2c repeated start bit'
- * return number of bytes read
- */
-uint8_t readList( uint8_t adr, uint8_t reg, uint8_t tab[], uint8_t tabsize ) {
-  
-  Wire.beginTransmission(adr);
-  Wire.write((uint8_t)reg);
-  Wire.endTransmission( false );  // enables the 'repeated start bit'
-
-  Wire.requestFrom(adr, tabsize);
-  uint8_t i=0;
-  while( Wire.available() and ( i < tabsize) ) {
-    tab[i++] = Wire.read();
-  }
-  Wire.endTransmission();
-
-#ifdef DEBUG_I2C
-  char _msg[255];
-  snprintf(_msg, sizeof(_msg), "\n[I2C-readList] adr=0x%02x reg=%d val=[0x%02x 0x%02x 0x%02x 0x%02x ... ]", adr, reg, tab[0], tab[1], tab[2], tab[3]);
-  log_debug(_msg);log_flush();
-#endif
-  
-  return i;
-}
-
-uint8_t writeList( uint8_t adr, uint8_t reg, uint8_t *tab, uint8_t tabsize ){
-  log_debug("\nNOT YET AVAILABLE :|");
-  return 0;
-}
-
-
-
diff --git a/work/neocampus_libs.orig/neocampus_i2c.h b/work/neocampus_libs.orig/neocampus_i2c.h
deleted file mode 100644
index 3e3571c2..00000000
--- a/work/neocampus_libs.orig/neocampus_i2c.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * neOCampus operation
- * 
- * I2C functions
- * 
- * Thiebolt F. June 17
- * 
- */
-
-
-#ifndef _NEOCAMPUS_I2C_H_
-#define _NEOCAMPUS_I2C_H_
-
-/*
- * Includes
- */
-#include <Arduino.h>
-
-
-
-/*
- * Definitions
- */
-
-// i2c bus related definition
-//#define DEBUG_I2C           // low-level I2C debug messages (verbose option!!)
-#define I2C_ADDR_START  0x01
-#define I2C_ADDR_STOP   0x7F
-
-
-
-/*
- * Common functions
- */
-// I2C bus scanner
-uint8_t i2c_scan(uint8_t start);
-
-// I2C synchronous functions
-int i2c_quick_write( uint8_t adr );
-
-uint8_t read8(uint8_t adr, uint8_t reg);
-void write8(uint8_t adr, uint8_t val);
-void write8(uint8_t adr, uint8_t reg, uint8_t val);
-
-uint16_t read16(uint8_t adr, uint8_t reg);              // big endian (default)
-void write16(uint8_t adr, uint8_t reg, uint16_t val);   // big endian (default)
-
-uint16_t read16le(uint8_t adr, uint8_t reg);            // little-endian
-void write16le(uint8_t adr, uint8_t reg, uint16_t val); // little-endian
-
-uint8_t readList( uint8_t adr, uint8_t reg, uint8_t *tab, uint8_t tabsize );
-uint8_t writeList( uint8_t adr, uint8_t reg, uint8_t *tab, uint8_t tabsize );
-
-
-#endif /* _NEOCAMPUS_I2C_H */
-
-
diff --git a/work/neocampus_libs.orig/neocampus_utils.cpp b/work/neocampus_libs.orig/neocampus_utils.cpp
deleted file mode 100644
index a0247996..00000000
--- a/work/neocampus_libs.orig/neocampus_utils.cpp
+++ /dev/null
@@ -1,572 +0,0 @@
-/*
- * neOCampus operation
- * 
- * Utilities functions like
- * - WiFi setup
- * - OTA updates
- * - SPIFFS related
- * - JSON encoding / decoding functions
- * - ...
- * 
- * F.Thiebolt   Nov.19  set 30s WiFi connexion timeout with previous credentials
- * Thiebolt F. July 17
- * 
- */
-
-
-/* ----------------------------------------------------------------------------
- * --- Includes ---------------------------------------------------------------
- * ----------------------------------------------------------------------------
- */
-#include <FS.h>                   //this needs to be first, or it all crashes and burns ... still nowdays ??
-
-#include <Arduino.h>
-#include <EEPROM.h>
-#include <ESP8266WiFi.h>
-#include <ESP8266HTTPClient.h>    // HTTP GET
-#include <Esp.h>                  // ESP specific API for watchdog and others functionnalities
-
-//needed for WiFiManager library
-#include <DNSServer.h>            // for captive portal
-#include <ESP8266WebServer.h>
-#include <WiFiManager.h>          // https://github.com/tzapu/WiFiManager
-#include <ArduinoJson.h>          // https://github.com/bblanchon/ArduinoJson
-
-#include <Dns.h>                  // getHostByName
-#include <time.h>                 // time() ctime()
-
-#include "neocampus.h"
-
-#include "neocampus_debug.h"
-#include "neocampus_utils.h"
-
-
-
-/* ----------------------------------------------------------------------------
- * --- Global variables -------------------------------------------------------
- * ----------------------------------------------------------------------------
- */
-bool _WMsaveAddonConfigFlag = false;
-
-
-
-/* ----------------------------------------------------------------------------
- * --- Functions --------------------------------------------------------------
- * ----------------------------------------------------------------------------
- */
-
-// --- CLEAR switch management ------------------------------------------------
-
-/* check clear switch for CLEAR procedure
- * if pin == -1 --> check disabled
- */
-bool checkCLEARswitch( uint8_t sw_pin ) {
-  if (sw_pin == INVALID_GPIO) return false;
-  
-  // set pin as input
-  pinMode( sw_pin, INPUT );
-  
-  log_debug(F("\n[CLEAR] check for clear_switch activation ...")); log_flush();
-  
-  bool _res = true;
-  // ... then read input for a specific time
-  for( uint8_t cpt=10; cpt > 0; cpt-- ) {
-    if ( digitalRead( sw_pin ) != HIGH ) {
-      // at least read as LOW one time --> cancel clear operation
-      _res = false;
-      break;
-    }
-    delay(50);  // sleep for 50ms (allowing ESP to manage internals)
-  }
-  
-  /* okay, delay for clear switch acquisition is now over.
-   * If we need to clear things, we want to wait for sw_pin
-   * LOW (i.e user stopped to press switch)
-   */
-  if( _res==true ) {
-    log_info(F("\n[CLEAR] activate CLEAR procedure ..."));
-    log_debug(F("\n[CLEAR] release SWITCH for clear to start ..."));
-    log_flush();
-  }
-  while( digitalRead( sw_pin )==HIGH ) {
-    delay(250);
-  }
-  
-  return _res;
-}
-
-
-
-// ----------------------------------------------------------------------------
-// --- WiFi setup -------------------------------------------------------------
-
-/*
- * compute WiFi Access Point Name
- */
-const char *getAPname( void ) {
-  static char _apName[16] = "";
-  
-  if( !strlen(_apName) ) {
-    const char *mac=getMacAddress();
-    uint8_t mac_len=strlen(mac);
-//    snprintf(_apName,sizeof(_apName),"neOSensor_%c%c%c%c",mac[mac_len-5],mac[mac_len-4],mac[mac_len-2],mac[mac_len-1]);
-    snprintf(_apName,sizeof(_apName),"%s_%c%c%c%c",BOARD_NAME,mac[mac_len-5],mac[mac_len-4],mac[mac_len-2],mac[mac_len-1]);
-  }
-  
-  return (const char*)_apName;
-}
-
-/* 
- * WiFiManager : callback upon exit of AP mode (i.e success)
- * - callback notifying us of the need to save additional parameters
- */
-void cb_exitConfigMode( void ) {
-  log_debug(F("\n[WiFiManager] exit config mode --> save addon parameters flag is set ..."));
-  _WMsaveAddonConfigFlag = true;
-}
-
-/*
- * WiFiManager : callback upon entering AP mode (will start to configure network)
- */
-void cb_enterConfigMode( WiFiManager *myWiFiManager ) {
-  log_debug(F("\n[WiFiManager] entering WiFi AP config mode"));
-  log_debug(F("\n\tIP ")); log_debug(WiFi.softAPIP());
-  log_debug(F("\n\tSSID ")); log_debug(myWiFiManager->getConfigPortalSSID());
-  log_flush();
-}
-
-/*
- * WiFi setup
- */
-bool setupWiFi( wifiParametersMgt *wp ) {
-
-  if( _need2reboot ) return false;
-  
-  log_info(F("\n[WiFi] start WiFiManager ..."));
-
-  // reload config file
-  if( wp ) {
-    // load WiFi parameters and options
-    wp->loadConfigFile();
-  }
-
-  // Disable WiFi sleep mode ...
-  log_debug("\n[WiFi] disable WiFi sleep mode ...");
-  WiFi.setSleepMode( WIFI_NONE_SLEEP );
-
-  // WiFi parameters availables ?
-  if( strlen(wp->getWIFIssid()) ) {
-
-    log_debug(F("\n[WiFi] found ssid = ")); log_debug(wp->getWIFIssid());
-    log_debug(F("\n[WiFi] found pass = ")); log_debug(wp->getWIFIpass());
-
-    // destroy saved parameters
-    WiFi.mode(WIFI_STA);
-    WiFi.disconnect(true);  // or WiFiManager.resetSettings();
-    delay(1000);
-    log_debug(F("\n[WiFi] start to reconnect using those credentials ..."));log_flush();
-    WiFi.begin( wp->getWIFIssid(), wp->getWIFIpass() );
-    
-    // retry for xx seconds using previously retrieved credentials
-    uint8_t _retry=WM_CONNECTION_ATTEMPT_TIMEOUT;
-    while( WiFi.status() != WL_CONNECTED and _retry-- ) {
-      delay(1000);
-      log_debug(F("+"));log_flush();
-    }
-  }
-
-  // WiFiManager local instance ... no need to keep once business is done
-  WiFiManager wifiManager;
-  
-  // debug messages
-  wifiManager.setDebugOutput( true );
-  
-  // set enter config mode callback
-  wifiManager.setAPCallback( cb_enterConfigMode );
-
-  // set config save notify callback: only usefull for additional parameters
-  wifiManager.setSaveConfigCallback( cb_exitConfigMode );
-
-  // set minimum signal level
-  wifiManager.setMinimumSignalQuality();      // min. default is 8%
-
-  // set custom ip for AP portal
-  wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0));
-
-  // set to exit portal after config
-  wifiManager.setBreakAfterConfig( true );
-
-
-
-  /*
-   * Declare WiFiManager additional parameters
-   * 
-   * [Jun.18] WARNING --> use Ken Taylor WiFiManager verion:
-   *    https://github.com/kentaylor/WiFiManager
-   * 
-   * - hint reminder
-   * - TM1637 7 segment display with optional pins
-   * 
-   * Note: HACK related below is because i don't want to allocate memory on the heap
-   * ... because you ought to free it at the end and it is much more secure to allocate 
-   * on the stack ;)
-   */
-  // Just a quick hint
-  WiFiManagerParameter p_hint("<small>*Hint: if you want to reuse the currently active WiFi credentials, leave SSID and Password fields empty</small>");
-
-  // kinds of custom HTML
-  const char _customHtml_checkbox[]         = "type=\"checkbox\"";
-  const char _customHtml_checkbox_checked[] = "type=\"checkbox\" checked";
-  
-  // enable / disable sensOCampus sandbox
-  WiFiManagerParameter p_sandbox("sandbox", "neOCampus sandbox", "T", 2, _customHtml_checkbox, WFM_LABEL_AFTER);
-  if( wp->isEnabledSandbox() ) {
-    // [Jun.18] HACK that requires modification in WiFiManager
-    p_sandbox._customHTML = _customHtml_checkbox_checked;
-  }
-  
-  // TM1637 7 segment display parameters
-  WiFiManagerParameter p_sevenSegTM1637("sevenSegTM1637", "TM1637 7-seg (DIO=2,CLK=SCL)", "T", 2, _customHtml_checkbox, WFM_LABEL_AFTER);
-  if( wp->isEnabled7segTM1637() ) {
-    // [Jun.18] HACK that requires modification in WiFiManager
-    p_sevenSegTM1637._customHTML = _customHtml_checkbox_checked;
-  }
-  
-/*
-  // I2C SCL and SDA parameters are integers so we need to convert them to char array but
-  // no other special considerations
-  char convertedValue[3];
-  sprintf(convertedValue, "%d", NEOCLOCK_TM1637_DIO);
-  WiFiManagerParameter p_pinTM1637dio("pinTM1637dio", "TM1637 DIO pin", convertedValue, 3);
-  sprintf(convertedValue, "%d", NEOCLOCK_TM1637_CLK);
-  WiFiManagerParameter p_pinTM1637clk("pinTM1637clk", "TM1637 CLK pin", convertedValue, 3);
-*/
-
-  // PIR sensor
-  WiFiManagerParameter p_PIRsensor("PIRsensor", "PIR sensor (pin=5)", "T", 2, _customHtml_checkbox, WFM_LABEL_AFTER);
-  if( wp->isEnabledPIR() ) {
-    // [Jun.18] HACK that requires modification in WiFiManager
-    p_PIRsensor._customHTML = _customHtml_checkbox_checked;
-  }
-
-  
-  /*
-   *WARNING: Clear sensor ALL CONFIG (wifi, eeprom, spiffs) option
-   */
-  WiFiManagerParameter p_eraseALL("eraseALL", "ERASE ALL", "T", 2, _customHtml_checkbox, WFM_LABEL_AFTER);
-  
-  
-  /*
-   * add all parameters to wifiManager
-   */
-  wifiManager.addParameter(&p_hint);
-  wifiManager.addParameter(&p_sandbox);
-  wifiManager.addParameter(&p_sevenSegTM1637);
-/*
-  wifiManager.addParameter(&p_pinTM1637dio);
-  wifiManager.addParameter(&p_pinTM1637clk);
-*/
-  wifiManager.addParameter(&p_PIRsensor);
-  wifiManager.addParameter(&p_eraseALL);
-
-  
-  //
-  // set timeouts
-  if( WiFi.status() != WL_CONNECTED ) {
-    log_debug(F("\n[WiFi] AP will get open for "));log_debug(WM_CONFIG_PORTAL_TIMEOUT,DEC);log_debug(F(" seconds"));
-    wifiManager.setConfigPortalTimeout(WM_CONFIG_PORTAL_TIMEOUT);
-  }
-  else {
-    log_debug(F("\n[WiFi] AP opened in CONFIG MODE for ")); log_debug(WM_CONFIG_PORTAL_TIMEOUT/6,DEC);log_debug(F(" seconds"));
-    wifiManager.setConfigPortalTimeout(WM_CONFIG_PORTAL_TIMEOUT/6);
-  }
-  // set a timeout trying to connect to a specified AP
-  log_debug(F("\n[WiFi] will try a connexion for maximum "));log_debug(WM_CONNECTION_ATTEMPT_TIMEOUT,DEC);log_debug(F(" seconds"));
-  wifiManager.setConnectTimeout(WM_CONNECTION_ATTEMPT_TIMEOUT);
-
-  
-  /*
-   * if it does not connect it starts an access point with the specified name
-   * and goes into a blocking loop awaiting configuration
-   */
-  log_debug(F("\n"));
-  wifiManager.startConfigPortal( getAPname(), WIFI_AP_CREDENTIALS ); // blocking call
-  delay(500);
-  
-  // whatever the result of the connection ... we save all parameters :)
-  // Getting posted form values and overriding local variables parameters
-  // Config file is written regardless the connection state
-  // TODO: find a way to parse ALL parameters added in wifi manager
-  if( _WMsaveAddonConfigFlag ) {
-    
-    // save wifi settings to wifi parameters object
-    wp->_getWIFIsettings();
-    
-    // save OPTIONS to parameters object
-    wp->_setopt_sandboxMode( strncmp(p_sandbox.getValue(),"T",1)==0 ? true : false );
-    wp->_setopt_7segTM1637( strncmp(p_sevenSegTM1637.getValue(),"T",1)==0 ? true : false );
-    wp->_setopt_PIRsensor( strncmp(p_PIRsensor.getValue(),"T",1)==0 ? true : false );
-
-    /*
-    strcpy(thingspeakApiKey, p_thingspeakApiKey.getValue());
-    sensorDht22 = (strncmp(p_sensorDht22.getValue(), "T", 1) == 0);
-    pinSda = atoi(p_pinSda.getValue());
-    pinScl = atoi(p_pinScl.getValue());
-    */
-    
-    // Dangerous option !!
-    wp->_setopt_eraseALL( strncmp(p_eraseALL.getValue(),"T",1)==0 ? true : false );
-    
-    // Writing JSON config file to flash for next boot
-    wp->saveConfigFile();
-  }
-
-  if( WiFi.status() != WL_CONNECTED ) {
-    log_error(F("\n[WiFi] failed to connect and hit timeout ... restart"));
-    // reboot our sensor
-    _need2reboot=true;
-    delay(1000);
-    return false;
-  }
- 
-  //if you get here you have connected to the WiFi
-  log_info(F("\n[WiFi] connected :)"));
-  log_debug(F("\n\tSSID ")); log_debug(WiFi.SSID());
-  log_debug(F("\n\tIP ")); log_debug(WiFi.localIP());
-  log_debug(F("\n\tRSSI ")); log_debug(WiFi.RSSI());
-
-  // Disable WiFi sleep mode ...
-  log_debug("\n[WiFi] disable WiFi sleep mode ...");
-  WiFi.setSleepMode(WIFI_NONE_SLEEP);
-
-  // well done :)
-  return true;
-}
-
-
-/*
- * setup SPIFFS
- */
-bool setupSPIFFS( void ) {
-  log_info(F("\n[SPIFFS] start ... "));
-  if( !SPIFFS.begin() ) {
-    log_info(F("\n[SPIFFS] uninitialized file system ... format :|"));
-    delay(1000);
-    return formatSPIFFS();
-  }
-  else {
-    log_info(F("\n[SPIFFS] mounted file system :)"));
-  }
-  return true;
-}
-
-
-
-// --- utilities functions ----------------------------------------------------
-// hex dump of a buffer
-void hex_dump( const char *buf, size_t bufsize ) {
-  log_debug(F("\n### HEX DUMP "));log_debug(bufsize,DEC);log_debug(F(" bytes ###")); log_flush();
-  for(uint8_t i=0; i < (uint8_t)bufsize; i++ ){
-    char _line[30];
-    snprintf(_line,sizeof(_line),"\nbuf[%u] = 0x%02x '%c'", i, buf[i], buf[i]);
-    log_debug(_line); delay(20); log_flush();
-  }
-}
-
-
-/* --- 
- * --- Format SPIFFS filesystem
- */
-bool formatSPIFFS( void ) {
-  log_info(F("\n[SPIFFS] start formatting ... "));
-  bool _res = SPIFFS.format();
-  if( _res==true ) {
-    log_debug(F("success :)"));
-  } else log_error(F("[FAILURE] !!"));
-  log_flush();
-  return _res;
-}
-
-
-// retrieve mac address
-const char *getMacAddress( void ) {
-  static bool _initialized = false;
-  // mac address array format
-  static mac_addr_t _mac;
-  // mac address string format
-  static mac_str_t _mac_sta;
-
-  if( _initialized == false ) {
-    //WiFi.softAPmacAddress( _mac );  // beware that AP mac addr is different from STA mac addr!
-    WiFi.macAddress( _mac );
-    snprintf(_mac_sta, sizeof(_mac_sta), "%02x:%02x:%02x:%02x:%02x:%02x", _mac[0], _mac[1], _mac[2], _mac[3], _mac[4], _mac[5]);
-    _initialized = true;
-  }
-  return (const char *)_mac_sta;
-}
-
-
-
-// retrieve current domain name
-const char *getDomainName( void ) {
-  //static char _domainName[32] = "";
-  
-  if( ! WiFi.isConnected() ) return NULL;
-    
-  // esp8266 affects a default hostname if not set by DHCP server
-  const char *_esp_defl_hostname = PSTR("ESP_");
-  
-  /* is hostname one of the defaults esp8266 hostname ?
-   * i.e it starts with ESP_XXXXXX */
-  if( not strncmp_P( WiFi.hostname().c_str(), _esp_defl_hostname, strlen_P(_esp_defl_hostname) ) ) {
-    log_debug(F("\n[getDomainName] hostname is a default one: ")); log_debug( WiFi.hostname().c_str() ); log_flush();
-
-    /*
-     * [Jun.18] DHCP_OPTION_HOSTNAME does not exist in dhcp.c (client)
-     * neither DHCP_OPTION_IDX_HOSTNAME
-     * TODO!!
-     */
-
-    return nullptr;
-  }
-  
-  /* Does hostname contains domain name too ?
-   * e.g esp8266-bu-hall.neocampus.univ-tlse3.fr */
-  // lets find first dot
-  const char *cur_domain = strchr( WiFi.hostname().c_str(), '.' );
-  if( cur_domain == NULL ) return nullptr;
-  // ... and at least a second dot ?
-  if( strchr( cur_domain+1, '.' ) == NULL ) return nullptr;
-  
-  // ok we finally found a hostname with AT LEAST 2 dots ==> FQDN
-  return cur_domain+1;
-}
-
-
-/*
- * Get current time
- * WARNING: static variable inside (i.e single thread)
- */
-const char *getCurTime( const char *fmt ) {
-
-  // STATIC variable !
-  static char _tmpbuf[64];
-  
-  // default format
-  const char defl_fmt[] = "%Y-%m-%d %H:%M:%S %z";
-  
-  if( !fmt ) fmt=defl_fmt;
-
-  struct tm *_tm;
-  time_t _curTime;
-  
-  time( &_curTime );
-  _tm = localtime( &_curTime );   // Weird part ... localtime function *corrects* time to match timezone ... :s
-  strftime( _tmpbuf, sizeof(_tmpbuf), fmt, _tm);
-
-  return (const char *)_tmpbuf;
-}
-
-
-/*
- * low-level HTTP GET
- */
-bool _http_get( const char *url, char *buf, size_t bufsize, const char *login, const char *passwd ) {
-    
-  HTTPClient http;
-
-  http.begin(url);
-  log_debug(F("\n[HTTP] GET url : ")); log_debug(url); log_flush();
-  
-  // authentication ?
-  if( login!=NULL and passwd!=NULL ) {
-    http.setAuthorization( login, passwd);
-  }
-  
-  // perform GET
-  int httpCode = http.GET();
-
-  // connexion failed to server ?
-  if( httpCode < 0 ) {
-    log_error(F("\n[HTTP] connexion error code : ")); log_debug(httpCode,DEC); log_flush();
-    _need2reboot = true;
-    return false;
-  }
-  
-  // check for code 200
-  if( httpCode == HTTP_CODE_OK ) {
-    String payload = http.getString();
-    snprintf( buf, bufsize, "%s", payload.c_str() );
-  }
-  else {
-    log_error(F("\n[HTTP] GET retcode : ")); log_debug(httpCode,DEC); log_flush();
-  }
-  
-  // close connexion established with server
-  http.end();
-
-  yield();
-  
-  return ( httpCode == HTTP_CODE_OK );
-}
-
-// ---
-// HTTP get
-bool http_get( const char *url, char buf[], size_t bufsize ) {
-    return _http_get( url, buf, bufsize, NULL, NULL );
-}
-
-// ---
-// HTTP get with credentials
-bool http_get( const char *url, char *buf, size_t bufsize, const char *login, const char *passwd ) {
-    return _http_get( url, buf, bufsize, login, passwd );
-}
-
-// ---
-// Reset configuration and restart (delete module's config files and reboot)
-bool neOSensor_reset( void ) {
-
-  log_info(F("\n[reboot] neOSensor is about to reboot in a few seconds ..."));
-  
-  /* 
-   * Delete ALL modules JSON config files
-   * 
-   * Note: it works because modules' config files are ONLY WRITTEN
-   * upon config change ... not at the end of the module's life ;)
-   */
-  const char *_prefix = PSTR(MCFG_FILE_PREFIX); // TBC: useful ?
-  const char *_suffix = PSTR(MCFG_FILE_SUFFIX); // TBC: useful ?
-  Dir dir = SPIFFS.openDir("/");
-  while( dir.next() ) {
-    if( strncmp_P( dir.fileName().c_str(), _prefix, strlen_P(_prefix))!=0 ) continue;
-    if( strncmp_P( dir.fileName().c_str(), _suffix, strlen_P(_suffix))!=0 ) continue;
-    // delete matching file
-    log_debug(F("\n[reboot] deleting file : "));log_debug(dir.fileName());log_flush();
-  }
-  
-  // reboot
-  neOSensor_reboot();
-  
-  // unreachable zone
-  return true;
-}
-
-// ---
-// proper restart
-void neOSensor_reboot( void ) {
-  
-  log_info(F("\n[reboot] neOSensor is about to reboot in a few seconds ..."));
-  
-  // properly close stuffs
-  EEPROM.commit();
-  EEPROM.end();
-
-  // SPIFFS close
-  SPIFFS.end();
-  
-  // call to restart
-  delay( 2000 + int(random(10000)) ); // random reboot delay
-  ESP.restart();
-  delay(5000);
-}
-
diff --git a/work/neocampus_libs.orig/neocampus_utils.h b/work/neocampus_libs.orig/neocampus_utils.h
deleted file mode 100644
index 9c436df6..00000000
--- a/work/neocampus_libs.orig/neocampus_utils.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * neOCampus operation
- * 
- * Utilities functions like
- * - WiFi setup
- * - OTA updates
- * - SPIFFS related
- * - JSON encoding / decoding functions
- * - ...
- * 
- * Thiebolt F. July 17
- * 
- */
-
-
-
-#ifndef _NEOCAMPUS_UTILS_H_
-#define _NEOCAMPUS_UTILS_H_
-
-
-
-/* ----------------------------------------------------------------------------
- * --- Includes ---------------------------------------------------------------
- * ----------------------------------------------------------------------------
- */
-#include <Arduino.h>
-
-#include "wifiParametersMgt.h"
-
-
-
-/*
- * Global shared variables/functions
- */
-// reboot flag
-extern bool _need2reboot;
-
-
-
-/* ----------------------------------------------------------------------------
- * --- Definitions ------------------------------------------------------------
- * ----------------------------------------------------------------------------
- */
-// --- WiFi definitions -------------------------------------------------------
-#define WM_CONFIG_PORTAL_TIMEOUT        300   // seconds config portail will stay active
-#define WM_CONNECTION_ATTEMPT_TIMEOUT   90    // will wait up to xxs for connecting to the specified SSID
-
-
-
-/* ----------------------------------------------------------------------------
- * --- Functions prototypes ---------------------------------------------------
- * ----------------------------------------------------------------------------
- */
-// check clear switch for CLEAR procedure
-bool checkCLEARswitch( uint8_t );
-
-// whole neocampus WiFi connexion setup
-bool setupWiFi( wifiParametersMgt *wp=nullptr );
-
-// compute WiFi Access Point Name
-const char *getAPname( void );
-
-// obtain MAC address (e.g "18:fc:b3:de:c6:02")
-const char *getMacAddress( void );
-
-// retrieve current domain name
-const char *getDomainName( void );
-
-// retrieve current time
-const char *getCurTime( const char *fmt=nullptr );
-
-// HTTP get & get with credentials
-bool http_get( const char *url, char *buf, size_t bufsize );
-bool http_get( const char *url, char *buf, size_t bufsize, const char *login, const char *passwd );
-
-// setup SPIFFS
-bool setupSPIFFS( void );
-
-// Format SPI FileSystem
-bool formatSPIFFS( void );
-
-// Reset configuration and restart (delete module's config files and reboot)
-bool neOSensor_reset( void );
-
-// proper restart
-void neOSensor_reboot( void );
-
-// --- utilities functions ----------------------------------------------------
-
-// hex dump of a buffer
-void hex_dump( const char *, size_t );
-
-#endif /* _NEOCAMPUS_UTILS_H */
diff --git a/work/neocampus_libs.orig/sensocampus.cpp b/work/neocampus_libs.orig/sensocampus.cpp
deleted file mode 100644
index d13bdc34..00000000
--- a/work/neocampus_libs.orig/sensocampus.cpp
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * neOCampus operation
- * 
- * sensOCampus client class for interactions with sensOCampus server
- * 
- * Thiebolt F. Nov.19   migrate to Arduino Json 6
- * Thiebolt F. July 17
- * 
- */
-
-
-
-/*
- * Includes
- */
-#include <Arduino.h>
-#include <ArduinoJson.h>
-
-#include "sensocampus.h"
-
-#include "neocampus_eeprom.h"
-#include "neocampus_utils.h"
-
-
-
-/*
- * Class constructor
- */
-senso::senso( void ) {
-  _initialized = false;
-  // set default values
-  _applyDefaults();
-}
-
-senso::senso( wifiParametersMgt *p ) {
-  _initialized = false;
-  // set default values
-  _applyDefaults();
-  // register link to global wifi parameters & options
-  _wifiParams = p;
-}
-
-
-/*
- * Begin ... means populate everything from HTTP server sensocampus
- * till the EEPROM
- */
-boolean senso::begin( const char *mac ) {
-  log_info(F("\n[sensOCampus] start with provided mac addr ")); log_info( mac); log_flush();
-
-  // check global parameters
-  if( _wifiParams and _wifiParams->isValid() and _wifiParams->isEnabledSandbox()== true ) {
-    /*
-     * sensOCampus is NOT enabled
-     * ==> using SANDBOX mode
-     */
-    log_debug(F("\n[senso] >>> DISABLED: using sensOCampus SANDBOX mode <<<")); log_flush();
-    _mqtt_port = DEFL_MQTT_ABROAD_PORT;   // probably because disabled mode means abroad ;)
-    delay(1000);
-  }
-  else {
-    /*
-     * sensOCampus normal operation
-     */
-    // get device CREDENTIALS
-    if( http_getCredentials( mac ) != true ) {
-      log_error(F("\n[senso] error getting CREDENTIALS from sensOCampus server ?!")); log_flush();
-      _applyDefaults();
-      return false;
-    }
-    
-    // get device CONFIG
-    if( http_getConfig( ) != true ) {
-      log_error(F("\n[senso] error getting CONFIG from sensOCampus server ?!")); log_flush();
-      _applyDefaults();
-      return false;
-    }
-  }
-
-  // both CREDENTIALS & CONFIG done :)
-  _initialized = true;
-  
-  return true;
-}
-
-
-
-// obtain CREDENTIALS from sensOCampus server
-bool senso::http_getCredentials( const char *mac ) {
-  log_debug(F("\n[sensOCampus] start http getCredentials ... ")); log_flush();
-
-  // get JSON response to url credentials http get
-  char url[SENSO_HTTP_URL_MAXSIZE];
-  char buf[SENSO_HTTP_MAX_RESPONSE_SIZE];
-  snprintf(url, sizeof(url),"%s%s", SENSO_GET_CREDENTIALS_URL, mac );
-  if( !http_get( url, buf, sizeof(buf) ) ) {
-    return false;
-  }
-  log_debug(F("\n[senso] GET response <"));log_debug(buf);log_debug(F(">"));log_flush();
-
-  // [JSON] deserialize credentials
-  if( !_parseCredentials(buf) )
-    return false;
-
-  return true;
-}
-
-
-// obtain CONFIG from sensOCampus server
-bool senso::http_getConfig( void ) {
-  log_debug(F("\n[sensOCampus] start http getConfig ... ")); log_flush();
-
-  // get JSON response to url config http get
-  char url[SENSO_HTTP_URL_MAXSIZE];
-  char buf[SENSO_HTTP_MAX_RESPONSE_SIZE];
-  snprintf(url, sizeof(url),"%s", SENSO_GET_CONFIG_URL );
-  if( !http_get( url, buf, sizeof(buf), _mqtt_login, _mqtt_passwd ) ) {
-    return false;
-  }
-  log_debug(F("\n[senso] GET response <"));log_debug(buf);log_debug(F(">"));log_flush();
-
-  // [JSON] deserialize config
-  if( !_parseConfig(buf) )
-    return false;
-
-  return true;
-}
-
-
-
-/*
- * --- Private methods -----------------------------------------------------------------------
- */
-
-// apply defaults to sensOCampus parameters
-void senso::_applyDefaults( void ) {
-  _wifiParams = nullptr;
-  
-  // Note: snprintf automatically add NULL terminaison
-  snprintf(_mqtt_server, sizeof(_mqtt_server), DEFL_MQTT_SERVER);
-  _mqtt_port = DEFL_MQTT_STD_PORT;
-  snprintf(_mqtt_login, sizeof(_mqtt_login), DEFL_MQTT_LOGIN);
-  snprintf(_mqtt_passwd, sizeof(_mqtt_passwd), DEFL_MQTT_PASSWD);
-  snprintf(_mqtt_base_topic, sizeof(_mqtt_base_topic), "%s/%s", DEFL_MQTT_TOPIC, getAPname());  
-}
-
-// parse JSON buffer that contains credentials
-bool senso::_parseCredentials( char *json ) {
-  log_debug(F("\n[senso] start parsing JSON credentials ..."));
-
-  StaticJsonDocument<SENSO_JSON_SIZE> root;
-  
-  auto err = deserializeJson( root, json );
-  if( err ) {
-    log_error(F("\n[senso] ERROR parsing JSON credentials :"));log_error(err.c_str()); log_flush();
-    return false;
-  }
-
-  // check for "server" (i.e MQTT broker) in JSON buffer
-  if( (root.containsKey(F("server"))==true) ) {
-    snprintf(_mqtt_server, sizeof(_mqtt_server),"%s", (const char *)(root[F("server")]) );
-    log_info(F("\n[senso] found 'server' = "));log_info(_mqtt_server); log_flush();
-  }
-  
-  // check for "port" (i.e MQTT broker port) in JSON buffer
-  if( (root.containsKey(F("port"))==true) ) {
-    _mqtt_port = (uint16_t)root[F("port")];
-    log_info(F("\n[senso] found 'port' = "));log_info(_mqtt_port,DEC); log_flush();
-  }
-
-  // check for "login" in JSON buffer
-  if( (root.containsKey(F("login"))==false) ) {
-    log_error(F("\n[senso] JSON credentials without 'login' ?!?!"));
-    return false;
-  }
-  /* ok, we have a 'login' field ...
-   * ... if we have a password field we apply both to senso & EEPROM
-   */
-  // check for password in JSON
-  if( (root.containsKey(F("password"))==true) ) {
-    snprintf(_mqtt_login,sizeof(_mqtt_login),"%s", (const char *)(root[F("login")]) );
-    setEEPROMlogin( _mqtt_login );
-    snprintf(_mqtt_passwd,sizeof(_mqtt_passwd),"%s", (const char *)(root[F("password")]) );
-    setEEPROMpasswd( _mqtt_passwd );
-    log_info(F("\n[senso] eeprom stored login & password :)"));
-    return true;
-  }
-
-  /*
-   * So far, we have a login field but without a password field ...
-   * ... thus it means that this later ought to get stored within
-   * EEPROM along with corresponding login in EEPROM too
-   */
-  // retrieve login from EEPROM
-  if( !getEEPROMlogin( _mqtt_login, sizeof(_mqtt_login) ) ) {
-    log_error(F("\n[senso] login not found in EEPROM ?!?!")); log_flush();
-    return false;
-  }
-  size_t len1=strlen(_mqtt_login);
-  size_t len2=strlen(root[F("login")]);
-  if( (len1!=len2) or strncmp(_mqtt_login, root[F("login")], max(len1,len2)) ) {
-    log_error(F("\n[senso] error login does not match the one stored in EEPROM ?!")); log_flush();
-    return false;
-  }
-
-  /*
-   * ok, JSON credentials provided login is the same as the one within EEPROM ...
-   * ... now retrieve saved password from EEPROM
-   */
-  if( !getEEPROMpasswd( _mqtt_passwd, sizeof(_mqtt_passwd) ) ) {
-    log_error(F("\n[senso] error passwd not found in EEPROM !!")); log_flush();
-    return false;
-  }
-
-  // success :)
-  return true;
-}
-
-
-// parse JSON buffer that contains config
-bool senso::_parseConfig( char *json ) {
-  log_debug(F("\n[senso] start parsing JSON config ..."));
-
-  StaticJsonDocument<SENSO_JSON_SIZE> root;
-
-  auto err = deserializeJson( root, json );
-  if( err ) {
-    log_error(F("\n[senso] ERROR parsing JSON config: "));log_error(err.c_str()); log_flush();
-    return false;
-  }
-
-  // check for "topic" in JSON buffer
-  if( (root.containsKey(F("topics"))==false) ) {
-    log_error(F("\n[senso] JSON config without base 'topic' ?!?!"));
-    return false;
-  }
-  log_info(F("\n[senso] WARNING: only 1st topic taken into account!"));
-  //strcpy(_mqtt_base_topic,root[F("topics")][0]);
-  snprintf( _mqtt_base_topic, sizeof(_mqtt_base_topic), "%s", (const char *)(root[F("topics")][0]) );
-  log_info(F("\n[senso] base TOPIC = ")); log_debug(_mqtt_base_topic); log_flush();
-
-  // check for server (MQTT)
-  if( (root.containsKey(F("server"))==true) ) {
-    snprintf( _mqtt_server, sizeof(_mqtt_server), "%s", (const char *)root[F("server")] );
-    log_info(F("\n[senso] set MQTT server to ")); log_debug(_mqtt_server); log_flush();  
-  }
-
-  // check for server (MQTT)
-  if( (root.containsKey(F("server"))==true) ) {
-    snprintf( _mqtt_server, sizeof(_mqtt_server), "%s", (const char *)root[F("server")] );
-    log_info(F("\n[senso] set MQTT server to ")); log_debug(_mqtt_server); log_flush();  
-  }
-
-  // check for server port (MQTT)
-  if( (root.containsKey(F("port"))==true) ) {
-    _mqtt_port = (uint16_t)root[F("port")];
-    log_info(F("\n[senso] set MQTT port to ")); log_debug(_mqtt_port,DEC); log_flush();  
-  }
-
-  // parse additional parameters here :)
-
-  return true;
-}
-
-
-// Send back server name
-const char * senso::getServer( void ) const {
-  return _mqtt_server;
-}
-
-// Send back port number
-uint16_t senso::getServerPort( void ) const {
-  return _mqtt_port;
-}
-
-// Send back BaseTopic
-const char *senso::getBaseTopic( void ) const {
-  return _mqtt_base_topic;
-}
-
-// Send back MQTT username
-const char *senso::getUser( void ) const {
-  return _mqtt_login;
-}
-
-// Send back MQTT password
-const char *senso::getPassword( void ) const {
-  return _mqtt_passwd;
-}
-
diff --git a/work/neocampus_libs.orig/sensocampus.h b/work/neocampus_libs.orig/sensocampus.h
deleted file mode 100644
index 10fe9102..00000000
--- a/work/neocampus_libs.orig/sensocampus.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * neOCampus operation
- * 
- * sensOCampus client class for interactions with sensOCampus server
- * 
- * Thiebolt F. July 17
- * 
- */
-
-
-#ifndef _SENSOCAMPUS_H_
-#define _SENSOCAMPUS_H_
-
-/*
- * Includes
- */
-
-#include <Arduino.h>
-//#include <ArduinoJson.h>
-
-#include "neocampus.h"
-#include "neocampus_debug.h"
-
-#include "wifiParametersMgt.h"
-
-
-
-/*
- * Definitions
- */
-#define SENSO_GET_CREDENTIALS_URL       "http://sensocampus.univ-tlse3.fr/device/credentials?mac="
-#define SENSO_GET_CONFIG_URL            "http://sensocampus.univ-tlse3.fr/device/config"
-#define SENSO_HTTP_URL_MAXSIZE          128   // maximum size of a URL sent to sensOCampus
-#define SENSO_HTTP_MAX_RESPONSE_SIZE    1024  // maximum size of a response from from an url sent to sensOCampus
-#define SENSO_JSON_SIZE                 (JSON_OBJECT_SIZE(128))   // no more than 128 objects in any sensOCampus JSON response
-#define SENSO_UNITID_SIZE               18    // unitID field maxsize (mac addr is 17 bytes)
-
-
-/*
- * Class
- */
-class senso {
-  public:
-    senso( void );
-    senso( wifiParametersMgt * );
-    
-    boolean begin( const char * );
-    bool http_getCredentials( const char * );
-    bool http_getConfig( void );
-    
-    const char *getServer( void ) const;
-    uint16_t getServerPort( void ) const;
-    const char *getBaseTopic( void ) const;
-    const char *getUser( void ) const;
-    const char *getPassword( void ) const;
-
-private:
-    /*
-     * private methods
-     */
-    void _applyDefaults( void );
-    bool _parseCredentials( char * );
-    bool _parseConfig( char * );
-
-    /*
-     * private attributes
-     */
-    // check if structure is valid
-    bool _initialized;
-    
-    // global wifiParametersMgt
-    wifiParametersMgt *_wifiParams;
-    
-    // grabbed from sensocampus sever
-    char _mqtt_server[MQTT_SERVER_NAME_LENGTH];
-    uint16_t _mqtt_port;
-    char _mqtt_login[SENSO_MQTT_LOGIN_LENGTH];
-    char _mqtt_passwd[SENSO_MQTT_PASSWD_LENGTH];
-    char _mqtt_base_topic[MQTT_BASE_TOPIC_LENGTH];
-};
-
-#endif /* _SENSOCAMPUS_H */
diff --git a/work/neocampus_libs.orig/wifiParametersMgt.cpp b/work/neocampus_libs.orig/wifiParametersMgt.cpp
deleted file mode 100644
index 56a7ef01..00000000
--- a/work/neocampus_libs.orig/wifiParametersMgt.cpp
+++ /dev/null
@@ -1,478 +0,0 @@
-/*
- * neOCampus operation
- * 
- * User's high-level parameters management class.
- * Most of those parameters come from WiFiManager parameters
- *
- * Thiebolt F. Jun.18 initial release
- * 
- */
-
-
-/*
- * Includes
- */
-#include <FS.h>
-
-/*
- * ESP8266 advanced ops
- */
-extern "C" {
-  #include "user_interface.h"           // wifi_station_dhcpc_start, ...
-}
-
-#include "neocampus.h"
-
-#include "neocampus_debug.h"
-#include "neocampus_utils.h"
-
-#include "wifiParametersMgt.h"
-
-
-/*
- * Global shared variables/functions
- */
-extern bool _need2reboot;
-
-
-/*
- * Definitions
- */
-#define CONFIG_JSON_SIZE        (JSON_OBJECT_SIZE(20))    // config file contains: frequency
-
-
-// constructor
-wifiParametersMgt::wifiParametersMgt( void ) {
-  _initialized = false;
-  
-  // apply default values
-  _applyDefaults();
-}
-
-// destructor
-wifiParametersMgt::~wifiParametersMgt( void ) {
-  // free dynamically allocated memory
-}
-
-
-
-/*
- * check parameters validity
- * i.e they have been initialized at least once
- */
-bool wifiParametersMgt::isValid( void ) {
-  if( ! _initialized ) {
-    log_debug(F("\n[wifiParams] someone queried the parameters status that is NOT yet initialized ..."));log_flush();
-  }
-  
-  return _initialized;
-}
-
-
-
-/*
- * load parameters file
- */
-bool wifiParametersMgt::loadConfigFile( void ) {
-
-  if( ! SPIFFS.exists(WIFI_CONFIG_FILE) ) {
-    log_info(F("\n[wifiParams] WiFi config file ")); log_info(WIFI_CONFIG_FILE); log_info(F(" does not exists"));
-    log_info(F("\n[wifiParams] applying DEFAULTS ..."));
-    log_flush();
-    _applyDefaults();
-    return false;
-  }
-  
-  // open wifi config file
-  File configFile = SPIFFS.open(WIFI_CONFIG_FILE, "r");
-  if( ! configFile ) {
-    log_error(F("\n[wifiParams] error opening WiFi config file ")); log_error(WIFI_CONFIG_FILE);
-    log_error(F("\n[wifiParams] removing file and applying DEFAULTS ..."));
-    log_flush();
-    SPIFFS.remove(WIFI_CONFIG_FILE);
-    _applyDefaults();
-    return false;
-  }
-
-  // grab file content in JSON buffer
-  log_debug(F("\n[wifiParams] start reading WiFi config file ...")); log_debug(WIFI_CONFIG_FILE); log_flush();
-  size_t size = configFile.size();
-  // Allocate a buffer to store contents of the file.
-  std::unique_ptr<char[]> buf(new char[size]);
-  log_debug(F("\n\treading ")); log_debug(size,DEC); log_debug(F(" bytes from config file ")); log_flush();
-  configFile.readBytes(buf.get(), size);
-
-  // JSON buffer allocation
-  if( size > (CONFIG_JSON_SIZE) ) {
-    log_error(F("\n[wifiParams] config file to read is too large for JsonBuffer to handle: ")); log_error(size,DEC); log_error(F(" bytes!")); log_flush();
-    return false;
-  }
-  
-  StaticJsonDocument<CONFIG_JSON_SIZE> root;
-
-  auto err = deserializeJson( root, buf.get() );
-  if( err ) {
-    log_error(F("\n[wifiParams] JSON format error in WiFi config file ")); log_error(WIFI_CONFIG_FILE);
-    log_error(F("\n[wifiParams] ERROR msg: ")); log_error(err.c_str());
-    log_error(F("\n[wifiParams] removing file and applying DEFAULTS ..."));
-    log_flush();
-    SPIFFS.remove(WIFI_CONFIG_FILE);
-    _applyDefaults();
-    return false;
-  }
-#if (LOG_LEVEL >= LOG_LVL_DEBUG)
-  serializeJsonPretty( root, Serial );
-#endif
-
-  // ready to parse JSON objects and to extract values
-  return _loadConfig( root.as<JsonObject>() );
-}
-
-
-
-/*
- * save updated parameters to the config file
- */
-bool wifiParametersMgt::saveConfigFile( void ) {
-  if( !isValid() ) return false;
-  
-  if( !_updated ) {
-    log_debug(F("\n[wifiParams] saved options from WEB portal didn't modified any of the default values for options ... thus nothing to save!")); log_flush();
-    return false;
-  }
-  
-  log_info(F("\n[wifiParams] start to SAVE wifi parameters in config file ...")); log_flush();
-  
-  // create JSON structure
-  StaticJsonDocument<CONFIG_JSON_SIZE> _doc;
-  JsonObject root = _doc.to<JsonObject>();
-  
-  
-  // fill-in JSON structure
-  _saveConfig( root );
-  
-  
-  /*
-   * save JSON to config file
-   */
-  if( root.size()==0 ) {
-    // nothing to save ... thus we delete the config file (if any)
-    log_debug(F("\n[wifiParams] empty JSON structure ... thus remove config file: "));log_debug(WIFI_CONFIG_FILE);log_flush();
-    return SPIFFS.remove(WIFI_CONFIG_FILE);
-  }
-  
-  // ok, there's something to save at least
-  File configFile = SPIFFS.open( WIFI_CONFIG_FILE, "w"); // truncate if exists or create otherwise
-  if( !configFile ) {
-    log_error(F("\n[wifiParams] error creating file: "));log_debug(WIFI_CONFIG_FILE);log_flush();
-    return false;
-  }
-  
-  // save JSON to file
-  
-  if( serializeJson( root, configFile )==0 ) {
-    configFile.close();
-    log_error(F("\n[wifiParams] error unable to write data to file: "));log_debug(WIFI_CONFIG_FILE);log_flush();
-    return false;
-  }
-  
-  // close file
-  configFile.close();
-  
-  log_info(F("\n[wifiParams] successfully saved JSON config file: "));log_debug(WIFI_CONFIG_FILE);log_flush();
-    
-  return true;
-}
-
-
-  
-/*
- * Grab WIFI settings from struct station_config
- */
-bool wifiParametersMgt::_getWIFIsettings( void ) {
-  // grab WIFI station connexion parameters from current connexion ...
-  struct station_config _conf;
-  
-  if( wifi_station_get_config(&_conf) and strlen(reinterpret_cast<const char*>(_conf.ssid)) ) {
-  
-    log_debug(F("\n[wifiParams] retrieved current ssid = ")); log_debug(reinterpret_cast<const char*>(_conf.ssid));
-    log_debug(F("\n[wifiParams] retrieved current pass = ")); log_debug(reinterpret_cast<const char*>(_conf.password));
-    log_flush();
-    
-    if( strcmp(_ssid, reinterpret_cast<const char*>(_conf.ssid)) or
-        !strcmp(_pass, reinterpret_cast<const char*>(_conf.password)) ) {
-    
-      log_debug(F("\n[wifiParams] new credentials detected ... update!")); log_flush();
-      strncpy( _ssid, reinterpret_cast<const char*>(_conf.ssid), sizeof(_ssid) );
-      strncpy( _pass, reinterpret_cast<const char*>(_conf.password), sizeof(_pass) );
-      _updated = true;
-    }
-  }
-  else {
-    log_debug(F("\n[wifiParams] no SSID / PASS found neither in config file nor struct station ... probably first time connect ...")); log_flush();
-    return false;
-  }
-
-  return true;
-}
-
-
-
-/*
- * get WiFi SSID
- */
-const char *wifiParametersMgt::getWIFIssid( void ) {
-  if( !_initialized ) return nullptr;
-  return _ssid;
-}
-
-
-
-/*
- * get WiFi PASSWORD
- */
-const char *wifiParametersMgt::getWIFIpass( void ) {
-  if( !_initialized ) return nullptr;
-  return _pass;
-}
-
-
-
-/*
- * sensOCampus SANDBOX option
- */
-bool wifiParametersMgt::_setopt_sandboxMode( bool value ) {
-  if( value != _opt_sandboxMode ) {
-    _opt_sandboxMode = value;
-    _updated = true;
-  }
-  return _opt_sandboxMode;
-}
-
-
-
-/*
- * neOClock TM1637 7 segment display driver
- */
-bool wifiParametersMgt::_setopt_7segTM1637( bool value ) {
-  if( value != _opt_7segTM1637 ) {
-    _opt_7segTM1637 = value;
-    _updated = true;
-  }
-  return _opt_7segTM1637;
-}
-
-
-
-/*
- * PIR sensor option
- */
-bool wifiParametersMgt::_setopt_PIRsensor( bool value ) {
-  if( value != _opt_PIRsensor ) {
-    _opt_PIRsensor = value;
-    _updated = true;
-  }
-  return _opt_PIRsensor;
-}
-
-
-
-/*
- * Dangerous: Erase ALL option
- */
-bool wifiParametersMgt::_setopt_eraseALL( bool value ) {
-    _opt_eraseALL = value;
-    return _opt_eraseALL;
-}
-
-
-
-/* ------------------------------------------------------------------------------
- * Private methods 
- */
-
-
-
-/*
- * apply DEFAULTS values
- * Note: options ought to get false as defaults
- */
-void wifiParametersMgt::_applyDefaults( void ) {
-
-  // will get set to true once we'll have options set though our captive WEB portal
-  _updated = false;
-  
-  // WiFi settings
-  _ssid[0] = '\0';
-  _pass[0] = '\0';
-  
-  // as default, senSOcampus sandbox mode is DISABLED
-  _opt_sandboxMode = false;
-  
-  // TM1637 7segment based clock
-  _opt_7segTM1637 = false;
-
-  // PIR sensor set as an option because it can't get detected
-  _opt_PIRsensor = false;
-  
-  
-  
-  
-  // Whole destruction option
-  _opt_eraseALL = false;
-  
-  /*
-   * finally structure is initialized
-   */
-  _initialized = true;
-}
-
-
-
-/*
- * fill JSON structure with things to save
- */
-bool wifiParametersMgt::_saveConfig( JsonObject root ) {
-  
-  // save WiFi parameters
-  if( strlen(_ssid) ) {
-    root["ssid"] = _ssid;
-    root["pass"] = _pass;
-  }
-  else {
-    log_debug(F("\n[wifiParams] no WIFI credentials to save ..."));log_flush();
-  }
-  
-  // save options ?
-  if( _updated ) {
-    
-    root["opt_sandboxMode"]   = _opt_sandboxMode;
-    root["opt_7segTM1637"]    = _opt_7segTM1637;
-    root["opt_PIRsensor"]     = _opt_PIRsensor;
-
-    /*
-    * add additional options here
-    */
-  }
-  else {
-    log_debug(F("\n[wifiParams] no change in options to save ..."));log_flush();
-  }
-  
-  return true;
-}
-
-
-
-/*
- * parse JSON objects that contain config
- */
-bool wifiParametersMgt::_loadConfig( JsonObject root ) {
-  log_debug(F("\n[wifiParams] start parsing JSON config ..."));
-
-  bool _wifiSet = false;
-
-/*
-// using C++98 syntax (for older compilers):
-for (JsonObject::iterator it=root.begin(); it!=root.end(); ++it) {
-    Serial.println(it->key().c_str());
-    Serial.println(it->value().as<char*>());
-}
-*/
-
-  // iterate over all [key,values] pairs
-  for (JsonObject::iterator it=root.begin(); it!=root.end(); ++it) {
-
-    {
-      const char *_key = PSTR("ssid");
-      if( strncmp_P(it->key().c_str(), _key, strlen_P(_key))==0 ) {
-        // SSID is present :)
-        if( it->value().is<const char*>() ) {
-          _wifiSet = true;
-          strncpy( _ssid, it->value(), sizeof(_ssid) );
-          log_debug(F("\n[wifiParams][config_file] ssid = ")); log_debug(_ssid); log_flush();
-        }
-        else {
-          log_error(F("\n[wifiParams] wifi_ssid is not of const char* type ?!?!")); log_flush();
-        }
-        continue;
-      }
-    }
-    
-    {
-      const char *_key = PSTR("pass");
-      if( strncmp_P(it->key().c_str(), _key, strlen_P(_key))==0 ) {
-        // PASS is present :)
-        if( it->value().is<const char*>() ){
-          _wifiSet = true;
-          strncpy( _pass, it->value(), sizeof(_pass) );
-          log_debug(F("\n[wifiParams][config_file] pass = ")); log_debug(_pass); log_flush();
-        }
-        else {
-          log_error(F("\n[wifiParams] wifi_pass is not of const char* type ?!?!")); log_flush();
-        }
-        continue;
-      }
-    }
-
-    {
-      const char *_key = PSTR("opt_sandboxMode");
-      if( strncmp_P(it->key().c_str(), _key, strlen_P(_key))==0 ) {
-        // sensOCampus sandbox mode
-        if( it->value().is<bool>() ) {
-          _opt_sandboxMode = it->value();
-          log_debug(F("\n[wifiParams][config_file] sandboxMode = ")); log_debug(_opt_sandboxMode,DEC); log_flush();
-        }
-        else {
-          log_error(F("\n[wifiParams] opt_sandboxMode is not a bool ?!?!")); log_flush();
-        }
-        continue;
-      }
-    }
-
-    {
-      const char *_key = PSTR("opt_7segTM1637");
-      if( strncmp_P(it->key().c_str(), _key, strlen_P(_key))==0 ) {
-        // TM1737 based 7 segment display
-        if( it->value().is<bool>() ) {
-          _opt_7segTM1637 = it->value();
-          log_debug(F("\n[wifiParams][config_file] 7segTM1637 = ")); log_debug(_opt_7segTM1637,DEC); log_flush();
-        }
-        else {
-          log_error(F("\n[wifiParams] opt_7segTM1637 is not a bool ?!?!")); log_flush();
-        }
-        continue;
-      }
-    }
-
-        {
-      const char *_key = PSTR("opt_PIRsensor");
-      if( strncmp_P(it->key().c_str(), _key, strlen_P(_key))==0 ) {
-        // PIR sensor
-        if( it->value().is<bool>() ) {
-          _opt_PIRsensor = it->value();
-          log_debug(F("\n[wifiParams][config_file] PIR sensor = ")); log_debug(_opt_PIRsensor,DEC); log_flush();
-        }
-        else {
-          log_error(F("\n[wifiParams] opt_PIRsensor is not a bool ?!?!")); log_flush();
-        }
-        continue;
-      }
-    }
-
-    // unknown key ?!?!
-    log_error(F("\n[wifiParams] unknown key: "));log_debug((const char*)(it->key().c_str())); log_flush();
-  }
-
-  /*
-   * check if wifi connexion parameters have been read ...
-   * ... otherwise we'll extract them from struct station
-   */
-  if( _wifiSet ) return true;
-  
-  // grab from previous settings ...
-  _getWIFIsettings();
-  
-  // over :)
-  return true;
-}
-
diff --git a/work/neocampus_libs.orig/wifiParametersMgt.h b/work/neocampus_libs.orig/wifiParametersMgt.h
deleted file mode 100644
index 98a5e8a4..00000000
--- a/work/neocampus_libs.orig/wifiParametersMgt.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * neOCampus operation
- * 
- * User's high-level parameters management class.
- * Most of those parameters come from WiFiManager parameters
- *
- * Thiebolt F. Jun.18 initial release
- * 
- */
-
-
-#ifndef _WIFI_PARAMETERS_MGT_H_
-#define _WIFI_PARAMETERS_MGT_H_
-
-/*
- * Includes
- */
-#include <Arduino.h>
-#include <ArduinoJson.h>
-
-#include "neocampus.h"
-
-
-
-
-/*
- * Definitions
- */
-
-
-
-/*
- * Class
- */
-class wifiParametersMgt {
-  public:
-    wifiParametersMgt( void );
-    ~wifiParametersMgt( void );
-
-    // methods
-    bool isValid( void );               // tell parameters have been initialized at least once
-    bool loadConfigFile( void );
-    bool saveConfigFile( void );
-    
-    const char * getWIFIssid( void );
-    const char * getWIFIpass( void );
-    bool _getWIFIsettings( void );       // read struct station to extract WIFI parameters
-    
-    // wrapper for options querries
-    bool isEnabledSandbox( void ) { return _opt_sandboxMode; };       // tell if neOCampus sandbox apply or if sensocampus is enabled (default)
-    bool _setopt_sandboxMode( bool );   // TODO: find a better way :|
-    
-    bool isEnabled7segTM1637( void ) { return _opt_7segTM1637; };     // tell if 7-segments TM1637 driver has been activated (neOClock)
-    bool _setopt_7segTM1637( bool );    // TODO: find a better way :|
-    
-    bool isEnabledPIR( void ) { return _opt_PIRsensor; };             // tell if infrared detector has been activated
-    bool _setopt_PIRsensor( bool );     // TODO: find a better way :|
-
-
-
-    bool isEnabledEraseALL( void ) { return _opt_eraseALL; };        // tell sensor to clear everything (wifi, eeprom and spiffs)
-    bool _setopt_eraseALL( bool );     // TODO: find a better way :|
-
-  private:
-
-    bool _initialized;
-    bool _updated;                    // did WEB options have been saved ?
-
-    char _ssid[32];
-    char _pass[64];              // for WEP keys ?? (yes ?)
-    
-    bool _opt_sandboxMode;            // sensOCampus NORMAL / SANDBOX mode
-    bool _opt_7segTM1637;             // TM1737 7segment display available
-    bool _opt_PIRsensor;              // PIR sensor available
-    
-    bool _opt_eraseALL;               // flag for whole destruction of WiFi credentials, eeprom, spiffs
-    
-    /*
-     * private member functions
-     */
-    void _applyDefaults( void );
-    bool _loadConfig( JsonObject );       // interprets JSON buffer from config file
-    bool _saveConfig( JsonObject );       // fill JSON buffer with things to save to config file
-};
-
-
-#endif /* _WIFI_PARAMETERS_MGT_H_ */
-
-
-- 
GitLab