example application with TFT display and SMS receive send

Dependencies:   C027 C027_Support SeeedStudioTFTv2 TFT_fonts UbloxUSBModem mbed

Fork of C027_DisplayTest by Michael Ammann

This is an application that combines several libraries together and demonstartes the use of cellular, GPS and a Touch enabled TFT on the u-blox C027 board. /media/uploads/mazgch/c027_display.jpg

Committer:
mazgch
Date:
Mon Oct 21 19:46:57 2013 +0000
Revision:
2:fde6fc911c61
Parent:
0:bd6ef6f73032
Child:
3:4ec009118465
version with GPS and Link monitor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mazgch 0:bd6ef6f73032 1 #include "mbed.h"
mazgch 2:fde6fc911c61 2 #include "C027.h"
mazgch 2:fde6fc911c61 3 #include "GPS.h"
mazgch 0:bd6ef6f73032 4
mazgch 2:fde6fc911c61 5 #include "SeeedStudioTFTv2.h"
mazgch 0:bd6ef6f73032 6 #include "Arial12x12.h"
mazgch 0:bd6ef6f73032 7 #include "Arial24x23.h"
mazgch 0:bd6ef6f73032 8 #include "Arial28x28.h"
mazgch 0:bd6ef6f73032 9 #include "font_big.h"
mazgch 0:bd6ef6f73032 10
mazgch 2:fde6fc911c61 11 #include "UbloxUSBGSMModem.h"
mazgch 2:fde6fc911c61 12 #include "UbloxUSBCDMAModem.h"
mazgch 2:fde6fc911c61 13 #include "UbloxGSMModem.h"
mazgch 2:fde6fc911c61 14
mazgch 2:fde6fc911c61 15 void ubxLogo(SPI_TFT_ILI9341* tft, int x0/*160*/, int y0/*160*/, int r)
mazgch 0:bd6ef6f73032 16 {
mazgch 0:bd6ef6f73032 17 int i1=r/8, i1_5=r*3/16, i2=r*2/8, i3=r*3/8,
mazgch 0:bd6ef6f73032 18 i4=r*4/8, i5=r*5/8, i6=r*6/8, i7=r*7/8;
mazgch 0:bd6ef6f73032 19 // the ball
mazgch 0:bd6ef6f73032 20 tft->fillcircle(x0, y0, r, Red);
mazgch 0:bd6ef6f73032 21 // the dot
mazgch 2:fde6fc911c61 22 tft->fillcircle(x0-i2, y0-i3, i1_5, White);
mazgch 0:bd6ef6f73032 23 // the u
mazgch 2:fde6fc911c61 24 tft->fillcircle(x0+i4, y0+i3, i3, White);
mazgch 2:fde6fc911c61 25 tft->fillcircle(x0+i4, y0+i3, i1, Red);
mazgch 2:fde6fc911c61 26 tft->fillrect( x0+i1, y0-i1, x0+i3, y0+i3, White);
mazgch 2:fde6fc911c61 27 tft->fillrect( x0+i3, y0-i1, x0+i5, y0+i3, Red);
mazgch 2:fde6fc911c61 28 tft->fillrect( x0+i5, y0-i1, x0+i7, y0+i6, White);
mazgch 0:bd6ef6f73032 29 }
mazgch 0:bd6ef6f73032 30
mazgch 2:fde6fc911c61 31 #define info(...) \
mazgch 2:fde6fc911c61 32 TFT.locate(0,5), \
mazgch 2:fde6fc911c61 33 TFT.fillrect(0,0,320,35,White), \
mazgch 2:fde6fc911c61 34 TFT.printf(__VA_ARGS__)
mazgch 2:fde6fc911c61 35
mazgch 0:bd6ef6f73032 36 void initC027(void)
mazgch 0:bd6ef6f73032 37 {
mazgch 0:bd6ef6f73032 38 DigitalOut mdmEn(MDMEN);
mazgch 0:bd6ef6f73032 39 DigitalOut mdmPwrOn(MDMPWRON);
mazgch 0:bd6ef6f73032 40 DigitalOut mdmRst(MDMRST);
mazgch 0:bd6ef6f73032 41 DigitalOut gpsEn(GPSEN);
mazgch 0:bd6ef6f73032 42 DigitalOut gpsRst(GPSRST);
mazgch 0:bd6ef6f73032 43
mazgch 0:bd6ef6f73032 44 gpsEn = 1; // LDOEN: 1=on,0=off
mazgch 0:bd6ef6f73032 45 gpsRst = 1; // RESET: 0=reset,1=operating
mazgch 0:bd6ef6f73032 46 mdmPwrOn = 1; // PWRON: 1=idle,0=action
mazgch 0:bd6ef6f73032 47 mdmEn = 1; // LDOEN: 1=on,0=off
mazgch 0:bd6ef6f73032 48 mdmRst = 0; // RESET: 0=reset,1=operating
mazgch 0:bd6ef6f73032 49 Thread::wait(100); // power on sequence is triggered by 50ms reset low and wait for supplies ready
mazgch 0:bd6ef6f73032 50 mdmRst = 1; // RESET: 1=operating,0=reset
mazgch 0:bd6ef6f73032 51 Thread::wait(3000);// modem will be ready after 3 seconds
mazgch 0:bd6ef6f73032 52 }
mazgch 2:fde6fc911c61 53
mazgch 0:bd6ef6f73032 54 int main()
mazgch 0:bd6ef6f73032 55 {
mazgch 2:fde6fc911c61 56 SeeedStudioTFTv2 TFT(A3, A1, A2, A0,
mazgch 2:fde6fc911c61 57 D11, D12, D13,
mazgch 2:fde6fc911c61 58 D5/*tft cs*/, D6/*tft dc*/, D7/*backlight*/,
mazgch 2:fde6fc911c61 59 D4/*sd cs*/);
mazgch 2:fde6fc911c61 60 TFT.setBacklight(true);
mazgch 2:fde6fc911c61 61 TFT.set_font((unsigned char*) Arial12x12); // select the font
mazgch 2:fde6fc911c61 62 TFT.set_orientation(3);
mazgch 2:fde6fc911c61 63 //TFT.calibrate(); // calibrate the touch
mazgch 0:bd6ef6f73032 64 TFT.background(White); // set background to black
mazgch 0:bd6ef6f73032 65 TFT.foreground(Black); // set chars to white
mazgch 0:bd6ef6f73032 66 TFT.cls(); // clear the screen
mazgch 2:fde6fc911c61 67 ubxLogo(&TFT, 160, 120, 80);
mazgch 0:bd6ef6f73032 68 TFT.locate(70,220);
mazgch 0:bd6ef6f73032 69 TFT.printf("u-blox C027-C20/U20/G35");
mazgch 0:bd6ef6f73032 70
mazgch 0:bd6ef6f73032 71 initC027();
mazgch 2:fde6fc911c61 72 //C027 c027;
mazgch 2:fde6fc911c61 73 //c027.mdmPower(true);
mazgch 2:fde6fc911c61 74 GPS gps;
mazgch 0:bd6ef6f73032 75 UbloxUSBGSMModem modem;
mazgch 2:fde6fc911c61 76 size_t count;
mazgch 0:bd6ef6f73032 77
mazgch 2:fde6fc911c61 78 #define MY_IMEI "+41799613242"
mazgch 2:fde6fc911c61 79 info(" Cellular Modem\n IMEI: %s", MY_IMEI);
mazgch 2:fde6fc911c61 80
mazgch 2:fde6fc911c61 81 char num[17] = "", msg[160+1] = "";
mazgch 2:fde6fc911c61 82 clock_t c = clock();
mazgch 0:bd6ef6f73032 83 while(true)
mazgch 0:bd6ef6f73032 84 {
mazgch 2:fde6fc911c61 85 clock_t n = clock();
mazgch 2:fde6fc911c61 86 if ((n - c) > CLOCKS_PER_SEC) // every 3 seconds
mazgch 0:bd6ef6f73032 87 {
mazgch 2:fde6fc911c61 88 int rssi;
mazgch 2:fde6fc911c61 89 LinkMonitor::REGISTRATION_STATE state;
mazgch 2:fde6fc911c61 90 LinkMonitor::BEARER bearer;
mazgch 2:fde6fc911c61 91 if (!modem.getLinkState(&rssi, &state, &bearer))
mazgch 0:bd6ef6f73032 92 {
mazgch 2:fde6fc911c61 93 const char* sState[] =
mazgch 2:fde6fc911c61 94 { " ",
mazgch 2:fde6fc911c61 95 "REG. ",
mazgch 2:fde6fc911c61 96 "DENIED",
mazgch 2:fde6fc911c61 97 "NO NET",
mazgch 2:fde6fc911c61 98 "HOME ",
mazgch 2:fde6fc911c61 99 "ROAM " };
mazgch 2:fde6fc911c61 100 const char* sBearer[] =
mazgch 2:fde6fc911c61 101 { " ",
mazgch 2:fde6fc911c61 102 "GSM 2G ",
mazgch 2:fde6fc911c61 103 "EDGE 2.5G",
mazgch 2:fde6fc911c61 104 "UMTS 3G ",
mazgch 2:fde6fc911c61 105 "HSPA 3G+ ",
mazgch 2:fde6fc911c61 106 "LTE 4G " };
mazgch 2:fde6fc911c61 107 TFT.locate(0,175);
mazgch 2:fde6fc911c61 108 TFT.printf(" %s\n"
mazgch 2:fde6fc911c61 109 " %s\n"
mazgch 2:fde6fc911c61 110 " %idBm ", sBearer[bearer],sState[state],rssi);
mazgch 2:fde6fc911c61 111 }
mazgch 2:fde6fc911c61 112 if((state >= LinkMonitor::REGISTRATION_STATE_HOME_NETWORK) && !modem.getSMCount(&count) && (count > 0))
mazgch 2:fde6fc911c61 113 {
mazgch 2:fde6fc911c61 114 if(!modem.getSM(num, msg, sizeof(msg)))
mazgch 2:fde6fc911c61 115 {
mazgch 2:fde6fc911c61 116 info(" From: %s\n SMS:%s", num, msg);
mazgch 2:fde6fc911c61 117 }
mazgch 2:fde6fc911c61 118 }
mazgch 2:fde6fc911c61 119 c = n;
mazgch 2:fde6fc911c61 120 }
mazgch 2:fde6fc911c61 121 point p;
mazgch 2:fde6fc911c61 122 if (TFT.getPixel(p) && (p.y < 35) && *num)
mazgch 2:fde6fc911c61 123 {
mazgch 2:fde6fc911c61 124 const char* txt = "Hello from C027 :)";
mazgch 2:fde6fc911c61 125 if (OK == modem.sendSM(num, txt))
mazgch 2:fde6fc911c61 126 {
mazgch 2:fde6fc911c61 127 info(" To: %s\n SMS:%s", num, txt);
mazgch 2:fde6fc911c61 128 *num = 0;
mazgch 0:bd6ef6f73032 129 }
mazgch 0:bd6ef6f73032 130 }
mazgch 2:fde6fc911c61 131 int ret;
mazgch 2:fde6fc911c61 132 while ((ret = gps.getGPS(msg, sizeof(msg))) > 0)
mazgch 2:fde6fc911c61 133 {
mazgch 2:fde6fc911c61 134 int len = LENGTH(ret);
mazgch 2:fde6fc911c61 135 if (PROTOCOL(ret) == NMEA && !strncmp("$GPGLL", msg, 6))
mazgch 2:fde6fc911c61 136 {
mazgch 2:fde6fc911c61 137 double la = 0, lo = 0;
mazgch 2:fde6fc911c61 138 char cLa = 0, cLo = 0, ch = 0;
mazgch 2:fde6fc911c61 139 TFT.fillrect(220,175,320,210,White);
mazgch 2:fde6fc911c61 140 if (gps.getNmeaItem(1,msg,len,la) && gps.getNmeaItem(2,msg,len,cLa) &&
mazgch 2:fde6fc911c61 141 gps.getNmeaItem(3,msg,len,lo) && gps.getNmeaItem(4,msg,len,cLo) &&
mazgch 2:fde6fc911c61 142 gps.getNmeaItem(6,msg,len,ch) && ch == 'A')
mazgch 2:fde6fc911c61 143 {
mazgch 2:fde6fc911c61 144 if (cLa == 'S') la = -la;
mazgch 2:fde6fc911c61 145 if (cLo == 'N') lo = -lo;
mazgch 2:fde6fc911c61 146 TFT.locate(220,175);
mazgch 2:fde6fc911c61 147 TFT.printf(" GPS");
mazgch 2:fde6fc911c61 148 TFT.locate(220,187);
mazgch 2:fde6fc911c61 149 TFT.printf("%11.4f ", la);
mazgch 2:fde6fc911c61 150 TFT.locate(220,199);
mazgch 2:fde6fc911c61 151 TFT.printf("%11.4f ", lo);
mazgch 2:fde6fc911c61 152 }
mazgch 2:fde6fc911c61 153 }
mazgch 2:fde6fc911c61 154 }
mazgch 0:bd6ef6f73032 155 }
mazgch 0:bd6ef6f73032 156 }