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:
Fri Oct 25 13:06:15 2013 +0000
Revision:
4:b18b0bc4142f
Parent:
3:4ec009118465
Child:
5:2d2a14f0e98d
updated gps lib

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 4:b18b0bc4142f 4 #include "SerialPipe.h"
mazgch 0:bd6ef6f73032 5
mazgch 2:fde6fc911c61 6 #include "SeeedStudioTFTv2.h"
mazgch 0:bd6ef6f73032 7 #include "Arial12x12.h"
mazgch 0:bd6ef6f73032 8 #include "Arial24x23.h"
mazgch 0:bd6ef6f73032 9 #include "Arial28x28.h"
mazgch 0:bd6ef6f73032 10 #include "font_big.h"
mazgch 0:bd6ef6f73032 11
mazgch 2:fde6fc911c61 12 #include "UbloxUSBGSMModem.h"
mazgch 2:fde6fc911c61 13 #include "UbloxUSBCDMAModem.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 int main()
mazgch 0:bd6ef6f73032 37 {
mazgch 2:fde6fc911c61 38 SeeedStudioTFTv2 TFT(A3, A1, A2, A0,
mazgch 2:fde6fc911c61 39 D11, D12, D13,
mazgch 2:fde6fc911c61 40 D5/*tft cs*/, D6/*tft dc*/, D7/*backlight*/,
mazgch 2:fde6fc911c61 41 D4/*sd cs*/);
mazgch 2:fde6fc911c61 42 TFT.setBacklight(true);
mazgch 2:fde6fc911c61 43 TFT.set_font((unsigned char*) Arial12x12); // select the font
mazgch 2:fde6fc911c61 44 TFT.set_orientation(3);
mazgch 2:fde6fc911c61 45 //TFT.calibrate(); // calibrate the touch
mazgch 0:bd6ef6f73032 46 TFT.background(White); // set background to black
mazgch 0:bd6ef6f73032 47 TFT.foreground(Black); // set chars to white
mazgch 0:bd6ef6f73032 48 TFT.cls(); // clear the screen
mazgch 2:fde6fc911c61 49 ubxLogo(&TFT, 160, 120, 80);
mazgch 0:bd6ef6f73032 50 TFT.locate(70,220);
mazgch 0:bd6ef6f73032 51 TFT.printf("u-blox C027-C20/U20/G35");
mazgch 0:bd6ef6f73032 52
mazgch 4:b18b0bc4142f 53 C027 c027;
mazgch 4:b18b0bc4142f 54 c027.mdmPower(true);
mazgch 4:b18b0bc4142f 55 c027.gpsPower(true);
mazgch 4:b18b0bc4142f 56
mazgch 4:b18b0bc4142f 57 GPSI2C gps;
mazgch 0:bd6ef6f73032 58 UbloxUSBGSMModem modem;
mazgch 2:fde6fc911c61 59 size_t count;
mazgch 0:bd6ef6f73032 60
mazgch 2:fde6fc911c61 61 #define MY_IMEI "+41799613242"
mazgch 2:fde6fc911c61 62 info(" Cellular Modem\n IMEI: %s", MY_IMEI);
mazgch 2:fde6fc911c61 63
mazgch 2:fde6fc911c61 64 char num[17] = "", msg[160+1] = "";
mazgch 2:fde6fc911c61 65 clock_t c = clock();
mazgch 0:bd6ef6f73032 66 while(true)
mazgch 0:bd6ef6f73032 67 {
mazgch 2:fde6fc911c61 68 clock_t n = clock();
mazgch 2:fde6fc911c61 69 if ((n - c) > CLOCKS_PER_SEC) // every 3 seconds
mazgch 0:bd6ef6f73032 70 {
mazgch 2:fde6fc911c61 71 int rssi;
mazgch 2:fde6fc911c61 72 LinkMonitor::REGISTRATION_STATE state;
mazgch 2:fde6fc911c61 73 LinkMonitor::BEARER bearer;
mazgch 2:fde6fc911c61 74 if (!modem.getLinkState(&rssi, &state, &bearer))
mazgch 0:bd6ef6f73032 75 {
mazgch 2:fde6fc911c61 76 const char* sState[] =
mazgch 2:fde6fc911c61 77 { " ",
mazgch 2:fde6fc911c61 78 "REG. ",
mazgch 2:fde6fc911c61 79 "DENIED",
mazgch 2:fde6fc911c61 80 "NO NET",
mazgch 2:fde6fc911c61 81 "HOME ",
mazgch 2:fde6fc911c61 82 "ROAM " };
mazgch 2:fde6fc911c61 83 const char* sBearer[] =
mazgch 2:fde6fc911c61 84 { " ",
mazgch 2:fde6fc911c61 85 "GSM 2G ",
mazgch 2:fde6fc911c61 86 "EDGE 2.5G",
mazgch 2:fde6fc911c61 87 "UMTS 3G ",
mazgch 2:fde6fc911c61 88 "HSPA 3G+ ",
mazgch 2:fde6fc911c61 89 "LTE 4G " };
mazgch 2:fde6fc911c61 90 TFT.locate(0,175);
mazgch 2:fde6fc911c61 91 TFT.printf(" %s\n"
mazgch 2:fde6fc911c61 92 " %s\n"
mazgch 2:fde6fc911c61 93 " %idBm ", sBearer[bearer],sState[state],rssi);
mazgch 2:fde6fc911c61 94 }
mazgch 2:fde6fc911c61 95 if((state >= LinkMonitor::REGISTRATION_STATE_HOME_NETWORK) && !modem.getSMCount(&count) && (count > 0))
mazgch 2:fde6fc911c61 96 {
mazgch 2:fde6fc911c61 97 if(!modem.getSM(num, msg, sizeof(msg)))
mazgch 2:fde6fc911c61 98 {
mazgch 2:fde6fc911c61 99 info(" From: %s\n SMS:%s", num, msg);
mazgch 2:fde6fc911c61 100 }
mazgch 2:fde6fc911c61 101 }
mazgch 2:fde6fc911c61 102 c = n;
mazgch 2:fde6fc911c61 103 }
mazgch 2:fde6fc911c61 104 point p;
mazgch 2:fde6fc911c61 105 if (TFT.getPixel(p) && (p.y < 35) && *num)
mazgch 2:fde6fc911c61 106 {
mazgch 2:fde6fc911c61 107 const char* txt = "Hello from C027 :)";
mazgch 2:fde6fc911c61 108 if (OK == modem.sendSM(num, txt))
mazgch 2:fde6fc911c61 109 {
mazgch 2:fde6fc911c61 110 info(" To: %s\n SMS:%s", num, txt);
mazgch 2:fde6fc911c61 111 *num = 0;
mazgch 0:bd6ef6f73032 112 }
mazgch 0:bd6ef6f73032 113 }
mazgch 2:fde6fc911c61 114 int ret;
mazgch 4:b18b0bc4142f 115 while ((ret = gps.getMessage(msg, sizeof(msg))) > 0)
mazgch 2:fde6fc911c61 116 {
mazgch 2:fde6fc911c61 117 int len = LENGTH(ret);
mazgch 2:fde6fc911c61 118 if (PROTOCOL(ret) == NMEA && !strncmp("$GPGLL", msg, 6))
mazgch 2:fde6fc911c61 119 {
mazgch 2:fde6fc911c61 120 double la = 0, lo = 0;
mazgch 2:fde6fc911c61 121 char cLa = 0, cLo = 0, ch = 0;
mazgch 2:fde6fc911c61 122 TFT.fillrect(220,175,320,210,White);
mazgch 4:b18b0bc4142f 123 TFT.locate(220,175);
mazgch 4:b18b0bc4142f 124 TFT.printf(" GPS");
mazgch 2:fde6fc911c61 125 if (gps.getNmeaItem(1,msg,len,la) && gps.getNmeaItem(2,msg,len,cLa) &&
mazgch 2:fde6fc911c61 126 gps.getNmeaItem(3,msg,len,lo) && gps.getNmeaItem(4,msg,len,cLo) &&
mazgch 2:fde6fc911c61 127 gps.getNmeaItem(6,msg,len,ch) && ch == 'A')
mazgch 2:fde6fc911c61 128 {
mazgch 3:4ec009118465 129 la *= 0.01;
mazgch 3:4ec009118465 130 lo *= 0.01;
mazgch 3:4ec009118465 131 int iLa = (int)la;
mazgch 3:4ec009118465 132 int iLo = (int)lo;
mazgch 3:4ec009118465 133 la = (la - iLa) / 0.6 + iLa;
mazgch 3:4ec009118465 134 lo = (lo - iLo) / 0.6 + iLo;
mazgch 2:fde6fc911c61 135 if (cLa == 'S') la = -la;
mazgch 2:fde6fc911c61 136 if (cLo == 'N') lo = -lo;
mazgch 3:4ec009118465 137
mazgch 2:fde6fc911c61 138 TFT.locate(220,187);
mazgch 3:4ec009118465 139 TFT.printf("%11.6f ", la);
mazgch 2:fde6fc911c61 140 TFT.locate(220,199);
mazgch 3:4ec009118465 141 TFT.printf("%11.6f ", lo);
mazgch 2:fde6fc911c61 142 }
mazgch 2:fde6fc911c61 143 }
mazgch 2:fde6fc911c61 144 }
mazgch 0:bd6ef6f73032 145 }
mazgch 0:bd6ef6f73032 146 }