Skip to content
Snippets Groups Projects
Select Git revision
  • 271e14603c5ce78e1244ebf1854283585f8dd0fb
  • main default protected
  • minikube-fresh-start
3 results

TodoMapper.java

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    didacticNet.h 4.24 KiB
    /**************************************************************************
        @file     didacticNet.h
        @author   anian buehler @ letsgoING
    **************************************************************************/
    
    
    #ifndef _DIDACTICNET_
    #define _DIDACTICNET_
    
    #include "Arduino.h"
    //callback(topic, topicLength, data, dataLength)
    #define PSNET_CALLBACK_SIGNATURE void (*callback)(char*, int, char*, int)
    
    #define MSG_PRELIMITER '<'
    #define MSG_DELIMITER  '>'
    #define MSG_SEPARATOR  '|'
    
    //@ publish   → on publish check topic, then send topic-update
    //? subscribe → subscribe starts update, topic filter @client
    //# update    → update to specific topic Broker to client
    #define MSG_PUBLISH   '@'
    #define MSG_SUBSCRIBE '?'
    #define MSG_UPDATE    '#'
    #define MSG_TOPIC_MULTI     '*'
    
    //<@topic|payload>
    #define LEN_OVERHEAD  4
    
    #define CSMA_CHECK_DELAY_US 400
    #define CSMA_MIN_DELAY_MS    10
    #define CSMA_MID_DELAY_MS    20
    #define CSMA_MAX_DELAY_MS    30
    
    #define INTERVAL_CLIENT	   500L
    #define INTERVAL_BROKER	     0L
    
    #define MAX_NR_TOPICS_CLIENT   5
    #define MAX_NR_TOPICS_BROKER  20
    #define MAX_LEN_TOPICS 		  10
    #define MAX_LEN_PAYLOAD       20
    
    #define DN_PUBLISH_SUCCESSULL 1
    #define DN_ERROR_NO_ERROR     0
    #define DN_ERROR_TOPIC_LEN   -1
    #define DN_ERROR_PAYLOAD_LEN -2
    
    
    //little helpers
    #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:
    		Stream* _port;
    
    		PSNET_CALLBACK_SIGNATURE;
    
    		char _bufferTopic[MAX_LEN_TOPICS +1] = {0};
    		char _bufferPayload[MAX_LEN_PAYLOAD +1] = {0};
    		char _readBufferMessage[MAX_LEN_TOPICS + MAX_LEN_PAYLOAD + LEN_OVERHEAD +1];
    		char _sendBufferMessage[MAX_LEN_TOPICS + MAX_LEN_PAYLOAD + LEN_OVERHEAD +1];
    
    		bool _dataToSend = false; // int Data to send for queue?
    		unsigned long _waitingTime = 0L;
    		unsigned long _intervalTime = 0L;
    		int _currentTopicLength = 0;
    		int _currentPayloadLength  = 0;
    
    		DidacticPSNet& setCallback(PSNET_CALLBACK_SIGNATURE);
    		void setStream(Stream& _port);
    
    		int checkData();
    		bool recieveData();
    		bool sendData();
    		int extractData(int, int, char*, char);
    		void writeDataToTopic(char*, char*);
    		virtual int getTopicNr(char*)=0;
    		virtual int getFreeTopicNr()=0;
    		virtual bool getMessageFilter(char)=0;
    		virtual bool savePayload(char*, int)=0;
    		virtual bool handleData()=0;
    
    	public:
    		DidacticPSNet();
    		~DidacticPSNet();
    
    		void begin(Stream& _port);
    		void begin(Stream& _port, PSNET_CALLBACK_SIGNATURE);
    		bool handleNetwork();
    		bool isDataToSend();
    
    		void setInterval(long);
    
    };
    
    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 } };
    
    	bool savePayload(char*, int);
    	bool getMessageFilter(char);
    	bool handleData();
    	int getTopicNr(char*);
    	int getFreeTopicNr();
    
    	int edgeDetected(bool);
    	bool valueChanged(int, int);
    
    	public:
    	DidacticPSNetClient();
    	~DidacticPSNetClient();
    
    	int publish(char*, char*);
    	int publish(char*, int, char*, int);
    	int publish(char*, int);
    	int publish(char*, bool);
    	int publishOnChange(char*, bool);
    	int publishOnChange(char*, int, int);
    	int subscribe(char*);
    	int subscribe(char*, int);
    	bool unsubscribe(char*);
    	bool unsubscribe(char*, int);
    };
    
    
    class DidacticPSNetBroker: public  DidacticPSNet
    {
    	private:
    	char _topic[MAX_NR_TOPICS_BROKER][MAX_LEN_TOPICS+1] = { { 0 } };
    	char _data[MAX_NR_TOPICS_BROKER][MAX_LEN_PAYLOAD+1] = { { 0 } };
    
    	bool savePayload(char*, int);
    	bool getMessageFilter(char);
    	void writeDataToTopic(int, char*, char*);
    	bool handleData();
    	int getTopicNr(char*);
    	int getFreeTopicNr();
    
    	public:
    	DidacticPSNetBroker();
    	~DidacticPSNetBroker();
    
    	bool update(char*, int, char*, int);
    
    
    };
    
    
    #endif