Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed
#include "SerialReader.h"#include <assert.h>//void arrayCopy(unsigned char *src,unsigned int srcIndex,unsigned char *dst,unsigned int dstIndex,unsigned int length);//bool queueEnqueue(CanProtoMessage cpm);//bool queueDequeue(CanProtoMessage *cpm);/*CanProtoMessage cpmQueue[QUEUE_PLACES];int queueReadPointer=0;int queueWritePointer=0;int queueLength=0;static CSerial * serial;static SerialConnection * sc;static HANDLE hRunMutex; // "Keep Running" mutex*/void SerRead(void *pMyID){unsigned char iBuff[SERIAL_READ_BUFFER_SIZE];unsigned int iBuffPointer = 0;long lLastError = 0;/*// Register only for the receive eventlLastError = serial->SetMask(CSerial::EEventRecv);if (lLastError != ERROR_SUCCESS){printf("Err! Unable to set COM-port event mask.\n");return;}// Use 'non-blocking' reads, because we don't know how many bytes// will be received. This is normally the most convenient mode// (and also the default mode for reading data).lLastError = serial->SetupReadTimeouts(CSerial::EReadTimeoutNonblocking);if (lLastError != ERROR_SUCCESS){printf("Err! Unable to set COM-port read timeout.\n");return;}*//*if (SetCommMask(sc->hCom,EV_RXCHAR)){// Handle the error.printf("SetCommMask failed with error %d.\n", GetLastError());return;}// Create an event object for use by WaitCommEvent.OVERLAPPED o;DWORD dwEvtMask;o.hEvent = CreateEvent(NULL, // default security attributesTRUE, // manual-reset eventFALSE, // not signaledNULL // no name);// Intialize the rest of the OVERLAPPED structure to zero.o.Internal = 0;o.InternalHigh = 0;o.Offset = 0;o.OffsetHigh = 0;*/DWORD dwCommEvent;DWORD dwRead;char chRead;/*if (sc->getHandle() ==0){printf("Serial port closed.");return;}*//*if (!SetCommMask(sc->getHandle(), EV_RXCHAR)){// Handle the error.printf("SetCommMask failed with error %d.\n", GetLastError());return;}while ( WaitForSingleObject( hRunMutex, 75L ) == WAIT_TIMEOUT ){if (WaitCommEvent(sc->getHandle(), &dwCommEvent, NULL)){if (ReadFile(sc->getHandle(), &chRead, 1, &dwRead, NULL)){printf("byte receiced\n");} else {printf("Error1\n"); break;}} else {printf("Error2\n"); break;}/*if (WaitCommEvent(sc->hCom, &dwEvtMask, &o)){if (dwEvtMask & EV_RXCHAR){printf("RX\n");}}else{DWORD dwRet = GetLastError();if( ERROR_IO_PENDING == dwRet){printf("I/O is pending...\n");// To do.}//else printf("Wait failed with error %d.\n", GetLastError());}*///}return;/*while(1){// Wait for an eventlLastError = serial->WaitEvent();if (lLastError != ERROR_SUCCESS){printf("Err! Unable to wait for a COM-port event.\n");break;}// Save eventconst CSerial::EEvent eEvent = serial->GetEventType();// Handle data receive eventif (eEvent & CSerial::EEventRecv){// Read data, until there is nothing leftDWORD dwBytesRead = 0;unsigned char szBuffer[SERIAL_INPUT_BUFFER_SIZE];do{// Read data from the COM-portlLastError = serial->Read(szBuffer,sizeof(szBuffer)-1,&dwBytesRead);if (lLastError != ERROR_SUCCESS){printf("Unable to read from COM-port.");return;}if (dwBytesRead > 0){// Spara i array, sist.arrayCopy(szBuffer, 0, iBuff, iBuffPointer, dwBytesRead);iBuffPointer += dwBytesRead;// Följ parserutin.// Köa.// flytta.// När array större eller lika med PACKET_LENGTH...while (iBuffPointer >= PACKET_LENGTH){int startIndex = 0;// Sök igenom efter start byte från början.for (unsigned int i = 0; i < iBuffPointer; i++){// Poppa alla bytes som inte är startbyte.if (iBuff[i] != UART_START_BYTE) startIndex++;else{// När startbyte hittas, kolla om återstående längd är större eller lika med PACKET_LENGTH (inkl startbyte)if ((iBuffPointer - startIndex) >= PACKET_LENGTH){//om så, kolla PACKET_LENGTH-1 byte fram.if (iBuff[startIndex + PACKET_LENGTH - 1] == UART_END_BYTE){// Om byte PACKET_LENGTH-1 är slutbyte så extraktas startIndex till slutbyteindex.CanProtoMessage cmp(iBuff,startIndex + 1);queueEnqueue(cmp);// Sätt ny startindex och avsluta loop.startIndex += PACKET_LENGTH;break;}}}}// och i slutet göra en array copy.// Flytta ner allt efter slutbyte till index 0 i array.arrayCopy(iBuff, startIndex, iBuff, 0, iBuffPointer - PACKET_LENGTH);iBuffPointer -= startIndex;}}}while (dwBytesRead == sizeof(szBuffer)-1);}}*/return;}/*void serialReaderStart(CSerial * ser){serial = ser;hRunMutex = CreateMutex( NULL, TRUE, NULL ); // Set_beginthread( SerRead, 0, 0 );}void serialReaderStartSerCon(SerialConnection * ser){sc = ser;hRunMutex = CreateMutex( NULL, TRUE, NULL ); // Set_beginthread( SerRead, 0, 0 );}void serialReaderStop( void ){ReleaseMutex( hRunMutex );CloseHandle( hRunMutex );}*///bool getMessage(CanProtoMessage *cpm)//{// return queueDequeue(cpm);//}/*void arrayCopy(unsigned char *src,unsigned int srcIndex,unsigned char *dst,unsigned int dstIndex,unsigned int length){// Copy an aray to another array (of unsigned chars == bytes)for(unsigned int i=0;i<length;i++) dst[dstIndex+i]=src[srcIndex+i];}*//*bool queueEnqueue(CanProtoMessage cpm){// Enqueue reveiced message to queueif (queueLength>=QUEUE_PLACES) return false;cpmQueue[queueWritePointer]=cpm;queueLength++;queueWritePointer++;if (queueWritePointer>=QUEUE_PLACES) queueWritePointer=0;printf("[%ld] Queue message, length: %d\n",GetTickCount(),queueLength);return true;}bool queueDequeue(CanProtoMessage *cpm){// Dequeue can message.if (queueLength==0) return false;cpm = &cpmQueue[queueReadPointer];queueLength--;queueReadPointer++;if (queueReadPointer>=QUEUE_PLACES) queueReadPointer=0;return true;}*/