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

Dependencies:   CsrLocation mbed GPSProvider

Fork of CsrLocationDemo by Qualcomm Technologies International, Ltd.

Revision:
0:789f6b6f710d
Child:
1:e6c96c984e2b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CsrLocationDemo.cpp	Mon Mar 24 08:26:27 2014 +0000
@@ -0,0 +1,325 @@
+
+/* CsrLocation class for mbed Microcontroller
+ * Copyright 2014 CSR plc
+ */
+
+
+#include "mbed.h"
+#include "CsrLocation.h"
+
+/* appliation commands */
+typedef enum AppCmd
+{
+    APP_CMD_IDLE, 			// No special command
+    APP_CMD_HELP,			// Show the supported commands
+    APP_CMD_START,			// Start location
+    APP_CMD_STOP,			// Stop location
+    APP_CMD_PM_FULL,		// Set full power mode
+    APP_CMD_PM_PTF,			// Set low power PTF mode
+    APP_CMD_PTF_GETPOS,		// Get location immediately in low power PTF mode
+    APP_CMD_START_FAILED,	// Process start failed case
+    APP_CMD_STOP_FAILED,	// Process stop failed case
+    APP_CMD_NMEA,			// Debug command, switch chip to NMEA protocol at 4800bps
+    APP_CMD_ONOFF_ON,		// Debug command, pull onoff pin high level
+    APP_CMD_ONOFF_OFF,      // Debug command, pull onoff pin low level
+    APP_CMD_RESET_ON,       // Debug command, pull reset pin high level
+    APP_CMD_RESET_OFF       // Debug command, pull reset pin low level
+}eAppCmd;
+
+
+static void _AppShowCmd(void);
+static void _AppOutputCallback(CsrUint32  msgId, void * const pMsgData, CsrUint32 msgLength);
+static void _AppEventCallback(eCsrLocEventType event, CsrUint32 data);
+static void _ConsoleRxHandler(void);
+static void _AppCmdProcess(char *pCmd);
+
+
+static int sAppCmd  = APP_CMD_IDLE;
+ePowerMode sPwrMode = PWR_FULL;
+
+
+static Serial			sSerialDebug(USBTX, USBRX);
+static Serial			sSerialLoc(p9, p10);;
+static DigitalOut		sPinOnoff(p5);
+static DigitalOut		sPinReset(p6);
+static DigitalOut		sLedLocOn(LED1);
+static DigitalOut		sLedPosReport(LED2);
+
+
+int main(void)
+{
+    CsrLocation  *pCsrLoc;
+	tCsrLocConfig locConfig;
+
+	/* initialize the debug serial port */
+    sSerialDebug.baud(115200);
+    sSerialDebug.attach(&_ConsoleRxHandler);
+
+	/* initialize the CsrLocConfig */
+	locConfig.pSerialDebug 	= &sSerialDebug;
+	locConfig.pSerialLoc 	= &sSerialLoc;
+	locConfig.pPinOnoff 	= &sPinOnoff;
+	locConfig.pPinReset 	= &sPinReset;
+
+	/* new the CsrLocation instance */
+    pCsrLoc = new CsrLocation(&locConfig);
+    if(pCsrLoc == NULL)
+    {
+        sSerialDebug.printf("Failed to new csrLocation.\r\n");
+        sSerialDebug.attach(NULL);
+        return -1;
+    }
+
+    /* Register output callback and event callback functions */
+    pCsrLoc->CsrLocRegOutput(_AppOutputCallback, _AppEventCallback);
+
+    sSerialDebug.printf("mbed initialized OK.\r\n");
+    _AppShowCmd();
+
+    while(1)
+    {
+        switch(sAppCmd)
+        {
+        case APP_CMD_HELP:
+            sAppCmd = APP_CMD_IDLE;
+            _AppShowCmd();
+            break;
+        case APP_CMD_START:
+            sAppCmd = APP_CMD_IDLE;
+            sSerialDebug.printf("start location.\r\n");
+            sLedLocOn = 1;
+            pCsrLoc->CsrLocStart(sPwrMode);
+            break;
+        case APP_CMD_STOP:
+            sAppCmd = APP_CMD_IDLE;
+            sSerialDebug.printf("stop location.\r\n");
+            sLedLocOn = 0;
+            pCsrLoc->CsrLocStop();
+            break;
+        case APP_CMD_START_FAILED:
+            sAppCmd = APP_CMD_IDLE;
+            sSerialDebug.printf("reset as start failed.\r\n");
+            sLedLocOn = 0;
+            pCsrLoc->CsrLocStop();
+            pCsrLoc->CsrLocReset();
+            break;
+        case APP_CMD_STOP_FAILED:
+            sAppCmd = APP_CMD_IDLE;
+            sSerialDebug.printf("reset as stop failed.\r\n");
+            sLedLocOn = 0;
+            pCsrLoc->CsrLocStop();
+            pCsrLoc->CsrLocReset();
+            break;
+        case APP_CMD_IDLE:
+            pCsrLoc->CsrLocUpdate();
+            break;
+        case APP_CMD_ONOFF_ON:
+            sSerialDebug.printf("onoff on.\r\n");
+            sAppCmd = APP_CMD_IDLE;
+            sPinOnoff = 1;
+            break;
+        case APP_CMD_ONOFF_OFF:
+            sSerialDebug.printf("onoff off.\r\n");
+            sAppCmd = APP_CMD_IDLE;
+            sPinOnoff = 0;
+            break;
+        case APP_CMD_RESET_ON:
+            sSerialDebug.printf("reset on.\r\n");
+            sAppCmd = APP_CMD_IDLE;
+            sPinReset = 1;
+            break;
+        case APP_CMD_RESET_OFF:
+            sSerialDebug.printf("reset off.\r\n");
+            sAppCmd = APP_CMD_IDLE;
+            sPinReset = 0;
+            break;
+        case APP_CMD_PTF_GETPOS:
+            sSerialDebug.printf("lpm get pos.\r\n");
+            sAppCmd = APP_CMD_IDLE;
+            pCsrLoc->CsrLocLpmGetPos();
+            break;
+        case APP_CMD_NMEA:
+            sSerialDebug.printf("switch to nmea.\r\n");
+            sAppCmd = APP_CMD_IDLE;
+            pCsrLoc->CsrLocDebugSwitch2Nmea();
+            break;
+        case APP_CMD_PM_FULL:
+            sSerialDebug.printf("fpm set.\r\n");
+            sAppCmd = APP_CMD_IDLE;
+            sPwrMode = PWR_FULL;
+            break;
+        case APP_CMD_PM_PTF:
+            sSerialDebug.printf("lpm ptf set.\r\n");
+            sAppCmd = APP_CMD_IDLE;
+            sPwrMode = PWR_PTF;
+            break;
+        }
+    }
+    delete pCsrLoc;
+}
+
+static void _AppShowCmd(void)
+{
+    sSerialDebug.printf("Location commands:\r\n");
+    sSerialDebug.printf("    help     - help to show supported commands\r\n");
+    sSerialDebug.printf("    start    - begin location\r\n");
+    sSerialDebug.printf("    stop     - end location\r\n");
+    sSerialDebug.printf("    fpm      - full power mode\r\n");
+    sSerialDebug.printf("    ptf      - ptf low power mode\r\n");
+    sSerialDebug.printf("    getpos   - get location immediately in low power ptf mode\r\n");
+    
+}
+
+static void _AppOutputCallback(CsrUint32  msgId, void * const pMsgData, CsrUint32 msgLength)
+{
+    switch(msgId)
+    {
+    case LOC_OUTPUT_LOCATION:
+    {
+        tLocPosResp *pPosRsp = (tLocPosResp *)pMsgData;
+        sSerialDebug.printf("Loc: lat=%f, lon=%f, alt=%f\r\n", pPosRsp->lat, pPosRsp->lon, pPosRsp->alt);
+        sLedPosReport = !sLedPosReport;
+        break;
+    }
+    case LOC_OUTPUT_SV_STATUS:
+    {
+        tLocSvStatus *pSvStatus = (tLocSvStatus *)pMsgData;
+        sSerialDebug.printf("SV:week=%u, tow=%lu, GPS Num=%u, GLO Num=%u, GPS Mask=0x%lx, GLO Mask=0x%lx\r\n", 
+                pSvStatus->gps_week, pSvStatus->tow, pSvStatus->numOfSVs, pSvStatus->numOfGloSVs, 
+                pSvStatus->svUsedInFixMask, pSvStatus->gloSvUsedInFixMask);
+        break;
+    }
+
+    default :
+        break;
+    }   
+}
+
+static void _AppEventCallback(eCsrLocEventType event, CsrUint32 data)
+{
+    switch(event)
+    {
+    case CSR_LOC_EVENT_START_RESULT:
+        if(data != 0)
+        {
+            sSerialDebug.printf("start failed.\r\n");
+            sAppCmd = APP_CMD_START_FAILED;
+        }
+        else
+        {
+            sSerialDebug.printf("start OK.\r\n");
+        }
+        break;
+    case CSR_LOC_EVENT_STOP_RESULT:
+        if(data != 0)
+        {
+            sSerialDebug.printf("stop failed.\r\n");
+            sAppCmd = APP_CMD_STOP_FAILED;
+        }
+        else
+        {
+            sSerialDebug.printf("stop OK.\r\n");
+        }
+        break;
+    default:
+        break;
+    }
+}
+
+static void _ConsoleRxHandler(void)
+{
+	static char cmd[32] = {0};
+    char ch;
+
+    ch = sSerialDebug.getc();
+    sSerialDebug.putc(ch);
+	if(ch == '\r')
+	{
+        sSerialDebug.putc('\n');
+        if(strlen(cmd) > 0)
+        {
+	        _AppCmdProcess(cmd);
+	        memset(cmd, 0, sizeof(cmd));
+        }
+	}
+	else
+	{
+		cmd[strlen(cmd)] = ch;
+	}
+}
+	
+static void _AppCmdProcess(char *pCmd)
+{
+	if(strcmp(pCmd, "help") == 0)
+    {
+        sAppCmd = APP_CMD_HELP;
+        sSerialDebug.putc('\r');
+        sSerialDebug.putc('\n');
+    }
+    else if(strcmp(pCmd, "start") == 0)
+    {
+        sAppCmd = APP_CMD_START;
+        sSerialDebug.putc('\r');
+        sSerialDebug.putc('\n');
+    }
+    else if(strcmp(pCmd, "stop") == 0)
+    {
+        sAppCmd = APP_CMD_STOP;
+        sSerialDebug.putc('\r');
+        sSerialDebug.putc('\n');
+    }
+    else if(strcmp(pCmd, "fpm") == 0)
+    {
+        sAppCmd = APP_CMD_PM_FULL;
+        sSerialDebug.putc('\r');
+        sSerialDebug.putc('\n');
+    }
+    else if(strcmp(pCmd, "ptf") == 0)
+    {
+        sAppCmd = APP_CMD_PM_PTF;
+        sSerialDebug.putc('\r');
+        sSerialDebug.putc('\n');
+    }
+    else if(strcmp(pCmd, "getpos") == 0)
+    {
+        sAppCmd = APP_CMD_PTF_GETPOS;
+        sSerialDebug.putc('\r');
+        sSerialDebug.putc('\n');
+    }
+    else if(strcmp(pCmd, "nmea") == 0)
+    {
+        sAppCmd = APP_CMD_NMEA;
+        sSerialDebug.putc('\r');
+        sSerialDebug.putc('\n');
+    }
+    else if(strcmp(pCmd, "onoffon") == 0)
+    {
+        sAppCmd = APP_CMD_ONOFF_ON;
+        sSerialDebug.putc('\r');
+        sSerialDebug.putc('\n');
+    }
+    else if(strcmp(pCmd, "onoffoff") == 0)
+    {
+        sAppCmd = APP_CMD_ONOFF_OFF;
+        sSerialDebug.putc('\r');
+        sSerialDebug.putc('\n');
+    }
+    else if(strcmp(pCmd, "reseton") == 0)
+    {
+        sAppCmd = APP_CMD_RESET_ON;
+        sSerialDebug.putc('\r');
+        sSerialDebug.putc('\n');
+    }
+    else if(strcmp(pCmd, "resetoff") == 0)
+    {
+        sAppCmd = APP_CMD_RESET_OFF;
+        sSerialDebug.putc('\r');
+        sSerialDebug.putc('\n');
+    }
+    else
+    {
+        sSerialDebug.putc('\r');
+        sSerialDebug.putc('\n');
+        sSerialDebug.printf("Unknown command %s\r\n", pCmd);
+    }
+}