You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
7.3 KiB
219 lines
7.3 KiB
#include "QGCPX4SensorCalibration.h" |
|
#include "ui_QGCPX4SensorCalibration.h" |
|
#include <UASManager.h> |
|
#include <QMenu> |
|
#include <QScrollBar> |
|
#include <QDebug> |
|
|
|
QGCPX4SensorCalibration::QGCPX4SensorCalibration(QWidget *parent) : |
|
QWidget(parent), |
|
activeUAS(NULL), |
|
clearAction(new QAction(tr("Clear Text"), this)), |
|
accelStarted(false), |
|
gyroStarted(false), |
|
magStarted(false), |
|
ui(new Ui::QGCPX4SensorCalibration) |
|
{ |
|
accelAxes << "x+"; |
|
accelAxes << "x-"; |
|
accelAxes << "y+"; |
|
accelAxes << "y-"; |
|
accelAxes << "z+"; |
|
accelAxes << "z-"; |
|
|
|
|
|
ui->setupUi(this); |
|
connect(clearAction, SIGNAL(triggered()), ui->textView, SLOT(clear())); |
|
|
|
connect(ui->gyroButton, SIGNAL(clicked()), this, SLOT(gyroButtonClicked())); |
|
connect(ui->magButton, SIGNAL(clicked()), this, SLOT(magButtonClicked())); |
|
connect(ui->accelButton, SIGNAL(clicked()), this, SLOT(accelButtonClicked())); |
|
|
|
ui->gyroButton->setEnabled(false); |
|
ui->magButton->setEnabled(false); |
|
ui->accelButton->setEnabled(false); |
|
|
|
setInstructionImage(":/files/images/px4/calibration/accel_z-.png"); |
|
|
|
setObjectName("PX4_SENSOR_CALIBRATION"); |
|
|
|
setStyleSheet("QScrollArea { border: 0px; } QPlainTextEdit { border: 0px }"); |
|
|
|
setActiveUAS(UASManager::instance()->getActiveUAS()); |
|
connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(setActiveUAS(UASInterface*))); |
|
ui->progressBar->setValue(0); |
|
} |
|
|
|
QGCPX4SensorCalibration::~QGCPX4SensorCalibration() |
|
{ |
|
delete ui; |
|
} |
|
|
|
void QGCPX4SensorCalibration::setInstructionImage(const QString &path) |
|
{ |
|
instructionIcon.load(path); |
|
|
|
int w = ui->iconLabel->width(); |
|
int h = ui->iconLabel->height(); |
|
|
|
ui->iconLabel->setPixmap(instructionIcon.scaled(w, h, Qt::KeepAspectRatio)); |
|
} |
|
|
|
void QGCPX4SensorCalibration::resizeEvent(QResizeEvent* event) |
|
{ |
|
|
|
int w = ui->iconLabel->width(); |
|
int h = ui->iconLabel->height(); |
|
|
|
ui->iconLabel->setPixmap(instructionIcon.scaled(w, h, Qt::KeepAspectRatio)); |
|
|
|
QWidget::resizeEvent(event); |
|
} |
|
|
|
void QGCPX4SensorCalibration::setActiveUAS(UASInterface* uas) |
|
{ |
|
if (!uas) |
|
return; |
|
|
|
if (activeUAS) { |
|
disconnect(uas, SIGNAL(textMessageReceived(int,int,int,QString)), this, SLOT(handleTextMessage(int,int,int,QString))); |
|
ui->textView->clear(); |
|
} |
|
|
|
ui->gyroButton->setEnabled(true); |
|
ui->magButton->setEnabled(true); |
|
ui->accelButton->setEnabled(true); |
|
|
|
connect(uas, SIGNAL(textMessageReceived(int,int,int,QString)), this, SLOT(handleTextMessage(int,int,int,QString))); |
|
activeUAS = uas; |
|
} |
|
|
|
void QGCPX4SensorCalibration::handleTextMessage(int uasid, int compId, int severity, QString text) |
|
{ |
|
if (text.startsWith("[cmd]") || |
|
text.startsWith("[mavlink pm]")) |
|
return; |
|
|
|
if (text.contains("progress")) { |
|
qDebug() << "PROGRESS:" << text; |
|
QString percent = text.split("<").last().split(">").first(); |
|
qDebug() << "PERCENT CANDIDATE" << percent; |
|
bool ok; |
|
int p = percent.toInt(&ok); |
|
if (ok) |
|
ui->progressBar->setValue(p); |
|
return; |
|
} |
|
|
|
|
|
if (text.contains("accel")) { |
|
qDebug() << "ACCEL" << text; |
|
|
|
if (text.startsWith("accel meas started: ")) { |
|
QString axis = text.split("meas started: ").last().right(2); |
|
qDebug() << "AXIS" << axis << "STR" << text; |
|
setInstructionImage(QString(":/files/images/px4/calibration/accel_%1.png").arg(axis)); |
|
|
|
} |
|
} |
|
|
|
if (text.startsWith("meas result for")) { |
|
|
|
QString axis = text.split("meas result for ").last().left(2); |
|
|
|
qDebug() << "ACCELDONE AXIS" << axis << "STR" << text; |
|
|
|
for (int i = 0; i < 6; i++) |
|
{ |
|
if (accelAxes[i] == axis) |
|
accelDone[i] = true; |
|
|
|
if (!accelDone[i]) { |
|
setInstructionImage(QString(":/files/images/px4/calibration/accel_%1.png").arg(accelAxes[i])); |
|
ui->calibrationExplanationLabel->setText(tr("Axis %1 completed. Please rotate to a different axis, e.g. the one shown here.").arg(axis)); |
|
} |
|
} |
|
} |
|
|
|
if (text.contains("please rotate in a figure 8")) { |
|
ui->calibrationExplanationLabel->setText(tr("Rotate the system around all its axes, e.g. in a figure eight.")); |
|
setInstructionImage(":/files/images/px4/calibration/mag_calibration_figure8.png"); |
|
} |
|
|
|
if (text.contains("accel calibration done")) { |
|
accelStarted = false; |
|
// XXX use a confirmation image or something |
|
setInstructionImage(":/files/images/px4/calibration/accel_z-.png"); |
|
ui->calibrationExplanationLabel->setText(tr("Accelerometer calibration completed. Parameters permanently stored.")); |
|
} |
|
|
|
if (text.contains("gyro calibration done")) { |
|
gyroStarted = false; |
|
// XXX use a confirmation image or something |
|
setInstructionImage(":/files/images/px4/calibration/accel_z-.png"); |
|
ui->calibrationExplanationLabel->setText(tr("Gyroscope calibration completed. Parameters permanently stored.")); |
|
} |
|
|
|
if (text.contains("mag calibration done")) { |
|
magStarted = false; |
|
// XXX use a confirmation image or something |
|
setInstructionImage(":/files/images/px4/calibration/accel_z-.png"); |
|
ui->calibrationExplanationLabel->setText(tr("Magnetometer calibration completed. Parameters permanently stored.")); |
|
} |
|
|
|
ui->instructionLabel->setText(QString("%1").arg(text)); |
|
|
|
|
|
// XXX color messages according to severity |
|
|
|
QPlainTextEdit *msgWidget = ui->textView; |
|
|
|
//turn off updates while we're appending content to avoid breaking the autoscroll behavior |
|
msgWidget->setUpdatesEnabled(false); |
|
QScrollBar *scroller = msgWidget->verticalScrollBar(); |
|
|
|
msgWidget->appendHtml(QString("%4").arg(text)); |
|
|
|
// Ensure text area scrolls correctly |
|
scroller->setValue(scroller->maximum()); |
|
msgWidget->setUpdatesEnabled(true); |
|
} |
|
|
|
void QGCPX4SensorCalibration::gyroButtonClicked() |
|
{ |
|
setInstructionImage(":/files/images/px4/calibration/accel_z-.png"); |
|
activeUAS->executeCommand(MAV_CMD_PREFLIGHT_CALIBRATION, 1, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0); |
|
ui->progressBar->setValue(0); |
|
ui->calibrationExplanationLabel->setText(tr("Please do not move the system at all and wait for calibration to complete.")); |
|
} |
|
|
|
void QGCPX4SensorCalibration::magButtonClicked() |
|
{ |
|
setInstructionImage(":/files/images/px4/calibration/accel_z-.png"); |
|
activeUAS->executeCommand(MAV_CMD_PREFLIGHT_CALIBRATION, 1, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0); |
|
ui->progressBar->setValue(0); |
|
ui->calibrationExplanationLabel->setText(tr("Please put the system in a rest position and wait for instructions.")); |
|
} |
|
|
|
void QGCPX4SensorCalibration::accelButtonClicked() |
|
{ |
|
setInstructionImage(":/files/images/px4/calibration/accel_z-.png"); |
|
activeUAS->executeCommand(MAV_CMD_PREFLIGHT_CALIBRATION, 1, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0); |
|
ui->progressBar->setValue(0); |
|
accelStarted = true; |
|
accelDone[0] = false; |
|
accelDone[1] = false; |
|
accelDone[2] = false; |
|
accelDone[3] = false; |
|
accelDone[4] = false; |
|
accelDone[5] = false; |
|
|
|
ui->calibrationExplanationLabel->setText(tr("Please hold the system very still in the shown orientations. Start with the one shown.")); |
|
} |
|
|
|
void QGCPX4SensorCalibration::contextMenuEvent(QContextMenuEvent* event) |
|
{ |
|
QMenu menu(this); |
|
menu.addAction(clearAction); |
|
menu.exec(event->globalPos()); |
|
}
|
|
|