1/*
2 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_MODULES_RTP_RTCP_TEST_BWESTANDALONE_MATLABPLOT_H_
12#define WEBRTC_MODULES_RTP_RTCP_TEST_BWESTANDALONE_MATLABPLOT_H_
13
14#include <list>
15#include <string>
16#include <vector>
17
18#include "webrtc/typedefs.h"
19
20namespace webrtc {
21class CriticalSectionWrapper;
22class EventWrapper;
23class ThreadWrapper;
24}
25
26//#define PLOT_TESTING
27
28#ifdef MATLAB
29
30typedef struct engine Engine;
31typedef struct mxArray_tag mxArray;
32
33class MatlabLine
34{
35    friend class MatlabPlot;
36
37public:
38    MatlabLine(int maxLen = -1, const char *plotAttrib = NULL, const char *name = NULL);
39    ~MatlabLine();
40    virtual void Append(double x, double y);
41    virtual void Append(double y);
42    void SetMaxLen(int maxLen);
43    void SetAttribute(char *plotAttrib);
44    void SetName(char *name);
45    void Reset();
46    virtual void PurgeOldData() {};
47
48    void UpdateTrendLine(MatlabLine * sourceData, double slope, double offset);
49
50    double xMin();
51    double xMax();
52    double yMin();
53    double yMax();
54
55protected:
56    void GetPlotData(mxArray** xData, mxArray** yData);
57    std::string GetXName();
58    std::string GetYName();
59    std::string GetPlotString();
60    std::string GetRefreshString();
61    std::string GetLegendString();
62    bool hasLegend();
63    std::list<double> _xData;
64    std::list<double> _yData;
65    mxArray* _xArray;
66    mxArray* _yArray;
67    int _maxLen;
68    std::string _plotAttribute;
69    std::string _name;
70};
71
72
73class MatlabTimeLine : public MatlabLine
74{
75public:
76    MatlabTimeLine(int horizonSeconds = -1, const char *plotAttrib = NULL, const char *name = NULL,
77        int64_t refTimeMs = -1);
78    ~MatlabTimeLine() {};
79    void Append(double y);
80    void PurgeOldData();
81    int64_t GetRefTime();
82
83private:
84    int64_t _refTimeMs;
85    int _timeHorizon;
86};
87
88
89class MatlabPlot
90{
91    friend class MatlabEngine;
92
93public:
94    MatlabPlot();
95    ~MatlabPlot();
96
97    int AddLine(int maxLen = -1, const char *plotAttrib = NULL, const char *name = NULL);
98    int AddTimeLine(int maxLen = -1, const char *plotAttrib = NULL, const char *name = NULL,
99        int64_t refTimeMs = -1);
100    int GetLineIx(const char *name);
101    void Append(int lineIndex, double x, double y);
102    void Append(int lineIndex, double y);
103    int Append(const char *name, double x, double y);
104    int Append(const char *name, double y);
105    int Length(char *name);
106    void SetPlotAttribute(char *name, char *plotAttrib);
107    void Plot();
108    void Reset();
109    void SmartAxis(bool status = true) { _smartAxis = status; };
110    void SetFigHandle(int handle);
111    void EnableLegend(bool enable) { _legendEnabled = enable; };
112
113    bool TimeToPlot();
114    void Plotting();
115    void DonePlotting();
116    void DisablePlot();
117
118    int MakeTrend(const char *sourceName, const char *trendName, double slope, double offset, const char *plotAttrib = NULL);
119
120#ifdef PLOT_TESTING
121    int64_t _plotStartTime;
122    int64_t _plotDelay;
123#endif
124
125private:
126    void UpdateData(Engine* ep);
127    bool GetPlotCmd(std::ostringstream & cmd, Engine* ep);
128    void GetPlotCmd(std::ostringstream & cmd); // call inside crit sect
129    void GetRefreshCmd(std::ostringstream & cmd); // call inside crit sect
130    void GetLegendCmd(std::ostringstream & cmd);
131    bool DataAvailable();
132
133    std::vector<MatlabLine *> _line;
134    int _figHandle;
135    bool _smartAxis;
136    double _xlim[2];
137    double _ylim[2];
138    webrtc::CriticalSectionWrapper *_critSect;
139    bool _timeToPlot;
140    bool _plotting;
141    bool _enabled;
142    bool _firstPlot;
143    bool _legendEnabled;
144    webrtc::EventWrapper* _donePlottingEvent;
145};
146
147
148class MatlabEngine
149{
150public:
151    MatlabEngine();
152    ~MatlabEngine();
153
154    MatlabPlot * NewPlot(MatlabPlot *newPlot);
155    void DeletePlot(MatlabPlot *plot);
156
157private:
158    static bool PlotThread(void *obj);
159
160    std::vector<MatlabPlot *> _plots;
161    webrtc::CriticalSectionWrapper *_critSect;
162    webrtc::EventWrapper *_eventPtr;
163    webrtc::ThreadWrapper* _plotThread;
164    bool _running;
165    int _numPlots;
166};
167
168#endif //MATLAB
169
170#endif // WEBRTC_MODULES_RTP_RTCP_TEST_BWESTANDALONE_MATLABPLOT_H_
171