Select Git revision
didacticNet.h
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