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