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:
Tue Dec 17 16:36:11 2013 +0000
Revision:
9:e3dd986ab08c
Parent:
8:98b713c10d30
Child:
10:2b1e6015e413
Use latest libraries, added "Where are you?" SMS feature

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 9:e3dd986ab08c 12 #include "UbloxModem.h"
mazgch 2:fde6fc911c61 13
mazgch 2:fde6fc911c61 14 void ubxLogo(SPI_TFT_ILI9341* tft, int x0/*160*/, int y0/*160*/, int r)
mazgch 0:bd6ef6f73032 15 {
mazgch 0:bd6ef6f73032 16 int i1=r/8, i1_5=r*3/16, i2=r*2/8, i3=r*3/8,
mazgch 0:bd6ef6f73032 17 i4=r*4/8, i5=r*5/8, i6=r*6/8, i7=r*7/8;
mazgch 0:bd6ef6f73032 18 // the ball
mazgch 0:bd6ef6f73032 19 tft->fillcircle(x0, y0, r, Red);
mazgch 0:bd6ef6f73032 20 // the dot
mazgch 2:fde6fc911c61 21 tft->fillcircle(x0-i2, y0-i3, i1_5, White);
mazgch 0:bd6ef6f73032 22 // the u
mazgch 2:fde6fc911c61 23 tft->fillcircle(x0+i4, y0+i3, i3, White);
mazgch 2:fde6fc911c61 24 tft->fillcircle(x0+i4, y0+i3, i1, Red);
mazgch 2:fde6fc911c61 25 tft->fillrect( x0+i1, y0-i1, x0+i3, y0+i3, White);
mazgch 2:fde6fc911c61 26 tft->fillrect( x0+i3, y0-i1, x0+i5, y0+i3, Red);
mazgch 2:fde6fc911c61 27 tft->fillrect( x0+i5, y0-i1, x0+i7, y0+i6, White);
mazgch 0:bd6ef6f73032 28 }
mazgch 0:bd6ef6f73032 29
mazgch 2:fde6fc911c61 30 #define info(...) \
mazgch 2:fde6fc911c61 31 TFT.locate(0,5), \
mazgch 2:fde6fc911c61 32 TFT.fillrect(0,0,320,35,White), \
mazgch 2:fde6fc911c61 33 TFT.printf(__VA_ARGS__)
mazgch 2:fde6fc911c61 34
mazgch 0:bd6ef6f73032 35 int main()
mazgch 0:bd6ef6f73032 36 {
mazgch 2:fde6fc911c61 37 SeeedStudioTFTv2 TFT(A3, A1, A2, A0,
mazgch 2:fde6fc911c61 38 D11, D12, D13,
mazgch 2:fde6fc911c61 39 D5/*tft cs*/, D6/*tft dc*/, D7/*backlight*/,
mazgch 2:fde6fc911c61 40 D4/*sd cs*/);
mazgch 2:fde6fc911c61 41 TFT.setBacklight(true);
mazgch 2:fde6fc911c61 42 TFT.set_font((unsigned char*) Arial12x12); // select the font
mazgch 2:fde6fc911c61 43 TFT.set_orientation(3);
mazgch 2:fde6fc911c61 44 //TFT.calibrate(); // calibrate the touch
mazgch 0:bd6ef6f73032 45 TFT.background(White); // set background to black
mazgch 0:bd6ef6f73032 46 TFT.foreground(Black); // set chars to white
mazgch 0:bd6ef6f73032 47 TFT.cls(); // clear the screen
mazgch 2:fde6fc911c61 48 ubxLogo(&TFT, 160, 120, 80);
mazgch 0:bd6ef6f73032 49 TFT.locate(70,220);
mazgch 0:bd6ef6f73032 50 TFT.printf("u-blox C027-C20/U20/G35");
mazgch 0:bd6ef6f73032 51
mazgch 4:b18b0bc4142f 52 C027 c027;
mazgch 9:e3dd986ab08c 53 //c027.mdmUsbEnable(true); // disable this is you plan to use the Serial port on LISA-C
mazgch 4:b18b0bc4142f 54 c027.mdmPower(true);
mazgch 4:b18b0bc4142f 55 c027.gpsPower(true);
mazgch 4:b18b0bc4142f 56
mazgch 5:2d2a14f0e98d 57 GPSSerial gps;
mazgch 9:e3dd986ab08c 58 //UbloxUSBModem modem; // LISA-U or LISA-C, don't forget to call the mdmUsbEnable above
mazgch 9:e3dd986ab08c 59 UbloxSerModem modem; // LISA-U, LISA-C or SARA-G
mazgch 2:fde6fc911c61 60 size_t count;
mazgch 0:bd6ef6f73032 61
mazgch 2:fde6fc911c61 62 #define MY_IMEI "+41799613242"
mazgch 2:fde6fc911c61 63 info(" Cellular Modem\n IMEI: %s", MY_IMEI);
mazgch 2:fde6fc911c61 64
mazgch 2:fde6fc911c61 65 char num[17] = "", msg[160+1] = "";
mazgch 9:e3dd986ab08c 66 char link[160] = "";
mazgch 2:fde6fc911c61 67 clock_t c = clock();
mazgch 0:bd6ef6f73032 68 while(true)
mazgch 0:bd6ef6f73032 69 {
mazgch 2:fde6fc911c61 70 clock_t n = clock();
mazgch 2:fde6fc911c61 71 if ((n - c) > CLOCKS_PER_SEC) // every 3 seconds
mazgch 0:bd6ef6f73032 72 {
mazgch 2:fde6fc911c61 73 int rssi;
mazgch 2:fde6fc911c61 74 LinkMonitor::REGISTRATION_STATE state;
mazgch 2:fde6fc911c61 75 LinkMonitor::BEARER bearer;
mazgch 2:fde6fc911c61 76 if (!modem.getLinkState(&rssi, &state, &bearer))
mazgch 0:bd6ef6f73032 77 {
mazgch 2:fde6fc911c61 78 const char* sState[] =
mazgch 2:fde6fc911c61 79 { " ",
mazgch 2:fde6fc911c61 80 "REG. ",
mazgch 2:fde6fc911c61 81 "DENIED",
mazgch 2:fde6fc911c61 82 "NO NET",
mazgch 2:fde6fc911c61 83 "HOME ",
mazgch 2:fde6fc911c61 84 "ROAM " };
mazgch 2:fde6fc911c61 85 const char* sBearer[] =
mazgch 2:fde6fc911c61 86 { " ",
mazgch 2:fde6fc911c61 87 "GSM 2G ",
mazgch 2:fde6fc911c61 88 "EDGE 2.5G",
mazgch 2:fde6fc911c61 89 "UMTS 3G ",
mazgch 2:fde6fc911c61 90 "HSPA 3G+ ",
mazgch 2:fde6fc911c61 91 "LTE 4G " };
mazgch 2:fde6fc911c61 92 TFT.locate(0,175);
mazgch 2:fde6fc911c61 93 TFT.printf(" %s\n"
mazgch 2:fde6fc911c61 94 " %s\n"
mazgch 2:fde6fc911c61 95 " %idBm ", sBearer[bearer],sState[state],rssi);
mazgch 2:fde6fc911c61 96 }
mazgch 2:fde6fc911c61 97 if((state >= LinkMonitor::REGISTRATION_STATE_HOME_NETWORK) && !modem.getSMCount(&count) && (count > 0))
mazgch 2:fde6fc911c61 98 {
mazgch 2:fde6fc911c61 99 if(!modem.getSM(num, msg, sizeof(msg)))
mazgch 2:fde6fc911c61 100 {
mazgch 2:fde6fc911c61 101 info(" From: %s\n SMS:%s", num, msg);
mazgch 9:e3dd986ab08c 102 if (0 == strcmp(msg, "Where are you?") && *link)
mazgch 9:e3dd986ab08c 103 {
mazgch 9:e3dd986ab08c 104 modem.sendSM(num, link);
mazgch 9:e3dd986ab08c 105 }
mazgch 2:fde6fc911c61 106 }
mazgch 2:fde6fc911c61 107 }
mazgch 2:fde6fc911c61 108 c = n;
mazgch 2:fde6fc911c61 109 }
mazgch 2:fde6fc911c61 110 point p;
mazgch 2:fde6fc911c61 111 if (TFT.getPixel(p) && (p.y < 35) && *num)
mazgch 2:fde6fc911c61 112 {
mazgch 2:fde6fc911c61 113 const char* txt = "Hello from C027 :)";
mazgch 2:fde6fc911c61 114 if (OK == modem.sendSM(num, txt))
mazgch 2:fde6fc911c61 115 {
mazgch 2:fde6fc911c61 116 info(" To: %s\n SMS:%s", num, txt);
mazgch 2:fde6fc911c61 117 *num = 0;
mazgch 0:bd6ef6f73032 118 }
mazgch 0:bd6ef6f73032 119 }
mazgch 2:fde6fc911c61 120 int ret;
mazgch 4:b18b0bc4142f 121 while ((ret = gps.getMessage(msg, sizeof(msg))) > 0)
mazgch 2:fde6fc911c61 122 {
mazgch 2:fde6fc911c61 123 int len = LENGTH(ret);
mazgch 2:fde6fc911c61 124 if (PROTOCOL(ret) == NMEA && !strncmp("$GPGLL", msg, 6))
mazgch 2:fde6fc911c61 125 {
mazgch 2:fde6fc911c61 126 double la = 0, lo = 0;
mazgch 2:fde6fc911c61 127 char cLa = 0, cLo = 0, ch = 0;
mazgch 2:fde6fc911c61 128 TFT.fillrect(220,175,320,210,White);
mazgch 4:b18b0bc4142f 129 TFT.locate(220,175);
mazgch 4:b18b0bc4142f 130 TFT.printf(" GPS");
mazgch 2:fde6fc911c61 131 if (gps.getNmeaItem(1,msg,len,la) && gps.getNmeaItem(2,msg,len,cLa) &&
mazgch 2:fde6fc911c61 132 gps.getNmeaItem(3,msg,len,lo) && gps.getNmeaItem(4,msg,len,cLo) &&
mazgch 2:fde6fc911c61 133 gps.getNmeaItem(6,msg,len,ch) && ch == 'A')
mazgch 2:fde6fc911c61 134 {
mazgch 3:4ec009118465 135 la *= 0.01;
mazgch 3:4ec009118465 136 lo *= 0.01;
mazgch 3:4ec009118465 137 int iLa = (int)la;
mazgch 3:4ec009118465 138 int iLo = (int)lo;
mazgch 3:4ec009118465 139 la = (la - iLa) / 0.6 + iLa;
mazgch 3:4ec009118465 140 lo = (lo - iLo) / 0.6 + iLo;
mazgch 2:fde6fc911c61 141 if (cLa == 'S') la = -la;
mazgch 2:fde6fc911c61 142 if (cLo == 'N') lo = -lo;
mazgch 3:4ec009118465 143
mazgch 2:fde6fc911c61 144 TFT.locate(220,187);
mazgch 3:4ec009118465 145 TFT.printf("%11.6f ", la);
mazgch 2:fde6fc911c61 146 TFT.locate(220,199);
mazgch 3:4ec009118465 147 TFT.printf("%11.6f ", lo);
mazgch 9:e3dd986ab08c 148 sprintf(link, "https://maps.google.com/?q=%.5f,%.5f", la, lo);
mazgch 2:fde6fc911c61 149 }
mazgch 2:fde6fc911c61 150 }
mazgch 2:fde6fc911c61 151 }
mazgch 0:bd6ef6f73032 152 }
mazgch 0:bd6ef6f73032 153 }