// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- /* This program 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. This program 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 this program. If not, see . */ #ifndef __AP_GPS_H__ #define __AP_GPS_H__ #include #include #include #include #include #include #include "GPS_detect_state.h" /** maximum number of GPS instances available on this platform. If more than 1 then redundent sensors may be available */ #if HAL_CPU_CLASS > HAL_CPU_CLASS_16 #define GPS_MAX_INSTANCES 2 #else #define GPS_MAX_INSTANCES 1 #endif class DataFlash_Class; class AP_GPS_Backend; /// @class AP_GPS /// GPS driver main class class AP_GPS { public: // constructor AP_GPS() { AP_Param::setup_object_defaults(this, var_info); } /// Startup initialisation. void init(DataFlash_Class *dataflash); /// Update GPS state based on possible bytes received from the module. /// This routine must be called periodically (typically at 10Hz or /// more) to process incoming data. void update(void); // GPS driver types enum GPS_Type { GPS_TYPE_NONE = 0, GPS_TYPE_AUTO = 1, GPS_TYPE_UBLOX = 2, GPS_TYPE_MTK = 3, GPS_TYPE_MTK19 = 4, GPS_TYPE_NMEA = 5, GPS_TYPE_SIRF = 6 }; /// GPS status codes enum GPS_Status { NO_GPS = 0, ///< No GPS connected/detected NO_FIX = 1, ///< Receiving valid GPS messages but no lock GPS_OK_FIX_2D = 2, ///< Receiving valid messages and 2D lock GPS_OK_FIX_3D = 3 ///< Receiving valid messages and 3D lock }; // GPS navigation engine settings. Not all GPS receivers support // this enum GPS_Engine_Setting { GPS_ENGINE_NONE = -1, GPS_ENGINE_PORTABLE = 0, GPS_ENGINE_STATIONARY = 2, GPS_ENGINE_PEDESTRIAN = 3, GPS_ENGINE_AUTOMOTIVE = 4, GPS_ENGINE_SEA = 5, GPS_ENGINE_AIRBORNE_1G = 6, GPS_ENGINE_AIRBORNE_2G = 7, GPS_ENGINE_AIRBORNE_4G = 8 }; struct GPS_State { uint8_t instance; // the instance number of this GPS // all the following fields must all be filled by the backend driver GPS_Status status; ///< driver fix status uint32_t time_week_ms; ///< GPS time (milliseconds from start of GPS week) uint16_t time_week; ///< GPS week number Location location; ///< last fix location float ground_speed; ///< ground speed in m/sec int32_t ground_course_cd; ///< ground course in 100ths of a degree int16_t hdop; ///< horizontal dilution of precision in cm uint8_t num_sats; ///< Number of visible satelites Vector3f velocity; ///< 3D velocitiy in m/s, in NED format bool have_vertical_velocity:1; ///< does this GPS give vertical velocity? uint32_t last_gps_time_ms; ///< the system time we got the last GPS timestamp, milliseconds }; // Accessor functions // return number of active GPS sensors uint8_t num_sensors(void) const { uint8_t count = 0; for (uint8_t i=0; i #include #include #include #include #include #endif // __AP_GPS_H__