Go to the documentation of this file.00001 #include "../msg/msg.h"
00002 #include "../utils/utils.h"
00003 #include <dashel/dashel.h>
00004 #include <cmath>
00005 #include <QtGui>
00006 #include <cassert>
00007 #include <fstream>
00008 #include <iostream>
00009
00010 #ifdef _MSC_VER
00011 #define QWT_DLL
00012 #endif // _MSC_VER
00013
00014 #include <qwt_plot.h>
00015 #include <qwt_plot_curve.h>
00016 #include <qwt_legend.h>
00017
00018 #if QWT_VERSION >= 0x060000
00019 #include <qwt_series_data.h>
00020 #else
00021 #include <qwt_data.h>
00022 #endif
00023
00024 using namespace Dashel;
00025 using namespace Aseba;
00026 using namespace std;
00027
00028 #if QWT_VERSION >= 0x060000
00029 class EventDataWrapper : public QwtSeriesData<QPointF>
00030 {
00031 private:
00032 std::vector<double>& _x;
00033 std::vector<sint16>& _y;
00034
00035 public:
00036 EventDataWrapper(std::vector<double>& _x, std::vector<sint16>& _y) :
00037 _x(_x),
00038 _y(_y)
00039 { }
00040 virtual QRectF boundingRect () const { return qwtBoundingRect(*this); }
00041 virtual QPointF sample (size_t i) const { return QPointF(_x[i], double(_y[i])); }
00042 virtual size_t size () const { return _x.size(); }
00043 };
00044 #else
00045 class EventDataWrapper : public QwtData
00046 {
00047 private:
00048 std::vector<double>& _x;
00049 std::vector<sint16>& _y;
00050
00051 public:
00052 EventDataWrapper(std::vector<double>& _x, std::vector<sint16>& _y) :
00053 _x(_x),
00054 _y(_y)
00055 { }
00056 virtual QwtData * copy () const { return new EventDataWrapper(*this); }
00057 virtual size_t size () const { return _x.size(); }
00058 virtual double x (size_t i) const { return _x[i]; }
00059 virtual double y (size_t i) const { return (double)_y[i]; }
00060 };
00061 #endif
00062
00063 class EventLogger : public Hub, public QwtPlot
00064 {
00065 protected:
00066 Stream* stream;
00067 int eventId;
00068 vector<vector<sint16> > values;
00069 vector<double> timeStamps;
00070 QTime startingTime;
00071 ofstream outputFile;
00072
00073 public:
00074 EventLogger(const char* target, int eventId, int eventVariablesCount, const char* filename) :
00075 QwtPlot(QwtText(QString(tr("Plot for event %0")).arg(eventId))),
00076 eventId(eventId),
00077 values(eventVariablesCount)
00078 {
00079 stream = Hub::connect(target);
00080 cout << "Connected to " << stream->getTargetName() << endl;
00081
00082 startingTime = QTime::currentTime();
00083
00084 setCanvasBackground(Qt::white);
00085 setAxisTitle(xBottom, tr("Time (seconds)"));
00086 setAxisTitle(yLeft, tr("Values"));
00087
00088 QwtLegend *legend = new QwtLegend;
00089
00090 insertLegend(legend, QwtPlot::BottomLegend);
00091
00092 for (size_t i = 0; i < values.size(); i++)
00093 {
00094 QwtPlotCurve *curve = new QwtPlotCurve(QString("%0").arg(i));
00095 #if QWT_VERSION >= 0x060000
00096 curve->setData(new EventDataWrapper(timeStamps, values[i]));
00097 #else
00098 curve->setData(EventDataWrapper(timeStamps, values[i]));
00099 #endif
00100 curve->attach(this);
00101 curve->setPen(QColor::fromHsv((i * 360) / values.size(), 255, 100));
00102 }
00103
00104 resize(1000, 600);
00105
00106 if (filename)
00107 outputFile.open(filename);
00108
00109 startTimer(10);
00110 }
00111
00112 protected:
00113 virtual void timerEvent ( QTimerEvent * event )
00114 {
00115 if (!step(0))
00116 close();
00117 }
00118
00119 void incomingData(Stream *stream)
00120 {
00121 Message *message = Message::receive(stream);
00122 UserMessage *userMessage = dynamic_cast<UserMessage *>(message);
00123 if (userMessage)
00124 {
00125 if (userMessage->type == eventId)
00126 {
00127 double elapsedTime = (double)startingTime.msecsTo(QTime::currentTime()) / 1000.;
00128 if (outputFile.is_open())
00129 outputFile << elapsedTime;
00130 timeStamps.push_back(elapsedTime);
00131 for (size_t i = 0; i < values.size(); i++)
00132 {
00133 if (i < userMessage->data.size())
00134 {
00135 if (outputFile.is_open())
00136 outputFile << " " << userMessage->data[i];
00137 values[i].push_back(userMessage->data[i]);
00138 }
00139 else
00140 {
00141 if (outputFile.is_open())
00142 outputFile << " " << 0;
00143 values[i].push_back(0);
00144 }
00145 }
00146 if (outputFile.is_open())
00147 outputFile << endl;
00148 replot();
00149 }
00150 }
00151 delete message;
00152 }
00153
00154 void connectionClosed(Stream *stream, bool abnormal)
00155 {
00156 dumpTime(cerr);
00157 cout << "Connection closed to " << stream->getTargetName();
00158 if (abnormal)
00159 cout << " : " << stream->getFailReason();
00160 cout << endl;
00161 stop();
00162 }
00163 };
00164
00165 int main(int argc, char *argv[])
00166 {
00167 if (argc < 4)
00168 {
00169 cerr << "Usage " << argv[0] << " target event_id event_variables_count [output file]" << endl;
00170 return 1;
00171 }
00172
00173 QApplication app(argc, argv);
00174
00175 int res;
00176 try
00177 {
00178 EventLogger logger(argv[1], atoi(argv[2]), atoi(argv[3]), (argc > 4 ? argv[4] : 0));
00179 logger.show();
00180 res = app.exec();
00181 }
00182 catch(Dashel::DashelException e)
00183 {
00184 std::cerr << e.what() << std::endl;
00185 return 2;
00186 }
00187
00188 return res;
00189 }