123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- //
- #pragma once
- #include "stdafx.h"
- #include <chrono>
- #include "IODeviceWithSCF.h"
- //-----------------------------------------------------------------------------
- // IODeviceWithSCF
- //-----------------------------------------------------------------------------
- namespace DIOS::Dev::Detail
- {
- template <typename T>
- void IODriverWithSCF <T>::Prepare ()
- {
- super::Prepare ();
- assert (m_SCFDllName.length ());
- m_SCF = nsSCF::SCF::FromDLL (m_SCFDllName.c_str ());
- m_SCF.OnPassiveDisconnected = [ this ] ()
- {
- this->EventCenter->OnPassiveDisconnected();
- this->OnNewPacket.Set();
- };
- m_SCF.Queue.OnNewPacket = [ this ] ()
- {
- this->OnNewPacket.Set ();
- };
- }
- template <typename T>
- int IODriverWithSCF <T>::Connect ()
- {
- auto THReadPacket = [ this ] ()
- {
- auto msWait = std::chrono::milliseconds (m_msWaitSCFTimeOut);
- while (true)
- {
- auto rc = OnNewPacket.Wait (msWait);
- if (! m_SCF.isConnected ())
- return;
- if (! rc) continue; // 等待超时
- if (!m_SCF.isConnected ())
- return;
- while (true) // 有数据到达, 全部读完, 然后等待下一个事件
- {
- if (!m_SCF.isConnected ())
- return;
- if (m_SCF.Queue.isEmpty ())
- break;
- char cMsg [CMD_LEN_MAX];
- memset (cMsg, 0, sizeof (cMsg));
- int PacketLength = CMD_LEN_MAX;
- int len = m_SCF.Queue.Dequeue (cMsg, PacketLength, 20);
- if (len > 0)
- Dequeue (cMsg, len);
- }
- }
- };
- auto THFunc = [this, THReadPacket] ()
- {
- THReadPacket ();
- m_TID = decltype (m_TID) (); // ! 记得在这里复位 ThreadID
- };
- if (m_TID == decltype (m_TID) ())
- {
- auto TH = std::thread (THFunc);
- m_TID = TH.get_id ();
- TH.detach ();
- }
- return 2;
- }
- template <typename T>
- void IODriverWithSCF <T>::Disconnect ()
- {
- m_SCF.Disconnect ();
- OnNewPacket.Set ();
- super::Disconnect ();
- }
- template <typename T>
- bool IODriverWithSCF <T>::isConnected () const
- {
- return m_SCF.isConnected ();
- }
- }
|