diff --git a/lib/queue/GwBuffer.cpp b/lib/queue/GwBuffer.cpp index de0f070..66a8d75 100644 --- a/lib/queue/GwBuffer.cpp +++ b/lib/queue/GwBuffer.cpp @@ -33,16 +33,6 @@ size_t GwBuffer::freeSpace() } return readPointer - writePointer - 1; } -size_t GwBuffer::continousSpace() const{ - if (readPointer <= writePointer){ - return bufferSize-offset(writePointer); - } - return readPointer-writePointer-1; -} -void GwBuffer::moveWp(size_t offset){ - if (offset > continousSpace()) return; - writePointer+=offset; -} size_t GwBuffer::usedSpace() { if (readPointer <= writePointer) diff --git a/lib/queue/GwBuffer.h b/lib/queue/GwBuffer.h index aa67e04..145984f 100644 --- a/lib/queue/GwBuffer.h +++ b/lib/queue/GwBuffer.h @@ -18,9 +18,9 @@ class GwMessageFetcher{ * buffer to safely inserte data if it fits * and to write out data if possible */ -typedef size_t (*GwBufferHandleFunction)(uint8_t *buffer, size_t len, void *param); class GwBuffer{ public: + using GwBufferHandleFunction=std::function; static const size_t TX_BUFFER_SIZE=1620; // app. 20 NMEA messages static const size_t RX_BUFFER_SIZE=600; // enough for 1 NMEA message or actisense message or seasmart message typedef enum { @@ -54,9 +54,6 @@ class GwBuffer{ * find the first occurance of x in the buffer, -1 if not found */ int findChar(char x); - uint8_t *getWp(){return writePointer;} - size_t continousSpace() const; //free space from wp - void moveWp(size_t offset); //move the wp forward }; #endif \ No newline at end of file diff --git a/lib/socketserver/GwUdpReader.cpp b/lib/socketserver/GwUdpReader.cpp index b88848c..612eb10 100644 --- a/lib/socketserver/GwUdpReader.cpp +++ b/lib/socketserver/GwUdpReader.cpp @@ -142,15 +142,18 @@ void GwUdpReader::readMessages(GwMessageFetcher *writer) if (fd < 0) return; //we expect one NMEA message in one UDP packet buffer->reset(); - struct sockaddr_in from; - socklen_t fromLen=sizeof(from); - ssize_t res=recvfrom(fd,buffer->getWp(),buffer->continousSpace(),MSG_DONTWAIT, + size_t rd=buffer->fillData(buffer->freeSpace(), + [this](uint8_t *rcvb,size_t rcvlen,void *param)->size_t{ + struct sockaddr_in from; + socklen_t fromLen=sizeof(from); + ssize_t res=recvfrom(fd,rcvb,rcvlen,MSG_DONTWAIT, (struct sockaddr*)&from,&fromLen); - if (res <= 0) return; - if (GwSocketHelper::equals(from.sin_addr,apAddr)) return; - if (!currentStationIp.isEmpty() && (GwSocketHelper::equals(from.sin_addr,staAddr))) return; - buffer->moveWp(res); - LOG_DEBUG(GwLog::DEBUG,"UDPR: received %d bytes",res); + if (res <= 0) return 0; + if (GwSocketHelper::equals(from.sin_addr,apAddr)) return 0; + if (!currentStationIp.isEmpty() && (GwSocketHelper::equals(from.sin_addr,staAddr))) return 0; + return res; + },this); + if (buffer->usedSpace() > 0)(GwLog::DEBUG,"UDPR: received %d bytes",buffer->usedSpace()); writer->handleBuffer(buffer); } size_t GwUdpReader::sendToClients(const char *buf, int source,bool partial)