00001 // Author Antonio Bulgheroni, <mailto:antonio.bulgheroni@gmail.com> 00002 // Copyright 2009 Antonio Bulgheroni 00003 00004 // $Rev:: 58 $: Revision of the last commit 00005 // $Author:: drhilbert $: Author of the last commit 00006 // $Date:: 2009-09-16 10:49:05 +0200 (Wed, 16 Sep 2009) $: Date of the last commit 00007 00008 // This file is part of Mimotera++. 00009 // 00010 // Mimotera++ is free software: you can redistribute it and/or modify 00011 // it under the terms of the GNU Lesser General Public License as published by 00012 // the Free Software Foundation, either version 3 of the License, or 00013 // (at your option) any later version. 00014 // 00015 // Mimotera++ is distributed in the hope that it will be useful, 00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 // GNU Lesser General Public License for more details. 00019 // 00020 // You should have received a copy of the GNU Lesser General Public License 00021 // along with Mimotera++. If not, see <http://www.gnu.org/licenses/>. 00022 00023 #include "mimotera++/MimoteraEvent.hh" 00024 #include "mimotera++/MimoteraUtils.hh" 00025 #include "mimotera++/MimoteraDecoder.hh" 00026 00027 #include <iostream> 00028 00029 using namespace std; 00030 00031 namespace Mimotera{ 00032 00033 void MimoteraInfo::print(ostream & os ) const { 00034 char frame = 'A'; 00035 if (( ( _triggeredFrameAB ) & 0xFF00 ) == 0xFF00 ) { 00036 frame = 'B'; 00037 } 00038 00039 os << "Global Frame No : " << _globalFrameNo << endl 00040 << "Frame in packet : " << _frameInPacket << endl 00041 << "TriggeredFrame : " << ((_triggeredFrameAB) & 0xFF ) << endl 00042 << "A or B? : " << frame << endl 00043 << "Trigger No : " << _triggerNo; 00044 00045 } 00046 00047 ostream & operator<<( ostream& os, const MimoteraInfo& info ) { 00048 info.print( os ); 00049 return os; 00050 } 00051 00052 00053 MimoteraEvent::MimoteraEvent() { 00054 _info = new MimoteraInfo; 00055 _dataArrays = new DataArrays_t; 00056 _cDataArrays = new CDataArrays_t; 00057 _areArraysReady = false; 00058 00059 // initialize the frame array. It is needed only when writing back 00060 // the event to the disk. 00061 Pixel_t markerValue = -2047; 00062 for ( size_t iPixel = 0; iPixel < kXPixel * kYPixel ; ++iPixel ) { 00063 _subFrameA[ iPixel ] = getbigendian< Pixel_t > ( reinterpret_cast< const unsigned char * > ( &markerValue ) ); 00064 _subFrameB[ iPixel ] = getbigendian< Pixel_t > ( reinterpret_cast< const unsigned char * > ( &markerValue ) ); 00065 } 00066 00067 } 00068 00069 MimoteraEvent::~MimoteraEvent() { 00070 00071 if ( _info ) delete _info; 00072 _info = NULL; 00073 if ( _dataArrays ) delete _dataArrays; 00074 _dataArrays = NULL; 00075 if ( _cDataArrays ) delete _cDataArrays; 00076 _cDataArrays = NULL; 00077 00078 00079 } 00080 00081 DataArrays_t * MimoteraEvent::getArrays() { 00082 00083 if ( _areArraysReady ) return _dataArrays; 00084 00085 MimoteraDecoder decoder; 00086 00087 size_t iPos = 0; 00088 00089 for ( Coord_t y = 0 ; y < kYPixel; ++y ) { 00090 for ( Coord_t x = 0 ; x < kXPixel - ( kMarkersPerRow * kChan ) ; ++x ) { 00091 _dataArrays->_x[ iPos ] = x ; 00092 _dataArrays->_y[ iPos ] = y ; 00093 00094 _cDataArrays->_x[ iPos ] = _dataArrays->_x[ iPos ]; 00095 _cDataArrays->_y[ iPos ] = _dataArrays->_y[ iPos ]; 00096 00097 size_t rawPosition = decoder.getRawPosition( x, y ); 00098 _dataArrays->_frameA[ iPos ] = getbigendian< Pixel_t > ( reinterpret_cast< const unsigned char * > ( &_subFrameA[ rawPosition ] ) ); 00099 _dataArrays->_frameB[ iPos ] = getbigendian< Pixel_t > ( reinterpret_cast< const unsigned char * > ( &_subFrameB[ rawPosition ] ) ); 00100 00101 _cDataArrays->_frameA[ iPos ] = _dataArrays->_frameA[ iPos ]; 00102 _cDataArrays->_frameB[ iPos ] = _dataArrays->_frameB[ iPos ]; 00103 00104 ++iPos; 00105 } 00106 } 00107 00108 _areArraysReady = true; 00109 return _dataArrays; 00110 00111 } 00112 00113 CDataArrays_t * MimoteraEvent::getCArrays() { 00114 00115 00116 if ( _areArraysReady ) return _cDataArrays; 00117 00118 MimoteraDecoder decoder; 00119 00120 size_t iPos = 0; 00121 00122 for ( Coord_t y = 0 ; y < kYPixel; ++y ) { 00123 for ( Coord_t x = 0 ; x < kXPixel - ( kMarkersPerRow * kChan ) ; ++x ) { 00124 _dataArrays->_x[ iPos ] = x ; 00125 _dataArrays->_y[ iPos ] = y ; 00126 00127 _cDataArrays->_x[ iPos ] = _dataArrays->_x[ iPos ]; 00128 _cDataArrays->_y[ iPos ] = _dataArrays->_y[ iPos ]; 00129 00130 size_t rawPosition = decoder.getRawPosition( x, y ); 00131 _dataArrays->_frameA[ iPos ] = getbigendian< Pixel_t > ( reinterpret_cast< const unsigned char * > ( &_subFrameA[ rawPosition ] ) ); 00132 _dataArrays->_frameB[ iPos ] = getbigendian< Pixel_t > ( reinterpret_cast< const unsigned char * > ( &_subFrameB[ rawPosition ] ) ); 00133 00134 _cDataArrays->_frameA[ iPos ] = _dataArrays->_frameA[ iPos ]; 00135 _cDataArrays->_frameB[ iPos ] = _dataArrays->_frameB[ iPos ]; 00136 00137 ++iPos; 00138 } 00139 } 00140 00141 _areArraysReady = true; 00142 return _cDataArrays; 00143 00144 } 00145 00146 void MimoteraEvent::setArrays( DataArrays_t * dataArrays ) { 00147 00148 _dataArrays->_x = dataArrays->_x; 00149 _dataArrays->_y = dataArrays->_y; 00150 _dataArrays->_frameA = dataArrays->_frameA; 00151 _dataArrays->_frameB = dataArrays->_frameB; 00152 00153 size_t iPos = 0; 00154 00155 for ( Coord_t y = 0 ; y < kYPixel; ++y ) { 00156 for ( Coord_t x = 0 ; x < kXPixel - ( kMarkersPerRow * kChan ) ; ++x ) { 00157 00158 _cDataArrays->_x[ iPos ] = _dataArrays->_x[ iPos ]; 00159 _cDataArrays->_y[ iPos ] = _dataArrays->_y[ iPos ]; 00160 _cDataArrays->_frameA[ iPos ] = _dataArrays->_frameA[ iPos ]; 00161 _cDataArrays->_frameB[ iPos ] = _dataArrays->_frameB[ iPos ]; 00162 ++iPos; 00163 } 00164 } 00165 00166 MimoteraDecoder decoder; 00167 size_t index; 00168 vector< Coord_t > x = _dataArrays->_x; 00169 vector< Coord_t > y = _dataArrays->_y; 00170 vector< Pixel_t > a = _dataArrays->_frameA; 00171 vector< Pixel_t > b = _dataArrays->_frameB; 00172 00173 // fill in the data 00174 for (size_t iPos = 0; iPos < x.size(); ++iPos ) { 00175 index = decoder.getRawPosition( x[ iPos ], y[ iPos ] ); 00176 _subFrameA[ index ] = getbigendian< Pixel_t > ( reinterpret_cast< const unsigned char * > ( &a[ iPos ] ) ) ; 00177 _subFrameB[ index ] = getbigendian< Pixel_t > ( reinterpret_cast< const unsigned char * > ( &b[ iPos ] ) ) ; 00178 } 00179 00180 } 00181 00182 void MimoteraEvent::setArrays( CDataArrays_t * dataArrays ) { 00183 00184 size_t iPos = 0; 00185 00186 for ( Coord_t y = 0 ; y < kYPixel; ++y ) { 00187 for ( Coord_t x = 0 ; x < kXPixel - ( kMarkersPerRow * kChan ) ; ++x ) { 00188 00189 _cDataArrays->_x[ iPos ] = dataArrays->_x[ iPos ]; 00190 _cDataArrays->_y[ iPos ] = dataArrays->_y[ iPos ]; 00191 _cDataArrays->_frameA[ iPos ] = dataArrays->_frameA[ iPos ]; 00192 _cDataArrays->_frameB[ iPos ] = dataArrays->_frameB[ iPos ]; 00193 00194 _dataArrays->_x[ iPos ] = dataArrays->_x[ iPos ]; 00195 _dataArrays->_y[ iPos ] = dataArrays->_y[ iPos ]; 00196 _dataArrays->_frameA[ iPos ] = dataArrays->_frameA[ iPos ]; 00197 _dataArrays->_frameB[ iPos ] = dataArrays->_frameB[ iPos ]; 00198 ++iPos; 00199 } 00200 } 00201 00202 MimoteraDecoder decoder; 00203 size_t index; 00204 vector< Coord_t > x = _dataArrays->_x; 00205 vector< Coord_t > y = _dataArrays->_y; 00206 vector< Pixel_t > a = _dataArrays->_frameA; 00207 vector< Pixel_t > b = _dataArrays->_frameB; 00208 00209 // fill in the data 00210 for (size_t iPos = 0; iPos < x.size(); ++iPos ) { 00211 index = decoder.getRawPosition( x[ iPos ], y[ iPos ] ); 00212 _subFrameA[ index ] = getbigendian< Pixel_t > ( reinterpret_cast< const unsigned char * > ( &a[ iPos ] ) ) ; 00213 _subFrameB[ index ] = getbigendian< Pixel_t > ( reinterpret_cast< const unsigned char * > ( &b[ iPos ] ) ) ; 00214 } 00215 00216 } 00217 00218 void MimoteraEvent::setInfo( MimoteraInfo * info ) { 00219 00220 _info->_globalFrameNo = info->_globalFrameNo ; 00221 _info->_triggerNo = info->_triggerNo ; 00222 _info->_frameInPacket = info->_frameInPacket ; 00223 _info->_triggeredFrameAB = info->_triggeredFrameAB ; 00224 00225 } 00226 00227 // C++ wrappers of C functions 00228 MimoteraEvent * MimoteraEvent_create_cpp() { 00229 return new MimoteraEvent; 00230 } 00231 00232 void MimoteraEvent_dispose_cpp( MimoteraEvent * event ) { 00233 if ( event ) { 00234 delete event; 00235 event = NULL; 00236 } 00237 } 00238 00239 MimoteraInfo * MimoteraEvent_getInfo_cpp( MimoteraEvent * event ) { 00240 if ( event == NULL ) return NULL; 00241 return event->info(); 00242 } 00243 00244 void MimoteraEvent_setInfo_cpp( MimoteraEvent * event, MimoteraInfo * info ) { 00245 if ( event == NULL ) return ; 00246 event->setInfo( info ); 00247 } 00248 00249 Pixel_t * MimoteraEvent_getFrameA_cpp( MimoteraEvent * event ) { 00250 if ( event == NULL ) return NULL; 00251 return event->frameA(); 00252 } 00253 00254 Pixel_t * MimoteraEvent_getFrameB_cpp( MimoteraEvent * event ) { 00255 if ( event == NULL ) return NULL; 00256 return event->frameB(); 00257 } 00258 00259 CDataArrays_t * MimoteraEvent_getDataArrays_cpp( MimoteraEvent * event ) { 00260 if ( event == NULL ) return NULL; 00261 return event->getCArrays(); 00262 } 00263 00264 void MimoteraEvent_setDataArrays_cpp( MimoteraEvent * event, CDataArrays_t * dataArrays ) { 00265 if ( event == NULL ) return; 00266 event->setArrays( dataArrays ); 00267 } 00268 00269 }