/************************************************************************************** * Copyright (c) 2016, Tomoaki Yamaguchi * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v1.0 which accompany this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Tomoaki Yamaguchi - initial API and implementation **************************************************************************************/ #ifndef SENSORNETWORKX_H_ #define SENSORNETWORKX_H_ #include "MQTTSNGWDefines.h" #include "MQTTSNGWProcess.h" #include #include using namespace std; namespace MQTTSNGW { //#define DEBUG_NWSTACK #ifdef DEBUG_NWSTACK #define D_NWSTACK(...) printf(__VA_ARGS__); fflush(stdout) #else #define D_NWSTACK(...) #endif #define XMIT_STATUS_TIME_OVER 5000 #define START_BYTE 0x7e #define ESCAPE 0x7d #define XON 0x11 #define XOFF 0x13 #define PAD 0x20 #define BROADCAST_DEVADDR 0xFF #define LORA_PHY_MAXPAYLOAD 256 /*! * LoRaLink Modem Type */ typedef enum { LORALINK_MODEM_TX, LORALINK_MODEM_RX, }LoRaLinkModemType_t; /*! * LoRaLink Serialized API */ typedef struct { uint16_t PanId; uint8_t DestinationAddr; uint8_t SourceAddr; uint16_t Rssi; uint16_t Snr; uint8_t PayloadType; uint8_t Payload[LORA_PHY_MAXPAYLOAD]; uint16_t PayloadLen; }LoRaLinkFrame_t; typedef struct { bool Available; bool Error; bool Escape; uint16_t apipos; uint8_t checksum; } LoRaLinkReadParameters_t; typedef enum { MQTT_SN = 0x40, API_RSP_ACK = 0x80, API_RSP_NFC, API_RSP_TOT, API_REQ_UTC, API_RSP_UTC, API_CHG_TASK_PARAM, API_REQ_RESET, }LoRaLinkPayloadType_t; /*=========================================== Class SerialPort ============================================*/ class SerialPort { friend class LoRaLink; public: SerialPort(); ~SerialPort(); int open(char* devName, unsigned int baudrate, bool parity, unsigned int stopbit, unsigned int flg); bool send(unsigned char b); void flush(); private: int _fd; // file descriptor struct termios _tio; }; /*=========================================== Class SensorNetAddreess ============================================*/ class SensorNetAddress { friend class LoRaLink; public: SensorNetAddress(); ~SensorNetAddress(); void setAddress( uint8_t devAddr); int setAddress(string* data); void setBroadcastAddress(void); bool isMatch(SensorNetAddress* addr); SensorNetAddress& operator =(SensorNetAddress& addr); char* sprint(char*); private: uint8_t _devAddr; // uint8_t _destAddr; }; /*======================================== Class LoRaLink =======================================*/ class LoRaLink { public: LoRaLink(); ~LoRaLink(); int open(LoRaLinkModemType_t type, char* device, int boudrate ); void close(void); int unicast(const uint8_t* buf, uint16_t length, SensorNetAddress* sendToAddr); int broadcast(const uint8_t* buf, uint16_t length); int recv(uint8_t* buf, uint16_t len, SensorNetAddress* addr); void setApiMode(uint8_t mode); private: bool readApiFrame(LoRaLinkFrame_t* api, LoRaLinkReadParameters_t* para); int recv(uint8_t* buf); int send(LoRaLinkPayloadType_t type, const uint8_t* payload, uint16_t pLen, SensorNetAddress* addr); void send(uint8_t b); Semaphore _sem; Mutex _meutex; uint8_t _respCd; SerialPort* _serialPortRx; SerialPort* _serialPortTx; LoRaLinkFrame_t _loRaLinkApi; LoRaLinkReadParameters_t _loRaLinkPara; }; /*=========================================== Class SensorNetwork ============================================*/ class SensorNetwork: public LoRaLink { public: SensorNetwork(); ~SensorNetwork(); int unicast(const uint8_t* payload, uint16_t payloadLength, SensorNetAddress* sendto); int broadcast(const uint8_t* payload, uint16_t payloadLength); int read(uint8_t* buf, uint16_t bufLen); int initialize(void); const char* getDescription(void); SensorNetAddress* getSenderAddress(void); private: SensorNetAddress _clientAddr; // Sender's address. not gateway's one. string _description; }; } #endif /* SENSORNETWORKX_H_ */