www.pudn.com > qtdso-0.3.1.rar > dsowid.h


//======================================================================
// File:		dsowid.h
// Author:	Matthias Toussaint
// Created:	Sun Jun  9 22:27:14 CEST 2002
//----------------------------------------------------------------------
// Permission to use, copy, modify, and distribute this software and its
// documentation  for any  purpose and  without fee is  hereby  granted,
// provided  that below copyright notice appear  in all copies  and that
// both  that  copyright  notice and  this permission  notice  appear in
// supporting documentation.
// 
// This  file is  provided AS IS  with no  warranties  of any kind.  The
// author shall  have no liability  with respect  to the infringement of
// copyrights, trade  secrets  or any patents by  this file  or any part
// thereof.  In no event will the author be liable  for any lost revenue
// or profits or other special, indirect and consequential damages.
//----------------------------------------------------------------------
// (c) 2000-2002 Matthias Toussaint
//======================================================================

#ifndef DSOWID_HH
#define DSOWID_HH

#include 
#include 
#include 

#include 

#include 

#define MAX_FFT_BUFFER_LENGTH 10000

class DampedFloat;
class ConverterHistogramDlg;
class SimulatorWid;

class DsoWid : public QWidget
{
  Q_OBJECT
public:
  enum MathMode
  {
    NoMath,
    Add,
    Sub,
    Magnitude
  };
  
  enum MouseMode
  {
    Time1,
    Time2,
    Time3,
    Amplitude1,
    Amplitude2,
    Freq,
    Db1,
    Db2,
    None
  };
    
  enum TimeMarkerMode
  {
    Off = 0,
    TimeMarker,
    RatioMarker
  };
    
  enum Mode
  {
    DSO = 0,
    XY,
    FFT,
    NumMode
  };
    
  enum FFTType
  {
    Power = 0,
    Phase
  };
    
  enum FFTGridMode
  {
    Lin = 0,
    Log
  };
    
  enum FFTWindow
  {
    Rectangle=0,
    Bartlett,
    BartlettHann,
    Blackman,
    BlackmanHarris,
    Gaussian,
    Hamming,
    Hann,
    Welch,
    KaiserBessel,
    FlatTop,
    NumFFTWindows
  };
    
  enum Interpolation
  {
    Dots=0,
    Linear,
    LinearAverage,
    SinX
  };
    
  enum FFTDisplayMode
  {
    RT = 0,
    Minimum,
    Average,
    Maximum    
  };
    
  enum FFTDrawMode
  {
    Line = 0,
    Needles,
    Points
  };
    
  enum FrameRate
  {
    FR5 = 0,
    FR10,
    FR20,
    FR25,
    FR30
  };
    
  enum ValueType
  {
    Frequency = 0,
    Time,
    Voltage,
    Ratio
  };
    
  DsoWid( QWidget *parent=0, const char *name=0 );
  virtual ~DsoWid();

  static QColor bgColor;
  static QColor gridColor;
  static QColor borderColor;
  static QColor chColor[3];
  static QColor chChangedColor[3];
  static QColor addColor;
  static QColor subColor;
  static QColor timeColor;
  static QColor amplitudeColor;
  static int    s_lineWidth;
  static int    s_lineWidthFft;
    
  int fftZoom() const { return m_fftZoom; }
  int step() const { return m_dso->step(); }
  int fftSize() const { return m_fftSize; }
  int sinXLength() const { return m_sinXLength; }
  void setFftBufferLength( int );
  
  QImage snapshot();
  void print( QPrinter *prt );
  
  bool selectModel( Dso::Model );

  static QString floatValueString( float value, ValueType type, int prec=3 );
  float samplingFrequency() const { return m_dso->samplingFrequency(); }
  
  int frameRate() const;
  
  Dso *dso() const { return m_dso; }
  
signals:
  void dynamicRange( int, int, int, int, int );
  void fps( float );
  void triggerOk( bool );
  void scrollMe( int );
  void dsoChanged();
  
public slots:
  void setXOffSLOT( int );
  void setMathOffSLOT(int );
  void setShowAmplitudeMarkerSLOT( bool );
  void setShowTimeMarkerSLOT( TimeMarkerMode );
  void setMathModeSLOT( int );
  void setShowChannel1SLOT( bool );
  void setShowChannel2SLOT( bool );
  void setModeSLOT( DsoWid::Mode );
  void setTimeBaseSLOT( Dso::TimeBase );
  void setVoltsDivSLOT( int, Dso::VoltsDiv );
  void setTriggerLevelSLOT( int );
  void setTriggerSLOT( bool );
  void setTriggerRaisingSLOT( bool );
  void setTriggerChannelSLOT( int );
  void setTriggerExternalSLOT( bool );
  void setDrawTriggerLineSLOT( bool );
  void setStretchSLOT( int, float );
  void setMathStretchSLOT( float );
  void setStepSLOT( int );
  void setFftWindowSLOT( int );
  void setFftFreqSLOT( Dso::TimeBase );
  void setFftZoomSLOT( int );
  void setFftPostMagSLOT( float );
  void setFftSizeSLOT( int );
  void setFftSizeFreeSLOT( int );
  void setFftDisplaySLOT( int );
  void setFftShowPeaksSLOT( bool );
  void setFftTypeSLOT( int );
  void setInterpolSLOT( DsoWid::Interpolation );
  void setFftWindowNameSLOT( const QString & );
  void setYOffsetSLOT( int, int );
  void setDcOffsetSLOT( int, int );
  void setFrameRateSLOT( FrameRate );
  void setContinuousSamplingSLOT( bool );
  void singleShotSLOT();
  void flushFftAverageBufferSLOT();
  void setFftDrawModeSLOT( int channel, FFTDrawMode );
  void setProbeSLOT( int channel, float probe );
  void applyPrefsSLOT();
  void setChannelOpSLOT( bool invCh1, bool absCh1, bool invCh2, bool absCh2 );
  void setFftScaleSLOT( int );
  void fastAcqSLOT( bool );
  void setTriggerStabilizerSLOT( bool );
  void equivalentSamplingSLOT( bool );
  void histogramSLOT();
  void dcOffsetSLOT();
  void resetEnvelopeSLOT();
  void setEnvelopeSLOT( bool );
  
protected:
  Dso           *m_dso;
  QPixmap        m_buffer;
  int            m_fh;
  int            m_tw;
  int            m_xOff;
  int            m_yOff[3];
  int           *m_data[3];
  int            m_dcOffset[3];
  float         *m_fftOut;
  float         *m_fftOutBuffer[2][MAX_FFT_BUFFER_LENGTH];
  float         *m_fftOutAv[2];
  int            m_fftOutAvPointer[2];
  int            m_fftOutAvCounter[2];
  fftw_complex  *m_fftwIn;
  fftw_complex  *m_fftwOut;
  QPointArray   *m_arr;
  QPointArray   *m_arr2;
  QPointArray   *m_arr3;
  int            m_timeMarker[3];
  int            m_freqMarker;
  int            m_amplitudeMarker[2];
  int            m_dbMarker[2];
  TimeMarkerMode m_timeMarkerMode;
  bool           m_showAmplitudeMarker;
  MathMode       m_mathMode;
  bool           m_showChannel[3];
  MouseMode      m_moving;
  int            m_x0;
  int            m_y0;
  Mode           m_mode;
  Dso::TimeBase  m_tb[NumMode];
  bool           m_drawTriggerLine;
  float          m_stretch[3];
  int            m_legWidth;
  float          m_window[NumFFTWindows-1][FFT_SIZE_MAX];
  int            m_fftWindow;
  int            m_fftZoom;
  float          m_fftPostMag;
  int            m_x;
  int            m_y;
  int            m_fftSize;
  bool           m_fftShowPeaks;
  FFTType        m_fftType;
  fftw_plan      m_fftw_plan;
  float         *m_sinXRegister;
  float         *m_sinXCoeff;
  int            m_sinXLength;
  int            m_sinXPointer;
  Interpolation  m_interpolation;
  QString        m_windowName;
  FFTDisplayMode m_fftDisplayMode;
  int            m_updateTimer;
  FrameRate      m_frameRate;
  bool           m_continuousSampling;
  float         *m_fftOutSum[2];
  char          *m_wisdomString;
  int            m_fftAverageBufferLength;
  FFTDrawMode    m_fftDrawMode[2];
  FFTGridMode    m_fftGridMode;
  float          m_maxFftVal;
  float          m_probe[3];
  DampedFloat   *m_vpp[2];
  DampedFloat   *m_rms[2];
  DampedFloat   *m_freq[2];
  int            m_averageSample[2];
  int            m_minSample[2];
  int            m_maxSample[2];
  int           *m_envelopeMin[3];
  int           *m_envelopeMax[3];
  bool           m_drawMeasuredVolts;
  bool           m_hasData;
  bool           m_invCh[3];
  bool           m_absCh[3];
  ButtonState    m_mouseButton;
  int            m_updateTime;
  int            m_comeAgainTimer;
  int            m_realFrameRate;
  SimulatorWid  *m_simWid;
  Dso::Model     m_model;
  bool           m_showEnvelope;
  float          m_dataStretch;
  int            m_triggerOffset;
  bool           m_triggerStabilizer;
  
  ConverterHistogramDlg *m_converterHistogram;
  
  void resizeEvent( QResizeEvent * );
  void paintEvent( QPaintEvent * );
  void timerEvent( QTimerEvent * );
  void mousePressEvent( QMouseEvent * );
  void mouseMoveEvent( QMouseEvent * );
  void mouseReleaseEvent( QMouseEvent *ev );  
  
  void drawGrid( QPainter *, bool );
  void drawFFTGrid( QPainter *, bool );
  
  void drawChannel( QPainter *, int, bool );
  void drawEnvelope( QPainter *, int, bool );
  
  void drawTimeMarker( QPainter *, bool );
  void drawFreqMarker( QPainter *, bool );
  void drawAmplitudeMarker( QPainter *, bool );
  void drawDbMarker( QPainter *, bool );
  
  void drawDiv( QPainter *, int, bool );
  
  void drawDSO( QPainter *, bool );
  void drawXY( QPainter *, bool );
  void drawFFT( QPainter *, bool );
  
  void doMath();
  void fft( int );
  
  void fillFFTWindows();
  float computeFreqScaleStep();
  float computeFreqScaleStepLog();
  void showFftPeaks( QPainter *, float );
  
  void createSinXInterpol();
  inline float sinXFilter( float );
  
  void readFromDso();
  
  float frequency( int, bool * ) const;
  float rms( int channel );
  
  void paint( QPaintDevice *, bool bw=false );
  float volts( int channel, float value ) const;
  
  void init();
  void internalAdjustSize();
  int mathSample( int, int ) const;

  void setDsoAcqLength();
  
  void drawPoints( QPainter *p, int channel, int numPoints, bool print ) const;
  void drawLine( QPainter *p, int channel, int numPoints, bool print ) const;

};

inline float
DsoWid::sinXFilter( float sample )
{
  // feed into filter
  //
  m_sinXRegister[m_sinXPointer] = sample;
  
  // compute sum
  //
  float sum = 0.0;
  
  for (int i=0, j=m_sinXPointer; ivoltsDiv( channel ) * 255.0 / (float)m_dso->maxValue();
}

inline int
DsoWid::mathSample( int channel, int i ) const
{
  if (m_absCh[channel])
  {
    if (m_invCh[channel])
    {
      return m_dcOffset[channel] - abs( m_data[channel][i]  - m_dcOffset[channel]);
    }
    else
    {
      return abs( m_data[channel][i] - m_dcOffset[channel] );
    }
  }
  else if (m_invCh[channel])
  {
    return ( m_dcOffset[channel] - m_data[channel][i] );
  }

  return m_data[channel][i] - m_dcOffset[channel];
}

#endif // DSOWID_HH