Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Related Pages

MarkSpaceRatioTest.h

00001 #ifndef SCTCALIBRATIONCONTROLLER_MARKSPACERATIOTEST_H
00002 #define SCTCALIBRATIONCONTROLLER_MARKSPACERATIOTEST_H
00003 
00004 #include "../ipc/TestRequest.h"
00005 #include "../ipc/CalibrationController.h"
00006 #include "../ipc/ScanLibrary.h"
00007 #include "../ipc/CalibrationController.hh"
00008 
00009 #include "../SctApiAccessException.h"
00010 #include "../SctApiCall.h"
00011 #include "../CalibrationControllerImpl.h"
00012 #include "Sct/LogicErrors.h"
00013 #include "Sct/StdExceptionWrapper.h"
00014 #include "SctApi/extraScans.h"
00015 
00016 #include "sctConfIPC/configipc.h"
00017 
00018 #include <CommonWithDsp/ABCD/ABCDscans.h>
00019 #include <iostream>
00020 #include <vector>
00021 
00022 using namespace Sct;
00023 using namespace std;
00024 using namespace SctCalibrationController::Ipc;
00025 using namespace SctCalibrationController;
00026 
00027 namespace SctCalibrationController {
00028 namespace Scripts {
00029     
00030 class MarkSpaceRatioTest : public TestRequestImpl {
00031 private:
00032    static const bool registeredInTestLibrary;
00033 
00034 public:
00035    static Sct_CalibrationController::TestRequest_ptr instance() {
00036     static MarkSpaceRatioTest rt;
00037     return rt._this();
00038     }
00039    
00040    virtual void startTestRealImpl(Sct_SctApi::SctApiIPC_ptr the_api, string& name, unsigned short& testVariable, unsigned long& nScans, vector<double>& testPoints) {   
00041      this->api = Sct_SctApi::SctApiIPC::_duplicate(the_api);
00042      // No masked channels
00043      name = "MarkSpaceRatioTest";
00044      testVariable = ST_TX_MARKSPACE;
00045      
00046      for (unsigned i=0; i<31; i+=2){
00047        register_values.push_back(i);
00048      }
00049 
00050      nScans = 0;
00051 
00052      // do twice - before and after bit-flip.
00053      for (unsigned i=0; i<2; ++i){
00054        for (vector<int>::const_iterator value=register_values.begin(); 
00055         value!= register_values.end(); ++value){
00056      ++nScans;
00057      testPoints.push_back(*value);
00058        }
00059      }
00060      Sct_SctApi::BankList banks;
00061      banks.length(1);
00062      banks[0]=Sct_SctApi::SCAN_CONFIG;
00063      APICALL(api, modifyABCDVar(ST_FEEDTHROUGH, 0), "MarkSpaceRatioTest:startTest error setting feedthrough on API");
00064      APICALL(api, setABCDModules(banks),"MarkSpaceRatioTest:startTest error setting feedthrough on ROD"); 
00065      APICALL(api, sendABCDModules(Sct_SctApi::SCAN_CONFIG), "MarkSpaceRatioTest:startTest error setting feedthrough to MODULES");
00066    }
00067    
00068    virtual Sct_CalibrationController::ScanRequest_ptr getNextScanRealImpl(unsigned long index) {
00069      Sct_CalibrationController::ScanLibrary_var sl = CalibrationControllerImpl::instance()->getScanLibrary();
00070      const bool issueSoftReset = false;
00071      Sct_CalibrationController::ScanRequest_ptr request = sl->rawScan(nTriggers, issueSoftReset);
00072 
00073      request->setWidthCorba(1024);
00074      request->setConfigureModulesCorba(false);
00075 
00076      Sct_SctApi::Scan_var scan = request->getScanCorba();
00077      Sct_SctApi::Trigger_var t;
00078 
00079      APICALL(scan, setOption(Sct_SctApi::Scan::enableDataMode, 0), "MarkSpaceRatioTest : failed to disable dataMode")
00080      APIRETCALL(scan, t, getTrigger1(), "Failed to get Trigger1")       
00081      APICALL(t, singleL1A(), "Failed to set trigger type")
00082 
00083      float msr = register_values[index%register_values.size()];
00084      APICALL(api, modifyABCDVar(ST_TX_MARKSPACE, msr), "MarkSpaceRatioTest coulndt set MSR");
00085 
00086      APICALL(scan, configure(ST_RX_DELAY, 0, 24, 1), "Failed to set Scan information")
00087 
00088      // half-way through send a bit-flip
00089      if (index==register_values.size()) sendOddNumberOfBits();
00090 
00091      return request;
00092    }
00093     
00094     virtual bool canFeedbackRealImpl() {
00095     return true;
00096     }
00097     
00098     virtual void endTestRealImpl() {
00099       APICALL(api, modifyABCDVar(ST_FEEDTHROUGH, 1), "MarkSpaceRatioTest:endTest error unsetting feedthrough on API");
00100       APICALL(api, setABCDModules(Sct_SctApi::SCAN_CONFIG),"MarkSpaceRatioTest:endTest error unsetting feedthrough on ROD"); 
00101       APICALL(api, sendABCDModules(Sct_SctApi::SCAN_CONFIG), "MarkSpaceRatioTest:endTest error unsetting feedthrough to MODULES");
00102 
00103       api = Sct_SctApi::SctApiIPC::_nil();
00104       register_values.clear();
00105     }
00106 
00107     virtual void sendOddNumberOfBits(){
00108       using std::list;
00109       try{
00110     boost::shared_ptr<SctConfiguration::Configuration> config(new SctConfiguration::ConfigIPC);
00111     
00112     Sct_SctApi::Trigger_var trig;    
00113     APIRETCALL(api, trig, createTrigger(), "MarkSpaceRatioTest: Couldn't create trigger")
00114     APICALL(trig, soft(), "Failed to set trigger type")
00115 
00116     //send to all modules
00117     list<unsigned> partitions=config->listPartitions();
00118     for (list<unsigned>::const_iterator p=partitions.begin(); p!=partitions.end(); ++p){
00119       list<unsigned> crates=config->listCratesInPartition(*p);
00120       for (list<unsigned>::const_iterator c=crates.begin(); c!=crates.end(); ++c){
00121         list<unsigned> rods=config->listRodsInCrate(*p, *c);
00122         for (list<unsigned>::const_iterator r=rods.begin(); r!=rods.end(); ++r){
00123           std::cout << "MarkSpaceRatio: sendTrigger ("<<*p<<", "<<*c<<", "<<*r<<", soft)"<<std::endl;
00124           APICALL(api, sendTrigger(*p, *c, *r, trig), "MarkSpaceRatioTest Could not send trigger")
00125         }
00126       }
00127         }
00128        }catch (std::exception& e){
00129      throw Sct::StdExceptionWrapper(e, __FILE__, __LINE__);
00130        }
00131     }
00132 
00133 private:
00134     vector<int> register_values;
00135     MarkSpaceRatioTest() {}
00136     Sct_SctApi::SctApiIPC_var api;    
00137     static const int nTriggers = 1;
00138 };
00139 }
00140 }
00141 #endif //SCTCALIBRATIONCONTROLLER_MARKSPACERATIOTEST_H

Generated on Fri Sep 16 18:01:53 2005 for SCT DAQ/DCS Software - C++ by doxygen 1.3.5