mbed 5.4 with sleep mode
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; }