SctApiModify.cxx

00001 
00008 #include <iostream>
00009 #include <cmath>
00010 
00011 #include "processor.h"
00012 
00013 #include "Sct/AbcdScans.h"
00014 #include "primParams.h"     // This has MVAR variables which are shared with PIXEL
00015 #include "Sct/AbcdChip.h"
00016 
00017 #include "SctApi.h"
00018 #include "crate.h"
00019 #include "utility.h"
00020 
00021 #include "extraScans.h"
00022 #include "ConfigurationUtility.h"
00023 
00024 using namespace std;
00025 
00026 namespace SctApi {
00027 
00028 void printBanks(list<BankType> banks, std::ostream& os);
00029 
00030 void SctApi::setAutoUpdateBanks(std::list<BankType> banks){
00031   std::cout << "AutoUpdate has been set for ROD banks: ";  
00032   printBanks(banks, std::cout); std::cout << std::endl;
00033   m_autoUpdateBanks=banks;
00034 }
00035 
00036 void SctApi::modifyABCDMask(UINT32 mid, UINT32* mask) {
00037   {
00038     boost::mutex::scoped_lock lock(log().mutex());
00039     log() << "modifyABCDMask on " << mid << "\n";
00040   }
00041 
00042   ABCDModule *module = lookupConfig(mid);
00043 
00044   if(module) {
00045     for(int c=0; c<12; c++) {
00046       for(int m=0; m<4; m++) {
00047         module->chip[c].basic.mask[m] = mask[c*4+m];
00048       }
00049     }
00050   } 
00051 }
00052 
00053 void SctApi::modifyABCDRC(UINT32 mid, UINT32 chip, UINT16 index, FLOAT32 p0, FLOAT32 p1, FLOAT32 p2){
00054   {
00055     boost::mutex::scoped_lock lock(log().mutex());
00056     log() << "modifyABCDRC on " << mid << " " << chip << "\n";
00057   }
00058   ABCDModule *module = lookupConfig(mid);
00059 
00060   if(module) {
00061     module->chip[chip].caldata.rc_function = index;
00062     module->chip[chip].caldata.rc_params[0]=p0;
00063     module->chip[chip].caldata.rc_params[1]=p1;
00064     module->chip[chip].caldata.rc_params[2]=p2;
00065   }
00066 }
00067 
00068 void SctApi::modifyABCDTrims(UINT32 mid, UINT8* trims) {
00069   {
00070     boost::mutex::scoped_lock lock(log().mutex());
00071     log() << "modifyABCDTrims on " << mid << "\n";
00072   }
00073 
00074   ABCDModule *module = lookupConfig(mid);
00075 
00076   if(module) {
00077     for(int c=0; c<12; c++) {
00078       for(int t=0; t<128; t++) {
00079         module->chip[c].trim[t] = trims[c*128+t];
00080       }
00081     }
00082   }
00083 }
00084 
00085 #define fToInt(val) ((int)((val)+0.5))
00086 
00087 void SctApi::modifyABCDVar(UINT32 typ, FLOAT32 val) {
00088   {
00089     boost::mutex::scoped_lock lock(log().mutex());
00090     log() << "modifyABCDVar (all)\n";
00091   }
00092 
00093   cout << "Modify var on all modules: setting " << typ << " to " << val << endl;
00094 
00095 #warning "Suggest using ConfigUtility::variableType to find BOC_GLOBAL_CONFIG_VAR's"
00096 
00097   switch(typ) {
00098     // Global BOC registers
00099   case SCT_SCAN_BOC_BPM_PHASE:
00100   case SCT_SCAN_BOC_BREG_PHASE:
00101   case SCT_SCAN_BOC_V0_PHASE:
00102   case SCT_SCAN_BOC_V1_PHASE:
00103   case SCT_SCAN_BOC_V_PHASES:
00104   case SCT_SCAN_BOC_VRN_FINE:
00105 
00106   case SCT_SCAN_TX_CHANNELS:
00107   case SCT_SCAN_RAW_TX_CHANNELS:
00108     {
00109       cout << "Calling modifyBOCParam on all crates for " << typ << " " << val << endl;
00110 
00111       try {
00112         for(list<RodLabel>::const_iterator rl = rodList.begin();
00113             rl!=rodList.end();
00114             rl++){
00115           getCrate()->modifyBOCParam(typ, fToInt(val), false);
00116         }
00117       } catch(CrateException &c) {
00118         cout << "CrateException: " << c.what() << endl;
00119       }
00120       break;
00121     }
00122 
00123   default:
00124     // Module level parameters
00125     for(map<UINT32, ABCDModule>::const_iterator iter = moduleMap.begin();
00126         iter != moduleMap.end();
00127         iter ++) {
00128       modifyABCDVar(iter->first, typ, val);
00129     }
00130     if (!m_autoUpdateBanks.empty() && ConfigUtility::isModuleRegister(typ)){
00131       modifyABCDVarROD(typ, val, m_autoUpdateBanks);
00132     }
00133     break;
00134   }
00135 }
00136   
00137 void SctApi::modifyABCDVarAllModulesOneChip(UINT32 chip, UINT32 typ, FLOAT32 val){
00138   {
00139     boost::mutex::scoped_lock lock(log().mutex());
00140     log() << "modifyABCDVarAllModulesOneChip (chip " << chip << ") " << typ << " " << val << "\n";
00141   }
00142   if (ConfigUtility::variableType(typ)!=ConfigUtility::MODULE_CHIP_CONFIG_VAR && 
00143       ConfigUtility::variableType(typ)!=ConfigUtility::MODULE_CHANNEL_CONFIG_VAR){
00144     std::cout << "Variable " << typ << " of type " << ConfigUtility::variableType(typ) 
00145           << " cannot be modified at the chip level!" << std::endl;
00146     return;
00147   }
00148   for(map<UINT32, ABCDModule>::const_iterator iter = moduleMap.begin();
00149       iter != moduleMap.end();
00150       iter ++) {
00151     modifyABCDVar(iter->first, chip, typ, val);
00152   }
00153 }
00154 
00155 void SctApi::modifyABCDVar(UINT32 mid, UINT32 typ, FLOAT32 val) {
00156   {
00157     boost::mutex::scoped_lock lock(log().mutex());
00158     log() << "modifyABCDVar (module " << mid << ") " << typ << " " << val << "\n";
00159   }
00160 
00161 #warning "Suggest using ConfigUtility::variableType to pick out BOC params"
00162 
00163   switch(typ) {
00164     // First some module parameters (BOC)
00165   case ST_RX_DELAY:
00166   case ST_RX_DELAY0:
00167   case ST_RX_DELAY1:
00168   case ST_RX_THRESHOLD:
00169   case ST_RX_THRESHOLD0:
00170   case ST_RX_THRESHOLD1:
00171   case ST_TX_CURRENT:
00172   case ST_TX_MARKSPACE:
00173   case ST_TX_DELAY:
00174   case ST_TX_COARSE:
00175   case ST_TX_FINE:
00176 
00177     // Global BOC registers
00178   case SCT_SCAN_BOC_BPM_PHASE:
00179   case SCT_SCAN_BOC_BREG_PHASE:
00180   case SCT_SCAN_BOC_V0_PHASE:
00181   case SCT_SCAN_BOC_V1_PHASE:
00182   case SCT_SCAN_BOC_V_PHASES:
00183   case SCT_SCAN_BOC_VRN_FINE:
00184 
00185   case SCT_SCAN_TX_CHANNELS:
00186   case SCT_SCAN_RAW_TX_CHANNELS:
00187     {
00188       unsigned int partition, crate, rod, channel;
00189       Utility::getpcrc(mid, partition, crate, rod, channel);
00190 
00191       cout << "Calling BOCCard method for module " << mid << " " << typ << " " << val << endl;
00192 
00193       try {
00194         // Do channel mapping
00195         getCrate()->modifyBOCParam(rod, channel, typ, fToInt(val), false);
00196       } catch(CrateException &c) {
00197         cout << "CrateException: " << c.what() << endl;
00198       }
00199       break;
00200     }
00201 
00202   default:
00203     ABCDModule *mConf = lookupConfig(mid);
00204     if (mConf){
00205       ConfigUtility::modifyVar(mConf, typ, val);
00206     }else{
00207       cout << "No module configuration to change\n";
00208       return;
00209     }
00210     if (!m_autoUpdateBanks.empty() && ConfigUtility::isModuleRegister(typ)){
00211       modifyABCDVarROD(mid, typ, val, m_autoUpdateBanks);
00212     }
00213   }
00214 }
00215 
00216 void SctApi::modifyABCDVar(UINT32 mid, UINT32 chip, UINT32 typ, FLOAT32 val) {
00217   {
00218     boost::mutex::scoped_lock lock(log().mutex());
00219     log() << "modifyABCDVar (module " << mid << ": chip " << chip  << ") " << typ << " " << val << "\n";
00220   }
00221 
00222   ABCDModule *mConf = lookupConfig(mid);
00223 
00224   if(!mConf) {
00225     cout << "No module configuration to change\n";
00226     return;
00227   }
00228 
00229   ConfigUtility::modifyVar(mConf, chip, typ, val);
00230   if (!m_autoUpdateBanks.empty()  && ConfigUtility::isModuleRegister(typ)){
00231     modifyABCDVarROD(mid, chip, typ, val, m_autoUpdateBanks);
00232   }
00233 }
00234 
00235 }

Generated on Mon Feb 6 14:01:29 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6