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:
Thu Nov 27 10:28:35 2014 +0000
Revision:
20:88db82cf3f0f
Parent:
18:5d72465991f5
Child:
19:27aa296d2ea1
Support Freescale FDRM platform.
; Location uart cannot use D8/D2, it is changed to D1/D0.
; Trigger on/off before open UART. Otherwise, FDRM will halt when doing the second start(start,then stop, then start again).

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