Skip to content
Snippets Groups Projects
Commit 3098d429 authored by Ruud Overeem's avatar Ruud Overeem
Browse files

Bug 1284: HBA beams track right now.

parent c152e9d6
No related branches found
No related tags found
No related merge requests found
...@@ -930,7 +930,7 @@ void BeamServer::send_HBAdelays(Timestamp time) ...@@ -930,7 +930,7 @@ void BeamServer::send_HBAdelays(Timestamp time)
// We must loop over all beams, unfortunately we don't have such a list // 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 // because only the beam-factory has access to all beams. So we must
// implement the sending of the HBA delays in the beamfactory! // 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); m_beams.sendHBAdelays(time, m_rspdriver);
} }
...@@ -956,7 +956,6 @@ void BeamServer::compute_weights(Timestamp time) ...@@ -956,7 +956,6 @@ void BeamServer::compute_weights(Timestamp time)
// //
void BeamServer::send_weights(Timestamp time) void BeamServer::send_weights(Timestamp time)
{ {
// LOG_DEBUG_STR("weights_uint16=" << m_weights16);
if (!itsSetWeightsEnabled) { if (!itsSetWeightsEnabled) {
return; return;
} }
...@@ -975,6 +974,14 @@ void BeamServer::send_weights(Timestamp time) ...@@ -975,6 +974,14 @@ void BeamServer::send_weights(Timestamp time)
sw.weights() = m_weights16; sw.weights() = m_weights16;
LOG_INFO_STR("sending weights for interval " << time << " : " << time + (long)(itsComputeInterval-1)); 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); m_rspdriver.send(sw);
} }
......
...@@ -245,7 +245,7 @@ void Beams::sendHBAdelays(RTC::Timestamp time, ...@@ -245,7 +245,7 @@ void Beams::sendHBAdelays(RTC::Timestamp time,
request.settings().resize(request.rcumask.count(), MEPHeader::N_HBA_DELAYS); request.settings().resize(request.rcumask.count(), MEPHeader::N_HBA_DELAYS);
request.settings() = bi->first->getHBAdelays(); 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); port.send(request);
} }
} }
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <lofar_config.h> #include <lofar_config.h>
#include <Common/LofarLogger.h> #include <Common/LofarLogger.h>
#include <Common/hexdump.h>
#include <APL/RSP_Protocol/EPA_Protocol.ph> #include <APL/RSP_Protocol/EPA_Protocol.ph>
#include <APL/RSP_Protocol/RSP_Protocol.ph> #include <APL/RSP_Protocol/RSP_Protocol.ph>
...@@ -56,176 +57,173 @@ BWWrite::~BWWrite() ...@@ -56,176 +57,173 @@ BWWrite::~BWWrite()
void BWWrite::sendrequest() void BWWrite::sendrequest()
{ {
uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + m_blp; uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + m_blp;
// no conditional, update every second // no conditional, update every second
// reset m_offset and m_remaining for each register // reset m_offset and m_remaining for each register
if (0 == getCurrentIndex()) { if (0 == getCurrentIndex()) {
m_offset = MEPHeader::N_LOCAL_XLETS * MEPHeader::WEIGHT_SIZE; m_offset = MEPHeader::N_LOCAL_XLETS * MEPHeader::WEIGHT_SIZE;
m_remaining = MEPHeader::BF_XROUT_SIZE - m_offset; // representative for XR, XI, YR, YI 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) if (m_regid < MEPHeader::BF_XROUT || m_regid > MEPHeader::BF_YIOUT) {
{ LOG_FATAL("invalid regid");
LOG_FATAL("invalid regid"); exit(EXIT_FAILURE);
exit(EXIT_FAILURE); }
}
LOG_DEBUG(formatString(">>>> BWWrite(%s) global_blp=%d, blp=%d, regid=%d, m_offset=%d, m_remaining=%d",
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));
getBoardPort().getName().c_str(),
global_blp, m_blp, m_regid, m_offset, m_remaining)); // send next BF configure message
EPABfCoefsWriteEvent bfcoefs;
// 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);
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);
// this code is only guaranteed to work under the following conditions
ASSERT(size < MEPHeader::FRAGMENT_SIZE); switch (m_regid) {
case MEPHeader::BF_XROUT:
switch (m_regid) bfcoefs.hdr.set(MEPHeader::BF_XROUT_HDR, 1 << m_blp, MEPHeader::WRITE, size, m_offset);
{ break;
case MEPHeader::BF_XROUT: case MEPHeader::BF_XIOUT:
bfcoefs.hdr.set(MEPHeader::BF_XROUT_HDR, 1 << m_blp, bfcoefs.hdr.set(MEPHeader::BF_XIOUT_HDR, 1 << m_blp, MEPHeader::WRITE, size, m_offset);
MEPHeader::WRITE, size, m_offset); break;
break; case MEPHeader::BF_YROUT:
case MEPHeader::BF_XIOUT: bfcoefs.hdr.set(MEPHeader::BF_YROUT_HDR, 1 << m_blp, MEPHeader::WRITE, size, m_offset);
bfcoefs.hdr.set(MEPHeader::BF_XIOUT_HDR, 1 << m_blp, break;
MEPHeader::WRITE, size, m_offset); case MEPHeader::BF_YIOUT:
break; bfcoefs.hdr.set(MEPHeader::BF_YIOUT_HDR, 1 << m_blp, MEPHeader::WRITE, size, m_offset);
case MEPHeader::BF_YROUT: break;
bfcoefs.hdr.set(MEPHeader::BF_YROUT_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
case MEPHeader::BF_YIOUT: int nbeamlets_per_fragment = MEPHeader::N_BEAMLETS / MEPHeader::BF_N_FRAGMENTS;
bfcoefs.hdr.set(MEPHeader::BF_YIOUT_HDR, 1 << m_blp, Array<complex<int16>, 2> weights(nbeamlets_per_fragment, MEPHeader::N_POL);
MEPHeader::WRITE, size, m_offset); bfcoefs.coef.setBuffer(weights.data(), weights.size() * sizeof(complex<uint16>));
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 #if 0
Array<int, 2> index(MEPHeader::N_BEAMLETS, MEPHeader::N_POL); Array<int, 2> index(MEPHeader::N_BEAMLETS, MEPHeader::N_POL);
Array<int, 2> mapped_index(nbeamlets_per_fragment, 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 beamlet = 0; beamlet < MEPHeader::N_BEAMLETS; beamlet++) {
for (int pol = 0; pol < MEPHeader::N_POL; pol++) { for (int pol = 0; pol < MEPHeader::N_POL; pol++) {
index(beamlet, pol) = beamlet * MEPHeader::N_POL + pol; index(beamlet, pol) = beamlet * MEPHeader::N_POL + pol;
} }
} }
mapped_index = 0; mapped_index = 0;
#endif #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); int hw_offset = lane;
for (int lane = 0; lane < MEPHeader::N_SERDES_LANES; lane++) { int cache_offset = lane * (MEPHeader::N_BEAMLETS / MEPHeader::N_SERDES_LANES) + (getCurrentIndex() * nbeamlets_per_fragment / MEPHeader::N_SERDES_LANES);
int hw_offset = lane; Range hw_range(hw_offset, hw_offset + nbeamlets_per_fragment - MEPHeader::N_BLPS, MEPHeader::N_BLPS);
int cache_offset = lane * (MEPHeader::N_BEAMLETS / MEPHeader::N_SERDES_LANES) + (getCurrentIndex() * nbeamlets_per_fragment / MEPHeader::N_SERDES_LANES); 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); LOG_DEBUG_STR("lane=" << lane);
Range cache_range(cache_offset, cache_offset + (nbeamlets_per_fragment / MEPHeader::N_SERDES_LANES) - 1, 1); 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 // X
weights(hw_range, 0) = Cache::getInstance().getBack().getBeamletWeights()()(0, global_blp * 2, cache_range); weights(hw_range, 0) = Cache::getInstance().getBack().getBeamletWeights()()(0, global_blp * 2, cache_range);
// Y // Y
weights(hw_range, 1) = Cache::getInstance().getBack().getBeamletWeights()()(0, global_blp * 2 + 1, cache_range); weights(hw_range, 1) = Cache::getInstance().getBack().getBeamletWeights()()(0, global_blp * 2 + 1, cache_range);
#if 0 #if 0
mapped_index(hw_range, 0) = index(cache_range, 0); mapped_index(hw_range, 0) = index(cache_range, 0);
mapped_index(hw_range, 1) = index(cache_range, 1); mapped_index(hw_range, 1) = index(cache_range, 1);
#endif #endif
} }
#if 0 #if 0
LOG_DEBUG_STR("mapped_index=" << mapped_index); LOG_DEBUG_STR("mapped_index=" << mapped_index);
#endif #endif
// update m_remaining and m_offset for next write // update m_remaining and m_offset for next write
m_remaining -= size; m_remaining -= size;
m_offset += size; m_offset += size;
// //
// conjugate weights to get the correct matrix // conjugate weights to get the correct matrix
// weight a_r + i . a_i // 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 ) // (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: // This is equal to:
// //
// ( x_out_r ) ( a_r -a_i ) ( x_in_r ) // ( x_out_r ) ( a_r -a_i ) ( x_in_r )
// ( ) = ( ) * ( ) // ( ) = ( ) * ( )
// ( x_out_i ) ( a_i a_r ) ( x_in_i ) // ( x_out_i ) ( a_i a_r ) ( x_in_i )
// //
// and the same for y // and the same for y
// //
// To send to correct weights to the beamformer we must therefore // 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) // 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 // 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). // the weight (a_r, a_i) to produce (a_i, a_r).
// //
weights = conj(weights); weights = conj(weights);
switch (m_regid) switch (m_regid) {
{ case MEPHeader::BF_XROUT: {
case MEPHeader::BF_XROUT: // weights for x-real part
{ // no added conversions needed
// weights for x-real part
// no added conversions needed // y weights should be 0
weights(Range::all(), 1) = 0;
// y weights should be 0 }
weights(Range::all(), 1) = 0; break;
}
break; case MEPHeader::BF_XIOUT: {
// multiply by i to get correct weights
case MEPHeader::BF_XIOUT: // weights for x-imaginary part
{ weights *= complex<int16>(0,1);
// multiply by i to get correct weights
// weights for x-imaginary part // y weights should be 0
weights *= complex<int16>(0,1); 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 #if 0
weights(Range::all(), 1) = 0; // Debugging the waits send to one BLP by hexdumping the data before setting it on ethernet.
} if (global_blp == 32 && m_offset < 1000) {
break; string hd;
hexdump (hd, weights.data(), weights.size() * sizeof(complex<uint16>));
case MEPHeader::BF_YROUT: LOG_INFO_STR("global_blp=32, regid="<< m_regid << ",data=" << hd << endl);
{ }
// weights for y-real part #endif
// 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;
}
m_hdr = bfcoefs.hdr; m_hdr = bfcoefs.hdr;
getBoardPort().send(bfcoefs); getBoardPort().send(bfcoefs);
} }
void BWWrite::sendrequest_status() void BWWrite::sendrequest_status()
...@@ -235,8 +233,7 @@ void BWWrite::sendrequest_status() ...@@ -235,8 +233,7 @@ void BWWrite::sendrequest_status()
GCFEvent::TResult BWWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/) GCFEvent::TResult BWWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/)
{ {
if (EPA_WRITEACK != event.signal) if (EPA_WRITEACK != event.signal) {
{
LOG_WARN("BWWrite::handleack: unexpected ack"); LOG_WARN("BWWrite::handleack: unexpected ack");
return GCFEvent::NOT_HANDLED; return GCFEvent::NOT_HANDLED;
} }
...@@ -245,8 +242,7 @@ GCFEvent::TResult BWWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/ ...@@ -245,8 +242,7 @@ GCFEvent::TResult BWWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/
uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + m_blp; 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); Cache::getInstance().getState().bf().write_error(global_blp * MEPHeader::N_PHASEPOL + m_regid);
LOG_ERROR("BWWrite::handleack: invalid ack"); LOG_ERROR("BWWrite::handleack: invalid ack");
......
...@@ -3292,7 +3292,7 @@ void TBBCtl::mainloop() ...@@ -3292,7 +3292,7 @@ void TBBCtl::mainloop()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
GCFTask::init(argc, argv); GCFTask::init(argc, argv, "tbbctl");
LOG_DEBUG(formatString("Program %s has started", argv[0])); LOG_DEBUG(formatString("Program %s has started", argv[0]));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment