• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

bnet/src/RocWorkerApplication.cxx (r4864/r4113)

Go to the documentation of this file.
00001 /********************************************************************
00002  * The Data Acquisition Backbone Core (DABC)
00003  ********************************************************************
00004  * Copyright (C) 2009-
00005  * GSI Helmholtzzentrum fuer Schwerionenforschung GmbH
00006  * Planckstr. 1
00007  * 64291 Darmstadt
00008  * Germany
00009  * Contact:  http://dabc.gsi.de
00010  ********************************************************************
00011  * This software can be used under the GPL license agreements as stated
00012  * in LICENSE.txt file which is part of the distribution.
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    // register application specific parameters here:
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,                                               // modulename
00077          true,                                                     // bnet mode
00078          GetParStr(bnet::CfgReadoutPool, bnet::ReadoutPoolName).c_str(),   // inp pool name
00079          bnet::TransportPoolName,                                  // out pool name
00080          GetParInt(bnet::xmlTransportBuffer, 16*1024),             // buffer size
00081          1,                                                        // num outputs
00082          true,                                                     // skip error data
00083          GetParStr(roc::xmlMBSSyncNode,"").c_str(),                // optional MBS node
00084          GetParStr(roc::xmlEpicsStreamNode, "").c_str(),          // epics stream node
00085          fRocBrds);
00086 }
00087 
00088 
00089 bool bnet::RocWorkerApplication::CreateReadout(const char* portname, int portnumber)
00090 {
00091    // this method is obsolete in this application, 
00092    // while combiner module with all inputs connected will be create in CreateCombiner method
00093    // here we can create some debug parameters for ADC values
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 //      bool flag = cmd->GetBool(roc::CmdCalibration::FlagName(), true);
00122 //      dabc::Command* gcmd = new roc::CmdGlobalCalibration(flag);
00123 //      dabc::SetCmdReceiver(gcmd, GetParStr(CfgClusterMgr).c_str(), dabc::xmlAppDfltName);
00124 //      dabc::mgr()->Submit(gcmd);
00125 //      return dabc::cmd_true;
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 //               dabc::RateParameter* rate = dynamic_cast<dabc::RateParameter*> (FindPar(parname.c_str()));
00168 //               if (rate) rate->ChangeRate(val & 0xffffff);
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    //  DLM 10/11 not implemented for calibration switch on/off
00181    // fRocBrds.issueDLM(on ? 10 : 11);
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 

Generated on Tue Dec 10 2013 04:52:21 for ROCsoft by  doxygen 1.7.1