Ticket #34: CP4002_Trans_Recv_MyTimer_20140304.txt

File CP4002_Trans_Recv_MyTimer_20140304.txt, 5.5 KB (added by Melanie Hermann, 12 years ago)
Line 
1short CCP4002Prot::Transmit(unsigned int cpStatus)
2{
3 short transRet = 0; // Rückgabewert von Trans()
4 short recvRet = 0; // Rückgabewert von Recv()
5
6 m_cpStatus = cpStatus;
7 switch (m_cpStatus)
8 {
9 case CP_A_SEND: m_transChar = 'A'; m_bytesSollRecv = 0; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // Reset CP4002
10 case CP_J_SEND: m_transChar = 'J'; m_bytesSollRecv = 16; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // GC-Ident anfordern
11 case CP_N_SEND: m_transChar = 'N'; m_bytesSollRecv = 0; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // FlushMode prüfen?
12 case CP_C_SEND: m_transChar = 'C'; m_bytesSollRecv = 14; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // SBlockA
13 case CP_H_SEND: m_transChar = 'H'; m_bytesSollRecv = 14; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // SBlockB
14 case CP_SMB_SEND: m_transChar = '\0'; m_bytesSollRecv = 0; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // a-m Parameter
15 case CP_D_SEND: m_transChar = 'D'; m_bytesSollRecv = 29; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // Methode
16 case CP_START: m_transChar = 'B'; m_bytesSollRecv = 42000; m_recvTimeoutSec = ((SMethodBlock.sample_time*1000) + 5000); break; // Analysendaten
17 default: ASSERT(false); break; // Sollte nie vorkommen!
18 }
19
20 memset(m_transBuf, 0x00, CP_TRANSMIT_MAX_LEN);
21
22 m_myTimer->Set_MaxSecs(m_recvTimeoutSec/1000);
23
24 switch (m_cpStatus)
25 {
26 case CP_A_SEND:
27 case CP_J_SEND:
28 case CP_N_SEND:
29 case CP_C_SEND:
30 case CP_H_SEND:
31 case CP_D_SEND:
32 case CP_START:
33 // Befehlszeichen senden
34 m_transBuf[0] = m_transChar;
35 m_transBuflen = 1;
36
37 transRet = Trans();
38 if (0 == transRet) // Wenn das Senden erfolgreich war, wird empfangen
39 recvRet = Recv();
40 break;
41
42 case CP_SMB_SEND:
43 // Parameter a-m senden
44 m_pSMethodBlock = (char *)&SMethodBlock;
45 m_transBuflen = 2;
46
47 for (int cSmb = 'a'; cSmb <= 'm'; cSmb++)
48 {
49 if (cSmb == 's') /* 19tes Element aus SMB überspringen*/
50 cSmb++;
51
52 m_transBuf[0] = cSmb;
53 m_transBuf[1] = *m_pSMethodBlock++;
54
55 transRet = Trans();
56 if (0 == transRet) // Wenn das Senden erfolgreich war, wird empfangen
57 recvRet = Recv();
58 }
59 break;
60
61 default: // Sollte nie vorkommen!
62 ASSERT(false);
63 break;
64 }
65
66 return (transRet | recvRet);
67}
68
69short CCP4002Prot::Trans(void)
70{
71 short ret = 0;
72 DWORD retErr = 0;
73
74 SetCpStatusString(TRANSMIT);
75
76 if (false == WriteCanQueue(m_comnum, m_transBuf, m_transBuflen))
77 {
78 DTLOG(m_logid, DT_CP4002PROT_CAN_WRITE_FAILED);
79 retErr = GetLastError();
80 m_errCounterTrans++;
81 ret = -1;
82 }
83 else
84 {
85 m_myTimer->Set_MaxSecs(m_recvTimeoutSec/1000);
86 m_myTimer->StartTimer(true);
87 retErr = 0;
88 m_errCounterTrans = 0;
89 ret = 0;
90 }
91
92 return ret;
93}
94
95short CCP4002Prot::Recv(void)
96{ // Wartet auf ReceiveEvents und überwacht Timeouts
97 static int merkeBytesReceivedAll = 0;
98 DWORD waitResult = 0;
99 short ret = 0;
100 bool timeout = false;
101
102 SetCpStatusString(RECEIVE);
103
104 m_bytesReceived = 0;
105 m_recvTimeout = false;
106
107 memset(m_recvBuf, 0x00, CP_RECEIVE_MAX_LEN);
108
109 if (m_bytesSollRecv > 0)
110 { // Wenn gesendeter Befehl eine Antwort erwartet, wird auf ReceiveEvent gewartet
111 if (CP_START == m_cpStatus)
112 {
113 m_CountSampleTime = true;
114 m_startSampleTime = time(NULL);
115 }
116
117 //merkeBytesReceivedAll = 0;
118 while ((m_bytesReceived < m_bytesSollRecv) && (!timeout) && m_ProtocollIsRunning)
119 { // Wenn noch nicht alle Bytes empfangen wurden und es noch kein Timeout gab, wird auf weitere Daten gewartet
120 // Prüfung von 'm_ProtocollIsRunning' ermöglicht sofortiges Beenden während Datenempfang von Messwerk
121 if (merkeBytesReceivedAll != m_bytesReceivedAll)
122 { // Es wurden neuen Daten empfangen
123 m_myTimer->Set_MaxSecs(CP_ANADATA_TIMEOUT_2/1000);
124 m_myTimer->ResetTimer(); // Timer zurücksetzen
125
126 if (CP_START == m_cpStatus && false == m_CountRunTime)
127 { // Nach dem Spülen, wenn das erste Byte empfangen wurde, wird die RunTime gezählt und die Ventile geschaltet
128 m_CountRunTime = true;
129 m_startRunTime = time(NULL);
130
131 m_flushingFinished = true;
132 }
133
134 merkeBytesReceivedAll = m_bytesReceivedAll;
135 }
136
137 if (m_myTimer->Get_NumberOfExpiry() > 0)
138 { // Wenn Timer abgelaufen war -> Timeout!
139 m_myTimer->ResetTimer(); // Timer zurücksetzen
140 timeout = true;
141 ret = -1;
142 }
143 }
144 merkeBytesReceivedAll = m_bytesReceivedAll; // Zur Sicherheit am Ende nochmals kopieren
145
146 m_myTimer->StopTimer();
147
148 if (m_bytesReceived == m_bytesSollRecv && (!timeout))
149 { // Wenn alles empfangen und kein Timeout
150 ret = ProcessRecvData();
151 xValue(CP4002ReqWithAnsw)++;
152 //SaveXVars();
153 }
154 else
155 {
156 DTLOG(m_logid, DT_CP4002PROT_RECEIVE_FAILED, m_bytesSollRecv, m_bytesReceived);
157 TRACE(_T("NOT all Bytes received or timeout! %i\n"), m_bytesReceived);
158 xValue(CP4002ReqWithoutAnsw)++;
159 //SaveXVars();
160 }
161 }
162
163 if (CP_START == m_cpStatus)
164 {
165 m_CountSampleTime = false;
166 m_CountRunTime = false;
167 }
168
169 return ret;
170}
171
172bool CCP4002Prot::RecvFomCAN(CANMSG *cm)
173{ // Hier kommt Empfangenes von CAN an
174 CANMSG *cmTemp = cm;
175 memcpy((m_recvBuf+m_bytesReceived), cmTemp->byContent, cmTemp->byDatalength);
176
177 if (0 == m_bytesReceived)
178 m_bytesReceivedAll = 0;
179 m_bytesReceivedAll += cmTemp->byDatalength;
180
181 if (CP_START == m_cpStatus)
182 SetCpStatusString(RECEIVE);
183
184 m_bytesReceived += cmTemp->byDatalength;
185
186 return true;
187}