#include "stdafx.h" #include "CStep.h" namespace SERVO { #define TIMEOUT 15 unsigned __stdcall StepWorkThreadFunction(LPVOID lpParam) { CStep* pStep = (CStep*)lpParam; return pStep->WorkingProc(); } CStep::CStep() { m_nWordThreadAddr = 0; m_hWorkStop = nullptr; m_hWorkThreadHandle = nullptr; m_hSignalOn = ::CreateEvent(NULL, TRUE, FALSE, NULL); m_hSignalOff = ::CreateEvent(NULL, TRUE, FALSE, NULL); m_nCurStep = 0; m_pCclink = nullptr; m_nWriteSignalDev = 0; InitializeCriticalSection(&m_criticalSection); } CStep::~CStep() { ASSERT(m_hSignalOn); CloseHandle(m_hSignalOn); m_hSignalOn = nullptr; ASSERT(m_hSignalOff); CloseHandle(m_hSignalOff); m_hSignalOff = nullptr; DeleteCriticalSection(&m_criticalSection); } void CStep::setCcLink(CCCLinkIEControl* pCcLink) { m_pCclink = pCcLink; } void CStep::setWriteSignalDev(int dev) { m_nWriteSignalDev = dev; } void CStep::init() { if (m_hWorkStop != nullptr) return; m_hWorkStop = ::CreateEvent(NULL, TRUE, FALSE, NULL); m_hWorkThreadHandle = (HANDLE)_beginthreadex(NULL, 0, SERVO::StepWorkThreadFunction, this, 0, &m_nWordThreadAddr); } void CStep::term() { ASSERT(m_hWorkStop); SetEvent(m_hWorkStop); if (m_hWorkThreadHandle != NULL) { WaitForSingleObject(m_hWorkThreadHandle, INFINITE); CloseHandle(m_hWorkThreadHandle); m_hWorkThreadHandle = NULL; } CloseHandle(m_hWorkStop); m_hWorkStop = NULL; } unsigned CStep::WorkingProc() { HANDLE hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); BOOL bReadOk = FALSE; int nBeginAddr = 0x0; while (1) { RESET: resetStep(); // ´ýÍ˳öÐźŻòʱ¼äµ½ HANDLE hEvents[] = { m_hWorkStop, m_hSignalOn }; int nRet = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE); if (nRet == WAIT_OBJECT_0) { ResetEvent(m_hWorkStop); break; } else if (nRet == WAIT_OBJECT_0 + 1) { ResetEvent(m_hSignalOn); // 1.¶ÁÈ¡Êý¾Ý nextStep(); ASSERT(m_pCclink); onReadData(); // 2.¸ø¶Ô·½Ð´ON nextStep(); m_pCclink->SetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev); // 3.µÈ´ý¶Ô·½OFF nextStep(); int nStep3Ret = ::WaitForSingleObject(m_hSignalOff, TIMEOUT * 1000); if (nStep3Ret == WAIT_TIMEOUT) { m_pCclink->ResetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev); onTimeout(); goto RESET; } ResetEvent(m_hSignalOff); // 4.¸ø¶Ô·½Ð´OFF nextStep(); m_pCclink->ResetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev); // 6.Íê³É nextStep(); onComplete(); } } if (hEvent != nullptr) { CloseHandle(hEvent); } // _endthreadex(0); TRACE("CStep::WorkingProc Ïß³ÌÍ˳ö\n"); return 0; } void CStep::onSignal(BOOL bSignal) { Lock(); if (m_nCurStep == 0 && bSignal) { SetEvent(m_hSignalOn); } else if (m_nCurStep == 3 && !bSignal) { SetEvent(m_hSignalOff); } Unlock(); } int CStep::onReadData() { return 0; } int CStep::onComplete() { return 0; } int CStep::onTimeout() { return 0; } void CStep::resetStep() { Lock(); m_nCurStep = 0; Unlock(); } void CStep::nextStep() { Lock(); m_nCurStep++; Unlock(); } }