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