Skip to content
Snippets Groups Projects
MG.h 12.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • pixhawk's avatar
    pixhawk committed
    /*=====================================================================
    
    PIXHAWK Micro Air Vehicle Flying Robotics Toolkit
    
    (c) 2009 PIXHAWK PROJECT  <http://pixhawk.ethz.ch>
    
    This file is part of the PIXHAWK project
    
        PIXHAWK 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.
    
        PIXHAWK 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 PIXHAWK. If not, see <http://www.gnu.org/licenses/>.
    
    ======================================================================*/
    
    /**
     * @file
     *   @brief Helper functions
     *
     *   @author Lorenz Meier <mavteam@student.ethz.ch>
     *
     */
    
    
    #ifndef _MG_H_
    #define _MG_H_
    
    #include <QDateTime>
    #include <QDebug>
    #include <QDir>
    #include <QThread>
    #include <cmath>
    
    namespace MG
    {
    
        const static int MAX_FLIGHT_TIME = 60 * 60 * 24 * 21;
    
    pixhawk's avatar
    pixhawk committed
    
        class VERSION
        {
        public:
    
            static const int MAJOR = 1;
            static const int MINOR = 01;
        };
    
        class SYSTEM
        {
        public:
    
            static const int ID = 127;
            static const int COMPID = 0;
            static int getID()
            {
                return SYSTEM::ID;
            }
        };
    
    
        class SLEEP : public QThread
        {
        public:
            /**
             * @brief Set a thread to sleep for seconds
             * @param s time in seconds to sleep
             **/
            static void sleep(unsigned long s)
            {
                QThread::sleep(s);
            }
            /**
             * @brief Set a thread to sleep for milliseconds
             * @param ms time in milliseconds to sleep
             **/
            static void msleep(unsigned long ms)
            {
                QThread::msleep(ms);
            }
            /**
             * @brief Set a thread to sleep for microseconds
             * @param us time in microseconds to sleep
             **/
            static void usleep(unsigned long us)
            {
                QThread::usleep(us);
            }
        };
    
    
        class UNITS
        {
        public:
    
            /** The distance units supported for display by the groundstation **/
            enum DistanceUnit {
                METER,
                CENTIMETER,
                MILLIMETER,
                INCH,
                FEET,
                MILE
            };
    
            /**
             * @brief Convert a distance in meters into another distance unit system
             *
             * @param in The distance to convert
             * @param newUnit The new unit to convert to
             *
             * @return The converted distance
             */
            static double convertFromMeter(double in, DistanceUnit newUnit)
            {
                double result = in;
    
                // Conversion table in meter
                static const double inInch = 39.3700787;
                static const double inFeet = 3.2808399;
                static const double inMile = 0.000000621371192;
                static const double inCentimeter = 100;
                static const double inMillimeter = 1000;
    
                switch (newUnit) {
                case METER:
                    result = in;
                    break;
                case CENTIMETER:
                    result = in * inCentimeter;
                    break;
                case MILLIMETER:
                    result = in * inMillimeter;
                    break;
                case INCH:
                    result = in * inInch;
                    break;
                case FEET:
                    result = in * inFeet;
                    break;
                case MILE:
                    result = in * inMile;
                    break;
                }
    
                return result;
            }
    
            /**
             * @brief Convert between two distance units
             *
             * This convenience function allows to convert between arbitrary distance units
             *
             * @param in The input distance
             * @param inputUnit The input unit
             * @param outputUnit The output unit
             *
             * @return The converted distance
             */
            static double convert(double in, DistanceUnit inputUnit, DistanceUnit outputUnit)
            {
                double meters = convertToMeter(in, inputUnit);
                return convertFromMeter(meters, outputUnit);
            }
    
            /**
             * @brief Convert a distance to the meter unit
             *
             * @param in The distance to convert
             * @param inputUnit The unit the distance is represented in
             *
             * @return The converted distance
             */
            static double convertToMeter(double in, DistanceUnit inputUnit) {
    
                double result = in;
    
    
                // Conversion table in meter
                static const double inInch = 39.3700787;
                static const double inFeet = 3.2808399;
                static const double inMile = 0.000000621371192;
                static const double inCentimeter = 100;
                static const double inMillimeter = 1000;
    
                // Don't convert if new unit is same unit
    
                switch (inputUnit) {
                case METER:
                    result = in;
                    break;
                case CENTIMETER:
                    result = in / inCentimeter;
                    break;
                case MILLIMETER:
                    result = in / inMillimeter;
                    break;
                case INCH:
                    result = in / inInch;
                    break;
                case FEET:
                    result = in / inFeet;
                    break;
                case MILE:
                    result = in / inMile;
                    break;
                }
    
                return result;
            }
    
        };
    
        class DISPLAY {
    
        public:
    
            DISPLAY() {
                // Initialize static class display with notebook display default value
                //pixelSize = 0.224f;
                //setPixelSize(0.224f);
            }
    
            ~DISPLAY() {
    
            }
    
            /**
             * @brief Get the size of a single pixel
             *
             * This value can be used to generate user interfaces with
             * a size in physical units, for example a gauge which is
             * always 50.8 mm (2") in diameter, regardless of the screen.
             *
             * @return The horizontal and vertical size of a pixel-square
             */
            static double getPixelSize() {
                return 0.224f;
            }
    
            /**
             * @brief Set the size of a single pixel
             *
             * @param size The horizontal and vertical size of a pixel-square
             */
            static void setPixelSize(double size) {
                pixelSize = size;
            }
    
            /**
             * @brief Set the size of a single pixel
             *
             * This method calculates the pixel size from the vertical and horizontal
             * resolution and the screen diameter. The diameter is in mm (as this unit
             * is a SI unit). One inch = 25.4 mm
             *
             * @param horizontalResolution The horizontal screen resolution, e.g. 1280.
             * @param verticalResolution The vertical screen resolution, e.g. 800.
             * @param screenDiameter The screen diameter in mm, e.g. 13.3" = 338 mm.
             */
            static void setPixelSize(int horizontalResolution, int verticalResolution, double screenDiameter) {
    
                pixelSize = screenDiameter / sqrt(static_cast<float>(horizontalResolution*horizontalResolution + verticalResolution*verticalResolution));
    
    pixhawk's avatar
    pixhawk committed
            }
    
        private:
            /** The size of a single pixel **/
            static double pixelSize;
        };
    
        class STAT {
            /** The time interval for the last few moments in milliseconds **/
            static const int SHORT_TERM_INTERVAL = 300;
            /** The time interval for the last moment in milliseconds **/
            static const int CURRENT_INTERVAL = 50;
        };
    
        class TIME {
    
        public:
    
            //static const QString ICONDIR = "./icons";
    
            /**
             * @brief Convenience method to get the milliseconds time stamp for now
             *
             * The timestamp is created at the instant of calling this method. It is
             * defined as the number of milliseconds since unix epoch, which is
             * 1.1.1970, 00:00 UTC.
             *
             * @return The number of milliseconds elapsed since unix epoch
             * @deprecated Will the replaced by time helper class
             **/
            static quint64 getGroundTimeNow() {
                QDateTime time = QDateTime::currentDateTime();
                time = time.toUTC();
                /* Return seconds and milliseconds, in milliseconds unit */
                quint64 milliseconds = time.toTime_t() * static_cast<quint64>(1000);
                return static_cast<quint64>(milliseconds + time.time().msec());
            }
    
    
            /**
             * @brief Convenience method to get the milliseconds time stamp for now
             *
             * The timestamp is created at the instant of calling this method. It is
             * defined as the number of milliseconds since unix epoch, which is
             * 1.1.1970, 00:00 UTC.
             *
             * @return The number of milliseconds elapsed since unix epoch
             * @deprecated Will the replaced by time helper class
             **/
            static quint64 getGroundTimeNowUsecs() {
                QDateTime time = QDateTime::currentDateTime();
                time = time.toUTC();
                /* Return seconds and milliseconds, in milliseconds unit */
                quint64 microseconds = time.toTime_t() * static_cast<quint64>(1000000);
                return static_cast<quint64>(microseconds + (time.time().msec()*1000));
            }
    
    
    pixhawk's avatar
    pixhawk committed
            /*tatic quint64 getMissionTimeUsecs()
            {
                ;
            }*/
    
            /**
             * Convert milliseconds to an QDateTime object. This method converts the amount of
             * milliseconds since 1.1.1970, 00:00 UTC (unix epoch) to a QDateTime date object.
             *
             * @param msecs The milliseconds since unix epoch (in Qt unsigned 64bit integer type quint64)
             * @return The QDateTime object set to corresponding date and time
             * @deprecated Will the replaced by time helper class
             **/
            static QDateTime msecToQDateTime(quint64 msecs) {
                QDateTime time = QDateTime();
                /* Set date and time depending on the seconds since unix epoch,
                     * integer division truncates the milliseconds */
                time.setTime_t(msecs / 1000);
                /* Add the milliseconds, modulo returns the milliseconds part */
                return time.addMSecs(msecs % 1000);
            }
    
        };
    
        class DIR {
    
        public:
            /**
             * @brief Get the current support file directory.
             *
             * The support files are files like icons or fonts and are typically found in the
             * same directory as the main executable.
             *
             * @return The absolute path of the directory
             **/
            static QString getSupportFilesDirectory() {
    
                // Checks if the software is executed in the development environment
                QString path = QDir::current().absolutePath();
                QDir currentDir = QDir::current();
    
                if (QDir::current().dirName().toLower() == "debug")
                {
                    // Debug folder of development environment
                    path.append("/..");
                }
                else if (QDir::current().dirName().toLower() == "release")
                {
                    // Release folder of development environment
                    path.append("/..");
                }
                else if (QDir::current().dirName().toLower() == "bin")
                {
                    // Release folder of development environment
                    path.append("/..");
                }
                else if (QDir::current().dirName().toLower() == "macos")
                {
                    // Mac application bundle in development environment
                    path.append("/../../../../..");
                }
    
                // Check if we are still in a development folder
                if(currentDir.cdUp())
                {
                    if(currentDir.dirName().toLower() == "build")
                    {
                        path.append("/..");
                    }
                }
                //TODO The Mac application bundle in distribution is not yet included here
                //qDebug() << "MG::supportfilesdirectory" << path;
                return path;
            }
    
            /**
             * @brief Get the current icon directory.
             *
             * The icon directory is typically a subdirectory of the main directory,
             * but depends on the platform. For example in OS X it is part of the bundle.
             *
             * @return The absolute path of the icon directory
             **/
            static QString getIconDirectory() {
                return MG::DIR::getSupportFilesDirectory() + "/images/";
            }
    
        };
    
    }
    
    #endif // _MG_H_