Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of gnss by
gnss.h@20:f91c0334d017, 2018-10-08 (annotated)
- Committer:
- fahim.alavi@u-blox.com
- Date:
- Mon Oct 08 14:22:33 2018 +0500
- Revision:
- 20:f91c0334d017
- Parent:
- 16:6c226e3e9d61
- Child:
- 26:405a5e611635
NAV-Status message supported
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rob.meades@u-blox.com | 1:ef70a58a6c98 | 1 | /* mbed Microcontroller Library |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 2 | * Copyright (c) 2017 u-blox |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 3 | * |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 5 | * you may not use this file except in compliance with the License. |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 6 | * You may obtain a copy of the License at |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 7 | * |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 9 | * |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 10 | * Unless required by applicable law or agreed to in writing, software |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 13 | * See the License for the specific language governing permissions and |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 14 | * limitations under the License. |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 15 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 16 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 17 | #ifndef GNSS_H |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 18 | #define GNSS_H |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 19 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 20 | /** |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 21 | * @file gnss.h |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 22 | * This file defines a class that communicates with a u-blox GNSS chip. |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 23 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 24 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 25 | #include "mbed.h" |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 26 | #include "pipe.h" |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 27 | #include "serial_pipe.h" |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 28 | |
rob.meades@u-blox.com | 4:82308d600690 | 29 | #if defined (TARGET_UBLOX_C030) || defined (TARGET_UBLOX_C027) |
RobMeades | 2:b10ca4aa2e5e | 30 | # define GNSS_IF(onboard, shield) onboard |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 31 | #else |
RobMeades | 2:b10ca4aa2e5e | 32 | # define GNSS_IF(onboard, shield) shield |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 33 | #endif |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 34 | |
RobMeades | 5:af4baf3c67f3 | 35 | #ifdef TARGET_UBLOX_C027 |
rob.meades@u-blox.com | 6:56eda66d585b | 36 | # define GNSSEN GPSEN |
rob.meades@u-blox.com | 6:56eda66d585b | 37 | # define GNSSTXD GPSTXD |
rob.meades@u-blox.com | 6:56eda66d585b | 38 | # define GNSSRXD GPSRXD |
rob.meades@u-blox.com | 6:56eda66d585b | 39 | # define GNSSBAUD GPSBAUD |
RobMeades | 5:af4baf3c67f3 | 40 | #endif |
RobMeades | 5:af4baf3c67f3 | 41 | |
fahim.alavi@u-blox.com | 7:720841961804 | 42 | #define UBX_FRAME_SIZE 8 |
fahim.alavi@u-blox.com | 7:720841961804 | 43 | #define RETRY 5 |
fahim.alavi@u-blox.com | 7:720841961804 | 44 | #define SYNC_CHAR_INDEX_1 0 |
fahim.alavi@u-blox.com | 7:720841961804 | 45 | #define SYNC_CHAR_INDEX_2 1 |
fahim.alavi@u-blox.com | 7:720841961804 | 46 | #define MSG_CLASS_INDEX 2 |
fahim.alavi@u-blox.com | 7:720841961804 | 47 | #define MSG_ID_INDEX 3 |
fahim.alavi@u-blox.com | 7:720841961804 | 48 | #define UBX_LENGTH_INDEX 4 |
fahim.alavi@u-blox.com | 7:720841961804 | 49 | #define UBX_PAYLOAD_INDEX 6 |
fahim.alavi@u-blox.com | 7:720841961804 | 50 | |
fahim.alavi@u-blox.com | 7:720841961804 | 51 | enum eUBX_MSG_CLASS {NAV = 0x01, ACK = 0x05, LOG = 0x21}; |
fahim.alavi@u-blox.com | 7:720841961804 | 52 | |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 53 | enum eUBX_MESSAGE {UBX_LOG_BATCH, UBX_ACK_ACK, UBX_ACK_NAK, UBX_NAV_ODO, UBX_NAV_PVT, NAV_STATUS, UNKNOWN_UBX}; |
fahim.alavi@u-blox.com | 7:720841961804 | 54 | |
fahim.alavi@u-blox.com | 8:cff83b9f5093 | 55 | typedef struct UBX_ACK_ACK { |
fahim.alavi@u-blox.com | 7:720841961804 | 56 | uint8_t msg_class; |
fahim.alavi@u-blox.com | 7:720841961804 | 57 | uint8_t msg_id; |
fahim.alavi@u-blox.com | 7:720841961804 | 58 | |
fahim.alavi@u-blox.com | 8:cff83b9f5093 | 59 | }tUBX_ACK_ACK; |
fahim.alavi@u-blox.com | 7:720841961804 | 60 | |
fahim.alavi@u-blox.com | 7:720841961804 | 61 | typedef struct UBX_NAV_ODO { |
fahim.alavi@u-blox.com | 7:720841961804 | 62 | uint8_t version; |
fahim.alavi@u-blox.com | 7:720841961804 | 63 | uint8_t reserved[3]; |
fahim.alavi@u-blox.com | 7:720841961804 | 64 | uint32_t itow; |
fahim.alavi@u-blox.com | 7:720841961804 | 65 | uint32_t distance; |
fahim.alavi@u-blox.com | 7:720841961804 | 66 | uint32_t totalDistance; |
fahim.alavi@u-blox.com | 7:720841961804 | 67 | uint32_t distanceSTD; |
fahim.alavi@u-blox.com | 7:720841961804 | 68 | }tUBX_NAV_ODO; |
fahim.alavi@u-blox.com | 7:720841961804 | 69 | |
fahim.alavi@u-blox.com | 7:720841961804 | 70 | typedef struct UBX_NAV_PVT { |
fahim.alavi@u-blox.com | 7:720841961804 | 71 | uint32_t itow; |
fahim.alavi@u-blox.com | 7:720841961804 | 72 | uint16_t year; |
fahim.alavi@u-blox.com | 7:720841961804 | 73 | uint8_t month; |
fahim.alavi@u-blox.com | 7:720841961804 | 74 | uint8_t day; |
fahim.alavi@u-blox.com | 16:6c226e3e9d61 | 75 | uint8_t fixType; |
fahim.alavi@u-blox.com | 7:720841961804 | 76 | int32_t lon; // scaling 1e-7 |
fahim.alavi@u-blox.com | 7:720841961804 | 77 | int32_t lat; // scaling 1e-7 |
fahim.alavi@u-blox.com | 7:720841961804 | 78 | int32_t height; |
fahim.alavi@u-blox.com | 16:6c226e3e9d61 | 79 | int32_t speed; |
fahim.alavi@u-blox.com | 7:720841961804 | 80 | |
fahim.alavi@u-blox.com | 7:720841961804 | 81 | }tUBX_NAV_PVT; |
fahim.alavi@u-blox.com | 7:720841961804 | 82 | |
fahim.alavi@u-blox.com | 7:720841961804 | 83 | typedef struct UBX_LOG_BATCH { |
fahim.alavi@u-blox.com | 7:720841961804 | 84 | uint32_t itow; |
fahim.alavi@u-blox.com | 7:720841961804 | 85 | int32_t lon; // scaling 1e-7 |
fahim.alavi@u-blox.com | 7:720841961804 | 86 | int32_t lat; // scaling 1e-7 |
fahim.alavi@u-blox.com | 7:720841961804 | 87 | int32_t height; |
fahim.alavi@u-blox.com | 7:720841961804 | 88 | uint32_t distance; |
fahim.alavi@u-blox.com | 7:720841961804 | 89 | uint32_t totalDistance; |
fahim.alavi@u-blox.com | 7:720841961804 | 90 | uint32_t distanceSTD; |
fahim.alavi@u-blox.com | 7:720841961804 | 91 | |
fahim.alavi@u-blox.com | 7:720841961804 | 92 | }tUBX_LOG_BATCH; |
fahim.alavi@u-blox.com | 7:720841961804 | 93 | |
Bilal Qamar |
10:514ea8bf1dc8 | 94 | typedef struct UBX_CFG_BATCH { |
Bilal Qamar |
10:514ea8bf1dc8 | 95 | uint32_t version; |
Bilal Qamar |
10:514ea8bf1dc8 | 96 | uint8_t flags; |
Bilal Qamar |
10:514ea8bf1dc8 | 97 | uint32_t bufSize; |
Bilal Qamar |
10:514ea8bf1dc8 | 98 | uint32_t notifThrs; |
Bilal Qamar |
11:a04f7eeece23 | 99 | uint8_t pioId; |
Bilal Qamar |
11:a04f7eeece23 | 100 | uint8_t reserved1; |
Bilal Qamar |
10:514ea8bf1dc8 | 101 | |
Bilal Qamar |
10:514ea8bf1dc8 | 102 | }tUBX_CFG_BATCH; |
Bilal Qamar |
10:514ea8bf1dc8 | 103 | |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 104 | typedef struct UBX_NAV_STATUS{ |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 105 | uint32_t itow; |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 106 | uint8_t fix; |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 107 | uint8_t flags; |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 108 | uint32_t ttff; |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 109 | uint32_t msss; |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 110 | |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 111 | }tUBX_NAV_STATUS; |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 112 | |
rob.meades@u-blox.com | 4:82308d600690 | 113 | /** Basic GNSS parser class. |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 114 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 115 | class GnssParser |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 116 | { |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 117 | public: |
rob.meades@u-blox.com | 4:82308d600690 | 118 | /** Constructor. |
rob.meades@u-blox.com | 4:82308d600690 | 119 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 120 | GnssParser(); |
rob.meades@u-blox.com | 4:82308d600690 | 121 | /** Destructor. |
rob.meades@u-blox.com | 4:82308d600690 | 122 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 123 | virtual ~GnssParser(void); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 124 | |
rob.meades@u-blox.com | 4:82308d600690 | 125 | /** Power-on/wake-up the GNSS. |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 126 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 127 | virtual bool init(PinName pn) = 0; |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 128 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 129 | enum { |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 130 | // getLine Responses |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 131 | WAIT = -1, //!< wait for more incoming data (the start of a message was found, or no data available) |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 132 | NOT_FOUND = 0, //!< a parser concluded the the current offset of the pipe doe not contain a valid message |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 133 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 134 | #define LENGTH(x) (x & 0x00FFFF) //!< extract/mask the length |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 135 | #define PROTOCOL(x) (x & 0xFF0000) //!< extract/mask the type |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 136 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 137 | UNKNOWN = 0x000000, //!< message type is unknown |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 138 | UBX = 0x100000, //!< message if of protocol NMEA |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 139 | NMEA = 0x200000 //!< message if of protocol UBX |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 140 | }; |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 141 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 142 | /** Get a line from the physical interface. This function |
rob.meades@u-blox.com | 4:82308d600690 | 143 | * needs to be implemented in the inherited class. |
rob.meades@u-blox.com | 4:82308d600690 | 144 | * @param buf the buffer to store it. |
rob.meades@u-blox.com | 4:82308d600690 | 145 | * @param len size of the buffer. |
rob.meades@u-blox.com | 4:82308d600690 | 146 | * @return type and length if something was found, |
rob.meades@u-blox.com | 4:82308d600690 | 147 | * WAIT if not enough data is available, |
rob.meades@u-blox.com | 4:82308d600690 | 148 | * NOT_FOUND if nothing was found |
rob.meades@u-blox.com | 4:82308d600690 | 149 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 150 | virtual int getMessage(char* buf, int len) = 0; |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 151 | |
rob.meades@u-blox.com | 4:82308d600690 | 152 | /** Send a buffer. |
rob.meades@u-blox.com | 4:82308d600690 | 153 | * @param buf the buffer to write. |
rob.meades@u-blox.com | 4:82308d600690 | 154 | * @param len size of the buffer to write. |
rob.meades@u-blox.com | 4:82308d600690 | 155 | * @return bytes written. |
rob.meades@u-blox.com | 4:82308d600690 | 156 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 157 | virtual int send(const char* buf, int len); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 158 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 159 | /** send a NMEA message, this function just takes the |
rob.meades@u-blox.com | 4:82308d600690 | 160 | * payload and calculates and adds checksum. ($ and *XX\r\n will be added). |
rob.meades@u-blox.com | 4:82308d600690 | 161 | * @param buf the message payload to write. |
rob.meades@u-blox.com | 4:82308d600690 | 162 | * @param len size of the message payload to write. |
rob.meades@u-blox.com | 4:82308d600690 | 163 | * @return total bytes written. |
rob.meades@u-blox.com | 4:82308d600690 | 164 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 165 | virtual int sendNmea(const char* buf, int len); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 166 | |
rob.meades@u-blox.com | 4:82308d600690 | 167 | /** Send a UBX message, this function just takes the |
rob.meades@u-blox.com | 4:82308d600690 | 168 | * payload and calculates and adds checksum. |
rob.meades@u-blox.com | 4:82308d600690 | 169 | * @param cls the UBX class id. |
rob.meades@u-blox.com | 4:82308d600690 | 170 | * @param id the UBX message id. |
rob.meades@u-blox.com | 4:82308d600690 | 171 | * @param buf the message payload to write. |
rob.meades@u-blox.com | 4:82308d600690 | 172 | * @param len size of the message payload to write. |
rob.meades@u-blox.com | 4:82308d600690 | 173 | * @return total bytes written. |
rob.meades@u-blox.com | 4:82308d600690 | 174 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 175 | virtual int sendUbx(unsigned char cls, unsigned char id, |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 176 | const void* buf = NULL, int len = 0); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 177 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 178 | /** Power off the GNSS, it can be again woken up by an |
rob.meades@u-blox.com | 4:82308d600690 | 179 | * edge on the serial port on the external interrupt pin. |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 180 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 181 | void powerOff(void); |
bqam |
12:10108cd3ad23 | 182 | |
bqam |
12:10108cd3ad23 | 183 | /** Cuts off the power supply of GNSS by disabling gnssEnable pin |
bqam |
12:10108cd3ad23 | 184 | * Backup supply is provided, can turn it on again by enabling PA15 |
bqam |
12:10108cd3ad23 | 185 | */ |
bqam |
12:10108cd3ad23 | 186 | void cutOffPower(void); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 187 | |
rob.meades@u-blox.com | 4:82308d600690 | 188 | /** get the first character of a NMEA field. |
rob.meades@u-blox.com | 4:82308d600690 | 189 | * @param ix the index of the field to find. |
rob.meades@u-blox.com | 4:82308d600690 | 190 | * @param start the start of the buffer. |
rob.meades@u-blox.com | 4:82308d600690 | 191 | * @param end the end of the buffer. |
rob.meades@u-blox.com | 4:82308d600690 | 192 | * @return the pointer to the first character of the field. |
rob.meades@u-blox.com | 4:82308d600690 | 193 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 194 | static const char* findNmeaItemPos(int ix, const char* start, const char* end); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 195 | |
rob.meades@u-blox.com | 4:82308d600690 | 196 | /** Extract a double value from a buffer containing a NMEA message. |
rob.meades@u-blox.com | 4:82308d600690 | 197 | * @param ix the index of the field to extract. |
rob.meades@u-blox.com | 4:82308d600690 | 198 | * @param buf the NMEA message. |
rob.meades@u-blox.com | 4:82308d600690 | 199 | * @param len the size of the NMEA message. |
rob.meades@u-blox.com | 4:82308d600690 | 200 | * @param val the extracted value. |
rob.meades@u-blox.com | 4:82308d600690 | 201 | * @return true if successful, false otherwise. |
rob.meades@u-blox.com | 4:82308d600690 | 202 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 203 | static bool getNmeaItem(int ix, char* buf, int len, double& val); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 204 | |
rob.meades@u-blox.com | 4:82308d600690 | 205 | /** Extract a interger value from a buffer containing a NMEA message. |
rob.meades@u-blox.com | 4:82308d600690 | 206 | * @param ix the index of the field to extract. |
rob.meades@u-blox.com | 4:82308d600690 | 207 | * @param buf the NMEA message. |
rob.meades@u-blox.com | 4:82308d600690 | 208 | * @param len the size of the NMEA message. |
rob.meades@u-blox.com | 4:82308d600690 | 209 | * @param val the extracted value. |
rob.meades@u-blox.com | 4:82308d600690 | 210 | * @param base the numeric base to be used (e.g. 8, 10 or 16). |
rob.meades@u-blox.com | 4:82308d600690 | 211 | * @return true if successful, false otherwise. |
rob.meades@u-blox.com | 4:82308d600690 | 212 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 213 | static bool getNmeaItem(int ix, char* buf, int len, int& val, int base/*=10*/); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 214 | |
rob.meades@u-blox.com | 4:82308d600690 | 215 | /** Extract a char value from a buffer containing a NMEA message. |
rob.meades@u-blox.com | 4:82308d600690 | 216 | * @param ix the index of the field to extract. |
rob.meades@u-blox.com | 4:82308d600690 | 217 | * @param buf the NMEA message. |
rob.meades@u-blox.com | 4:82308d600690 | 218 | * @param len the size of the NMEA message. |
rob.meades@u-blox.com | 4:82308d600690 | 219 | * @param val the extracted value. |
rob.meades@u-blox.com | 4:82308d600690 | 220 | * @return true if successful, false otherwise. |
rob.meades@u-blox.com | 4:82308d600690 | 221 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 222 | static bool getNmeaItem(int ix, char* buf, int len, char& val); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 223 | |
rob.meades@u-blox.com | 4:82308d600690 | 224 | /** Extract a latitude/longitude value from a buffer containing a NMEA message. |
rob.meades@u-blox.com | 4:82308d600690 | 225 | * @param ix the index of the field to extract (will extract ix and ix + 1), |
rob.meades@u-blox.com | 4:82308d600690 | 226 | * @param buf the NMEA message, |
rob.meades@u-blox.com | 4:82308d600690 | 227 | * @param len the size of the NMEA message, |
rob.meades@u-blox.com | 4:82308d600690 | 228 | * @param val the extracted latitude or longitude, |
rob.meades@u-blox.com | 4:82308d600690 | 229 | * @return true if successful, false otherwise. |
rob.meades@u-blox.com | 4:82308d600690 | 230 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 231 | static bool getNmeaAngle(int ix, char* buf, int len, double& val); |
fahim.alavi@u-blox.com | 7:720841961804 | 232 | |
fahim.alavi@u-blox.com | 7:720841961804 | 233 | /** Enable UBX messages. |
fahim.alavi@u-blox.com | 7:720841961804 | 234 | * @param none |
Bilal Qamar |
11:a04f7eeece23 | 235 | * @return 1 if successful, false otherwise. |
fahim.alavi@u-blox.com | 7:720841961804 | 236 | */ |
fahim.alavi@u-blox.com | 7:720841961804 | 237 | int enable_ubx(); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 238 | |
fahim.alavi@u-blox.com | 7:720841961804 | 239 | /** GET Message type of receiver UBX message |
fahim.alavi@u-blox.com | 7:720841961804 | 240 | * @param buff the UXB message |
fahim.alavi@u-blox.com | 7:720841961804 | 241 | * @return eUBX_MESSAGE |
fahim.alavi@u-blox.com | 7:720841961804 | 242 | */ |
fahim.alavi@u-blox.com | 7:720841961804 | 243 | eUBX_MESSAGE get_ubx_message(char *); |
fahim.alavi@u-blox.com | 7:720841961804 | 244 | |
fahim.alavi@u-blox.com | 8:cff83b9f5093 | 245 | /** Method to parse contents of UBX ACK-ACK/NAK and return messageid amd class for which ACK is received |
fahim.alavi@u-blox.com | 7:720841961804 | 246 | * @param buff the UXB message |
fahim.alavi@u-blox.com | 8:cff83b9f5093 | 247 | * @return tUBX_ACK_ACK |
fahim.alavi@u-blox.com | 7:720841961804 | 248 | */ |
fahim.alavi@u-blox.com | 8:cff83b9f5093 | 249 | tUBX_ACK_ACK decode_ubx_cfg_ack_nak_msg(char *); |
fahim.alavi@u-blox.com | 7:720841961804 | 250 | |
fahim.alavi@u-blox.com | 7:720841961804 | 251 | /** Method to parse contents of UBX_NAV_ODO and return decoded msg |
fahim.alavi@u-blox.com | 7:720841961804 | 252 | * @param buff the UXB message |
fahim.alavi@u-blox.com | 7:720841961804 | 253 | * @return tUBX_NAV_ODO |
fahim.alavi@u-blox.com | 7:720841961804 | 254 | */ |
fahim.alavi@u-blox.com | 7:720841961804 | 255 | tUBX_NAV_ODO decode_ubx_nav_odo_msg(char *); |
fahim.alavi@u-blox.com | 7:720841961804 | 256 | |
fahim.alavi@u-blox.com | 7:720841961804 | 257 | /** Method to parse contents of UBX_NAV_PVT and return decoded msg |
fahim.alavi@u-blox.com | 7:720841961804 | 258 | * @param buff the UXB message |
fahim.alavi@u-blox.com | 7:720841961804 | 259 | * @return tUBX_NAV_PVT |
fahim.alavi@u-blox.com | 7:720841961804 | 260 | */ |
fahim.alavi@u-blox.com | 7:720841961804 | 261 | tUBX_NAV_PVT decode_ubx_nav_pvt_msg(char *); |
fahim.alavi@u-blox.com | 7:720841961804 | 262 | |
fahim.alavi@u-blox.com | 7:720841961804 | 263 | /** Method to parse contents of UBX_LOG_BATCH and return decoded msg |
fahim.alavi@u-blox.com | 7:720841961804 | 264 | * @param buff the UXB message |
fahim.alavi@u-blox.com | 7:720841961804 | 265 | * @return tUBX_LOG_BATCH |
fahim.alavi@u-blox.com | 7:720841961804 | 266 | */ |
fahim.alavi@u-blox.com | 7:720841961804 | 267 | tUBX_LOG_BATCH decode_ubx_log_batch_msg(char *); |
fahim.alavi@u-blox.com | 7:720841961804 | 268 | |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 269 | /** Method to parse contents of UBX_NAV_STATUS and return decoded msg |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 270 | * @param buff the UXB message |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 271 | * @return tUBX_NAV_STATUS |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 272 | */ |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 273 | tUBX_NAV_STATUS decode_ubx_nav_status_msg(char *); |
fahim.alavi@u-blox.com | 20:f91c0334d017 | 274 | |
fahim.alavi@u-blox.com | 9:bfa9081e1d14 | 275 | /** Method to send UBX LOG-RETRIEVEBATCH msg. This message is used to request batched data. |
fahim.alavi@u-blox.com | 9:bfa9081e1d14 | 276 | * @param bool |
fahim.alavi@u-blox.com | 9:bfa9081e1d14 | 277 | * @return int |
fahim.alavi@u-blox.com | 9:bfa9081e1d14 | 278 | */ |
fahim.alavi@u-blox.com | 9:bfa9081e1d14 | 279 | int ubx_request_batched_data(bool sendMonFirst = false); |
fahim.alavi@u-blox.com | 9:bfa9081e1d14 | 280 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 281 | protected: |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 282 | /** Power on the GNSS module. |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 283 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 284 | void _powerOn(void); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 285 | |
rob.meades@u-blox.com | 4:82308d600690 | 286 | /** Get a line from the physical interface. |
rob.meades@u-blox.com | 4:82308d600690 | 287 | * @param pipe the receiveing pipe to parse messages . |
rob.meades@u-blox.com | 4:82308d600690 | 288 | * @param buf the buffer to store it. |
rob.meades@u-blox.com | 4:82308d600690 | 289 | * @param len size of the buffer. |
rob.meades@u-blox.com | 4:82308d600690 | 290 | * @return type and length if something was found, |
rob.meades@u-blox.com | 4:82308d600690 | 291 | * WAIT if not enough data is available, |
rob.meades@u-blox.com | 4:82308d600690 | 292 | * NOT_FOUND if nothing was found. |
rob.meades@u-blox.com | 4:82308d600690 | 293 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 294 | static int _getMessage(Pipe<char>* pipe, char* buf, int len); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 295 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 296 | /** Check if the current offset of the pipe contains a NMEA message. |
rob.meades@u-blox.com | 4:82308d600690 | 297 | * @param pipe the receiveing pipe to parse messages. |
rob.meades@u-blox.com | 4:82308d600690 | 298 | * @param len numer of bytes to parse at maximum. |
rob.meades@u-blox.com | 4:82308d600690 | 299 | * @return length if something was found (including the NMEA frame), |
rob.meades@u-blox.com | 4:82308d600690 | 300 | * WAIT if not enough data is available, |
rob.meades@u-blox.com | 4:82308d600690 | 301 | * NOT_FOUND if nothing was found. |
rob.meades@u-blox.com | 4:82308d600690 | 302 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 303 | static int _parseNmea(Pipe<char>* pipe, int len); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 304 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 305 | /** Check if the current offset of the pipe contains a UBX message. |
rob.meades@u-blox.com | 4:82308d600690 | 306 | * @param pipe the receiveing pipe to parse messages. |
rob.meades@u-blox.com | 4:82308d600690 | 307 | * @param len numer of bytes to parse at maximum. |
rob.meades@u-blox.com | 4:82308d600690 | 308 | * @return length if something was found (including the UBX frame), |
rob.meades@u-blox.com | 4:82308d600690 | 309 | * WAIT if not enough data is available, |
rob.meades@u-blox.com | 4:82308d600690 | 310 | * NOT_FOUND if nothing was found. |
rob.meades@u-blox.com | 4:82308d600690 | 311 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 312 | static int _parseUbx(Pipe<char>* pipe, int len); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 313 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 314 | /** Write bytes to the physical interface. This function |
rob.meades@u-blox.com | 4:82308d600690 | 315 | * needs to be implemented by the inherited class. |
rob.meades@u-blox.com | 4:82308d600690 | 316 | * @param buf the buffer to write. |
rob.meades@u-blox.com | 4:82308d600690 | 317 | * @param len size of the buffer to write. |
rob.meades@u-blox.com | 4:82308d600690 | 318 | * @return bytes written. |
rob.meades@u-blox.com | 4:82308d600690 | 319 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 320 | virtual int _send(const void* buf, int len) = 0; |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 321 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 322 | static const char _toHex[16]; //!< num to hex conversion |
rob.meades@u-blox.com | 4:82308d600690 | 323 | DigitalInOut *_gnssEnable; //!< IO pin that enables GNSS |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 324 | }; |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 325 | |
rob.meades@u-blox.com | 4:82308d600690 | 326 | /** GNSS class which uses a serial port as physical interface. |
rob.meades@u-blox.com | 4:82308d600690 | 327 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 328 | class GnssSerial : public SerialPipe, public GnssParser |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 329 | { |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 330 | public: |
rob.meades@u-blox.com | 4:82308d600690 | 331 | /** Constructor. |
rob.meades@u-blox.com | 4:82308d600690 | 332 | * @param tx is the serial ports transmit pin (GNSS to CPU). |
rob.meades@u-blox.com | 4:82308d600690 | 333 | * @param rx is the serial ports receive pin (CPU to GNSS). |
rob.meades@u-blox.com | 4:82308d600690 | 334 | * @param baudrate the baudrate of the GNSS use 9600. |
rob.meades@u-blox.com | 4:82308d600690 | 335 | * @param rxSize the size of the serial rx buffer. |
rob.meades@u-blox.com | 4:82308d600690 | 336 | * @param txSize the size of the serial tx buffer. |
rob.meades@u-blox.com | 4:82308d600690 | 337 | */ |
RobMeades | 2:b10ca4aa2e5e | 338 | GnssSerial(PinName tx GNSS_IF( = GNSSTXD, = D8 /* = D8 */), // resistor on shield not populated |
RobMeades | 2:b10ca4aa2e5e | 339 | PinName rx GNSS_IF( = GNSSRXD, = D9 /* = D9 */), // resistor on shield not populated |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 340 | int baudrate GNSS_IF( = GNSSBAUD, = 9600 ), |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 341 | int rxSize = 256 , |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 342 | int txSize = 128 ); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 343 | |
rob.meades@u-blox.com | 4:82308d600690 | 344 | /** Destructor. |
rob.meades@u-blox.com | 4:82308d600690 | 345 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 346 | virtual ~GnssSerial(void); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 347 | |
rob.meades@u-blox.com | 4:82308d600690 | 348 | /** Initialise the GNSS device. |
rob.meades@u-blox.com | 4:82308d600690 | 349 | * @param pn NOT USED. |
fahim.alavi@u-blox.com | 14:105cf3ca48c9 | 350 | * @param baudrate |
rob.meades@u-blox.com | 4:82308d600690 | 351 | * @return true if successful, otherwise false. |
rob.meades@u-blox.com | 4:82308d600690 | 352 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 353 | virtual bool init(PinName pn = NC); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 354 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 355 | /** Get a line from the physical interface. |
rob.meades@u-blox.com | 4:82308d600690 | 356 | * @param buf the buffer to store it. |
rob.meades@u-blox.com | 4:82308d600690 | 357 | * @param len size of the buffer. |
rob.meades@u-blox.com | 4:82308d600690 | 358 | * @return type and length if something was found, |
rob.meades@u-blox.com | 4:82308d600690 | 359 | * WAIT if not enough data is available, |
rob.meades@u-blox.com | 4:82308d600690 | 360 | * NOT_FOUND if nothing was found. |
rob.meades@u-blox.com | 4:82308d600690 | 361 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 362 | virtual int getMessage(char* buf, int len); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 363 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 364 | protected: |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 365 | /** Write bytes to the physical interface. |
rob.meades@u-blox.com | 4:82308d600690 | 366 | * @param buf the buffer to write. |
rob.meades@u-blox.com | 4:82308d600690 | 367 | * @param len size of the buffer to write. |
rob.meades@u-blox.com | 4:82308d600690 | 368 | * @return bytes written. |
rob.meades@u-blox.com | 4:82308d600690 | 369 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 370 | virtual int _send(const void* buf, int len); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 371 | }; |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 372 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 373 | /** GNSS class which uses a i2c as physical interface. |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 374 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 375 | class GnssI2C : public I2C, public GnssParser |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 376 | { |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 377 | public: |
rob.meades@u-blox.com | 4:82308d600690 | 378 | /** Constructor. |
rob.meades@u-blox.com | 4:82308d600690 | 379 | * @param sda is the I2C SDA pin (between CPU and GNSS). |
rob.meades@u-blox.com | 4:82308d600690 | 380 | * @param scl is the I2C SCL pin (CPU to GNSS). |
rob.meades@u-blox.com | 4:82308d600690 | 381 | * @param adr the I2C address of the GNSS set to (66<<1). |
rob.meades@u-blox.com | 4:82308d600690 | 382 | * @param rxSize the size of the serial rx buffer. |
rob.meades@u-blox.com | 4:82308d600690 | 383 | */ |
RobMeades | 2:b10ca4aa2e5e | 384 | GnssI2C(PinName sda GNSS_IF( = NC, = /* D16 TODO */ NC ), |
RobMeades | 2:b10ca4aa2e5e | 385 | PinName scl GNSS_IF( = NC, = /* D17 TODO */ NC ), |
RobMeades | 2:b10ca4aa2e5e | 386 | unsigned char i2cAdr GNSS_IF( = (66<<1), = (66<<1) ), |
RobMeades | 2:b10ca4aa2e5e | 387 | int rxSize = 256 ); |
rob.meades@u-blox.com | 4:82308d600690 | 388 | /** Destructor |
rob.meades@u-blox.com | 4:82308d600690 | 389 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 390 | virtual ~GnssI2C(void); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 391 | |
rob.meades@u-blox.com | 4:82308d600690 | 392 | /** Helper function to probe the i2c device. |
rob.meades@u-blox.com | 4:82308d600690 | 393 | * @param pn the power-on pin for the chip. |
rob.meades@u-blox.com | 4:82308d600690 | 394 | * @return true if successfully detected the GNSS chip. |
rob.meades@u-blox.com | 4:82308d600690 | 395 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 396 | virtual bool init(PinName pn = GNSS_IF( NC, NC /* D7 resistor R67 on shield not mounted */)); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 397 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 398 | /** Get a line from the physical interface. |
rob.meades@u-blox.com | 4:82308d600690 | 399 | * @param buf the buffer to store it. |
rob.meades@u-blox.com | 4:82308d600690 | 400 | * @param len size of the buffer. |
rob.meades@u-blox.com | 4:82308d600690 | 401 | * @return type and length if something was found, |
rob.meades@u-blox.com | 4:82308d600690 | 402 | * WAIT if not enough data is available, |
rob.meades@u-blox.com | 4:82308d600690 | 403 | * NOT_FOUND if nothing was found. |
rob.meades@u-blox.com | 4:82308d600690 | 404 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 405 | virtual int getMessage(char* buf, int len); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 406 | |
rob.meades@u-blox.com | 4:82308d600690 | 407 | /** Send a buffer. |
rob.meades@u-blox.com | 4:82308d600690 | 408 | * @param buf the buffer to write. |
rob.meades@u-blox.com | 4:82308d600690 | 409 | * @param len size of the buffer to write. |
rob.meades@u-blox.com | 4:82308d600690 | 410 | * @return bytes written. |
rob.meades@u-blox.com | 4:82308d600690 | 411 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 412 | virtual int send(const char* buf, int len); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 413 | |
rob.meades@u-blox.com | 4:82308d600690 | 414 | /** Send an NMEA message, this function just takes the |
rob.meades@u-blox.com | 4:82308d600690 | 415 | * payload and calculates and adds checksum ($ and *XX\r\n will be added). |
rob.meades@u-blox.com | 4:82308d600690 | 416 | * @param buf the message payload to write. |
rob.meades@u-blox.com | 4:82308d600690 | 417 | * @param len size of the message payload to write. |
rob.meades@u-blox.com | 4:82308d600690 | 418 | * @return total bytes written. |
rob.meades@u-blox.com | 4:82308d600690 | 419 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 420 | virtual int sendNmea(const char* buf, int len); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 421 | |
rob.meades@u-blox.com | 4:82308d600690 | 422 | /** Send a UBX message, this function just takes the |
rob.meades@u-blox.com | 4:82308d600690 | 423 | * payload and calculates and adds checksum. |
rob.meades@u-blox.com | 4:82308d600690 | 424 | * @param cls the UBX class id. |
rob.meades@u-blox.com | 4:82308d600690 | 425 | * @param id the UBX message id. |
rob.meades@u-blox.com | 4:82308d600690 | 426 | * @param buf the message payload to write. |
rob.meades@u-blox.com | 4:82308d600690 | 427 | * @param len size of the message payload to write. |
rob.meades@u-blox.com | 4:82308d600690 | 428 | * @return total bytes written. |
rob.meades@u-blox.com | 4:82308d600690 | 429 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 430 | virtual int sendUbx(unsigned char cls, unsigned char id, |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 431 | const void* buf = NULL, int len = 0); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 432 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 433 | protected: |
rob.meades@u-blox.com | 4:82308d600690 | 434 | /** Check if the port is writeable (like SerialPipe) |
rob.meades@u-blox.com | 4:82308d600690 | 435 | * @return true if writeable |
rob.meades@u-blox.com | 4:82308d600690 | 436 | */ |
rob.meades@u-blox.com | 4:82308d600690 | 437 | bool writeable(void) {return true;} |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 438 | |
rob.meades@u-blox.com | 4:82308d600690 | 439 | /** Write a character (like SerialPipe). |
rob.meades@u-blox.com | 4:82308d600690 | 440 | * @param c the character to write. |
rob.meades@u-blox.com | 4:82308d600690 | 441 | * @return true if succesffully written . |
rob.meades@u-blox.com | 4:82308d600690 | 442 | */ |
rob.meades@u-blox.com | 4:82308d600690 | 443 | bool putc(int c) {char ch = c; return send(&ch, 1);} |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 444 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 445 | /** Write bytes to the physical interface. |
rob.meades@u-blox.com | 4:82308d600690 | 446 | * @param buf the buffer to write. |
rob.meades@u-blox.com | 4:82308d600690 | 447 | * @param len size of the buffer to write. |
rob.meades@u-blox.com | 4:82308d600690 | 448 | * @return bytes written. |
rob.meades@u-blox.com | 4:82308d600690 | 449 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 450 | virtual int _send(const void* buf, int len); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 451 | |
rob.meades@u-blox.com | 4:82308d600690 | 452 | /** Read bytes from the physical interface. |
rob.meades@u-blox.com | 4:82308d600690 | 453 | * @param buf the buffer to read into. |
rob.meades@u-blox.com | 4:82308d600690 | 454 | * @param len size of the read buffer . |
rob.meades@u-blox.com | 4:82308d600690 | 455 | * @return bytes read. |
rob.meades@u-blox.com | 4:82308d600690 | 456 | */ |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 457 | int _get(char* buf, int len); |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 458 | |
rob.meades@u-blox.com | 4:82308d600690 | 459 | Pipe<char> _pipe; //!< the rx pipe. |
rob.meades@u-blox.com | 4:82308d600690 | 460 | unsigned char _i2cAdr; //!< the i2c address. |
rob.meades@u-blox.com | 4:82308d600690 | 461 | static const char REGLEN; //!< the length i2c register address. |
rob.meades@u-blox.com | 4:82308d600690 | 462 | static const char REGSTREAM;//!< the stream i2c register address. |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 463 | }; |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 464 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 465 | #endif |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 466 | |
rob.meades@u-blox.com | 1:ef70a58a6c98 | 467 | // End Of File |