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 virtual void shutdown() { };
00045 static CalibrationControllerImpl & initialize(RunControl& rc);
00046
00050
00051 static Sct_CalibrationController::CalibrationController_ptr instance();
00052
00057 virtual Sct_CalibrationController::ScanLibrary_ptr getScanLibrary();
00058 virtual Sct_CalibrationController::TestLibrary_ptr getTestLibrary();
00059 virtual Sct_CalibrationController::SequenceLibrary_ptr getSequenceLibrary();
00060 virtual void doScan(Sct_CalibrationController::ScanRequest_ptr r);
00061 virtual void doTest(Sct_CalibrationController::TestRequest_ptr t);
00062 virtual void doSequence(Sct_CalibrationController::SequenceRequest_ptr r);
00063 virtual void abort();
00064 virtual Sct_SctApi::Scan_ptr getScan(unsigned long runNumber, unsigned long scanNumber);
00065 virtual void setUpdateOption(Sct_CalibrationController::CalibrationController::UpdateOption opt);
00066 virtual void updateWith (const char* testResultInIs, bool force);
00068
00071
00074 void setApi(Sct_SctApi::SctApiIPC_ptr api);
00075
00080 void takeControl(unsigned int runNumber);
00081
00085 void giveupControl();
00086
00090 void reset();
00092
00093
00094
00097
00101 Sct_SctApi::SctApiIPC_ptr getApi();
00102
00106 unsigned int getRunNumber() const;
00107
00111 unsigned int getNextScanNumber() const;
00113
00114 private:
00115 CalibrationControllerImpl(RunControl& rc);
00116 virtual ~CalibrationControllerImpl();
00117 void updateStatus();
00118
00119 bool isInControl();
00120 bool isBusy();
00121 void setBusy(bool busy);
00122 Sct_SctApi::SctApiIPC_ptr m_api;
00123
00128 void executeSequence(Sct_CalibrationController::SequenceRequest_ptr sr);
00129
00135 auto_ptr<Test> executeTest(Sct_CalibrationController::TestRequest_ptr tr, boost::shared_ptr<const Sequence> s);
00136
00142 void executeScan (Sct_CalibrationController::ScanRequest_ptr s, unsigned int index);
00143
00149 void applyChanges(const unsigned long runNumber, const unsigned long scanNumber, const std::list<std::string>& list );
00150
00155 void sctApiError(SctApiAccessException& e);
00156
00161 void setNextScanNumber(unsigned int scanNumber);
00162
00166 static std::list<string> getAllModulesForScan(Sct_SctApi::Scan_ptr scan);
00167
00168 CalibrationControllerStatus status;
00169 RunControl& rc;
00170 unsigned int runNumber;
00171 unsigned int nextScanNumber;
00172 volatile bool abortNow;
00173 volatile bool abortRightNow;
00174 static CalibrationControllerImpl * inst;
00175 static CalibrationControllerImpl * underlyingInstance() { return inst; };
00176 boost::thread_group m_sequence_request_thread_group;
00177
00178 friend class SequenceRequestWorker;
00179 };
00180 }
00181
00182 #endif //#ifndef CALIBRATIONCONTROLLERIMPL_H