Main Page   Modules   Namespace List   Class Hierarchy   Data Structures   File List   Namespace Members   Data Fields   Globals   Related Pages  

Sequence.cpp

Go to the documentation of this file.
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     //Check first
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     

Generated on Mon Dec 15 19:36:16 2003 for SCT DAQ/DCS Software by doxygen1.3-rc3