00001 #include "Sct/SctNames.h"
00002 #include "extraScans.h"
00003 #include "autoConfig.h"
00004 #include "Scan.h"
00005 #include "Trigger.h"
00006 #include "ScanDefImpl.h"
00007
00008
00009 using namespace std;
00010 using namespace SctApi;
00011
00012 using namespace SctApi::AutoConf;
00013
00014 #include "Sct/AbcdScans.h"
00015
00016 void AutoConfigurer::run() {
00017 api.modifyBOCParam(ST_RX_THRESHOLD, 128);
00018
00019
00020 boost::shared_ptr<Scan> txScan(new ScanDefImpl);
00021
00022 txScan->setNTrigs(1);
00023 txScan->getTrigger1()->singleL1A();
00024
00025 txScan->configure(SCT_SCAN_RAW_TX_CHANNELS, 0, 47, 1);
00026
00027
00028 MRSStream &mrs = Sct::SctNames::Mrs();
00029
00030 const list<RodLabel> rodList = api.listRods();
00031
00032 if(rodList.size() < 1) {
00033 cout << "AutoConfig: No RODs defined in configuration\n";
00034
00035 mrs << "AUTO_CONFIGURATION" << MRS_ERROR << MRS_QUALIF("SCTAPI") << MRS_QUALIF("AUTOPROBE")
00036 << MRS_TEXT("No RODs found in configuration")
00037 << ENDM;
00038 }
00039
00040 for(list<RodLabel>::const_iterator rl = rodList.begin();
00041 rl!=rodList.end();
00042 rl++){
00043
00044 const RodLabel &label = *rl;
00045
00046 std::vector< std::vector <char> > probeResult = api.probeScan(label.rod, txScan);
00047
00048 if(probeResult.size() < 48) {
00049 cout << "AutoConfig: Result too small: " << probeResult.size() << endl;
00050
00051 mrs << "AUTO_CONFIGURATION" << MRS_ERROR << MRS_QUALIF("SCTAPI") << MRS_QUALIF("AUTOPROBE")
00052 << MRS_PARAM<int>("crate", label.crate)
00053 << MRS_PARAM<int>("rod", label.rod)
00054 << MRS_TEXT("Scan failed for ROD")
00055 << ENDM;
00056 return;
00057 }
00058
00059 for(int point=0; point<48; point++) {
00060 if(probeResult[point].size() < 96) {
00061 cout << "AutoConfig: Scan too small: " << probeResult[point].size() << endl;
00062
00063 mrs << "AUTO_CONFIGURATION" << MRS_ERROR << MRS_QUALIF("SCTAPI") << MRS_QUALIF("AUTOPROBE")
00064 << MRS_PARAM<int>("pTTC", point)
00065 << MRS_PARAM<int>("crate", label.crate)
00066 << MRS_PARAM<int>("rod", label.rod)
00067 << MRS_TEXT("Internal error, result from scan too small")
00068 << ENDM;
00069 return;
00070 }
00071 for(int ch=0; ch<48; ch++) {
00072 char link0 = probeResult[point][ch*2 + 0];
00073 char link1 = probeResult[point][ch*2 + 1];
00074 if((link0 == '2' || link0 == 'E')
00075 && (link1 == '2' || link1 == 'E')) {
00076 cout << "AutoConfig: Module " << ch << " connected to tx " << point << endl;
00077
00078 results.push_back(AutoResult(label.partition, label.crate, label.rod, point, ch));
00079
00080 mrs << "MODULE_FOUND" << MRS_INFORMATION << MRS_QUALIF("SCTAPI") << MRS_QUALIF("AUTOPROBE")
00081
00082 << MRS_PARAM<int>("pTTC", point)
00083
00084 << MRS_PARAM<int>("rx0", ch*2 + 0)
00085 << MRS_PARAM<int>("rx1", ch*2 + 1)
00086 << MRS_PARAM<int>("crate", label.crate)
00087 << MRS_PARAM<int>("rod", label.rod)
00088 << MRS_PARAM<int>("harness", ch / 6)
00089 << MRS_PARAM<int>("position", (ch % 6) + 1)
00090 << MRS_TEXT("Module response found")
00091 << ENDM;
00092
00093 break;
00094 } else {
00095 continue;
00096 }
00097 }
00098 }
00099
00100
00101 api.configureBOC(label.rod);
00102 }
00103
00104 if(results.size() == 0) {
00105 mrs << "AUTO_CONFIGURATION" << MRS_INFORMATION << MRS_QUALIF("SCTAPI") << MRS_QUALIF("AUTOPROBE")
00106 << MRS_TEXT("Autoprobe complete, no modules found")
00107 << ENDM;
00108 cout << "Autoprobe complete, no modules found\n";
00109 }
00110 }
00111
00112 list<AutoResult> AutoConfigurer::getResults() {
00113 return results;
00114 }