void TcpSocketRxComponent::writeOutput() { std::size_t size; try { if(!connected_) { //Listen for connection if necessary acceptor_->accept(*socket_); connected_ = true; } //Get data from socket //size = socket_->receive(boost::asio::buffer(d_buffer, x_bufferSize)); size = boost::asio::read(*socket_, boost::asio::buffer(buffer_, bufferSize_x)); } catch(boost::system::system_error &e) { LOG(LERROR) << "Error listening on socket: " << e.what(); boost::this_thread::sleep(boost::posix_time::milliseconds(5000)); return; } //Check that we've an integer number of data types in the datagram float f = size/(float)sizeof(T); float intpart, rem; rem = modf(f, &intpart); if(rem != 0) { LOG(LERROR) << "Did not receive an integer number of elements. Input size = " << size; } int numT = (int)intpart; //Get the output buffer WriteBuffer< T >* outBuf = castToType<T>(outputBuffers[0]); DataSet<T>* writeDataSet = NULL; outBuf->getWriteData(writeDataSet, numT); //Copy data into output T* bufT = (T*)buffer_; copy(bufT, bufT+numT, writeDataSet->data.begin()); //Release the buffer outBuf->releaseWriteData(writeDataSet); }
void UdpSocketRxComponent::writeOutput() { if(!bStopping_) { //Get data from socket std::size_t size; try { udp::endpoint sender_endpoint; size = socket_->receive_from(boost::asio::buffer(buffer_, bufferSize_x), sender_endpoint); } catch(boost::system::system_error &e) { if(!bStopping_) { LOG(LERROR) << "Error receiving from socket: " << e.what(); } return; } //Check that we've an integer number of data types in the datagram float f = size/(float)sizeof(T); float intpart, rem; rem = modf(f, &intpart); if(rem != 0) { LOG(LERROR) << "Did not receive an integer number of elements - data will be lost"; } int numT = (int)intpart; //Get the output buffer WriteBuffer< T >* outBuf = castToType<T>(outputBuffers[0]); DataSet<T>* writeDataSet = NULL; outBuf->getWriteData(writeDataSet, numT); //Copy data into output T* bufT = (T*)buffer_; copy(bufT, bufT+numT, writeDataSet->data.begin()); //Release the buffer outBuf->releaseWriteData(writeDataSet); } }
void FileRawReaderComponent::readBlock() { //Get the output buffer & work directly on it WriteBuffer< T >* outBuf = castToType<T>(outputBuffers[0]); DataSet<T>* writeDataSet = NULL; outBuf->getWriteData(writeDataSet, blockSize_x); char *bytebuf = reinterpret_cast<char*>(&writeDataSet->data[0]); ifstream::pos_type toread = blockSize_x * sizeof(T); //Read a block (loop if necessary) while( toread > 0 ) { hInFile_.read(bytebuf, toread); toread -= hInFile_.gcount(); bytebuf += hInFile_.gcount(); if( hInFile_.eof() ) { hInFile_.clear(); hInFile_.seekg(0, ios::beg); } } if (sizeof(T) > 1) { //Convert endianess if (endian_x == "native") ; // nothing to do else if (endian_x == "little") transform(writeDataSet->data.begin(), writeDataSet->data.end(), writeDataSet->data.begin(), lit2sys<T> ); else if (endian_x == "big") transform(writeDataSet->data.begin(), writeDataSet->data.end(), writeDataSet->data.begin(), big2sys<T> ); } outBuf->releaseWriteData(writeDataSet); }