1 #pragma once 2 3 #include "ASyncSerial.h" 4 #include "DomoticzHardware.h" 5 #include <map> 6 7 #define ENOCEAN3_READ_BUFFER_SIZE 65*1024 8 9 class CEnOceanESP3: public AsyncSerial, public CDomoticzHardwareBase 10 { 11 enum _eEnOcean_Receive_State 12 { 13 ERS_SYNCBYTE=0, 14 ERS_HEADER, 15 ERS_DATA, 16 ERS_CHECKSUM 17 }; 18 struct _tVLDNode 19 { 20 int idx; 21 int manufacturer; 22 uint8_t profile; 23 uint8_t type; 24 }; 25 public: 26 CEnOceanESP3(const int ID, const std::string& devname, const int type); 27 ~CEnOceanESP3(); 28 bool WriteToHardware(const char *pdata, const unsigned char length) override; 29 void SendDimmerTeachIn(const char *pdata, const unsigned char length); 30 unsigned long m_id_base; 31 private: 32 void Init(); 33 bool StartHardware() override; 34 bool StopHardware() override; 35 bool OpenSerialDevice(); 36 void Do_Work(); 37 bool ParseData(); 38 void Add2SendQueue(const char* pData, const size_t length); 39 float GetValueRange(const float InValue, const float ScaleMax, const float ScaleMin=0, const float RangeMax=255, const float RangeMin=0); 40 41 bool sendFrame(unsigned char frametype, unsigned char *databuf, unsigned short datalen, unsigned char *optdata, unsigned char optdatalen); 42 bool sendFrameQueue(unsigned char frametype, unsigned char *databuf, unsigned short datalen, unsigned char *optdata, unsigned char optdatalen); 43 44 void ParseRadioDatagram(); 45 void readCallback(const char *data, size_t len); 46 47 void ReloadVLDNodes(); 48 private: 49 _eEnOcean_Receive_State m_receivestate; 50 int m_wantedlength; 51 52 std::shared_ptr<std::thread> m_thread; 53 int m_Type; 54 std::string m_szSerialPort; 55 56 bool m_bBaseIDRequested; 57 58 // Create a circular buffer. 59 unsigned char m_ReceivedPacketType; 60 int m_DataSize; 61 int m_OptionalDataSize; 62 unsigned char m_buffer[ENOCEAN3_READ_BUFFER_SIZE]; 63 int m_bufferpos; 64 int m_retrycntr; 65 66 std::map<uint32_t, _tVLDNode> m_VLDNodes; 67 68 std::mutex m_sendMutex; 69 std::vector<std::string> m_sendqueue; 70 }; 71 72