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