LAPTOP-SNT8I5JK\Boounion
2025-05-27 e937700184e21d263b771921b269fbdda341dfc4
SourceCode/Bond/Servo/CMaster.cpp
@@ -6,6 +6,15 @@
namespace SERVO {
   CMaster* g_pMaster = NULL;
   unsigned __stdcall DispatchThreadFunction(LPVOID lpParam)
   {
      if (g_pMaster != NULL) {
         return g_pMaster->DispatchProc();
      }
      return 0;
   }
   unsigned __stdcall ReadBitsThreadFunction(LPVOID lpParam)
   {
      if (g_pMaster != NULL) {
@@ -24,12 +33,21 @@
   CMaster::CMaster()
   {
      m_listener = {nullptr, nullptr, nullptr, nullptr, nullptr};
      m_listener = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
      m_bDataModify = FALSE;
      m_hEventReadBitsThreadExit[0] = ::CreateEvent(NULL, TRUE, FALSE, NULL);
      m_hEventReadBitsThreadExit[1] = ::CreateEvent(NULL, TRUE, FALSE, NULL);
      m_hReadBitsThreadHandle = nullptr;
      m_nReadBitsThreadAddr = 0;
      m_hDispatchEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
      m_hEventDispatchThreadExit[0] = ::CreateEvent(NULL, TRUE, FALSE, NULL);
      m_hEventDispatchThreadExit[1] = ::CreateEvent(NULL, TRUE, FALSE, NULL);
      m_hDispatchThreadHandle = nullptr;
      m_nDispatchThreadAddr = 0;
      m_ullStartTime = 0;
      m_ullRunTime = 0;
      m_state = MASTERSTATE::READY;
      InitializeCriticalSection(&m_criticalSection);
   }
   CMaster::~CMaster()
@@ -43,10 +61,28 @@
         ::CloseHandle(m_hEventReadBitsThreadExit[1]);
         m_hEventReadBitsThreadExit[1] = nullptr;
      }
      if (m_hDispatchEvent != nullptr) {
         ::CloseHandle(m_hDispatchEvent);
         m_hDispatchEvent = nullptr;
      }
      if (m_hEventDispatchThreadExit[0] != nullptr) {
         ::CloseHandle(m_hEventDispatchThreadExit[0]);
         m_hEventDispatchThreadExit[0] = nullptr;
      }
      if (m_hEventDispatchThreadExit[1] != nullptr) {
         ::CloseHandle(m_hEventDispatchThreadExit[1]);
         m_hEventDispatchThreadExit[1] = nullptr;
      }
      DeleteCriticalSection(&m_criticalSection);
   }
   void CMaster::setListener(MasterListener listener)
   {
      m_listener.onMasterStateChanged = listener.onMasterStateChanged;
      m_listener.onEqAlive = listener.onEqAlive;
      m_listener.onEqCimStateChanged = listener.onEqCimStateChanged;
      m_listener.onEqAlarm = listener.onEqAlarm;
@@ -159,6 +195,12 @@
      SetTimer(NULL, 1, 250, (TIMERPROC)MasterTimerProc);
      // 调度线程
      m_hDispatchThreadHandle = (HANDLE)_beginthreadex(NULL, 0, SERVO::DispatchThreadFunction, this,
         0, &m_nDispatchThreadAddr);
      // 监控bit线程
      m_hReadBitsThreadHandle = (HANDLE)_beginthreadex(NULL, 0, SERVO::ReadBitsThreadFunction, this,
         0, &m_nReadBitsThreadAddr);
@@ -170,7 +212,9 @@
   int CMaster::term()
   {
      SetEvent(m_hEventReadBitsThreadExit[0]);
      SetEvent(m_hEventDispatchThreadExit[0]);
      ::WaitForSingleObject(m_hEventReadBitsThreadExit[1], INFINITE);
      ::WaitForSingleObject(m_hEventDispatchThreadExit[1], INFINITE);
      LOGI("<Master>正在结束程序.");
      for (auto item : m_listEquipment) {
@@ -190,13 +234,86 @@
   int CMaster::start()
   {
      AfxMessageBox("start");
      if (m_state != MASTERSTATE::READY) {
         return -1;
      }
      setState(MASTERSTATE::STARTING);
      m_ullStartTime = GetTickCount64();
      return 0;
   }
   int CMaster::stop()
   {
      AfxMessageBox("stop");
      // 运行时间为累加结果,本次停止时刷新;
      if (m_state != MASTERSTATE::RUNNING) {
         return -1;
      }
      m_ullRunTime += (GetTickCount64() - m_ullStartTime);
      setState(MASTERSTATE::STOPPING);
      return 0;
   }
   ULONGLONG CMaster::getRunTime()
   {
      if (m_state == MASTERSTATE::RUNNING)
         return m_ullRunTime + (GetTickCount64() - m_ullStartTime);
      else
         return m_ullRunTime;
   }
   MASTERSTATE CMaster::getState()
   {
      return m_state;
   }
   unsigned CMaster::DispatchProc()
   {
      while (1) {
         // 待退出信号或时间到
         HANDLE hEvents[] = { m_hEventDispatchThreadExit[0], m_hDispatchEvent };
         int nRet = WaitForMultipleObjects(2, hEvents, FALSE, 1000);
         if (nRet == WAIT_OBJECT_0) {
            break;
         }
         // 如果状态为STARTING,开始工作并切换到RUNNING状态
         lock();
         if (m_state == MASTERSTATE::STARTING) {
            unlock();
            Sleep(1000);
            setState(MASTERSTATE::RUNNING);
            continue;
         }
         // 处理完成当前事务后,切换到停止或就绪状态
         else if (m_state == MASTERSTATE::STOPPING) {
            unlock();
            Sleep(1000);
            setState(MASTERSTATE::READY);
            continue;
         }
         // 调度逻辑处理
         else if (m_state == MASTERSTATE::RUNNING) {
            unlock();
            LOGI("调度处理中...");
            Sleep(1000);
         }
         unlock();
      }
      SetEvent(m_hEventDispatchThreadExit[1]);
      // _endthreadex(0);
      TRACE("CMaster::DispatchProc 线程退出\n");
      return 0;
   }
@@ -668,4 +785,12 @@
         item->serialize(ar);
      }
   }
   void CMaster::setState(MASTERSTATE state)
   {
      m_state = state;
      if (m_listener.onMasterStateChanged != nullptr) {
         m_listener.onMasterStateChanged(this, m_state);
      }
   }
}