diff --git a/README.md b/README.md index 965f922757f356f0646f419054d2e20f375c1a2a..4d25c1e27569959c5d155286d66ce459be2252c5 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,9 @@ https://www.arduino.cc/en/guide/libraries section "Importing a .zip Library" ### Client ```cpp -#Anlegen der Client-Instanz +#Anlegen der Client-Instanz +// Anlegen des didacticPSNetClient-Objekts +// psnClient -> möglicher Name für Objekt didacticPSNetClient psnClient; #Starten der Client-Instanz @@ -63,14 +65,53 @@ bool psnClient.unsubscribe(char* topic, int length); // return true wenn Daten versendet / false wenn nicht #Daten unter Topic veroeffentlichen +Daten direkt veröffentlichen int psnClient.publish(char* topic, char* payload); -// param1: Topic String/char-Array; param2: payload-char-Array +// param1: Topic String/char-Array; +// param2: payload-char-Array +// return: ERROR-Wert: DN_PUBLISH_SUCCESSULL, +// DN_ERROR_TOPIC_LEN (Topic zu lang - wird abgeschnitten), +// DN_ERROR_PAYLOAD_LEN (Payload zu lange - wird abgeschnitten) + +int psnClient.publish(char* topic, bool payload); +// param1: Topic String/char-Array; +// param2: payload vom Datentyp bool (wird in char-Array gewandelt) +// return: ERROR-Wert: DN_PUBLISH_SUCCESSULL, +// DN_ERROR_TOPIC_LEN (Topic zu lang - wird abgeschnitten), +// DN_ERROR_PAYLOAD_LEN (Payload zu lange - wird abgeschnitten) + +int psnClient.publish(char* topic, int payload); +// param1: Topic String/char-Array; +// param2: payload vom Datentyp int (wird in char-Array gewandelt) +// return: ERROR-Wert: DN_PUBLISH_SUCCESSULL, +// DN_ERROR_TOPIC_LEN (Topic zu lang - wird abgeschnitten), +// DN_ERROR_PAYLOAD_LEN (Payload zu lange - wird abgeschnitten) + int psnClient.publish(char* topic, int topicLength, char* payload, int payloadLength); // param1: Topic String/char-Array // param2: Anzahl Zeichen des Topics // param3: payload-char-Array // param4: Anzahl Zeichen der Payload -// return: ERROR-Wert: DN_ERROR_NO_ERROR, +// return: ERROR-Wert: DN_PUBLISH_SUCCESSULL, +// DN_ERROR_TOPIC_LEN (Topic zu lang - wird abgeschnitten), +// DN_ERROR_PAYLOAD_LEN (Payload zu lange - wird abgeschnitten) + +//Daten werden beim Zustandswechsel von payload (0->1 / 1->0) veröffentlicht +int psnClient.publishOnChange(char* topic, bool payload); +// param1: Topic String/char-Array; +// param2: payload vom Datentyp bool (wird in char-Array gewandelt) +// return: ERROR-Wert: DN_PUBLISH_SUCCESSULL, +// DN_ERROR_NO_ERROR (Keine Daten veröffentlicht und keine Fehler), +// DN_ERROR_TOPIC_LEN (Topic zu lang - wird abgeschnitten), +// DN_ERROR_PAYLOAD_LEN (Payload zu lange - wird abgeschnitten) + +// Daten werden veröffentlicht, wenn Veränderung von payload größer als threshold ist +int psnClient.publishOnChange(char* topic, int payload, int threshold); +// param1: Topic String/char-Array; +// param2: payload vom Datentyp bool (wird in char-Array gewandelt) +// param1: Topic String/char-Array; +// return: ERROR-Wert: DN_PUBLISH_SUCCESSULL, +// DN_ERROR_NO_ERROR (Keine Daten veröffentlicht und keine Fehler), // DN_ERROR_TOPIC_LEN (Topic zu lang - wird abgeschnitten), // DN_ERROR_PAYLOAD_LEN (Payload zu lange - wird abgeschnitten) @@ -79,13 +120,15 @@ void clientCallback(char* topic, int topicLength, char* payload, int payloadLeng // param1: Topic der Nachricht // param2: Lange des Topics // param3: Nutdaten der Nachricht -// param4: Laenge der +// param4: Laenge der Nachricht ``` ### Broker ```cpp #Anlegen der Broker-Instanz +// Anlegen des Borker-Objekts +// psnBroker -> möglicher Name für Objekt didacticPSNetBroker psnBroker; #Starten der Broker-Instanz @@ -97,30 +140,44 @@ bool psnBroker.handleNetwork(); ``` ### Hilfreiche Funktionen - -Wichtiger Hinweis: -Diese Funktionen koennen derzeit nur einmal pro Programm/Client-Instanz eingesetzt werden. -Werden diese an verschiedenen Stellen mit verschiedenen Werten verwendet, werden Werte u. U. ueberschrieben. +Die Hiflsfunktionen sind als eigenständige Klassen implementiert und können so mehrfach (unter verschiedenen Namen) angelegt werden. +So können die Funktionen mehrfach, mit unterschiedlichen Parametern, verwendet werden. ```cpp #Flankenerkennung z.B. fuer Taster -int psnClient.edgeDetected(bool currentState); +// Anlegen des EdgeDetector-Objekts +// eDetector -> möglicher Name für Objekt +EdgeDetector eDetector; + +int eDetector.edgeDetected(bool currentState); // param: aktueller binärer Zustand // return: 0 -> keine Flanke, RISING, FALLING #Auf Wertaenderung groeßer Schwellwert pruefen -bool psnClient.valueChanged(int currentvalue, int threshold); +// Anlegen des ChangeDetector-Objekts +// cDetector -> möglicher Name für Objekt +ChangeDetector cDetector + +bool cDetector.valueChanged(int currentvalue, int threshold); // param1: aktueller Wert // param2: Schwellwert // return: true -> Aenderung groeßer als Schwellwert; sonst false #Nicht blockierendes Warten -bool psnClient.timeElapsed(long); +// Anlegen des UnblockingTimer-Objekts +// uTimer -> möglicher Name für Objekt +UnblockingTimer uTimer; + +bool uTimer.timeElapsed(long); // param: zu wartende Zeit in Millisekunden // return: true, wenn Zeit Wartezeit abgelaufen; sonst false #Einlesen von Text ueber Serialle Schnittstelle bis Endezeichen empfangen wird -int psnClient.readSerialData(Stream&, char*, char); +// Anlegen des SerialReader-Objekts +// sReader -> möglicher Name für Objekt +SerialReader sReader; + +int sReader.readSerialData(Stream&, char*, char); // param1: Schnittstelle (Serial | SoftSerial) // param2: Array in das die Zeichen eingelesen werden // param3: Endezeichen (char) @@ -129,7 +186,7 @@ int psnClient.readSerialData(Stream&, char*, char); ### Konstanten -Konstanten aus der Library die fuer die Programmierung genutzt werden und teilweise angepasst werden koennen. +Konstanten aus der Library die fuer die Programmierung genutzt werden und angepasst werden koennen. ```cpp #ASCII Endezeichen DN_ASCII_CR "carriage return CR" (int) 13 @@ -143,7 +200,12 @@ MAX_LEN_PAYLOAD default: 20 MAX_NR_TOPICS_CLIENT default: 5 MAX_NR_TOPICS_BROKER default: 20 -#ERRORs +#Mindestwartezeiten zwischen Sendevorgängen (anpassen über psnClient.setInterval()) +INTERVAL_CLIENT default: 500 ms +INTERVAL_BROKER default: 0 ms + +#ERRORs (nicht verändern) +DN_PUBLISH_SUCCESSULL 1 DN_ERROR_NO_ERROR 0 DN_ERROR_TOPIC_LEN -1 DN_ERROR_PAYLOAD_LEN -2 diff --git a/library.properties b/library.properties index fb194340583c56434140063784b0e64c7c172c3e..b103e4391dcb62375688e34d444308578b4aa79b 100644 --- a/library.properties +++ b/library.properties @@ -6,4 +6,4 @@ 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=didacticNetwork.h +includes=didacticNet.h diff --git a/src/didacticNet.cpp b/src/didacticNet.cpp index 11a06e1008ed1453143e48f2b61d74139a2e0e80..f14ace21992e70b7d533ffd00d95831966f92b66 100644 --- a/src/didacticNet.cpp +++ b/src/didacticNet.cpp @@ -206,7 +206,7 @@ int DidacticPSNetClient::publish(char* topic, bool data){ int DidacticPSNetClient::publishOnChange(char* topic, bool input){ if(!_dataToSend){ - if(edgeDetected(input)){ + if(eDetector.edgeDetected(input)){ return publish(topic, input); } } @@ -215,7 +215,7 @@ int DidacticPSNetClient::publishOnChange(char* topic, bool input){ int DidacticPSNetClient::publishOnChange(char* topic, int input, int threshold){ if(!_dataToSend){ - if(valueChanged(input, threshold)){ + if(cDetector.valueChanged(input, threshold)){ return publish(topic, input); } } @@ -323,30 +323,6 @@ int DidacticPSNetClient::getFreeTopicNr() { return -1; } -int DidacticPSNetClient::edgeDetected(bool currentState){ - static bool lastState = false; - int edEdge = 0; - - if(currentState && !lastState){ - edEdge = RISING; - } - else if(!currentState && lastState){ - edEdge = FALLING; - } - lastState = currentState; - return edEdge; -} - -bool DidacticPSNetClient::valueChanged(int value, int threshold){ - static int lastValue = 0; - - if(abs(value-lastValue) > threshold){ - lastValue = value; - return true; - } - return false; -} - //************************************************************************** //Broker @@ -451,6 +427,37 @@ int DidacticPSNetBroker::getFreeTopicNr() { //LITTLE HELPERS FOR CLIENTS ;-) //************************************************************************* +EdgeDetector::EdgeDetector(){}; +EdgeDetector::~EdgeDetector(){}; + +int EdgeDetector::edgeDetected(bool currentState){ + static bool lastState = false; + int edEdge = 0; + + if(currentState && !lastState){ + edEdge = RISING; + } + else if(!currentState && lastState){ + edEdge = FALLING; + } + lastState = currentState; + return edEdge; +} + +ChangeDetector::ChangeDetector(){} +ChangeDetector::~ChangeDetector(){} + +bool ChangeDetector::valueChanged(int value, int threshold){ + static int lastValue = 0; + + if(abs(value-lastValue) > threshold){ + lastValue = value; + return true; + } + return false; +} + + UnblockingTimer::UnblockingTimer(){} UnblockingTimer::~UnblockingTimer(){} diff --git a/src/didacticNet.h b/src/didacticNet.h index ec6883b870195199eb20a6b0c4928bbaf5663aa0..596db882857b225191ab1d86fa05712d91df8856 100644 --- a/src/didacticNet.h +++ b/src/didacticNet.h @@ -49,6 +49,54 @@ #define DN_ASCII_CR 13 #define DN_ASCII_NL 10 + +class EdgeDetector +{ + private: + + public: + EdgeDetector(); + ~EdgeDetector(); + int edgeDetected(bool); + +}; + +class ChangeDetector +{ + private: + + public: + ChangeDetector(); + ~ChangeDetector(); + bool valueChanged(int, int); + +}; + +class UnblockingTimer +{ + private: + long lastTime = 0L; + + public: + UnblockingTimer(); + ~UnblockingTimer(); + bool timeElapsed(long); + +}; +class SerialReader +{ + private: + Stream* _port; + int charCounter = 0; + + public: + SerialReader(); + ~SerialReader(); + void begin(Stream&); + int readSerialData(char*, char); + +}; + class DidacticPSNet { protected: @@ -97,6 +145,9 @@ class DidacticPSNet class DidacticPSNetClient : public DidacticPSNet { private: + EdgeDetector eDetector; + ChangeDetector cDetector; + char _topic[MAX_NR_TOPICS_CLIENT][MAX_LEN_TOPICS+1] = { { 0 } }; char _payload[MAX_NR_TOPICS_CLIENT][MAX_LEN_PAYLOAD+1] = { { 0 } }; @@ -149,28 +200,4 @@ class DidacticPSNetBroker: public DidacticPSNet }; -class UnblockingTimer -{ - private: - long lastTime = 0L; - - public: - UnblockingTimer(); - ~UnblockingTimer(); - bool timeElapsed(long); - -}; -class SerialReader -{ - private: - Stream* _port; - int charCounter = 0; - - public: - SerialReader(); - ~SerialReader(); - void begin(Stream&); - int readSerialData(char*, char); - -}; #endif