Ticket #34: CP4002_Trans_Recv_MyTimer.txt

File CP4002_Trans_Recv_MyTimer.txt, 3.1 KB (added by Melanie Hermann, 12 years ago)
Line 
1short CCP4002Prot::Trans(void)
2{
3 short ret = 0;
4 DWORD retErr = 0;
5
6 SetCpStatusString(TRANSMIT);
7
8 if (false == WriteCanQueue(m_comnum, m_transBuf, m_transBuflen))
9 {
10 DTLOG(m_logid, DT_CP4002PROT_CAN_WRITE_FAILED);
11 retErr = GetLastError();
12 m_errCounterTrans++;
13 ret = -1;
14 }
15 else
16 {
17 m_myTimer->Set_MaxSecs(m_recvTimeoutSec);
18 m_myTimer->StartTimer(true);
19 retErr = 0;
20 m_errCounterTrans = 0;
21 ret = 0;
22 }
23
24 return ret;
25}
26
27short CCP4002Prot::Recv(void)
28{ // Wartet auf ReceiveEvents und überwacht Timeouts
29 static int merkeBytesReceivedAll = 0;
30 DWORD waitResult = 0;
31 short ret = 0;
32 bool timeout = false;
33
34 SetCpStatusString(RECEIVE);
35
36 m_bytesReceived = 0;
37 m_recvTimeout = false;
38
39 memset(m_recvBuf, 0x00, CP_RECEIVE_MAX_LEN);
40
41 if (m_bytesSollRecv > 0)
42 { // Wenn gesendeter Befehl eine Antwort erwartet, wird auf ReceiveEvent gewartet
43 if (CP_START == m_cpStatus)
44 {
45 m_CountSampleTime = true;
46 m_startSampleTime = time(NULL);
47 }
48
49 //merkeBytesReceivedAll = 0;
50 while ((m_bytesReceived < m_bytesSollRecv) && (!timeout))
51 { // Wenn noch nicht alle Bytes empfangen wurden und es noch kein Timeout gab, wird auf weitere Daten gewartet
52 if (merkeBytesReceivedAll != m_bytesReceivedAll)
53 { // Es wurden neuen Daten empfangen
54 m_myTimer->Set_MaxSecs(CP_ANADATA_TIMEOUT_2/1000);
55 m_myTimer->ResetTimer(); // Timer zurücksetzen
56
57 if (CP_START == m_cpStatus && false == m_CountRunTime)
58 { // Nach dem Spülen, wenn das erste Byte empfangen wurde, wird die RunTime gezählt und die Ventile geschaltet
59 m_CountRunTime = true;
60 m_startRunTime = time(NULL);
61
62 m_flushingFinished = true;
63 }
64
65 merkeBytesReceivedAll = m_bytesReceivedAll;
66 }
67
68 if (m_myTimer->Get_NumberOfExpiry() > 0)
69 { // Wenn Timer abgelaufen war -> Timeout!
70 m_myTimer->StopTimer(); // Timer anhalten
71 m_myTimer->ResetTimer(); // Timer zurücksetzen
72 timeout = true;
73 }
74 }
75 merkeBytesReceivedAll = m_bytesReceivedAll; // Zur Sicherheit am Ende nochmals kopieren
76
77 if (m_bytesReceived == m_bytesSollRecv && (!timeout))
78 { // Wenn alles empfangen und kein Timeout
79 ret = ProcessRecvData();
80 xValue(CP4002ReqWithAnsw)++;
81 //SaveXVars();
82 }
83 else
84 {
85 DTLOG(m_logid, DT_CP4002PROT_RECEIVE_FAILED, m_bytesSollRecv, m_bytesReceived);
86 TRACE(_T("NOT all Bytes received or timeout! %i\n"), m_bytesReceived);
87 xValue(CP4002ReqWithoutAnsw)++;
88 //SaveXVars();
89 }
90 }
91
92 if (CP_START == m_cpStatus)
93 {
94 m_CountSampleTime = false;
95 m_CountRunTime = false;
96 }
97
98 return ret;
99}
100
101bool CCP4002Prot::RecvFomCAN(CANMSG *cm)
102{ // Hier kommt Empfangenes von CAN an
103 CANMSG *cmTemp = cm;
104
105 memcpy((m_recvBuf+m_bytesReceived), cmTemp->byContent, cmTemp->byDatalength);
106
107 if (0 == m_bytesReceived)
108 m_bytesReceivedAll = 0;
109 m_bytesReceivedAll += cmTemp->byDatalength;
110
111 if (CP_START == m_cpStatus)
112 SetCpStatusString(RECEIVE);
113
114 m_bytesReceived += cmTemp->byDatalength;
115
116 //if (cmTemp->byDatalength > 0)
117 //{
118 // SetEvent(m_recvEvent); // Dem Protokoll melden, dass neue Daten eingegangen sind
119 //}
120
121 return true;
122}