diff --git a/Examples/3_ESPNOW_Gateway/3_ESPNOW_Gateway.ino b/Examples/3_ESPNOW_Gateway/3_ESPNOW_Gateway.ino index f3f21be..d6cd1e4 100644 --- a/Examples/3_ESPNOW_Gateway/3_ESPNOW_Gateway.ino +++ b/Examples/3_ESPNOW_Gateway/3_ESPNOW_Gateway.ino @@ -55,6 +55,12 @@ MQTT_FDRSGateWay MQTT(1000,WIFI_SSID,WIFI_PASS,MQTT_ADDR,MQTT_PORT); ESP_FDRSGateWay ESPNow(broadcast_mac,selfAddress,1000); +#if defined(ESP32) +Serial_FDRSGateWay SerialGW(&Serial1,115200,1000); +#else +Serial_FDRSGateWay SerialGW(&Serial,115200,1000); +#endif + void setup() { #ifdef USE_LED @@ -74,10 +80,12 @@ void setup() { #ifdef ESPNOW_PEER_2 ESPNow.add_peer(ESPNOW2); #endif - - #endif - +#if defined(ESP32) + SerialGW.init(SERIAL_8N1,RXD2,TXD2); +#else + SerialGW.init(); +#endif // #ifdef USE_LORA // DBG("Initializing LoRa!"); // SPI.begin(SCK, MISO, MOSI, SS); @@ -95,8 +103,10 @@ void setup() { void loop() { - ESPNow.release(); + SerialGW.get(); + + ESPNow.release(); #ifdef ESPNOWG_DELAY if (millis() > timeESPNOWG) { timeESPNOWG += ESPNOWG_DELAY; @@ -147,9 +157,7 @@ void loop() { // } // #endif - while (UART_IF.available()) { - getSerial(); - } + // getLoRa(); } diff --git a/fdrs_gateway.cpp b/fdrs_gateway.cpp index f0c707e..a6fd18b 100644 --- a/fdrs_gateway.cpp +++ b/fdrs_gateway.cpp @@ -12,8 +12,6 @@ bool ESP_FDRSGateWay::is_init = false; std::vector ESP_FDRSGateWay::peer_list; std::vector ESP_FDRSGateWay::unknow_peer; -bool MQTT_FDRSGateWay::is_init = false; - uint8_t newData = 0; uint8_t ln = 0; DataReading_t theData[256]; @@ -483,8 +481,6 @@ void MQTT_FDRSGateWay::mqtt_callback(char* topic, byte * message, unsigned int l FDRSGateWayBase::add_data(&data); memset(&data,0,sizeof(DataReading_t)); } - ln = s; - newData = 5; DBG("Incoming MQTT."); } @@ -540,4 +536,71 @@ void MQTT_FDRSGateWay::send(std::vector data) { reconnect(); _client->loop(); +} + + +Serial_FDRSGateWay::Serial_FDRSGateWay(HardwareSerial *serial, uint32_t baud, uint32_t send_delay): + FDRSGateWayBase(send_delay), + _serial(serial), + _baud(baud) +{ + +} + +void Serial_FDRSGateWay::init(void){ + _serial->begin(_baud); +} + +#if defined(ESP32) +void Serial_FDRSGateWay::init(int mode, int rx_pin, int tx_pin){ + _serial->begin(_baud,mode,rx_pin,tx_pin); +} +#endif + +void Serial_FDRSGateWay::pull(void){ + //TDDO: this is blocking. Some method of escaping is required. + // At the momment we are just hoping we get a \n + String incomingString = _serial->readStringUntil('\n'); + DynamicJsonDocument doc(24576); + DeserializationError error = deserializeJson(doc, incomingString); + // Test if parsing succeeds. + if (error) { + // DBG("json parse err"); + // DBG(incomingString); + return; + } + + int s = doc.size(); + //UART_IF.println(s); + DataReading_t data; + memset(&data,0,sizeof(DataReading_t)); + for (int i = 0; i < s; i++) { + data.id = doc[i]["id"]; + data.type = doc[i]["type"]; + data.data = doc[i]["data"]; + FDRSGateWayBase::add_data(&data); + memset(&data,0,sizeof(DataReading_t)); + } + DBG("Incoming Serial."); + +} + + +void Serial_FDRSGateWay::get(void){ + while(_serial->available()){ + pull(); + } +} + +void Serial_FDRSGateWay::send(std::vector data){ + + DBG("Releasing Serial."); + DynamicJsonDocument doc(24576); + for (int i = 0; i < data.size(); i++) { + doc[i]["id"] = data[i].id; + doc[i]["type"] = data[i].type; + doc[i]["data"] = data[i].data; + } + serializeJson(doc, *_serial); + _serial->println(); } \ No newline at end of file diff --git a/fdrs_gateway.h b/fdrs_gateway.h index 1e28ae6..cf952b3 100644 --- a/fdrs_gateway.h +++ b/fdrs_gateway.h @@ -1,6 +1,7 @@ #ifndef __FDRS_GATEWAY_H__ #define __FDRS_GATEWAY_H__ +#include "HardwareSerial.h" #include "fdrs_types.h" #include #include @@ -169,14 +170,32 @@ private: WiFiClient espClient; PubSubClient *_client; - static bool is_init; - - static void setup(void); - void reconnect(); void send(std::vector data) override; +}; + + +class Serial_FDRSGateWay: public FDRSGateWayBase{ + +public: + Serial_FDRSGateWay(HardwareSerial *serial, uint32_t baud, uint32_t send_delay); + + void init(void); +#if defined(ESP32) + void init(int mode, int rx_pin, int tx_pin); +#endif + void get(void); +private: + + HardwareSerial *_serial; + uint32_t _baud; + static void setup(void); + void pull(void); + void send(std::vector data) override; }; + + #endif \ No newline at end of file