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.

CsrLocationDemo.cpp

Committer:
zhjcpi
Date:
2014-11-27
Revision:
25:ec6d97637e19
Parent:
23:fd2cbb0900fd

File content as of revision 25:ec6d97637e19:

/* CSRLocation class for mbed Microcontroller
 * Copyright 2014 CSR plc
 */

#include "mbed.h"
#include "CsrLocation.h"
#include "GPSProvider.h"

#define PINMAP_GPIO_BTN  D5
#define PINMAP_GPIO_TEST D10
#define LOC_LED1         D7
#define LOC_LED2         D6

#define APP_DBG_PORT_BAUD       115200
#define CSR_APP_LOG_INFO(...)   sSerialDebug.printf(__VA_ARGS__)

/* 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_NMEA,           // protocol mode is NMEA
    APP_CMD_OSP,            // protocol mode is OSP
    APP_CMD_RESET,          // Debug command, pull reset pin high level
    APP_CMD_WAKEUP_STATUS,  // Debug command, check wakeup pin status
    APP_CMD_ONOFF_ON,       // Debug command, pull onoff pin high level
    APP_CMD_ONOFF_OFF,      // Debug command, pull onoff pin low level
    APP_CMD_ONOFF_PULSE,    // Debug command, pull onoff pin high level and then low level
    APP_CMD_RESET_ON,       // Debug command, pull reset pin high level
    APP_CMD_RESET_OFF,      // Debug command, pull reset pin low level
    APP_CMD_TEST_ON,        // Debug command, pull test pin high level
    APP_CMD_TEST_OFF,       // Debug command, pull test pin low level
    APP_CMD_TEST_PULSE,     // Debug command, pull test pin low firstly, then pull high level
} eAppCmd;

static void _AppShowCmd(void);
static void _AppBtnPushed(void);
static void _ConsoleRxHandler(void);
static void _AppCmdProcess(char *pCmd);

static int         sAppCmd  = APP_CMD_IDLE;

static DigitalOut  sLedLocOn(LOC_LED1);
static DigitalOut  sLedPosReport(LOC_LED2);
static InterruptIn sBtn(PINMAP_GPIO_BTN);
static DigitalOut  sPinTest(PINMAP_GPIO_TEST);

Serial             sSerialDebug(USBTX, USBRX);

void
locationHandler(const GPSProvider::LocationUpdateParams_t *params)
{
    CSR_APP_LOG_INFO("received location update\r\n");
}

int main(void)
{
    sLedLocOn     = 0;
    sLedPosReport = 0;
    sPinTest      = 1;
    sBtn.mode(PullUp);
    sBtn.fall(&_AppBtnPushed);

    /* initialize the debug serial port */
    sSerialDebug.baud(APP_DBG_PORT_BAUD);
    sSerialDebug.attach(&_ConsoleRxHandler);

    GPSProvider gps;
    gps.setPowerMode(GPSProvider::POWER_FULL);
    gps.reset();
    gps.onLocationUpdate(locationHandler);
    CSR_APP_LOG_INFO("Success to new csrLocation.\r\n");

//    _AppShowCmd();

    while (true) {
        switch (sAppCmd) {
            case APP_CMD_HELP:
                sAppCmd = APP_CMD_IDLE;
                _AppShowCmd();
                break;
            case APP_CMD_IDLE:
                gps.process();
#if DEVICE_SLEEP
                sleep();
#endif
                break;
            case APP_CMD_START:
                sAppCmd = APP_CMD_IDLE;
                CSR_APP_LOG_INFO("start location.\r\n");
                gps.start();
                sLedLocOn = 1;
                break;
            case APP_CMD_STOP:
                sAppCmd = APP_CMD_IDLE;
                CSR_APP_LOG_INFO("stop location.\r\n");
                gps.stop();
                sLedLocOn = 0;
                break;
            case APP_CMD_RESET:
                sAppCmd   = APP_CMD_IDLE;
                gps.reset();
                CSR_APP_LOG_INFO("reset on.\r\n");
                break;
            case APP_CMD_PTF_GETPOS:
                CSR_APP_LOG_INFO("lpm get pos.\r\n");
                sAppCmd = APP_CMD_IDLE;
                gps.lpmGetImmediateLocation();
                break;
            case APP_CMD_NMEA:
                CSR_APP_LOG_INFO("select NMEA protocol.\r\n");
                gps.ioctl(CSR_IOCTL_CMD_PROTO_NMEA, NULL);
                sAppCmd = APP_CMD_IDLE;
                break;
            case APP_CMD_OSP:
                CSR_APP_LOG_INFO("select OSP protocol.\r\n");
                gps.ioctl(CSR_IOCTL_CMD_PROTO_OSP, NULL);
                sAppCmd = APP_CMD_IDLE;
                break;
            case APP_CMD_PM_FULL:
                sAppCmd  = APP_CMD_IDLE;
                gps.setPowerMode(GPSProvider::POWER_FULL);
                CSR_APP_LOG_INFO("fpm set.\r\n");
                break;
            case APP_CMD_PM_PTF:
                sAppCmd  = APP_CMD_IDLE;
                gps.setPowerMode(GPSProvider::POWER_LOW);
                CSR_APP_LOG_INFO("lpm ptf set.\r\n");
                break;
            case APP_CMD_WAKEUP_STATUS:
                gps.ioctl(CSR_IOCTL_CMD_WAKEUP_STATUS, NULL);
                sAppCmd = APP_CMD_IDLE;
                break;
            case APP_CMD_ONOFF_ON:
                gps.ioctl(CSR_IOCTL_CMD_ONOFF_ON, NULL);
                sAppCmd = APP_CMD_IDLE;
                break;
            case APP_CMD_ONOFF_OFF:
                gps.ioctl(CSR_IOCTL_CMD_ONOFF_OFF, NULL);
                sAppCmd = APP_CMD_IDLE;
                break;
            case APP_CMD_ONOFF_PULSE:
                gps.ioctl(CSR_IOCTL_CMD_ONOFF_PULSE, NULL);
                sAppCmd = APP_CMD_IDLE;
                break;
            case APP_CMD_RESET_ON:
                gps.ioctl(CSR_IOCTL_CMD_RESET_ON, NULL);
                sAppCmd = APP_CMD_IDLE;
                break;
            case APP_CMD_RESET_OFF:
                gps.ioctl(CSR_IOCTL_CMD_RESET_OFF, NULL);
                sAppCmd = APP_CMD_IDLE;
                break;
            case APP_CMD_TEST_ON:
                sPinTest = 1;
                sAppCmd = APP_CMD_IDLE;
                break;
            case APP_CMD_TEST_OFF:
                sPinTest = 0;
                sAppCmd = APP_CMD_IDLE;
                break;
            case APP_CMD_TEST_PULSE:
                sPinTest = 0;
                wait_ms(100);
                sPinTest = 1;
                sAppCmd = APP_CMD_IDLE;
                break;
        }
    }
}

static void _AppShowCmd(void)
{
    CSR_APP_LOG_INFO("Location commands:\r\n");
    CSR_APP_LOG_INFO("    help     - help to show supported commands\r\n");
    CSR_APP_LOG_INFO("    start    - begin location\r\n");
    CSR_APP_LOG_INFO("    stop     - end location\r\n");
    CSR_APP_LOG_INFO("    fpm      - full power mode\r\n");
    CSR_APP_LOG_INFO("    ptf      - ptf low power mode\r\n");
    CSR_APP_LOG_INFO("    getpos   - get location immediately in low power ptf mode\r\n");
    CSR_APP_LOG_INFO("    nmea     - NMEA mode\r\n");
    CSR_APP_LOG_INFO("    osp      - OSP mode\r\n");
    CSR_APP_LOG_INFO("    wakesta  - get chip wakeup status\r\n");
    CSR_APP_LOG_INFO("    onoffon  - pull high onoff pin\r\n");
    CSR_APP_LOG_INFO("    onoffoff - pull low onoff pin\r\n");
    CSR_APP_LOG_INFO("    onoffpul - pull onoff pin high and then low\r\n");
    CSR_APP_LOG_INFO("    reseton  - pull high reset pin\r\n");
    CSR_APP_LOG_INFO("    resetoff - pull low reset pin\r\n");
    CSR_APP_LOG_INFO("    teston   - pull high test pin\r\n");
    CSR_APP_LOG_INFO("    testoff  - pull low test pin\r\n");
    CSR_APP_LOG_INFO("    testpul  - pull test pin high and then low\r\n");
}

static void _AppBtnPushed(void)
{
    sAppCmd = APP_CMD_PTF_GETPOS;
    //	sLedLocOn = !sLedLocOn;
}

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;
    } else if (strcmp(pCmd, "start") == 0) {
        sAppCmd = APP_CMD_START;
    } else if (strcmp(pCmd, "stop") == 0) {
        sAppCmd = APP_CMD_STOP;
    } else if (strcmp(pCmd, "fpm") == 0) {
        sAppCmd = APP_CMD_PM_FULL;
    } else if (strcmp(pCmd, "ptf") == 0) {
        sAppCmd = APP_CMD_PM_PTF;
    } else if (strcmp(pCmd, "getpos") == 0) {
        sAppCmd = APP_CMD_PTF_GETPOS;
    } else if (strcmp(pCmd, "nmea") == 0) {
        sAppCmd = APP_CMD_NMEA;
    } else if (strcmp(pCmd, "osp") == 0) {
        sAppCmd = APP_CMD_OSP;
    } else if (strcmp(pCmd, "reset") == 0) {
        sAppCmd = APP_CMD_RESET;
    } else if(strcmp(pCmd, "wakesta") == 0) {
    	sAppCmd = APP_CMD_WAKEUP_STATUS;
    } else if(strcmp(pCmd, "onoffon") == 0) {
        sAppCmd = APP_CMD_ONOFF_ON;
    } else if(strcmp(pCmd, "onoffoff") == 0) {
        sAppCmd = APP_CMD_ONOFF_OFF;
    } else if(strcmp(pCmd, "onoffpul") == 0) {
        sAppCmd = APP_CMD_ONOFF_PULSE;
    } else if(strcmp(pCmd, "resetfon") == 0) {
        sAppCmd = APP_CMD_RESET_ON;
    } else if(strcmp(pCmd, "resetoff") == 0) {
        sAppCmd = APP_CMD_RESET_OFF;
    } else if(strcmp(pCmd, "teston") == 0) {
        sAppCmd = APP_CMD_TEST_ON;
    } else if(strcmp(pCmd, "testoff") == 0) {
        sAppCmd = APP_CMD_TEST_OFF;
    } else if(strcmp(pCmd, "testpul") == 0) {
        sAppCmd = APP_CMD_TEST_PULSE;
    } else {
        CSR_APP_LOG_INFO("\r\nUnknown command %s\r\n", pCmd);
    }

    CSR_APP_LOG_INFO("\r\n");
}