00001 // ===================================================================== 00021 // ===================================================================== 00022 #ifndef __TVMEDAUGHTERBOARDMEMORYMODULE_HH 00023 #define __TVMEDAUGHTERBOARDMEMORYMODULE_HH 00024 00025 #include "Tglobals.h" 00026 #include "TVmeModule.hh" 00027 00028 class TDataElement; 00029 class TVmeMpx201aModule; 00030 00031 00051 class TVmeDaughterBoardMemoryModule 00052 : public TVmeModule 00053 { 00054 00055 public: 00056 enum { tDataUnderflow = SHRT_MIN, tDataOverflow = SHRT_MAX }; 00057 00058 private: 00059 Tint theNumberOfSampling; 00060 00061 public: 00062 TVmeDaughterBoardMemoryModule( Toff_t offset, Tint mapsize, Tint nblock, Tint nch = 1 ); 00063 TVmeDaughterBoardMemoryModule( const TVmeMpx201aModule* mpx201a, Tint nch = 1 ); 00064 TVmeDaughterBoardMemoryModule( const TVmeDaughterBoardMemoryModule& right ); 00065 ~TVmeDaughterBoardMemoryModule(); 00066 00067 public: 00068 const TVmeDaughterBoardMemoryModule& operator=( const TVmeDaughterBoardMemoryModule& right ); 00069 Tbool operator==( const TVmeDaughterBoardMemoryModule& right ) const; 00070 Tbool operator!=( const TVmeDaughterBoardMemoryModule& right ) const; 00071 00072 public: 00073 Tint GetNumberOfSampling() const; 00074 Tvoid SetNumberOfSampling( Tint nsamples ); 00075 00076 public: 00077 Tint Clear(); 00078 Tint Update(); 00079 Tint Initialize(); 00080 Tvoid FillData( TDataElement& element, Tint channel ); 00081 00082 private: 00083 Tshort modifyData( Tlong databuf ) const; 00084 00085 }; 00086 00087 inline Tint TVmeDaughterBoardMemoryModule::GetNumberOfSampling() const 00088 { 00089 return theNumberOfSampling; 00090 } 00091 00092 inline Tvoid TVmeDaughterBoardMemoryModule::SetNumberOfSampling( Tint nsamples ) 00093 { 00094 theNumberOfSampling = nsamples; 00095 return; 00096 } 00097 00098 inline Tshort TVmeDaughterBoardMemoryModule::modifyData( Tlong databuf ) const 00099 { 00100 if ( ( databuf & 0x0000fff0 ) == 0x7ff0 ) { 00101 // overflow 00102 return tDataOverflow; 00103 } else if ( ( databuf & 0x0000fff0 ) == 0x8000 ) { 00104 // underflow 00105 return tDataUnderflow; 00106 } 00107 00108 Tshort retval = (Tshort)( databuf & 0x0000fff0 ); 00109 Tbit sign = ( retval & 0x8000 ) >> 15; 00110 if ( sign == 1 ) { 00111 // case of negative value 00112 retval &= 0x7ff0; 00113 retval = retval >> 4; 00114 } else if ( sign == 0 ) { 00115 // case of positive value 00116 retval = retval >> 4; 00117 retval += 0x0800; 00118 } else { 00119 Tcerr << "TVmeDaughterBoardMemoryModule::modifyData: failed." << Tendl; 00120 } 00121 00122 return retval; 00123 } 00124 00125 #endif