MissionControllerTest.cc 6.72 KB
Newer Older
1 2 3 4 5 6 7 8 9
/****************************************************************************
 *
 *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

10 11 12 13

#include "MissionControllerTest.h"
#include "LinkManager.h"
#include "MultiVehicleManager.h"
14
#include "SimpleMissionItem.h"
Don Gagne's avatar
Don Gagne committed
15
#include "MissionSettingsItem.h"
16 17

MissionControllerTest::MissionControllerTest(void)
Don Gagne's avatar
Don Gagne committed
18 19 20
    : _multiSpyMissionController(NULL)
    , _multiSpyMissionItem(NULL)
    , _missionController(NULL)
21 22 23 24 25 26 27
{
    
}

void MissionControllerTest::cleanup(void)
{
    delete _missionController;
Don Gagne's avatar
Don Gagne committed
28
    _missionController = NULL;
29

Don Gagne's avatar
Don Gagne committed
30 31 32 33 34 35
    delete _multiSpyMissionController;
    _multiSpyMissionController = NULL;

    delete _multiSpyMissionItem;
    _multiSpyMissionItem = NULL;

36 37 38 39 40
    MissionControllerManagerTest::cleanup();
}

void MissionControllerTest::_initForFirmwareType(MAV_AUTOPILOT firmwareType)
{
Don Gagne's avatar
Don Gagne committed
41 42
    bool startController = false;

43 44
    MissionControllerManagerTest::_initForFirmwareType(firmwareType);

Don Gagne's avatar
Don Gagne committed
45 46
    // VisualMissionItem signals
    _rgVisualItemSignals[coordinateChangedSignalIndex] = SIGNAL(coordinateChanged(const QGeoCoordinate&));
Don Gagne's avatar
Don Gagne committed
47 48

    // MissionController signals
49
    _rgMissionControllerSignals[visualItemsChangedSignalIndex] =    SIGNAL(visualItemsChanged());
50
    _rgMissionControllerSignals[waypointLinesChangedSignalIndex] =  SIGNAL(waypointLinesChanged());
51

Don Gagne's avatar
Don Gagne committed
52 53 54 55 56
    if (!_missionController) {
        startController = true;
        _missionController = new MissionController();
        Q_CHECK_PTR(_missionController);
    }
57

Don Gagne's avatar
Don Gagne committed
58 59 60
    _multiSpyMissionController = new MultiSignalSpy();
    Q_CHECK_PTR(_multiSpyMissionController);
    QCOMPARE(_multiSpyMissionController->init(_missionController, _rgMissionControllerSignals, _cMissionControllerSignals), true);
61

Don Gagne's avatar
Don Gagne committed
62
    if (startController) {
Don Gagne's avatar
Don Gagne committed
63
        _missionController->start(true /* editMode */);
Don Gagne's avatar
Don Gagne committed
64
    }
65 66

    // All signals should some through on start
67
    QCOMPARE(_multiSpyMissionController->checkOnlySignalsByMask(visualItemsChangedSignalMask | waypointLinesChangedSignalMask), true);
Don Gagne's avatar
Don Gagne committed
68
    _multiSpyMissionController->clearAllSignals();
69

70 71
    QmlObjectListModel* visualItems = _missionController->visualItems();
    QVERIFY(visualItems);
72 73

    // Empty vehicle only has home position
74
    QCOMPARE(visualItems->count(), 1);
75

Don Gagne's avatar
Don Gagne committed
76 77 78 79 80 81
    // Mission Settings should be in first slot
    MissionSettingsItem* settingsItem = visualItems->value<MissionSettingsItem*>(0);
    QVERIFY(settingsItem);

    // Offline vehicle, so no home position
    QCOMPARE(settingsItem->coordinate().isValid(), false);
82

Don Gagne's avatar
Don Gagne committed
83 84
    // Empty mission, so no child items possible
    QCOMPARE(settingsItem->childItems()->count(), 0);
85 86 87 88 89 90 91 92 93 94 95 96 97 98

    // No waypoint lines
    QmlObjectListModel* waypointLines = _missionController->waypointLines();
    QVERIFY(waypointLines);
    QCOMPARE(waypointLines->count(), 0);
}

void MissionControllerTest::_testEmptyVehicleWorker(MAV_AUTOPILOT firmwareType)
{
    _initForFirmwareType(firmwareType);

    // FYI: A significant amount of empty vehicle testing is in _initForFirmwareType since that
    // sets up an empty vehicle

99 100
    QmlObjectListModel* visualItems = _missionController->visualItems();
    QVERIFY(visualItems);
Don Gagne's avatar
Don Gagne committed
101 102
    VisualMissionItem* visualItem = visualItems->value<VisualMissionItem*>(0);
    QVERIFY(visualItem);
103

Don Gagne's avatar
Don Gagne committed
104
    _setupVisualItemSignals(visualItem);
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
}

void MissionControllerTest::_testEmptyVehiclePX4(void)
{
    _testEmptyVehicleWorker(MAV_AUTOPILOT_PX4);
}

void MissionControllerTest::_testEmptyVehicleAPM(void)
{
    _testEmptyVehicleWorker(MAV_AUTOPILOT_ARDUPILOTMEGA);
}

void MissionControllerTest::_testAddWaypointWorker(MAV_AUTOPILOT firmwareType)
{
    _initForFirmwareType(firmwareType);

    QGeoCoordinate coordinate(37.803784, -122.462276);

123
    _missionController->insertSimpleMissionItem(coordinate, _missionController->visualItems()->count());
124

Don Gagne's avatar
Don Gagne committed
125
    QCOMPARE(_multiSpyMissionController->checkOnlySignalsByMask(waypointLinesChangedSignalMask), true);
126

127 128
    QmlObjectListModel* visualItems = _missionController->visualItems();
    QVERIFY(visualItems);
129

130
    QCOMPARE(visualItems->count(), 2);
131

Don Gagne's avatar
Don Gagne committed
132 133 134 135
    MissionSettingsItem* settingsItem = visualItems->value<MissionSettingsItem*>(0);
    SimpleMissionItem* simpleItem = visualItems->value<SimpleMissionItem*>(1);
    QVERIFY(settingsItem);
    QVERIFY(simpleItem);
136

Don Gagne's avatar
Don Gagne committed
137 138
    QCOMPARE(simpleItem->command(), MavlinkQmlSingleton::MAV_CMD_NAV_TAKEOFF);
    QCOMPARE(simpleItem->childItems()->count(), 0);
139

Don Gagne's avatar
Don Gagne committed
140 141 142
    // If the first item added specifies a coordinate, then planned home position will be set
    bool plannedHomePositionValue = firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA ? false : true;
    QCOMPARE(settingsItem->coordinate().isValid(), plannedHomePositionValue);
143

Don Gagne's avatar
Don Gagne committed
144 145 146 147 148
    // ArduPilot takeoff command has no coordinate, so should be child item
    QCOMPARE(settingsItem->childItems()->count(), firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA ? 1 : 0);

    // Check waypoint line from home to takeoff
    int expectedLineCount = firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA ? 0 : 1;
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
    QmlObjectListModel* waypointLines = _missionController->waypointLines();
    QVERIFY(waypointLines);
    QCOMPARE(waypointLines->count(), expectedLineCount);
}

void MissionControllerTest::_testAddWayppointAPM(void)
{
    _testAddWaypointWorker(MAV_AUTOPILOT_ARDUPILOTMEGA);
}


void MissionControllerTest::_testAddWayppointPX4(void)
{
    _testAddWaypointWorker(MAV_AUTOPILOT_PX4);
}
Don Gagne's avatar
Don Gagne committed
164 165 166 167 168 169 170

void MissionControllerTest::_testOfflineToOnlineWorker(MAV_AUTOPILOT firmwareType)
{
    // Start offline and add item
    _missionController = new MissionController();
    Q_CHECK_PTR(_missionController);
    _missionController->start(true /* editMode */);
171
    _missionController->insertSimpleMissionItem(QGeoCoordinate(37.803784, -122.462276), _missionController->visualItems()->count());
Don Gagne's avatar
Don Gagne committed
172 173 174 175

    // Go online to empty vehicle
    MissionControllerManagerTest::_initForFirmwareType(firmwareType);

Don Gagne's avatar
Don Gagne committed
176 177 178 179 180
#if 1
    // Due to current limitations, offline items will go away
    QCOMPARE(_missionController->visualItems()->count(), 1);
#else
    //Make sure our offline mission items are still there
181
    QCOMPARE(_missionController->visualItems()->count(), 2);
Don Gagne's avatar
Don Gagne committed
182
#endif
Don Gagne's avatar
Don Gagne committed
183 184 185 186 187 188 189 190 191 192 193
}

void MissionControllerTest::_testOfflineToOnlineAPM(void)
{
    _testOfflineToOnlineWorker(MAV_AUTOPILOT_ARDUPILOTMEGA);
}

void MissionControllerTest::_testOfflineToOnlinePX4(void)
{
    _testOfflineToOnlineWorker(MAV_AUTOPILOT_PX4);
}
Don Gagne's avatar
Don Gagne committed
194

Don Gagne's avatar
Don Gagne committed
195
void MissionControllerTest::_setupVisualItemSignals(VisualMissionItem* visualItem)
Don Gagne's avatar
Don Gagne committed
196 197 198 199 200
{
    delete _multiSpyMissionItem;

    _multiSpyMissionItem = new MultiSignalSpy();
    Q_CHECK_PTR(_multiSpyMissionItem);
Don Gagne's avatar
Don Gagne committed
201
    QCOMPARE(_multiSpyMissionItem->init(visualItem, _rgVisualItemSignals, _cVisualItemSignals), true);
Don Gagne's avatar
Don Gagne committed
202
}