diff --git a/MAC/APL/PAC/BeamServer/src/BeamServer.cc b/MAC/APL/PAC/BeamServer/src/BeamServer.cc index aad6982a45bf66f0669429294e4bd082fbc961e0..aa0b6159f4ea01e2c956cb0f1f67584635851050 100644 --- a/MAC/APL/PAC/BeamServer/src/BeamServer.cc +++ b/MAC/APL/PAC/BeamServer/src/BeamServer.cc @@ -930,7 +930,7 @@ void BeamServer::send_HBAdelays(Timestamp time) // We must loop over all beams, unfortunately we don't have such a list // because only the beam-factory has access to all beams. So we must // implement the sending of the HBA delays in the beamfactory! - LOG_INFO_STR("sending hba delays for interval " << time << " : " << time + (long)(itsComputeInterval-1)); +// LOG_INFO_STR("sending hba delays for interval " << time << " : " << time + (long)(itsComputeInterval-1)); m_beams.sendHBAdelays(time, m_rspdriver); } @@ -956,7 +956,6 @@ void BeamServer::compute_weights(Timestamp time) // void BeamServer::send_weights(Timestamp time) { - // LOG_DEBUG_STR("weights_uint16=" << m_weights16); if (!itsSetWeightsEnabled) { return; } @@ -975,6 +974,14 @@ void BeamServer::send_weights(Timestamp time) sw.weights() = m_weights16; LOG_INFO_STR("sending weights for interval " << time << " : " << time + (long)(itsComputeInterval-1)); + +// for debugging purposes print 40 subbans of 10 antennas for 1 timestamp. +// blitz::Array<std::complex<int16>, 2> sample; +// sample.resize (10, 40); // first 10 antennas and first 40 subbands +// sample = complex<int16_t>(0,0); +// sample = m_weights16(0, Range(64,74), Range(0,40)); +// LOG_DEBUG_STR("weights sample=" << sample); + m_rspdriver.send(sw); } diff --git a/MAC/APL/PAC/BeamServer/src/Beams.cc b/MAC/APL/PAC/BeamServer/src/Beams.cc index ba10d8373d22b0ce39f46c035aab131c02ee6e79..233982508337c82db8eb4f2fbbdae98205cc5d71 100644 --- a/MAC/APL/PAC/BeamServer/src/Beams.cc +++ b/MAC/APL/PAC/BeamServer/src/Beams.cc @@ -245,7 +245,7 @@ void Beams::sendHBAdelays(RTC::Timestamp time, request.settings().resize(request.rcumask.count(), MEPHeader::N_HBA_DELAYS); request.settings() = bi->first->getHBAdelays(); - LOG_INFO_STR("sending delays for beam " << bi->first->getName()); + LOG_INFO_STR("sending HBAdelays for beam " << bi->first->getName()); port.send(request); } } diff --git a/MAC/APL/PIC/RSPDriver/src/BWWrite.cc b/MAC/APL/PIC/RSPDriver/src/BWWrite.cc index 57d3b8e3a6fb8b32e435f8e3a69e827c74dcbb98..f2a673a94abf548a4d69e17d6d46fd3023282ed0 100644 --- a/MAC/APL/PIC/RSPDriver/src/BWWrite.cc +++ b/MAC/APL/PIC/RSPDriver/src/BWWrite.cc @@ -22,6 +22,7 @@ #include <lofar_config.h> #include <Common/LofarLogger.h> +#include <Common/hexdump.h> #include <APL/RSP_Protocol/EPA_Protocol.ph> #include <APL/RSP_Protocol/RSP_Protocol.ph> @@ -56,176 +57,173 @@ BWWrite::~BWWrite() void BWWrite::sendrequest() { - uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + m_blp; - - // no conditional, update every second - - // reset m_offset and m_remaining for each register - if (0 == getCurrentIndex()) { - m_offset = MEPHeader::N_LOCAL_XLETS * MEPHeader::WEIGHT_SIZE; - m_remaining = MEPHeader::BF_XROUT_SIZE - m_offset; // representative for XR, XI, YR, YI size - } - - if (m_regid < MEPHeader::BF_XROUT || m_regid > MEPHeader::BF_YIOUT) - { - LOG_FATAL("invalid regid"); - exit(EXIT_FAILURE); - } - - LOG_DEBUG(formatString(">>>> BWWrite(%s) global_blp=%d, blp=%d, regid=%d, m_offset=%d, m_remaining=%d", - getBoardPort().getName().c_str(), - global_blp, m_blp, m_regid, m_offset, m_remaining)); - - // send next BF configure message - EPABfCoefsWriteEvent bfcoefs; - - size_t size = (MEPHeader::N_BEAMLETS * MEPHeader::WEIGHT_SIZE) / MEPHeader::BF_N_FRAGMENTS; - LOG_DEBUG_STR("size=" << size); - - // this code is only guaranteed to work under the following conditions - ASSERT(size < MEPHeader::FRAGMENT_SIZE); - - switch (m_regid) - { - case MEPHeader::BF_XROUT: - bfcoefs.hdr.set(MEPHeader::BF_XROUT_HDR, 1 << m_blp, - MEPHeader::WRITE, size, m_offset); - break; - case MEPHeader::BF_XIOUT: - bfcoefs.hdr.set(MEPHeader::BF_XIOUT_HDR, 1 << m_blp, - MEPHeader::WRITE, size, m_offset); - break; - case MEPHeader::BF_YROUT: - bfcoefs.hdr.set(MEPHeader::BF_YROUT_HDR, 1 << m_blp, - MEPHeader::WRITE, size, m_offset); - break; - case MEPHeader::BF_YIOUT: - bfcoefs.hdr.set(MEPHeader::BF_YIOUT_HDR, 1 << m_blp, - MEPHeader::WRITE, size, m_offset); - break; - } - - // create blitz view om the weights in the bfcoefs message to be sent to the RSP hardware - int nbeamlets_per_fragment = MEPHeader::N_BEAMLETS / MEPHeader::BF_N_FRAGMENTS; - Array<complex<int16>, 2> weights(nbeamlets_per_fragment, MEPHeader::N_POL); - bfcoefs.coef.setBuffer(weights.data(), weights.size() * sizeof(complex<uint16>)); + uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + m_blp; + + // no conditional, update every second + + // reset m_offset and m_remaining for each register + if (0 == getCurrentIndex()) { + m_offset = MEPHeader::N_LOCAL_XLETS * MEPHeader::WEIGHT_SIZE; + m_remaining = MEPHeader::BF_XROUT_SIZE - m_offset; // representative for XR, XI, YR, YI size + } + + if (m_regid < MEPHeader::BF_XROUT || m_regid > MEPHeader::BF_YIOUT) { + LOG_FATAL("invalid regid"); + exit(EXIT_FAILURE); + } + + LOG_DEBUG(formatString(">>>> BWWrite(%s) global_blp=%d, blp=%d, regid=%d, m_offset=%d, m_remaining=%d", + getBoardPort().getName().c_str(), global_blp, m_blp, m_regid, m_offset, m_remaining)); + + // send next BF configure message + EPABfCoefsWriteEvent bfcoefs; + + size_t size = (MEPHeader::N_BEAMLETS * MEPHeader::WEIGHT_SIZE) / MEPHeader::BF_N_FRAGMENTS; + LOG_DEBUG_STR("size=" << size); + + // this code is only guaranteed to work under the following conditions + ASSERT(size < MEPHeader::FRAGMENT_SIZE); + + switch (m_regid) { + case MEPHeader::BF_XROUT: + bfcoefs.hdr.set(MEPHeader::BF_XROUT_HDR, 1 << m_blp, MEPHeader::WRITE, size, m_offset); + break; + case MEPHeader::BF_XIOUT: + bfcoefs.hdr.set(MEPHeader::BF_XIOUT_HDR, 1 << m_blp, MEPHeader::WRITE, size, m_offset); + break; + case MEPHeader::BF_YROUT: + bfcoefs.hdr.set(MEPHeader::BF_YROUT_HDR, 1 << m_blp, MEPHeader::WRITE, size, m_offset); + break; + case MEPHeader::BF_YIOUT: + bfcoefs.hdr.set(MEPHeader::BF_YIOUT_HDR, 1 << m_blp, MEPHeader::WRITE, size, m_offset); + break; + } + + // create blitz view om the weights in the bfcoefs message to be sent to the RSP hardware + int nbeamlets_per_fragment = MEPHeader::N_BEAMLETS / MEPHeader::BF_N_FRAGMENTS; + Array<complex<int16>, 2> weights(nbeamlets_per_fragment, MEPHeader::N_POL); + bfcoefs.coef.setBuffer(weights.data(), weights.size() * sizeof(complex<uint16>)); #if 0 - Array<int, 2> index(MEPHeader::N_BEAMLETS, MEPHeader::N_POL); - Array<int, 2> mapped_index(nbeamlets_per_fragment, MEPHeader::N_POL); - - for (int beamlet = 0; beamlet < MEPHeader::N_BEAMLETS; beamlet++) { - for (int pol = 0; pol < MEPHeader::N_POL; pol++) { - index(beamlet, pol) = beamlet * MEPHeader::N_POL + pol; - } - } - mapped_index = 0; + Array<int, 2> index(MEPHeader::N_BEAMLETS, MEPHeader::N_POL); + Array<int, 2> mapped_index(nbeamlets_per_fragment, MEPHeader::N_POL); + + for (int beamlet = 0; beamlet < MEPHeader::N_BEAMLETS; beamlet++) { + for (int pol = 0; pol < MEPHeader::N_POL; pol++) { + index(beamlet, pol) = beamlet * MEPHeader::N_POL + pol; + } + } + mapped_index = 0; #endif - LOG_DEBUG_STR("weights shape=" << weights.shape()); + LOG_DEBUG_STR("weights shape=" << weights.shape()); + + ASSERT(MEPHeader::N_BEAMLETS % MEPHeader::BF_N_FRAGMENTS == 0); + for (int lane = 0; lane < MEPHeader::N_SERDES_LANES; lane++) { - ASSERT(MEPHeader::N_BEAMLETS % MEPHeader::BF_N_FRAGMENTS == 0); - for (int lane = 0; lane < MEPHeader::N_SERDES_LANES; lane++) { + int hw_offset = lane; + int cache_offset = lane * (MEPHeader::N_BEAMLETS / MEPHeader::N_SERDES_LANES) + (getCurrentIndex() * nbeamlets_per_fragment / MEPHeader::N_SERDES_LANES); - int hw_offset = lane; - int cache_offset = lane * (MEPHeader::N_BEAMLETS / MEPHeader::N_SERDES_LANES) + (getCurrentIndex() * nbeamlets_per_fragment / MEPHeader::N_SERDES_LANES); + Range hw_range(hw_offset, hw_offset + nbeamlets_per_fragment - MEPHeader::N_BLPS, MEPHeader::N_BLPS); + Range cache_range(cache_offset, cache_offset + (nbeamlets_per_fragment / MEPHeader::N_SERDES_LANES) - 1, 1); - Range hw_range(hw_offset, hw_offset + nbeamlets_per_fragment - MEPHeader::N_BLPS, MEPHeader::N_BLPS); - Range cache_range(cache_offset, cache_offset + (nbeamlets_per_fragment / MEPHeader::N_SERDES_LANES) - 1, 1); - - LOG_DEBUG_STR("lane=" << lane); - LOG_DEBUG_STR("hw_range=" << hw_range); - LOG_DEBUG_STR("cache_range=" << cache_range); + LOG_DEBUG_STR("lane=" << lane); + LOG_DEBUG_STR("hw_range=" << hw_range); + LOG_DEBUG_STR("cache_range=" << cache_range); - // X - weights(hw_range, 0) = Cache::getInstance().getBack().getBeamletWeights()()(0, global_blp * 2, cache_range); + // X + weights(hw_range, 0) = Cache::getInstance().getBack().getBeamletWeights()()(0, global_blp * 2, cache_range); - // Y - weights(hw_range, 1) = Cache::getInstance().getBack().getBeamletWeights()()(0, global_blp * 2 + 1, cache_range); + // Y + weights(hw_range, 1) = Cache::getInstance().getBack().getBeamletWeights()()(0, global_blp * 2 + 1, cache_range); #if 0 - mapped_index(hw_range, 0) = index(cache_range, 0); - mapped_index(hw_range, 1) = index(cache_range, 1); + mapped_index(hw_range, 0) = index(cache_range, 0); + mapped_index(hw_range, 1) = index(cache_range, 1); #endif - } + } #if 0 - LOG_DEBUG_STR("mapped_index=" << mapped_index); + LOG_DEBUG_STR("mapped_index=" << mapped_index); #endif - // update m_remaining and m_offset for next write - m_remaining -= size; - m_offset += size; - - // - // conjugate weights to get the correct matrix - - // weight a_r + i . a_i - // - // (a_r + i . a_i) . (x_r + i . x_i) = ( a_r . x_r - a_i . x_i ) + i ( a_i . x_r + a_r . x_i ) - // - // This is equal to: - // - // ( x_out_r ) ( a_r -a_i ) ( x_in_r ) - // ( ) = ( ) * ( ) - // ( x_out_i ) ( a_i a_r ) ( x_in_i ) - // - // and the same for y - // - // To send to correct weights to the beamformer we must therefore - // take the conjugate of the weight (a_r, a_i) to produce (a_r, -a_i) - // for the x_our_r component and take the conjugate AND multiply by i - // the weight (a_r, a_i) to produce (a_i, a_r). - // - weights = conj(weights); - - switch (m_regid) - { - case MEPHeader::BF_XROUT: - { - // weights for x-real part - // no added conversions needed - - // y weights should be 0 - weights(Range::all(), 1) = 0; - } - break; - - case MEPHeader::BF_XIOUT: - { - // multiply by i to get correct weights - // weights for x-imaginary part - weights *= complex<int16>(0,1); + // update m_remaining and m_offset for next write + m_remaining -= size; + m_offset += size; + + // + // conjugate weights to get the correct matrix + + // weight a_r + i . a_i + // + // (a_r + i . a_i) . (x_r + i . x_i) = ( a_r . x_r - a_i . x_i ) + i ( a_i . x_r + a_r . x_i ) + // + // This is equal to: + // + // ( x_out_r ) ( a_r -a_i ) ( x_in_r ) + // ( ) = ( ) * ( ) + // ( x_out_i ) ( a_i a_r ) ( x_in_i ) + // + // and the same for y + // + // To send to correct weights to the beamformer we must therefore + // take the conjugate of the weight (a_r, a_i) to produce (a_r, -a_i) + // for the x_our_r component and take the conjugate AND multiply by i + // the weight (a_r, a_i) to produce (a_i, a_r). + // + weights = conj(weights); + + switch (m_regid) { + case MEPHeader::BF_XROUT: { + // weights for x-real part + // no added conversions needed + + // y weights should be 0 + weights(Range::all(), 1) = 0; + } + break; + + case MEPHeader::BF_XIOUT: { + // multiply by i to get correct weights + // weights for x-imaginary part + weights *= complex<int16>(0,1); + + // y weights should be 0 + weights(Range::all(), 1) = 0; + } + break; + + case MEPHeader::BF_YROUT: { + // weights for y-real part + // no added conversions needed + + // x weights should be 0 + weights(Range::all(), 0) = 0; + } + break; + + case MEPHeader::BF_YIOUT: { + // multiply by i to get correct weights + // weights for y-imaginary part + weights *= complex<int16>(0,1); + + // x weights should be 0 + weights(Range::all(), 0) = 0; + } + break; + }// switch - // y weights should be 0 - weights(Range::all(), 1) = 0; - } - break; - - case MEPHeader::BF_YROUT: - { - // weights for y-real part - // no added conversions needed - - // x weights should be 0 - weights(Range::all(), 0) = 0; - } - break; - - case MEPHeader::BF_YIOUT: - { - // multiply by i to get correct weights - // weights for y-imaginary part - weights *= complex<int16>(0,1); - - // x weights should be 0 - weights(Range::all(), 0) = 0; - } - break; - } +#if 0 + // Debugging the waits send to one BLP by hexdumping the data before setting it on ethernet. + if (global_blp == 32 && m_offset < 1000) { + string hd; + hexdump (hd, weights.data(), weights.size() * sizeof(complex<uint16>)); + LOG_INFO_STR("global_blp=32, regid="<< m_regid << ",data=" << hd << endl); + } +#endif - m_hdr = bfcoefs.hdr; - getBoardPort().send(bfcoefs); + m_hdr = bfcoefs.hdr; + getBoardPort().send(bfcoefs); } void BWWrite::sendrequest_status() @@ -235,8 +233,7 @@ void BWWrite::sendrequest_status() GCFEvent::TResult BWWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/) { - if (EPA_WRITEACK != event.signal) - { + if (EPA_WRITEACK != event.signal) { LOG_WARN("BWWrite::handleack: unexpected ack"); return GCFEvent::NOT_HANDLED; } @@ -245,8 +242,7 @@ GCFEvent::TResult BWWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/ uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + m_blp; - if (!ack.hdr.isValidAck(m_hdr)) - { + if (!ack.hdr.isValidAck(m_hdr)) { Cache::getInstance().getState().bf().write_error(global_blp * MEPHeader::N_PHASEPOL + m_regid); LOG_ERROR("BWWrite::handleack: invalid ack"); diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc index 5d1395ff4d51496f45ec37d67b6de63cb92dc2ae..6506b5dde3d383e1c47504e9324f09b7ffe38bf8 100644 --- a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc +++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc @@ -3292,7 +3292,7 @@ void TBBCtl::mainloop() //----------------------------------------------------------------------------- int main(int argc, char** argv) { - GCFTask::init(argc, argv); + GCFTask::init(argc, argv, "tbbctl"); LOG_DEBUG(formatString("Program %s has started", argv[0]));