#include "slsDetectorActions.h" #include #include #include using namespace std; /** set action \param iaction can be enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript, MAX_ACTIONS} \param fname for script ("" disable but leaves script unchanged, "none" disables and overwrites) \returns 0 if action disabled, >0 otherwise */ int slsDetectorActions::setAction(int iaction, string fname, string par) { int am; if (iaction>=0 && iaction=0 && iaction=0 && iaction=0 && iaction=0 && iaction0 otherwise */ int slsDetectorActions::setScan(int iscan, string script, int nvalues, double *values, string par, int precision) { if (iscan>=0 && iscan=0) { // cout << "nvalues " << nvalues << endl; if (nvalues==0) scanMode[iscan]=noScan; else { nScanSteps[iscan]=nvalues; if (nvalues>MAX_SCAN_STEPS) nScanSteps[iscan]=MAX_SCAN_STEPS; } } if (values && scanMode[iscan]>0 ) { for (int iv=0; iv=0) scanPrecision[iscan]=precision; if (scanMode[iscan]>0){ *actionMask |= 1<< (iscan+MAX_ACTIONS); } else { *actionMask &= ~(1 << (iscan+MAX_ACTIONS)); } setTotalProgress(); return scanMode[iscan]; } else return -1; } int slsDetectorActions::setScanScript(int iscan, string script) { if (iscan>=0 && iscan0){ *actionMask |= (1 << (iscan+MAX_ACTIONS)); } else { *actionMask &= ~(1 << (iscan+MAX_ACTIONS)); } setTotalProgress(); #ifdef VERBOSE cout << "Action mask is " << hex << actionMask << dec << endl; #endif return scanMode[iscan]; } else return -1; } int slsDetectorActions::setScanParameter(int iscan, string par) { if (iscan>=0 && iscan=0 && iscan=0) scanPrecision[iscan]=precision; return scanMode[iscan]; } else return -1; } int slsDetectorActions::setScanSteps(int iscan, int nvalues, double *values) { if (iscan>=0 && iscan=0) { if (nvalues==0) scanMode[iscan]=noScan; else { nScanSteps[iscan]=nvalues; if (nvalues>MAX_SCAN_STEPS) nScanSteps[iscan]=MAX_SCAN_STEPS; } } if (values) { for (int iv=0; iv0){ *actionMask |= (1 << (iscan+MAX_ACTIONS)); } else { *actionMask &= ~(1 << (iscan+MAX_ACTIONS)); } #ifdef VERBOSE cout << "Action mask is " << hex << actionMask << dec << endl; #endif setTotalProgress(); return scanMode[iscan]; } else return -1; } /** returns scan script \param iscan can be (0,1) \returns scan script */ string slsDetectorActions::getScanScript(int iscan){ if (iscan>=0 && iscan=0 && iscan=0 && iscan=0 && iscan=0 && iscanMAX_SCAN_LEVELS) return -1; currentScanVariable[level]=getScanStep(level,istep); currentScanIndex[level]=istep; switch(scanMode[level]) { case energyScan: setThresholdEnergy((int)currentScanVariable[level]); //energy scan break; case thresholdScan: setDAC((dacs_t)currentScanVariable[level],THRESHOLD,0); // threshold scan break; case dacScan: setDAC((dacs_t)currentScanVariable[level],(slsDetectorDefs::dacIndex)atoi(getScanParameter(level).c_str()),0); break; case trimbitsScan: trimbit=(int)currentScanVariable[level]; if(getDetectorsType() == EIGER) setAllTrimbits(trimbit); else setChannel((trimbit<<((int)TRIMBIT_OFF))|((int)COMPARATOR_ENABLE)); // trimbit scan break; case positionScan: //check if channels are connected! moveDetector(currentScanVariable[level]); break; case noScan: currentScanVariable[level]=0; break; case scriptScan: //Custom scan script level 1. The arguments are passed as nrun=n fn=filename var=v par=p" sprintf(cmd,"%s nrun=%d fn=%s var=%f par=%s",getScanScript(level).c_str(),getFileIndex(),createFileName().c_str(),currentScanVariable[level],getScanParameter(level).c_str()); #ifdef VERBOSE cout << "Executing scan script "<< level << " " << cmd << endl; #endif system(cmd); break; default: cout << "Scan mode unknown "<< level << " " <