/****************************************************************************
**
** Copyright (C) 2019-2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
** Copyright (C) 2019-2022 General Magic B.V., info@generalmagic.com
**
** BSD License Usage
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of Klarälvdalens Datakonsult AB nor the names of
**     its contributors may be used to endorse or promote products derived
**     from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
****************************************************************************/

//! [MapView code]
import QtQuick 2.12
import QtQuick.Window 2.12
import GeneralMagic 2.0
import FpsCounter 1.0
import QtPositioning 5.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Positioning")

    /**************************************
    // For mobile (android, ios) applications, the following setup is enough
    PositionSource {
        id: qtPositionSource
        active: true
        Component.onCompleted: ServicesManager.dataSource.setPositionSource(qtPositionSource)
    }
    **************************************/


    /**************************************
    // Embedded linux using gypsy daemon
    PositionSource {
        id: qtPositionSource
        name: "gypsy"
        active: true
        Component.onCompleted: ServicesManager.dataSource.setPositionSource(qtPositionSource)
    }
    **************************************/


    /**************************************
    // Embedded linux using serialnmea
    PositionSource {
        id: qtPositionSource
        name: "serialnmea"
        active: true

        // assuming that your GPS receiver is registered as /dev/ttyUSB0, we need to tell serialnmea plugin about it:
        PluginParameter { name: "serialnmea.serial_port"; value: "ttyUSB0" }
        // alternatively you can set QT_NMEA_SERIAL_PORT env variable to ttyUSB0 and you can drop the PluginParameter line

        Component.onCompleted: ServicesManager.dataSource.setPositionSource(qtPositionSource)
    }
    **************************************/

    /**************************************
    // Manually crafted positions
    function feedEngine(externalPos)
    {
        let pos = ServicesManager.createPosition();
        // mandatory fields
        pos.timeStamp = externalPos.time_stamp; // do not use new Date() !
        pos.latitude = externalPos.latitude;
        pos.longitude = externalPos.longitude;
        pos.horizontalAccuracy = externalPos.horizontal_accuracy;
        pos.speed = externalPos.speed;
        pos.course = externalPos.course;
        pos.courseAccuracy = externalPos.course_accuracy;

        // optional fields. All these fields are filled with default values,
        // so if you don't have valid values, do no set them
        if (externalPos.has_altitude)
            pos.altitude = externalPos.altitude;
        if (externalPos.has_vertical_accuracy)
            pos.verticalAccuracy = externalPos.vertical_accuracy;
        if (externalPos.has_speed_accuracy)
            pos.speedAccuracy = externalPos.speed_accuracy;

        // finally push the position to the engine
        ServicesManager.dataSource.pushPosition(pos);
    }

    // Let's say you have custom position source named MyCustomPositionSource
    // which will notify us via \b PositionUpdated signal when it has a new position
    MyCustomPositionSource {
        onPositionUpdated: feedEngine(position)
    }

    **************************************/

    property var updater: ServicesManager.contentUpdater(ContentItem.Type.RoadMap)
    Component.onCompleted: {
        ServicesManager.dataSource.setPositionSource(qtPositionSource)
        //! [Set token safely]
        ServicesManager.settings.token = __my_secret_token;
        //! [Set token safely]

        ServicesManager.logLevel = ServicesManager.Error;
        ServicesManager.settings.allowInternetConnection = true; // enable connection to online services

        updater.autoApplyWhenReady = true;
        updater.update();
    }

    FpsCounter {
        id: fpsCounter
    }

    MapView {
        id: map
        anchors.fill: parent
        viewAngle: 25
        zoomLevel: 69
        viewPerspective: MapView.ViewPerspective.View3D
        buildingsVisibility: MapView.BuildingsVisibility.Show3D
        detailsQualityLevel: MapView.DetailsQualityLevel.Medium
        gestures: MapView.Gesture.Pan | MapView.Gesture.PanEnableVelocity | MapView.Gesture.Pinch | MapView.Gesture.Rotate | MapView.Gesture.Tilt
        Text {
            anchors.left: parent.left
            anchors.top: parent.top
            text: fpsCounter.fps
        }
        Component.onCompleted: startFollowingPosition() // follow current position
    }
}
//! [MapView code]
