Skip to content
Snippets Groups Projects
Select Git revision
  • 8f4f81cf2fb40c7243e17a65d9df3b16757bc2d5
  • master default protected
  • dev_simplemode
  • dev_AddAppl
  • dev2
  • dev_stdCallback
  • dev
7 results

didacticNet.h

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    didacticNet.h 2.98 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     '*'
    
    #define CSMA_CHECK_DELAY_US 400 //unused?
    #define CSMA_MIN_DELAY_MS 10
    #define CSMA_MID_DELAY_MS 20
    #define CSMA_MAX_DELAY_MS 30
    
    #define MAX_NR_TOPICS_CLIENT  5
    #define MAX_NR_TOPICS_BROKER  20
    #define MAX_LEN_TOPICS 10
    #define MAX_LEN_DATA   20
    
    class didacticPSNet
    {
    	protected:
    		Stream* _port;
    
    		PSNET_CALLBACK_SIGNATURE;
    
    		char _bufferTopic[MAX_LEN_TOPICS+1] = {0};
    		char _bufferData[MAX_LEN_DATA+1] = {0};
    		char _readBufferMessage[MAX_LEN_TOPICS + MAX_LEN_DATA +4+1];
    		char _sendBufferMessage[MAX_LEN_TOPICS + MAX_LEN_DATA +4+1];
    
    		bool _dataToSend = false; // int Data to send for queue?
    		unsigned long _waitingTime = 0L;
    		int _currentTopicLength = 0;
    		int _currentDataLength  = 0;
    
    		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 saveData(char*, int)=0;
    		virtual bool handleData()=0;
    
    	public:
    		didacticPSNet();
    		~didacticPSNet();
    
    		didacticPSNet& setCallback(PSNET_CALLBACK_SIGNATURE);
    		void setStream(Stream& _port);
    		bool handleNetwork();
    		bool isDataToSend();
    
    };
    
    class didacticPSNetClient : public  didacticPSNet
    {
    	private:
    
    	char _topic[MAX_NR_TOPICS_CLIENT][MAX_LEN_TOPICS+1] = { { 0 } };
    	char _data[MAX_NR_TOPICS_CLIENT][MAX_LEN_DATA+1] = { { 0 } };
    
    	bool saveData(char*, int);
    	bool getMessageFilter(char);
    	bool handleData();
    	int getTopicNr(char*);
    	int getFreeTopicNr();
    
    	public:
    	didacticPSNetClient();
    	~didacticPSNetClient();
    
    	bool publish(char*, char*);
    	bool publish(char*, int, char*, int);
    	bool subscribe(char*);
    	bool 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_DATA+1] = { { 0 } };
    
    	bool saveData(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