1 //
2 // This file is part of the aMule Project.
3 //
4 // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5 // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net )
6 //
7 // Any parts of this program derived from the xMule, lMule or eMule project,
8 // or contributed by third-party developers are copyrighted by their
9 // respective authors.
10 //
11 // This program is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation; either version 2 of the License, or
14 // (at your option) any later version.
15 //
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with this program; if not, write to the Free Software
23 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
24 //
25 
26 #ifndef OSCOPECTRL_H
27 #define OSCOPECTRL_H
28 
29 #ifndef NULL
30 #define NULL 0
31 #endif
32 
33 #include <vector>
34 #include <wx/control.h>		// Needed for wxControl
35 #include <wx/timer.h>		// Needed for wxTimer
36 #include <wx/pen.h>
37 #include <wx/bitmap.h>
38 #include <wx/colour.h>
39 
40 #include "Constants.h"		// Needed for StatsGraphType
41 
42 class wxMemoryDC;
43 
44 /////////////////////////////////////////////////////////////////////////////
45 // COScopeCtrl window
46 
47 class COScopeCtrl : public wxControl
48 {
49 	friend class CStatisticsDlg;
50 
51 public:
52 	COScopeCtrl(int NTrends, int nDecimals, StatsGraphType type, wxWindow* parent = NULL);
53 	~COScopeCtrl();
54 
55 	void SetRange(float dLower, float dUpper, unsigned iTrend = 0);
56 	void SetRanges(float dLower, float dUpper);
57 	void SetYUnits(const wxString& string,
58 		const wxString& YMin = wxEmptyString, const wxString& YMax = wxEmptyString);
59 	void SetBackgroundColor(const wxColour& color);
60 	void SetGridColor(const wxColour& color);
61 	void SetPlotColor(const wxColour& color, unsigned iTrend = 0);
GetUpperLimit()62 	float GetUpperLimit()		{ return pdsTrends[0].fUpperLimit; }
63 	void Reset(double sNewPeriod);
64 	void Stop();
65 	void RecreateGraph(bool bRefresh=true);
66 	void RecreateGrid();
67 	void AppendPoints(double sTimestamp, const std::vector<float *> &apf);
DelayPoints()68 	void DelayPoints()		{ nDelayedPoints++; }
69 
70 	StatsGraphType graph_type;
71 
72 public:
73 	unsigned nTrends;
74 	unsigned nXGrids;
75 	unsigned nYGrids;
76 	unsigned nShiftPixels;         // amount to shift with each new point
77 	unsigned nYDecimals;
78 
79 	wxString strXUnits;
80 	wxString strYUnits, strYMin, strYMax;
81 	wxColour m_bgColour;
82 	wxColour m_gridColour;
83 
84 	typedef struct PlotDataStruct {
85 		wxColour crPlot;	       // data plot color
86 		wxPen  penPlot;
87 		unsigned yPrev;
88 		float fPrev;
89 		float fLowerLimit;         // lower bounds
90 		float fUpperLimit;         // upper bounds
91 		float fVertScale;
92 	} PlotData_t ;
93 
94 
95 protected:
96 	DECLARE_EVENT_TABLE()
97 	PlotData_t *pdsTrends;
98 
99 	wxRect	m_rectClient;
100 	wxRect	m_rectPlot;
101 	wxBrush	brushBack;
102 	wxBitmap m_bmapGrid;
103 	wxBitmap m_bmapPlot;
104 
InvalidateGraph()105 	void InvalidateGraph()	{ InvalidateCtrl(true, false); }
InvalidateGrid()106 	void InvalidateGrid()	{ InvalidateCtrl(false, true); }
107 
108 private:
109 	bool bRecreateGrid, bRecreateGraph, bRecreateAll, bStopped;
110 	int nDelayedPoints;
111 	double sLastTimestamp;
112 	double sLastPeriod;
113 	wxTimer timerRedraw;
114 	bool m_onPaint;
115 
116 	void OnTimer(wxTimerEvent& evt);
117 	void OnPaint(wxPaintEvent& evt);
118 	void OnSize(wxSizeEvent& evt);
119 	void ShiftGraph(unsigned cntPoints);
120 	void PlotHistory(unsigned cntPoints, bool bShiftGraph, bool bRefresh);
121 	void DrawPoints(const std::vector<float *> &apf, unsigned cntPoints);
122 	unsigned GetPlotY(float fPlot, PlotData_t* ppds);
123 	void InvalidateCtrl(bool bInvalidateGraph = true, bool bInvalidateGrid = true);
124 };
125 
126 #endif // OSCOPECTRL_H
127 // File_checked_for_headers
128