00001
00008 #include <iostream>
00009 #include <cmath>
00010
00011 #include "processor.h"
00012
00013 #include "ABCD/ABCDscans.h"
00014 #include "primParams.h"
00015 #include "ABCD/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 SctApi::modifyABCDMask(UINT32 mid, UINT32* mask) {
00029 {
00030 boost::mutex::scoped_lock lock(log().mutex());
00031 log() << "modifyABCDMask on " << mid << "\n";
00032 }
00033
00034 ABCDModule *module = lookupConfig(mid);
00035
00036 if(module) {
00037 for(int c=0; c<12; c++) {
00038 for(int m=0; m<4; m++) {
00039 module->chip[c].basic.mask[m] = mask[c*4+m];
00040 }
00041 }
00042 }
00043 }
00044
00045 void SctApi::modifyABCDRC(UINT32 mid, UINT32 chip, UINT16 index, FLOAT32 p0, FLOAT32 p1, FLOAT32 p2){
00046 {
00047 boost::mutex::scoped_lock lock(log().mutex());
00048 log() << "modifyABCDRC on " << mid << " " << chip << "\n";
00049 }
00050 ABCDModule *module = lookupConfig(mid);
00051
00052 if(module) {
00053 module->chip[chip].caldata.rc_function = index;
00054 module->chip[chip].caldata.rc_params[0]=p0;
00055 module->chip[chip].caldata.rc_params[1]=p1;
00056 module->chip[chip].caldata.rc_params[2]=p2;
00057 }
00058 }
00059
00060 void SctApi::modifyABCDTrims(UINT32 mid, UINT8* trims) {
00061 {
00062 boost::mutex::scoped_lock lock(log().mutex());
00063 log() << "modifyABCDTrims on " << mid << "\n";
00064 }
00065
00066 ABCDModule *module = lookupConfig(mid);
00067
00068 if(module) {
00069 for(int c=0; c<12; c++) {
00070 for(int t=0; t<128; t++) {
00071 module->chip[c].trim[t] = trims[c*128+t];
00072 }
00073 }
00074 }
00075 }
00076
00077 #define fToInt(val) ((int)((val)+0.5))
00078
00079 void SctApi::modifyABCDVar(UINT32 typ, FLOAT32 val) {
00080 {
00081 boost::mutex::scoped_lock lock(log().mutex());
00082 log() << "modifyABCDVar (all)\n";
00083 }
00084
00085 cout << "Modify var on all modules: setting " << typ << " to " << val << endl;
00086
00087 #warning "Suggest using ConfigUtility::variableType to find BOC_GLOBAL_CONFIG_VAR's"
00088
00089 switch(typ) {
00090
00091 case SCT_SCAN_BOC_BPM_PHASE:
00092 case SCT_SCAN_BOC_BREG_PHASE:
00093 case SCT_SCAN_BOC_V0_PHASE:
00094 case SCT_SCAN_BOC_V1_PHASE:
00095 case SCT_SCAN_BOC_V_PHASES:
00096 case SCT_SCAN_BOC_VRN_FINE:
00097
00098 case SCT_SCAN_TX_CHANNELS:
00099 case SCT_SCAN_RAW_TX_CHANNELS:
00100 {
00101 cout << "Calling modifyBOCParam on all crates for " << typ << " " << val << endl;
00102
00103 try {
00104 for(list<RodLabel>::const_iterator rl = rodList.begin();
00105 rl!=rodList.end();
00106 rl++){
00107 getCrate()->modifyBOCParam(typ, fToInt(val), false);
00108 }
00109 } catch(CrateException &c) {
00110 cout << "CrateException: " << c.what() << endl;
00111 }
00112 break;
00113 }
00114
00115 default:
00116
00117 for(map<UINT32, ABCDModule>::const_iterator iter = moduleMap.begin();
00118 iter != moduleMap.end();
00119 iter ++) {
00120 modifyABCDVar(iter->first, typ, val);
00121 }
00122 break;
00123 }
00124 }
00125
00126 void SctApi::modifyABCDVar(UINT32 mid, UINT32 typ, FLOAT32 val) {
00127 {
00128 boost::mutex::scoped_lock lock(log().mutex());
00129 log() << "modifyABCDVar (module " << mid << ") " << typ << " " << val << "\n";
00130 }
00131
00132 #warning "Suggest using ConfigUtility::variableType to pick out BOC params"
00133
00134 switch(typ) {
00135
00136 case ST_RX_DELAY:
00137 case ST_RX_DELAY0:
00138 case ST_RX_DELAY1:
00139 case ST_RX_THRESHOLD:
00140 case ST_RX_THRESHOLD0:
00141 case ST_RX_THRESHOLD1:
00142 case ST_TX_CURRENT:
00143 case ST_TX_MARKSPACE:
00144 case ST_TX_DELAY:
00145 case ST_TX_COARSE:
00146 case ST_TX_FINE:
00147
00148
00149 case SCT_SCAN_BOC_BPM_PHASE:
00150 case SCT_SCAN_BOC_BREG_PHASE:
00151 case SCT_SCAN_BOC_V0_PHASE:
00152 case SCT_SCAN_BOC_V1_PHASE:
00153 case SCT_SCAN_BOC_V_PHASES:
00154 case SCT_SCAN_BOC_VRN_FINE:
00155
00156 case SCT_SCAN_TX_CHANNELS:
00157 case SCT_SCAN_RAW_TX_CHANNELS:
00158 {
00159 unsigned int partition, crate, rod, channel;
00160 Utility::getpcrc(mid, partition, crate, rod, channel);
00161
00162 cout << "Calling BOCCard method for module " << mid << " " << typ << " " << val << endl;
00163
00164 try {
00165
00166 getCrate()->modifyBOCParam(rod, channel, typ, fToInt(val), false);
00167 } catch(CrateException &c) {
00168 cout << "CrateException: " << c.what() << endl;
00169 }
00170 break;
00171 }
00172
00173 default:
00174 ABCDModule *mConf = lookupConfig(mid);
00175 if (mConf){
00176 ConfigUtility::modifyVar(mConf, typ, val);
00177 }else{
00178 cout << "No module configuration to change\n";
00179 return;
00180 }
00181 }
00182 }
00183
00184 void SctApi::modifyABCDVar(UINT32 mid, UINT32 chip, UINT32 typ, FLOAT32 val) {
00185 {
00186 boost::mutex::scoped_lock lock(log().mutex());
00187 log() << "modifyABCDVar (module " << mid << ": chip " << chip << ") " << typ << " " << val << "\n";
00188 }
00189
00190 ABCDModule *mConf = lookupConfig(mid);
00191
00192 if(!mConf) {
00193 cout << "No module configuration to change\n";
00194 return;
00195 }
00196
00197 ConfigUtility::modifyVar(mConf, chip, typ, val);
00198 }
00199
00200 }