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
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
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
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
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