diff --git a/MAC/APL/PIC/TBB_Driver/src/TrigCoefSameCmd.cc b/MAC/APL/PIC/TBB_Driver/src/TrigCoefSameCmd.cc new file mode 100644 index 0000000000000000000000000000000000000000..0b0bf42a8e5a83cc8d936d6b225f5c2bb024f7cc --- /dev/null +++ b/MAC/APL/PIC/TBB_Driver/src/TrigCoefSameCmd.cc @@ -0,0 +1,139 @@ +//# TrigCoefSameCmd.cc: implementation of the TrigCoefSameCmd class +//# +//# Copyright (C) 2002-2004 +//# 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$ + +#include <lofar_config.h> +#include <Common/LofarLogger.h> +#include <Common/StringUtil.h> + +#include "TrigCoefSameCmd.h" + + +using namespace LOFAR; +using namespace GCF::TM; +using namespace TBB_Protocol; +using namespace TP_Protocol; +using namespace TBB; + +//--Constructors for a TrigCoefSameCmd object.---------------------------------------- +TrigCoefSameCmd::TrigCoefSameCmd() +{ + TS = TbbSettings::instance(); + setWaitAck(true); +} + +//--Destructor for TrigCoefSameCmd.--------------------------------------------------- +TrigCoefSameCmd::~TrigCoefSameCmd() { } + +// ---------------------------------------------------------------------------- +bool TrigCoefSameCmd::isValid(GCFEvent& event) +{ + if ((event.signal == TBB_TRIG_COEF_SAME)||(event.signal == TP_TRIG_COEF_ACK)) { + return(true); + } + return(false); +} + +// ---------------------------------------------------------------------------- +void TrigCoefSameCmd::saveTbbEvent(GCFEvent& event) +{ + TBBTrigCoefSameEvent tbb_event(event); + + int32 board; // board 0 .. 11 + int32 board_channel; // board_channel 0 .. 15 + int32 channel; // channel 0 .. 191 (= maxboard * max_channels_on_board) + + for(int rcunr = 0; rcunr < TS->maxChannels(); rcunr++) { + if (tbb_event.rcu_mask.test(rcunr) == true) { + TS->convertRcu2Ch(rcunr,&board,&board_channel); + channel = (board * TS->nrChannelsOnBoard()) + board_channel; + TS->setChFilterCoefficient(channel, 0, tbb_event.coefficients.c0); + TS->setChFilterCoefficient(channel, 1, tbb_event.coefficients.c1); + TS->setChFilterCoefficient(channel, 2, tbb_event.coefficients.c2); + TS->setChFilterCoefficient(channel, 3, tbb_event.coefficients.c3); + } + } + + setChannels(tbb_event.rcu_mask); + + // select firt channel to handle + nextChannelNr(); +} + +// ---------------------------------------------------------------------------- +void TrigCoefSameCmd::sendTpEvent() +{ + TPTrigCoefEvent tp_event; + + tp_event.opcode = oc_TRIG_COEF; + tp_event.status = 0; + + tp_event.mp = TS->getChMpNr(getChannelNr()); + int start_channel = TS->getFirstChannelNr(getBoardNr(), TS->getChMpNr(getChannelNr())); + for (int i = 0; i < 4; i++) { + tp_event.channel[i].c0 = TS->getChFilterCoefficient((start_channel + i), 0); + tp_event.channel[i].c1 = TS->getChFilterCoefficient((start_channel + i), 1); + tp_event.channel[i].c2 = TS->getChFilterCoefficient((start_channel + i), 2); + tp_event.channel[i].c3 = TS->getChFilterCoefficient((start_channel + i), 3); + } + + LOG_DEBUG_STR(formatString("Sending TrigCoef to boardnr[%d]",getBoardNr())); + TS->boardPort(getBoardNr()).send(tp_event); + TS->boardPort(getBoardNr()).setTimer(TS->timeout()); +} + +// ---------------------------------------------------------------------------- +void TrigCoefSameCmd::saveTpAckEvent(GCFEvent& event) +{ + // in case of a time-out, set error mask + if (event.signal == F_TIMER) { + setStatus(getBoardNr(), TBB_TIME_OUT); + } else { + TPTrigSetupAckEvent tp_ack(event); + LOG_DEBUG_STR(formatString("Received TrigCoefAck from boardnr[%d]", getBoardNr())); + + if (tp_ack.status != 0) { + setStatus(getBoardNr(), (tp_ack.status << 24)); + int start_channel = TS->getFirstChannelNr(getBoardNr(), TS->getChMpNr(getChannelNr())); + for (int i = 0; i < 4; i++) { + TS->setChFilterCoefficient((start_channel + i), 0, 0); + TS->setChFilterCoefficient((start_channel + i), 1, 0); + TS->setChFilterCoefficient((start_channel + i), 2, 0); + TS->setChFilterCoefficient((start_channel + i), 3, 0); + } + } + } + // one mp done, go to next mp + setChannelNr(TS->getFirstChannelNr(getBoardNr(), TS->getChMpNr(getChannelNr())) + 3); + nextChannelNr(); +} + +// ---------------------------------------------------------------------------- +void TrigCoefSameCmd::sendTbbAckEvent(GCFPortInterface* clientport) +{ + TBBTrigCoefAckEvent tbb_ack; + + for (int32 i = 0; i < MAX_N_TBBOARDS; i++) { + tbb_ack.status_mask[i] = getStatus(i); + } + + if (clientport->isConnected()) { clientport->send(tbb_ack); } +} diff --git a/MAC/APL/PIC/TBB_Driver/src/TrigCoefSameCmd.h b/MAC/APL/PIC/TBB_Driver/src/TrigCoefSameCmd.h new file mode 100644 index 0000000000000000000000000000000000000000..ab858a5d3a2ab4e734096bdd786524628102d9c1 --- /dev/null +++ b/MAC/APL/PIC/TBB_Driver/src/TrigCoefSameCmd.h @@ -0,0 +1,67 @@ +//# -*- mode: c++ -*- +//# +//# TrigCoefSameCmd.h: III +//# +//# Copyright (C) 2002-2004 +//# 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 TRIGCOEFSAMECMD_H_ +#define TRIGCOEFSAMECMD_H_ + +#include <Common/LofarTypes.h> +#include <GCF/TM/GCF_Control.h> + +#include <APL/TBB_Protocol/TBB_Protocol.ph> +#include "TP_Protocol.ph" + +#include "Command.h" +#include "DriverSettings.h" + +namespace LOFAR { + using namespace TBB_Protocol; + namespace TBB { + +class TrigCoefSameCmd : public Command +{ +public: + // Constructors for a TrigCoefSameCmd object. + TrigCoefSameCmd(); + + // Destructor for TrigCoefSameCmd. + virtual ~TrigCoefSameCmd(); + + virtual bool isValid(GCFEvent& event); + + virtual void saveTbbEvent(GCFEvent& event); + + virtual void sendTpEvent(); + + virtual void saveTpAckEvent(GCFEvent& event); + + virtual void sendTbbAckEvent(GCFPortInterface* clientport); + +private: + TbbSettings *TS; +}; + + } // end TBB namespace +} // end LOFAR namespace + +#endif /* TRIGCOEFSAMECMD_H_ */ diff --git a/MAC/APL/PIC/TBB_Driver/src/TrigSetupSameCmd.cc b/MAC/APL/PIC/TBB_Driver/src/TrigSetupSameCmd.cc new file mode 100644 index 0000000000000000000000000000000000000000..3f4e56faf9a8ac8db548df6235687805f4d01e35 --- /dev/null +++ b/MAC/APL/PIC/TBB_Driver/src/TrigSetupSameCmd.cc @@ -0,0 +1,144 @@ +//# TrigSetupSameCmd.cc: implementation of the TrigSetupSameCmd class +//# +//# Copyright (C) 2002-2004 +//# 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$ + +#include <lofar_config.h> +#include <Common/LofarLogger.h> +#include <Common/StringUtil.h> + +#include "TrigSetupSameCmd.h" + + +using namespace LOFAR; +using namespace GCF::TM; +using namespace TBB_Protocol; +using namespace TP_Protocol; +using namespace TBB; + +//--Constructors for a TrigSetupSameCmd object.---------------------------------------- +TrigSetupSameCmd::TrigSetupSameCmd() +{ + TS = TbbSettings::instance(); + setWaitAck(true); +} + +//--Destructor for TrigSetupSameCmd.--------------------------------------------------- +TrigSetupSameCmd::~TrigSetupSameCmd() { } + +// ---------------------------------------------------------------------------- +bool TrigSetupSameCmd::isValid(GCFEvent& event) +{ + if ((event.signal == TBB_TRIG_SETUP_SAME)||(event.signal == TP_TRIG_SETUP_ACK)) { + return(true); + } + return(false); +} + +// ---------------------------------------------------------------------------- +void TrigSetupSameCmd::saveTbbEvent(GCFEvent& event) +{ + TBBTrigSetupSameEvent tbb_event(event); + + int32 board; // board 0 .. 11 + int32 board_channel;// board_channel 0 .. 15 + int32 channel; // channel 0 .. 191 (= maxboard * max_channels_on_board) + + for(int rcunr = 0; rcunr < TS->maxChannels(); rcunr++) { + if (tbb_event.rcu_mask.test(rcunr) == true) { + TS->convertRcu2Ch(rcunr,&board,&board_channel); + channel = (board * TS->nrChannelsOnBoard()) + board_channel; + + TS->setChTriggerLevel(channel, tbb_event.setup.level); + TS->setChTriggerStartMode(channel, (tbb_event.setup.start_mode)); + TS->setChTriggerStopMode(channel, (tbb_event.setup.stop_mode)); + TS->setChFilterSelect(channel, tbb_event.setup.filter_select); + TS->setChDetectWindow(channel, tbb_event.setup.window); + TS->setChTriggerMode(channel, tbb_event.setup.trigger_mode); + } + } + + setChannels(tbb_event.rcu_mask); + + // select firt channel to handle + nextChannelNr(); +} + +// ---------------------------------------------------------------------------- +void TrigSetupSameCmd::sendTpEvent() +{ + TPTrigSetupEvent tp_event; + tp_event.opcode = oc_TRIG_SETUP; + tp_event.status = 0; + + tp_event.mp = TS->getChMpNr(getChannelNr()); + int start_channel = TS->getFirstChannelNr(getBoardNr(), TS->getChMpNr(getChannelNr())); + for (int i = 0; i < 4; i++) { + tp_event.channel[i].level = static_cast<uint32>(TS->getChTriggerLevel(start_channel + i)); + tp_event.channel[i].td_mode = static_cast<uint32>((TS->getChTriggerStartMode(start_channel + i) + + (TS->getChTriggerStopMode(start_channel + i) << 4))); + tp_event.channel[i].filter_select = static_cast<uint32>(TS->getChFilterSelect(start_channel + i)); + tp_event.channel[i].window = static_cast<uint32>(TS->getChDetectWindow(start_channel + i)); + tp_event.channel[i].dummy = static_cast<uint32>(TS->getChTriggerMode(start_channel + i)); + } + + TS->boardPort(getBoardNr()).send(tp_event); + TS->boardPort(getBoardNr()).setTimer(TS->timeout()); +} + +// ---------------------------------------------------------------------------- +void TrigSetupSameCmd::saveTpAckEvent(GCFEvent& event) +{ + // in case of a time-out, set error mask + if (event.signal == F_TIMER) { + setStatus(getBoardNr(), TBB_TIME_OUT); + } else { + TPTrigSetupAckEvent tp_ack(event); + LOG_DEBUG_STR(formatString("Received TrigSetupAck from boardnr[%d]", getBoardNr())); + + if (tp_ack.status != 0) { + setStatus(getBoardNr(), (tp_ack.status << 24)); + int start_channel = TS->getFirstChannelNr(getBoardNr(), TS->getChMpNr(getChannelNr())); + for (int i = 0; i < 4; i++) { + TS->setChTriggerLevel((start_channel + i), 0); + TS->setChTriggerStartMode((start_channel + i), 0); + TS->setChTriggerStopMode((start_channel + i), 0); + TS->setChFilterSelect((start_channel + i), 0); + TS->setChDetectWindow((start_channel + i), 0); + TS->setChTriggerMode((start_channel + i), 0); + } + } + } + // one mp done, go to next mp + setChannelNr(TS->getFirstChannelNr(getBoardNr(), TS->getChMpNr(getChannelNr())) + 3); + nextChannelNr(); +} + +// ---------------------------------------------------------------------------- +void TrigSetupSameCmd::sendTbbAckEvent(GCFPortInterface* clientport) +{ + TBBTrigSetupSameAckEvent tbb_ack; + + for (int32 i = 0; i < MAX_N_TBBOARDS; i++) { + tbb_ack.status_mask[i] = getStatus(i); + } + + if (clientport->isConnected()) { clientport->send(tbb_ack); } +} diff --git a/MAC/APL/PIC/TBB_Driver/src/TrigSetupSameCmd.h b/MAC/APL/PIC/TBB_Driver/src/TrigSetupSameCmd.h new file mode 100644 index 0000000000000000000000000000000000000000..351172e90e5d790718e8a4049c1b4005e573111f --- /dev/null +++ b/MAC/APL/PIC/TBB_Driver/src/TrigSetupSameCmd.h @@ -0,0 +1,67 @@ +//# -*- mode: c++ -*- +//# +//# TrigSetupSameCmd.h: III +//# +//# Copyright (C) 2002-2004 +//# 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 TRIGSETUPSAMECMD_H_ +#define TRIGSETUPSAMECMD_H_ + +#include <Common/LofarTypes.h> +#include <GCF/TM/GCF_Control.h> + +#include <APL/TBB_Protocol/TBB_Protocol.ph> +#include "TP_Protocol.ph" + +#include "Command.h" +#include "DriverSettings.h" + +namespace LOFAR { + using namespace TBB_Protocol; + namespace TBB { + +class TrigSetupSameCmd : public Command +{ +public: + // Constructors for a TrigSetupSameCmd object. + TrigSetupSameCmd(); + + // Destructor for TrigSetupSameCmd. + virtual ~TrigSetupSameCmd(); + + virtual bool isValid(GCFEvent& event); + + virtual void saveTbbEvent(GCFEvent& event); + + virtual void sendTpEvent(); + + virtual void saveTpAckEvent(GCFEvent& event); + + virtual void sendTbbAckEvent(GCFPortInterface* clientport); + +private: + TbbSettings *TS; +}; + + } // end TBB namespace +} // end LOFAR namespace + +#endif /* TRIGSETUPSAMECMD_H_ */