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 00020 namespace SctCalibrationController { 00021 00022 class Test; 00023 class ConfigUpdater; 00024 class RunControl; 00025 class SctApiAccessException; 00026 class Sequence; 00027 00028 using namespace Ipc; 00029 00045 class CalibrationControllerImpl : public CalibrationController, private boost::noncopyable { 00046 public: 00050 virtual void shutdown() { }; 00051 static CalibrationControllerImpl & initialize(RunControl& rc); 00052 00056 //static CalibrationControllerImpl& instance(); 00057 static Sct_CalibrationController::CalibrationController_ptr instance(); 00058 00063 virtual Sct_CalibrationController::ScanLibrary_ptr getScanLibrary(); 00064 virtual Sct_CalibrationController::TestLibrary_ptr getTestLibrary(); 00065 virtual Sct_CalibrationController::SequenceLibrary_ptr getSequenceLibrary(); 00066 virtual void doScan(Sct_CalibrationController::ScanRequest_ptr r); 00067 virtual void doTest(Sct_CalibrationController::TestRequest_ptr t); 00068 virtual void doSequence(Sct_CalibrationController::SequenceRequest_ptr r); 00069 virtual void abort(); 00070 virtual Sct_SctApi::Scan_ptr getScan(unsigned long runNumber, unsigned long scanNumber); 00071 virtual void setUpdateOption(Sct_CalibrationController::CalibrationController::UpdateOption opt); 00072 virtual void updateWith (const char* testResultInIs, bool force); 00074 00077 00080 void setApi(Sct_SctApi::SctApiIPC_ptr api); 00081 00086 void takeControl(unsigned int runNumber); 00087 00091 void giveupControl(); 00092 00096 void reset(); 00098 00099 00100 00103 00107 Sct_SctApi::SctApiIPC_ptr getApi(); 00108 00112 unsigned int getRunNumber() const; 00113 00117 unsigned int getNextScanNumber() const; 00119 00120 private: 00121 CalibrationControllerImpl(RunControl& rc); 00122 virtual ~CalibrationControllerImpl(); 00123 void updateStatus(); 00124 00125 bool isInControl(); 00126 bool isBusy(); 00127 void setBusy(bool busy); 00128 Sct_SctApi::SctApiIPC_ptr m_api; 00129 00134 void executeSequence(Sct_CalibrationController::SequenceRequest_ptr sr); 00135 00141 auto_ptr<Test> executeTest(Sct_CalibrationController::TestRequest_ptr tr, boost::shared_ptr<const Sequence> s); 00142 00148 void executeScan (Sct_CalibrationController::ScanRequest_ptr s, unsigned int index); 00149 00155 void applyChanges(const unsigned long runNumber, const unsigned long scanNumber, const std::list<std::string>& list ); 00156 00161 void sctApiError(SctApiAccessException& e); 00162 00167 void setNextScanNumber(unsigned int scanNumber); 00168 00172 static std::list<std::string> getAllModulesForScan(Sct_SctApi::Scan_ptr scan); 00173 00174 CalibrationControllerStatus status; 00175 RunControl& rc; 00176 unsigned int runNumber; 00177 unsigned int nextScanNumber; 00178 volatile bool abortNow; 00179 volatile bool abortRightNow; 00180 static CalibrationControllerImpl * inst; 00181 static CalibrationControllerImpl * underlyingInstance() { return inst; }; 00182 boost::thread_group m_sequence_request_thread_group; 00183 00184 friend class SequenceRequestWorker; 00185 }; 00186 } 00187 00188 #endif //#ifndef CALIBRATIONCONTROLLERIMPL_H