short CCP4002Prot::Trans(void)
{
	short ret    = 0;
	DWORD retErr = 0;

	SetCpStatusString(TRANSMIT);

	if (false == WriteCanQueue(m_comnum, m_transBuf, m_transBuflen))
	{	
		DTLOG(m_logid, DT_CP4002PROT_CAN_WRITE_FAILED);
		retErr = GetLastError();
		m_errCounterTrans++;
		ret = -1; 
	}
	else
	{
		m_myTimer->Set_MaxSecs(m_recvTimeoutSec);
		m_myTimer->StartTimer(true);
		retErr = 0;
		m_errCounterTrans = 0;
		ret = 0; 
	}

	return ret;
}

short CCP4002Prot::Recv(void)
{	// Wartet auf ReceiveEvents und berwacht Timeouts
	static int merkeBytesReceivedAll = 0;
	DWORD waitResult = 0;
	short ret        = 0;	
	bool timeout     = false;
	
	SetCpStatusString(RECEIVE);

	m_bytesReceived  = 0;
	m_recvTimeout    = false;

	memset(m_recvBuf, 0x00, CP_RECEIVE_MAX_LEN);					
	
	if (m_bytesSollRecv > 0)
	{	// Wenn gesendeter Befehl eine Antwort erwartet, wird auf ReceiveEvent gewartet
		if (CP_START == m_cpStatus)
		{
			m_CountSampleTime = true;
			m_startSampleTime = time(NULL);
		}

		//merkeBytesReceivedAll = 0;
		while ((m_bytesReceived < m_bytesSollRecv) && (!timeout))
		{	// Wenn noch nicht alle Bytes empfangen wurden und es noch kein Timeout gab, wird auf weitere Daten gewartet
			if (merkeBytesReceivedAll != m_bytesReceivedAll)
			{	// Es wurden neuen Daten empfangen
				m_myTimer->Set_MaxSecs(CP_ANADATA_TIMEOUT_2/1000);
				m_myTimer->ResetTimer();	// Timer zurcksetzen		

				if (CP_START == m_cpStatus && false == m_CountRunTime)
				{	// Nach dem Splen, wenn das erste Byte empfangen wurde, wird die RunTime gezhlt und die Ventile geschaltet
					m_CountRunTime = true;
					m_startRunTime = time(NULL);

					m_flushingFinished = true;	
				}

				merkeBytesReceivedAll = m_bytesReceivedAll;
			}

			if (m_myTimer->Get_NumberOfExpiry() > 0)
			{	// Wenn Timer abgelaufen war -> Timeout!
				m_myTimer->StopTimer();		// Timer anhalten
				m_myTimer->ResetTimer();	// Timer zurcksetzen
				timeout = true;
			}
		}
		merkeBytesReceivedAll = m_bytesReceivedAll;	// Zur Sicherheit am Ende nochmals kopieren

		if (m_bytesReceived == m_bytesSollRecv && (!timeout))
		{	// Wenn alles empfangen und kein Timeout
			ret = ProcessRecvData();
			xValue(CP4002ReqWithAnsw)++;
			//SaveXVars();
		}
		else
		{
			DTLOG(m_logid, DT_CP4002PROT_RECEIVE_FAILED, m_bytesSollRecv, m_bytesReceived);
			TRACE(_T("NOT all Bytes received or timeout! %i\n"), m_bytesReceived);	
			xValue(CP4002ReqWithoutAnsw)++;
			//SaveXVars();
		}
	}

	if (CP_START == m_cpStatus)
	{
		m_CountSampleTime = false;
		m_CountRunTime    = false;
	}

	return ret;
}

bool CCP4002Prot::RecvFomCAN(CANMSG *cm)
{	// Hier kommt Empfangenes von CAN an
	CANMSG *cmTemp = cm;
	
	memcpy((m_recvBuf+m_bytesReceived), cmTemp->byContent, cmTemp->byDatalength);

	if (0 == m_bytesReceived)	
		m_bytesReceivedAll = 0;
	m_bytesReceivedAll += cmTemp->byDatalength;

	if (CP_START == m_cpStatus)
		SetCpStatusString(RECEIVE);

	m_bytesReceived += cmTemp->byDatalength;

	//if (cmTemp->byDatalength > 0)
	//{
	//	SetEvent(m_recvEvent);	// Dem Protokoll melden, dass neue Daten eingegangen sind
	//}

	return true;
}