IODeviceWithSCF.cpp 2.0 KB

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