diff --git a/.gitattributes b/.gitattributes index 27db8e68a0e65d027312f899d614eb2c856a6b6d..b2dc3537ca998137aee816f951da0a09ff912228 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3626,7 +3626,6 @@ RTCP/InputProc/src/Generator.cc -text RTCP/InputProc/src/Generator.h -text RTCP/InputProc/src/OMPThread.h -text RTCP/InputProc/src/Poll.h -text -RTCP/InputProc/src/RSPBoard.h -text RTCP/InputProc/src/Ranges.h -text RTCP/InputProc/src/SampleBuffer.h -text RTCP/InputProc/src/SampleBufferReader.h -text diff --git a/RTCP/InputProc/src/RSPBoard.h b/RTCP/InputProc/src/RSPBoard.h deleted file mode 100644 index 5bdda7b5990b629f11922495fd7227a4aead9e9f..0000000000000000000000000000000000000000 --- a/RTCP/InputProc/src/RSPBoard.h +++ /dev/null @@ -1,196 +0,0 @@ -#ifndef __RSPBOARD__ -#define __RSPBOARD__ - -#include <Common/LofarLogger.h> -#include <Stream/Stream.h> -#include <Interface/RSPTimeStamp.h> -#include <IONProc/RSP.h> -#include <IONProc/WallClockTime.h> -#include "SampleBuffer.h" -#include "Ranges.h" -#include "BufferSettings.h" -#include "time.h" -#include <string> - -namespace LOFAR { -namespace RTCP { - -/* Receives input of one RSP board and stores it in shared memory. */ - -template<typename T> class RSPBoard { -public: - RSPBoard( Stream &inputStream, SampleBuffer<T> &buffer, unsigned boardNr, const struct BufferSettings &settings ); - - // RSP board number - const unsigned nr; - - bool readPacket(); - void writePacket(); - - void logStatistics(); - -private: - const std::string logPrefix; - - Stream &inputStream; - const bool supportPartialReads; - struct RSP packet; - TimeStamp last_timestamp; - time_t last_logtime; - - SampleBuffer<T> &buffer; - Ranges &flags; - const struct BufferSettings settings; - const size_t firstBeamlet; - - size_t nrReceived, nrBadSize, nrBadTime, nrBadData, nrBadMode, nrOutOfOrder; - -}; - -template<typename T> RSPBoard<T>::RSPBoard( Stream &inputStream, SampleBuffer<T> &buffer, unsigned boardNr, const struct BufferSettings &settings ) -: - nr(boardNr), - logPrefix(str(boost::format("[station %s %s board %u] [RSPBoard] ") % settings.station.stationName % settings.station.antennaSet % nr)), - inputStream(inputStream), - supportPartialReads(dynamic_cast<SocketStream *>(&inputStream) == 0 || dynamic_cast<SocketStream &>(inputStream).protocol != SocketStream::UDP), - last_logtime(0), - - buffer(buffer), - flags(buffer.flags[boardNr]), - settings(settings), - firstBeamlet(settings.nrBeamlets / settings.nrBoards * boardNr), - - nrReceived(0), - nrBadSize(0), - nrBadTime(0), - nrBadData(0), - nrBadMode(0), - nrOutOfOrder(0) -{ - ASSERTSTR(boardNr < settings.nrBoards, "Invalid board number: " << boardNr << ", nrBoards: " << settings.nrBoards); -} - -template<typename T> void RSPBoard<T>::writePacket() -{ - const uint8 &nrBeamlets = packet.header.nrBeamlets; - const uint8 &nrTimeslots = packet.header.nrBlocks; - - ASSERT( nrBeamlets <= settings.nrBeamlets / settings.nrBoards ); - - // the timestamp is of the last read packet by definition - const TimeStamp ×tamp = last_timestamp; - - const size_t from_offset = (int64)timestamp % settings.nrSamples; - size_t to_offset = ((int64)timestamp + nrTimeslots) % settings.nrSamples; - - if (to_offset == 0) - to_offset = settings.nrSamples; - - // mark data we overwrite as invalid - flags.excludeBefore(timestamp + nrTimeslots - settings.nrSamples); - - // transpose - const T *beamlets = reinterpret_cast<const T*>(&packet.data); - const size_t wrap = from_offset < to_offset ? 0 : settings.nrSamples - from_offset; - - for (uint8 b = 0; b < nrBeamlets; ++b) { - T *dst1 = &buffer.beamlets[firstBeamlet + b][from_offset]; - - if (wrap > 0) { - T *dst2 = &buffer.beamlets[firstBeamlet + b][0]; - - memcpy(dst1, beamlets, wrap * sizeof(T)); - memcpy(dst2, beamlets, to_offset * sizeof(T)); - } else { - memcpy(dst1, beamlets, nrTimeslots * sizeof(T)); - } - - beamlets += nrTimeslots; - } - - // mark as valid - flags.include(timestamp, timestamp + nrTimeslots); -} - -template<typename T> bool RSPBoard<T>::readPacket() -{ - bool valid = true; - - if (supportPartialReads) { - // read header first - inputStream.read(&packet, sizeof(struct RSP::Header)); - - // read rest of packet - inputStream.read(&packet.data, packet.packetSize() - sizeof(struct RSP::Header)); - - ++nrReceived; - } else { - // read full packet at once -- numbytes will tell us how much we've actually read - size_t numbytes = inputStream.tryRead(&packet, sizeof packet); - - ++nrReceived; - - if( numbytes < sizeof(struct RSP::Header) - || numbytes != packet.packetSize() ) { - LOG_WARN_STR( logPrefix << "Packet is " << numbytes << " bytes, but should be " << packet.packetSize() << " bytes" ); - - ++nrBadSize; - valid = false; - } - } - - // illegal timestamp means illegal packet - if (valid && packet.header.timestamp == ~0U) { - ++nrBadTime; - valid = false; - } - - if (valid) { - // check sanity of packet - - const TimeStamp timestamp(packet.header.timestamp, packet.header.blockSequenceNumber, settings.station.clock); - - // don't accept out-of-order data - if (last_timestamp > timestamp) { - ++nrOutOfOrder; - valid = false; - } - - // packet has legal timestamp - last_timestamp = timestamp; - - // discard packets with errors - if (packet.payloadError()) { - ++nrBadData; - valid = false; - } - - // check whether the station configuration matches ours - if (packet.clockMHz() * 1000000 != settings.station.clock - || packet.bitMode() != settings.station.bitmode) { - ++nrBadMode; - valid = false; - } - } - - return valid; -} - - -template<typename T> void RSPBoard<T>::logStatistics() -{ - LOG_INFO_STR( logPrefix << "Received " << nrReceived << " packets: " << nrOutOfOrder << " out of order, " << nrBadTime << " bad timestamps, " << nrBadSize << " bad sizes, " << nrBadData << " payload errors, " << nrBadMode << " mode errors" ); - - nrReceived = 0; - nrBadTime = 0; - nrBadSize = 0; - nrBadData = 0; - nrBadMode = 0; - nrOutOfOrder = 0; -} - - -} -} - -#endif