diff --git a/src/uas/UAS.cc b/src/uas/UAS.cc index 61bf7e09102553ef8b60895dc1231873c5e949dd..13b9349297c198c4f172884366b0dbad26b83499 100644 --- a/src/uas/UAS.cc +++ b/src/uas/UAS.cc @@ -957,12 +957,12 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message) case MAVLINK_MSG_ID_RADIO_CALIBRATION: { mavlink_radio_calibration_t radioMsg; mavlink_msg_radio_calibration_decode(&message, &radioMsg); - QVector aileron; - QVector elevator; - QVector rudder; - QVector gyro; - QVector pitch; - QVector throttle; + QVector aileron; + QVector elevator; + QVector rudder; + QVector gyro; + QVector pitch; + QVector throttle; for (int i=0; iraw.size() <= channelId) // using raw vector as size indicator -// { -// // This is a new channel, append it -// this->normalized.append(normalized); -// this->raw.append(0); -// appendChannelWidget(channelId); -// } -// else -// { -// // This is an existing channel, update it -// this->normalized[channelId] = normalized; -// } +void QGCRemoteControlView::setChannelScaled(int channelId, float normalized) +{ + if (this->raw.size() <= channelId) // using raw vector as size indicator + { + // This is a new channel, append it + this->normalized.append(normalized); + this->raw.append(0); + appendChannelWidget(channelId); + } + else + { + // This is an existing channel, update it + this->normalized[channelId] = normalized; + } // updated = true; // // FIXME Will be timer based in the future // redraw(); -//} +} void QGCRemoteControlView::setRemoteRSSI(float rssiNormalized) { @@ -179,9 +179,9 @@ void QGCRemoteControlView::redraw() // Update percent bars for(int i = 0; i < progressBars.count(); i++) { rawLabels.at(i)->setText(QString("%1 us").arg(raw.at(i), 4, 10, QChar('0'))); - //int vv = normalized.at(i)*100.0f; + int vv = normalized.at(i)*100.0f; //progressBars.at(i)->setValue(vv); - int vv = raw.at(i)*1.0f; +// int vv = raw.at(i)*1.0f; progressBars.at(i)->setValue(vv); } // Update RSSI diff --git a/src/ui/QGCRemoteControlView.h b/src/ui/QGCRemoteControlView.h index 5cae3592d69d6cfb75e1cbb54678ac45a21ad8f5..63c964f99d6302ecd33f51f777f067e1c85b9b1e 100644 --- a/src/ui/QGCRemoteControlView.h +++ b/src/ui/QGCRemoteControlView.h @@ -55,7 +55,7 @@ public: public slots: void setUASId(int id); void setChannelRaw(int channelId, float raw); - //void setChannelScaled(int channelId, float normalized); + void setChannelScaled(int channelId, float normalized); void setRemoteRSSI(float rssiNormalized); void redraw(); diff --git a/src/ui/RadioCalibration/AbstractCalibrator.cc b/src/ui/RadioCalibration/AbstractCalibrator.cc index d98b147d9b69b56bd8a05120b5d7078976adcb15..a07d0576fe9002c1c115518e67a943bf79cb7dfc 100644 --- a/src/ui/RadioCalibration/AbstractCalibrator.cc +++ b/src/ui/RadioCalibration/AbstractCalibrator.cc @@ -3,7 +3,7 @@ AbstractCalibrator::AbstractCalibrator(QWidget *parent) : QWidget(parent), pulseWidth(new QLabel()), - log(new QVector()) + log(new QVector()) { } @@ -12,17 +12,17 @@ AbstractCalibrator::~AbstractCalibrator() delete log; } -float AbstractCalibrator::logAverage() +uint16_t AbstractCalibrator::logAverage() { - float total = 0; + uint16_t total = 0; for (int i=0; isize(); ++i) total += log->value(i); - return floor(total/log->size()); + return total/log->size(); } -float AbstractCalibrator::logExtrema() +uint16_t AbstractCalibrator::logExtrema() { - float extrema = logAverage(); + uint16_t extrema = logAverage(); if (logAverage() < 1500) { for (int i=0; isize(); ++i) { if (log->value(i) < extrema) @@ -40,9 +40,9 @@ float AbstractCalibrator::logExtrema() return extrema; } -void AbstractCalibrator::channelChanged(float raw) +void AbstractCalibrator::channelChanged(uint16_t raw) { - pulseWidth->setText(QString::number(static_cast(raw))); + pulseWidth->setText(QString::number(raw)); if (log->size() == 5) log->pop_front(); log->push_back(raw); diff --git a/src/ui/RadioCalibration/AbstractCalibrator.h b/src/ui/RadioCalibration/AbstractCalibrator.h index 940be64c352cda64f9842c7f2c907be56d5958ef..70ff632915fa45a8ff0f6e3cd95a35830fe9864a 100644 --- a/src/ui/RadioCalibration/AbstractCalibrator.h +++ b/src/ui/RadioCalibration/AbstractCalibrator.h @@ -36,6 +36,7 @@ This file is part of the QGROUNDCONTROL project #include #include +#include /** @brief Holds the code which is common to all the radio calibration widgets. @@ -53,30 +54,30 @@ public: changing the display from an external source (file/uav). @param data QVector of setpoints */ - virtual void set(const QVector& data)=0; + virtual void set(const QVector& data)=0; signals: /** Announce a setpoint change. @param index setpoint number - 0 based in the current implementation @param value new value */ - void setpointChanged(int index, float value); + void setpointChanged(int index, uint16_t value); public slots: /** Slot to call when the relevant channel is updated @param raw current channel value */ - void channelChanged(float raw); + void channelChanged(uint16_t raw); protected: /** Display the current pulse width */ QLabel *pulseWidth; /** Log of the past few samples for use in averaging and finding extrema */ - QVector *log; + QVector *log; /** Find the maximum or minimum of the data log */ - float logExtrema(); + uint16_t logExtrema(); /** Find the average of the log */ - float logAverage(); + uint16_t logAverage(); }; #endif // ABSTRACTCALIBRATOR_H diff --git a/src/ui/RadioCalibration/AirfoilServoCalibrator.cc b/src/ui/RadioCalibration/AirfoilServoCalibrator.cc index 11d66e62b9e4e8160225a3875a80ea8a4f45ac4d..dc7faf28ce3dd4914dcb16cf53ec8b1d9e78d191 100644 --- a/src/ui/RadioCalibration/AirfoilServoCalibrator.cc +++ b/src/ui/RadioCalibration/AirfoilServoCalibrator.cc @@ -78,23 +78,23 @@ AirfoilServoCalibrator::AirfoilServoCalibrator(AirfoilType type, QWidget *parent void AirfoilServoCalibrator::setHigh() { - highPulseWidth->setText(QString::number(static_cast(logExtrema()))); + highPulseWidth->setText(QString::number(logExtrema())); emit setpointChanged(2, logExtrema()); } void AirfoilServoCalibrator::setCenter() { - centerPulseWidth->setText(QString::number(static_cast(logAverage()))); + centerPulseWidth->setText(QString::number(logAverage())); emit setpointChanged(1, logAverage()); } void AirfoilServoCalibrator::setLow() { - lowPulseWidth->setText(QString::number(static_cast(logExtrema()))); + lowPulseWidth->setText(QString::number(logExtrema())); emit setpointChanged(0, logExtrema()); } -void AirfoilServoCalibrator::set(const QVector &data) +void AirfoilServoCalibrator::set(const QVector &data) { if (data.size() == 3) { lowPulseWidth->setText(QString::number(data[0])); diff --git a/src/ui/RadioCalibration/AirfoilServoCalibrator.h b/src/ui/RadioCalibration/AirfoilServoCalibrator.h index 4a9054aab0562bce21c730c1fb9f70d582427b80..4775c939a824ee3d5275f79fe31eb4ab866e346a 100644 --- a/src/ui/RadioCalibration/AirfoilServoCalibrator.h +++ b/src/ui/RadioCalibration/AirfoilServoCalibrator.h @@ -58,7 +58,7 @@ public: explicit AirfoilServoCalibrator(AirfoilType type = AILERON, QWidget *parent = 0); /** @param data must have exaclty 3 elemets. they are assumed to be low center high */ - void set(const QVector& data); + void set(const QVector& data); protected slots: void setHigh(); diff --git a/src/ui/RadioCalibration/CurveCalibrator.cc b/src/ui/RadioCalibration/CurveCalibrator.cc index bc852769523bb0bb4f3f7b7a24f5226fd25c672a..9ef8ec58b420bd60f6c0785a5288a8673634f678 100644 --- a/src/ui/RadioCalibration/CurveCalibrator.cc +++ b/src/ui/RadioCalibration/CurveCalibrator.cc @@ -2,8 +2,8 @@ CurveCalibrator::CurveCalibrator(QString titleString, QWidget *parent) : AbstractCalibrator(parent), - setpoints(new QVector(5)), - positions(new QVector()) + setpoints(new QVector(5)), + positions(new QVector()) { QGridLayout *grid = new QGridLayout(this); QLabel *title = new QLabel(titleString); @@ -32,7 +32,17 @@ CurveCalibrator::CurveCalibrator(QString titleString, QWidget *parent) : curve = new QwtPlotCurve(); curve->setPen(QPen(QColor(QString("lime")))); - curve->setData(*positions, *setpoints); + + QVector pos(positions->size()); + QVector set(setpoints->size()); + + for (int i=0; isize()&&isize(); i++) + { + pos[i] = static_cast((*positions)[i]); + set[i] = static_cast((*setpoints)[i]); + } + + curve->setData(pos, set); curve->attach(plot); plot->replot(); @@ -75,22 +85,40 @@ CurveCalibrator::~CurveCalibrator() void CurveCalibrator::setSetpoint(int setpoint) { if (setpoint == 0 || setpoint == 4) { - setpoints->replace(setpoint, static_cast(logExtrema())); + setpoints->replace(setpoint,logExtrema()); } else { - setpoints->replace(setpoint, static_cast(logAverage())); + setpoints->replace(setpoint, logAverage()); } - curve->setData(*positions, *setpoints); + + QVector pos(positions->size()); + QVector set(setpoints->size()); + + for (int i=0; isize()&&isize(); i++) + { + pos[i] = static_cast((*positions)[i]); + set[i] = static_cast((*setpoints)[i]); + } + + curve->setData(pos, set); plot->replot(); - emit setpointChanged(setpoint, static_cast(setpoints->value(setpoint))); + emit setpointChanged(setpoint, setpoints->value(setpoint)); } -void CurveCalibrator::set(const QVector &data) +void CurveCalibrator::set(const QVector &data) { if (data.size() == 5) { for (int i=0; ireplace(i, static_cast(data[i])); - curve->setData(*positions, *setpoints); + setpoints->replace(i, data[i]); + QVector pos(positions->size()); + QVector set(setpoints->size()); + + for (int i=0; isize()&&isize(); i++) + { + pos[i] = static_cast((*positions)[i]); + set[i] = static_cast((*setpoints)[i]); + } + curve->setData(pos, set); plot->replot(); } else { qDebug() << __FILE__ << __LINE__ << ": wrong data vector size"; diff --git a/src/ui/RadioCalibration/CurveCalibrator.h b/src/ui/RadioCalibration/CurveCalibrator.h index 739358aff3e1f6ff9920d7539488cd0adcab237f..1f4c0b1e9dba6bea7be6cd7cc6f32def0adab124 100644 --- a/src/ui/RadioCalibration/CurveCalibrator.h +++ b/src/ui/RadioCalibration/CurveCalibrator.h @@ -58,14 +58,14 @@ public: explicit CurveCalibrator(QString title = QString(), QWidget *parent = 0); ~CurveCalibrator(); - void set(const QVector &data); + void set(const QVector &data); protected slots: void setSetpoint(int setpoint); protected: - QVector *setpoints; - QVector *positions; + QVector *setpoints; + QVector *positions; /** Plot to display calibration curve */ QwtPlot *plot; /** Curve object of calibration curve */ diff --git a/src/ui/RadioCalibration/RadioCalibrationData.cc b/src/ui/RadioCalibration/RadioCalibrationData.cc index 858284062a84ad1f2083a5e0c19ddf13a1233ecf..30933158a0662e7d62eff5e7a3f7a9e71f805852 100644 --- a/src/ui/RadioCalibration/RadioCalibrationData.cc +++ b/src/ui/RadioCalibration/RadioCalibrationData.cc @@ -2,23 +2,23 @@ RadioCalibrationData::RadioCalibrationData() { - data = new QVector >(6); - (*data).insert(AILERON, QVector(3)); - (*data).insert(ELEVATOR, QVector(3)); - (*data).insert(RUDDER, QVector(3)); - (*data).insert(GYRO, QVector(2)); - (*data).insert(PITCH, QVector(5)); - (*data).insert(THROTTLE, QVector(5)); + data = new QVector >(6); + (*data).insert(AILERON, QVector(3)); + (*data).insert(ELEVATOR, QVector(3)); + (*data).insert(RUDDER, QVector(3)); + (*data).insert(GYRO, QVector(2)); + (*data).insert(PITCH, QVector(5)); + (*data).insert(THROTTLE, QVector(5)); } -RadioCalibrationData::RadioCalibrationData(const QVector &aileron, - const QVector &elevator, - const QVector &rudder, - const QVector &gyro, - const QVector &pitch, - const QVector &throttle) +RadioCalibrationData::RadioCalibrationData(const QVector &aileron, + const QVector &elevator, + const QVector &rudder, + const QVector &gyro, + const QVector &pitch, + const QVector &throttle) { - data = new QVector >(); + data = new QVector >(); (*data) << aileron << elevator << rudder @@ -30,7 +30,7 @@ RadioCalibrationData::RadioCalibrationData(const QVector &aileron, RadioCalibrationData::RadioCalibrationData(const RadioCalibrationData &other) :QObject() { - data = new QVector >(*other.data); + data = new QVector >(*other.data); } RadioCalibrationData::~RadioCalibrationData() @@ -38,7 +38,7 @@ RadioCalibrationData::~RadioCalibrationData() delete data; } -const float* RadioCalibrationData::operator [](int i) const +const uint16_t* RadioCalibrationData::operator [](int i) const { if (i < data->size()) { return (*data)[i].constData(); @@ -47,7 +47,7 @@ const float* RadioCalibrationData::operator [](int i) const return NULL; } -const QVector& RadioCalibrationData::operator ()(const int i) const throw(std::out_of_range) +const QVector& RadioCalibrationData::operator ()(const int i) const throw(std::out_of_range) { if ((i < data->size()) && (i >=0)) { return (*data)[i]; diff --git a/src/ui/RadioCalibration/RadioCalibrationData.h b/src/ui/RadioCalibration/RadioCalibrationData.h index 574df307b6b4d84c4ba681ed9aa30c9a7d965fbd..89e1f3b05c4c11f6757280d8c593f4249597a6e1 100644 --- a/src/ui/RadioCalibration/RadioCalibrationData.h +++ b/src/ui/RadioCalibration/RadioCalibrationData.h @@ -36,6 +36,8 @@ This file is part of the QGROUNDCONTROL project #include #include +#include + /** @brief Class to hold the calibration data. @@ -48,12 +50,12 @@ class RadioCalibrationData : public QObject public: explicit RadioCalibrationData(); RadioCalibrationData(const RadioCalibrationData&); - RadioCalibrationData(const QVector& aileron, - const QVector& elevator, - const QVector& rudder, - const QVector& gyro, - const QVector& pitch, - const QVector& throttle); + RadioCalibrationData(const QVector& aileron, + const QVector& elevator, + const QVector& rudder, + const QVector& gyro, + const QVector& pitch, + const QVector& throttle); ~RadioCalibrationData(); enum RadioElement { @@ -65,33 +67,33 @@ public: THROTTLE }; - const float* operator[](int i) const; + const uint16_t* operator[](int i) const; #ifdef _MSC_VER - const QVector& operator()(int i) const; + const QVector& operator()(int i) const; #else - const QVector& operator()(int i) const throw(std::out_of_range); + const QVector& operator()(int i) const throw(std::out_of_range); #endif void set(int element, int index, float value) { (*data)[element][index] = value; } public slots: - void setAileron(int index, float value) { + void setAileron(int index, uint16_t value) { set(AILERON, index, value); } - void setElevator(int index, float value) { + void setElevator(int index, uint16_t value) { set(ELEVATOR, index, value); } - void setRudder(int index, float value) { + void setRudder(int index, uint16_t value) { set(RUDDER, index, value); } - void setGyro(int index, float value) { + void setGyro(int index, uint16_t value) { set(GYRO, index, value); } - void setPitch(int index, float value) { + void setPitch(int index, uint16_t value) { set(PITCH, index, value); } - void setThrottle(int index, float value) { + void setThrottle(int index, uint16_t value) { set(THROTTLE, index, value); } @@ -100,7 +102,7 @@ public: QString toString(const RadioElement element) const; protected: - QVector > *data; + QVector > *data; void init(const QVector& aileron, const QVector& elevator, diff --git a/src/ui/RadioCalibration/RadioCalibrationWindow.cc b/src/ui/RadioCalibration/RadioCalibrationWindow.cc index a78894add1266af5f34841f0f49fe243c46c6d7c..21ae680661abd5d9749f5d3d9ec372fa16037fe8 100644 --- a/src/ui/RadioCalibration/RadioCalibrationWindow.cc +++ b/src/ui/RadioCalibration/RadioCalibrationWindow.cc @@ -43,12 +43,12 @@ RadioCalibrationWindow::RadioCalibrationWindow(QWidget *parent) : connect(transmit, SIGNAL(clicked()), this, SLOT(send())); connect(get, SIGNAL(clicked()), this, SLOT(request())); - connect(aileron, SIGNAL(setpointChanged(int,float)), radio, SLOT(setAileron(int,float))); - connect(elevator, SIGNAL(setpointChanged(int,float)), radio, SLOT(setElevator(int,float))); - connect(rudder, SIGNAL(setpointChanged(int,float)), radio, SLOT(setRudder(int,float))); - connect(gyro, SIGNAL(setpointChanged(int,float)), radio, SLOT(setGyro(int,float))); - connect(pitch, SIGNAL(setpointChanged(int,float)), radio, SLOT(setPitch(int,float))); - connect(throttle, SIGNAL(setpointChanged(int,float)), radio, SLOT(setThrottle(int,float))); + connect(aileron, SIGNAL(setpointChanged(int,uint16_t)), radio, SLOT(setAileron(int,uint16_t))); + connect(elevator, SIGNAL(setpointChanged(int,uint16_t)), radio, SLOT(setElevator(int,uint16_t))); + connect(rudder, SIGNAL(setpointChanged(int,uint16_t)), radio, SLOT(setRudder(int,uint16_t))); + connect(gyro, SIGNAL(setpointChanged(int,uint16_t)), radio, SLOT(setGyro(int,uint16_t))); + connect(pitch, SIGNAL(setpointChanged(int,uint16_t)), radio, SLOT(setPitch(int,uint16_t))); + connect(throttle, SIGNAL(setpointChanged(int,uint16_t)), radio, SLOT(setThrottle(int,uint16_t))); setUASId(0); } diff --git a/src/ui/RadioCalibration/RadioCalibrationWindow.h b/src/ui/RadioCalibration/RadioCalibrationWindow.h index 40e97e4f8e1d06906b48cb65d1d974cfeb06b510..ebd6a94c9b64046a96c2737931a7d454afc890bc 100644 --- a/src/ui/RadioCalibration/RadioCalibrationWindow.h +++ b/src/ui/RadioCalibration/RadioCalibrationWindow.h @@ -44,6 +44,8 @@ This file is part of the QGROUNDCONTROL project #include #include +#include + #include "AirfoilServoCalibrator.h" #include "SwitchCalibrator.h" #include "CurveCalibrator.h" diff --git a/src/ui/RadioCalibration/SwitchCalibrator.cc b/src/ui/RadioCalibration/SwitchCalibrator.cc index 5a9b9a7c9e5cf2e6ecea2612f59eabb37e24eeaa..695dddfc3e518f12d88a8e2c275458649abecf18 100644 --- a/src/ui/RadioCalibration/SwitchCalibrator.cc +++ b/src/ui/RadioCalibration/SwitchCalibrator.cc @@ -38,17 +38,17 @@ SwitchCalibrator::SwitchCalibrator(QString titleString, QWidget *parent) : void SwitchCalibrator::setDefault() { - defaultPulseWidth->setText(QString::number(static_cast(logExtrema()))); + defaultPulseWidth->setText(QString::number(logExtrema())); emit setpointChanged(0, logExtrema()); } void SwitchCalibrator::setToggled() { - toggledPulseWidth->setText(QString::number(static_cast(logExtrema()))); + toggledPulseWidth->setText(QString::number(logExtrema())); emit setpointChanged(1, logExtrema()); } -void SwitchCalibrator::set(const QVector &data) +void SwitchCalibrator::set(const QVector &data) { if (data.size() == 2) { defaultPulseWidth->setText(QString::number(data[0])); diff --git a/src/ui/RadioCalibration/SwitchCalibrator.h b/src/ui/RadioCalibration/SwitchCalibrator.h index c62623b9a5021a73b9d0bb6681477cbb8077f429..c89978b55fbbaca8ff5b60ab800a1d51b5b44cc3 100644 --- a/src/ui/RadioCalibration/SwitchCalibrator.h +++ b/src/ui/RadioCalibration/SwitchCalibrator.h @@ -49,7 +49,7 @@ class SwitchCalibrator : public AbstractCalibrator public: explicit SwitchCalibrator(QString title=QString(), QWidget *parent = 0); - void set(const QVector &data); + void set(const QVector &data); protected slots: void setDefault();