00001 #include "Sequence.h"
00002 #include "SequenceMap.h"
00003 #include "Sct/IoExceptions.h"
00004 #include "Sct/LogicErrors.h"
00005 #include "Sct/SctNames.h"
00006 #include <iostream>
00007 #include <sstream>
00008 #include <algorithm>
00009 #include <boost/date_time/posix_time/posix_time.hpp>
00010
00011 using namespace std;
00012 using namespace Sct;
00013 using namespace boost::posix_time;
00014
00015 namespace SctCalibrationController {
00016
00017 Sequence::Sequence(const string& name, unsigned long runNumber, unsigned long startScanNumber, const list<string>& l) {
00018
00019 data.sequenceName = name;
00020 data.runNumber = runNumber;
00021 data.startScanNumber = startScanNumber;
00022 data.nTests = 0;
00023 data.testNames_size = 0;
00024 realSize = 10;
00025 data.testNames = new string[realSize];
00026 string startTime = to_iso_string(second_clock::universal_time());
00027 data.startTime = startTime.substr(0, 15);
00028
00029 data.modules = new string[l.size()];
00030 data.modules_size = l.size();
00031 unsigned int count = 0;
00032 for (list<string>::const_iterator i=l.begin(); i!=l.end(); ++i, ++count) {
00033 data.modules[count] = *i;
00034 }
00035
00036
00037 cout << "Create TestSequenceImpl: " << data.sequenceName << " Id: " << getUniqueID() << endl;
00038
00039 publish();
00040 }
00041
00042 Sequence::~Sequence() {
00043 cout << "Destroy TestSequenceImpl: " << data.sequenceName << " Id: " << getUniqueID() << endl;
00044 withdraw();
00045 }
00046
00047 shared_ptr<Sequence> Sequence::create(const string& name, unsigned long runNumber, unsigned long startScanNumber, const list<string>& list) {
00048 shared_ptr<Sequence> seq(new Sequence(name, runNumber, startScanNumber, list));
00049 SequenceMap::instance().addSequence(seq);
00050 return seq;
00051 }
00052
00053 list<string> Sequence::getModuleList() const{
00054 list<string> list;
00055 for (unsigned int i=0; i<data.modules_size; ++i) {
00056 list.push_back(data.modules[i]);
00057 }
00058 return list;
00059 }
00060
00061 string Sequence::getUniqueID() const {
00062 ostringstream s;
00063 s << "SequenceData." << data.runNumber << "." << data.startScanNumber;
00064 return s.str();
00065 }
00066
00067 void Sequence::addTest(auto_ptr<Test> test) {
00068 cout << test.get() << endl;
00069 tests.push_back(shared_ptr<Test>(test));
00070 cout << data.nTests << endl;
00071 ++data.nTests;
00072 cout << data.nTests << endl;
00073
00074 if (data.nTests >= realSize) {
00075 realSize *= 2;
00076 string* testNames = new string[realSize];
00077 for (unsigned int i=0; i<data.nTests; ++i) {
00078 testNames[i] = tests[i]->getUniqueID();
00079 }
00080 delete [] data.testNames;
00081 data.testNames = testNames;
00082 } else {
00083 data.testNames[data.nTests-1] = tests[data.nTests-1]->getUniqueID();
00084 }
00085 data.testNames_size = data.nTests;
00086 publish();
00087 }
00088
00089 shared_ptr<Test> Sequence::getTest(unsigned int index) const {
00090 if (index >= data.nTests) {
00091 ostringstream s;
00092 s << "Tried to getTest with index: " << index << " but only " << data.nTests << " available in Sequence: " << getUniqueID();
00093 throw InvalidArgumentError(s.str(), __FILE__, __LINE__);
00094 }
00095 return tests[index];
00096 }
00097
00098 const SequenceData& Sequence::getData() const {
00099 return data;
00100 }
00101
00102 void Sequence::setStatus(SequenceData::status_E status) {
00103
00104 if (data.status == SequenceData::ABORTED && status != SequenceData::ABORTED) {
00105 throw InvalidArgumentError("Can't change status from ABORTED in Sequence: " + getUniqueID(), __FILE__, __LINE__);
00106 }
00107 if (data.status == SequenceData::COMPLETED && status != SequenceData::COMPLETED) {
00108 throw InvalidArgumentError("Can't change status from COMPLETED in Sequence: " + getUniqueID(), __FILE__, __LINE__);
00109 }
00110 if (data.status != status && (status == SequenceData::COMPLETED || status == SequenceData::ABORTED)) {
00111 string endTime = to_iso_string(second_clock::universal_time());
00112 data.endTime = endTime.substr(0, 15);
00113 }
00114
00115 data.status = status;
00116 publish();
00117 }
00118
00119 void Sequence::publish() {
00120 string name = SctNames::getControlDataName();
00121 name += ".";
00122 name += getUniqueID();
00123 ISInfoDictionary& is = SctNames::getISDictionary();
00124 ISInfo::Status s;
00125
00126 if (is.contains(name.c_str())) {
00127 s = is.update(name.c_str(), data);
00128 } else {
00129 s = is.insert(name.c_str(), data);
00130 }
00131
00132 if (s != ISInfo::Success) {
00133 IsException error(s, "Sequence::publish failed", __FILE__, __LINE__);
00134 error.sendToMrs(MRS_DIAGNOSTIC);
00135 }
00136 }
00137
00138 void Sequence::withdraw() {
00139 string name = SctNames::getControlDataName();
00140 name += ".";
00141 name += getUniqueID();
00142 ISInfoDictionary& is = SctNames::getISDictionary();
00143 ISInfo::Status s;
00144
00145 s = is.remove(name.c_str());
00146 if (s == ISInfo::CommFailure) {
00147 IsException error(s, "Sequence::withdraw failed", __FILE__, __LINE__);
00148 error.sendToMrs(MRS_DIAGNOSTIC);
00149 }
00150 }
00151
00152 }
00153