diff --git a/README.md b/README.md index 6254c88fe2ccd177ab05707c873c668409d82f18..bfffaaafc82e9b92365a5cd4d52d8aa60560952b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# didacticNetwork +# DidacticNetwork Bibliothek zur Implementierung von vereinfachten Netzwerken auf Arduino-Boards. Die Funktionalitaeten entsprechen dem Stand der Technik, die Umsetzung ist didaktisch reduziert. @@ -59,6 +59,17 @@ int psnClient.subscribe(char* topic, int length); // return ERROR-Wert: DN_ERROR_NO_ERROR, // DN_ERROR_TOPIC_LEN (Topic zu lang - wird abgeschnitten) +#Anzahl der aboonierten Topics ausgeben +int getMaxNrTopics(); +// return: Anzahl der abbonierten Topics + +#Bezeichnung eines abonnierten Topics ausgeben +int getSubscribedTopic(char*, int); +// param1: char-Array in das die Topic-Bezeichnung eingetragen wird +// param2: Nummer welches Topic ausgegeben werden soll (0 - getMaxNrTopics()) +// return ERROR-WERT: DN_ERROR_NO_ERROR, +// DN_ERROR_NO_TOPIC (Topic unter der angegebenen Nummer nicht verfügbar) + #Topic eines anderen Clients entfernen bool psnClient.unsubscribe(char* topic); // param: Topic String/char-Array @@ -120,6 +131,11 @@ int psnClient.publishOnChange(char* topic, int payload, int threshold); #Callback-Funktion (wird bei neuen Daten aufgerufen) //Bezeichnung muss mit der in psnClient.begin(...) übereinstimmen +void newData(char* topic, char* payload){...} +// param1: Topic der Nachricht +// param2: Nutdaten der Nachricht + +// mit "#define CALLBACK_W_LENGTH" kann auf folgende Callback-Struktur umgestellt werden: void newData(char* topic, int topicLength, char* payload, int payloadLength){...} // param1: Topic der Nachricht // param2: Lange des Topics @@ -217,6 +233,7 @@ DN_PUBLISH_SUCCESSULL 1 DN_ERROR_NO_ERROR 0 DN_ERROR_TOPIC_LEN -1 DN_ERROR_PAYLOAD_LEN -2 +DN_ERROR_NO_TOPIC -3 #Frame MSG_PRELIMITER '<' @@ -228,6 +245,9 @@ MSG_PUBLISH '@' MSG_SUBSCRIBE '?' MSG_UPDATE '#' MSG_TOPIC_MULTI '*' + +#Callback-Struktur +CALLBACK_W_LENGTH not defined ``` # Bestellung bei Aisler diff --git a/examples/sPSN_Broker/sPSN_Broker.ino b/examples/sPSN_Broker/sPSN_Broker.ino index b9034ba410feea254aaabc8febd9dc7c4c741cf3..c8b3c1771772e112222f98b6e2c87fac30760b59 100644 --- a/examples/sPSN_Broker/sPSN_Broker.ino +++ b/examples/sPSN_Broker/sPSN_Broker.ino @@ -28,7 +28,7 @@ */ #include <Arduino.h> #include "SoftwareSerial.h" -#include "didacticNet.h" +#include "DidacticNet.h" //lege Geschwindigkeit für serielle Schnittstellen fest #define SERIAL_BAUD 2400 diff --git a/examples/sPSN_Chat/sPSN_Chat.ino b/examples/sPSN_Chat/sPSN_Chat.ino index bc309b4f0aa7a42513b147af06811129aace185c..da9efdffa3f86f58be809f80f66f8a347d443a38 100644 --- a/examples/sPSN_Chat/sPSN_Chat.ino +++ b/examples/sPSN_Chat/sPSN_Chat.ino @@ -26,7 +26,7 @@ */ #include <Arduino.h> #include "SoftwareSerial.h" -#include "didacticNet.h" +#include "DidacticNet.h" #define SERIAL_BAUD 2400 //lege Geschwindigkeit für serielle Schnittstellen fest @@ -36,10 +36,11 @@ char topicSub[MAX_LEN_TOPICS] = {""}; //Array für neues Empfangs-Topi char topicPub[MAX_LEN_TOPICS] = {""}; //Array für eigenes Sende-Topic //Callback-Funktion wird bei neuen Daten automatisch aufgerufen -void newData(char* mTopic, int mToLength, char* mData, int mDaLength) { - Serial.print(mTopic); +void newData(char* topic, char* payload) { + //Ausgabe-> "Chatname": "geschriebene Nachricht" + Serial.print(topic); //topic entspricht im Chat dem NAmen des Chatpartners Serial.print(":\t"); - Serial.println(mData); + Serial.println(payload); //payload enthält die geschriebene Nachricht } SoftwareSerial sSerial(10, 11); // SoftwareSerial an Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender @@ -58,55 +59,57 @@ void setup() { sReader.begin(Serial); //AUSGABE INFOTEXT - Serial.print("Bitte den eigenen Namen mit einem # eingeben\nund mit Enter bestaetigen. -> "); + Serial.print("1. Den eigenen Namen mit einem # eingeben\nund mit Enter bestaetigen. -> "); Serial.println("#DeinName"); - Serial.print("Gebe dann die Namen deiner Chatpartner mit einem @ ein. -> "); - Serial.println("@ChatPartner"); - Serial.println("Anschließend kannst du mit ihnen schreiben."); + Serial.print("2. Die Namen deiner Chatpartner*innen mit einem @ eingeben -> "); + Serial.println("@ChatPartner*in \t (mehrfach moeglich)"); + Serial.print("3. Chatten: "); Serial.println("Pro Nachricht duerfen maximal 20 Zeichen eingegeben werden!"); Serial.println(); Serial.println("HINWEIS:"); - Serial.println("Stelle das Zeilenende im SerialMonitor auf \"Zeilenumbruch (CR)\""); + Serial.println("Stelle das Zeilenende im SerialMonitor auf \"ZEILENUMBRUCH (CR)\""); Serial.println("*********************************************************************\n"); } void loop() { - psnClient.handleNetwork(); //Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten + psnClient.handleNetwork(); //Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten int nrOfAscii = sReader.readSerialData(readData, DN_ASCII_CR); //Einlesen der Nutzereingabe am SerialMonitor (Rueckgabewert = Anzahl der gelesenen Zeichen) - if (nrOfAscii > 0) { //Wenn Daten fertig eingelesen wurden + if (nrOfAscii > 0) { //Wenn Daten fertig eingelesen wurden - if (readData[0] == '@') { //Wenn '@' vorne steht, dann neuer Chatpartner anlegen (neues Topic abonnieren) - strcpy(readData, &readData[1]); //verschiebe um ein Zeichen (entferne '@') - psnClient.subscribe(readData); //Lege fest zu welchem Topic Daten empfangen werden sollen (den Namen des Chatpartners) + //NEUEM CHATPARTNER FOLGEN + if (readData[0] == '@') { //Wenn '@' vorne steht, dann neuer Chatpartner anlegen (neues Topic abonnieren) + strcpy(readData, &readData[1]); //verschiebe um ein Zeichen (entferne '@') + psnClient.subscribe(readData); //Lege fest zu welchem Topic Daten empfangen werden sollen (den Namen des Chatpartners) - Serial.print("Nachrichten von "); //Ausgabe welches Topic abonniert wurde + Serial.print("Nachrichten von "); //Ausgabe welches Topic abonniert wurde Serial.print(readData); Serial.println(" abonniert."); } - else if (readData[0] == '!') { //Wenn '@' vorne steht, dann neuer Chatpartner anlegen (neues Topic abonnieren) - strcpy(readData, &readData[1]); //verschiebe um ein Zeichen (entferne '!') - psnClient.unsubscribe(readData); //Lege fest zu welchem Topic Daten empfangen werden sollen (den Namen des Chatpartners) + //CHATPARTNER ENTFOLGEN + else if (readData[0] == '!') { //Wenn '@' vorne steht, dann neuer Chatpartner anlegen (neues Topic abonnieren) + strcpy(readData, &readData[1]); //verschiebe um ein Zeichen (entferne '!') + psnClient.unsubscribe(readData); //Lege fest zu welchem Topic Daten empfangen werden sollen (den Namen des Chatpartners) - Serial.print("Nachrichten von "); //Ausgabe welches Topic abonniert wurde + Serial.print("Nachrichten von "); //Ausgabe welches Topic abonniert wurde Serial.print(readData); Serial.println(" nicht mehr abonniert."); } - - else if (readData[0] == '#') { //Wenn '#' vorne steht, dann neuer eigener Name (neues Topic unter dem gesendet wird) - //strcpy(topicPub, readData + 1); //kopiere das neue Topic (deinen neuen Namen) in das passende Array (+ 1 = entferne '#') - strcpy(topicPub, &readData[1]); //kopiere das neue Topic (deinen neuen Namen) in das passende Array (+ 1 = entferne '#') + //EIGENEN NAMEN ANLEGEN + else if (readData[0] == '#') { //Wenn '#' vorne steht, dann neuer eigener Name (neues Topic unter dem gesendet wird) + strcpy(topicPub, &readData[1]); //kopiere das neue Topic (deinen neuen Namen) in das passende Array (+ 1 = entferne '#') + //strcpy(topicPub, readData + 1); //-> Alternative zur Zeile oberhalb - Serial.print("Dein Name:\t"); //Ausgabe unter welchem Topic veröffentlicht wird + Serial.print("Dein Name:\t"); //Ausgabe unter welchem Topic veröffentlicht wird Serial.println(topicPub); } - - else { //Wenn "normale" Nachrichten eingegeben wurden, dann Daten unter eigenem Topic versenden + //NACHRICHT VERSCHICKEN (unter eigenem Namen) + else { //Wenn "normale" Nachrichten eingegeben wurden, dann Daten unter eigenem Topic versenden psnClient.publish(topicPub, readData); //Bereite eingegebene Daten zum Senden vor - Serial.print("Ich:\t"); //Ausgabe was unter deinem Topic veröffentlicht wird + Serial.print("Ich:\t"); //Ausgabe was unter deinem Topic veröffentlicht wird Serial.println(readData); } } diff --git a/examples/sPSN_Client1/sPSN_Client1.ino b/examples/sPSN_Client1/sPSN_Client1.ino index 116aa540bfa463764ee267ec15b0ff0edc27ec3c..5230231c626056447068c1acf52db73e9bccf36a 100644 --- a/examples/sPSN_Client1/sPSN_Client1.ino +++ b/examples/sPSN_Client1/sPSN_Client1.ino @@ -22,7 +22,7 @@ */ #include <Arduino.h> #include "SoftwareSerial.h" -#include "didacticNet.h" +#include "DidacticNet.h" #define SERIAL_BAUD 2400 //lege Geschwindigkeit für serielle Schnittstellen fest @@ -34,24 +34,22 @@ char topicPublish[MAX_LEN_TOPICS] = "potiVal"; //Topic unter dem (eigene) Daten veröffentlicht werden char topicSubscribe[MAX_LEN_TOPICS] = "btnState"; //Topic (von anderem TN) das abboniert werden soll -char payload[MAX_LEN_PAYLOAD] = {0}; - SoftwareSerial sSerial(10, 11); //Erzeuge SoftwareSerial-Instanz mit Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender DidacticPSNetClient psnClient; //Erzeuge PubSub-Client-Instanz //Callback-Funktion - wird beim Empfang neuer Daten aufgerufen -void newData(char* mTopic, int mToLength, char* mData, int mDaLength) { - Serial.print("CB: "); - Serial.print(mTopic); - Serial.print(" | "); - Serial.println(mData); +void newData(char* topic, char* payload) { + Serial.print("New data from topic "); + Serial.print(topic); + Serial.print(": "); + Serial.println(payload); boolean static stateLED = false; //Wechsle Zustand der Variable "stateLED" wenn Taster beim Sender gedrueckt wurde - if(bool(atoi(mData)) == true){ + if(payload[0] == '1'){ stateLED = !stateLED; digitalWrite(LED_PIN, stateLED); //Setze Ausgang entsprechend dem empfangenen Wert } @@ -66,7 +64,6 @@ void setup() { pinMode(LED_PIN,OUTPUT); psnClient.begin(sSerial, newData); //Starte PubSub Client an SoftwareSerial Schnittstelle - //psnClient.begin(Serial, clientCallback); //Starte PubSub Client an Serial Schnittstelle psnClient.subscribe(topicSubscribe); //Lege fest zu welchem Topic Daten empfangen werden sollen } diff --git a/examples/sPSN_Client2/sPSN_Client2.ino b/examples/sPSN_Client2/sPSN_Client2.ino index 98193ecbafcc23988ff68e1b0b224938de9f546b..d7cde74b8cda0b5f75dbb95dc84dbbd15e19bf6b 100644 --- a/examples/sPSN_Client2/sPSN_Client2.ino +++ b/examples/sPSN_Client2/sPSN_Client2.ino @@ -19,38 +19,33 @@ #include <Arduino.h> #include "SoftwareSerial.h" -#include "didacticNet.h" +#include "DidacticNet.h" #define SERIAL_BAUD 2400 //lege Geschwindigkeit für serielle Schnittstellen fest #define LED_PIN 5 -#define LED2_PIN 6 +#define LED2_PIN 6 #define BUTTON_PIN 2 char topicPublish[MAX_LEN_TOPICS] = "btnState"; //Topic unter dem (eigene) Daten veröffentlicht werden char topicSubscribe[MAX_LEN_TOPICS] = "potiVal"; //Topic (von anderem TN) das abboniert werden soll -char payload[MAX_LEN_PAYLOAD] = {0}; -boolean newData = false; -boolean ledState = false; - SoftwareSerial sSerial(10, 11); //Erzeuge SoftwareSerial-Instanz mit Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender DidacticPSNetClient psnClient; //Erzeuge PubSub-Client-Instanz -UnblockingTimer uTimer; - //Callback-Funktion - wird beim Empfang neuer Daten aufgerufen -void newData(char* mTopic, int mToLength, char* mData, int mDaLength) { - Serial.print("CB: "); - Serial.print(mTopic); - Serial.print(" | "); - Serial.println(mData); +void newData(char* topic, char* payload) { + Serial.print("New data from topic "); + Serial.print(topic); + Serial.print(": "); + Serial.println(payload); - int valuePoti = atoi(mData); //wandle ASCII-Zeichen in Wert + int valuePoti = atoi(payload); //wandle ASCII-Zeichen in Wert //Alternativ: sscanf(mData, "%d", &stateLED); //wandle ASCII-Zeichen in Wert - int valueLED = constrain(map(valuePoti, 0, 1023, 0, 255), 0, 255); //passe analogRead-Wert für analogWrite an + int mappedValue = map(valuePoti, 0, 1023, 0, 255); + int valueLED = constrain(mappedValue, 0, 255); //passe analogRead-Wert (0-1023) für analogWrite (0-255) an und begrenze analogWrite(LED_PIN, valueLED); //Setze Ausgang entsprechend dem empfangenen Wert analogWrite(LED2_PIN, 255-valueLED); //Setze Ausgang invertiert zum empfangenen Wert @@ -63,8 +58,7 @@ void setup() { sSerial.begin(SERIAL_BAUD); //Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen) psnClient.begin(sSerial, newData); //Starte PubSub Client an SoftwareSerial Schnittstelle - //psnClient.begin(Serial, clientCallback); //Starte PubSub Client an Serial Schnittstelle - + psnClient.subscribe(topicSubscribe); //Lege fest zu welchem Topic Daten empfangen werden sollen } diff --git a/examples/sPSN_ClientMinimal/sPSN_ClientMinimal.ino b/examples/sPSN_ClientMinimal/sPSN_ClientMinimal.ino index dfd3f235d0f52776292da8809e4449705ac7ccd7..b9cb74ec467b93f9d6f089cbab72fc75cef23f7f 100644 --- a/examples/sPSN_ClientMinimal/sPSN_ClientMinimal.ino +++ b/examples/sPSN_ClientMinimal/sPSN_ClientMinimal.ino @@ -22,18 +22,18 @@ #include <Arduino.h> #include "SoftwareSerial.h" -#include "didacticNet.h" +#include "DidacticNet.h" SoftwareSerial sSerial(10, 11); //Erzeuge SoftwareSerial-Instanz mit Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender DidacticPSNetClient psnClient; //Erzeuge PubSub-Client-Instanz //Callback-Funktion - wird beim Empfang neuer Daten aufgerufen -void newData(char* mTopic, int mToLength, char* mPayload, int mPayloadLength) { - Serial.print("Nachricht von: "); - Serial.print(mTopic); - Serial.print(" - "); - Serial.println(mPayload); +void newData(char* topic, char* payload) { + Serial.print("Topic: "); + Serial.print(topic); + Serial.print(" Nutzdaten: "); + Serial.println(payload); } diff --git a/examples/sPSN_PingTest/sPSN_PingTest.ino b/examples/sPSN_PingTest/sPSN_PingTest.ino index fb9f90c9c0802e35832143d071e72018b2e5708f..4bb09a1373fd646919ffbbe8ff022b66f869c12b 100644 --- a/examples/sPSN_PingTest/sPSN_PingTest.ino +++ b/examples/sPSN_PingTest/sPSN_PingTest.ino @@ -12,13 +12,13 @@ * * Arduino3: sPSN_PingTest.ino -> reagiert auf PongTester * - *date: 01.12.2021 + *date: 04.07.2022 */ #include "Arduino.h" #include "SoftwareSerial.h" -#include "didacticNet.h" +#include "DidacticNet.h" //lege Geschwindigkeit für serielle Schnittstellen fest #define SERIAL_BAUD 2400 @@ -50,8 +50,14 @@ char payloadSend[] = "Ping"; bool ledState = true; -void newData(char* mTopic, int mToLength, char* mData, int mDaLength) { - Serial.println(mData); +void newData(char* topic, char* payload) { + if (!strcmp(payload, "Ping")){ + Serial.print(payload); + Serial.print(" -> "); + } else{ + Serial.print(payload); + Serial.println(" :-D"); + } digitalWrite(LED_BUILTIN, HIGH); } @@ -61,6 +67,8 @@ void setup() { Serial.begin(SERIAL_BAUD); delay(2000); + //Verwende eigene Nummer als Sende- und Empfangstopic + //(2-stellig mit führender 0) sprintf(topicPub, "%02d", MY_NUMBER); sprintf(topicSub, "%02d", MY_NUMBER); diff --git a/examples/sPSN_PlotTopics/sPSN_PlotTopics.ino b/examples/sPSN_PlotTopics/sPSN_PlotTopics.ino new file mode 100644 index 0000000000000000000000000000000000000000..c39af3423a9eb0d353a65981eed4162dd9adeaf3 --- /dev/null +++ b/examples/sPSN_PlotTopics/sPSN_PlotTopics.ino @@ -0,0 +1,60 @@ +/** + *file: sPSN_PlotTopics + *author: letsgoING -> info@letsgoing.de + * + *description: + * Dieses Programm abboniert Beispiel-Topics und gibt diese auf dem SerialMonitor aus. + * + * parameter: + * MAX_LEN_PAYLOAD = 20 Zeichen (didacticNet.h) + * MAX_LEN_TOPICS = 10 Zeichen (didacticNet.h) + * + *date: 15.07.2022 + */ +#include <Arduino.h> +#include "SoftwareSerial.h" +#include "DidacticNet.h" + +#define SERIAL_BAUD 2400 //lege Geschwindigkeit für serielle Schnittstellen fest + +SoftwareSerial sSerial(10, 11); //Erzeuge SoftwareSerial-Instanz mit Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender + +DidacticPSNetClient psnClient; //Erzeuge PubSub-Client-Instanz + + +//Callback-Funktion - in diesem Beispiel nicht verwendet +void newData(char* topic, char* payload) {} + + +void setup() { + + Serial.begin(SERIAL_BAUD); //Starte Serielle Schnittstelle (zum PC) + sSerial.begin(SERIAL_BAUD); //Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen) + + psnClient.begin(sSerial, newData); //Starte PubSub Client an SoftwareSerial Schnittstelle + + //Beliebige Beispiel-Topics abbonieren -> zusätzliche Topics hinzufügen + psnClient.subscribe("temp1"); + psnClient.subscribe("temp2"); + psnClient.subscribe("light1"); + psnClient.subscribe("poti"); + + //lese Anzahl der abbonierten Topics aus + int countTopics = psnClient.getMaxNrTopics(); + Serial.print("Anzahl Topics: "); + Serial.println(countTopics); + + //Gebe alle Topics nacheinander aus + for(int i = 0; i < countTopics; i++){ + char topic[MAX_LEN_TOPICS]; + psnClient.getSubscribedTopic(topic, i); + + Serial.print("Topic "); + Serial.print(i); + Serial.print(": "); + Serial.println(topic); + } +} + +void loop() { +} diff --git a/examples/sPSN_PongTester/sPSN_PongTester.ino b/examples/sPSN_PongTester/sPSN_PongTester.ino index 2ed1ca12d21260985245e302b1fce15b3b96446b..c991eecb479214aba1853df276560481ecda007b 100644 --- a/examples/sPSN_PongTester/sPSN_PongTester.ino +++ b/examples/sPSN_PongTester/sPSN_PongTester.ino @@ -13,13 +13,13 @@ * * Arduino3: sPSN_PingTest.ino -> reagiert auf PongTester * - *date: 01.12.2021 + *date: 04.07.2022 */ #include "Arduino.h" #include "SoftwareSerial.h" -#include "didacticNet.h" +#include "DidacticNet.h" //lege Geschwindigkeit für serielle Schnittstellen fest #define SERIAL_BAUD 2400 @@ -36,22 +36,14 @@ SoftwareSerial sSerial(10, 11); //Erzeuge Client-Instanz DidacticPSNetClient psnClient; -//Arrays für Empfangs- und Sende Topic -char topicSub[MAX_LEN_TOPICS] = ""; -char topicPub[MAX_LEN_TOPICS] = ""; +bool recievedPings[MAX_NR_CLIENTS+1] = {false}; //+1 ermöglicht Start bei Client0 oder Client1 +bool newPing = false; -char payloadSend[] = "Pong"; - -bool ledState = true; - -void newData(char* mTopic, int mToLength, char* mData, int mDaLength) { - Serial.println(mTopic); - //reply pong - strcpy(topicPub, mTopic); - if (!strcmp(mData, "Ping")) { //Empfangene Nachricht == Ping - Serial.print(" "); - Serial.print(mTopic); - psnClient.publish(topicPub, payloadSend); +void newData(char* topic, char* payload) { + if (!strcmp(payload, "Ping") && (atoi(topic) < MAX_NR_CLIENTS+1)) { //Empfangene Nachricht == Ping + recievedPings[atoi(topic)] = true; + newPing = true; + psnClient.publish(topic, "Pong"); } } @@ -77,9 +69,23 @@ void setup() { Serial.println("\n\nReady for Clients..."); + + } void loop() { //Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten psnClient.handleNetwork(); + + if(newPing){ + newPing = false; + Serial.print("Empfangene Clients: "); + for(int i = 0; i < MAX_NR_CLIENTS+1; i++){ + if(recievedPings[i]){ + Serial.print(i); + Serial.print(" | "); + } + } + Serial.println(); + } } diff --git a/keywords.txt b/keywords.txt index 542b41df93aae8db0b8510a1d1aca8d2970ec1eb..c9c84529f72a1a94ef443e511d959b4723edcb33 100644 --- a/keywords.txt +++ b/keywords.txt @@ -27,6 +27,9 @@ publishOnChange KEYWORD2 subscribe KEYWORD2 unsubscribe KEYWORD2 +getMaxNrTopic KEYWORD2 +getSubscribedTopic KEYWORD2 + timeElapsed KEYWORD2 readSerialData KEYWORD2 @@ -53,4 +56,4 @@ DN_ASCII_NL LITERAL1 DN_PUBLISH_SUCCESSULL LITERAL1 DN_ERROR_NO_ERROR LITERAL1 DN_ERROR_TOPIC_LEN LITERAL1 -DN_ERROR_PAYLOAD_LEN LITERAL1 \ No newline at end of file +DN_ERROR_PAYLOAD_LEN LITERAL1 diff --git a/library.properties b/library.properties index 1333af140fa1c79bf7ca58beab746abef135e8c1..0d0626ef15b6997eb0a736cf211a9bd4d8b0bda4 100644 --- a/library.properties +++ b/library.properties @@ -1,9 +1,9 @@ -name=didacticNetwork -version=0.9 +name=DidacticNetwork +version=1.0 author=letsgoING maintainer=letsgoING <https://letsgoing.org> sentence=Library for implementing didactic reduced networks on Arduino boards. category=Communication paragraph=Library for implementing networks on Arduino boards. The functionalities correspond to state of the art technologies, which are didactically reduced. url=https://gitlab.reutlingen-university.de/letsgoing/libraries/didacticnetwork -includes=didacticNet.h +includes=DidacticNet.h diff --git a/src/didacticNet.cpp b/src/DidacticNet.cpp similarity index 96% rename from src/didacticNet.cpp rename to src/DidacticNet.cpp index 80a9f5d3c63849e5d552e052b0ffd9f9af3ac228..361ab839dbadd3c73b0d91c79884ec550914a451 100644 --- a/src/didacticNet.cpp +++ b/src/DidacticNet.cpp @@ -1,12 +1,12 @@ /**************************************************************************/ /*! - @file didacticNet.cpp + @file DidacticNet.cpp @author anian buehler @ letsgoING.org */ /**************************************************************************/ #include "Arduino.h" -#include "didacticNet.h" +#include "DidacticNet.h" //************************************************************************** //ROOT @@ -268,7 +268,6 @@ int DidacticPSNetClient::subscribe(char* topic, int topicLength){ return error; } - bool DidacticPSNetClient::unsubscribe(char* topic){ return unsubscribe(topic, strlen(topic)); } @@ -302,7 +301,12 @@ bool DidacticPSNetClient::handleData(){ if( currentTopicNr >= 0){ savePayload( _bufferPayload, currentTopicNr); //callback(_topic[currentTopicNr], topicLength, _payload[currentTopicNr], payloadLength); - callback(_bufferTopic, topicLength, _bufferPayload, payloadLength); + #ifdef CALLBACK_W_LENGTH + callback(_bufferTopic, topicLength, _bufferPayload, payloadLength); + #else + callback(_bufferTopic, _bufferPayload); + #endif + } } return true; @@ -326,6 +330,18 @@ int DidacticPSNetClient::getFreeTopicNr() { return -1; } +int DidacticPSNetClient::getSubscribedTopic(char* topic, int number){ + if(number > 0 && number < getMaxNrTopics()){ + strcpy(topic, _topic[number]); + return DN_ERROR_NO_ERROR; + } + return DN_ERROR_NO_TOPIC; +} + +int DidacticPSNetClient::getMaxNrTopics(){ + return getFreeTopicNr(); +} + //************************************************************************** //Broker diff --git a/src/didacticNet.h b/src/DidacticNet.h similarity index 91% rename from src/didacticNet.h rename to src/DidacticNet.h index 41aac4c9419efd6e05adb4e4020877690ff3e36c..3480fe81241491c7548a2aa2e4f9c43c95488e80 100644 --- a/src/didacticNet.h +++ b/src/DidacticNet.h @@ -1,5 +1,5 @@ /************************************************************************** - @file didacticNet.h + @file DidacticNet.h @author anian buehler @ letsgoING **************************************************************************/ @@ -8,8 +8,14 @@ #define _DIDACTICNET_ #include "Arduino.h" -//callback(topic, topicLength, data, dataLength) -#define PSNET_CALLBACK_SIGNATURE void (*callback)(char*, int, char*, int) + +#ifdef CALLBACK_W_LENGTH + //callback(topic, topicLength, payload, payloadLength) + #define PSNET_CALLBACK_SIGNATURE void (*callback)(char*, int, char*, int) +#else + //callback(topic, payload) + #define PSNET_CALLBACK_SIGNATURE void (*callback)(char*, char*) +#endif #define MSG_PRELIMITER '<' #define MSG_DELIMITER '>' @@ -43,6 +49,7 @@ #define DN_ERROR_NO_ERROR 0 #define DN_ERROR_TOPIC_LEN -1 #define DN_ERROR_PAYLOAD_LEN -2 +#define DN_ERROR_NO_TOPIC -3 //little helpers @@ -117,6 +124,7 @@ class DidacticPSNet int _currentPayloadLength = 0; DidacticPSNet& setCallback(PSNET_CALLBACK_SIGNATURE); + void setStream(Stream& _port); int checkData(); @@ -136,6 +144,7 @@ class DidacticPSNet void begin(Stream& _port); void begin(Stream& _port, PSNET_CALLBACK_SIGNATURE); + bool handleNetwork(); bool isDataToSend(); @@ -165,6 +174,10 @@ class DidacticPSNetClient : public DidacticPSNet DidacticPSNetClient(); ~DidacticPSNetClient(); + int getMaxNrTopics(); + int getSubscribedTopic(char*, int); + + int publish(char*, char*); int publish(char*, int, char*, int); int publish(char*, int);