Generic hardware access library
/home/cschwick/hal/utilities/src/common/PersistentCommandSequencer.cc
Go to the documentation of this file.
00001 #include "hal/PersistentCommandSequencer.hh"
00002 #include <vector>
00003 #include <fstream>
00004 
00005 HAL::PersistentCommandSequencer::PersistentCommandSequencer( std::string configurationFile,
00006                                                              const AddressTableInterface& addressTable )
00007   throw(IllegalOperationException)
00008   : configurationFile( configurationFile ),
00009     addressTable( addressTable ) { 
00010   loadSequences();
00011 }
00012 
00013 HAL::PersistentCommandSequencer::~PersistentCommandSequencer() {
00014   saveSequences();
00015 }
00016 
00017 void HAL::PersistentCommandSequencer::loadSequences() {
00018 
00019   std::string word;
00020   std::fstream configurationStream;
00021   configurationStream.open( configurationFile.c_str(), std::ios::in );
00022 
00023   if ( configurationStream.fail() ) { 
00024     std::cout << "Cannot open configuration-file " << configurationFile
00025          << "\n     (HAL::PersistentCommandSequencer::loadSequences)" << std::endl;
00026   } else {
00027     while ( ! configurationStream.eof() ) {
00028       word = "";
00029       configurationStream >> word;
00030       
00031       if (word != "") {
00032         try {
00033           std::cout << "loading sequence : " << word << std::endl;
00034           CommandSequenceASCIIReader* rd_ptr = new CommandSequenceASCIIReader( word );
00035           CommandSequence* seq_ptr = 
00036             new CommandSequence(word, 
00037                                 *rd_ptr, 
00038                                 addressTable);
00039           readerMap[ word ] = rd_ptr;
00040           CommandSequencer::registerSequence( *seq_ptr );
00041         } catch ( HardwareAccessException& e ) {
00042           std::cout << e.what() << std::endl;
00043         }
00044       }
00045     }
00046     // rewrite the configuration file to get rid of all 
00047     // errorneous sequences.
00048     saveSequences();
00049   }
00050 }
00051 
00052 void HAL::PersistentCommandSequencer::saveSequences() {
00053 
00054   std::vector<std::string> names = getNameVector();
00055   uint32_t ic;
00056   std::fstream configurationStream;
00057   configurationStream.open( configurationFile.c_str(), std::ios::out );
00058   if ( configurationStream.fail() ) { 
00059     std::cout << "Cannot open configuration-file " << configurationFile
00060          << "\n     (HAL::PersistentCommandSequencer::saveSequences)" << std::endl;
00061   } else {
00062     for( ic=0; ic < names.size(); ic++ ) {
00063       std::cout << "saving : " << names[ic] << std::endl;
00064       configurationStream << names[ic] << std::endl;
00065     }
00066   }
00067 }
00068 
00069 void HAL::PersistentCommandSequencer::registerSequence( std::string sequenceName ) { 
00070   try {
00071     CommandSequenceASCIIReader* seqrd_ptr = 
00072       new CommandSequenceASCIIReader( sequenceName );
00073     CommandSequence* seq_ptr = new CommandSequence(sequenceName, 
00074                                                    *seqrd_ptr,
00075                                                    addressTable);
00076     readerMap[sequenceName] = seqrd_ptr;
00077     CommandSequencer::registerSequence( *seq_ptr );
00078     saveSequences();
00079   } catch ( HardwareAccessException& e ) {
00080     std::cout << e.what() << std::endl;
00081   }
00082 }
00083 
00084 void HAL::PersistentCommandSequencer::deleteSequence( std::string sequenceName )
00085   throw( IllegalValueException ) {
00086   CommandSequencer::deleteSequence( sequenceName );
00087   saveSequences();
00088   delete(readerMap[ sequenceName ]);
00089   readerMap.erase( readerMap.find( sequenceName ));
00090 }
00091 
00092 void HAL::PersistentCommandSequencer::deleteSequences( ) {
00093   CommandSequencer::deleteSequences();
00094   saveSequences();
00095   readerMap.clear();
00096 }
00097