SourceCode/Bond/Servo/CStep.cpp
@@ -7,12 +7,13 @@
   unsigned __stdcall StepWorkThreadFunction(LPVOID lpParam)
   {
      CStep* pScale = (CStep*)lpParam;
      return pScale->WorkingProc();
      CStep* pStep = (CStep*)lpParam;
      return pStep->WorkingProc();
   }
   CStep::CStep()
   {
      m_listener = {nullptr};
      m_nWordThreadAddr = 0;
      m_hWorkStop = nullptr;
      m_hWorkThreadHandle = nullptr;
@@ -20,6 +21,7 @@
      m_hSignalOff = ::CreateEvent(NULL, TRUE, FALSE, NULL);
      m_nCurStep = 0;
      m_pCclink = nullptr;
      m_nWriteSignalDev = 0;
      InitializeCriticalSection(&m_criticalSection);
   }
@@ -36,9 +38,39 @@
      DeleteCriticalSection(&m_criticalSection);
   }
   void CStep::setListener(StepListener listener)
   {
      m_listener.onEvent = listener.onEvent;
   }
   void CStep::setCcLink(CCCLinkIEControl* pCcLink)
   {
      m_pCclink = pCcLink;
   }
   void CStep::setEquipment(CEquipment* pEquipment)
   {
      m_pEquipment = pEquipment;
   }
   CEquipment* CStep::getEquipment()
   {
      return m_pEquipment;
   }
   void CStep::setName(const char* pszName)
   {
      m_strName = pszName;
   }
   std::string& CStep::getName()
   {
      return m_strName;
   }
   void CStep::setWriteSignalDev(int dev)
   {
      m_nWriteSignalDev = dev;
   }
   void CStep::init()
@@ -86,23 +118,23 @@
            // 1.读取数据
            nextStep();
            ASSERT(m_pCclink);
            StationIdentifier station(0, 255);
            DWordContainer dc;
            m_pCclink->ReadDWordData(station, DeviceType::W, 0x4a8c, 1, dc);
            int nState = dc.at(0);
            TRACE(">> nState:%d\n", nState);
            if (0 == onReadData()) {
               if (m_listener.onEvent != nullptr) {
                  m_listener.onEvent(this, STEP_EVENT_READDATA, nullptr);
               }
            }
            // 2.给对方写ON
            nextStep();
            m_pCclink->SetBitDevice(station, DeviceType::B, 0x30);
            m_pCclink->SetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev);
            // 3.等待对方OFF
            nextStep();
            int nStep3Ret = ::WaitForSingleObject(m_hSignalOff, TIMEOUT * 1000);
            if (nStep3Ret == WAIT_TIMEOUT) {
               timeout();
               m_pCclink->ResetBitDevice(station, DeviceType::B, 0x30);
               m_pCclink->ResetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev);
               onTimeout();
               goto RESET;
            }
            ResetEvent(m_hSignalOff);
@@ -110,18 +142,16 @@
            // 4.给对方写OFF
            nextStep();
            m_pCclink->ResetBitDevice(station, DeviceType::B, 0x30);
            TRACE("m_nCurStep:%d\n", m_nCurStep);
            // 5.对接CIM等
            nextStep();
            TRACE("m_nCurStep:%d\n", m_nCurStep);
            m_pCclink->ResetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev);
            // 6.完成
            nextStep();
            TRACE("m_nCurStep:%d\n", m_nCurStep);
            if (0 == onComplete()) {
               if (m_listener.onEvent != nullptr) {
                  m_listener.onEvent(this, STEP_EVENT_COMPLETE, nullptr);
               }
            }
         }
      }
@@ -147,6 +177,21 @@
      Unlock();
   }
   int CStep::onReadData()
   {
      return 0;
   }
   int CStep::onComplete()
   {
      return 0;
   }
   int CStep::onTimeout()
   {
      return 0;
   }
   void CStep::resetStep()
   {
      Lock();
@@ -159,11 +204,6 @@
      Lock();
      m_nCurStep++;
      Unlock();
   }
   void CStep::timeout()
   {
      TRACE(">>>>>>>>>>>>>>>> timeout:%d\n", m_nCurStep);
   }
}