From 1fd49a571338b6c946bb05dcdf59ec1468df5c50 Mon Sep 17 00:00:00 2001
From: SWK <sungwk82@diteam.co.kr>
Date: 목, 22 12월 2022 12:31:43 +0900
Subject: [PATCH] ongoing50 #4403 CF AOI Reveiw TACT 지연 개선 1. 일정 시간 유지 신호 처리 시 동기화로 인한 불합리 개선 - 일정 시간 유지 필요 시 스래드풀 작업큐를 이용하여 루프처리 방식으로 변경 - 유지 신호 처리 중 출력 신호 발생 시 작업큐에 등록하여 유지 신호와 결합하여 출력 처리 2. FDC 보고 항목 중 SW 버전 체크 루프 불합리 개선 - 프로그램 시작 시 연동 프로그램 버전 체크 간 실행되지 않는 프로그램이 있는 경우 무한 루프 발생 - 무한 루프로 인한 CPU 점유 상승->루프 중간 Sleep추가 및 코드 간소화 3. 로그 메시지에 시간 ms단위 추가(황만수SM 작업 내역 병합)

---
 ReviewSystem/CHSignalControls/SignalControl_DitSharedMemorySync.cpp |  208 +++++++++++++++++++++++++++++++--------------------
 1 files changed, 125 insertions(+), 83 deletions(-)

diff --git a/ReviewSystem/CHSignalControls/SignalControl_DitSharedMemorySync.cpp b/ReviewSystem/CHSignalControls/SignalControl_DitSharedMemorySync.cpp
index d6ef04c..bc35c12 100644
--- a/ReviewSystem/CHSignalControls/SignalControl_DitSharedMemorySync.cpp
+++ b/ReviewSystem/CHSignalControls/SignalControl_DitSharedMemorySync.cpp
@@ -139,101 +139,143 @@
 
 BOOL CSignalControl_DitSharedMemorySync::Write_SendSignal(int nAddrIndex, int nSignalIndex, WORD wSignalValue, int nOnTime)
 {
-	if(nOnTime == 0)
-{
-	if(m_pMemStartAddr == NULL) return FALSE;
-	if (m_ControlInfo.GetIndex() < 0) return FALSE;
-
-
-	CSingleLock localLock(&m_csWriteSignal);
-	localLock.Lock();
-
-	if(m_pSendSignalValueAddr[nAddrIndex]==NULL) return FALSE;
-
-	int nAddress = m_pSendSignalValueAddr[nAddrIndex];
-
-	// read value
-	WORD wCurValue = 0;
-	memcpy(&wCurValue, m_pMemStartAddr+nAddress, sizeof(WORD));
-
-	// send value
-	WORD wSendValue = 0;
-	if (wSignalValue==1)		// signal on
-	{
-		wSendValue = 1 << nSignalIndex;
-		wSendValue = wSendValue | wCurValue;
-	}
-	else								// signal off
-	{
-		if (wCurValue>0)
-		{
-			wSendValue = 1 << nSignalIndex;
-			wSendValue = (wCurValue - wSendValue)<0 ? 0 : (wCurValue - wSendValue);
-		}
-	}
-
-	memcpy(m_pMemStartAddr+nAddress, &wSendValue, sizeof(WORD));
-
-
-	return TRUE;
-}
-	else
-{
-	if (m_pSignalThread==NULL) return FALSE;
+	/*< SWK 20221221 - #4403 MOD Start >*/
+// 	if (nOnTime == 0)
+// 	{
+// 		if (m_pMemStartAddr == NULL) return FALSE;
+// 		if (m_ControlInfo.GetIndex() < 0) return FALSE;
+// 
+// 
+// 		CSingleLock localLock(&m_csWriteSignal);
+// 		localLock.Lock();
+// 
+// 		if (m_pSendSignalValueAddr[nAddrIndex] == NULL) return FALSE;
+// 
+// 		int nAddress = m_pSendSignalValueAddr[nAddrIndex];
+// 
+// 		// read value
+// 		WORD wCurValue = 0;
+// 		memcpy(&wCurValue, m_pMemStartAddr + nAddress, sizeof(WORD));
+// 
+// 		// send value
+// 		WORD wSendValue = 0;
+// 		if (wSignalValue == 1)		// signal on
+// 		{
+// 			wSendValue = 1 << nSignalIndex;
+// 			wSendValue = wSendValue | wCurValue;
+// 		}
+// 		else								// signal off
+// 		{
+// 			if (wCurValue > 0)
+// 			{
+// 				wSendValue = 1 << nSignalIndex;
+// 				wSendValue = (wCurValue - wSendValue) < 0 ? 0 : (wCurValue - wSendValue);
+// 			}
+// 		}
+// 
+// 		memcpy(m_pMemStartAddr + nAddress, &wSendValue, sizeof(WORD));
+// 
+// 
+// 		return TRUE;
+// 	}
+// 	else
+// 	{
+// 		if (m_pSignalThread == NULL) return FALSE;
+// 
+// 		CSignalData signalData;
+// 		signalData.nAddrIndex = nAddrIndex;
+// 		signalData.nSignalIndex = nSignalIndex;
+// 		signalData.wSignalValue = wSignalValue;
+// 		signalData.dwOnTime = nOnTime;
+// 
+// 		return m_pSignalThread->AddThreadData(signalData);
+// 	}
+// 
+	if (m_pSignalThread == NULL) return FALSE;
 
 	CSignalData signalData;
-	signalData.nAddrIndex		= nAddrIndex;
-	signalData.nSignalIndex		= nSignalIndex;
-	signalData.wSignalValue		= wSignalValue;
-	signalData.dwOnTime			= nOnTime;
+	signalData.nAddrIndex = nAddrIndex;
+	signalData.nSignalIndex = nSignalIndex;
+	signalData.wSignalValue = wSignalValue;
+	signalData.dwOnTime = nOnTime;
 
 	return m_pSignalThread->AddThreadData(signalData);
-}
-
-
+	/*< SWK 20221221 - #4403 MOD End >*/
 }
 
 void CSignalControl_DitSharedMemorySync::IST2P_RunThreadProcess(const CSignalData& signalData)
 {
-	CSingleLock localLock(&m_csWriteSignal);
-	localLock.Lock();
-
-	if (m_nSendSignalCount<=0) return;
-
-	if(m_pMemStartAddr == NULL) return;
+	/*< SWK 20221221 - #4403 MOD Start >*/
+// 	CSingleLock localLock(&m_csWriteSignal);
+// 	localLock.Lock();
+// 
+// 	if (m_nSendSignalCount<=0) return;
+// 
+// 	if(m_pMemStartAddr == NULL) return;
+// 
+// 	int nAddress = m_pSendSignalValueAddr[signalData.nAddrIndex];
+// 
+// 	// read value
+// 	WORD wCurValue = 0;
+// 	memcpy(&wCurValue, m_pMemStartAddr+nAddress, sizeof(WORD));
+// 
+// 	// send value
+// 	WORD wSendValue = 0;
+// 	wSendValue = 1 << signalData.nSignalIndex;
+// 	if (signalData.wSignalValue==1)		// signal on
+// 	{
+// 		wSendValue = 1 << signalData.nSignalIndex;
+// 		wSendValue = wSendValue | wCurValue;
+// 	}
+// 	else								// signal off
+// 	{
+// 		if (wCurValue>0)
+// 		{
+// 			wSendValue = 1 << signalData.nSignalIndex;
+// 			wSendValue = (wCurValue - wSendValue)<0 ? 0 : (wCurValue - wSendValue);
+// 		}
+// 	}
+// 
+// 	memcpy(m_pMemStartAddr+nAddress, &wSendValue, sizeof(WORD));
+// 
+// 	if (signalData.dwOnTime>0)
+// 	{
+// 		localLock.Unlock();
+// 		// wait
+// 		::Sleep(signalData.dwOnTime);
+// 
+// 		// clear value
+// 		memcpy(m_pMemStartAddr+nAddress, &wCurValue, sizeof(WORD));
+// 	}
+// 
+// 
+	if (m_nSendSignalCount <= 0) return;
+	if (m_pMemStartAddr == NULL) return;
+	if (signalData.dwOnTime <= 0)	// Signal without hold-time
+		;
+	else if(0 == signalData.ullStartTick)	// Signal with hold-time
+	{
+		CSignalData NewSignalData = signalData;
+		NewSignalData.ullStartTick = GetTickCount64();			// Set Start Tick
+		NewSignalData.wSignalValue = !signalData.wSignalValue;	// Signal Inversion
+		m_pSignalThread->AddThreadData(NewSignalData);
+	}
+	else if (GetTickCount64() - signalData.ullStartTick < signalData.dwOnTime)	// Check Holding Time
+	{
+		CSignalData NewSignalData = signalData;
+		m_pSignalThread->AddThreadData(NewSignalData);
+		return;
+	}
 
 	int nAddress = m_pSendSignalValueAddr[signalData.nAddrIndex];
+	WORD wSendValue = 1 << signalData.nSignalIndex;
 
-	// read value
 	WORD wCurValue = 0;
-	memcpy(&wCurValue, m_pMemStartAddr+nAddress, sizeof(WORD));
-
-	// send value
-	WORD wSendValue = 0;
-	if (signalData.wSignalValue==1)		// signal on
-	{
-		wSendValue = 1 << signalData.nSignalIndex;
-		wSendValue = wSendValue | wCurValue;
-	}
-	else								// signal off
-	{
-		if (wCurValue>0)
-		{
-			wSendValue = 1 << signalData.nSignalIndex;
-			wSendValue = (wCurValue - wSendValue)<0 ? 0 : (wCurValue - wSendValue);
-		}
-	}
-
-	memcpy(m_pMemStartAddr+nAddress, &wSendValue, sizeof(WORD));
-
-	if (signalData.dwOnTime>0)
-	{
-		// wait
-		::Sleep(signalData.dwOnTime);
-
-		// clear value
-		memcpy(m_pMemStartAddr+nAddress, &wCurValue, sizeof(WORD));
-	}
+	memcpy(&wCurValue, m_pMemStartAddr + nAddress, sizeof(WORD));
+	if (true == signalData.wSignalValue)	wCurValue |= wSendValue;
+	else									wCurValue &= ~wSendValue;
+	memcpy(m_pMemStartAddr + nAddress, &wCurValue, sizeof(WORD));
+	/*< SWK 20221221 - #4403 MOD End >*/
 }
 
 BOOL CSignalControl_DitSharedMemorySync::ReadData(const CString strAddr, int nSize, CString& strData)

--
Gitblit v1.9.3