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

Dependencies:   CsrLocation mbed GPSProvider

Fork of CsrLocationDemo by jie zhao

CsrLocationDemo.cpp

Committer:
rgrover1
Date:
2014-10-30
Revision:
16:24128dedf8db
Parent:
15:495c22f32cc6
Child:
17:ebf95368b2d8

File content as of revision 16:24128dedf8db:

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

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

#ifdef TARGET_LPC1768
    #define PINMAP_GPIO_BTN  D6
    #define PINMAP_GPIO_TEST D10
    #define LOC_LED1         LED1
    #define LOC_LED2         LED2
#elif defined(TARGET_LPC1549) || defined(TARGET_NUCLEO_F103RB)
    #define PINMAP_GPIO_BTN  D5
    #define PINMAP_GPIO_TEST D10
    #define LOC_LED1         D7
    #define LOC_LED2         D6
#endif // ifdef TARGET_LPC1768

#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,           // proto mode is NMEA
    APP_CMD_OSP,            // proto mode is OSP
    APP_CMD_SWITCH_NMEA,    // Debug command, switch chip to NMEA protocol at 4800bps
    APP_CMD_SWITCH_OSP,     // Debug command, switch chip to NMEA protocol at 4800bps
    APP_CMD_START_FAILED,   // Process start failed case
    APP_CMD_STOP_FAILED,    // Process stop failed case
    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,          // Debug command, pull reset pin high level
    APP_CMD_WAKEUP_STATUS,  // Debug command, check wakeup pin status
    APP_CMD_PINTEST_ON,     // Debug command, pull test pin high level
    APP_CMD_PINTEST_OFF,    // Debug command, pull test pin low level
    APP_CMD_PINTEST_OFF_ON  // 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);

DBG_SERIAL_TYPE    sSerialDebug(USBTX, USBRX);

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();
    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:
                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_START_FAILED:
            //     sAppCmd = APP_CMD_IDLE;
            //     CSR_APP_LOG_INFO("reset as start failed.\r\n");
            //     sLedLocOn = 0;
            //     pCsrLoc->CsrLocStop();
            //     pCsrLoc->reset();
            //     break;
            // case APP_CMD_STOP_FAILED:
            //     sAppCmd = APP_CMD_IDLE;
            //     CSR_APP_LOG_INFO("reset as stop failed.\r\n");
            //     sLedLocOn = 0;
            //     pCsrLoc->CsrLocStop();
            //     pCsrLoc->reset();
            //     break;
            case APP_CMD_RESET:
                sAppCmd   = APP_CMD_IDLE;
                gps.reset();
                // sPinReset = 1;
                CSR_APP_LOG_INFO("reset on.\r\n");
                break;
            // case APP_CMD_RESET_OFF:
            //     CSR_APP_LOG_INFO("reset off.\r\n");
            //     sAppCmd   = APP_CMD_IDLE;
            //     sPinReset = 0;
            //     break;
            // case APP_CMD_PINTEST_ON:
            //     CSR_APP_LOG_INFO("test pin on.\r\n");
            //     sAppCmd  = APP_CMD_IDLE;
            //     sPinTest = 1;
            //     break;
            // case APP_CMD_PINTEST_OFF:
            //     CSR_APP_LOG_INFO("test pin off.\r\n");
            //     sAppCmd  = APP_CMD_IDLE;
            //     sPinTest = 0;
            //     break;
            // case APP_CMD_PINTEST_OFF_ON:
            //     CSR_APP_LOG_INFO("test pin off and high.\r\n");
            //     sAppCmd  = APP_CMD_IDLE;
            //     sPinTest = 0;
            //     wait_ms(100);
            //     sPinTest = 1;
            //     break;
            // case APP_CMD_WAKEUP_STATUS:
            //     CSR_APP_LOG_INFO("wakeup status : %d.\r\n", sWakeup.read());
            //     sAppCmd = APP_CMD_IDLE;
            //     break;
            // case APP_CMD_PTF_GETPOS:
            //     CSR_APP_LOG_INFO("lpm get pos.\r\n");
            //     sAppCmd = APP_CMD_IDLE;
            //     pCsrLoc->CsrLocLpmGetPos();
            //     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;
        }
    }
}

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");
}

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, "onoffon") == 0) {
    //     sAppCmd = APP_CMD_ONOFF_ON;
    // } else if (strcmp(pCmd, "onoffoff") == 0) {
    //     sAppCmd = APP_CMD_ONOFF_OFF;
    } else if (strcmp(pCmd, "reset") == 0) {
        sAppCmd = APP_CMD_RESET;
    // } else if (strcmp(pCmd, "pinteston") == 0) {
    //     sAppCmd = APP_CMD_PINTEST_ON;
    // } else if (strcmp(pCmd, "pintestoff") == 0) {
    //     sAppCmd = APP_CMD_PINTEST_OFF;
    // } else if (strcmp(pCmd, "pintestoffon") == 0) {
    //     sAppCmd = APP_CMD_PINTEST_OFF_ON;
    // } else if (strcmp(pCmd, "iswakeup") == 0) {
    //     sAppCmd = APP_CMD_WAKEUP_STATUS;
    } else {
        CSR_APP_LOG_INFO("\r\nUnknown command %s\r\n", pCmd);
    }

    CSR_APP_LOG_INFO("\r\n");
}