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