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