autoConfig.cxx

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   // Setup a raw TX scan...
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   // Run on each ROD in turn
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             // << MRS_PARAM<int>("select", configuration.select)
00082               << MRS_PARAM<int>("pTTC", point)
00083             // << MRS_PARAM<int>("rTTC", configuration.rTTC)
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     // Restore previous configuration
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 }

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