mbed 5.4 with sleep mode

Dependencies:  

main.cpp

Committer:
mazgch
Date:
2014-05-14
Revision:
17:c293780a40ac
Parent:
16:43f6de7bc38b
Child:
18:50e6c4ed8a4a

File content as of revision 17:c293780a40ac:

#include "mbed.h"
#include "GPS.h"
#include "MDM.h"

//----------------------------------------------------------------------
// You may need to configure these parameters

/** Set your secret SIM pin here "1234"
*/
#define SIMPIN      NULL

/** The APN of your network operator, sometimes it is "internet" 
    check your contract with the network operator
*/
#define APN         "gprs.swisscom.ch"

/** Set the user name for your APN, or NULL if not needed
*/
#define USERNAME    NULL

/** Set the password for your APN, or NULL if not needed
*/
#define PASSWORD    NULL 

//----------------------------------------------------------------------
/* This example was tested on C027-U20 and C027-G35 with the on board modem. 
   
   Additionally it was tested with a shield where the SARA-G350 RX/TX/PWRON 
   is connected to D0/D1/D4 and the GPS SCL/SDA is connected D15/D15. In this 
   configuration the following platforms were tested (it is likely that others 
   will work as well)
   - U-BLOX:    C027-XX.
   - NXP:       LPC1549v2 
   - Freescale: FRDM-KL25Z, FRDM-KL46Z
   - STM:       NUCLEO-F401RE, NUCLEO-F030R8
*/
#if defined(TARGET_UBLOX_C027)
  #define C027_USEONBOARD // remove this if you have the GSM/GPS shield mounted
#endif

#ifdef C027_USEONBOARD
  #include "C027.h"
  C027 c027;
#elif TARGET_LPC4088
  // mapping for use with the EA QSB base board
  #define GPSSCL    p20
  #define GPSSDA    p19
  #define GPSADR   (66<<1) // GPS I2C Address
  #define MDMPWRON  p33
  #define MDMTXD    p9
  #define MDMRXD    p10
  #define MDMCTS    NC
  #define MDMRTS    NC
  #define MDMBAUD   115200
#else
  #define GPSSCL    D15
  #define GPSSDA    D14
  #define GPSADR   (66<<1) // GPS I2C Address
  #define MDMPWRON  D4
  #define MDMTXD    D1
  #define MDMRXD    D0
  #define MDMCTS    NC
  #define MDMRTS    NC
  #define MDMBAUD   115200
#endif

// no tracing if serial is shared with the VCP
#define DOTRACE ((USBRX!=MDMRXD)&&(USBTX!=MDMTXD))
#define TRACE     (!DOTRACE)?:printf

int main(void)
{
    int ret;
#ifdef TARGET_LPC1768
    char buf[2048] = "";
#else
    char buf[512] = "";
#endif

    // only trace if the serial is different from our modem port
    if (DOTRACE) {
        Serial pc(USBTX,USBRX);
        pc.baud(115200);
    }
    
    wait_ms(1000);
    
    TRACE("GSM/GPS Support Example\r\n");
    
#ifdef C027_USEONBOARD
    // turn on the supplies of the Modem and the GPS
    c027.mdmPower(true);
    c027.gpsPower(true);
#else
    // turn on the Modem
    DigitalOut mdmPwrOn(MDMPWRON, 0);
    wait_ms(150);
    mdmPwrOn = 1;
#endif
    wait(2);
    
    // Create the GPS object
#if GPSADR    // use GPSI2C class
    GPSI2C gps(GPSSDA,GPSSCL,GPSADR); 
#elif GPSBAUD // or GPSSerial class 
    GPSSerial gps(GPSTXD,GPSRXD,GPSBAUD); 
#else
    #warning "please define the pins for the GPS"
#endif
    
    // Create the modem object
    MDMSerial mdm(MDMTXD,MDMRXD,MDMBAUD
#if DEVICE_SERIAL_FC
                ,MDMRTS,MDMCTS
#endif
                );
    
    // initialize the modem 
    TRACE("Device Init\r\n");
    MDMParser::DevStatus devStatus;
    MDMParser::NetStatus netStatus;
    bool mdmOk = mdm.init(SIMPIN, &devStatus);
    if (mdmOk)
    {
        if (DOTRACE) mdm.dumpDevStatus(&devStatus);
        
        // wait until we are connected
        TRACE("Network Check\r\n");
        while (!mdm.checkNetStatus(&netStatus))
            wait_ms(1000);
    
        if (DOTRACE) mdm.dumpNetStatus(&netStatus);
        TRACE("Network Join\r\n");
        // join the internet connection 
        MDMParser::IP ip = 
            mdm.join(APN,USERNAME,PASSWORD);
        if (ip != NOIP)
        {
            if (DOTRACE) mdm.dumpIp(ip);
            TRACE("Socket Create\r\n");
            int socket = mdm.socketSocket(MDMParser::IPPROTO_TCP);
            if (socket >= 0)
            {
                TRACE("Socket Connect\r\n");
                mdm.socketSetBlocking(socket, 10000);
                if (mdm.socketConnect(socket, "mbed.org", 80))
                {
                    TRACE("Make a Http Post Request\r\n");
                    const char http[] = "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\r\n\r\n";
                    TRACE("Socket Send\r\n");
                    mdm.socketSend(socket, http, sizeof(http)-1);
                
                    TRACE("Socket Recving\r\n");
                    while (true) {
                        ret = mdm.socketReadable(socket);
                        if (ret > 0)
                            ret = mdm.socketRecv(socket, buf, sizeof(buf)-1);
                        if (ret < 0)
                            break;
                        else if (ret > 0)
                            TRACE("Socket Recv \"%*s\"\r\n", ret, buf);
                    }
                    TRACE("Socket Close\r\n");
                    mdm.socketClose(socket);
                }
                TRACE("Socket Free\r\n");
                mdm.socketFree(socket);
            }
            
            int port = 7;
            const char* host = "echo.u-blox.com";
            MDMParser::IP ip = mdm.gethostbyname(host);
            char data[] = "\r\nxxx Socket Hello World\r\n"
#ifdef TARGET_LPC1768
                        "00  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "01  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "02  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "03  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "04  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        
                        "05  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "06  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "07  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "08  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "09  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
            
                        "10  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "11  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "12  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "13  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "14  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        
                        "15  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "16  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "17  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "18  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "19  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
#endif            
                        "End\r\n";
                
            TRACE("Testing TCP sockets with ECHO server\r\n");
            socket = mdm.socketSocket(MDMParser::IPPROTO_TCP);
            if (socket >= 0)
            {
                mdm.socketSetBlocking(socket, 10000);
                if (mdm.socketConnect(socket, host, port)) {
                    memcpy(data, "\r\nTCP", 5); 
                    ret = mdm.socketSend(socket, data, sizeof(data)-1);
                    if (ret == sizeof(data)-1) {
                        TRACE("Socket Send %d \"%s\"\r\n", ret, data);
                    }
                    ret = mdm.socketRecv(socket, buf, sizeof(buf)-1);
                    if (ret >= 0) {
                        TRACE("Socket Recv %d \"%.*s\"\r\n", ret, ret, buf);
                    }
                    mdm.socketClose(socket);
                }
                mdm.socketFree(socket);
            }

            TRACE("Testing UDP sockets with ECHO server\r\n");
            socket = mdm.socketSocket(MDMParser::IPPROTO_UDP, port);
            if (socket >= 0)
            {
                mdm.socketSetBlocking(socket, 10000);
                memcpy(data, "\r\nUDP", 5); 
                ret = mdm.socketSendTo(socket, ip, port, data, sizeof(data)-1);
                if (ret == sizeof(data)-1) {
                    TRACE("Socket SendTo %s:%d " IPSTR " %d \"%s\"\r\n", host, port, IPNUM(ip), ret, data);
                }
                ret = mdm.socketRecvFrom(socket, &ip, &port, buf, sizeof(buf)-1);
                if (ret >= 0) {
                    TRACE("Socket RecvFrom " IPSTR ":%d %d \"%.*s\" \r\n", IPNUM(ip),port, ret, ret,buf);
                }
                mdm.socketFree(socket);
            }
            
            // disconnect  
            TRACE("Network Disconnect\r\n");
            mdm.disconnect();
        }
        
        const char* ussd = "*#134#"; // You may get answer "UNKNOWN APPLICATION"
        TRACE("Send Ussd Command %s\r\n", ussd);
        ret = mdm.ussdCommand(ussd, buf);
        if (ret > 0) 
            TRACE("Got Ussd Answer: \"%*s\"\r\n", ret, buf);
    }
    TRACE("Checking SMS and GPS\r\n");
    char link[128] = "";
    unsigned int i = 0xFFFFFFFF;
    const int wait = 100;
    bool abort = false;
    //DigitalOut led(LED1);
    while (!abort) {
    //    led = !led;        
        while ((ret = gps.getMessage(buf, sizeof(buf))) > 0)
        {
            int len = LENGTH(ret);
            //TRACE("NMEA: %.*s\r\n", len-2, msg); 
            if ((PROTOCOL(ret) == GPSParser::NMEA) && (len > 6) && !strncmp("$GPGLL", buf, 6))
            {
                double la = 0, lo = 0;
                char ch;
                if (gps.getNmeaAngle(1,buf,len,la) && 
                    gps.getNmeaAngle(3,buf,len,lo) && 
                    gps.getNmeaItem(6,buf,len,ch) && ch == 'A')
                {
                    TRACE("GPS Location: %.5f %.5f\r\n", la, lo); 
                    sprintf(link, "I am here!\n"
                                  "https://maps.google.com/?q=%.5f,%.5f", la, lo); 
                }
            }
        }
        if (mdmOk && (i++ == 10000/wait)) {
            i = 0;
            // check the network status
            if (mdm.checkNetStatus(&netStatus)) {
                if (DOTRACE) mdm.dumpNetStatus(&netStatus);
            }
                
            // checking unread sms
            int ix[8];
            int n = mdm.smsList("REC UNREAD", ix, 8);
            if (8 < n) n = 8;
            while (0 < n--)
            {
                char num[32];
                TRACE("Unread SMS at index %d\r\n", ix[n]);
                if (mdm.smsRead(ix[n], num, buf, sizeof(buf))) {
                    TRACE("Got SMS from \"%s\" with text \"%s\"\r\n", num, buf);
                    TRACE("Delete SMS at index %d\r\n", ix[n]);
                    mdm.smsDelete(ix[n]);
                    // provide a reply
                    const char* reply = "Hello my friend";
                    if (strstr(buf, /*w*/"here are you"))
                        reply = *link ? link : "I don't know"; // reply wil location link
                    TRACE("Send SMS reply \"%s\" to \"%s\"\r\n", reply, num);
                    mdm.smsSend(num, reply);
                }
            }
        }
        wait_ms(wait);
    }
    mdm.powerOff();
    gps.powerOff();
    TRACE("Shutdown\r\n");
#ifdef C027_USEONBOARD
    // now it is safe to switch LDOs off
    c027.mdmPower(false);
    c027.gpsPower(false);
#endif    
    return 0;
}