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