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@8:98b713c10d30, 2013-12-06 (annotated)
- Committer:
- mazgch
- Date:
- Fri Dec 06 14:04:48 2013 +0000
- Revision:
- 8:98b713c10d30
- Parent:
- 5:2d2a14f0e98d
- Child:
- 9:e3dd986ab08c
latest libs
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 | 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 | 8:98b713c10d30 | 54 | c027.mdmUsbEnable(true); |
mazgch | 4:b18b0bc4142f | 55 | c027.mdmPower(true); |
mazgch | 4:b18b0bc4142f | 56 | c027.gpsPower(true); |
mazgch | 4:b18b0bc4142f | 57 | |
mazgch | 5:2d2a14f0e98d | 58 | GPSSerial gps; |
mazgch | 0:bd6ef6f73032 | 59 | UbloxUSBGSMModem modem; |
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 | 2:fde6fc911c61 | 66 | clock_t c = clock(); |
mazgch | 0:bd6ef6f73032 | 67 | while(true) |
mazgch | 0:bd6ef6f73032 | 68 | { |
mazgch | 2:fde6fc911c61 | 69 | clock_t n = clock(); |
mazgch | 2:fde6fc911c61 | 70 | if ((n - c) > CLOCKS_PER_SEC) // every 3 seconds |
mazgch | 0:bd6ef6f73032 | 71 | { |
mazgch | 2:fde6fc911c61 | 72 | int rssi; |
mazgch | 2:fde6fc911c61 | 73 | LinkMonitor::REGISTRATION_STATE state; |
mazgch | 2:fde6fc911c61 | 74 | LinkMonitor::BEARER bearer; |
mazgch | 2:fde6fc911c61 | 75 | if (!modem.getLinkState(&rssi, &state, &bearer)) |
mazgch | 0:bd6ef6f73032 | 76 | { |
mazgch | 2:fde6fc911c61 | 77 | const char* sState[] = |
mazgch | 2:fde6fc911c61 | 78 | { " ", |
mazgch | 2:fde6fc911c61 | 79 | "REG. ", |
mazgch | 2:fde6fc911c61 | 80 | "DENIED", |
mazgch | 2:fde6fc911c61 | 81 | "NO NET", |
mazgch | 2:fde6fc911c61 | 82 | "HOME ", |
mazgch | 2:fde6fc911c61 | 83 | "ROAM " }; |
mazgch | 2:fde6fc911c61 | 84 | const char* sBearer[] = |
mazgch | 2:fde6fc911c61 | 85 | { " ", |
mazgch | 2:fde6fc911c61 | 86 | "GSM 2G ", |
mazgch | 2:fde6fc911c61 | 87 | "EDGE 2.5G", |
mazgch | 2:fde6fc911c61 | 88 | "UMTS 3G ", |
mazgch | 2:fde6fc911c61 | 89 | "HSPA 3G+ ", |
mazgch | 2:fde6fc911c61 | 90 | "LTE 4G " }; |
mazgch | 2:fde6fc911c61 | 91 | TFT.locate(0,175); |
mazgch | 2:fde6fc911c61 | 92 | TFT.printf(" %s\n" |
mazgch | 2:fde6fc911c61 | 93 | " %s\n" |
mazgch | 2:fde6fc911c61 | 94 | " %idBm ", sBearer[bearer],sState[state],rssi); |
mazgch | 2:fde6fc911c61 | 95 | } |
mazgch | 2:fde6fc911c61 | 96 | if((state >= LinkMonitor::REGISTRATION_STATE_HOME_NETWORK) && !modem.getSMCount(&count) && (count > 0)) |
mazgch | 2:fde6fc911c61 | 97 | { |
mazgch | 2:fde6fc911c61 | 98 | if(!modem.getSM(num, msg, sizeof(msg))) |
mazgch | 2:fde6fc911c61 | 99 | { |
mazgch | 2:fde6fc911c61 | 100 | info(" From: %s\n SMS:%s", num, msg); |
mazgch | 2:fde6fc911c61 | 101 | } |
mazgch | 2:fde6fc911c61 | 102 | } |
mazgch | 2:fde6fc911c61 | 103 | c = n; |
mazgch | 2:fde6fc911c61 | 104 | } |
mazgch | 2:fde6fc911c61 | 105 | point p; |
mazgch | 2:fde6fc911c61 | 106 | if (TFT.getPixel(p) && (p.y < 35) && *num) |
mazgch | 2:fde6fc911c61 | 107 | { |
mazgch | 2:fde6fc911c61 | 108 | const char* txt = "Hello from C027 :)"; |
mazgch | 2:fde6fc911c61 | 109 | if (OK == modem.sendSM(num, txt)) |
mazgch | 2:fde6fc911c61 | 110 | { |
mazgch | 2:fde6fc911c61 | 111 | info(" To: %s\n SMS:%s", num, txt); |
mazgch | 2:fde6fc911c61 | 112 | *num = 0; |
mazgch | 0:bd6ef6f73032 | 113 | } |
mazgch | 0:bd6ef6f73032 | 114 | } |
mazgch | 2:fde6fc911c61 | 115 | int ret; |
mazgch | 4:b18b0bc4142f | 116 | while ((ret = gps.getMessage(msg, sizeof(msg))) > 0) |
mazgch | 2:fde6fc911c61 | 117 | { |
mazgch | 2:fde6fc911c61 | 118 | int len = LENGTH(ret); |
mazgch | 2:fde6fc911c61 | 119 | if (PROTOCOL(ret) == NMEA && !strncmp("$GPGLL", msg, 6)) |
mazgch | 2:fde6fc911c61 | 120 | { |
mazgch | 2:fde6fc911c61 | 121 | double la = 0, lo = 0; |
mazgch | 2:fde6fc911c61 | 122 | char cLa = 0, cLo = 0, ch = 0; |
mazgch | 2:fde6fc911c61 | 123 | TFT.fillrect(220,175,320,210,White); |
mazgch | 4:b18b0bc4142f | 124 | TFT.locate(220,175); |
mazgch | 4:b18b0bc4142f | 125 | TFT.printf(" GPS"); |
mazgch | 2:fde6fc911c61 | 126 | if (gps.getNmeaItem(1,msg,len,la) && gps.getNmeaItem(2,msg,len,cLa) && |
mazgch | 2:fde6fc911c61 | 127 | gps.getNmeaItem(3,msg,len,lo) && gps.getNmeaItem(4,msg,len,cLo) && |
mazgch | 2:fde6fc911c61 | 128 | gps.getNmeaItem(6,msg,len,ch) && ch == 'A') |
mazgch | 2:fde6fc911c61 | 129 | { |
mazgch | 3:4ec009118465 | 130 | la *= 0.01; |
mazgch | 3:4ec009118465 | 131 | lo *= 0.01; |
mazgch | 3:4ec009118465 | 132 | int iLa = (int)la; |
mazgch | 3:4ec009118465 | 133 | int iLo = (int)lo; |
mazgch | 3:4ec009118465 | 134 | la = (la - iLa) / 0.6 + iLa; |
mazgch | 3:4ec009118465 | 135 | lo = (lo - iLo) / 0.6 + iLo; |
mazgch | 2:fde6fc911c61 | 136 | if (cLa == 'S') la = -la; |
mazgch | 2:fde6fc911c61 | 137 | if (cLo == 'N') lo = -lo; |
mazgch | 3:4ec009118465 | 138 | |
mazgch | 2:fde6fc911c61 | 139 | TFT.locate(220,187); |
mazgch | 3:4ec009118465 | 140 | TFT.printf("%11.6f ", la); |
mazgch | 2:fde6fc911c61 | 141 | TFT.locate(220,199); |
mazgch | 3:4ec009118465 | 142 | TFT.printf("%11.6f ", lo); |
mazgch | 2:fde6fc911c61 | 143 | } |
mazgch | 2:fde6fc911c61 | 144 | } |
mazgch | 2:fde6fc911c61 | 145 | } |
mazgch | 0:bd6ef6f73032 | 146 | } |
mazgch | 0:bd6ef6f73032 | 147 | } |