00001
00008 #include <iostream>
00009 #include <cmath>
00010
00011 #include "processor.h"
00012
00013 #include "Sct/AbcdScans.h"
00014 #include "primParams.h"
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
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
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
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
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
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 }