From 3ce48f6dbeb537e252edb0d62c88a28796e36674 Mon Sep 17 00:00:00 2001
From: SWK <sungwk82@diteam.co.kr>
Date: 월, 26 12월 2022 15:04:42 +0900
Subject: [PATCH] ongoing60 #4403 CF AOI Review TACT 지연 개선 1. 신호 출력 방식 재개선  - 유지 시간이 없는 신호는 바로 출력 진행하도록 변경 2. 불필요 Delay 제거 및 시퀀스 변경  - 얼라인 측정 종료 처리 간 제어 신호 먼저 출력 후 카메라 Stop으로 변경  - 물류 정보 읽기 처리 후 1000ms Delay 삭제  - 얼라인 측정 시작(카메라 Live Start) 후 Delay 300ms -> 100ms(이미지 들어오는 시간 확보 필요)  - ReadRawFile 처리 시작 전 500ms Delay 삭제  - Path Scheduling 완료 후 Review Ready 신호 출력 전 1000ms Delay 삭제 3. 버그 수정  - 이미지 저장 경로 생성 간 예외 처리 부분 버그 수정 4. 로그 시간 출력 불합리 개선  - 로그 시간이 파일 출력 시점으로 작성되어 로그 스래드 지연 시 시간이 맞지 않는 불합리 있음  - 로그 시간은 로그 발생 시점에 시간 저장, 해당 시간 이용하여 파일에 기록하도록 변경

---
 ReviewHistory/ReveiwHistory/akIPCNetAOISystem.cpp |  189 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 189 insertions(+), 0 deletions(-)

diff --git a/ReviewHistory/ReveiwHistory/akIPCNetAOISystem.cpp b/ReviewHistory/ReveiwHistory/akIPCNetAOISystem.cpp
new file mode 100644
index 0000000..c963e99
--- /dev/null
+++ b/ReviewHistory/ReveiwHistory/akIPCNetAOISystem.cpp
@@ -0,0 +1,189 @@
+#include "StdAfx.h"
+#include "akIPCNetAOISystem.h"
+#include <process.h>
+
+#define SHAREDMEMNAME "DIT.AOISYSTEM.SHAREDMEM"
+
+akIPCNetAOISystem::akIPCNetAOISystem(void)
+: m_mxSignalProcess(FALSE, _T("IPC_NETWORKSYSTEM_MUTEX"))
+{
+	m_pParent = NULL;
+	m_nThreadSignalFlag = 0;
+	m_pIPCAOISystem = NULL;
+	m_hMapIPCAOISystem = NULL;
+	
+	InitializeCriticalSection(&m_csSignalProcess);
+}
+
+akIPCNetAOISystem::~akIPCNetAOISystem(void)
+{
+	if(m_nThreadSignalFlag == 1) m_nThreadSignalFlag = 2;
+	while(m_nThreadSignalFlag != 0)
+	{
+		Sleep(0);
+	}
+
+	if (m_pIPCAOISystem!=NULL)
+	{
+		::UnmapViewOfFile(m_pIPCAOISystem);
+		m_pIPCAOISystem = NULL;
+	}
+
+	if (m_hMapIPCAOISystem != NULL)
+	{
+		::CloseHandle(m_hMapIPCAOISystem);
+		m_hMapIPCAOISystem = NULL;
+	}
+
+}
+
+bool akIPCNetAOISystem::Create( CWnd* pParent )
+{
+	if(m_pIPCAOISystem) return false;
+
+
+	BOOL bCreateSharedMem = FALSE;//공유메모리 생성 [김태현 2018/9/10]
+	{
+		BOOL bCreateMem = TRUE;
+
+		m_hMapIPCAOISystem = ::CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE
+			, 0, sizeof(_IPCAOISystem), SHAREDMEMNAME);
+
+		if (::GetLastError() == ERROR_ALREADY_EXISTS)
+		{
+			m_hMapIPCAOISystem = ::OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,SHAREDMEMNAME);
+			bCreateMem = FALSE;
+		}
+
+		if (m_hMapIPCAOISystem)
+		{
+			m_pIPCAOISystem = (_IPCAOISystem*)::MapViewOfFile(m_hMapIPCAOISystem, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(_IPCAOISystem));
+			if (m_pIPCAOISystem)
+			{
+				bCreateSharedMem = TRUE;
+			}
+		}
+		
+		//0으로 초기화
+		if(bCreateMem && m_pIPCAOISystem) ZeroMemory(m_pIPCAOISystem,sizeof(_IPCAOISystem));
+	}
+
+	if(bCreateSharedMem == FALSE) return false;
+
+	m_pParent = pParent;
+
+	_beginthread(threadSignal, NULL, this);
+
+	return true;
+}
+
+void akIPCNetAOISystem::threadSignal( void* arg )
+{
+	akIPCNetAOISystem* pThis = (akIPCNetAOISystem*)arg;
+
+	pThis->m_nThreadSignalFlag = 1;
+	pThis->processSignal();
+	pThis->m_nThreadSignalFlag = 0;
+}
+
+void akIPCNetAOISystem::processSignal()
+{
+	char m_nSignalPreAOI[INA_SIGNALNUM]={};
+	char m_nSignalCurAOI[INA_SIGNALNUM]={};
+	char m_nSignalPreReview[INA_SIGNALNUM]={};
+	char m_nSignalCurReview[INA_SIGNALNUM]={};
+
+	DWORD dwTickCount =0;
+
+	while(m_nThreadSignalFlag == 1)
+	{
+		dwTickCount = GetTickCount();
+
+		m_mxSignalProcess.Lock();
+		memcpy(m_nSignalCurAOI, getAOIProtocol()->m_nSignal, sizeof(char)*INA_SIGNALNUM);
+		memcpy(m_nSignalCurReview, getReviewProtocol()->m_nSignal, sizeof(char)*INA_SIGNALNUM);
+		m_mxSignalProcess.Unlock();
+		//Signal 감지 부분 [김태현 2018/9/10]
+		{
+			for(int i=0; i<INA_SIGNALNUM; i++)
+			{
+				if(m_nSignalCurAOI[i] == 1 && m_nSignalPreAOI[i] == 0)
+				{
+					RecvSignal(ST_AOI, i);
+				}
+			}
+			for(int i=0; i<INA_SIGNALNUM; i++)
+			{
+				if(m_nSignalCurReview[i] == 1 && m_nSignalPreReview[i] == 0)
+				{
+					RecvSignal(ST_Review, i);
+				}
+			}
+		}
+
+		//signal time off 처리 부분
+		{
+			EnterCriticalSection(&m_csSignalProcess);
+			for(int i=m_vecSignalTimeOff.size()-1; i>=0; i--)
+			{
+				if(m_vecSignalTimeOff[i].nTimeBitOff < dwTickCount)
+				{
+					*m_vecSignalTimeOff[i].pSignal = 0;
+					m_vecSignalTimeOff.erase(m_vecSignalTimeOff.begin()+i);
+				}
+				else if(*m_vecSignalTimeOff[i].pSignal == 0)
+				{
+					m_vecSignalTimeOff.erase(m_vecSignalTimeOff.begin()+i);
+				}
+			}
+			LeaveCriticalSection(&m_csSignalProcess);
+		}
+
+		memcpy(m_nSignalPreAOI, m_nSignalCurAOI, sizeof(char)*INA_SIGNALNUM);
+		memcpy(m_nSignalPreReview, m_nSignalCurReview, sizeof(char)*INA_SIGNALNUM);
+
+		Sleep(50);
+	}
+}
+
+bool akIPCNetAOISystem::SetSignal( emSystemType nSystemType, int nSignalIndex, int nTimeMS /*= 500*/ )
+{
+	char* pSignal = NULL;
+	if(nSystemType == ST_AOI)
+	{
+		pSignal = &getAOIProtocol()->m_nSignal[nSignalIndex];
+	}
+	else if(nSystemType == ST_Review)
+	{
+		pSignal = &getReviewProtocol()->m_nSignal[nSignalIndex];
+	}
+
+
+	EnterCriticalSection(&m_csSignalProcess);
+	for(int i=0; i<m_vecSignalTimeOff.size(); i++)
+	{
+		if(m_vecSignalTimeOff[i].pSignal == pSignal)
+		{
+			LeaveCriticalSection(&m_csSignalProcess);
+			return false;
+		}
+	}
+
+	_SignalTimerOff signaloff;
+	signaloff.pSignal = pSignal;
+	signaloff.nTimeBitOff = GetTickCount()+nTimeMS;
+	m_vecSignalTimeOff.push_back(signaloff);
+	LeaveCriticalSection(&m_csSignalProcess);
+
+	m_mxSignalProcess.Lock();
+	*pSignal = 1;
+	m_mxSignalProcess.Unlock();
+	
+	return true;
+}
+
+void akIPCNetAOISystem::RecvSignal( emSystemType nSystemType, int nSignal )
+{
+	if(m_pParent) m_pParent->PostMessage(UM_IPCNETAOISYSTEM, nSignal, (int)nSystemType);
+}
+

--
Gitblit v1.9.3