00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "mimotera++/MimoteraWriter.hh"
00025 #include "mimotera++/MimoteraEvent.hh"
00026 #include "mimotera++/MimoteraException.hh"
00027 #include "mimotera++/MimoteraUtils.hh"
00028
00029
00030 #include <iostream>
00031 #include <fstream>
00032 #include <sys/types.h>
00033 #include <sys/stat.h>
00034 #include <cerrno>
00035
00036 using namespace std;
00037
00038 namespace Mimotera {
00039
00040
00041 MimoteraWriter::MimoteraWriter( const char * filename, WritingMode_t mode ) {
00042
00043
00044 _iEvt = 0;
00045 _currentPosition = 0;
00046 _previousPosition = 0;
00047 _mimoteraFile = NULL;
00048
00049
00050 if ( _mimoteraFile ) {
00051
00052
00053 _mimoteraFile->close();
00054 delete _mimoteraFile;
00055 _mimoteraFile = NULL;
00056 }
00057
00058 const unsigned short trash = 0xAAAA;
00059 for ( size_t iPos = 0; iPos < kTrashSize; ++iPos ) {
00060 _tempTrash[ iPos ] = trash;
00061 }
00062
00063
00064 ios::openmode iosmode = ios_base::binary | ios_base::out;
00065
00066 if ( mode == NEW ) {
00067
00068
00069 struct stat statbuf;
00070 int status = stat( filename, &statbuf );
00071 if ( status == 0 ) {
00072
00073 MIMOTERA_THROWX( FileAlreadyExistingException, "File " + to_string( filename ) + " already exists. " );
00074 }
00075
00076 } else if ( mode == APPEND ) {
00077
00078 iosmode |= ios_base::app ;
00079
00080 } else if ( mode == RECREATE ) {
00081
00082 iosmode |= ios_base::trunc ;
00083
00084 } else {
00085
00086 MIMOTERA_THROWX( UnknownWritingModeException, "Please check the opening mode" );
00087
00088 }
00089
00090 _mimoteraFile = new ofstream( filename, iosmode );
00091
00092 if ( _mimoteraFile ) {
00093 _hasValidFile = true ;
00094 } else {
00095 _hasValidFile = false;
00096 MIMOTERA_THROWX( FileException, "Unknown error opening file " + to_string( filename ) );
00097 }
00098
00099
00100 }
00101
00102
00103 off_t MimoteraWriter::writeEvent(MimoteraEvent * event) {
00104
00105 _previousPosition = _currentPosition;
00106
00107
00108 _mimoteraFile->write( reinterpret_cast< char * > ( event->frameA() ), kSubFrameSize ) ;
00109 _mimoteraFile->write( reinterpret_cast< char * > ( event->frameB() ), kSubFrameSize ) ;
00110
00111
00112 unsigned short gl0s = event->info()->_globalFrameNo & 0xFFFF;
00113 unsigned short gl1s = (event->info()->_globalFrameNo & 0xFFFF0000) >> 16;
00114
00115 _tempHeader[0] = getbigendian<unsigned short>( reinterpret_cast< const unsigned char *> ( &( gl1s ) ) );
00116 _tempHeader[1] = getbigendian<unsigned short>( reinterpret_cast< const unsigned char *> ( &( gl0s ) ) );
00117 _tempHeader[2] = getbigendian<unsigned short>( reinterpret_cast< const unsigned char *> ( &(event->info()->_frameInPacket) ) );
00118 _tempHeader[3] = getbigendian<unsigned short>( reinterpret_cast< const unsigned char *> ( &(event->info()->_triggeredFrameAB) ) );
00119 _tempHeader[4] = getbigendian<unsigned short>( reinterpret_cast< const unsigned char *> ( &(event->info()->_triggerNo) ) );
00120
00121
00122 _mimoteraFile->write( reinterpret_cast< char * > ( _tempHeader ), kMimoteraInfoSize ) ;
00123
00124
00125 _mimoteraFile->write( reinterpret_cast< char * > ( _tempTrash ), kTrashSize ) ;
00126
00127
00128 _currentPosition = _mimoteraFile->tellp();
00129
00130 if ( ( _currentPosition - _previousPosition != kEventSize ) ) {
00131 MIMOTERA_THROWX( FileWriteException, "Wrong event size (" + to_string( _currentPosition - _previousPosition ) + to_string( " bytes)." ));
00132 }
00133
00134 ++_iEvt;
00135
00136 return _currentPosition - _previousPosition ;
00137 }
00138
00139
00140 MimoteraWriter::~MimoteraWriter() {
00141
00142 if ( ! _mimoteraFile ) {
00143 _mimoteraFile->close();
00144 delete _mimoteraFile;
00145 }
00146 }
00147
00148
00149
00150 MimoteraWriter * MimoteraWriter_create_cpp( const char * filename, WritingMode_t mode ) {
00151 return new MimoteraWriter( filename, mode );
00152 }
00153
00154 void MimoteraWriter_dispose_cpp( MimoteraWriter * writer ) {
00155 if ( writer ) delete writer;
00156 writer = NULL;
00157 }
00158
00159 off_t MimoteraWriter_writeEvent_cpp( MimoteraWriter * writer, MimoteraEvent * event ) {
00160 if ( writer ) {
00161 return writer->writeEvent( event );
00162 } else {
00163 return 0;
00164 }
00165 }
00166
00167 void MimoteraWriter_close_cpp( MimoteraWriter * writer ) {
00168 if ( writer ) {
00169 writer->close() ;
00170 }
00171 }
00172
00173
00174 }
00175