Ticket #34: CP4002_Trans_Recv_SetEvent_20140305.txt

File CP4002_Trans_Recv_SetEvent_20140305.txt, 6.4 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 switch (m_cpStatus)
23 {
24 case CP_A_SEND:
25 case CP_J_SEND:
26 case CP_N_SEND:
27 case CP_C_SEND:
28 case CP_H_SEND:
29 case CP_D_SEND:
30 case CP_START:
31 // Befehlszeichen senden
32 m_transBuf[0] = m_transChar;
33 m_transBuflen = 1;
34
35 transRet = Trans();
36 if (0 == transRet) // Wenn das Senden erfolgreich war, wird empfangen
37 recvRet = Recv();
38 break;
39
40 case CP_SMB_SEND:
41 // Parameter a-m senden
42 m_pSMethodBlock = (char *)&SMethodBlock;
43 m_transBuflen = 2;
44
45 for (int cSmb = 'a'; cSmb <= 'm'; cSmb++)
46 {
47 if (cSmb == 's') // 19tes Element aus SMB überspringen
48 cSmb++;
49
50 m_transBuf[0] = cSmb;
51 m_transBuf[1] = *m_pSMethodBlock++;
52
53 transRet = Trans();
54 if (0 == transRet) // Wenn das Senden erfolgreich war, wird empfangen
55 recvRet = Recv();
56 }
57 break;
58
59 default: // Sollte nie vorkommen!
60 ASSERT(false);
61 break;
62 }
63
64 return (transRet | recvRet);
65}
66
67short CCP4002Prot::Trans(void)
68{
69 short ret = 0;
70 DWORD retErr = 0;
71
72 SetCpStatusString(TRANSMIT);
73
74 if (false == WriteCanQueue(m_comnum, m_transBuf, m_transBuflen))
75 {
76 DTLOG(m_logid, DT_CP4002PROT_CAN_WRITE_FAILED);
77 retErr = GetLastError();
78 m_errCounterTrans++;
79 ret = -1;
80 }
81 else
82 {
83 retErr = 0;
84 m_errCounterTrans = 0;
85 ret = 0;
86 }
87
88 return ret;
89}
90
91short CCP4002Prot::Recv(void)
92{ // Wartet auf ReceiveEvents und überwacht Timeouts
93 DWORD waitResult = 0;
94 short ret = 0;
95
96 SetCpStatusString(RECEIVE);
97
98 m_bytesReceived = 0;
99 m_recvTimeout = false;
100
101 memset(m_recvBuf, 0x00, CP_RECEIVE_MAX_LEN);
102
103 bool timeout = false;
104
105 if (m_bytesSollRecv > 0)
106 { // Wenn gesendeter Befehl eine Antwort erwartet, wird auf ReceiveEvent gewartet
107 if (CP_START == m_cpStatus)
108 {
109 m_CountSampleTime = true;
110 m_startSampleTime = time(NULL);
111 }
112
113 waitResult = WaitForSingleObject(m_recvEvent, m_recvTimeoutSec);
114 switch (waitResult)
115 {
116 case WAIT_OBJECT_0:
117 break;
118 case WAIT_TIMEOUT:
119 timeout = true;
120 ret = -11;
121 break;
122 }
123 ResetEvent(m_recvEvent);
124
125 while ((m_bytesReceived < m_bytesSollRecv) && (!timeout) && (m_ProtocollIsRunning))
126 { // Wenn noch nicht alle Bytes empfangen wurden und es noch kein Timeout gab, wird auf weiteres ReceiveEvent gewartet
127 // Prüfung von 'm_ProtocollIsRunning' ermöglicht sofortiges Beenden während Datenempfang von Messwerk
128 if (CP_START == m_cpStatus && false == m_CountRunTime)
129 { // Nach dem Spülen wird die RunTime gezählt und die Ventile geschaltet
130 m_CountRunTime = true;
131 m_startRunTime = time(NULL);
132
133 m_flushingFinished = true;
134 }
135
136 waitResult = WaitForSingleObject(m_recvEvent, CP_ANADATA_TIMEOUT_2);
137 switch (waitResult)
138 {
139 case WAIT_OBJECT_0:
140 break;
141 case WAIT_TIMEOUT:
142 timeout = true;
143 ret = -12;
144 break;
145 }
146 ResetEvent(m_recvEvent);
147 }
148 }
149
150 if (m_bytesSollRecv > 0)
151 {
152 if ((!timeout) && m_bytesReceived == m_bytesSollRecv)
153 {
154 ret = ProcessRecvData();
155 xValue(CP4002ReqWithAnsw)++;
156 //SaveXVars();
157 }
158 else
159 {
160 DTLOG(m_logid, DT_CP4002PROT_RECEIVE_FAILED, m_bytesSollRecv, m_bytesReceived);
161 TRACE(_T("NOT all Bytes received or timeout! %i\n"), m_bytesReceived);
162 //TRACE(_T("m_recvBuf: %S\n"), m_recvBuf);
163 xValue(CP4002ReqWithoutAnsw)++;
164 //SaveXVars();
165 Sleep(500);
166 }
167 }
168
169 if (CP_START == m_cpStatus)
170 {
171 m_CountSampleTime = false;
172 m_CountRunTime = false;
173 }
174
175 return ret;
176}
177
178bool CCP4002Prot::RecvFomCAN(CANMSG *cm)
179{ // Hier kommt Empfangenes von CAN an
180 CANMSG *cmTemp = cm;
181
182 memcpy((m_recvBuf+m_bytesReceived), cmTemp->byContent, cmTemp->byDatalength);
183
184 if (0 == m_bytesReceived)
185 m_bytesReceivedAll = 0;
186 m_bytesReceivedAll += cmTemp->byDatalength;
187
188 if (CP_START == m_cpStatus)
189 SetCpStatusString(RECEIVE);
190
191 m_bytesReceived += cmTemp->byDatalength;
192
193 if (cmTemp->byDatalength > 0)
194 SetEvent(m_recvEvent); // Dem Protokoll melden, dass neue Daten eingegangen sind
195
196 return true;
197}