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