Details | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 270 | johboh | 1 | #include "SerialReader.h" |
| 2 | |||
| 3 | #include <assert.h> |
||
| 4 | |||
| 5 | //void arrayCopy(unsigned char *src,unsigned int srcIndex,unsigned char *dst,unsigned int dstIndex,unsigned int length); |
||
| 6 | |||
| 7 | //bool queueEnqueue(CanProtoMessage cpm); |
||
| 8 | //bool queueDequeue(CanProtoMessage *cpm); |
||
| 9 | /* |
||
| 10 | CanProtoMessage cpmQueue[QUEUE_PLACES]; |
||
| 11 | int queueReadPointer=0; |
||
| 12 | int queueWritePointer=0; |
||
| 13 | int queueLength=0; |
||
| 14 | |||
| 15 | static CSerial * serial; |
||
| 16 | |||
| 17 | static SerialConnection * sc; |
||
| 18 | |||
| 19 | static HANDLE hRunMutex; // "Keep Running" mutex |
||
| 20 | */ |
||
| 21 | void SerRead(void *pMyID) |
||
| 22 | { |
||
| 23 | |||
| 24 | unsigned char iBuff[SERIAL_READ_BUFFER_SIZE]; |
||
| 25 | unsigned int iBuffPointer = 0; |
||
| 26 | |||
| 27 | |||
| 28 | long lLastError = 0; |
||
| 29 | |||
| 30 | /* |
||
| 31 | // Register only for the receive event |
||
| 32 | lLastError = serial->SetMask(CSerial::EEventRecv); |
||
| 33 | if (lLastError != ERROR_SUCCESS) |
||
| 34 | { |
||
| 35 | printf("Err! Unable to set COM-port event mask.\n"); |
||
| 36 | return; |
||
| 37 | } |
||
| 38 | |||
| 39 | // Use 'non-blocking' reads, because we don't know how many bytes |
||
| 40 | // will be received. This is normally the most convenient mode |
||
| 41 | // (and also the default mode for reading data). |
||
| 42 | lLastError = serial->SetupReadTimeouts(CSerial::EReadTimeoutNonblocking); |
||
| 43 | if (lLastError != ERROR_SUCCESS) |
||
| 44 | { |
||
| 45 | printf("Err! Unable to set COM-port read timeout.\n"); |
||
| 46 | return; |
||
| 47 | } |
||
| 48 | */ |
||
| 49 | /* |
||
| 50 | if (SetCommMask(sc->hCom,EV_RXCHAR)) |
||
| 51 | { |
||
| 52 | // Handle the error. |
||
| 53 | printf("SetCommMask failed with error %d.\n", GetLastError()); |
||
| 54 | return; |
||
| 55 | } |
||
| 56 | |||
| 57 | // Create an event object for use by WaitCommEvent. |
||
| 58 | |||
| 59 | OVERLAPPED o; |
||
| 60 | DWORD dwEvtMask; |
||
| 61 | |||
| 62 | |||
| 63 | |||
| 64 | o.hEvent = CreateEvent( |
||
| 65 | NULL, // default security attributes |
||
| 66 | TRUE, // manual-reset event |
||
| 67 | FALSE, // not signaled |
||
| 68 | NULL // no name |
||
| 69 | ); |
||
| 70 | |||
| 71 | |||
| 72 | // Intialize the rest of the OVERLAPPED structure to zero. |
||
| 73 | o.Internal = 0; |
||
| 74 | o.InternalHigh = 0; |
||
| 75 | o.Offset = 0; |
||
| 76 | o.OffsetHigh = 0; |
||
| 77 | |||
| 78 | */ |
||
| 79 | |||
| 80 | DWORD dwCommEvent; |
||
| 81 | DWORD dwRead; |
||
| 82 | char chRead; |
||
| 83 | /* |
||
| 84 | if (sc->getHandle() ==0) |
||
| 85 | { |
||
| 86 | printf("Serial port closed."); |
||
| 87 | return; |
||
| 88 | } |
||
| 89 | */ |
||
| 90 | /* |
||
| 91 | if (!SetCommMask(sc->getHandle(), EV_RXCHAR)) |
||
| 92 | { |
||
| 93 | // Handle the error. |
||
| 94 | printf("SetCommMask failed with error %d.\n", GetLastError()); |
||
| 95 | return; |
||
| 96 | } |
||
| 97 | |||
| 98 | |||
| 99 | while ( WaitForSingleObject( hRunMutex, 75L ) == WAIT_TIMEOUT ) |
||
| 100 | { |
||
| 101 | |||
| 102 | if (WaitCommEvent(sc->getHandle(), &dwCommEvent, NULL)) |
||
| 103 | { |
||
| 104 | if (ReadFile(sc->getHandle(), &chRead, 1, &dwRead, NULL)) |
||
| 105 | { |
||
| 106 | printf("byte receiced\n"); |
||
| 107 | } else {printf("Error1\n"); break;} |
||
| 108 | } else {printf("Error2\n"); break;} |
||
| 109 | |||
| 110 | |||
| 111 | |||
| 112 | /* |
||
| 113 | if (WaitCommEvent(sc->hCom, &dwEvtMask, &o)) |
||
| 114 | { |
||
| 115 | if (dwEvtMask & EV_RXCHAR) |
||
| 116 | { |
||
| 117 | printf("RX\n"); |
||
| 118 | } |
||
| 119 | } |
||
| 120 | else |
||
| 121 | { |
||
| 122 | DWORD dwRet = GetLastError(); |
||
| 123 | if( ERROR_IO_PENDING == dwRet) |
||
| 124 | { |
||
| 125 | printf("I/O is pending...\n"); |
||
| 126 | |||
| 127 | // To do. |
||
| 128 | } |
||
| 129 | //else printf("Wait failed with error %d.\n", GetLastError()); |
||
| 130 | }*/ |
||
| 131 | //} |
||
| 132 | |||
| 133 | |||
| 134 | return; |
||
| 135 | /* |
||
| 136 | while(1) |
||
| 137 | { |
||
| 138 | |||
| 139 | // Wait for an event |
||
| 140 | lLastError = serial->WaitEvent(); |
||
| 141 | if (lLastError != ERROR_SUCCESS) |
||
| 142 | { |
||
| 143 | printf("Err! Unable to wait for a COM-port event.\n"); |
||
| 144 | break; |
||
| 145 | } |
||
| 146 | |||
| 147 | // Save event |
||
| 148 | const CSerial::EEvent eEvent = serial->GetEventType(); |
||
| 149 | |||
| 150 | |||
| 151 | // Handle data receive event |
||
| 152 | if (eEvent & CSerial::EEventRecv) |
||
| 153 | { |
||
| 154 | |||
| 155 | // Read data, until there is nothing left |
||
| 156 | DWORD dwBytesRead = 0; |
||
| 157 | unsigned char szBuffer[SERIAL_INPUT_BUFFER_SIZE]; |
||
| 158 | do |
||
| 159 | { |
||
| 160 | // Read data from the COM-port |
||
| 161 | lLastError = serial->Read(szBuffer,sizeof(szBuffer)-1,&dwBytesRead); |
||
| 162 | if (lLastError != ERROR_SUCCESS) |
||
| 163 | { |
||
| 164 | printf("Unable to read from COM-port."); |
||
| 165 | return; |
||
| 166 | } |
||
| 167 | |||
| 168 | if (dwBytesRead > 0) |
||
| 169 | { |
||
| 170 | |||
| 171 | |||
| 172 | |||
| 173 | // Spara i array, sist. |
||
| 174 | arrayCopy(szBuffer, 0, iBuff, iBuffPointer, dwBytesRead); |
||
| 175 | iBuffPointer += dwBytesRead; |
||
| 176 | |||
| 177 | // Följ parserutin. |
||
| 178 | // Köa. |
||
| 179 | // flytta. |
||
| 180 | |||
| 181 | // När array större eller lika med PACKET_LENGTH... |
||
| 182 | while (iBuffPointer >= PACKET_LENGTH) |
||
| 183 | { |
||
| 184 | int startIndex = 0; |
||
| 185 | |||
| 186 | // Sök igenom efter start byte från början. |
||
| 187 | for (unsigned int i = 0; i < iBuffPointer; i++) |
||
| 188 | { |
||
| 189 | // Poppa alla bytes som inte är startbyte. |
||
| 190 | if (iBuff[i] != UART_START_BYTE) startIndex++; |
||
| 191 | else |
||
| 192 | { |
||
| 193 | // När startbyte hittas, kolla om återstående längd är större eller lika med PACKET_LENGTH (inkl startbyte) |
||
| 194 | if ((iBuffPointer - startIndex) >= PACKET_LENGTH) |
||
| 195 | { |
||
| 196 | //om så, kolla PACKET_LENGTH-1 byte fram. |
||
| 197 | if (iBuff[startIndex + PACKET_LENGTH - 1] == UART_END_BYTE) |
||
| 198 | { |
||
| 199 | // Om byte PACKET_LENGTH-1 är slutbyte så extraktas startIndex till slutbyteindex. |
||
| 200 | CanProtoMessage cmp(iBuff,startIndex + 1); |
||
| 201 | queueEnqueue(cmp); |
||
| 202 | |||
| 203 | |||
| 204 | // Sätt ny startindex och avsluta loop. |
||
| 205 | startIndex += PACKET_LENGTH; |
||
| 206 | break; |
||
| 207 | } |
||
| 208 | } |
||
| 209 | } |
||
| 210 | } |
||
| 211 | // och i slutet göra en array copy. |
||
| 212 | // Flytta ner allt efter slutbyte till index 0 i array. |
||
| 213 | arrayCopy(iBuff, startIndex, iBuff, 0, iBuffPointer - PACKET_LENGTH); |
||
| 214 | iBuffPointer -= startIndex; |
||
| 215 | } |
||
| 216 | |||
| 217 | } |
||
| 218 | }while (dwBytesRead == sizeof(szBuffer)-1); |
||
| 219 | } |
||
| 220 | |||
| 221 | } |
||
| 222 | */ |
||
| 223 | return; |
||
| 224 | } |
||
| 225 | |||
| 226 | /* |
||
| 227 | void serialReaderStart(CSerial * ser) |
||
| 228 | { |
||
| 229 | serial = ser; |
||
| 230 | hRunMutex = CreateMutex( NULL, TRUE, NULL ); // Set |
||
| 231 | _beginthread( SerRead, 0, 0 ); |
||
| 232 | } |
||
| 233 | |||
| 234 | void serialReaderStartSerCon(SerialConnection * ser) |
||
| 235 | { |
||
| 236 | sc = ser; |
||
| 237 | hRunMutex = CreateMutex( NULL, TRUE, NULL ); // Set |
||
| 238 | _beginthread( SerRead, 0, 0 ); |
||
| 239 | } |
||
| 240 | |||
| 241 | void serialReaderStop( void ) |
||
| 242 | { |
||
| 243 | ReleaseMutex( hRunMutex ); |
||
| 244 | CloseHandle( hRunMutex ); |
||
| 245 | } |
||
| 246 | */ |
||
| 247 | |||
| 248 | |||
| 249 | |||
| 250 | //bool getMessage(CanProtoMessage *cpm) |
||
| 251 | //{ |
||
| 252 | // return queueDequeue(cpm); |
||
| 253 | //} |
||
| 254 | /* |
||
| 255 | void arrayCopy(unsigned char *src,unsigned int srcIndex,unsigned char *dst,unsigned int dstIndex,unsigned int length) |
||
| 256 | { |
||
| 257 | // Copy an aray to another array (of unsigned chars == bytes) |
||
| 258 | for(unsigned int i=0;i<length;i++) dst[dstIndex+i]=src[srcIndex+i]; |
||
| 259 | } |
||
| 260 | */ |
||
| 261 | /* |
||
| 262 | bool queueEnqueue(CanProtoMessage cpm) |
||
| 263 | { |
||
| 264 | // Enqueue reveiced message to queue |
||
| 265 | if (queueLength>=QUEUE_PLACES) return false; |
||
| 266 | |||
| 267 | cpmQueue[queueWritePointer]=cpm; |
||
| 268 | |||
| 269 | queueLength++; |
||
| 270 | queueWritePointer++; |
||
| 271 | if (queueWritePointer>=QUEUE_PLACES) queueWritePointer=0; |
||
| 272 | |||
| 273 | printf("[%ld] Queue message, length: %d\n",GetTickCount(),queueLength); |
||
| 274 | |||
| 275 | return true; |
||
| 276 | } |
||
| 277 | bool queueDequeue(CanProtoMessage *cpm) |
||
| 278 | { |
||
| 279 | // Dequeue can message. |
||
| 280 | if (queueLength==0) return false; |
||
| 281 | |||
| 282 | cpm = &cpmQueue[queueReadPointer]; |
||
| 283 | |||
| 284 | queueLength--; |
||
| 285 | queueReadPointer++; |
||
| 286 | if (queueReadPointer>=QUEUE_PLACES) queueReadPointer=0; |
||
| 287 | |||
| 288 | return true; |
||
| 289 | }*/ |