From c8d4bfc64abe9190406281da28e0c6dec2108449 Mon Sep 17 00:00:00 2001
From: Francois <thiebolt@irit.fr>
Date: Mon, 18 Apr 2022 11:29:57 +0200
Subject: [PATCH] added SoftwareSerial port2 for esp8266 serial sensors. Tests
 required!

---
 neosensor/libraries/boards/neosensor.h        | 14 ++++++++++---
 .../libraries/neocampus_drivers/pm_serial.cpp | 21 +++++++++++++------
 2 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/neosensor/libraries/boards/neosensor.h b/neosensor/libraries/boards/neosensor.h
index 5516cc58..cceaed68 100644
--- a/neosensor/libraries/boards/neosensor.h
+++ b/neosensor/libraries/boards/neosensor.h
@@ -154,9 +154,17 @@
  */
 #ifndef SENSORS_SERIAL_LINK
   #ifdef ESP32
-    #define SENSORS_SERIAL_LINK     (uint8_t)2   // [jul.21] neOSensor V5 added (i.e Serial2)
-  #else
-    #define SENSORS_SERIAL_LINK     INVALID_SERIAL_LINK
+    #define SENSORS_SERIAL_LINK     (uint8_t)2    // [jul.21] neOSensor V5 added (i.e Serial2)
+  #elif defined(ESP8266)
+    /* [apr.22] notes about serial ports on esp8266
+     * - serial0(HW) is for programming and debug
+     * - serial1(HW) only TX
+     * - serial2(sw) this one
+     */
+    //#define SENSORS_SERIAL_LINK     INVALID_SERIAL_LINK
+    #define SENSORS_SERIAL_LINK     (uint8_t)2    // [apr.22] useless but just to have var defined (i.e Serial2)
+    #define SENSORS_SERIAL_LINK_RX  4             // shared with PIR sensor hence avoid double declaration ;)
+    #define SENSORS_SERIAL_LINK_TX  INVALID_GPIO  // no TX pin
   #endif
 #endif
 
diff --git a/neosensor/libraries/neocampus_drivers/pm_serial.cpp b/neosensor/libraries/neocampus_drivers/pm_serial.cpp
index aab2c01c..36eb56b2 100644
--- a/neosensor/libraries/neocampus_drivers/pm_serial.cpp
+++ b/neosensor/libraries/neocampus_drivers/pm_serial.cpp
@@ -19,6 +19,9 @@
  * Includes
  */
 #include <Arduino.h>
+#ifdef ESP8266
+#include <SoftwareSerial.h>
+#endif /* ESP8266 */
 
 #include "neocampus.h"
 #include "neocampus_debug.h"
@@ -65,7 +68,7 @@ pm_serial::pm_serial( void ) : generic_driver( _MEASURES_INTERLEAVE_MS,
   _measures = nullptr;
   _nbMeasures = 0;
 
-  /* [nov.21] we choose to disable PM%_ENABLE gpio because PMS sensors
+  /* [nov.21] we choose to disable PM_ENABLE gpio because PMS sensors
    * already features both sleep() and wakeUp() commands
   _enable_gpio = PM_ENABLE;           // PM_ENABLE gpio
   */
@@ -700,12 +703,18 @@ boolean pm_serial::_init( void ) {
     return false;
   }
 
-  #warning "esp8266 hack: Serial2 is not known ... correct me!"
-  #ifndef ESP8266
-  Serial2.begin( _link_speed );
-  _stream = &Serial2;  // TODO pointer to stream according to link number specified ... maybe later ;)
+  #if defined(ESP8266)
+    #warning "esp8266 serial2 makes use of SoftwareSerial!"
+    SoftwareSerial *mySerial2 = new SoftwareSerial(SENSORS_SERIAL_LINK_RX,SENSORS_SERIAL_LINK_TX);
+    if( !mySerial2 ) return false;
+    mySerial2->begin( _link_speed );
+    _stream = mySerial2;
+  #elif defined(ESP32)
+    Serial2.begin( _link_speed );
+    _stream = &Serial2;  // TODO pointer to stream according to link number specified ... maybe later ;)
   #else
-  return false;
+    #warning "unknown architecture for Serial2 link"
+    return false;
   #endif /* ESP8266 */
 
   if( !_stream ) return false;
-- 
GitLab