diff --git a/examples/sPSN_Broker/sPSN_Broker.ino b/examples/Broker/sPSN_Broker/sPSN_Broker.ino similarity index 100% rename from examples/sPSN_Broker/sPSN_Broker.ino rename to examples/Broker/sPSN_Broker/sPSN_Broker.ino diff --git a/examples/Broker/sPSN_BrokerVerbose/sPSN_BrokerVerbose.ino b/examples/Broker/sPSN_BrokerVerbose/sPSN_BrokerVerbose.ino new file mode 100644 index 0000000000000000000000000000000000000000..de1eb1c5dbda606168daf1ce7b31fb34d226afe9 --- /dev/null +++ b/examples/Broker/sPSN_BrokerVerbose/sPSN_BrokerVerbose.ino @@ -0,0 +1,62 @@ +/** + *file: sPSN_Broker.ino + *author: letsgoING -> info@letsgoing.de + * + *description: + * Dieses Programm ist ein Teil eines Beispiels für ein einfaches Pub-Sub-Netzwerk. + * + * Für ein Sensor-Netwerk werden 3 Arduinos mit IR-Link-Modulen benötigt: + * Arduino1: sPSN_Broker.ino (dieses Programm) + * - IR-Sender an Pin 11 IR-Empfänger an Pin10 + * Arduino2: sPSN_Client1.ino + * - IR-Sender an Pin 11 IR-Empfänger an Pin10 + * - Taster an Pin2 + * - LED an Pin9 + * Arduino3: sPSN_Client2.ino + * - IR-Sender an Pin 11 IR-Empfänger an Pin10 + * - Poti an PinA0 + * - LED an Pin9 + * + * Für ein Chat-Netzwerk werden mindestens 3 Arduinos benötigt: + * Arduino1: sPSN_Broker.ino (dieses Programm) + * - IR-Sender an Pin 11 IR-Empfänger an Pin10 + * Arduino2-n: sPSN_Chat.ino + * - IR-Sender an Pin 11 IR-Empfänger an Pin10 + * + *date: 14.12.2020 + *version: 1.0 + */ +#include <Arduino.h> +#include "SoftwareSerial.h" +#include "DidacticNet.h" + +// lege Geschwindigkeit für serielle Schnittstellen fest +#define SERIAL_BAUD 2400 + +// lege Pins für SoftwareSerielle Schnittstelle fest +// Rx = 10 -> Empfänger | Tx = 11 -> Sender +SoftwareSerial sSerial(10, 11); + +// Erzeuge Broker-Instanz +DidacticPSNetBroker psnBroker; + +void setup() +{ + // Starte Serielle Schnittstelle für Verbose-Ausgabe auf SerialMonitor + Serial.begin(SERIAL_BAUD); + + // Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen) + sSerial.begin(SERIAL_BAUD); + + // Lege fest welche Serielle Schnittstelle für sPSN verwendet werden soll + psnBroker.begin(sSerial); + + // Setze Broker in Verbos-Mode (Ausgabe aller Daten auf SM) und lege fest welche Serielle Schnittstelle verwendet werden soll + psnBroker.setVerbose(Serial); +} + +void loop() +{ + // hier verarbeitet der Broker alle Daten + psnBroker.handleNetwork(); +} diff --git a/src/DidacticNet.cpp b/src/DidacticNet.cpp index 3649719e6ab2dcabad84444ab796b6f4fa0e67d4..4aeaf5ef598d3846271a44b431bf9efccee4fe33 100644 --- a/src/DidacticNet.cpp +++ b/src/DidacticNet.cpp @@ -130,9 +130,7 @@ bool DidacticPSNet::recieveData() static int msgCounter = 0; static int topicCounter = 0; static int payloadCounter = 0; - // if(msgCounter == NULL){ msgCounter = 0; } - // if(topicCounter == NULL){ topicCounter = 0; } - // if(dataCounter == NULL){ dataCounter = 0; } + while (checkData()) { char localBuffer = _port->read(); @@ -159,8 +157,16 @@ bool DidacticPSNet::recieveData() } else if (_readBufferMessage[0] == MSG_PRELIMITER && localBuffer != MSG_DELIMITER) { - msgCounter++; - _readBufferMessage[msgCounter] = localBuffer; + if (msgCounter > LEN_OVERHEAD + MAX_LEN_TOPICS + MAX_LEN_PAYLOAD) + { + msgCounter == 0; + _readBufferMessage[0] = '\0'; + } + else + { + msgCounter++; + _readBufferMessage[msgCounter] = localBuffer; + } } } return false; @@ -515,6 +521,9 @@ bool DidacticPSNetBroker::handleData() int currentTopicNr = 0; int topicLength = 0; int dataLength = 0; + + printVerbose(_readBufferMessage); + if (_readBufferMessage[1] == MSG_PUBLISH) { topicLength = extractData(2, MAX_LEN_TOPICS, _bufferTopic, MSG_SEPARATOR); @@ -604,6 +613,35 @@ int DidacticPSNetBroker::getFreeTopicNr() return -1; } +void DidacticPSNetBroker::setVerbose(Stream &verbosePort) // TEST: new & untested +{ + _isVerbose = true; + _verbosePort = &verbosePort; +} + +void DidacticPSNetBroker::setNoneVerbose() // TEST: new & untested +{ + _isVerbose = false; +} + +bool DidacticPSNetBroker::printVerbose(char *recievedData) // TEST: new & untested +{ + char signBuffer = 0; + int signCounter = 0; + + if (_isVerbose) + { + while (signBuffer != MSG_DELIMITER) + { + signBuffer = recievedData[signCounter]; + _verbosePort->write(signBuffer); + signCounter++; + } + _verbosePort->write('\n'); + } + return _isVerbose; +} + //************************************************************************** // LITTLE HELPERS FOR CLIENTS ;-) //************************************************************************* diff --git a/src/DidacticNet.h b/src/DidacticNet.h index fe97293b8ea336f6de30f2550e994e8e366b6570..5812f7ac044dc029bcc403e155731371b776840f 100644 --- a/src/DidacticNet.h +++ b/src/DidacticNet.h @@ -223,21 +223,27 @@ public: class DidacticPSNetBroker : public DidacticPSNet { private: + Stream *_verbosePort; char _topic[MAX_NR_TOPICS_BROKER][MAX_LEN_TOPICS + 1] = {{0}}; char _data[MAX_NR_TOPICS_BROKER][MAX_LEN_PAYLOAD + 1] = {{0}}; + bool _isVerbose = false; + bool savePayload(char *, int); bool getMessageFilter(char); void writeDataToTopic(int, char *, char *); bool handleData(); int getTopicNr(char *); int getFreeTopicNr(); + bool update(char *, int, char *, int); // TEST: moved from public + bool printVerbose(char *); // TEST: new & untested public: DidacticPSNetBroker(); ~DidacticPSNetBroker(); - bool update(char *, int, char *, int); + void setVerbose(Stream &_port); // TEST: new & untested + void setNoneVerbose(); // TEST: new & untested }; #endif