1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-12-14 21:23:52 +01:00
LibrePilot/ground/openpilotgcs/src/plugins/gpsdisplay/gpssnrwidget.cpp
2013-05-18 14:17:26 +02:00

137 lines
4.3 KiB
C++

#include "gpssnrwidget.h"
GpsSnrWidget::GpsSnrWidget(QWidget *parent) :
QGraphicsView(parent)
{
scene = new QGraphicsScene(this);
setScene(scene);
// Now create 'maxSatellites' satellite icons which we will move around on the map:
for (int i = 0; i < MAX_SATTELITES; i++) {
satellites[i][0] = 0;
satellites[i][1] = 0;
satellites[i][2] = 0;
satellites[i][3] = 0;
boxes[i] = new QGraphicsRectItem();
boxes[i]->setBrush(QColor("Green"));
scene->addItem(boxes[i]);
boxes[i]->hide();
satTexts[i] = new QGraphicsSimpleTextItem("##", boxes[i]);
satTexts[i]->setBrush(QColor("Black"));
satTexts[i]->setFont(QFont("Courier"));
satSNRs[i] = new QGraphicsSimpleTextItem("##", boxes[i]);
satSNRs[i]->setBrush(QColor("Black"));
satSNRs[i]->setFont(QFont("Courier"));
}
}
GpsSnrWidget::~GpsSnrWidget()
{
delete scene;
scene = 0;
}
void GpsSnrWidget::showEvent(QShowEvent *event)
{
Q_UNUSED(event)
scene->setSceneRect(0, 0, this->viewport()->width(), this->viewport()->height());
for (int index = 0; index < MAX_SATTELITES; index++) {
drawSat(index);
}
}
void GpsSnrWidget::resizeEvent(QResizeEvent *event)
{
Q_UNUSED(event);
scene->setSceneRect(0, 0, this->viewport()->width(), this->viewport()->height());
for (int index = 0; index < MAX_SATTELITES; index++) {
drawSat(index);
}
}
void GpsSnrWidget::updateSat(int index, int prn, int elevation, int azimuth, int snr)
{
if (index >= MAX_SATTELITES) {
// A bit of error checking never hurts.
return;
}
// TODO: add range checking
satellites[index][0] = prn;
satellites[index][1] = elevation;
satellites[index][2] = azimuth;
satellites[index][3] = snr;
drawSat(index);
}
void GpsSnrWidget::drawSat(int index)
{
if (index >= MAX_SATTELITES) {
// A bit of error checking never hurts.
return;
}
const int prn = satellites[index][0];
const int snr = satellites[index][3];
if (prn && snr) {
boxes[index]->show();
// When using integer values, width and height are the
// box width and height, but the left and bottom borders are drawn on the box,
// and the top and right borders are drawn just next to the box.
// So the box seems one pixel wider and higher with a border.
// I'm sure there's a good explanation for that :)
// Casting to int rounds down, which is what I want.
// Minus 2 to allow a pixel of white left and right.
int availableWidth = (int)((scene->width() - 2) / MAX_SATTELITES);
// 2 pixels, one on each side.
qreal width = availableWidth - 2;
// SNR = 1-99 (0 is special)..
qreal height = int((scene->height() / 99) * snr + 0.5);
// 1 for showing a pixel of white to the left.
qreal x = availableWidth * index + 1;
// Rember, 0 is at the top.
qreal y = scene->height() - height;
// Compensate for the extra pixel for the border.
boxes[index]->setRect(0, 0, width - 1, height - 1);
boxes[index]->setPos(x, y);
QRectF boxRect = boxes[index]->boundingRect();
QString prnString = QString().number(prn);
if (prnString.length() == 1) {
prnString = "0" + prnString;
}
satTexts[index]->setText(prnString);
QRectF textRect = satTexts[index]->boundingRect();
QTransform matrix;
qreal scale = 0.85 * (boxRect.width() / textRect.width());
matrix.translate(boxRect.width() / 2, boxRect.height());
matrix.scale(scale, scale);
matrix.translate(-textRect.width() / 2, -textRect.height());
satTexts[index]->setTransform(matrix, false);
QString snrString = QString().number(snr);
if (snrString.length() == 1) { // Will probably never happen!
snrString = "0" + snrString;
}
satSNRs[index]->setText(snrString);
textRect = satSNRs[index]->boundingRect();
matrix.reset();
scale = 0.85 * (boxRect.width() / textRect.width());
matrix.translate(boxRect.width() / 2, 0);
matrix.scale(scale, scale);
matrix.translate(-textRect.width() / 2, -textRect.height());
satSNRs[index]->setTransform(matrix, false);
} else {
boxes[index]->hide();
}
}