MissionControllerTest.cc 6.99 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*=====================================================================
 
 QGroundControl Open Source Ground Control Station
 
 (c) 2009 - 2014 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 
 This file is part of the QGROUNDCONTROL project
 
 QGROUNDCONTROL is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
 
 QGROUNDCONTROL is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
 
 ======================================================================*/

#include "MissionControllerTest.h"
#include "LinkManager.h"
#include "MultiVehicleManager.h"
27
#include "SimpleMissionItem.h"
28 29

MissionControllerTest::MissionControllerTest(void)
Don Gagne's avatar
Don Gagne committed
30 31 32
    : _multiSpyMissionController(NULL)
    , _multiSpyMissionItem(NULL)
    , _missionController(NULL)
33 34 35 36 37 38 39
{
    
}

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

Don Gagne's avatar
Don Gagne committed
42 43 44 45 46 47
    delete _multiSpyMissionController;
    _multiSpyMissionController = NULL;

    delete _multiSpyMissionItem;
    _multiSpyMissionItem = NULL;

48 49 50 51 52
    MissionControllerManagerTest::cleanup();
}

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

55 56
    MissionControllerManagerTest::_initForFirmwareType(firmwareType);

Don Gagne's avatar
Don Gagne committed
57 58 59 60 61 62
    void coordinateChanged(const QGeoCoordinate& coordinate);
    void headingDegreesChanged(double heading);
    void dirtyChanged(bool dirty);
    void homePositionValidChanged(bool homePostionValid);

    // MissionItem signals
63
    _rgMissionItemSignals[coordinateChangedSignalIndex] = SIGNAL(coordinateChanged(const QGeoCoordinate&));
Don Gagne's avatar
Don Gagne committed
64 65

    // MissionController signals
66
    _rgMissionControllerSignals[visualItemsChangedSignalIndex] =    SIGNAL(visualItemsChanged());
67
    _rgMissionControllerSignals[waypointLinesChangedSignalIndex] =  SIGNAL(waypointLinesChanged());
68

Don Gagne's avatar
Don Gagne committed
69 70 71 72 73
    if (!_missionController) {
        startController = true;
        _missionController = new MissionController();
        Q_CHECK_PTR(_missionController);
    }
74

Don Gagne's avatar
Don Gagne committed
75 76 77
    _multiSpyMissionController = new MultiSignalSpy();
    Q_CHECK_PTR(_multiSpyMissionController);
    QCOMPARE(_multiSpyMissionController->init(_missionController, _rgMissionControllerSignals, _cMissionControllerSignals), true);
78

Don Gagne's avatar
Don Gagne committed
79 80 81
    if (startController) {
        _missionController->start(false /* editMode */);
    }
82 83

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

87 88
    QmlObjectListModel* visualItems = _missionController->visualItems();
    QVERIFY(visualItems);
89 90

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

Don Gagne's avatar
Don Gagne committed
93
    // Home position should be in first slot, but not yet valid
94
    SimpleMissionItem* homeItem = qobject_cast<SimpleMissionItem*>(visualItems->get(0));
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
    QVERIFY(homeItem);
    QCOMPARE(homeItem->homePosition(), true);

    // Home should have no children
    QCOMPARE(homeItem->childItems()->count(), 0);

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

    // AutoSync should be off by default
    QCOMPARE(_missionController->autoSync(), false);
}

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

117 118 119
    QmlObjectListModel* visualItems = _missionController->visualItems();
    QVERIFY(visualItems);
    SimpleMissionItem* homeItem = qobject_cast<SimpleMissionItem*>(visualItems->get(0));
120 121
    QVERIFY(homeItem);

Don Gagne's avatar
Don Gagne committed
122
    _setupMissionItemSignals(homeItem);
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
}

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);

141
    _missionController->insertSimpleMissionItem(coordinate, _missionController->visualItems()->count());
142

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

145 146
    QmlObjectListModel* visualItems = _missionController->visualItems();
    QVERIFY(visualItems);
147

148
    QCOMPARE(visualItems->count(), 2);
149

150 151
    SimpleMissionItem* homeItem = qobject_cast<SimpleMissionItem*>(visualItems->get(0));
    SimpleMissionItem* item = qobject_cast<SimpleMissionItem*>(visualItems->get(1));
152 153 154 155
    QVERIFY(homeItem);
    QVERIFY(item);

    QCOMPARE(item->command(), MavlinkQmlSingleton::MAV_CMD_NAV_TAKEOFF);
156
    QCOMPARE(homeItem->childItems()->count(), firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA ? 1 : 0);
157 158
    QCOMPARE(item->childItems()->count(), 0);

159 160 161
#if 0
    // This needs re-work
    int expectedLineCount = firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA ? 0 : 1;
162 163 164 165

    QmlObjectListModel* waypointLines = _missionController->waypointLines();
    QVERIFY(waypointLines);
    QCOMPARE(waypointLines->count(), expectedLineCount);
166
#endif
167 168 169 170 171 172 173 174 175 176 177 178
}

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


void MissionControllerTest::_testAddWayppointPX4(void)
{
    _testAddWaypointWorker(MAV_AUTOPILOT_PX4);
}
Don Gagne's avatar
Don Gagne committed
179 180 181 182 183 184 185

void MissionControllerTest::_testOfflineToOnlineWorker(MAV_AUTOPILOT firmwareType)
{
    // Start offline and add item
    _missionController = new MissionController();
    Q_CHECK_PTR(_missionController);
    _missionController->start(true /* editMode */);
186
    _missionController->insertSimpleMissionItem(QGeoCoordinate(37.803784, -122.462276), _missionController->visualItems()->count());
Don Gagne's avatar
Don Gagne committed
187 188 189 190 191

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

    // Make sure our offline mission items are still there
192
    QCOMPARE(_missionController->visualItems()->count(), 2);
Don Gagne's avatar
Don Gagne committed
193 194 195 196 197 198 199 200 201 202 203
}

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

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

205
void MissionControllerTest::_setupMissionItemSignals(SimpleMissionItem* item)
Don Gagne's avatar
Don Gagne committed
206 207 208 209 210 211 212
{
    delete _multiSpyMissionItem;

    _multiSpyMissionItem = new MultiSignalSpy();
    Q_CHECK_PTR(_multiSpyMissionItem);
    QCOMPARE(_multiSpyMissionItem->init(item, _rgMissionItemSignals, _cMissionItemSignals), true);
}