00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "bnet/RocWorkerApplication.h"
00015
00016 #include "dabc/logging.h"
00017 #include "dabc/Manager.h"
00018 #include "dabc/Device.h"
00019 #include "dabc/Configuration.h"
00020 #include "dabc/Parameter.h"
00021
00022 #include "bnet/GeneratorModule.h"
00023
00024 #include "roc/Board.h"
00025 #include "roc/UdpBoard.h"
00026 #include "roc/Commands.h"
00027 #include "roc/CombinerModule.h"
00028 #include "roc/ReadoutApplication.h"
00029
00030 #include "bnet/RocFactory.h"
00031
00032 bnet::RocWorkerApplication::RocWorkerApplication() :
00033 bnet::MbsWorkerApplication(xmlRocWorkerClass),
00034 fRocBrds(),
00035 fCalibrState(calNONE),
00036 fCombinerName()
00037 {
00038
00039
00040 CreateParInt(roc::xmlSyncNumber, 0);
00041 CreateParInt(roc::xmlSyncScaleDown, 2);
00042
00043 CreateParBool(roc::xmlMeasureADC, false);
00044 CreateParBool(roc::xmlUseDLM, false);
00045
00046 CreateParInt(roc::xmlSpillRoc, -1);
00047 CreateParInt(roc::xmlSpillAux, -1);
00048 CreateParDouble(roc::xmlCalibrationPeriod, -1.);
00049 CreateParDouble(roc::xmlCalibrationLength, 0.5);
00050
00051 for (int nr=0;nr<NumReadouts();nr++)
00052 CreateParStr(FORMAT(("%s%d", roc::xmlRocFebs, nr)));
00053
00054 CreateParInt(roc::xmlMBSSyncRoc, -1);
00055 CreateParInt(roc::xmlMBSSyncNumber, -1);
00056 CreateParStr(roc::xmlMBSSyncNode, "");
00057 CreateParInt(roc::xmlMBSSyncProcId, -1);
00058
00059 CreateParStr(roc::xmlEpicsStreamNode, "");
00060 CreateParStr(roc::xmlEpicsTransportNode, "");
00061
00062 fDoMeasureADC = false;
00063 }
00064
00065
00066 bool bnet::RocWorkerApplication::CreateCombiner(const char* modulename)
00067 {
00068 fRocBrds.returnBoards();
00069 for(int n=0; n<NumReadouts(); n++)
00070 fRocBrds.addRoc(ReadoutPar(n), GetParStr(FORMAT(("%s%d", roc::xmlRocFebs, n))));
00071
00072 fCombinerName = modulename;
00073
00074 fDoMeasureADC = GetParBool(roc::xmlMeasureADC, false);
00075
00076 return roc::ReadoutApplication::CreateRocCombiner(modulename,
00077 true,
00078 GetParStr(bnet::CfgReadoutPool, bnet::ReadoutPoolName).c_str(),
00079 bnet::TransportPoolName,
00080 GetParInt(bnet::xmlTransportBuffer, 16*1024),
00081 1,
00082 true,
00083 GetParStr(roc::xmlMBSSyncNode,"").c_str(),
00084 GetParStr(roc::xmlEpicsStreamNode, "").c_str(),
00085 fRocBrds);
00086 }
00087
00088
00089 bool bnet::RocWorkerApplication::CreateReadout(const char* portname, int portnumber)
00090 {
00091
00092
00093
00094
00095
00096 if (IsGenerator()) return false;
00097
00098 if (fDoMeasureADC && (portnumber<(int)fRocBrds.size()) && (fRocBrds[portnumber].brd!=0))
00099 for (int nfeb=0;nfeb<2;nfeb++)
00100 for (int nadc=0;nadc<fRocBrds.numAdc(portnumber, nfeb);nadc++) {
00101 std::string parname = dabc::format("ROC%u_FEB%d_ADC%d", fRocBrds[portnumber].brd->rocNumber(), nfeb, nadc);
00102
00103 if (!FindPar(parname.c_str())) {
00104 dabc::RateParameter* par = new dabc::RateParameter(this, parname.c_str(), true, 5., "adc", 0, 0xfff, 4, 0);
00105 par->SetDebugOutput(false);
00106 }
00107 }
00108
00109
00110 return true;
00111 }
00112
00113 std::string bnet::RocWorkerApplication::GetCombinerOutputName(const char* name)
00114 {
00115 return dabc::format("%s/Output0", name);
00116 }
00117
00118 int bnet::RocWorkerApplication::ExecuteCommand(dabc::Command* cmd)
00119 {
00120 if (cmd->IsName(roc::CmdCalibration::CmdName())) {
00121
00122
00123
00124
00125
00126 dabc::SetCmdReceiver(cmd, GetParStr(CfgClusterMgr).c_str(), dabc::xmlAppDfltName);
00127 dabc::mgr()->Submit(cmd);
00128 return dabc::cmd_postponed;
00129 } else
00130 if (cmd->IsName(roc::CmdGlobalCalibration::CmdName())) {
00131 bool flag = cmd->GetBool(roc::CmdGlobalCalibration::FlagName(), true);
00132 SwitchCalibrationMode(flag);
00133 return dabc::cmd_true;
00134 }
00135
00136 return bnet::MbsWorkerApplication::ExecuteCommand(cmd);
00137 }
00138
00139 bool bnet::RocWorkerApplication::AfterAppModulesStopped()
00140 {
00141 if (fCalibrState == calON)
00142 SwitchCalibrationMode(false);
00143 return bnet::MbsWorkerApplication::AfterAppModulesStopped();
00144 }
00145
00146 bool bnet::RocWorkerApplication::SwitchCalibrationMode(bool on)
00147 {
00148 if ((fCalibrState == calON) && on) return true;
00149
00150 if ((fCalibrState == calOFF) && !on) return true;
00151
00152 DOUT0(("SwitchCalibration %s %5.2f", DBOOL(on), TimeStamp()*1e-6));
00153
00154 if (on && fDoMeasureADC) {
00155 roc::MessagesVector* vect = fRocBrds.readoutExtraMessages();
00156
00157 if (vect!=0) {
00158
00159 for (unsigned n=0; n<vect->size(); n++)
00160 if (vect->at(n).isSysMsg() && vect->at(n).getSysMesType()==roc::SYSMSG_ADC) {
00161 uint32_t val = vect->at(n).getSysMesData();
00162
00163 std::string parname = dabc::format("ROC%u_FEB%d_ADC%d", vect->at(n).getRocNumber(), val >> 31, (val >> 24) & 0x7f);
00164
00165 SetParStr(parname.c_str(), dabc::format("%u", val & 0xffffff));
00166
00167
00168
00169 }
00170
00171
00172 dabc::Command* cmd = new roc::CmdMessagesVector(vect);
00173 dabc::SetCmdReceiver(cmd, fCombinerName.c_str());
00174 dabc::mgr()->Submit(cmd);
00175 }
00176 }
00177
00178 fRocBrds.autoped_switch(on);
00179
00180
00181
00182
00183 fCalibrState = on ? calON : calOFF;
00184
00185 return true;
00186 }
00187
00188
00189 bool bnet::RocWorkerApplication::BeforeAppModulesDestroyed()
00190 {
00191 fRocBrds.returnBoards();
00192
00193 fCombinerName.clear();
00194
00195 return bnet::MbsWorkerApplication::BeforeAppModulesDestroyed();
00196 }
00197