00001 // ===================================================================== 00002 // $Id: TVmeDaughterBoardMemoryModule.hh,v 1.1.1.1 2003/06/27 02:56:41 goiwai Exp $ 00003 // $Name: CLDAQ-1-06-00 $ 00004 // ===================================================================== 00005 #ifndef __TVMEDAUGHTERBOARDMEMORYMODULE_HH 00006 #define __TVMEDAUGHTERBOARDMEMORYMODULE_HH 00007 00008 #include "Tglobals.h" 00009 #include "TVmeModule.hh" 00010 00011 class TDataElement; 00012 class TVmeMpx201aModule; 00013 00014 class TVmeDaughterBoardMemoryModule 00015 : public TVmeModule 00016 { 00017 00018 public: 00019 enum { tDataUnderflow = SHRT_MIN, tDataOverflow = SHRT_MAX }; 00020 00021 private: 00022 Tint theNumberOfSampling; 00023 00024 public: 00025 TVmeDaughterBoardMemoryModule( Toff_t offset, Tint mapsize, Tint nblock, Tint nch = 1 ); 00026 TVmeDaughterBoardMemoryModule( const TVmeMpx201aModule* mpx201a, Tint nch = 1 ); 00027 TVmeDaughterBoardMemoryModule( const TVmeDaughterBoardMemoryModule& right ); 00028 ~TVmeDaughterBoardMemoryModule(); 00029 00030 public: 00031 const TVmeDaughterBoardMemoryModule& operator=( const TVmeDaughterBoardMemoryModule& right ); 00032 Tbool operator==( const TVmeDaughterBoardMemoryModule& right ) const; 00033 Tbool operator!=( const TVmeDaughterBoardMemoryModule& right ) const; 00034 00035 public: 00036 Tint GetNumberOfSampling() const; 00037 Tvoid SetNumberOfSampling( Tint nsamples ); 00038 00039 public: 00040 Tint Clear(); 00041 Tint Update(); 00042 Tint Initialize(); 00043 Tvoid FillData( TDataElement& element, Tint channel ); 00044 00045 private: 00046 Tshort modifyData( Tlong databuf ) const; 00047 00048 }; 00049 00050 inline Tint TVmeDaughterBoardMemoryModule::GetNumberOfSampling() const 00051 { 00052 return( theNumberOfSampling ); 00053 } 00054 00055 inline Tvoid TVmeDaughterBoardMemoryModule::SetNumberOfSampling( Tint nsamples ) 00056 { 00057 theNumberOfSampling = nsamples; 00058 return; 00059 } 00060 00061 inline Tshort TVmeDaughterBoardMemoryModule::modifyData( Tlong databuf ) const 00062 { 00063 if ( ( databuf & 0x0000fff0 ) == 0x7ff0 ) { 00064 // overflow 00065 return( tDataOverflow ); 00066 } else if ( ( databuf & 0x0000fff0 ) == 0x8000 ) { 00067 // underflow 00068 return( tDataUnderflow ); 00069 } 00070 00071 Tshort retval = (Tshort)( databuf & 0x0000fff0 ); 00072 Tbit sign = ( retval & 0x8000 ) >> 15; 00073 if ( sign == 1 ) { 00074 // case of negative value 00075 retval &= 0x7ff0; 00076 retval = retval >> 4; 00077 } else if ( sign == 0 ) { 00078 // case of positive value 00079 retval = retval >> 4; 00080 retval += 0x0800; 00081 } else { 00082 Tcerr << "TVmeDaughterBoardMemoryModule::modifyData: failed." << Tendl; 00083 } 00084 00085 return( retval ); 00086 } 00087 00088 #endif