Import of CSR's demo for SirfV. Has minor cleanup.

Dependencies:   CsrLocation mbed GPSProvider

Fork of CsrLocationDemo by jie zhao

Committer:
rgrover1
Date:
Fri Oct 31 13:36:57 2014 +0000
Revision:
17:ebf95368b2d8
Parent:
16:24128dedf8db
Child:
18:c75558f5959f
updating the app due to improvements to GPSProvider and CSRLocation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 16:24128dedf8db 1 /* CSRLocation class for mbed Microcontroller
zhjcpi 0:789f6b6f710d 2 * Copyright 2014 CSR plc
zhjcpi 0:789f6b6f710d 3 */
zhjcpi 0:789f6b6f710d 4
zhjcpi 0:789f6b6f710d 5 #include "mbed.h"
zhjcpi 0:789f6b6f710d 6 #include "CsrLocation.h"
rgrover1 16:24128dedf8db 7 #include "GPSProvider.h"
zhjcpi 0:789f6b6f710d 8
rgrover1 15:495c22f32cc6 9 #ifdef TARGET_LPC1768
rgrover1 16:24128dedf8db 10 #define PINMAP_GPIO_BTN D6
rgrover1 16:24128dedf8db 11 #define PINMAP_GPIO_TEST D10
rgrover1 16:24128dedf8db 12 #define LOC_LED1 LED1
rgrover1 16:24128dedf8db 13 #define LOC_LED2 LED2
rgrover1 15:495c22f32cc6 14 #elif defined(TARGET_LPC1549) || defined(TARGET_NUCLEO_F103RB)
rgrover1 16:24128dedf8db 15 #define PINMAP_GPIO_BTN D5
rgrover1 16:24128dedf8db 16 #define PINMAP_GPIO_TEST D10
rgrover1 16:24128dedf8db 17 #define LOC_LED1 D7
rgrover1 16:24128dedf8db 18 #define LOC_LED2 D6
rgrover1 15:495c22f32cc6 19 #endif // ifdef TARGET_LPC1768
rgrover1 15:495c22f32cc6 20
zhjcpi 3:7a3ed8ae071d 21 #define APP_DBG_PORT_BAUD 115200
zhjcpi 3:7a3ed8ae071d 22 #define CSR_APP_LOG_INFO(...) sSerialDebug.printf(__VA_ARGS__)
zhjcpi 3:7a3ed8ae071d 23
zhjcpi 0:789f6b6f710d 24 /* appliation commands */
rgrover1 15:495c22f32cc6 25 typedef enum AppCmd {
rgrover1 15:495c22f32cc6 26 APP_CMD_IDLE, // No special command
rgrover1 15:495c22f32cc6 27 APP_CMD_HELP, // Show the supported commands
rgrover1 15:495c22f32cc6 28 APP_CMD_START, // Start location
rgrover1 15:495c22f32cc6 29 APP_CMD_STOP, // Stop location
rgrover1 15:495c22f32cc6 30 APP_CMD_PM_FULL, // Set full power mode
rgrover1 15:495c22f32cc6 31 APP_CMD_PM_PTF, // Set low power PTF mode
rgrover1 15:495c22f32cc6 32 APP_CMD_PTF_GETPOS, // Get location immediately in low power PTF mode
rgrover1 15:495c22f32cc6 33 APP_CMD_NMEA, // proto mode is NMEA
zhjcpi 3:7a3ed8ae071d 34 APP_CMD_OSP, // proto mode is OSP
zhjcpi 3:7a3ed8ae071d 35 APP_CMD_SWITCH_NMEA, // Debug command, switch chip to NMEA protocol at 4800bps
zhjcpi 3:7a3ed8ae071d 36 APP_CMD_SWITCH_OSP, // Debug command, switch chip to NMEA protocol at 4800bps
zhjcpi 3:7a3ed8ae071d 37 APP_CMD_START_FAILED, // Process start failed case
zhjcpi 3:7a3ed8ae071d 38 APP_CMD_STOP_FAILED, // Process stop failed case
rgrover1 15:495c22f32cc6 39 APP_CMD_ONOFF_ON, // Debug command, pull onoff pin high level
zhjcpi 0:789f6b6f710d 40 APP_CMD_ONOFF_OFF, // Debug command, pull onoff pin low level
rgrover1 16:24128dedf8db 41 APP_CMD_RESET, // Debug command, pull reset pin high level
zhjcpi 11:4e0bba518108 42 APP_CMD_WAKEUP_STATUS, // Debug command, check wakeup pin status
zhjcpi 9:87d1555b6219 43 APP_CMD_PINTEST_ON, // Debug command, pull test pin high level
zhjcpi 9:87d1555b6219 44 APP_CMD_PINTEST_OFF, // Debug command, pull test pin low level
zhjcpi 9:87d1555b6219 45 APP_CMD_PINTEST_OFF_ON // Debug command, pull test pin low firstly, then pull high level
rgrover1 15:495c22f32cc6 46 } eAppCmd;
zhjcpi 0:789f6b6f710d 47
zhjcpi 0:789f6b6f710d 48 static void _AppShowCmd(void);
zhjcpi 9:87d1555b6219 49 static void _AppBtnPushed(void);
zhjcpi 0:789f6b6f710d 50 static void _ConsoleRxHandler(void);
zhjcpi 0:789f6b6f710d 51 static void _AppCmdProcess(char *pCmd);
zhjcpi 0:789f6b6f710d 52
rgrover1 16:24128dedf8db 53 static int sAppCmd = APP_CMD_IDLE;
zhjcpi 0:789f6b6f710d 54
rgrover1 16:24128dedf8db 55 static DigitalOut sLedLocOn(LOC_LED1);
rgrover1 16:24128dedf8db 56 static DigitalOut sLedPosReport(LOC_LED2);
rgrover1 16:24128dedf8db 57 static InterruptIn sBtn(PINMAP_GPIO_BTN);
rgrover1 16:24128dedf8db 58 static DigitalOut sPinTest(PINMAP_GPIO_TEST);
rgrover1 16:24128dedf8db 59
rgrover1 16:24128dedf8db 60 DBG_SERIAL_TYPE sSerialDebug(USBTX, USBRX);
zhjcpi 0:789f6b6f710d 61
rgrover1 17:ebf95368b2d8 62 void
rgrover1 17:ebf95368b2d8 63 locationHandler(const GPSProvider::LocationUpdateParams_t *params)
rgrover1 17:ebf95368b2d8 64 {
rgrover1 17:ebf95368b2d8 65 CSR_APP_LOG_INFO("received location update\r\n");
rgrover1 17:ebf95368b2d8 66 }
rgrover1 17:ebf95368b2d8 67
zhjcpi 0:789f6b6f710d 68 int main(void)
zhjcpi 0:789f6b6f710d 69 {
rgrover1 15:495c22f32cc6 70 sLedLocOn = 0;
rgrover1 15:495c22f32cc6 71 sLedPosReport = 0;
rgrover1 15:495c22f32cc6 72 sPinTest = 1;
rgrover1 15:495c22f32cc6 73 sBtn.mode(PullUp);
rgrover1 15:495c22f32cc6 74 sBtn.fall(&_AppBtnPushed);
rgrover1 15:495c22f32cc6 75
rgrover1 15:495c22f32cc6 76 /* initialize the debug serial port */
zhjcpi 3:7a3ed8ae071d 77 sSerialDebug.baud(APP_DBG_PORT_BAUD);
zhjcpi 0:789f6b6f710d 78 sSerialDebug.attach(&_ConsoleRxHandler);
zhjcpi 0:789f6b6f710d 79
rgrover1 16:24128dedf8db 80 GPSProvider gps;
rgrover1 16:24128dedf8db 81 gps.setPowerMode(GPSProvider::POWER_FULL);
rgrover1 16:24128dedf8db 82 gps.reset();
rgrover1 17:ebf95368b2d8 83 gps.onLocationUpdate(locationHandler);
rgrover1 15:495c22f32cc6 84 CSR_APP_LOG_INFO("Success to new csrLocation.\r\n");
zhjcpi 0:789f6b6f710d 85
zhjcpi 0:789f6b6f710d 86 _AppShowCmd();
zhjcpi 0:789f6b6f710d 87
rgrover1 15:495c22f32cc6 88 while (true) {
rgrover1 15:495c22f32cc6 89 switch (sAppCmd) {
rgrover1 15:495c22f32cc6 90 case APP_CMD_HELP:
rgrover1 15:495c22f32cc6 91 sAppCmd = APP_CMD_IDLE;
rgrover1 15:495c22f32cc6 92 _AppShowCmd();
rgrover1 15:495c22f32cc6 93 break;
rgrover1 16:24128dedf8db 94 case APP_CMD_IDLE:
rgrover1 17:ebf95368b2d8 95 gps.process();
rgrover1 16:24128dedf8db 96 break;
rgrover1 15:495c22f32cc6 97 case APP_CMD_START:
rgrover1 15:495c22f32cc6 98 sAppCmd = APP_CMD_IDLE;
rgrover1 15:495c22f32cc6 99 CSR_APP_LOG_INFO("start location.\r\n");
rgrover1 16:24128dedf8db 100 gps.start();
rgrover1 15:495c22f32cc6 101 sLedLocOn = 1;
rgrover1 15:495c22f32cc6 102 break;
rgrover1 15:495c22f32cc6 103 case APP_CMD_STOP:
rgrover1 15:495c22f32cc6 104 sAppCmd = APP_CMD_IDLE;
rgrover1 15:495c22f32cc6 105 CSR_APP_LOG_INFO("stop location.\r\n");
rgrover1 16:24128dedf8db 106 gps.stop();
rgrover1 15:495c22f32cc6 107 sLedLocOn = 0;
rgrover1 15:495c22f32cc6 108 break;
rgrover1 16:24128dedf8db 109 // case APP_CMD_START_FAILED:
rgrover1 16:24128dedf8db 110 // sAppCmd = APP_CMD_IDLE;
rgrover1 16:24128dedf8db 111 // CSR_APP_LOG_INFO("reset as start failed.\r\n");
rgrover1 16:24128dedf8db 112 // sLedLocOn = 0;
rgrover1 16:24128dedf8db 113 // pCsrLoc->CsrLocStop();
rgrover1 16:24128dedf8db 114 // pCsrLoc->reset();
rgrover1 16:24128dedf8db 115 // break;
rgrover1 16:24128dedf8db 116 // case APP_CMD_STOP_FAILED:
rgrover1 16:24128dedf8db 117 // sAppCmd = APP_CMD_IDLE;
rgrover1 16:24128dedf8db 118 // CSR_APP_LOG_INFO("reset as stop failed.\r\n");
rgrover1 16:24128dedf8db 119 // sLedLocOn = 0;
rgrover1 16:24128dedf8db 120 // pCsrLoc->CsrLocStop();
rgrover1 16:24128dedf8db 121 // pCsrLoc->reset();
rgrover1 16:24128dedf8db 122 // break;
rgrover1 16:24128dedf8db 123 case APP_CMD_RESET:
rgrover1 16:24128dedf8db 124 sAppCmd = APP_CMD_IDLE;
rgrover1 16:24128dedf8db 125 gps.reset();
rgrover1 16:24128dedf8db 126 // sPinReset = 1;
rgrover1 16:24128dedf8db 127 CSR_APP_LOG_INFO("reset on.\r\n");
rgrover1 15:495c22f32cc6 128 break;
rgrover1 16:24128dedf8db 129 // case APP_CMD_RESET_OFF:
rgrover1 16:24128dedf8db 130 // CSR_APP_LOG_INFO("reset off.\r\n");
rgrover1 16:24128dedf8db 131 // sAppCmd = APP_CMD_IDLE;
rgrover1 16:24128dedf8db 132 // sPinReset = 0;
rgrover1 16:24128dedf8db 133 // break;
rgrover1 16:24128dedf8db 134 // case APP_CMD_PINTEST_ON:
rgrover1 16:24128dedf8db 135 // CSR_APP_LOG_INFO("test pin on.\r\n");
rgrover1 16:24128dedf8db 136 // sAppCmd = APP_CMD_IDLE;
rgrover1 16:24128dedf8db 137 // sPinTest = 1;
rgrover1 16:24128dedf8db 138 // break;
rgrover1 16:24128dedf8db 139 // case APP_CMD_PINTEST_OFF:
rgrover1 16:24128dedf8db 140 // CSR_APP_LOG_INFO("test pin off.\r\n");
rgrover1 16:24128dedf8db 141 // sAppCmd = APP_CMD_IDLE;
rgrover1 16:24128dedf8db 142 // sPinTest = 0;
rgrover1 16:24128dedf8db 143 // break;
rgrover1 16:24128dedf8db 144 // case APP_CMD_PINTEST_OFF_ON:
rgrover1 16:24128dedf8db 145 // CSR_APP_LOG_INFO("test pin off and high.\r\n");
rgrover1 16:24128dedf8db 146 // sAppCmd = APP_CMD_IDLE;
rgrover1 16:24128dedf8db 147 // sPinTest = 0;
rgrover1 16:24128dedf8db 148 // wait_ms(100);
rgrover1 16:24128dedf8db 149 // sPinTest = 1;
rgrover1 16:24128dedf8db 150 // break;
rgrover1 16:24128dedf8db 151 // case APP_CMD_WAKEUP_STATUS:
rgrover1 16:24128dedf8db 152 // CSR_APP_LOG_INFO("wakeup status : %d.\r\n", sWakeup.read());
rgrover1 16:24128dedf8db 153 // sAppCmd = APP_CMD_IDLE;
rgrover1 16:24128dedf8db 154 // break;
rgrover1 16:24128dedf8db 155 // case APP_CMD_PTF_GETPOS:
rgrover1 16:24128dedf8db 156 // CSR_APP_LOG_INFO("lpm get pos.\r\n");
rgrover1 16:24128dedf8db 157 // sAppCmd = APP_CMD_IDLE;
rgrover1 16:24128dedf8db 158 // pCsrLoc->CsrLocLpmGetPos();
rgrover1 16:24128dedf8db 159 // break;
rgrover1 16:24128dedf8db 160 case APP_CMD_PM_FULL:
rgrover1 15:495c22f32cc6 161 sAppCmd = APP_CMD_IDLE;
rgrover1 16:24128dedf8db 162 gps.setPowerMode(GPSProvider::POWER_FULL);
rgrover1 15:495c22f32cc6 163 CSR_APP_LOG_INFO("fpm set.\r\n");
rgrover1 15:495c22f32cc6 164 break;
rgrover1 15:495c22f32cc6 165 case APP_CMD_PM_PTF:
rgrover1 16:24128dedf8db 166 sAppCmd = APP_CMD_IDLE;
rgrover1 16:24128dedf8db 167 gps.setPowerMode(GPSProvider::POWER_LOW);
rgrover1 15:495c22f32cc6 168 CSR_APP_LOG_INFO("lpm ptf set.\r\n");
rgrover1 15:495c22f32cc6 169 break;
zhjcpi 0:789f6b6f710d 170 }
zhjcpi 0:789f6b6f710d 171 }
zhjcpi 0:789f6b6f710d 172 }
zhjcpi 0:789f6b6f710d 173
zhjcpi 0:789f6b6f710d 174 static void _AppShowCmd(void)
zhjcpi 0:789f6b6f710d 175 {
zhjcpi 3:7a3ed8ae071d 176 CSR_APP_LOG_INFO("Location commands:\r\n");
zhjcpi 3:7a3ed8ae071d 177 CSR_APP_LOG_INFO(" help - help to show supported commands\r\n");
zhjcpi 3:7a3ed8ae071d 178 CSR_APP_LOG_INFO(" start - begin location\r\n");
zhjcpi 3:7a3ed8ae071d 179 CSR_APP_LOG_INFO(" stop - end location\r\n");
zhjcpi 3:7a3ed8ae071d 180 CSR_APP_LOG_INFO(" fpm - full power mode\r\n");
zhjcpi 3:7a3ed8ae071d 181 CSR_APP_LOG_INFO(" ptf - ptf low power mode\r\n");
zhjcpi 3:7a3ed8ae071d 182 CSR_APP_LOG_INFO(" getpos - get location immediately in low power ptf mode\r\n");
zhjcpi 0:789f6b6f710d 183 }
zhjcpi 0:789f6b6f710d 184
zhjcpi 9:87d1555b6219 185 static void _AppBtnPushed(void)
zhjcpi 9:87d1555b6219 186 {
rgrover1 15:495c22f32cc6 187 sAppCmd = APP_CMD_PTF_GETPOS;
rgrover1 15:495c22f32cc6 188 // sLedLocOn = !sLedLocOn;
zhjcpi 9:87d1555b6219 189 }
zhjcpi 9:87d1555b6219 190
zhjcpi 0:789f6b6f710d 191 static void _ConsoleRxHandler(void)
zhjcpi 0:789f6b6f710d 192 {
rgrover1 15:495c22f32cc6 193 static char cmd[32] = {0};
rgrover1 15:495c22f32cc6 194 char ch;
zhjcpi 0:789f6b6f710d 195
zhjcpi 0:789f6b6f710d 196 ch = sSerialDebug.getc();
zhjcpi 0:789f6b6f710d 197 sSerialDebug.putc(ch);
rgrover1 15:495c22f32cc6 198 if (ch == '\r') {
zhjcpi 0:789f6b6f710d 199 sSerialDebug.putc('\n');
rgrover1 15:495c22f32cc6 200 if (strlen(cmd) > 0) {
rgrover1 15:495c22f32cc6 201 _AppCmdProcess(cmd);
rgrover1 15:495c22f32cc6 202 memset(cmd, 0, sizeof(cmd));
zhjcpi 0:789f6b6f710d 203 }
rgrover1 15:495c22f32cc6 204 } else {
rgrover1 15:495c22f32cc6 205 cmd[strlen(cmd)] = ch;
rgrover1 15:495c22f32cc6 206 }
zhjcpi 0:789f6b6f710d 207 }
rgrover1 15:495c22f32cc6 208
zhjcpi 0:789f6b6f710d 209 static void _AppCmdProcess(char *pCmd)
zhjcpi 0:789f6b6f710d 210 {
rgrover1 15:495c22f32cc6 211 if (strcmp(pCmd, "help") == 0) {
zhjcpi 0:789f6b6f710d 212 sAppCmd = APP_CMD_HELP;
rgrover1 15:495c22f32cc6 213 } else if (strcmp(pCmd, "start") == 0) {
zhjcpi 0:789f6b6f710d 214 sAppCmd = APP_CMD_START;
rgrover1 15:495c22f32cc6 215 } else if (strcmp(pCmd, "stop") == 0) {
zhjcpi 0:789f6b6f710d 216 sAppCmd = APP_CMD_STOP;
rgrover1 15:495c22f32cc6 217 } else if (strcmp(pCmd, "fpm") == 0) {
zhjcpi 0:789f6b6f710d 218 sAppCmd = APP_CMD_PM_FULL;
rgrover1 15:495c22f32cc6 219 } else if (strcmp(pCmd, "ptf") == 0) {
zhjcpi 0:789f6b6f710d 220 sAppCmd = APP_CMD_PM_PTF;
rgrover1 15:495c22f32cc6 221 } else if (strcmp(pCmd, "getpos") == 0) {
zhjcpi 0:789f6b6f710d 222 sAppCmd = APP_CMD_PTF_GETPOS;
rgrover1 16:24128dedf8db 223 // } else if (strcmp(pCmd, "onoffon") == 0) {
rgrover1 16:24128dedf8db 224 // sAppCmd = APP_CMD_ONOFF_ON;
rgrover1 16:24128dedf8db 225 // } else if (strcmp(pCmd, "onoffoff") == 0) {
rgrover1 16:24128dedf8db 226 // sAppCmd = APP_CMD_ONOFF_OFF;
rgrover1 16:24128dedf8db 227 } else if (strcmp(pCmd, "reset") == 0) {
rgrover1 16:24128dedf8db 228 sAppCmd = APP_CMD_RESET;
rgrover1 16:24128dedf8db 229 // } else if (strcmp(pCmd, "pinteston") == 0) {
rgrover1 16:24128dedf8db 230 // sAppCmd = APP_CMD_PINTEST_ON;
rgrover1 16:24128dedf8db 231 // } else if (strcmp(pCmd, "pintestoff") == 0) {
rgrover1 16:24128dedf8db 232 // sAppCmd = APP_CMD_PINTEST_OFF;
rgrover1 16:24128dedf8db 233 // } else if (strcmp(pCmd, "pintestoffon") == 0) {
rgrover1 16:24128dedf8db 234 // sAppCmd = APP_CMD_PINTEST_OFF_ON;
rgrover1 16:24128dedf8db 235 // } else if (strcmp(pCmd, "iswakeup") == 0) {
rgrover1 16:24128dedf8db 236 // sAppCmd = APP_CMD_WAKEUP_STATUS;
rgrover1 15:495c22f32cc6 237 } else {
zhjcpi 3:7a3ed8ae071d 238 CSR_APP_LOG_INFO("\r\nUnknown command %s\r\n", pCmd);
zhjcpi 0:789f6b6f710d 239 }
rgrover1 15:495c22f32cc6 240
rgrover1 15:495c22f32cc6 241 CSR_APP_LOG_INFO("\r\n");
zhjcpi 0:789f6b6f710d 242 }