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@3:4ec009118465, 2013-10-21 (annotated)
- Committer:
- mazgch
- Date:
- Mon Oct 21 19:55:45 2013 +0000
- Revision:
- 3:4ec009118465
- Parent:
- 2:fde6fc911c61
- Child:
- 4:b18b0bc4142f
lat long calc
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 | |
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 | void initC027(void) |
mazgch | 0:bd6ef6f73032 | 36 | { |
mazgch | 0:bd6ef6f73032 | 37 | DigitalOut mdmEn(MDMEN); |
mazgch | 0:bd6ef6f73032 | 38 | DigitalOut mdmPwrOn(MDMPWRON); |
mazgch | 0:bd6ef6f73032 | 39 | DigitalOut mdmRst(MDMRST); |
mazgch | 0:bd6ef6f73032 | 40 | DigitalOut gpsEn(GPSEN); |
mazgch | 0:bd6ef6f73032 | 41 | DigitalOut gpsRst(GPSRST); |
mazgch | 0:bd6ef6f73032 | 42 | |
mazgch | 0:bd6ef6f73032 | 43 | gpsEn = 1; // LDOEN: 1=on,0=off |
mazgch | 0:bd6ef6f73032 | 44 | gpsRst = 1; // RESET: 0=reset,1=operating |
mazgch | 0:bd6ef6f73032 | 45 | mdmPwrOn = 1; // PWRON: 1=idle,0=action |
mazgch | 0:bd6ef6f73032 | 46 | mdmEn = 1; // LDOEN: 1=on,0=off |
mazgch | 0:bd6ef6f73032 | 47 | mdmRst = 0; // RESET: 0=reset,1=operating |
mazgch | 0:bd6ef6f73032 | 48 | Thread::wait(100); // power on sequence is triggered by 50ms reset low and wait for supplies ready |
mazgch | 0:bd6ef6f73032 | 49 | mdmRst = 1; // RESET: 1=operating,0=reset |
mazgch | 0:bd6ef6f73032 | 50 | Thread::wait(3000);// modem will be ready after 3 seconds |
mazgch | 0:bd6ef6f73032 | 51 | } |
mazgch | 2:fde6fc911c61 | 52 | |
mazgch | 0:bd6ef6f73032 | 53 | int main() |
mazgch | 0:bd6ef6f73032 | 54 | { |
mazgch | 2:fde6fc911c61 | 55 | SeeedStudioTFTv2 TFT(A3, A1, A2, A0, |
mazgch | 2:fde6fc911c61 | 56 | D11, D12, D13, |
mazgch | 2:fde6fc911c61 | 57 | D5/*tft cs*/, D6/*tft dc*/, D7/*backlight*/, |
mazgch | 2:fde6fc911c61 | 58 | D4/*sd cs*/); |
mazgch | 2:fde6fc911c61 | 59 | TFT.setBacklight(true); |
mazgch | 2:fde6fc911c61 | 60 | TFT.set_font((unsigned char*) Arial12x12); // select the font |
mazgch | 2:fde6fc911c61 | 61 | TFT.set_orientation(3); |
mazgch | 2:fde6fc911c61 | 62 | //TFT.calibrate(); // calibrate the touch |
mazgch | 0:bd6ef6f73032 | 63 | TFT.background(White); // set background to black |
mazgch | 0:bd6ef6f73032 | 64 | TFT.foreground(Black); // set chars to white |
mazgch | 0:bd6ef6f73032 | 65 | TFT.cls(); // clear the screen |
mazgch | 2:fde6fc911c61 | 66 | ubxLogo(&TFT, 160, 120, 80); |
mazgch | 0:bd6ef6f73032 | 67 | TFT.locate(70,220); |
mazgch | 0:bd6ef6f73032 | 68 | TFT.printf("u-blox C027-C20/U20/G35"); |
mazgch | 0:bd6ef6f73032 | 69 | |
mazgch | 0:bd6ef6f73032 | 70 | initC027(); |
mazgch | 2:fde6fc911c61 | 71 | //C027 c027; |
mazgch | 2:fde6fc911c61 | 72 | //c027.mdmPower(true); |
mazgch | 2:fde6fc911c61 | 73 | GPS gps; |
mazgch | 0:bd6ef6f73032 | 74 | UbloxUSBGSMModem modem; |
mazgch | 2:fde6fc911c61 | 75 | size_t count; |
mazgch | 0:bd6ef6f73032 | 76 | |
mazgch | 2:fde6fc911c61 | 77 | #define MY_IMEI "+41799613242" |
mazgch | 2:fde6fc911c61 | 78 | info(" Cellular Modem\n IMEI: %s", MY_IMEI); |
mazgch | 2:fde6fc911c61 | 79 | |
mazgch | 2:fde6fc911c61 | 80 | char num[17] = "", msg[160+1] = ""; |
mazgch | 2:fde6fc911c61 | 81 | clock_t c = clock(); |
mazgch | 0:bd6ef6f73032 | 82 | while(true) |
mazgch | 0:bd6ef6f73032 | 83 | { |
mazgch | 2:fde6fc911c61 | 84 | clock_t n = clock(); |
mazgch | 2:fde6fc911c61 | 85 | if ((n - c) > CLOCKS_PER_SEC) // every 3 seconds |
mazgch | 0:bd6ef6f73032 | 86 | { |
mazgch | 2:fde6fc911c61 | 87 | int rssi; |
mazgch | 2:fde6fc911c61 | 88 | LinkMonitor::REGISTRATION_STATE state; |
mazgch | 2:fde6fc911c61 | 89 | LinkMonitor::BEARER bearer; |
mazgch | 2:fde6fc911c61 | 90 | if (!modem.getLinkState(&rssi, &state, &bearer)) |
mazgch | 0:bd6ef6f73032 | 91 | { |
mazgch | 2:fde6fc911c61 | 92 | const char* sState[] = |
mazgch | 2:fde6fc911c61 | 93 | { " ", |
mazgch | 2:fde6fc911c61 | 94 | "REG. ", |
mazgch | 2:fde6fc911c61 | 95 | "DENIED", |
mazgch | 2:fde6fc911c61 | 96 | "NO NET", |
mazgch | 2:fde6fc911c61 | 97 | "HOME ", |
mazgch | 2:fde6fc911c61 | 98 | "ROAM " }; |
mazgch | 2:fde6fc911c61 | 99 | const char* sBearer[] = |
mazgch | 2:fde6fc911c61 | 100 | { " ", |
mazgch | 2:fde6fc911c61 | 101 | "GSM 2G ", |
mazgch | 2:fde6fc911c61 | 102 | "EDGE 2.5G", |
mazgch | 2:fde6fc911c61 | 103 | "UMTS 3G ", |
mazgch | 2:fde6fc911c61 | 104 | "HSPA 3G+ ", |
mazgch | 2:fde6fc911c61 | 105 | "LTE 4G " }; |
mazgch | 2:fde6fc911c61 | 106 | TFT.locate(0,175); |
mazgch | 2:fde6fc911c61 | 107 | TFT.printf(" %s\n" |
mazgch | 2:fde6fc911c61 | 108 | " %s\n" |
mazgch | 2:fde6fc911c61 | 109 | " %idBm ", sBearer[bearer],sState[state],rssi); |
mazgch | 2:fde6fc911c61 | 110 | } |
mazgch | 2:fde6fc911c61 | 111 | if((state >= LinkMonitor::REGISTRATION_STATE_HOME_NETWORK) && !modem.getSMCount(&count) && (count > 0)) |
mazgch | 2:fde6fc911c61 | 112 | { |
mazgch | 2:fde6fc911c61 | 113 | if(!modem.getSM(num, msg, sizeof(msg))) |
mazgch | 2:fde6fc911c61 | 114 | { |
mazgch | 2:fde6fc911c61 | 115 | info(" From: %s\n SMS:%s", num, msg); |
mazgch | 2:fde6fc911c61 | 116 | } |
mazgch | 2:fde6fc911c61 | 117 | } |
mazgch | 2:fde6fc911c61 | 118 | c = n; |
mazgch | 2:fde6fc911c61 | 119 | } |
mazgch | 2:fde6fc911c61 | 120 | point p; |
mazgch | 2:fde6fc911c61 | 121 | if (TFT.getPixel(p) && (p.y < 35) && *num) |
mazgch | 2:fde6fc911c61 | 122 | { |
mazgch | 2:fde6fc911c61 | 123 | const char* txt = "Hello from C027 :)"; |
mazgch | 2:fde6fc911c61 | 124 | if (OK == modem.sendSM(num, txt)) |
mazgch | 2:fde6fc911c61 | 125 | { |
mazgch | 2:fde6fc911c61 | 126 | info(" To: %s\n SMS:%s", num, txt); |
mazgch | 2:fde6fc911c61 | 127 | *num = 0; |
mazgch | 0:bd6ef6f73032 | 128 | } |
mazgch | 0:bd6ef6f73032 | 129 | } |
mazgch | 2:fde6fc911c61 | 130 | int ret; |
mazgch | 2:fde6fc911c61 | 131 | while ((ret = gps.getGPS(msg, sizeof(msg))) > 0) |
mazgch | 2:fde6fc911c61 | 132 | { |
mazgch | 2:fde6fc911c61 | 133 | int len = LENGTH(ret); |
mazgch | 2:fde6fc911c61 | 134 | if (PROTOCOL(ret) == NMEA && !strncmp("$GPGLL", msg, 6)) |
mazgch | 2:fde6fc911c61 | 135 | { |
mazgch | 2:fde6fc911c61 | 136 | double la = 0, lo = 0; |
mazgch | 2:fde6fc911c61 | 137 | char cLa = 0, cLo = 0, ch = 0; |
mazgch | 2:fde6fc911c61 | 138 | TFT.fillrect(220,175,320,210,White); |
mazgch | 2:fde6fc911c61 | 139 | if (gps.getNmeaItem(1,msg,len,la) && gps.getNmeaItem(2,msg,len,cLa) && |
mazgch | 2:fde6fc911c61 | 140 | gps.getNmeaItem(3,msg,len,lo) && gps.getNmeaItem(4,msg,len,cLo) && |
mazgch | 2:fde6fc911c61 | 141 | gps.getNmeaItem(6,msg,len,ch) && ch == 'A') |
mazgch | 2:fde6fc911c61 | 142 | { |
mazgch | 3:4ec009118465 | 143 | la *= 0.01; |
mazgch | 3:4ec009118465 | 144 | lo *= 0.01; |
mazgch | 3:4ec009118465 | 145 | int iLa = (int)la; |
mazgch | 3:4ec009118465 | 146 | int iLo = (int)lo; |
mazgch | 3:4ec009118465 | 147 | la = (la - iLa) / 0.6 + iLa; |
mazgch | 3:4ec009118465 | 148 | lo = (lo - iLo) / 0.6 + iLo; |
mazgch | 2:fde6fc911c61 | 149 | if (cLa == 'S') la = -la; |
mazgch | 2:fde6fc911c61 | 150 | if (cLo == 'N') lo = -lo; |
mazgch | 3:4ec009118465 | 151 | |
mazgch | 2:fde6fc911c61 | 152 | TFT.locate(220,175); |
mazgch | 2:fde6fc911c61 | 153 | TFT.printf(" GPS"); |
mazgch | 2:fde6fc911c61 | 154 | TFT.locate(220,187); |
mazgch | 3:4ec009118465 | 155 | TFT.printf("%11.6f ", la); |
mazgch | 2:fde6fc911c61 | 156 | TFT.locate(220,199); |
mazgch | 3:4ec009118465 | 157 | TFT.printf("%11.6f ", lo); |
mazgch | 2:fde6fc911c61 | 158 | } |
mazgch | 2:fde6fc911c61 | 159 | } |
mazgch | 2:fde6fc911c61 | 160 | } |
mazgch | 0:bd6ef6f73032 | 161 | } |
mazgch | 0:bd6ef6f73032 | 162 | } |