example application with TFT display and SMS receive send
Dependencies: C027 C027_Support SeeedStudioTFTv2 TFT_fonts UbloxUSBModem mbed
Fork of C027_DisplayTest by
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.
main.cpp@9:e3dd986ab08c, 2013-12-17 (annotated)
- 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?
User | Revision | Line number | New 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 | } |