1 #pragma once
2 
3 #include "ASyncSerial.h"
4 #include "DomoticzHardware.h"
5 
6 class Comm5Serial : public CDomoticzHardwareBase, AsyncSerial
7 {
8 	enum RequestState {
9 		Idle,
10 		QueryRelayState,
11 		QuerySensorState
12 	} reqState;
13 	enum {
14 		STSTART_OCTET1,
15 		STSTART_OCTET2,
16 		STFRAME_SIZE,
17 		STFRAME_CONTROL,
18 		STFRAME_DATA,
19 		STFRAME_CRC1,
20 		STFRAME_CRC2
21 	} currentState;
22 public:
23 	Comm5Serial(const int ID, const std::string& devname, unsigned int baudRate = 115200);
24 	bool WriteToHardware(const char *pdata, const unsigned char length) override;
25 	boost::signals2::signal<void()>	sDisconnected;
26 private:
27 	bool StartHardware() override;
28 	bool StopHardware() override;
29 	bool Connect();
30 	void requestDigitalInputResponseHandler(const std::string& mframe);
31 	void requestDigitalOutputResponseHandler(const std::string& mframe);
32 	void enableNotificationResponseHandler(const std::string& mframe);
33 	void readCallBack(const char* data, size_t len);
34 	uint16_t crc16_update(uint16_t crc, const uint8_t data);
35 protected:
36 	void OnError(const std::exception e);
37 
38 	void Do_Work();
39 	void ParseData(const unsigned char *data, const size_t len);
40 	void parseFrame(const std::string& mframe);
41 	bool writeFrame(const std::string&);
42 
43 
44 	void queryRelayState();
45 	void querySensorState();
46 	void enableNotifications();
47 private:
48 	std::string m_szSerialPort;
49 	const unsigned int m_baudRate;
50 
51 	std::string frame;
52 	size_t frameSize;
53 	uint16_t frameCRC;
54 
55 	bool initSensorData;
56 	int lastKnownSensorState;
57 	uint8_t relayStatus;
58 
59 	bool notificationEnabled;
60 
61 	bool m_bReceiverStarted;
62 
63 	std::shared_ptr<std::thread> m_thread;
64 };
65 
66