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