Csr location class shows location and satellite information, which supports H13467 + ST F103RB/NXP LCP1549 boards now.

Dependents:   CsrLocationDemo CsrLocationDemo

Fork of CsrLocation by jie zhao

Committer:
zhjcpi
Date:
Tue Nov 04 08:41:25 2014 +0000
Revision:
12:5fb829ce6b82
Parent:
11:10ba3c761444
Child:
17:05033198f8f3
Fit into GPSProvider interface.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zhjcpi 12:5fb829ce6b82 1 /* CSRLocation class for mbed Microcontroller
zhjcpi 0:aba381fc8158 2 * Copyright 2014 CSR plc
zhjcpi 0:aba381fc8158 3 */
zhjcpi 0:aba381fc8158 4
zhjcpi 0:aba381fc8158 5 #ifndef CSRLOCATION_H
zhjcpi 0:aba381fc8158 6 #define CSRLOCATION_H
zhjcpi 0:aba381fc8158 7
zhjcpi 12:5fb829ce6b82 8 #include <GPSProviderImplBase.h>
zhjcpi 0:aba381fc8158 9
zhjcpi 0:aba381fc8158 10 #define CSR_LOC_SDK_VER "CSR-LOC-SDK-0.5"
zhjcpi 0:aba381fc8158 11
zhjcpi 2:d4fe184925f2 12 typedef uint16_t CsrResult;
zhjcpi 0:aba381fc8158 13 #define CSR_RESULT_SUCCESS ((CsrResult) 0x0000)
zhjcpi 0:aba381fc8158 14 #define CSR_RESULT_FAILURE ((CsrResult) 0xFFFF)
zhjcpi 0:aba381fc8158 15
zhjcpi 12:5fb829ce6b82 16 /* IOCTL commands */
zhjcpi 12:5fb829ce6b82 17 #define CSR_IOCTL_CMD_WAKEUP_STATUS (0x01)
zhjcpi 12:5fb829ce6b82 18 #define CSR_IOCTL_CMD_ONOFF_ON (0x02)
zhjcpi 12:5fb829ce6b82 19 #define CSR_IOCTL_CMD_ONOFF_OFF (0x03)
zhjcpi 12:5fb829ce6b82 20 #define CSR_IOCTL_CMD_ONOFF_PULSE (0x04)
zhjcpi 12:5fb829ce6b82 21 #define CSR_IOCTL_CMD_RESET_ON (0x05)
zhjcpi 12:5fb829ce6b82 22 #define CSR_IOCTL_CMD_RESET_OFF (0x06)
zhjcpi 12:5fb829ce6b82 23 #define CSR_IOCTL_CMD_PROTO_NMEA (0x07)
zhjcpi 12:5fb829ce6b82 24 #define CSR_IOCTL_CMD_PROTO_OSP (0x08)
zhjcpi 3:71690f7bb480 25
zhjcpi 3:71690f7bb480 26
zhjcpi 0:aba381fc8158 27 /* OSP protocol related definitions */
zhjcpi 0:aba381fc8158 28 #define MAX_VERSION_LENGTH 80
zhjcpi 0:aba381fc8158 29
zhjcpi 0:aba381fc8158 30 /* OSP message header */
zhjcpi 0:aba381fc8158 31 #define OSP_MSG_HEAD0 (0xA0)
zhjcpi 0:aba381fc8158 32 #define OSP_MSG_HEAD1 (0xA2)
zhjcpi 0:aba381fc8158 33 /* OSP message footer */
zhjcpi 0:aba381fc8158 34 #define OSP_MSG_TAIL0 (0xB0)
zhjcpi 0:aba381fc8158 35 #define OSP_MSG_TAIL1 (0xB3)
zhjcpi 0:aba381fc8158 36
zhjcpi 0:aba381fc8158 37 /* NMEA message header */
zhjcpi 0:aba381fc8158 38 #define NMEA_MSG_HEAD0 ('$')
zhjcpi 0:aba381fc8158 39 #define NMEA_MSG_HEAD1 ('G')
zhjcpi 0:aba381fc8158 40 /* NMEA message footer */
zhjcpi 0:aba381fc8158 41 #define NMEA_MSG_TAIL0 ('*')
zhjcpi 0:aba381fc8158 42
zhjcpi 12:5fb829ce6b82 43 #define CSR_SWAPIN16(bytestream) (((uint16_t)*((bytestream) + 0) << 8) | ((uint16_t)*((bytestream) + 1)))
zhjcpi 0:aba381fc8158 44
zhjcpi 12:5fb829ce6b82 45 #define CSR_SWAPIN32(bytestream) \
zhjcpi 12:5fb829ce6b82 46 (((uint32_t)*((bytestream) + 0) << 24) \
zhjcpi 12:5fb829ce6b82 47 | ((uint32_t)*((bytestream) + 1) << 16) \
zhjcpi 12:5fb829ce6b82 48 | ((uint32_t)*((bytestream) + 2) << 8) \
zhjcpi 12:5fb829ce6b82 49 | ((uint32_t)*((bytestream) + 3)))
zhjcpi 0:aba381fc8158 50
zhjcpi 0:aba381fc8158 51
zhjcpi 0:aba381fc8158 52 /* import macros for little endian: */
zhjcpi 0:aba381fc8158 53 /* NOTE: must use {} around these macros when calling in a loop */
zhjcpi 12:5fb829ce6b82 54 #define BINARY_IMPORT_UINT8(bytestream) (*((bytestream)++))
zhjcpi 12:5fb829ce6b82 55 #define BINARY_IMPORT_UINT16(bytestream) ((uint16_t) CSR_SWAPIN16((bytestream))); bytestream += 2
zhjcpi 12:5fb829ce6b82 56 #define BINARY_IMPORT_UINT32(bytestream) ((uint32_t) CSR_SWAPIN32((bytestream))); bytestream += 4
zhjcpi 12:5fb829ce6b82 57 #define BINARY_IMPORT_SINT32(bytestream) ((int32_t) CSR_SWAPIN32((bytestream))); bytestream += 4
zhjcpi 0:aba381fc8158 58
zhjcpi 0:aba381fc8158 59 #define OSP_MAKE_MSG_ID(mid, sid) ((((mid) & 0xFF) << 8) | ((sid) & 0xFF))
zhjcpi 0:aba381fc8158 60
zhjcpi 0:aba381fc8158 61 #define OSP_MSG_SW_VERSION OSP_MAKE_MSG_ID(0x06, 0x0)
zhjcpi 0:aba381fc8158 62 #define OSP_MSG_OK_TO_SEND OSP_MAKE_MSG_ID(0x12, 0x0)
zhjcpi 0:aba381fc8158 63 #define OSP_MSG_GEODETIC_NAVIGATION OSP_MAKE_MSG_ID(0x29, 0x0)
zhjcpi 0:aba381fc8158 64 #define OSP_MSG_MULTI_CONSTELLATION OSP_MAKE_MSG_ID(0x43, 0x0)
zhjcpi 0:aba381fc8158 65 #define OSP_MSG_GNSS_NAV_DATA OSP_MAKE_MSG_ID(0x43, 0x01)
zhjcpi 0:aba381fc8158 66 #define OSP_MSG_GNSS_SAT_DATA OSP_MAKE_MSG_ID(0x43, 0x10)
zhjcpi 0:aba381fc8158 67 #define OSP_MSG_HW_CONFIG_REQ OSP_MAKE_MSG_ID(0x47, 0x0)
zhjcpi 0:aba381fc8158 68 #define OSP_MSG_PWR_MODE_RSP OSP_MAKE_MSG_ID(0x5A, 0x0)
zhjcpi 0:aba381fc8158 69 #define OSP_MSG_PWR_MODE_FPM_RSP OSP_MAKE_MSG_ID(0x5A, 0x0)
zhjcpi 0:aba381fc8158 70 #define OSP_MSG_PWR_MODE_LPM_RSP OSP_MAKE_MSG_ID(0x5A, 0x6)
zhjcpi 0:aba381fc8158 71
zhjcpi 12:5fb829ce6b82 72
zhjcpi 0:aba381fc8158 73 #define GNSS_SAT_DATA_NUM_OF_SATS (15)
zhjcpi 0:aba381fc8158 74 #define CODEC_GLO_MAX_CHANNELS (14)
zhjcpi 0:aba381fc8158 75 /* The end of OSP protocol definitions */
zhjcpi 0:aba381fc8158 76
zhjcpi 0:aba381fc8158 77
zhjcpi 0:aba381fc8158 78 #define LOC_MAX_GNSS_SVS (32)
zhjcpi 0:aba381fc8158 79 #define LOC_GLO_FREQ_OFFSET (77)
zhjcpi 0:aba381fc8158 80 #define LOC_GLO_FREQ_ID_START (70)
zhjcpi 0:aba381fc8158 81 #define LOC_GLO_FREQ_ID_END (83)
zhjcpi 12:5fb829ce6b82 82 #define LOC_NUM_OF_GLO_FREQ_CHANNELS (1 + LOC_GLO_FREQ_ID_END - LOC_GLO_FREQ_ID_START)
zhjcpi 0:aba381fc8158 83
zhjcpi 0:aba381fc8158 84 #define MAX_PORT_NUM_STRING_LENGTH (16)
zhjcpi 0:aba381fc8158 85 #define MAX_SERIAL_BUF_LEN (2048)
zhjcpi 0:aba381fc8158 86 #define MAX_SERIAL_PKT_LEN (512)
zhjcpi 0:aba381fc8158 87
zhjcpi 0:aba381fc8158 88 #define BAUDRATE_NMEA 4800
zhjcpi 0:aba381fc8158 89 #define BAUDRATE_OSP 115200
zhjcpi 0:aba381fc8158 90
zhjcpi 0:aba381fc8158 91 #define PROTO_CHECK_TIMEOUT (2.0)
zhjcpi 0:aba381fc8158 92
zhjcpi 0:aba381fc8158 93 /** Indicates the outputted location information */
zhjcpi 0:aba381fc8158 94 #define LOC_OUTPUT_LOCATION (1)
zhjcpi 0:aba381fc8158 95 /* Indicates the outputted sv status information */
zhjcpi 0:aba381fc8158 96 #define LOC_OUTPUT_SV_STATUS (2)
zhjcpi 12:5fb829ce6b82 97 #define LOC_OUTPUT_NMEA (3)
zhjcpi 0:aba381fc8158 98
zhjcpi 3:71690f7bb480 99 #if 0
zhjcpi 3:71690f7bb480 100 #define CSR_LOG_INFO printf
zhjcpi 3:71690f7bb480 101 #else
zhjcpi 12:5fb829ce6b82 102 #define CSR_LOG_INFO(...) { \
zhjcpi 12:5fb829ce6b82 103 if (pSerialDebug != NULL) { \
zhjcpi 12:5fb829ce6b82 104 (pSerialDebug->printf(__VA_ARGS__)); \
zhjcpi 12:5fb829ce6b82 105 } \
zhjcpi 12:5fb829ce6b82 106 }
zhjcpi 12:5fb829ce6b82 107 #endif // if 0
zhjcpi 0:aba381fc8158 108
zhjcpi 12:5fb829ce6b82 109 /** Location event definitions */
zhjcpi 12:5fb829ce6b82 110 typedef enum {
zhjcpi 0:aba381fc8158 111 /** Start result event */
zhjcpi 0:aba381fc8158 112 CSR_LOC_EVENT_START_RESULT,
zhjcpi 0:aba381fc8158 113 /** Stop result event */
zhjcpi 0:aba381fc8158 114 CSR_LOC_EVENT_STOP_RESULT,
zhjcpi 12:5fb829ce6b82 115 } eCsrLocEventType;
zhjcpi 0:aba381fc8158 116
zhjcpi 0:aba381fc8158 117 /** Power mode selection */
zhjcpi 12:5fb829ce6b82 118 typedef enum {
zhjcpi 0:aba381fc8158 119 /** full power mode */
zhjcpi 0:aba381fc8158 120 PWR_FULL,
zhjcpi 0:aba381fc8158 121 /** Low power push to fix mode */
zhjcpi 0:aba381fc8158 122 PWR_PTF,
zhjcpi 12:5fb829ce6b82 123 } ePowerMode;
zhjcpi 0:aba381fc8158 124
zhjcpi 3:71690f7bb480 125 /** Power mode selection */
zhjcpi 12:5fb829ce6b82 126 typedef enum {
zhjcpi 3:71690f7bb480 127 /** NMEA protocol */
zhjcpi 3:71690f7bb480 128 PROTO_NMEA,
zhjcpi 3:71690f7bb480 129 /** OSP protocol */
zhjcpi 3:71690f7bb480 130 PROTO_OSP,
zhjcpi 12:5fb829ce6b82 131 } eProto;
zhjcpi 3:71690f7bb480 132
zhjcpi 0:aba381fc8158 133 /* Protocol detection state */
zhjcpi 12:5fb829ce6b82 134 typedef enum {
zhjcpi 0:aba381fc8158 135 STATE_START1, /* Indicates the first byte of the OSP or NMEA message header*/
zhjcpi 0:aba381fc8158 136 STATE_START2, /* Indicates the second byte of the OSP or NMEA message header */
zhjcpi 0:aba381fc8158 137 STATE_SIZE1, /* Indicates the first byte of the OSP message length */
zhjcpi 0:aba381fc8158 138 STATE_SIZE2, /* Indicates the second byte of the OSP message length */
zhjcpi 0:aba381fc8158 139 STATE_PAYLOAD, /* Indicates the start of payload of the OSP message */
zhjcpi 0:aba381fc8158 140 STATE_CHECKSUM1, /* Indicates the first byte of the OSP message checksum */
zhjcpi 0:aba381fc8158 141 STATE_CHECKSUM2, /* Indicates the second byte of the OSP message checksum */
zhjcpi 0:aba381fc8158 142 STATE_END1, /* Indicates the first byte of the OSP or NMEA message footer */
zhjcpi 0:aba381fc8158 143 STATE_END2 /* Indicates the second byte of the OSP message footer */
zhjcpi 12:5fb829ce6b82 144 } eProtoDetState;
zhjcpi 0:aba381fc8158 145
zhjcpi 12:5fb829ce6b82 146 /* CSR Location state */
zhjcpi 12:5fb829ce6b82 147 typedef enum {
zhjcpi 0:aba381fc8158 148 CSR_LOC_STATE_IDLE,
zhjcpi 0:aba381fc8158 149 CSR_LOC_STATE_RUN,
zhjcpi 12:5fb829ce6b82 150 } eCsrLocState;
zhjcpi 0:aba381fc8158 151
zhjcpi 12:5fb829ce6b82 152 /* Location chip protocol detection state */
zhjcpi 12:5fb829ce6b82 153 typedef enum {
zhjcpi 12:5fb829ce6b82 154 PROTO_STATE_DET_INVALID = 0,
zhjcpi 12:5fb829ce6b82 155 PROTO_STATE_DET_OSP,
zhjcpi 12:5fb829ce6b82 156 PROTO_STATE_DET_NMEA,
zhjcpi 12:5fb829ce6b82 157 // PROTO_STATE_SWI_OSP_FROM_NMEA,
zhjcpi 12:5fb829ce6b82 158 PROTO_STATE_DET_OSP_FROM_NMEA,
zhjcpi 12:5fb829ce6b82 159 // PROTO_STATE_SWI_NMEA_FROM_OSP,
zhjcpi 12:5fb829ce6b82 160 PROTO_STATE_DET_NMEA_FROM_OSP,
zhjcpi 12:5fb829ce6b82 161 PROTO_STATE_DET_OK,
zhjcpi 12:5fb829ce6b82 162 } eProtoState;
zhjcpi 0:aba381fc8158 163
zhjcpi 12:5fb829ce6b82 164 /* Location chip status */
zhjcpi 12:5fb829ce6b82 165 typedef enum {
zhjcpi 0:aba381fc8158 166 /* Location chip is going to hibernation mode and cannot accept message any more */
zhjcpi 0:aba381fc8158 167 ENGINE_STATUS_NOTOK2SEND,
zhjcpi 12:5fb829ce6b82 168 /* Location come back from hibernation mode and can accept message now */
zhjcpi 0:aba381fc8158 169 ENGINE_STATUS_OK2SEND
zhjcpi 12:5fb829ce6b82 170 } eEngineStatus;
zhjcpi 0:aba381fc8158 171
zhjcpi 0:aba381fc8158 172 /* OSP data type to be sent to location chip */
zhjcpi 12:5fb829ce6b82 173 typedef enum {
zhjcpi 0:aba381fc8158 174 SEND_DATA_TYPE_OSP_STOP_REQ,
zhjcpi 0:aba381fc8158 175 SEND_DATA_TYPE_OSP_VER_REQ,
zhjcpi 0:aba381fc8158 176 SEND_DATA_TYPE_OSP_LPM_REQ,
zhjcpi 0:aba381fc8158 177 SEND_DATA_TYPE_OSP_FPM_REQ,
zhjcpi 0:aba381fc8158 178 SEND_DATA_TYPE_OSP_SWITCH2NMEA_REQ,
zhjcpi 3:71690f7bb480 179 SEND_DATA_TYPE_NMEA_SWITCH2OSP_REQ,
zhjcpi 3:71690f7bb480 180 SEND_DATA_TYPE_NMEA_STOP_REQ
zhjcpi 12:5fb829ce6b82 181 } eSendDataType;
zhjcpi 0:aba381fc8158 182
zhjcpi 12:5fb829ce6b82 183 typedef struct GpsTime {
zhjcpi 0:aba381fc8158 184 /** Week part of GPS time */
zhjcpi 12:5fb829ce6b82 185 uint16_t gps_week;
zhjcpi 0:aba381fc8158 186 /** Time of second part of GPS time */
zhjcpi 12:5fb829ce6b82 187 uint32_t tow;
zhjcpi 12:5fb829ce6b82 188 } tGpsTime;
zhjcpi 3:71690f7bb480 189
zhjcpi 3:71690f7bb480 190 /** Structure to hold Position Response Message Information. */
zhjcpi 12:5fb829ce6b82 191 typedef struct LocPosResp {
zhjcpi 12:5fb829ce6b82 192 union {
zhjcpi 12:5fb829ce6b82 193 tGpsTime gpsTime;
zhjcpi 12:5fb829ce6b82 194 float utcTime;
zhjcpi 12:5fb829ce6b82 195 } u;
zhjcpi 0:aba381fc8158 196 /** Latitude */
zhjcpi 12:5fb829ce6b82 197 double lat;
zhjcpi 0:aba381fc8158 198 /** Longitude */
zhjcpi 12:5fb829ce6b82 199 double lon;
zhjcpi 0:aba381fc8158 200 /** Altitude */
zhjcpi 12:5fb829ce6b82 201 double alt;
zhjcpi 0:aba381fc8158 202 } tLocPosResp;
zhjcpi 0:aba381fc8158 203
zhjcpi 0:aba381fc8158 204 /** Structure to hold Satellite Information. */
zhjcpi 12:5fb829ce6b82 205 typedef struct LocSvInfo {
zhjcpi 0:aba381fc8158 206 /** Prn or svId */
zhjcpi 12:5fb829ce6b82 207 uint8_t prn;
zhjcpi 0:aba381fc8158 208 /** The ratio of carrier and noise */
zhjcpi 12:5fb829ce6b82 209 float cno;
zhjcpi 0:aba381fc8158 210 /** elevation */
zhjcpi 12:5fb829ce6b82 211 float elevation;
zhjcpi 0:aba381fc8158 212 /** azimuth */
zhjcpi 12:5fb829ce6b82 213 float azimuth;
zhjcpi 0:aba381fc8158 214 /** satellite state */
zhjcpi 12:5fb829ce6b82 215 uint16_t state;
zhjcpi 0:aba381fc8158 216 } tLocSvInfo;
zhjcpi 0:aba381fc8158 217
zhjcpi 0:aba381fc8158 218 /** Structure to hold Satellite Information for GLONASS */
zhjcpi 12:5fb829ce6b82 219 typedef struct LocGloSvInfo {
zhjcpi 0:aba381fc8158 220 /** Prn or svId */
zhjcpi 12:5fb829ce6b82 221 uint8_t prn;
zhjcpi 0:aba381fc8158 222 /** Slot number */
zhjcpi 12:5fb829ce6b82 223 uint8_t sno;
zhjcpi 0:aba381fc8158 224 /** The ratio of carrier and noise */
zhjcpi 12:5fb829ce6b82 225 float cno;
zhjcpi 0:aba381fc8158 226 /** elevation */
zhjcpi 12:5fb829ce6b82 227 float elevation;
zhjcpi 0:aba381fc8158 228 /** azimuth */
zhjcpi 12:5fb829ce6b82 229 float azimuth;
zhjcpi 0:aba381fc8158 230 /** satellite state */
zhjcpi 12:5fb829ce6b82 231 uint16_t state;
zhjcpi 0:aba381fc8158 232 } tLocGloSvInfo;
zhjcpi 0:aba381fc8158 233
zhjcpi 0:aba381fc8158 234 /** Structure to hold Satellite Status Information. */
zhjcpi 12:5fb829ce6b82 235 typedef struct LocSvStatus {
zhjcpi 0:aba381fc8158 236 /** Week part of GPS time */
zhjcpi 12:5fb829ce6b82 237 uint16_t gps_week;
zhjcpi 0:aba381fc8158 238 /** Time of second part of GPS time */
zhjcpi 12:5fb829ce6b82 239 uint32_t tow;
zhjcpi 0:aba381fc8158 240 /** Time of millisecond part of GPS time */
zhjcpi 12:5fb829ce6b82 241 uint32_t tow_sub_ms;
zhjcpi 12:5fb829ce6b82 242
zhjcpi 0:aba381fc8158 243 /**Number of GPS SVs currently visible **/
zhjcpi 12:5fb829ce6b82 244 uint8_t numOfSVs;
zhjcpi 0:aba381fc8158 245 /**Number of GLONASS SVs currently visible **/
zhjcpi 12:5fb829ce6b82 246 uint8_t numOfGloSVs;
zhjcpi 0:aba381fc8158 247 /** GPS SVs information */
zhjcpi 12:5fb829ce6b82 248 tLocSvInfo svList[LOC_MAX_GNSS_SVS];
zhjcpi 0:aba381fc8158 249 /** GLONASS SVs information */
zhjcpi 12:5fb829ce6b82 250 tLocGloSvInfo gloSvList[LOC_NUM_OF_GLO_FREQ_CHANNELS];
zhjcpi 0:aba381fc8158 251 /** Bit mask indicating which SVs have ephemeris data **/
zhjcpi 12:5fb829ce6b82 252 uint32_t ephemerisMask;
zhjcpi 0:aba381fc8158 253 /** Bit mask indicating which GLONASS SVs have ephemeris data **/
zhjcpi 12:5fb829ce6b82 254 uint32_t gloEphemerisMask;
zhjcpi 0:aba381fc8158 255 /** Bit mask indicating which SVs were used in latest sent fix **/
zhjcpi 12:5fb829ce6b82 256 uint32_t svUsedInFixMask;
zhjcpi 0:aba381fc8158 257 /** Bit mask indicating which GLONASS SVs were used in latest sent fix **/
zhjcpi 12:5fb829ce6b82 258 uint32_t gloSvUsedInFixMask;
zhjcpi 12:5fb829ce6b82 259 /** Bit mask indicating which QZSS SVs were used in latest sent fix **/
zhjcpi 12:5fb829ce6b82 260 uint32_t qzssSvUsedInFixMask;
zhjcpi 12:5fb829ce6b82 261 /** Bit mask indicating which SBAS SVs were used in latest sent fix **/
zhjcpi 12:5fb829ce6b82 262 uint32_t sbasSvUsedInFixMask;
zhjcpi 0:aba381fc8158 263 } tLocSvStatus;
zhjcpi 0:aba381fc8158 264
zhjcpi 0:aba381fc8158 265
zhjcpi 12:5fb829ce6b82 266 /** Application register this out callback function and CsrLocation class will pass outputted information to application */
zhjcpi 12:5fb829ce6b82 267 typedef void (*csr_app_output_callback)(uint32_t msgId, void *const pMsgData, uint32_t msgLength);
zhjcpi 0:aba381fc8158 268
zhjcpi 12:5fb829ce6b82 269 /** Application register this event callback function and CsrLocation class will pass internal processing event to application */
zhjcpi 2:d4fe184925f2 270 typedef void (*csr_app_event_callback)(eCsrLocEventType event, uint32_t data);
zhjcpi 0:aba381fc8158 271
zhjcpi 12:5fb829ce6b82 272 /* General OSP message format */
zhjcpi 12:5fb829ce6b82 273 typedef struct OspMsg {
zhjcpi 12:5fb829ce6b82 274 uint32_t msgId;
zhjcpi 12:5fb829ce6b82 275 uint32_t length;
zhjcpi 12:5fb829ce6b82 276 uint8_t payload[4];
zhjcpi 0:aba381fc8158 277 } tOspMsg;
zhjcpi 0:aba381fc8158 278
zhjcpi 0:aba381fc8158 279
zhjcpi 12:5fb829ce6b82 280 /** CSRLocation class.
zhjcpi 0:aba381fc8158 281 * A location interface to control location chip and get position and satellite information.
zhjcpi 0:aba381fc8158 282 */
zhjcpi 12:5fb829ce6b82 283 class CSRLocation : public GPSProviderImplBase
zhjcpi 0:aba381fc8158 284 {
zhjcpi 0:aba381fc8158 285 public:
zhjcpi 12:5fb829ce6b82 286 /** Constructor: CsrLocation
zhjcpi 12:5fb829ce6b82 287 * Create the CSRLocation, accept specified configuration
zhjcpi 12:5fb829ce6b82 288 *
zhjcpi 12:5fb829ce6b82 289 * @param [in] pSerialLoc
zhjcpi 12:5fb829ce6b82 290 * serial communication channel between host and GPS controller.
zhjcpi 12:5fb829ce6b82 291 * @param [in] pPinOnoff
zhjcpi 12:5fb829ce6b82 292 * GPIO pin to control location chip on, a rising edge is used to activate
zhjcpi 12:5fb829ce6b82 293 * location chip. Please note, before activate chip, reset pin should be
zhjcpi 12:5fb829ce6b82 294 * pull high.
zhjcpi 12:5fb829ce6b82 295 * @param [in] pPinReset
zhjcpi 12:5fb829ce6b82 296 * GPIO pin to control location chip reset, low level will keep location
zhjcpi 12:5fb829ce6b82 297 * chip in hibernation state and high level will permit location chip to be
zhjcpi 12:5fb829ce6b82 298 * activated.
zhjcpi 12:5fb829ce6b82 299 * @param [in] pWakeup
zhjcpi 12:5fb829ce6b82 300 * GPIO pin to detect if the chip is still wakeup.
zhjcpi 12:5fb829ce6b82 301 * @param [in] pLocConfig
zhjcpi 12:5fb829ce6b82 302 * Configuration including debug serial port, location communication serial port, onoff pin, reset pin
zhjcpi 12:5fb829ce6b82 303 * @param [in] debugP
zhjcpi 12:5fb829ce6b82 304 * The debug port for diagnostic messages; can be NULL.
zhjcpi 0:aba381fc8158 305 */
zhjcpi 12:5fb829ce6b82 306 CSRLocation(RawSerial &serialLoc,
zhjcpi 12:5fb829ce6b82 307 DigitalOut &pinOnoff,
zhjcpi 12:5fb829ce6b82 308 DigitalOut &pinReset,
zhjcpi 12:5fb829ce6b82 309 DigitalIn &wakeup,
zhjcpi 12:5fb829ce6b82 310 Serial *debugP = NULL);
zhjcpi 12:5fb829ce6b82 311
zhjcpi 12:5fb829ce6b82 312 /** Destructor: CSRLocation
zhjcpi 0:aba381fc8158 313 * Free allocated resource
zhjcpi 0:aba381fc8158 314 */
zhjcpi 12:5fb829ce6b82 315 virtual ~CSRLocation();
zhjcpi 12:5fb829ce6b82 316
zhjcpi 12:5fb829ce6b82 317 /** Register output callback and event callback functions
zhjcpi 12:5fb829ce6b82 318 * @param app_output_cb CSRLocation class output the location and satellite information to application
zhjcpi 12:5fb829ce6b82 319 * @param app_event_cb CSRLocation class output the start and stop result to application
zhjcpi 0:aba381fc8158 320 */
zhjcpi 0:aba381fc8158 321 void CsrLocRegOutput(csr_app_output_callback app_output_cb, csr_app_event_callback app_event_cb);
zhjcpi 0:aba381fc8158 322
zhjcpi 12:5fb829ce6b82 323 /** HW reset to get location chip into hibernation mode */
zhjcpi 12:5fb829ce6b82 324 virtual void reset(void);
zhjcpi 0:aba381fc8158 325
zhjcpi 0:aba381fc8158 326 /* A debug interface to switch location chip protocol from OSP at 115200bps to NMEA at 4800bps */
zhjcpi 0:aba381fc8158 327 void CsrLocDebugSwitch2Nmea(void);
zhjcpi 12:5fb829ce6b82 328
zhjcpi 0:aba381fc8158 329 private:
zhjcpi 0:aba381fc8158 330 /* Initialize the serial port and open it */
zhjcpi 0:aba381fc8158 331 void _CsrLocUartInit(void);
zhjcpi 0:aba381fc8158 332
zhjcpi 12:5fb829ce6b82 333 /* Process the raw stream from location serial port */
zhjcpi 0:aba381fc8158 334 void _CsrLocProcessRawStream(void);
zhjcpi 0:aba381fc8158 335
zhjcpi 3:71690f7bb480 336 /* Detect the OSP protocol detection timeout */
zhjcpi 3:71690f7bb480 337 void _CsrLocDetProtoOspTimeout(void);
zhjcpi 0:aba381fc8158 338
zhjcpi 0:aba381fc8158 339 /* Detect the NMEA protocol outputted from location serial port */
zhjcpi 3:71690f7bb480 340 void _CsrLocDetProtoNmeaTimeout(void);
zhjcpi 3:71690f7bb480 341
zhjcpi 12:5fb829ce6b82 342 /* Process the raw NMEA stream, remove the NMEA header, tail, and save the NMEA data into internal buffer */
zhjcpi 3:71690f7bb480 343 void _CsrLocProcessRawNmeaStream(uint8_t data);
zhjcpi 0:aba381fc8158 344
zhjcpi 12:5fb829ce6b82 345 /* Process the raw OSP stream, remove the OSP header, size, check sum, and save the OSP data into internal buffer */
zhjcpi 2:d4fe184925f2 346 void _CsrLocProcessRawOspStream(uint8_t data);
zhjcpi 0:aba381fc8158 347
zhjcpi 12:5fb829ce6b82 348 /* Process the saved NMEA data and decode them */
zhjcpi 3:71690f7bb480 349 void _CsrLocProcessRawNmeaPkt(void);
zhjcpi 3:71690f7bb480 350
zhjcpi 0:aba381fc8158 351 /* Process the saved OSP data and decode them */
zhjcpi 0:aba381fc8158 352 void _CsrLocProcessRawOspPkt(void);
zhjcpi 0:aba381fc8158 353
zhjcpi 12:5fb829ce6b82 354 /* Calculate the OSP message size to allocate buffer to save the decoded OSP data */
zhjcpi 2:d4fe184925f2 355 uint32_t _CsrLocCalcMsgSize(void);
zhjcpi 0:aba381fc8158 356
zhjcpi 12:5fb829ce6b82 357 /* Decode OSP data into packet data structure */
zhjcpi 12:5fb829ce6b82 358 CsrResult _CsrLocDecodeOspPkt(uint8_t *payload,
zhjcpi 12:5fb829ce6b82 359 uint32_t payload_length,
zhjcpi 12:5fb829ce6b82 360 uint32_t *message_id,
zhjcpi 12:5fb829ce6b82 361 void *message_structure,
zhjcpi 12:5fb829ce6b82 362 uint32_t *message_length);
zhjcpi 0:aba381fc8158 363
zhjcpi 0:aba381fc8158 364 /* Process the decode OSP packet and pass to application when needed */
zhjcpi 0:aba381fc8158 365 void _CsrLocProcessOspPkt(tOspMsg *pOspMsg);
zhjcpi 0:aba381fc8158 366
zhjcpi 0:aba381fc8158 367 /* Timeout process, such as detect OSP and NMEA protocol */
zhjcpi 0:aba381fc8158 368 void _CsrLocTimeout(void);
zhjcpi 0:aba381fc8158 369
zhjcpi 12:5fb829ce6b82 370 /* Location serial port data receiver */
zhjcpi 0:aba381fc8158 371 void _CsrLocRxHandler(void);
zhjcpi 0:aba381fc8158 372
zhjcpi 12:5fb829ce6b82 373 /* Send special OSP messages to location chip */
zhjcpi 0:aba381fc8158 374 void _CsrLocSendData(eSendDataType type);
zhjcpi 0:aba381fc8158 375
zhjcpi 0:aba381fc8158 376 /* Trigger a pulse on the onoff pin */
zhjcpi 0:aba381fc8158 377 void _CsrLocHwOnoff(void);
zhjcpi 0:aba381fc8158 378
zhjcpi 0:aba381fc8158 379 /* Trigger a reset on the reset pin */
zhjcpi 0:aba381fc8158 380 void _CsrLocHwReset(void);
zhjcpi 8:fa29f8455134 381
zhjcpi 8:fa29f8455134 382 /* Detect wakeup status on the wakeup pin */
zhjcpi 8:fa29f8455134 383 bool _CsrLocIsWakeup(void);
zhjcpi 8:fa29f8455134 384
zhjcpi 12:5fb829ce6b82 385 private:
zhjcpi 12:5fb829ce6b82 386 void outputHandler(uint32_t msgId, void *const pMsgData, uint32_t msgLength);
zhjcpi 12:5fb829ce6b82 387 void eventHandler(eCsrLocEventType event, uint32_t data);
zhjcpi 12:5fb829ce6b82 388
zhjcpi 12:5fb829ce6b82 389 /**
zhjcpi 12:5fb829ce6b82 390 * APIs needed to extend GPSProviderImplBase
zhjcpi 12:5fb829ce6b82 391 */
zhjcpi 12:5fb829ce6b82 392 private:
zhjcpi 12:5fb829ce6b82 393 virtual bool setPowerMode(GPSProvider::PowerMode_t pwrMode);
zhjcpi 12:5fb829ce6b82 394 virtual void start(void);
zhjcpi 12:5fb829ce6b82 395 virtual void stop(void);
zhjcpi 12:5fb829ce6b82 396 virtual void process(void);
zhjcpi 12:5fb829ce6b82 397 virtual uint32_t ioctl(uint32_t command, void *arg);
zhjcpi 12:5fb829ce6b82 398
zhjcpi 12:5fb829ce6b82 399 /** Special for low power PTF mode.
zhjcpi 12:5fb829ce6b82 400 * During low power PTF mode, after reporting position, chip will go to hibernation mode automatically.
zhjcpi 12:5fb829ce6b82 401 * After 30 seconds, chip will recover and report position again. Then chip will go to hibernation mode again.
zhjcpi 12:5fb829ce6b82 402 * During the hibernation, application can call lpmGetImmediateLocation to get position immediately and no need to wait for the whole interval.
zhjcpi 12:5fb829ce6b82 403 */
zhjcpi 12:5fb829ce6b82 404 virtual void lpmGetImmediateLocation(void);
zhjcpi 12:5fb829ce6b82 405
zhjcpi 12:5fb829ce6b82 406 /* Internal data */
zhjcpi 12:5fb829ce6b82 407 private:
zhjcpi 12:5fb829ce6b82 408 RawSerial &serialLoc; /**< serial communication channel between host and GPS controller. */
zhjcpi 12:5fb829ce6b82 409 DigitalOut &pinOnoff;
zhjcpi 12:5fb829ce6b82 410 DigitalOut &pinReset;
zhjcpi 12:5fb829ce6b82 411 DigitalIn &wakeup;
zhjcpi 12:5fb829ce6b82 412
zhjcpi 12:5fb829ce6b82 413 bool bPwrModeRsp;
zhjcpi 12:5fb829ce6b82 414 bool bVerRsp;
zhjcpi 12:5fb829ce6b82 415
zhjcpi 12:5fb829ce6b82 416 eProto proto;
zhjcpi 12:5fb829ce6b82 417 eCsrLocState locState;
zhjcpi 12:5fb829ce6b82 418 eProtoState protoState;
zhjcpi 12:5fb829ce6b82 419 ePowerMode pwrMode;
zhjcpi 12:5fb829ce6b82 420
zhjcpi 12:5fb829ce6b82 421 uint32_t baudRate;
zhjcpi 12:5fb829ce6b82 422 int32_t computedCheckSum;
zhjcpi 12:5fb829ce6b82 423 int32_t checksum;
zhjcpi 12:5fb829ce6b82 424 int32_t msgSize;
zhjcpi 12:5fb829ce6b82 425 int32_t decodeIndex;
zhjcpi 12:5fb829ce6b82 426 eProtoDetState protoDetState;
zhjcpi 12:5fb829ce6b82 427 Timeout *pTimeoutChk; /* timeout process */
zhjcpi 12:5fb829ce6b82 428 bool bTimeoutFlag;
zhjcpi 12:5fb829ce6b82 429 eEngineStatus engStatus;
zhjcpi 12:5fb829ce6b82 430
zhjcpi 12:5fb829ce6b82 431 tLocSvStatus svStatus; /* 2 kind of messages contribute the svStaus */
zhjcpi 12:5fb829ce6b82 432
zhjcpi 12:5fb829ce6b82 433 uint8_t serialBuf[MAX_SERIAL_BUF_LEN]; /* buffer the serial data from UART callback function */
zhjcpi 12:5fb829ce6b82 434 uint8_t serialPkt[MAX_SERIAL_PKT_LEN]; /* decoded OSP data */
zhjcpi 12:5fb829ce6b82 435 uint32_t in;
zhjcpi 12:5fb829ce6b82 436 uint32_t out;
zhjcpi 12:5fb829ce6b82 437
zhjcpi 12:5fb829ce6b82 438 csr_app_output_callback appOutCb;
zhjcpi 12:5fb829ce6b82 439 csr_app_event_callback appEventCb;
zhjcpi 12:5fb829ce6b82 440
zhjcpi 12:5fb829ce6b82 441 Serial *pSerialDebug;
zhjcpi 0:aba381fc8158 442 };
zhjcpi 0:aba381fc8158 443
zhjcpi 0:aba381fc8158 444 #endif /* CSRLOCATION_H */