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

Sequence.cpp

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     //Check first
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     

Generated on Thu Jul 15 09:50:53 2004 for SCT DAQ/DCS Software - C++ by doxygen 1.3.5