diff --git a/Appl/CEP/CS1/CS1_IONProc/src/InputThread.cc b/Appl/CEP/CS1/CS1_IONProc/src/InputThread.cc index 85ee0bab8f978d06aee941553ac206f64676f67b..77eac6d55d13be8fac6f8fd8755111a78597f19c 100644 --- a/Appl/CEP/CS1/CS1_IONProc/src/InputThread.cc +++ b/Appl/CEP/CS1/CS1_IONProc/src/InputThread.cc @@ -33,6 +33,7 @@ #include <Stream/SystemCallException.h> #include <BeamletBuffer.h> #include <InputThread.h> +#include <RSP.h> #include <errno.h> #include <signal.h> @@ -135,12 +136,12 @@ void InputThread::mainLoop() setAffinity(); TimeStamp actualstamp = itsArgs.startTime - itsArgs.nrTimesPerPacket; - unsigned packetSize = 16 + itsArgs.nrSubbandsPerPacket * itsArgs.nrTimesPerPacket * sizeof(Beamlet); + unsigned packetSize = sizeof(struct RSP::header) + itsArgs.nrSubbandsPerPacket * itsArgs.nrTimesPerPacket * sizeof(Beamlet); unsigned previousSeqid = 0; bool previousSeqidIsAccepted = false; - char packet[8192] __attribute__ ((aligned(16))); // Max RSP packet size + RSP packet __attribute__ ((aligned(16))); // Max RSP packet size bool dataShouldContainValidStamp = dynamic_cast<NullStream *>(itsArgs.stream) == 0; @@ -153,7 +154,7 @@ void InputThread::mainLoop() // interruptible read, to allow stopping this thread even if the station // does not send data - itsArgs.stream->read(packet, packetSize); + itsArgs.stream->read(&packet, packetSize); } catch (SystemCallException &ex) { if (ex.error == EINTR) break; @@ -163,10 +164,9 @@ void InputThread::mainLoop() ++ itsArgs.packetCounters->nrPacketsReceived; - // get the actual timestamp of first EPApacket in frame if (dataShouldContainValidStamp) { - unsigned seqid = * reinterpret_cast<unsigned *>(packet + 8); - unsigned blockid = * reinterpret_cast<unsigned *>(packet + 12); + unsigned seqid = packet.header.timestamp; + unsigned blockid = packet.header.blockSequenceNumber; #if defined WORDS_BIGENDIAN seqid = byteSwap(seqid); @@ -203,7 +203,7 @@ void InputThread::mainLoop() } // expected packet received so write data into corresponding buffer - itsArgs.BBuffer->writePacketData(reinterpret_cast<Beamlet *>(packet + 16), actualstamp); + itsArgs.BBuffer->writePacketData(reinterpret_cast<Beamlet *>(&packet.data), actualstamp); } std::clog << "InputThread::mainLoop() exiting loop" << std::endl; diff --git a/Appl/CEP/CS1/CS1_IONProc/src/RSP.h b/Appl/CEP/CS1/CS1_IONProc/src/RSP.h new file mode 100644 index 0000000000000000000000000000000000000000..dde4491ca69a35cd3d10bdb5b0dbade5650b51a7 --- /dev/null +++ b/Appl/CEP/CS1/CS1_IONProc/src/RSP.h @@ -0,0 +1,52 @@ +//# RSP: RSP data format +//# +//# Copyright (C) 2008 +//# ASTRON (Netherlands Foundation for Research in Astronomy) +//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl +//# +//# This program is free software; you can redistribute it and/or modify +//# it under the terms of the GNU General Public License as published by +//# the Free Software Foundation; either version 2 of the License, or +//# (at your option) any later version. +//# +//# This program is distributed in the hope that it will be useful, +//# but WITHOUT ANY WARRANTY; without even the implied warranty of +//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +//# GNU General Public License for more details. +//# +//# You should have received a copy of the GNU General Public License +//# along with this program; if not, write to the Free Software +//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//# +//# $Id$ + +#ifndef LOFAR_CS1_ION_PROC_RSP_H +#define LOFAR_CS1_ION_PROC_RSP_H + + +namespace LOFAR { +namespace CS1 { + +#include <cstddef> + + +// All data is in Little Endian format! + +struct RSP { + struct header { + uint16_t version; + uint16_t configuration; + uint16_t station; + uint8_t nrBeamlets; + uint8_t nrBlocks; + uint32_t timestamp; + uint32_t blockSequenceNumber; + } header; + + char data[8130]; +}; + +} // namespace CS1 +} // namespace LOFAR + +#endif