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
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<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