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 SctApiException; 00020 using namespace Ipc; 00021 00035 class CalibrationControllerImpl : public CalibrationController, public boost::noncopyable { 00036 public: 00037 static CalibrationControllerImpl& initialize(RunControl& rc); 00038 static CalibrationControllerImpl& instance(); 00039 00040 //Overrides 00041 virtual ScanLibrary& getScanLibrary() const; 00042 virtual TestLibrary& getTestLibrary() const; 00043 virtual SequenceLibrary& getSequenceLibrary() const; 00044 virtual void doScan (Sct_SctApi_T_Scan* s); 00045 virtual void doTest (boost::shared_ptr<TestRequest> t); 00046 virtual void doSequence (boost::shared_ptr<SequenceRequest> r); 00047 virtual void abort(); 00048 virtual Sct_SctApi_T_Scan* getScan(unsigned long runNumber, unsigned long scanNumber) const; 00049 virtual void setUpdateOption( Sct_CalibrationController_T_CalibrationController_UpdateOption ); 00050 00051 //Internal for communication with RunControl: 00052 void setApi(Sct_SctApi_T_SctApi& api); 00053 void takeControl(unsigned int runNumber); 00054 void giveupControl(); 00055 void reset(); 00056 00057 //Internal for use by other classes 00058 void executeSequence(SequenceRequest& sr); 00059 auto_ptr<Test> executeTest(TestRequest& tr); 00060 void executeScan (Sct_SctApi_T_Scan* s, unsigned int index); 00061 Sct_SctApi_T_SctApi* getApi() const; 00062 unsigned int getRunNumber() const; 00063 unsigned int getNextScanNumber() const; 00064 00065 void applyChanges(const unsigned long runNumber, const unsigned long scanNumber, const std::list<std::string>& list ); 00066 00067 //static void applyChangesCallback(ISCallbackInfo * isc); 00068 00069 private: 00070 CalibrationControllerImpl(RunControl& rc); 00071 virtual ~CalibrationControllerImpl(); 00072 void updateStatus(); 00073 00074 bool isInControl(); 00075 bool isBusy(); 00076 void setBusy(bool busy); 00077 Sct_SctApi_T_SctApi* api; 00078 00079 void sctApiError(SctApiException& e); 00080 void setNextScanNumber(unsigned int scanNumber); 00081 00085 static std::list<string> getAllModulesForScan(Sct_SctApi_T_Scan* scan); 00086 00087 CalibrationControllerStatus status; 00088 RunControl& rc; 00089 unsigned int runNumber; 00090 unsigned int nextScanNumber; 00091 bool abortNow; 00092 static CalibrationControllerImpl* inst; 00093 00094 boost::thread_group m_sequence_request_thread_group; 00095 00096 friend class SequenceRequestWorker; 00097 }; 00098 } 00099 00100 #endif //#ifndef CALIBRATIONCONTROLLERIMPL_H