IODeviceWithSCF.tli 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //
  2. #pragma once
  3. #include <chrono>
  4. #include "IODeviceWithSCF.tlh"
  5. //-----------------------------------------------------------------------------
  6. // IODeviceWithSCF
  7. //-----------------------------------------------------------------------------
  8. namespace DIOS::Dev::Detail
  9. {
  10. template <typename T>
  11. void IODriverWithSCF <T>::Prepare ()
  12. {
  13. super::Prepare ();
  14. assert (m_SCFDllName.length ());
  15. m_SCF = nsSCF::SCF::FromDLL (m_SCFDllName.c_str ());
  16. m_SCF.OnPassiveDisconnected = [ this ] ()
  17. {
  18. this->EventCenter->OnPassiveDisconnected();
  19. this->OnNewPacket.Set();
  20. };
  21. m_SCF.Queue.OnNewPacket = [ this ] ()
  22. {
  23. this->OnNewPacket.Set ();
  24. };
  25. }
  26. template <typename T>
  27. int IODriverWithSCF <T>::Connect ()
  28. {
  29. auto THReadPacket = [ this ] ()
  30. {
  31. auto msWait = std::chrono::milliseconds (m_msWaitSCFTimeOut);
  32. while (true)
  33. {
  34. auto rc = OnNewPacket.Wait (msWait);
  35. if (! m_SCF.isConnected ())
  36. return;
  37. if (! rc) continue; // 等待超时
  38. if (!m_SCF.isConnected ())
  39. return;
  40. while (true) // 有数据到达, 全部读完, 然后等待下一个事件
  41. {
  42. if (!m_SCF.isConnected ())
  43. return;
  44. if (m_SCF.Queue.isEmpty ())
  45. break;
  46. char cMsg [CMD_LEN_MAX];
  47. memset (cMsg, 0, sizeof (cMsg));
  48. int PacketLength = CMD_LEN_MAX;
  49. int len = m_SCF.Queue.Dequeue (cMsg, PacketLength, 20);
  50. if (len > 0)
  51. Dequeue (cMsg, len);
  52. }
  53. }
  54. };
  55. auto THFunc = [this, THReadPacket] ()
  56. {
  57. THReadPacket ();
  58. m_TID = decltype (m_TID) (); // ! 记得在这里复位 ThreadID
  59. };
  60. if (m_TID == decltype (m_TID) ())
  61. {
  62. auto TH = std::thread (THFunc);
  63. m_TID = TH.get_id ();
  64. TH.detach ();
  65. }
  66. return 2;
  67. }
  68. template <typename T>
  69. void IODriverWithSCF <T>::Disconnect ()
  70. {
  71. m_SCF.Disconnect ();
  72. OnNewPacket.Set ();
  73. super::Disconnect ();
  74. }
  75. template <typename T>
  76. bool IODriverWithSCF <T>::isConnected () const
  77. {
  78. return m_SCF.isConnected ();
  79. }
  80. }