WimaController.cc 7.48 KB
Newer Older
Valentin Platzgummer's avatar
Valentin Platzgummer committed
1
#include "WimaController.h"
2

3 4 5
const char* WimaController::wimaFileExtension   = "wima";
const char* WimaController::areaItemsName       = "AreaItems";
const char* WimaController::missionItemsName    = "MissionItems";
6

7 8 9 10
WimaController::WimaController(QObject *parent)
    : QObject               (parent)
    , _container            (nullptr)
    , _joinedArea           (this)
11 12
    , _measurementArea      (this)
    , _serviceArea          (this)
13
    , _corridor             (this)
14
    , _localPlanDataValid   (false)
15
{
16

17 18
}

19
QmlObjectListModel* WimaController::visualItems()
20
{
21
    return &_visualItems;
22 23
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
24 25 26 27
QStringList WimaController::loadNameFilters() const
{
    QStringList filters;

28
    filters << tr("Supported types (*.%1 *.%2)").arg(wimaFileExtension).arg(AppSettings::planFileExtension) <<
Valentin Platzgummer's avatar
Valentin Platzgummer committed
29 30
               tr("All Files (*.*)");
    return filters;
31 32 33 34 35
}

QStringList WimaController::saveNameFilters() const
{
    QStringList filters;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
36

37 38
    filters << tr("Supported types (*.%1 *.%2)").arg(wimaFileExtension).arg(AppSettings::planFileExtension);
    return filters;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
39 40
}

41
WimaDataContainer *WimaController::dataContainer()
42
{
43
    return _container;
44 45
}

46 47 48 49 50
QmlObjectListModel *WimaController::missionItems()
{
    return &_missionItems;
}

51 52 53 54 55
QVariantList WimaController::waypointPath()
{
    return  _waypointPath;
}

56 57 58 59 60 61 62 63 64 65 66 67
void WimaController::setMasterController(PlanMasterController *masterC)
{
    _masterController = masterC;
    emit masterControllerChanged();
}

void WimaController::setMissionController(MissionController *missionC)
{
    _missionController = missionC;
    emit missionControllerChanged();
}

68 69 70 71 72 73
/*!
 * \fn void WimaController::setDataContainer(WimaDataContainer *container)
 * Sets the pointer to the \c WimaDataContainer, which is meant to exchange data between the \c WimaController and the \c WimaPlaner.
 *
 * \sa WimaPlaner, WimaDataContainer, WimaPlanData
 */
74 75
void WimaController::setDataContainer(WimaDataContainer *container)
{
76 77 78 79 80
    if (container != nullptr) {
        if (_container != nullptr) {
           disconnect(_container, &WimaDataContainer::dataValidChanged, this, &WimaController::containerDataValidChanged);
        }

81
        _container = container;
82
        connect(_container, &WimaDataContainer::dataValidChanged, this, &WimaController::containerDataValidChanged);
83 84 85 86 87

        emit dataContainerChanged();
    }
}

88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
void WimaController::startMission()
{

}

void WimaController::abortMission()
{

}

void WimaController::pauseMission()
{

}

void WimaController::resumeMission()
{

}

108 109
bool WimaController::updateMission()
{
110
    return true;
111 112
}

113
void WimaController::saveToCurrent()
114 115 116
{
}

117 118
void WimaController::saveToFile(const QString& filename)
{
119
    QString file = filename;
120 121
}

122
bool WimaController::loadFromCurrent()
123
{
124
    return true;
125 126 127 128
}

bool WimaController::loadFromFile(const QString &filename)
{
129
    QString file = filename;
130
    return true;
131 132 133
}


134

135
QJsonDocument WimaController::saveToJson(FileType fileType)
136
{
137 138 139 140
    if(fileType)
    {

    }
141
    return QJsonDocument();
142 143
}

144 145 146 147 148 149 150 151
/*!
 * \fn void WimaController::containerDataValidChanged(bool valid)
 * Pulls plan data generated by \c WimaPlaner from the \c _container if the data is valid (\a valid equals true).
 * Is connected to the dataValidChanged() signal of the \c WimaDataContainer.
 *
 * \sa WimaDataContainer, WimaPlaner, WimaPlanData
 */
void WimaController::containerDataValidChanged(bool valid)
152
{
153 154 155 156 157
    if ( valid ) {
        if (_container == nullptr) {
            qWarning("WimaController::containerDataValidChanged(): No container assigned!");
        }
        _localPlanDataValid = false;
158
        _visualItems.clear();
159
        _missionItems.clear();
160 161 162 163 164 165 166 167 168 169 170
        WimaPlanData planData = _container->pull();

        // extract list with WimaAreas
        QList<const WimaAreaData*> areaList = planData.areaList();

        int areaCounter = 0;
        int numAreas = 4; // extract only numAreas Areas, if there are more they are invalid and ignored
        for (int i = 0; i < areaList.size(); i++) {
            const WimaAreaData *areaData = areaList[i];

            if (areaData->type() == WimaServiceAreaData::typeString) { // is it a service area?
171
                _serviceArea = *qobject_cast<const WimaServiceAreaData*>(areaData);
172
                areaCounter++;
173
                _visualItems.append(&_serviceArea);
174 175 176 177

                continue;
            }

178 179
            if (areaData->type() == WimaMeasurementAreaData::typeString) { // is it a measurement area?
                _measurementArea =  *qobject_cast<const WimaMeasurementAreaData*>(areaData);
180
                areaCounter++;
181
                _visualItems.append(&_measurementArea);
182 183 184 185

                continue;
            }

186 187
            if (areaData->type() == WimaCorridorData::typeString) { // is it a corridor?
                _corridor =  *qobject_cast<const WimaCorridorData*>(areaData);
188
                areaCounter++;
189
                //_visualItems.append(&_corridor); // not needed
190 191 192 193

                continue;
            }

194 195
            if (areaData->type() == WimaJoinedAreaData::typeString) { // is it a corridor?
                _joinedArea =  *qobject_cast<const WimaJoinedAreaData*>(areaData);
196
                areaCounter++;
197
                _visualItems.append(&_joinedArea);
198 199

                continue;
200
            }
201 202 203 204 205

            if (areaCounter >= numAreas)
                break;
        }

206 207 208 209 210
#ifdef QT_DEBUG
        //qWarning("containerDataValidChanged(): count:");
        //qWarning() << planData.missionItems().count();
#endif

211 212
        QList<const MissionItem*> tempMissionItems = planData.missionItems();

213
        _missionController->removeAll();
214
        QmlObjectListModel* missionControllerVisualItems = _missionController->visualItems();
215
        for ( auto missionItem : tempMissionItems) {
216
            _missionController->insertSimpleMissionItem(*missionItem, missionControllerVisualItems->count());
217
        }
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235

        MissionSettingsItem *settingsItem     = qobject_cast<MissionSettingsItem *>((*missionControllerVisualItems)[0]);
        if (settingsItem == nullptr) {
            qWarning("WimaController::containerDataValidChanged(): Nullptr at MissionSettingsItem!");
            return;
        }
        //_missionItems.append(settingsItem);

        for ( int i = 1; i < missionControllerVisualItems->count(); i++) {
            SimpleMissionItem *visualItem     = qobject_cast<SimpleMissionItem *>((*missionControllerVisualItems)[i]);
            if (visualItem == nullptr) {
                qWarning("WimaController::containerDataValidChanged(): Nullptr at SimpleMissionItem!");
                return;
            }
            SimpleMissionItem *visualItemCopy = new SimpleMissionItem(*visualItem, true, this);
            _missionItems.append(visualItemCopy);
        }

236
        updateWaypointPath();
237
        _missionController->removeAll();
238

239 240
        if (areaCounter == numAreas)
            _localPlanDataValid = true;
241

242 243
    } else {
        _localPlanDataValid = false;
244 245
        _visualItems.clear();
        _missionItems.clear();
246
    }
247 248

    emit visualItemsChanged();
249
    emit missionItemsChanged();
250 251 252 253 254

#ifdef QT_DEBUG
    //qWarning("Mission Items count: ");
    //qWarning() << _missionItems.count();
#endif
255 256
}

257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272
void WimaController::updateWaypointPath()
{
    _waypointPath.clear();

    for ( int i = 1; i < _missionItems.count(); i++) {
        SimpleMissionItem *item = qobject_cast<SimpleMissionItem *>(_missionItems[i]);
        if (item == nullptr) {
            qWarning("WimaController::updateWaypointPath(): nullptr");
            return;
        }
        _waypointPath.append(QVariant::fromValue(item->coordinate()));
    }

    emit waypointPathChanged();
}

273 274


275 276


277 278