00001 #ifndef CALIBRATIONCONTROLLERIMPL_H 00002 #define CALIBRATIONCONTROLLERIMPL_H 00003 00004 #include "ipc/CalibrationController.h" 00005 #include "IS/CalibrationControllerStatus.h" 00006 #include <boost/noncopyable.hpp> 00007 #include <boost/thread.hpp> 00008 #include <boost/shared_ptr.hpp> 00009 00010 #include <memory> 00011 00012 using std::auto_ptr; 00013 00014 namespace SctCalibrationController { 00015 00016 class Test; 00017 class ConfigUpdater; 00018 class RunControl; 00019 class SctApiAccessException; 00020 class Sequence; 00021 00022 using namespace Ipc; 00023 00039 class CalibrationControllerImpl : public CalibrationController, private boost::noncopyable { 00040 public: 00044 static CalibrationControllerImpl& initialize(RunControl& rc); 00045 00049 static CalibrationControllerImpl& instance(); 00050 00055 virtual ScanLibrary& getScanLibrary() const; 00056 virtual TestLibrary& getTestLibrary() const; 00057 virtual SequenceLibrary& getSequenceLibrary() const; 00058 virtual void doScan( boost::shared_ptr<ScanRequest> r); 00059 virtual void doTest (boost::shared_ptr<TestRequest> t); 00060 virtual void doSequence (boost::shared_ptr<SequenceRequest> r); 00061 virtual void abort(); 00062 virtual Sct_SctApi_T_Scan* getScan(unsigned long runNumber, unsigned long scanNumber) const; 00063 virtual void setUpdateOption( Sct_CalibrationController_T_CalibrationController_UpdateOption ); 00064 virtual void updateWith (ilu_T_CString testResultInIs); 00066 00069 00072 void setApi(Sct_SctApi_T_SctApi& api); 00073 00078 void takeControl(unsigned int runNumber); 00079 00083 void giveupControl(); 00084 00088 void reset(); 00090 00091 00092 00095 00099 Sct_SctApi_T_SctApi* getApi() const; 00100 00104 unsigned int getRunNumber() const; 00105 00109 unsigned int getNextScanNumber() const; 00111 00112 private: 00113 CalibrationControllerImpl(RunControl& rc); 00114 virtual ~CalibrationControllerImpl(); 00115 void updateStatus(); 00116 00117 bool isInControl(); 00118 bool isBusy(); 00119 void setBusy(bool busy); 00120 Sct_SctApi_T_SctApi* api; 00121 00126 void executeSequence(SequenceRequest& sr); 00127 00133 auto_ptr<Test> executeTest(TestRequest& tr, boost::shared_ptr<const Sequence> s); 00134 00140 void executeScan (ScanRequest& s, unsigned int index); 00141 00147 void applyChanges(const unsigned long runNumber, const unsigned long scanNumber, const std::list<std::string>& list ); 00148 00153 void sctApiError(SctApiAccessException& e); 00154 00159 void setNextScanNumber(unsigned int scanNumber); 00160 00164 static std::list<string> getAllModulesForScan(Sct_SctApi_T_Scan* scan); 00165 00166 CalibrationControllerStatus status; 00167 RunControl& rc; 00168 unsigned int runNumber; 00169 unsigned int nextScanNumber; 00170 volatile bool abortNow; 00171 volatile bool abortRightNow; 00172 static CalibrationControllerImpl* inst; 00173 00174 boost::thread_group m_sequence_request_thread_group; 00175 00176 friend class SequenceRequestWorker; 00177 }; 00178 } 00179 00180 #endif //#ifndef CALIBRATIONCONTROLLERIMPL_H