FirmwareUpgradeController.h 5.85 KB
Newer Older
1 2 3 4
/*=====================================================================
 
 QGroundControl Open Source Ground Control Station
 
5
 (c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 
 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/>.
 
 ======================================================================*/

/// @file
///     @author Don Gagne <don@thegagnes.com>

27 28
#ifndef FirmwareUpgradeController_H
#define FirmwareUpgradeController_H
29

30 31 32
#include "PX4FirmwareUpgradeThread.h"

#include <QObject>
33 34 35 36
#include <QUrl>
#include <QTimer>
#include <QNetworkAccessManager>
#include <QNetworkReply>
37 38
#include <QPixmap>
#include <QQuickItem>
39

40 41
#include "qextserialport.h"

42 43
#include <stdint.h>

44 45
// Firmware Upgrade MVC Controller for FirmwareUpgrade.qml.
class FirmwareUpgradeController : public QObject
46 47
{
    Q_OBJECT
48
    
49
public:
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
    FirmwareUpgradeController(void);
    
    /// Supported firmware types
    typedef enum {
        StableFirmware,
        BetaFirmware,
        DeveloperFirmware,
        CustomFirmware
    } FirmwareType_t;

    Q_ENUMS(FirmwareType_t)
    
    /// Firmare type to load
    Q_PROPERTY(FirmwareType_t firmwareType READ firmwareType WRITE setFirmwareType)
    
    /// Upgrade push button in UI
    Q_PROPERTY(QQuickItem* upgradeButton READ upgradeButton WRITE setUpgradeButton)
67

68 69 70
    /// TextArea for log output
    Q_PROPERTY(QQuickItem* statusLog READ statusLog WRITE setStatusLog)
    
71 72 73
    /// Progress bar for you know what
    Q_PROPERTY(QQuickItem* progressBar READ progressBar WRITE setProgressBar)
    
74 75 76 77 78 79 80 81 82
    /// Begins the firware upgrade process
    Q_INVOKABLE void doFirmwareUpgrade(void);

    FirmwareType_t firmwareType(void) { return _firmwareType; }
    void setFirmwareType(FirmwareType_t firmwareType) { _firmwareType = firmwareType; }
    
    QQuickItem* upgradeButton(void) { return _upgradeButton; }
    void setUpgradeButton(QQuickItem* upgradeButton) { _upgradeButton = upgradeButton; }
    
83 84 85
    QQuickItem* progressBar(void) { return _progressBar; }
    void setProgressBar(QQuickItem* progressBar) { _progressBar = progressBar; }
    
86 87 88
    QQuickItem* statusLog(void) { return _statusLog; }
    void setStatusLog(QQuickItem* statusLog) { _statusLog = statusLog; }
    
89 90 91 92
private slots:
    void _downloadProgress(qint64 curr, qint64 total);
    void _downloadFinished(void);
    void _downloadError(QNetworkReply::NetworkError code);
Don Gagne's avatar
Don Gagne committed
93
    void _foundBoard(bool firstTry, const QString portname, QString portDescription);
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
    void _foundBootloader(int bootloaderVersion, int boardID, int flashSize);
    void _error(const int command, const QString errorString);
    void _bootloaderSyncFailed(void);
    void _findTimeout(void);
    void _complete(const int command);
    void _updateProgress(int curr, int total);
    void _restart(void);
    void _eraseProgressTick(void);

private:
    void _findBoard(void);
    void _findBootloader(void);
    void _cancel(void);
    void _getFirmwareFile(void);
    void _downloadFirmware(void);
    void _erase(void);
110
    void _appendStatusLog(const QString& text);
111 112 113 114 115
	bool _decompressJsonValue(const QJsonObject&	jsonObject,
							  const QByteArray&     jsonDocBytes,
							  const QString&		sizeKey,
                              const QString&		bytesKey,
                              QByteArray&			decompressedBytes);
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
    
    QString _portName;
    QString _portDescription;
    uint32_t _bootloaderVersion;

    static const int _boardIDPX4FMUV1 = 5;  ///< Board ID for PX4 V1 board
    static const int _boardIDPX4FMUV2 = 9;  ///< Board ID for PX4 V2 board
    static const int _boardIDPX4Flow = 6;   ///< Board ID for PX4 Flow board

    uint32_t    _boardID;           ///< Board ID
    uint32_t    _boardFlashSize;    ///< Flash size in bytes of board
    uint32_t    _imageSize;         ///< Image size of firmware being flashed

    QPixmap _boardIcon;             ///< Icon used to display image of board
    
    QString _firmwareFilename;      ///< Image which we are going to flash to the board
    
    QNetworkAccessManager*  _downloadManager;       ///< Used for firmware file downloading across the internet
    QNetworkReply*          _downloadNetworkReply;  ///< Used for firmware file downloading across the internet
    
    /// @brief Thread controller which is used to run bootloader commands on seperate thread
    PX4FirmwareUpgradeThreadController* _threadController;
    
    static const int    _eraseTickMsec = 500;       ///< Progress bar update tick time for erase
    static const int    _eraseTotalMsec = 15000;    ///< Estimated amount of time erase takes
    int                 _eraseTickCount;            ///< Number of ticks for erase progress update
    QTimer              _eraseTimer;                ///< Timer used to update progress bar for erase

    static const int    _findBoardTimeoutMsec = 30000;      ///< Amount of time for user to plug in USB
    static const int    _findBootloaderTimeoutMsec = 5000;  ///< Amount time to look for bootloader
    
147 148 149
    FirmwareType_t  _firmwareType;      ///< Firmware type to load
    QQuickItem*     _upgradeButton;     ///< Upgrade button in ui
    QQuickItem*     _statusLog;         ///< Status log TextArea Qml control
150
    QQuickItem*     _progressBar;
151 152
    
    bool _searchingForBoard;    ///< true: searching for board, false: search for bootloader
153 154
};

155
#endif