Skip to content
WimaController.cc 38 KiB
Newer Older
    //qWarning() << "missionControllerVisuals->count()" << missionControllerVisuals->count();

    // create speed item
    int speedItemIndex = 1;
    _missionController->insertSimpleMissionItem(speedItemCoordinate, speedItemIndex);
    SimpleMissionItem *speedItem = missionControllerVisuals->value<SimpleMissionItem*>(speedItemIndex);
    if (speedItem == nullptr) {
        qWarning("WimaController: nullptr");
        return false;
    }
    speedItem->setCommand(MAV_CMD_DO_CHANGE_SPEED);
    speedItem->setCoordinate(speedItemCoordinate);
    speedItem->missionItem().setParam2(_arrivalReturnSpeed.rawValue().toDouble());

    // set second item command to ordinary waypoint (is takeoff)
    SimpleMissionItem *secondItem = missionControllerVisuals->value<SimpleMissionItem*>(2);
    if (secondItem == nullptr) {
        qWarning("WimaController: nullptr");
        return false;
    }
    secondItem->setCoordinate(speedItemCoordinate);
    secondItem->setCommand(MAV_CMD_NAV_WAYPOINT);


    // set land command for last mission item
    SimpleMissionItem *landItem = missionControllerVisuals->value<SimpleMissionItem*>(missionControllerVisuals->count()-1);
    if (landItem == nullptr) {
        qWarning("WimaController: nullptr");
        return false;
    }
    _missionController->setLandCommand(*landItem);

    _setPhaseDistance(_phaseDistance + _arrivalPathLength + _returnPathLength);
    _setPhaseDuration(_phaseDistance/_flightSpeed.rawValue().toDouble()
                      + (_arrivalPathLength + _returnPathLength)
                      / _arrivalReturnSpeed.rawValue().toDouble());
    updateAltitude();

    _showAllMissionItems.setRawValue(false);
    managerVehicle->trajectoryPoints()->clear();

    emit uploadAndExecuteConfirmRequired();
    return true;
}

void WimaController::_setVehicleHasLowBattery(bool batteryLow)
{
    if (_vehicleHasLowBattery != batteryLow) {
        _vehicleHasLowBattery = batteryLow;

        emit vehicleHasLowBatteryChanged();
    }
}

bool WimaController::_executeSmartRTL(QString &errorSring)
{
Valentin Platzgummer's avatar
Valentin Platzgummer committed
    Q_UNUSED(errorSring)
    _executingSmartRTL = true;
    connect(masterController()->managerVehicle(), &Vehicle::flyingChanged, this, &WimaController::smartRTLCleanUp);
    forceUploadToVehicle();
    masterController()->managerVehicle()->startMission();

    return true;
}

void WimaController::_loadCurrentMissionItemsFromBuffer()
{
    _missionController->removeAll();
    int numItems = _missionItemsBuffer.count();
    for (int i = 0; i < numItems; i++) {
        SimpleMissionItem *item = _missionItemsBuffer.value<SimpleMissionItem *>(i);
        if (item != nullptr)
            _missionController->insertSimpleMissionItem(item->missionItem(), i+1);
        else {
            qWarning("WimaController::_loadCurrentMissionItemsFromBuffer(): internal error");
            return;
        }
    }
    _missionItems.clearAndDeleteContents();
}


void WimaController::_saveCurrentMissionItemsToBuffer()
{
    _missionItemsBuffer.clear();
    int numItems = _missionController->visualItems()->count();
    for (int i = 0; i < numItems; i++) {
        SimpleMissionItem *item = _missionController->visualItems()->value<SimpleMissionItem *>(i);
        if (item != nullptr)
            _missionItems.append(new SimpleMissionItem(*item, true /* flyView */, this));
        else {
            qWarning("WimaController::_loadCurrentMissionItemsFromBuffer(): internal error");
            return;
        }
    }