MockLinkMissionItemHandler.cc 7.51 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
/*=====================================================================
 
 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 "MockLinkMissionItemHandler.h"
Don Gagne's avatar
Don Gagne committed
25
#include "MockLink.h"
26 27 28

#include <QDebug>

Don Gagne's avatar
Don Gagne committed
29
QGC_LOGGING_CATEGORY(MockLinkMissionItemHandlerLog, "MockLinkMissionItemHandlerLog")
30

Don Gagne's avatar
Don Gagne committed
31 32 33
MockLinkMissionItemHandler::MockLinkMissionItemHandler(MockLink* mockLink)
    : QObject(mockLink)
    , _mockLink(mockLink)
34
{
Don Gagne's avatar
Don Gagne committed
35
    Q_ASSERT(mockLink);
36 37
}

Don Gagne's avatar
Don Gagne committed
38
bool MockLinkMissionItemHandler::handleMessage(const mavlink_message_t& msg)
39 40 41
{
    switch (msg.msgid) {
        case MAVLINK_MSG_ID_MISSION_REQUEST_LIST:
Don Gagne's avatar
Don Gagne committed
42
            _handleMissionRequestList(msg);
43
            break;
Don Gagne's avatar
Don Gagne committed
44
            
45
        case MAVLINK_MSG_ID_MISSION_REQUEST:
Don Gagne's avatar
Don Gagne committed
46
            _handleMissionRequest(msg);
47
            break;
Don Gagne's avatar
Don Gagne committed
48 49 50 51 52
            
        case MAVLINK_MSG_ID_MISSION_ITEM:
            _handleMissionItem(msg);
            break;
            
53
        case MAVLINK_MSG_ID_MISSION_COUNT:
Don Gagne's avatar
Don Gagne committed
54
            _handleMissionCount(msg);
55
            break;
Don Gagne's avatar
Don Gagne committed
56 57 58 59 60 61 62
            
        case MAVLINK_MSG_ID_MISSION_ACK:
            // Acks are received back for each MISSION_ITEM message
            break;
            
        case MAVLINK_MSG_ID_MISSION_SET_CURRENT:
            // Sets the currently active mission item
63 64 65 66
            break;
    
        case MAVLINK_MSG_ID_MISSION_CLEAR_ALL:
            // Delete all mission items
Don Gagne's avatar
Don Gagne committed
67
            _missionItems.clear();
68
            break;
Don Gagne's avatar
Don Gagne committed
69 70 71
            
        default:
            return false;
72
    }
Don Gagne's avatar
Don Gagne committed
73 74
    
    return true;
75 76
}

Don Gagne's avatar
Don Gagne committed
77
void MockLinkMissionItemHandler::_handleMissionRequestList(const mavlink_message_t& msg)
78
{
Don Gagne's avatar
Don Gagne committed
79
    qCDebug(MockLinkMissionItemHandlerLog) << "_handleMissionRequestList read sequence";
80
    
Don Gagne's avatar
Don Gagne committed
81
    mavlink_mission_request_list_t request;
82
    
Don Gagne's avatar
Don Gagne committed
83
    mavlink_msg_mission_request_list_decode(&msg, &request);
84
    
Don Gagne's avatar
Don Gagne committed
85
    Q_ASSERT(request.target_system == _mockLink->vehicleId());
86
    
Don Gagne's avatar
Don Gagne committed
87
    mavlink_message_t   responseMsg;
88
    
Don Gagne's avatar
Don Gagne committed
89 90 91 92 93 94 95 96
    mavlink_msg_mission_count_pack(_mockLink->vehicleId(),
                                   MAV_COMP_ID_MISSIONPLANNER,
                                   &responseMsg,            // Outgoing message
                                   msg.sysid,               // Target is original sender
                                   msg.compid,              // Target is original sender
                                   _missionItems.count());  // Number of mission items
    _mockLink->respondWithMavlinkMessage(responseMsg);
}
97

Don Gagne's avatar
Don Gagne committed
98
void MockLinkMissionItemHandler::_handleMissionRequest(const mavlink_message_t& msg)
99
{
Don Gagne's avatar
Don Gagne committed
100
    qCDebug(MockLinkMissionItemHandlerLog) << "_handleMissionRequest read sequence";
101
    
Don Gagne's avatar
Don Gagne committed
102
    mavlink_mission_request_t request;
103
    
Don Gagne's avatar
Don Gagne committed
104
    mavlink_msg_mission_request_decode(&msg, &request);
105
    
Don Gagne's avatar
Don Gagne committed
106 107
    Q_ASSERT(request.target_system == _mockLink->vehicleId());
    Q_ASSERT(request.seq < _missionItems.count());
108
    
Don Gagne's avatar
Don Gagne committed
109
    mavlink_message_t   responseMsg;
110
    
Don Gagne's avatar
Don Gagne committed
111
    mavlink_mission_item_t item = _missionItems[request.seq];
112
    
Don Gagne's avatar
Don Gagne committed
113 114 115 116 117 118 119 120 121 122 123 124 125
    mavlink_msg_mission_item_pack(_mockLink->vehicleId(),
                                  MAV_COMP_ID_MISSIONPLANNER,
                                  &responseMsg,            // Outgoing message
                                  msg.sysid,               // Target is original sender
                                  msg.compid,              // Target is original sender
                                  request.seq,             // Index of mission item being sent
                                  item.frame,
                                  item.command,
                                  item.current,
                                  item.autocontinue,
                                  item.param1, item.param2, item.param3, item.param4,
                                  item.x, item.y, item.z);
    _mockLink->respondWithMavlinkMessage(responseMsg);
126 127
}

Don Gagne's avatar
Don Gagne committed
128
void MockLinkMissionItemHandler::_handleMissionCount(const mavlink_message_t& msg)
129
{
Don Gagne's avatar
Don Gagne committed
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
    qCDebug(MockLinkMissionItemHandlerLog) << "_handleMissionCount write sequence";
    
    mavlink_mission_count_t missionCount;
    
    mavlink_msg_mission_count_decode(&msg, &missionCount);
    Q_ASSERT(missionCount.target_system == _mockLink->vehicleId());
    
    _writeSequenceCount = missionCount.count;
    Q_ASSERT(_writeSequenceCount >= 0);
    
    // FIXME: Set up a timer for a failed write sequence
    
    _missionItems.clear();
    
    if (_writeSequenceCount == 0) {
        // FIXME: NYI
146
    } else {
Don Gagne's avatar
Don Gagne committed
147 148
        _writeSequenceIndex = 0;
        _requestNextMissionItem(_writeSequenceIndex);
149 150 151
    }
}

Don Gagne's avatar
Don Gagne committed
152
void MockLinkMissionItemHandler::_requestNextMissionItem(int sequenceNumber)
153
{
Don Gagne's avatar
Don Gagne committed
154 155 156 157 158
    qCDebug(MockLinkMissionItemHandlerLog) << "_requestNextMissionItem write sequence sequenceNumber:" << sequenceNumber;
    
    if (sequenceNumber >= _writeSequenceCount) {
        qCWarning(MockLinkMissionItemHandlerLog) << "_requestNextMissionItem requested seqeuence number > write count sequenceNumber::_writeSequenceCount" << sequenceNumber << _writeSequenceCount;
        return;
159
    }
Don Gagne's avatar
Don Gagne committed
160 161 162 163 164 165 166 167 168 169
    
    mavlink_message_t           message;
    mavlink_mission_request_t   missionRequest;
    
    missionRequest.target_system =      MAVLinkProtocol::instance()->getSystemId();
    missionRequest.target_component =   MAVLinkProtocol::instance()->getComponentId();
    missionRequest.seq =                sequenceNumber;
    
    mavlink_msg_mission_request_encode(_mockLink->vehicleId(), MAV_COMP_ID_MISSIONPLANNER, &message, &missionRequest);
    _mockLink->respondWithMavlinkMessage(message);
170

Don Gagne's avatar
Don Gagne committed
171
    // FIXME: Timeouts
172 173 174
}


Don Gagne's avatar
Don Gagne committed
175
void MockLinkMissionItemHandler::_handleMissionItem(const mavlink_message_t& msg)
176
{
Don Gagne's avatar
Don Gagne committed
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
    qCDebug(MockLinkMissionItemHandlerLog) << "_handleMissionItem write sequence";
    
    mavlink_mission_item_t missionItem;
    
    mavlink_msg_mission_item_decode(&msg, &missionItem);
    
    Q_ASSERT(missionItem.target_system == _mockLink->vehicleId());
    
    Q_ASSERT(!_missionItems.contains(missionItem.seq));
    Q_ASSERT(missionItem.seq == _writeSequenceIndex);
    
    _missionItems[missionItem.seq] = missionItem;
    
    // FIXME: Timeouts
    
    _writeSequenceIndex++;
    if (_writeSequenceIndex < _writeSequenceCount) {
        _requestNextMissionItem(_writeSequenceIndex);
195
    } else {
Don Gagne's avatar
Don Gagne committed
196 197 198 199 200 201 202 203 204 205
        qCDebug(MockLinkMissionItemHandlerLog) << "_handleMissionItem sending final ack, write sequence complete";
        mavlink_message_t       message;
        mavlink_mission_ack_t   missionAck;
        
        missionAck.target_system =      MAVLinkProtocol::instance()->getSystemId();
        missionAck.target_component =   MAVLinkProtocol::instance()->getComponentId();
        missionAck.type =               MAV_MISSION_ACCEPTED;
        
        mavlink_msg_mission_ack_encode(_mockLink->vehicleId(), MAV_COMP_ID_MISSIONPLANNER, &message, &missionAck);
        _mockLink->respondWithMavlinkMessage(message);
206 207
    }
}