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
00022 class CalibrationControllerImpl : public CalibrationController, public boost::noncopyable {
00023 public:
00024 static CalibrationControllerImpl& initialize(RunControl& rc);
00025 static CalibrationControllerImpl& instance();
00026
00027
00028 virtual ScanLibrary& getScanLibrary() const;
00029 virtual TestLibrary& getTestLibrary() const;
00030 virtual SequenceLibrary& getSequenceLibrary() const;
00031 virtual void doScan (Sct_SctApi_T_Scan* s);
00032 virtual void doTest (boost::shared_ptr<TestRequest> t);
00033 virtual void doSequence (boost::shared_ptr<SequenceRequest> r);
00034 virtual void abort();
00035 virtual Sct_SctApi_T_Scan* getScan(unsigned long runNumber, unsigned long scanNumber) const;
00036 virtual void setUpdateOption( Sct_CalibrationController_T_CalibrationController_UpdateOption );
00037
00038
00039 void setApi(Sct_SctApi_T_SctApi& api);
00040 void takeControl(unsigned int runNumber);
00041 void giveupControl();
00042 void reset();
00043
00044
00045 void executeSequence(SequenceRequest& sr);
00046 auto_ptr<Test> executeTest(TestRequest& tr);
00047 void executeScan (Sct_SctApi_T_Scan* s, unsigned int index);
00048 Sct_SctApi_T_SctApi* getApi() const;
00049 unsigned int getRunNumber() const;
00050 unsigned int getNextScanNumber() const;
00051
00052 void applyChanges(const unsigned long runNumber, const unsigned long scanNumber, const std::list<std::string>& list );
00053
00054
00055
00056 private:
00057 CalibrationControllerImpl(RunControl& rc);
00058 virtual ~CalibrationControllerImpl();
00059 void updateStatus();
00060
00061 bool isInControl();
00062 bool isBusy();
00063 void setBusy(bool busy);
00064 Sct_SctApi_T_SctApi* api;
00065
00066 void sctApiError(SctApiException& e);
00067 void setNextScanNumber(unsigned int scanNumber);
00068
00072 static std::list<string> getAllModulesForScan(Sct_SctApi_T_Scan* scan);
00073
00074 CalibrationControllerStatus status;
00075 RunControl& rc;
00076 unsigned int runNumber;
00077 unsigned int nextScanNumber;
00078 bool abortNow;
00079 static CalibrationControllerImpl* inst;
00080
00081 boost::thread_group m_sequence_request_thread_group;
00082
00083 friend class SequenceRequestWorker;
00084 };
00085 }
00086
00087 #endif //#ifndef CALIBRATIONCONTROLLERIMPL_H