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@2:fde6fc911c61, 2013-10-21 (annotated)
- 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?
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 | 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 | } |