| 1 | short 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 |
|
|---|
| 67 | short 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 |
|
|---|
| 91 | short 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))
|
|---|
| 126 | { // Wenn noch nicht alle Bytes empfangen wurden und es noch kein Timeout gab, wird auf weiteres ReceiveEvent gewartet
|
|---|
| 127 |
|
|---|
| 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 | }
|
|---|
| 166 | }
|
|---|
| 167 |
|
|---|
| 168 | if (CP_START == m_cpStatus)
|
|---|
| 169 | {
|
|---|
| 170 | m_CountSampleTime = false;
|
|---|
| 171 | m_CountRunTime = false;
|
|---|
| 172 | }
|
|---|
| 173 |
|
|---|
| 174 | return ret;
|
|---|
| 175 | }
|
|---|
| 176 |
|
|---|
| 177 | bool CCP4002Prot::RecvFomCAN(CANMSG *cm)
|
|---|
| 178 | { // Hier kommt Empfangenes von CAN an
|
|---|
| 179 | CANMSG *cmTemp = cm;
|
|---|
| 180 |
|
|---|
| 181 | memcpy((m_recvBuf+m_bytesReceived), cmTemp->byContent, cmTemp->byDatalength);
|
|---|
| 182 |
|
|---|
| 183 | if (0 == m_bytesReceived)
|
|---|
| 184 | m_bytesReceivedAll = 0;
|
|---|
| 185 | m_bytesReceivedAll += cmTemp->byDatalength;
|
|---|
| 186 |
|
|---|
| 187 | if (CP_START == m_cpStatus)
|
|---|
| 188 | SetCpStatusString(RECEIVE);
|
|---|
| 189 |
|
|---|
| 190 | m_bytesReceived += cmTemp->byDatalength;
|
|---|
| 191 |
|
|---|
| 192 | if (cmTemp->byDatalength > 0)
|
|---|
| 193 | {
|
|---|
| 194 | SetEvent(m_recvEvent); // Dem Protokoll melden, dass neue Daten eingegangen sind
|
|---|
| 195 | }
|
|---|
| 196 |
|
|---|
| 197 | return true;
|
|---|
| 198 | }
|
|---|