altos: Add U-Blox GPS driver
[fw/altos] / src / drivers / ao_gps_ublox.h
diff --git a/src/drivers/ao_gps_ublox.h b/src/drivers/ao_gps_ublox.h
new file mode 100644 (file)
index 0000000..13bf695
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * Copyright © 2013 Keith Packard <keithp@keithp.com>
+ *
+ * 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; version 2 of the License.
+ *
+ * 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, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_GPS_UBLOX_H_
+#define _AO_GPS_UBLOX_H_
+
+struct ublox_hdr {
+       uint8_t         class, message;
+       uint16_t        length;
+};
+
+#define UBLOX_NAV              0x01
+
+#define UBLOX_NAV_DOP          0x04
+
+struct ublox_nav_dop {
+       uint8_t         class;          /* 0x01 */
+       uint8_t         message;        /* 0x04 */
+       uint16_t        length;         /* 18 */
+
+       uint32_t        itow;           /* ms */
+       uint16_t        gdop;
+       uint16_t        ddop;
+       uint16_t        tdop;
+       uint16_t        vdop;
+       uint16_t        hdop;
+       uint16_t        ndop;
+       uint16_t        edop;
+};
+
+#define UBLOX_NAV_POSLLH       0x02
+
+struct ublox_nav_posllh {
+       uint8_t         class;          /* 0x01 */
+       uint8_t         message;        /* 0x02 */
+       uint16_t        length;         /* 28 */
+
+       uint32_t        itow;           /* ms */
+       int32_t         lat;            /* deg * 1e7 */
+       int32_t         lon;            /* deg * 1e7 */
+       int32_t         height;         /* mm */
+       int32_t         hmsl;           /* mm */
+       uint32_t        hacc;           /* mm */
+       uint32_t        vacc;           /* mm */
+};
+
+#define UBLOX_NAV_SOL          0x06
+
+struct ublox_nav_sol {
+       uint8_t         class;          /* 0x01 */
+       uint8_t         message;        /* 0x06 */
+       uint16_t        length;         /* 52 */
+
+       uint32_t        itow;           /* ms */
+       int32_t         ftow;           /* ns */
+       int16_t         week;
+       int8_t          gpsfix;
+       uint8_t         flags;
+       int32_t         exefx;          /* cm */
+       int32_t         exefy;          /* cm */
+       int32_t         exefz;          /* cm */
+       uint32_t        pacc;           /* cm */
+       int32_t         exefvx;         /* cm/s */
+       int32_t         exefvy;         /* cm/s */
+       int32_t         exefvz;         /* cm/s */
+       uint32_t        sacc;           /* cm/s */
+       uint16_t        pdop;           /* * 100 */
+       uint8_t         reserved1;
+       uint8_t         numsv;
+       uint32_t        reserved2;
+};
+
+#define UBLOX_NAV_SOL_GPSFIX_NO_FIX            0
+#define UBLOX_NAV_SOL_GPSFIX_DEAD_RECKONING    1
+#define UBLOX_NAV_SOL_GPSFIX_2D                        2
+#define UBLOX_NAV_SOL_GPSFIX_3D                        3
+#define UBLOX_NAV_SOL_GPSFIX_GPS_DEAD_RECKONING        4
+#define UBLOX_NAV_SOL_GPSFIX_TIME_ONLY         5
+
+#define UBLOX_NAV_SOL_FLAGS_GPSFIXOK           0
+#define UBLOX_NAV_SOL_FLAGS_DIFFSOLN           1
+#define UBLOX_NAV_SOL_FLAGS_WKNSET             2
+#define UBLOX_NAV_SOL_FLAGS_TOWSET             3
+
+#define UBLOX_NAV_STATUS       0x03
+
+struct ublox_nav_status {
+       uint8_t         class;          /* 0x01 */
+       uint8_t         message;        /* 0x03 */
+       uint16_t        length;         /* 16 */
+
+       uint8_t         gpsfix;
+       uint8_t         flags;
+       uint8_t         fixstat;
+       uint8_t         flags2;
+
+       uint32_t        ttff;           /* ms */
+       uint32_t        msss;           /* ms */
+};
+
+#define UBLOX_NAV_STATUS_GPSFIX_NO_FIX                 0
+#define UBLOX_NAV_STATUS_GPSFIX_DEAD_RECKONING         1
+#define UBLOX_NAV_STATUS_GPSFIX_2D                     2
+#define UBLOX_NAV_STATUS_GPSFIX_3D                     3
+#define UBLOX_NAV_STATUS_GPSFIX_GPS_DEAD_RECKONING     4
+#define UBLOX_NAV_STATUS_GPSFIX_TIME_ONLY              5
+
+#define UBLOX_NAV_STATUS_FLAGS_GPSFIXOK                        0
+#define UBLOX_NAV_STATUS_FLAGS_DIFFSOLN                        1
+#define UBLOX_NAV_STATUS_FLAGS_WKNSET                  2
+#define UBLOX_NAV_STATUS_FLAGS_TOWSET                  3
+
+#define UBLOX_NAV_STATUS_FIXSTAT_DGPSISTAT             0
+#define UBLOX_NAV_STATUS_FIXSTAT_MAPMATCHING           6
+#define UBLOX_NAV_STATUS_FIXSTAT_MAPMATCHING_NONE              0
+#define UBLOX_NAV_STATUS_FIXSTAT_MAPMATCHING_VALID             1
+#define UBLOX_NAV_STATUS_FIXSTAT_MAPMATCHING_USED              2
+#define UBLOX_NAV_STATUS_FIXSTAT_MAPMATCHING_DR                        3
+#define UBLOX_NAV_STATUS_FIXSTAT_MAPMATCHING_MASK              3
+
+#define UBLOX_NAV_STATUS_FLAGS2_PSMSTATE               0
+#define UBLOX_NAV_STATUS_FLAGS2_PSMSTATE_ACQUISITION                   0
+#define UBLOX_NAV_STATUS_FLAGS2_PSMSTATE_TRACKING                      1
+#define UBLOX_NAV_STATUS_FLAGS2_PSMSTATE_POWER_OPTIMIZED_TRACKING      2
+#define UBLOX_NAV_STATUS_FLAGS2_PSMSTATE_INACTIVE                      3
+#define UBLOX_NAV_STATUS_FLAGS2_PSMSTATE_MASK                          3
+
+#define UBLOX_NAV_SVINFO       0x30
+
+struct ublox_nav_svinfo {
+       uint8_t         class;          /* 0x01 */
+       uint8_t         message;        /* 0x30 */
+       uint16_t        length;         /* 8 + 12 * numch */
+
+       uint32_t        itow;           /* ms */
+
+       uint8_t         numch;
+       uint8_t         globalflags;
+       uint16_t        reserved;
+};
+
+#define UBLOX_NAV_SVINFO_GLOBAL_FLAGS_CHIPGEN  0
+#define UBLOX_NAV_SVINFO_GLOBAL_FLAGS_CHIPGEN_ANTARIS  0
+#define UBLOX_NAV_SVINFO_GLOBAL_FLAGS_CHIPGEN_U_BLOX_5 1
+#define UBLOX_NAV_SVINFO_GLOBAL_FLAGS_CHIPGEN_U_BLOX_6 2
+#define UBLOX_NAV_SVINFO_GLOBAL_FLAGS_CHIPGEN_MASK     7
+
+struct ublox_nav_svinfo_block {
+       uint8_t         chn;
+       uint8_t         svid;
+       uint8_t         flags;
+       uint8_t         quality;
+
+       uint8_t         cno;            /* dbHz */
+       int8_t          elev;           /* deg */
+       int16_t         azim;           /* deg */
+
+       int32_t         prres;          /* cm */
+};
+
+#define UBLOX_NAV_SVINFO_BLOCK_FLAGS_SVUSED    0
+#define UBLOX_NAV_SVINFO_BLOCK_FLAGS_DIFFCORR  1
+#define UBLOX_NAV_SVINFO_BLOCK_FLAGS_ORBITAVAIL        2
+#define UBLOX_NAV_SVINFO_BLOCK_FLAGS_ORBITEPH  3
+#define UBLOX_NAV_SVINFO_BLOCK_FLAGS_UNHEALTHY 4
+#define UBLOX_NAV_SVINFO_BLOCK_FLAGS_ORBITALM  5
+#define UBLOX_NAV_SVINFO_BLOCK_FLAGS_ORBITAOP  6
+#define UBLOX_NAV_SVINFO_BLOCK_FLAGS_SMOOTHED  7
+
+#define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND      0
+#define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_IDLE                 0
+#define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_SEARCHING            1
+#define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_ACQUIRED             2
+#define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_UNUSABLE             3
+#define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_CODE_LOCK            4
+#define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_CARRIER_LOCKED_5     5
+#define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_CARRIER_LOCKED_6     6
+#define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_CARRIER_LOCKED_7     7
+#define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_MASK                 7
+
+#define UBLOX_NAV_TIMEUTC      0x21
+
+struct ublox_nav_timeutc {
+       uint8_t         class;          /* 0x01 */
+       uint8_t         message;        /* 0x21 */
+       uint16_t        length;         /* 20 */
+
+       uint32_t        itow;           /* ms */
+       uint32_t        tacc;           /* ns */
+       int32_t         nano;           /* ns */
+
+       uint16_t        year;
+       uint8_t         month;
+       uint8_t         day;
+
+       uint8_t         hour;
+       uint8_t         min;
+       uint8_t         sec;
+       uint8_t         valid;
+};
+
+#define UBLOX_NAV_TIMEUTC_VALID_VALIDTOW       0
+#define UBLOX_NAV_TIMEUTC_VALID_VALIDWKN       1
+#define UBLOX_NAV_TIMEUTC_VALID_VALIDUTC       2
+
+#define UBLOX_NAV_VELNED       0x12
+
+struct ublox_nav_velned {
+       uint8_t         class;          /* 0x01 */
+       uint8_t         message;        /* 0x12 */
+       uint16_t        length;         /* 36 */
+
+       uint32_t        itow;           /* ms */
+
+       int32_t         veln;           /* cm/s */
+       int32_t         vele;           /* cm/s */
+       int32_t         veld;           /* cm/s */
+
+       uint32_t        speed;          /* cm/s */
+       uint32_t        gspeed;         /* cm/s */
+
+       int32_t         heading;        /* deg */
+       uint32_t        sacc;           /* cm/s */
+       uint32_t        cacc;           /* deg */
+};
+
+#endif /* _AO_GPS_UBLOX_H_ */