mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-13 20:48:42 +01:00
7195862d77
This will allow us to build a parent project for qt-creator that sits above both openpilotgcs and uavobjgenerator so that we can build both projects at the same time. git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@2528 ebee16cc-31ac-478f-84a7-5cbb03baadba
135 lines
4.4 KiB
C++
135 lines
4.4 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();
|
|
}
|
|
}
|