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

Generated on Mon Feb 6 14:01:29 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6