#pragma once #include "CCLinkIEControl.h" #include #include #include #include using OutValuesArray = std::array; using Callback = std::function; using AnalyzeCallback = std::function; using LogCallback = std::function; class CPLCSignalListener { public: CPLCSignalListener(); ~CPLCSignalListener(); bool Initialize(StationIdentifier station, int nIntervalMs = 200); void SetStartCallback(Callback cb); void SetStopCallback(Callback cb); void SetAnalyzeCallback(AnalyzeCallback cb); void SetLogCallback(LogCallback cb); bool Start(); void Stop(); bool WriteOutValues(const OutValuesArray& values); private: void PulseBitDevice(DeviceType eDevType, short nBitNo, int nDelayMs = 50); void HandleAckLife(int i, bool bCurrTriggerBit); void ThreadProc(); private: std::unique_ptr m_pPlc; StationIdentifier m_station; int m_nIntervalMs = 200; std::atomic m_bConnected{ false }; std::atomic m_bRunning{ false }; std::thread m_thread; std::vector m_vecPrevBits; std::array m_vecAckSent = { false, false }; // ÊÇ·ñÒÑ·¢ËÍ M10/M11 std::array m_vecAckCounter = { 0, 0 }; // ¼ÆÊýÆ÷£¬³¬Ê±×Ô¶¯Çå³ý Callback m_cbStart; Callback m_cbStop; AnalyzeCallback m_cbAnalyze; LogCallback m_cbLog; };