WaypointEditableView.cc 25.5 KB
Newer Older
pixhawk's avatar
pixhawk committed
1
/*===================================================================
pixhawk's avatar
pixhawk committed
2 3 4 5 6 7 8 9
======================================================================*/

/**
 * @file
 *   @brief Displays one waypoint
 *
 *   @author Lorenz Meier <mavteam@student.ethz.ch>
 *   @author Benjamin Knecht <mavteam@student.ethz.ch>
10
 *   @author Petri Tanskanen <mavteam@student.ethz.ch>
pixhawk's avatar
pixhawk committed
11 12 13 14 15 16
 *
 */

#include <QDoubleSpinBox>
#include <QDebug>

17 18
#include <cmath>
#include <qmath.h>
pixhawk's avatar
pixhawk committed
19

20 21
#include "WaypointEditableView.h"
#include "ui_WaypointEditableView.h"
22
#include "ui_QGCCustomWaypointAction.h"
pixhawk's avatar
pixhawk committed
23

24
WaypointEditableView::WaypointEditableView(Waypoint* wp, QWidget* parent) :
25 26
    QWidget(parent),
    customCommand(new Ui_QGCCustomWaypointAction),
27 28
    viewMode(QGC_WAYPOINTEDITABLEVIEW_MODE_NAV),
    m_ui(new Ui::WaypointEditableView)
pixhawk's avatar
pixhawk committed
29 30 31 32
{
    m_ui->setupUi(this);

    this->wp = wp;
pixhawk's avatar
pixhawk committed
33
    connect(wp, SIGNAL(destroyed(QObject*)), this, SLOT(deleted(QObject*)));
34

35 36 37
    // CUSTOM COMMAND WIDGET
    customCommand->setupUi(m_ui->customActionWidget);

38
    // add actions
39 40 41 42 43 44 45
    m_ui->comboBox_action->addItem(tr("NAV: Waypoint"),MAV_CMD_NAV_WAYPOINT);
    m_ui->comboBox_action->addItem(tr("NAV: TakeOff"),MAV_CMD_NAV_TAKEOFF);
    m_ui->comboBox_action->addItem(tr("NAV: Loiter Unlim."),MAV_CMD_NAV_LOITER_UNLIM);
    m_ui->comboBox_action->addItem(tr("NAV: Loiter Time"),MAV_CMD_NAV_LOITER_TIME);
    m_ui->comboBox_action->addItem(tr("NAV: Loiter Turns"),MAV_CMD_NAV_LOITER_TURNS);
    m_ui->comboBox_action->addItem(tr("NAV: Ret. to Launch"),MAV_CMD_NAV_RETURN_TO_LAUNCH);
    m_ui->comboBox_action->addItem(tr("NAV: Land"),MAV_CMD_NAV_LAND);
lm's avatar
lm committed
46 47 48 49
//    m_ui->comboBox_action->addItem(tr("NAV: Target"),MAV_CMD_NAV_TARGET);
    //m_ui->comboBox_action->addItem(tr("IF: Delay over"),MAV_CMD_CONDITION_DELAY);
    //m_ui->comboBox_action->addItem(tr("IF: Yaw angle is"),MAV_CMD_CONDITION_YAW);
    //m_ui->comboBox_action->addItem(tr("DO: Jump to Index"),MAV_CMD_DO_JUMP);
50
    m_ui->comboBox_action->addItem(tr("Other"), MAV_CMD_ENUM_END);
51

52
    // add frames
53 54 55
    m_ui->comboBox_frame->addItem("Global/Abs. Alt",MAV_FRAME_GLOBAL);
    m_ui->comboBox_frame->addItem("Global/Rel. Alt", MAV_FRAME_GLOBAL_RELATIVE_ALT);
    m_ui->comboBox_frame->addItem("Local(NED)",MAV_FRAME_LOCAL_NED);
56 57 58 59 60
    m_ui->comboBox_frame->addItem("Mission",MAV_FRAME_MISSION);

    // Initialize view correctly
    updateActionView(wp->getAction());
    updateFrameView(wp->getFrame());
61

pixhawk's avatar
pixhawk committed
62
    // Read values and set user interface
63
    updateValues();
pixhawk's avatar
pixhawk committed
64

65
    // Check for mission frame
66 67
    if (wp->getFrame() == MAV_FRAME_MISSION)
    {
68 69 70
        m_ui->comboBox_action->setCurrentIndex(m_ui->comboBox_action->count()-1);
    }

71 72 73 74
    connect(m_ui->posNSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setX(double)));
    connect(m_ui->posESpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setY(double)));
    connect(m_ui->posDSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setZ(double)));

75 76 77
    connect(m_ui->latSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setLatitude(double)));
    connect(m_ui->lonSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setLongitude(double)));
    connect(m_ui->altSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setAltitude(double)));
lm's avatar
lm committed
78
    connect(m_ui->yawSpinBox, SIGNAL(valueChanged(int)), wp, SLOT(setYaw(int)));
pixhawk's avatar
pixhawk committed
79 80 81 82 83

    connect(m_ui->upButton, SIGNAL(clicked()), this, SLOT(moveUp()));
    connect(m_ui->downButton, SIGNAL(clicked()), this, SLOT(moveDown()));
    connect(m_ui->removeButton, SIGNAL(clicked()), this, SLOT(remove()));

pixhawk's avatar
pixhawk committed
84 85
    connect(m_ui->autoContinue, SIGNAL(stateChanged(int)), this, SLOT(changedAutoContinue(int)));
    connect(m_ui->selectedBox, SIGNAL(stateChanged(int)), this, SLOT(changedCurrent(int)));
86 87
    connect(m_ui->comboBox_action, SIGNAL(activated(int)), this, SLOT(changedAction(int)));
    connect(m_ui->comboBox_frame, SIGNAL(activated(int)), this, SLOT(changedFrame(int)));
pixhawk's avatar
pixhawk committed
88

89 90
    connect(m_ui->orbitSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setLoiterOrbit(double)));
    connect(m_ui->acceptanceSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setAcceptanceRadius(double)));
lm's avatar
lm committed
91
    connect(m_ui->holdTimeSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setHoldTime(double)));
92
    connect(m_ui->turnsSpinBox, SIGNAL(valueChanged(int)), wp, SLOT(setTurns(int)));
93
    connect(m_ui->takeOffAngleSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam1(double)));
94 95 96 97 98 99 100

    // Connect actions
    connect(customCommand->commandSpinBox, SIGNAL(valueChanged(int)),   wp, SLOT(setAction(int)));
    connect(customCommand->param1SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam1(double)));
    connect(customCommand->param2SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam2(double)));
    connect(customCommand->param3SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam3(double)));
    connect(customCommand->param4SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam4(double)));
101 102
    connect(customCommand->param5SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam5(double)));
    connect(customCommand->param6SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam6(double)));
lm's avatar
lm committed
103
    connect(customCommand->param7SpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setParam7(double)));
pixhawk's avatar
pixhawk committed
104 105
}

106
void WaypointEditableView::moveUp()
pixhawk's avatar
pixhawk committed
107 108 109 110
{
    emit moveUpWaypoint(wp);
}

111
void WaypointEditableView::moveDown()
pixhawk's avatar
pixhawk committed
112 113 114 115
{
    emit moveDownWaypoint(wp);
}

Alejandro's avatar
Alejandro committed
116

117
void WaypointEditableView::remove()
pixhawk's avatar
pixhawk committed
118 119
{
    emit removeWaypoint(wp);
120
    deleteLater();
pixhawk's avatar
pixhawk committed
121 122
}

123
void WaypointEditableView::changedAutoContinue(int state)
pixhawk's avatar
pixhawk committed
124 125
{
    if (state == 0)
126
        wp->setAutocontinue(false);
pixhawk's avatar
pixhawk committed
127
    else
128
        wp->setAutocontinue(true);
pixhawk's avatar
pixhawk committed
129 130
}

131
void WaypointEditableView::updateActionView(int action)
132
{
133 134
    // Remove stretch item at index 17 (m_ui->removeSpacer)
    m_ui->horizontalLayout->takeAt(17);
135
    // expose ui based on action
136

137
    switch(action) {
138
    case MAV_CMD_NAV_TAKEOFF:
139 140 141 142 143 144 145
        m_ui->orbitSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->turnsSpinBox->hide();
        m_ui->autoContinue->hide();
        m_ui->holdTimeSpinBox->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->customActionWidget->hide();
146
        m_ui->horizontalLayout->insertStretch(17, 82);
147 148
        m_ui->takeOffAngleSpinBox->show();
        break;
149
    case MAV_CMD_NAV_LAND:
150 151 152 153 154 155 156 157
        m_ui->orbitSpinBox->hide();
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->turnsSpinBox->hide();
        m_ui->autoContinue->hide();
        m_ui->holdTimeSpinBox->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->customActionWidget->hide();
158
        m_ui->horizontalLayout->insertStretch(17, 26);
159
        break;
160
    case MAV_CMD_NAV_RETURN_TO_LAUNCH:
161 162 163 164 165 166 167 168
        m_ui->orbitSpinBox->hide();
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->turnsSpinBox->hide();
        m_ui->autoContinue->hide();
        m_ui->holdTimeSpinBox->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->customActionWidget->hide();
169
        m_ui->horizontalLayout->insertStretch(17, 26);
170
        break;
171
    case MAV_CMD_NAV_WAYPOINT:
172 173 174
        m_ui->orbitSpinBox->hide();
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->turnsSpinBox->hide();
lm's avatar
lm committed
175
        m_ui->holdTimeSpinBox->show();
176
        m_ui->customActionWidget->hide();
177
        m_ui->horizontalLayout->insertStretch(17, 1);
178

179
        m_ui->autoContinue->show();
180 181
        m_ui->acceptanceSpinBox->show();
        m_ui->yawSpinBox->show();
182
        break;
183
    case MAV_CMD_NAV_LOITER_UNLIM:
184 185 186 187 188 189 190
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->turnsSpinBox->hide();
        m_ui->autoContinue->hide();
        m_ui->holdTimeSpinBox->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->customActionWidget->hide();
191
        m_ui->horizontalLayout->insertStretch(17, 25);
192 193
        m_ui->orbitSpinBox->show();
        break;
194
    case MAV_CMD_NAV_LOITER_TURNS:
195 196 197 198 199 200
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->autoContinue->hide();
        m_ui->holdTimeSpinBox->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->customActionWidget->hide();
201
        m_ui->horizontalLayout->insertStretch(17, 20);
202 203 204
        m_ui->orbitSpinBox->show();
        m_ui->turnsSpinBox->show();
        break;
205
    case MAV_CMD_NAV_LOITER_TIME:
206 207 208 209 210 211
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->turnsSpinBox->hide();
        m_ui->autoContinue->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->customActionWidget->hide();
212
        m_ui->horizontalLayout->insertStretch(17, 20);
213 214 215
        m_ui->orbitSpinBox->show();
        m_ui->holdTimeSpinBox->show();
        break;
LM's avatar
LM committed
216 217 218 219 220 221 222 223 224 225 226
//    case MAV_CMD_NAV_ORIENTATION_TARGET:
//        m_ui->orbitSpinBox->hide();
//        m_ui->takeOffAngleSpinBox->hide();
//        m_ui->turnsSpinBox->hide();
//        m_ui->holdTimeSpinBox->show();
//        m_ui->customActionWidget->hide();

//        m_ui->autoContinue->show();
//        m_ui->acceptanceSpinBox->hide();
//        m_ui->yawSpinBox->hide();
//        break;
227
    default:
228
        break;
229 230 231
    }
}

232 233 234
/**
 * @param index The index of the combo box of the action entry, NOT the action ID
 */
235
void WaypointEditableView::changedAction(int index)
236
{
237
    MAV_FRAME cur_frame = (MAV_FRAME) m_ui->comboBox_frame->itemData(m_ui->comboBox_frame->currentIndex()).toUInt();
238
    // set waypoint action
239
    int actionIndex = m_ui->comboBox_action->itemData(index).toUInt();
240
    if (actionIndex < MAV_CMD_ENUM_END && actionIndex >= 0) {
241
        MAV_CMD action = (MAV_CMD) actionIndex;
242 243 244 245 246 247 248
        wp->setAction(action);
    }

    // Expose ui based on action
    // Change to mission frame
    // if action is unknown

249
    switch(actionIndex) {
250 251 252 253 254 255 256
    case MAV_CMD_NAV_TAKEOFF:
    case MAV_CMD_NAV_LAND:
    case MAV_CMD_NAV_RETURN_TO_LAUNCH:
    case MAV_CMD_NAV_WAYPOINT:
    case MAV_CMD_NAV_LOITER_UNLIM:
    case MAV_CMD_NAV_LOITER_TURNS:
    case MAV_CMD_NAV_LOITER_TIME:
257
        changeViewMode(QGC_WAYPOINTEDITABLEVIEW_MODE_NAV);
258 259
        // Update frame view        
        updateFrameView(cur_frame);
260 261
        // Update view
        updateActionView(actionIndex);
262
        break;
263
    case MAV_CMD_ENUM_END:
264 265
    default:
        // Switch to mission frame
266
        changeViewMode(QGC_WAYPOINTEDITABLEVIEW_MODE_DIRECT_EDITING);
267 268 269
        break;
    }
}
270

271
void WaypointEditableView::changeViewMode(QGC_WAYPOINTEDITABLEVIEW_MODE mode)
272
{
lm's avatar
lm committed
273
    viewMode = mode;
274
    switch (mode) {
275 276
    case QGC_WAYPOINTEDITABLEVIEW_MODE_NAV:
    case QGC_WAYPOINTEDITABLEVIEW_MODE_CONDITION:
277 278
        // Hide everything, show condition widget
        // TODO
279
    case QGC_WAYPOINTEDITABLEVIEW_MODE_DO:
280

281
        break;
282
    case QGC_WAYPOINTEDITABLEVIEW_MODE_DIRECT_EDITING:
283 284 285 286 287 288 289 290 291 292 293 294 295 296
        // Hide almost everything
        m_ui->orbitSpinBox->hide();
        m_ui->takeOffAngleSpinBox->hide();
        m_ui->yawSpinBox->hide();
        m_ui->turnsSpinBox->hide();
        m_ui->holdTimeSpinBox->hide();
        m_ui->acceptanceSpinBox->hide();
        m_ui->posDSpinBox->hide();
        m_ui->posESpinBox->hide();
        m_ui->posNSpinBox->hide();
        m_ui->latSpinBox->hide();
        m_ui->lonSpinBox->hide();
        m_ui->altSpinBox->hide();

lm's avatar
lm committed
297 298 299
        int action_index = m_ui->comboBox_action->findData(MAV_CMD_ENUM_END);
        m_ui->comboBox_action->setCurrentIndex(action_index);

300
        // Show action widget
301
        if (!m_ui->customActionWidget->isVisible()) {
302 303
            m_ui->customActionWidget->show();
        }
304
        if (!m_ui->autoContinue->isVisible()) {
305 306
            m_ui->autoContinue->show();
        }
307
        break;
308
    }
lm's avatar
lm committed
309

310 311
}

312
void WaypointEditableView::updateFrameView(int frame)
313
{    
314
    switch(frame) {
315
    case MAV_FRAME_GLOBAL:
316
    case MAV_FRAME_GLOBAL_RELATIVE_ALT:
317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
        if (viewMode != QGC_WAYPOINTEDITABLEVIEW_MODE_DIRECT_EDITING)
        {
            m_ui->posNSpinBox->hide();
            m_ui->posESpinBox->hide();
            m_ui->posDSpinBox->hide();
            m_ui->lonSpinBox->show();
            m_ui->latSpinBox->show();
            m_ui->altSpinBox->show();
            // Coordinate frame
            m_ui->comboBox_frame->show();
            m_ui->customActionWidget->hide();
        }
        else // do not hide customActionWidget if Command is set to "Other"
        {
            m_ui->customActionWidget->show();
        }
333
        break;
334
    case MAV_FRAME_LOCAL_NED:
335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350
        if (viewMode != QGC_WAYPOINTEDITABLEVIEW_MODE_DIRECT_EDITING)
        {
            m_ui->lonSpinBox->hide();
            m_ui->latSpinBox->hide();
            m_ui->altSpinBox->hide();
            m_ui->posNSpinBox->show();
            m_ui->posESpinBox->show();
            m_ui->posDSpinBox->show();
            // Coordinate frame
            m_ui->comboBox_frame->show();
            m_ui->customActionWidget->hide();
        }
        else // do not hide customActionWidget if Command is set to "Other"
        {
            m_ui->customActionWidget->show();
        }
351
        break;
352 353 354 355 356
    default:
        std::cerr << "unknown frame" << std::endl;
    }
}

357
void WaypointEditableView::deleted(QObject* waypoint)
pixhawk's avatar
pixhawk committed
358
{
359
    Q_UNUSED(waypoint);
lm's avatar
lm committed
360 361 362 363
//    if (waypoint == this->wp)
//    {
//        deleteLater();
//    }
pixhawk's avatar
pixhawk committed
364 365
}

366
void WaypointEditableView::changedFrame(int index)
367 368 369 370 371 372 373 374
{
    // set waypoint action
    MAV_FRAME frame = (MAV_FRAME)m_ui->comboBox_frame->itemData(index).toUInt();
    wp->setFrame(frame);

    updateFrameView(frame);
}

375
void WaypointEditableView::changedCurrent(int state)
pixhawk's avatar
pixhawk committed
376
{
377
    //m_ui->selectedBox->blockSignals(true);
378 379 380 381
    if (state == 0)
    {
        if (wp->getCurrent() == true) //User clicked on the waypoint, that is already current
        {
382
            //qDebug() << "Editable " << wp->getId() << " changedCurrent: State 0, current true" ;
383 384 385 386 387
            m_ui->selectedBox->setChecked(true);
            m_ui->selectedBox->setCheckState(Qt::Checked);
        }
        else
        {
388
            //qDebug() << "Editable " << wp->getId() << " changedCurrent: State 0, current false";
389 390
            m_ui->selectedBox->setChecked(false);
            m_ui->selectedBox->setCheckState(Qt::Unchecked);
391
            //wp->setCurrent(false);
392 393 394 395
        }
    }
    else
    {
396
        //qDebug() << "Editable " << wp->getId() << " changedCurrent: State 2";
pixhawk's avatar
pixhawk committed
397
        wp->setCurrent(true);
398
        emit changeCurrentWaypoint(wp->getId());   //the slot changeCurrentWaypoint() in WaypointList sets all other current flags to false
pixhawk's avatar
pixhawk committed
399
    }
400
    //m_ui->selectedBox->blockSignals(false);
pixhawk's avatar
pixhawk committed
401 402
}

403
void WaypointEditableView::updateValues()
404
{
pixhawk's avatar
pixhawk committed
405 406
    // Check if we just lost the wp, delete the widget
    // accordingly
407
    if (!wp) {
pixhawk's avatar
pixhawk committed
408 409 410
        deleteLater();
        return;
    }
411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477

    //wp->blockSignals(true);

    // Deactivate all QDoubleSpinBox signals due to
    // unwanted rounding effects
    for (int j = 0; j  < children().size(); ++j)
    {
        // Store only QGCToolWidgetItems
        QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(children().at(j));
        if (spin)
        {
            //qDebug() << "DEACTIVATED SPINBOX #" << j;
            spin->blockSignals(true);
        }
        else
        {
            // Store only QGCToolWidgetItems
            QWidget* item = dynamic_cast<QWidget*>(children().at(j));
            if (item)
            {
                //qDebug() << "FOUND WIDGET BOX";
                for (int k = 0; k  < item->children().size(); ++k)
                {
                    // Store only QGCToolWidgetItems
                    QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(item->children().at(k));
                    if (spin)
                    {
                        //qDebug() << "DEACTIVATED SPINBOX #" << k;
                        spin->blockSignals(true);
                    }
                }
            }
        }
    }

    // Block all custom action widget actions
    for (int j = 0; j  < m_ui->customActionWidget->children().size(); ++j)
    {
        // Store only QGCToolWidgetItems
        QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(m_ui->customActionWidget->children().at(j));
        if (spin)
        {
            //qDebug() << "DEACTIVATED SPINBOX #" << j;
            spin->blockSignals(true);
        }
        else
        {
            // Store only QGCToolWidgetItems
            QWidget* item = dynamic_cast<QWidget*>(m_ui->customActionWidget->children().at(j));
            if (item)
            {
                //qDebug() << "CUSTOM ACTIONS FOUND WIDGET BOX";
                for (int k = 0; k  < item->children().size(); ++k)
                {
                    // Store only QGCToolWidgetItems
                    QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(item->children().at(k));
                    if (spin)
                    {
                        //qDebug() << "DEACTIVATED SPINBOX #" << k;
                        spin->blockSignals(true);
                    }
                }
            }
        }
    }


478 479
    // update frame
    MAV_FRAME frame = wp->getFrame();
480
    int frame_index = m_ui->comboBox_frame->findData(frame);
481
    if (m_ui->comboBox_frame->currentIndex() != frame_index) {
482
        m_ui->comboBox_frame->setCurrentIndex(frame_index);
483
        updateFrameView(frame);
484
    }
485
    switch(frame) {
486
    case MAV_FRAME_LOCAL_NED: {
487 488
        if (m_ui->posNSpinBox->value() != wp->getX()) {
            m_ui->posNSpinBox->setValue(wp->getX());
pixhawk's avatar
pixhawk committed
489
        }
490 491 492 493 494 495 496 497
        if (m_ui->posESpinBox->value() != wp->getY()) {
            m_ui->posESpinBox->setValue(wp->getY());
        }
        if (m_ui->posDSpinBox->value() != wp->getZ()) {
            m_ui->posDSpinBox->setValue(wp->getZ());
        }
    }
    break;
498
    case MAV_FRAME_GLOBAL:
499
    case MAV_FRAME_GLOBAL_RELATIVE_ALT: {
500 501 502 503
        if (m_ui->latSpinBox->value() != wp->getLatitude()) {
            // Rounding might occur, prevent spin box from
            // firing back changes
            m_ui->latSpinBox->setValue(wp->getLatitude());
pixhawk's avatar
pixhawk committed
504
        }
505 506 507 508
        if (m_ui->lonSpinBox->value() != wp->getLongitude()) {
            // Rounding might occur, prevent spin box from
            // firing back changes
            m_ui->lonSpinBox->setValue(wp->getLongitude());
509
        }
510 511 512 513
        if (m_ui->altSpinBox->value() != wp->getAltitude()) {
            // Rounding might occur, prevent spin box from
            // firing back changes
            m_ui->altSpinBox->setValue(wp->getAltitude());
514 515 516
        }
    }
    break;
517 518
    default:
        // Do nothing
519
        break;
520 521
    }

522
    // Update action
523
    MAV_CMD action = wp->getAction();
524
    int action_index = m_ui->comboBox_action->findData(action);
525
    // Set to "Other" action if it was -1
526 527
    if (action_index == -1)
    {
528
        action_index = m_ui->comboBox_action->findData(MAV_CMD_ENUM_END);
529 530
    }
    // Only update if changed
531 532
    if (m_ui->comboBox_action->currentIndex() != action_index)
    {
533
        // If action is unknown, set direct editing mode
534 535
        if (wp->getAction() < 0 || wp->getAction() > MAV_CMD_NAV_TAKEOFF)
        {
536
            changeViewMode(QGC_WAYPOINTEDITABLEVIEW_MODE_DIRECT_EDITING);
537 538 539
        }
        else
        {
540
            if (viewMode != QGC_WAYPOINTEDITABLEVIEW_MODE_DIRECT_EDITING)
541
            {
lm's avatar
lm committed
542 543
                // Action ID known, update
                m_ui->comboBox_action->setCurrentIndex(action_index);
544
                updateActionView(action);                
lm's avatar
lm committed
545
            }
546
        }
pixhawk's avatar
pixhawk committed
547
    }
548

549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564
//    // Do something on actions - currently unused
////    switch(action) {
////    case MAV_CMD_NAV_TAKEOFF:
////        break;
////    case MAV_CMD_NAV_LAND:
////        break;
////    case MAV_CMD_NAV_WAYPOINT:
////        break;
////    case MAV_CMD_NAV_LOITER_UNLIM:
////        break;
////    default:
////        std::cerr << "unknown action" << std::endl;
////    }

    if (m_ui->yawSpinBox->value() != wp->getYaw())
    {
lm's avatar
lm committed
565
        m_ui->yawSpinBox->setValue(wp->getYaw());
pixhawk's avatar
pixhawk committed
566
    }
567 568
    if (m_ui->selectedBox->isChecked() != wp->getCurrent())
    {
pixhawk's avatar
pixhawk committed
569 570
        m_ui->selectedBox->setChecked(wp->getCurrent());
    }
571 572
    if (m_ui->autoContinue->isChecked() != wp->getAutoContinue())
    {
pixhawk's avatar
pixhawk committed
573 574
        m_ui->autoContinue->setChecked(wp->getAutoContinue());
    }
pixhawk's avatar
pixhawk committed
575
    m_ui->idLabel->setText(QString("%1").arg(wp->getId()));
576 577
    if (m_ui->orbitSpinBox->value() != wp->getLoiterOrbit())
    {
578 579
        m_ui->orbitSpinBox->setValue(wp->getLoiterOrbit());
    }
580 581
    if (m_ui->acceptanceSpinBox->value() != wp->getAcceptanceRadius())
    {
582
        m_ui->acceptanceSpinBox->setValue(wp->getAcceptanceRadius());
pixhawk's avatar
pixhawk committed
583
    }
584 585
    if (m_ui->holdTimeSpinBox->value() != wp->getHoldTime())
    {
pixhawk's avatar
pixhawk committed
586 587
        m_ui->holdTimeSpinBox->setValue(wp->getHoldTime());
    }
588 589
    if (m_ui->turnsSpinBox->value() != wp->getTurns())
    {
590 591
        m_ui->turnsSpinBox->setValue(wp->getTurns());
    }
592 593
    if (m_ui->takeOffAngleSpinBox->value() != wp->getParam1())
    {
594 595
        m_ui->takeOffAngleSpinBox->setValue(wp->getParam1());
    }
596

597
//    // UPDATE CUSTOM ACTION WIDGET
598

599 600
    if (customCommand->commandSpinBox->value() != wp->getAction())
    {
601
        customCommand->commandSpinBox->setValue(wp->getAction());
602
        // qDebug() << "Changed action";
603 604
    }
    // Param 1
605
    if (customCommand->param1SpinBox->value() != wp->getParam1()) {
606 607 608
        customCommand->param1SpinBox->setValue(wp->getParam1());
    }
    // Param 2
609
    if (customCommand->param2SpinBox->value() != wp->getParam2()) {
610 611 612
        customCommand->param2SpinBox->setValue(wp->getParam2());
    }
    // Param 3
613
    if (customCommand->param3SpinBox->value() != wp->getParam3()) {
614 615 616
        customCommand->param3SpinBox->setValue(wp->getParam3());
    }
    // Param 4
617
    if (customCommand->param4SpinBox->value() != wp->getParam4()) {
618 619
        customCommand->param4SpinBox->setValue(wp->getParam4());
    }
620
    // Param 5
621
    if (customCommand->param5SpinBox->value() != wp->getParam5()) {
622 623 624
        customCommand->param5SpinBox->setValue(wp->getParam5());
    }
    // Param 6
625
    if (customCommand->param6SpinBox->value() != wp->getParam6()) {
626 627
        customCommand->param6SpinBox->setValue(wp->getParam6());
    }
lm's avatar
lm committed
628
    // Param 7
629
    if (customCommand->param7SpinBox->value() != wp->getParam7()) {
lm's avatar
lm committed
630 631
        customCommand->param7SpinBox->setValue(wp->getParam7());
    }
632

633 634 635 636 637 638 639 640
    QColor backGroundColor = QGC::colorBackground;

    static int lastId = -1;
    int currId = wp->getId() % 2;

    if (currId != lastId)
    {

641
        // qDebug() << "COLOR ID: " << currId;
642 643 644 645 646 647 648 649 650
        if (currId == 1)
        {
            //backGroundColor = backGroundColor.lighter(150);
            backGroundColor = QColor("#252528").lighter(150);
        }
        else
        {
            backGroundColor = QColor("#252528").lighter(250);
        }
651
        // qDebug() << "COLOR:" << backGroundColor.name();
652 653 654 655 656 657 658 659 660 661 662 663

        // Update color based on id
        QString groupBoxStyle = QString("QGroupBox {padding: 0px; margin: 0px; border: 0px; background-color: %1; }").arg(backGroundColor.name());
        QString labelStyle = QString("QWidget {background-color: %1; color: #DDDDDF; border-color: #EEEEEE; }").arg(backGroundColor.name());
        QString checkBoxStyle = QString("QCheckBox {background-color: %1; color: #454545; border-color: #EEEEEE; }").arg(backGroundColor.name());

        m_ui->autoContinue->setStyleSheet(checkBoxStyle);
        m_ui->selectedBox->setStyleSheet(checkBoxStyle);
        m_ui->idLabel->setStyleSheet(labelStyle);
        m_ui->groupBox->setStyleSheet(groupBoxStyle);
        lastId = currId;
    }
664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728

    // Activate all QDoubleSpinBox signals due to
    // unwanted rounding effects
    for (int j = 0; j  < children().size(); ++j)
    {
        // Store only QGCToolWidgetItems
        QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(children().at(j));
        if (spin)
        {
            //qDebug() << "ACTIVATED SPINBOX #" << j;
            spin->blockSignals(false);
        }
        else
        {
            // Store only QGCToolWidgetItems
            QGroupBox* item = dynamic_cast<QGroupBox*>(children().at(j));
            if (item)
            {
                //qDebug() << "FOUND GROUP BOX";
                for (int k = 0; k  < item->children().size(); ++k)
                {
                    // Store only QGCToolWidgetItems
                    QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(item->children().at(k));
                    if (spin)
                    {
                        //qDebug() << "ACTIVATED SPINBOX #" << k;
                        spin->blockSignals(false);
                    }
                }
            }
        }
    }

    // Unblock all custom action widget actions
    for (int j = 0; j  < m_ui->customActionWidget->children().size(); ++j)
    {
        // Store only QGCToolWidgetItems
        QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(m_ui->customActionWidget->children().at(j));
        if (spin)
        {
            //qDebug() << "ACTIVATED SPINBOX #" << j;
            spin->blockSignals(false);
        }
        else
        {
            // Store only QGCToolWidgetItems
            QWidget* item = dynamic_cast<QWidget*>(m_ui->customActionWidget->children().at(j));
            if (item)
            {
                //qDebug() << "FOUND WIDGET BOX";
                for (int k = 0; k  < item->children().size(); ++k)
                {
                    // Store only QGCToolWidgetItems
                    QDoubleSpinBox* spin = dynamic_cast<QDoubleSpinBox*>(item->children().at(k));
                    if (spin)
                    {
                       //qDebug() << "ACTIVATED SPINBOX #" << k;
                        spin->blockSignals(false);
                    }
                }
            }
        }
    }

//    wp->blockSignals(false);
729 730
}

731
void WaypointEditableView::setCurrent(bool state)
pixhawk's avatar
pixhawk committed
732
{
733
    m_ui->selectedBox->blockSignals(true);
734
    m_ui->selectedBox->setChecked(state);
735
    m_ui->selectedBox->blockSignals(false);
pixhawk's avatar
pixhawk committed
736 737
}

738
WaypointEditableView::~WaypointEditableView()
pixhawk's avatar
pixhawk committed
739 740 741 742
{
    delete m_ui;
}

743
void WaypointEditableView::changeEvent(QEvent *e)
pixhawk's avatar
pixhawk committed
744 745 746 747 748 749 750 751 752
{
    switch (e->type()) {
    case QEvent::LanguageChange:
        m_ui->retranslateUi(this);
        break;
    default:
        break;
    }
}