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

Generated on Fri Sep 16 18:01:58 2005 for SCT DAQ/DCS Software - C++ by doxygen 1.3.5