Dream Team / Mbed 2 deprecated FONA_CellPhone

Dependencies:   mbed

Committer:
George windoge T
Date:
Thu Mar 10 23:52:21 2016 -0500
Revision:
6:15fe38e607ed
Parent:
5:fc20c90c8650
Child:
7:7f116e2a184b
GT: added main menu functionality

Who changed what in which revision?

UserRevisionLine numberNew contents of line
George windoge T 3:7007491a7f28 1 /***************************************************
George windoge T 3:7007491a7f28 2 This is an example for our Adafruit FONA Cellular Module
George windoge T 3:7007491a7f28 3
George windoge T 3:7007491a7f28 4 Designed specifically to work with the Adafruit FONA
George windoge T 3:7007491a7f28 5 ----> http://www.adafruit.com/products/1946
George windoge T 3:7007491a7f28 6 ----> http://www.adafruit.com/products/1963
George windoge T 3:7007491a7f28 7 ----> http://www.adafruit.com/products/2468
George windoge T 3:7007491a7f28 8 ----> http://www.adafruit.com/products/2542
George windoge T 3:7007491a7f28 9
George windoge T 3:7007491a7f28 10 These cellular modules use TTL Serial to communicate, 2 pins are
George windoge T 3:7007491a7f28 11 required to interface
George windoge T 3:7007491a7f28 12 Adafruit invests time and resources providing this open source code,
George windoge T 3:7007491a7f28 13 please support Adafruit and open-source hardware by purchasing
George windoge T 3:7007491a7f28 14 products from Adafruit!
George windoge T 3:7007491a7f28 15
George windoge T 3:7007491a7f28 16 Written by Limor Fried/Ladyada for Adafruit Industries.
George windoge T 3:7007491a7f28 17 BSD license, all text above must be included in any redistribution
George windoge T 3:7007491a7f28 18 ****************************************************/
George windoge T 3:7007491a7f28 19
George windoge T 3:7007491a7f28 20 /*
George windoge T 3:7007491a7f28 21 * Modified by Marc PLOUHINEC 27/06/2015 for use in mbed
George windoge T 3:7007491a7f28 22 */
George windoge T 3:7007491a7f28 23
George windoge T 3:7007491a7f28 24 /*
George windoge T 3:7007491a7f28 25 THIS CODE IS STILL IN PROGRESS!
George windoge T 3:7007491a7f28 26
George windoge T 3:7007491a7f28 27 Open up the serial console on the Arduino at 4800 baud to interact with FONA
George windoge T 3:7007491a7f28 28
George windoge T 3:7007491a7f28 29 Note that if you need to set a GPRS APN, username, and password scroll down to
George windoge T 3:7007491a7f28 30 the commented section below just before the main "while (true)" loop.
George windoge T 3:7007491a7f28 31 */
George windoge T 3:7007491a7f28 32
George windoge T 3:7007491a7f28 33 #include <ctype.h>
George windoge T 3:7007491a7f28 34 //#include "SoftSerial.h" I dont think we need this
George windoge T 3:7007491a7f28 35 #include "Adafruit_FONA.h"
gtzintzarov3 4:b80a906adcdc 36 #include "PinDetect.h"
gtzintzarov3 4:b80a906adcdc 37 #include "uLCD_4DGL.h"
George windoge T 3:7007491a7f28 38
George windoge T 3:7007491a7f28 39 #define FONA_RST p12
George windoge T 3:7007491a7f28 40 #define FONA_TX p13
George windoge T 3:7007491a7f28 41 #define FONA_RX p14
George windoge T 3:7007491a7f28 42 #define FONA_RI p11
George windoge T 3:7007491a7f28 43
George windoge T 3:7007491a7f28 44 // this is a large buffer for replies
George windoge T 3:7007491a7f28 45 char replybuffer[255];
George windoge T 3:7007491a7f28 46
George windoge T 3:7007491a7f28 47
George windoge T 3:7007491a7f28 48 Serial pcSerial(USBTX, USBRX);
George windoge T 3:7007491a7f28 49 Adafruit_FONA fona(FONA_TX, FONA_RX, FONA_RST, FONA_RI);
George windoge T 3:7007491a7f28 50 uLCD_4DGL uLCD(p28,p27,p30);
George windoge T 3:7007491a7f28 51
George windoge T 3:7007491a7f28 52 PinDetect pbUp(p20);
George windoge T 3:7007491a7f28 53 PinDetect pbMid(p19);
George windoge T 3:7007491a7f28 54 PinDetect pbDown(p21);
George windoge T 5:fc20c90c8650 55 PinDetect pbBACK(p18);
George windoge T 3:7007491a7f28 56
George windoge T 3:7007491a7f28 57 // Turn on a LED when somebody call the FONA
George windoge T 3:7007491a7f28 58 DigitalOut led1(LED1);
George windoge T 3:7007491a7f28 59 class FonaEventListener : public Adafruit_FONA::EventListener {
George windoge T 3:7007491a7f28 60 virtual void onRing() {
George windoge T 3:7007491a7f28 61 led1 = 1;
George windoge T 3:7007491a7f28 62 }
George windoge T 3:7007491a7f28 63
George windoge T 3:7007491a7f28 64 virtual void onNoCarrier() {
George windoge T 3:7007491a7f28 65 led1 = 0;
George windoge T 3:7007491a7f28 66 }
George windoge T 3:7007491a7f28 67 };
George windoge T 3:7007491a7f28 68 FonaEventListener fonaEventListener;
George windoge T 3:7007491a7f28 69
George windoge T 3:7007491a7f28 70 // Functions defined after main()
George windoge T 3:7007491a7f28 71 uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);
George windoge T 3:7007491a7f28 72 void printMenu(void);
George windoge T 6:15fe38e607ed 73 void printTopLine(void);
George windoge T 6:15fe38e607ed 74 void printTime(void);
George windoge T 3:7007491a7f28 75 void flushSerial();
George windoge T 3:7007491a7f28 76 char readBlocking();
George windoge T 3:7007491a7f28 77 uint16_t readnumber();
George windoge T 3:7007491a7f28 78 long map(long x, long in_min, long in_max, long out_min, long out_max);
George windoge T 3:7007491a7f28 79
George windoge T 3:7007491a7f28 80
George windoge T 3:7007491a7f28 81
George windoge T 5:fc20c90c8650 82
George windoge T 5:fc20c90c8650 83 enum TOPMENU {PHONE, SMS, RADIO};
George windoge T 5:fc20c90c8650 84 TOPMENU myTopMenu = PHONE;
George windoge T 5:fc20c90c8650 85
George windoge T 3:7007491a7f28 86 DigitalOut led2(LED2);
George windoge T 3:7007491a7f28 87 DigitalOut led3(LED3);
George windoge T 3:7007491a7f28 88 DigitalOut led4(LED4);
George windoge T 3:7007491a7f28 89 //Button interrupt functions
George windoge T 3:7007491a7f28 90 void pbUp_hit_callback(void) {
George windoge T 5:fc20c90c8650 91 switch(myTopMenu) {
George windoge T 5:fc20c90c8650 92 case PHONE: {
George windoge T 5:fc20c90c8650 93 myTopMenu = RADIO;
George windoge T 5:fc20c90c8650 94 break;
George windoge T 5:fc20c90c8650 95 }
George windoge T 5:fc20c90c8650 96 case SMS: {
George windoge T 5:fc20c90c8650 97 myTopMenu = PHONE;
George windoge T 5:fc20c90c8650 98 break;
George windoge T 5:fc20c90c8650 99 }
George windoge T 5:fc20c90c8650 100 case RADIO: {
George windoge T 5:fc20c90c8650 101 myTopMenu = SMS;
George windoge T 5:fc20c90c8650 102 break;
George windoge T 5:fc20c90c8650 103 }
George windoge T 5:fc20c90c8650 104 }
George windoge T 3:7007491a7f28 105 }
George windoge T 3:7007491a7f28 106 void pbMid_hit_callback(void) {
George windoge T 5:fc20c90c8650 107 switch(myTopMenu) {
George windoge T 5:fc20c90c8650 108 case PHONE: {
George windoge T 5:fc20c90c8650 109 led2=!led2;
George windoge T 5:fc20c90c8650 110 break;
George windoge T 5:fc20c90c8650 111 }
George windoge T 5:fc20c90c8650 112 case SMS: {
George windoge T 5:fc20c90c8650 113 led3=!led3;
George windoge T 5:fc20c90c8650 114 break;
George windoge T 5:fc20c90c8650 115 }
George windoge T 5:fc20c90c8650 116 case RADIO: {
George windoge T 5:fc20c90c8650 117 led4=!led4;
George windoge T 5:fc20c90c8650 118 break;
George windoge T 5:fc20c90c8650 119 }
George windoge T 5:fc20c90c8650 120 }
George windoge T 3:7007491a7f28 121 }
George windoge T 3:7007491a7f28 122 void pbDown_hit_callback(void) {
George windoge T 5:fc20c90c8650 123 switch(myTopMenu) {
George windoge T 5:fc20c90c8650 124 case PHONE: {
George windoge T 5:fc20c90c8650 125 myTopMenu = SMS;
George windoge T 5:fc20c90c8650 126 break;
George windoge T 5:fc20c90c8650 127 }
George windoge T 5:fc20c90c8650 128 case SMS: {
George windoge T 5:fc20c90c8650 129 myTopMenu = RADIO;
George windoge T 5:fc20c90c8650 130 break;
George windoge T 5:fc20c90c8650 131 }
George windoge T 5:fc20c90c8650 132 case RADIO: {
George windoge T 5:fc20c90c8650 133 myTopMenu = PHONE;
George windoge T 5:fc20c90c8650 134 break;
George windoge T 5:fc20c90c8650 135 }
George windoge T 5:fc20c90c8650 136 }
George windoge T 5:fc20c90c8650 137 }
George windoge T 5:fc20c90c8650 138 void pbBACK_hit_callback(void) {
George windoge T 3:7007491a7f28 139 led4=!led4;
George windoge T 3:7007491a7f28 140 }
George windoge T 3:7007491a7f28 141
George windoge T 3:7007491a7f28 142
George windoge T 3:7007491a7f28 143 int main() {
George windoge T 3:7007491a7f28 144 // Set the LCD screen up
George windoge T 3:7007491a7f28 145 uLCD.display_control(PORTRAIT);
George windoge T 3:7007491a7f28 146 uLCD.cls();
George windoge T 3:7007491a7f28 147 uLCD.baudrate(BAUD_3000000);
George windoge T 3:7007491a7f28 148 uLCD.background_color(BLACK);
George windoge T 3:7007491a7f28 149
George windoge T 3:7007491a7f28 150 //set up button interrupts
George windoge T 3:7007491a7f28 151 pbUp.mode(PullUp);
George windoge T 3:7007491a7f28 152 pbMid.mode(PullUp);
George windoge T 3:7007491a7f28 153 pbDown.mode(PullUp);
George windoge T 5:fc20c90c8650 154 pbBACK.mode(PullUp);
George windoge T 3:7007491a7f28 155 wait(0.1);
George windoge T 3:7007491a7f28 156 pbUp.attach_deasserted(&pbUp_hit_callback);
George windoge T 3:7007491a7f28 157 pbMid.attach_deasserted(&pbMid_hit_callback);
George windoge T 3:7007491a7f28 158 pbDown.attach_deasserted(&pbDown_hit_callback);
George windoge T 5:fc20c90c8650 159 pbBACK.attach_deasserted(&pbBACK_hit_callback);
George windoge T 3:7007491a7f28 160 pbUp.setSampleFrequency();
George windoge T 3:7007491a7f28 161 pbMid.setSampleFrequency();
George windoge T 3:7007491a7f28 162 pbDown.setSampleFrequency();
George windoge T 5:fc20c90c8650 163 pbBACK.setSampleFrequency();
George windoge T 3:7007491a7f28 164
George windoge T 3:7007491a7f28 165 //pcSerial.baud(9600);
George windoge T 3:7007491a7f28 166 wait(1);
George windoge T 3:7007491a7f28 167 //pcSerial.printf("\r\n");
George windoge T 3:7007491a7f28 168
George windoge T 3:7007491a7f28 169 uLCD.printf("FONA basic test\r\n");
George windoge T 6:15fe38e607ed 170 uLCD.printf("Initializing....\r\n");
George windoge T 3:7007491a7f28 171
George windoge T 3:7007491a7f28 172 // See if the FONA is responding
George windoge T 3:7007491a7f28 173 if (! fona.begin(9600)) {
George windoge T 3:7007491a7f28 174 uLCD.cls();
George windoge T 3:7007491a7f28 175 uLCD.printf("Couldn't find FONA\r\n");
George windoge T 3:7007491a7f28 176 while (1);
George windoge T 3:7007491a7f28 177 }
George windoge T 3:7007491a7f28 178 fona.setEventListener(&fonaEventListener);
George windoge T 3:7007491a7f28 179 uLCD.cls();
George windoge T 3:7007491a7f28 180 pcSerial.printf("FONA is OK\r\n");
George windoge T 6:15fe38e607ed 181 wait(1);
George windoge T 3:7007491a7f28 182
George windoge T 3:7007491a7f28 183 // Print SIM card IMEI number.
George windoge T 3:7007491a7f28 184 char imei[15] = {0}; // MUST use a 16 character buffer for IMEI!
George windoge T 3:7007491a7f28 185 uint8_t imeiLen = fona.getIMEI(imei);
George windoge T 3:7007491a7f28 186 if (imeiLen > 0) {
George windoge T 6:15fe38e607ed 187 uLCD.printf("SIM card IMEI:\n %s\r\n", imei);
George windoge T 3:7007491a7f28 188 }
George windoge T 3:7007491a7f28 189
George windoge T 3:7007491a7f28 190 // Optionally configure a GPRS APN, username, and password.
George windoge T 3:7007491a7f28 191 // You might need to do this to access your network's GPRS/data
George windoge T 3:7007491a7f28 192 // network. Contact your provider for the exact APN, username,
George windoge T 3:7007491a7f28 193 // and password values. Username and password are optional and
George windoge T 3:7007491a7f28 194 // can be removed, but APN is required.
George windoge T 3:7007491a7f28 195 //fona.setGPRSNetworkSettings("your APN", "your username", "your password");
George windoge T 3:7007491a7f28 196 //fona.setGPRSNetworkSettings("web.pt.lu", "", "");
George windoge T 3:7007491a7f28 197
George windoge T 3:7007491a7f28 198 // Optionally configure HTTP gets to follow redirects over SSL.
George windoge T 3:7007491a7f28 199 // Default is not to follow SSL redirects, however if you uncomment
George windoge T 3:7007491a7f28 200 // the following line then redirects over SSL will be followed.
George windoge T 3:7007491a7f28 201 //fona.setHTTPSRedirect(true);
George windoge T 3:7007491a7f28 202
George windoge T 3:7007491a7f28 203 //printMenu();
George windoge T 3:7007491a7f28 204
George windoge T 6:15fe38e607ed 205 wait(1);
George windoge T 6:15fe38e607ed 206 //set up the time
George windoge T 6:15fe38e607ed 207 if (!fona.enableNetworkTimeSync(true)){
George windoge T 6:15fe38e607ed 208 uLCD.printf("NA\r\n");
George windoge T 6:15fe38e607ed 209 }
George windoge T 6:15fe38e607ed 210
George windoge T 6:15fe38e607ed 211 printTopLine();
George windoge T 6:15fe38e607ed 212
George windoge T 6:15fe38e607ed 213
George windoge T 6:15fe38e607ed 214 while (true) {
George windoge T 6:15fe38e607ed 215 switch(myTopMenu){
George windoge T 6:15fe38e607ed 216 case PHONE: {
George windoge T 6:15fe38e607ed 217 uLCD.cls();
George windoge T 6:15fe38e607ed 218 printTopLine();
George windoge T 6:15fe38e607ed 219 uLCD.locate(3,1);
George windoge T 6:15fe38e607ed 220 uLCD.printf("PHONE");
George windoge T 6:15fe38e607ed 221 break;
George windoge T 6:15fe38e607ed 222 }
George windoge T 6:15fe38e607ed 223 case SMS:{
George windoge T 6:15fe38e607ed 224 uLCD.cls();
George windoge T 6:15fe38e607ed 225 printTopLine();
George windoge T 6:15fe38e607ed 226 uLCD.locate(3,1);
George windoge T 6:15fe38e607ed 227 uLCD.printf("SMS");
George windoge T 6:15fe38e607ed 228 break;
George windoge T 6:15fe38e607ed 229 }
George windoge T 6:15fe38e607ed 230 case RADIO: {
George windoge T 6:15fe38e607ed 231 uLCD.cls();
George windoge T 6:15fe38e607ed 232 printTopLine();
George windoge T 6:15fe38e607ed 233 uLCD.locate(3,1);
George windoge T 6:15fe38e607ed 234 uLCD.printf("RADIO");
George windoge T 6:15fe38e607ed 235 break;
George windoge T 6:15fe38e607ed 236 }
George windoge T 6:15fe38e607ed 237
George windoge T 6:15fe38e607ed 238
George windoge T 6:15fe38e607ed 239 }
George windoge T 6:15fe38e607ed 240 }
George windoge T 6:15fe38e607ed 241
George windoge T 6:15fe38e607ed 242
George windoge T 6:15fe38e607ed 243
George windoge T 6:15fe38e607ed 244
George windoge T 6:15fe38e607ed 245 /*
George windoge T 3:7007491a7f28 246 while (true) {
George windoge T 3:7007491a7f28 247 pcSerial.printf("FONA> ");
George windoge T 3:7007491a7f28 248 // if nothing is available on the pcSearial port but there is something on the fona serial, then print it (flush it) to the pc Serial
George windoge T 3:7007491a7f28 249 while (! pcSerial.readable() ) {
George windoge T 3:7007491a7f28 250 if (fona.readable()) {
George windoge T 3:7007491a7f28 251 pcSerial.putc(fona.getc());
George windoge T 3:7007491a7f28 252 }
George windoge T 3:7007491a7f28 253 }
George windoge T 3:7007491a7f28 254
George windoge T 3:7007491a7f28 255 // get the input command from the terminal
George windoge T 3:7007491a7f28 256 char command = pcSerial.getc();
George windoge T 3:7007491a7f28 257 pcSerial.printf("%c\r\n", command); //loops back to COM port
George windoge T 3:7007491a7f28 258
George windoge T 3:7007491a7f28 259
George windoge T 3:7007491a7f28 260 switch (command) {
George windoge T 3:7007491a7f28 261 case '?': {
George windoge T 3:7007491a7f28 262 printMenu();
George windoge T 3:7007491a7f28 263 break;
George windoge T 3:7007491a7f28 264 }
George windoge T 3:7007491a7f28 265
George windoge T 3:7007491a7f28 266 case 'a': {
George windoge T 3:7007491a7f28 267 // read the ADC
George windoge T 3:7007491a7f28 268 uint16_t adc;
George windoge T 3:7007491a7f28 269 if (! fona.getADCVoltage(&adc)) {
George windoge T 3:7007491a7f28 270 pcSerial.printf("Failed to read ADC\r\n");
George windoge T 3:7007491a7f28 271 } else {
George windoge T 3:7007491a7f28 272 pcSerial.printf("ADC = %d mV\r\n", adc);
George windoge T 3:7007491a7f28 273 }
George windoge T 3:7007491a7f28 274 break;
George windoge T 3:7007491a7f28 275 }
George windoge T 3:7007491a7f28 276
George windoge T 3:7007491a7f28 277 case 'b': {
George windoge T 3:7007491a7f28 278 // read the battery voltage and percentage
George windoge T 3:7007491a7f28 279 uint16_t vbat;
George windoge T 3:7007491a7f28 280 if (! fona.getBattVoltage(&vbat)) {
George windoge T 3:7007491a7f28 281 pcSerial.printf("Failed to read Batt\r\n");
George windoge T 3:7007491a7f28 282 } else {
George windoge T 3:7007491a7f28 283 pcSerial.printf("VBat = %d mV\r\n", vbat);
George windoge T 3:7007491a7f28 284 }
George windoge T 3:7007491a7f28 285
George windoge T 3:7007491a7f28 286 if (! fona.getBattPercent(&vbat)) {
George windoge T 3:7007491a7f28 287 pcSerial.printf("Failed to read Batt\r\n");
George windoge T 3:7007491a7f28 288 } else {
George windoge T 3:7007491a7f28 289 pcSerial.printf("VPct = %d%%\r\n", vbat);
George windoge T 3:7007491a7f28 290 }
George windoge T 3:7007491a7f28 291
George windoge T 3:7007491a7f28 292 break;
George windoge T 3:7007491a7f28 293 }
George windoge T 3:7007491a7f28 294
George windoge T 3:7007491a7f28 295 case 'U': {
George windoge T 3:7007491a7f28 296 // Unlock the SIM with a PIN code
George windoge T 3:7007491a7f28 297 char PIN[5];
George windoge T 3:7007491a7f28 298 flushSerial();
George windoge T 3:7007491a7f28 299 pcSerial.printf("Enter 4-digit PIN\r\n");
George windoge T 3:7007491a7f28 300 readline(PIN, 3);
George windoge T 3:7007491a7f28 301 pcSerial.printf("%s\r\n", PIN);
George windoge T 3:7007491a7f28 302 pcSerial.printf("Unlocking SIM card: ");
George windoge T 3:7007491a7f28 303 if (! fona.unlockSIM(PIN)) {
George windoge T 3:7007491a7f28 304 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 305 } else {
George windoge T 3:7007491a7f28 306 pcSerial.printf("OK!\r\n");
George windoge T 3:7007491a7f28 307 }
George windoge T 3:7007491a7f28 308 break;
George windoge T 3:7007491a7f28 309 }
George windoge T 3:7007491a7f28 310
George windoge T 3:7007491a7f28 311 case 'C': {
George windoge T 3:7007491a7f28 312 // read the CCID
George windoge T 3:7007491a7f28 313 fona.getSIMCCID(replybuffer); // make sure replybuffer is at least 21 bytes!
George windoge T 3:7007491a7f28 314 pcSerial.printf("SIM CCID = %s\r\n", replybuffer);
George windoge T 3:7007491a7f28 315 break;
George windoge T 3:7007491a7f28 316 }
George windoge T 3:7007491a7f28 317
George windoge T 3:7007491a7f28 318 case 'i': {
George windoge T 3:7007491a7f28 319 // read the RSSI
George windoge T 3:7007491a7f28 320 uint8_t n = fona.getRSSI();
George windoge T 3:7007491a7f28 321 int8_t r = 0;
George windoge T 3:7007491a7f28 322
George windoge T 3:7007491a7f28 323 pcSerial.printf("RSSI = %d: ", n);
George windoge T 3:7007491a7f28 324 if (n == 0) r = -115;
George windoge T 3:7007491a7f28 325 if (n == 1) r = -111;
George windoge T 3:7007491a7f28 326 if (n == 31) r = -52;
George windoge T 3:7007491a7f28 327 if ((n >= 2) && (n <= 30)) {
George windoge T 3:7007491a7f28 328 r = map(n, 2, 30, -110, -54);
George windoge T 3:7007491a7f28 329 }
George windoge T 3:7007491a7f28 330 pcSerial.printf("%d dBm\r\n", r);
George windoge T 3:7007491a7f28 331
George windoge T 3:7007491a7f28 332 break;
George windoge T 3:7007491a7f28 333 }
George windoge T 3:7007491a7f28 334
George windoge T 3:7007491a7f28 335 case 'n': {
George windoge T 3:7007491a7f28 336 // read the network/cellular status
George windoge T 3:7007491a7f28 337 uint8_t n = fona.getNetworkStatus();
George windoge T 3:7007491a7f28 338 pcSerial.printf("Network status %d: ", n);
George windoge T 3:7007491a7f28 339 if (n == 0) pcSerial.printf("Not registered\r\n");
George windoge T 3:7007491a7f28 340 if (n == 1) pcSerial.printf("Registered (home)\r\n");
George windoge T 3:7007491a7f28 341 if (n == 2) pcSerial.printf("Not registered (searching)\r\n");
George windoge T 3:7007491a7f28 342 if (n == 3) pcSerial.printf("Denied\r\n");
George windoge T 3:7007491a7f28 343 if (n == 4) pcSerial.printf("Unknown\r\n");
George windoge T 3:7007491a7f28 344 if (n == 5) pcSerial.printf("Registered roaming\r\n");
George windoge T 3:7007491a7f28 345 break;
George windoge T 3:7007491a7f28 346 }
George windoge T 3:7007491a7f28 347
George windoge T 3:7007491a7f28 348 /*** Audio ***/
George windoge T 6:15fe38e607ed 349 /*
George windoge T 3:7007491a7f28 350 case 'v': {
George windoge T 3:7007491a7f28 351 // set volume
George windoge T 3:7007491a7f28 352 flushSerial();
George windoge T 3:7007491a7f28 353 pcSerial.printf("Set Vol %%");
George windoge T 3:7007491a7f28 354 uint8_t vol = readnumber();
George windoge T 3:7007491a7f28 355 pcSerial.printf("\r\n");
George windoge T 3:7007491a7f28 356 if (! fona.setVolume(vol)) {
George windoge T 3:7007491a7f28 357 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 358 } else {
George windoge T 3:7007491a7f28 359 pcSerial.printf("OK!\r\n");
George windoge T 3:7007491a7f28 360 }
George windoge T 3:7007491a7f28 361 break;
George windoge T 3:7007491a7f28 362 }
George windoge T 3:7007491a7f28 363
George windoge T 3:7007491a7f28 364 case 'V': {
George windoge T 3:7007491a7f28 365 uint8_t v = fona.getVolume();
George windoge T 3:7007491a7f28 366 pcSerial.printf("%d%%\r\n", v);
George windoge T 3:7007491a7f28 367
George windoge T 3:7007491a7f28 368 break;
George windoge T 3:7007491a7f28 369 }
George windoge T 3:7007491a7f28 370
George windoge T 3:7007491a7f28 371 case 'H': {
George windoge T 3:7007491a7f28 372 // Set Headphone output
George windoge T 3:7007491a7f28 373 if (! fona.setAudio(FONA_HEADSETAUDIO)) {
George windoge T 3:7007491a7f28 374 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 375 } else {
George windoge T 3:7007491a7f28 376 pcSerial.printf("OK!\r\n");
George windoge T 3:7007491a7f28 377 }
George windoge T 3:7007491a7f28 378 fona.setMicVolume(FONA_HEADSETAUDIO, 15);
George windoge T 3:7007491a7f28 379 break;
George windoge T 3:7007491a7f28 380 }
George windoge T 3:7007491a7f28 381 case 'e': {
George windoge T 3:7007491a7f28 382 // Set External output
George windoge T 3:7007491a7f28 383 if (! fona.setAudio(FONA_EXTAUDIO)) {
George windoge T 3:7007491a7f28 384 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 385 } else {
George windoge T 3:7007491a7f28 386 pcSerial.printf("OK!\r\n");
George windoge T 3:7007491a7f28 387 }
George windoge T 3:7007491a7f28 388
George windoge T 3:7007491a7f28 389 fona.setMicVolume(FONA_EXTAUDIO, 10);
George windoge T 3:7007491a7f28 390 break;
George windoge T 3:7007491a7f28 391 }
George windoge T 3:7007491a7f28 392
George windoge T 3:7007491a7f28 393 case 'T': {
George windoge T 3:7007491a7f28 394 // play tone
George windoge T 3:7007491a7f28 395 flushSerial();
George windoge T 3:7007491a7f28 396 pcSerial.printf("Play tone #");
George windoge T 3:7007491a7f28 397 uint8_t kittone = readnumber();
George windoge T 3:7007491a7f28 398 pcSerial.printf("\r\n");
George windoge T 3:7007491a7f28 399 // play for 1 second (1000 ms)
George windoge T 3:7007491a7f28 400 if (! fona.playToolkitTone(kittone, 1000)) {
George windoge T 3:7007491a7f28 401 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 402 } else {
George windoge T 3:7007491a7f28 403 pcSerial.printf("OK!\r\n");
George windoge T 3:7007491a7f28 404 }
George windoge T 3:7007491a7f28 405 break;
George windoge T 3:7007491a7f28 406 }
George windoge T 3:7007491a7f28 407
George windoge T 3:7007491a7f28 408 /*** FM Radio ***/
George windoge T 6:15fe38e607ed 409 /*
George windoge T 3:7007491a7f28 410 case 'f': {
George windoge T 3:7007491a7f28 411 // get freq
George windoge T 3:7007491a7f28 412 flushSerial();
George windoge T 3:7007491a7f28 413 pcSerial.printf("FM Freq (eg 1011 == 101.1 MHz): ");
George windoge T 3:7007491a7f28 414 uint16_t station = readnumber();
George windoge T 3:7007491a7f28 415 pcSerial.printf("\r\n");
George windoge T 3:7007491a7f28 416 // FM radio ON using headset
George windoge T 3:7007491a7f28 417 if (fona.FMradio(true, FONA_HEADSETAUDIO)) {
George windoge T 3:7007491a7f28 418 pcSerial.printf("Opened\r\n");
George windoge T 3:7007491a7f28 419 }
George windoge T 3:7007491a7f28 420 if (! fona.tuneFMradio(station)) {
George windoge T 3:7007491a7f28 421 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 422 } else {
George windoge T 3:7007491a7f28 423 pcSerial.printf("Tuned\r\n");
George windoge T 3:7007491a7f28 424 }
George windoge T 3:7007491a7f28 425 break;
George windoge T 3:7007491a7f28 426 }
George windoge T 3:7007491a7f28 427 case 'F': {
George windoge T 3:7007491a7f28 428 // FM radio off
George windoge T 3:7007491a7f28 429 if (! fona.FMradio(false)) {
George windoge T 3:7007491a7f28 430 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 431 } else {
George windoge T 3:7007491a7f28 432 pcSerial.printf("OK!\r\n");
George windoge T 3:7007491a7f28 433 }
George windoge T 3:7007491a7f28 434 break;
George windoge T 3:7007491a7f28 435 }
George windoge T 3:7007491a7f28 436 case 'm': {
George windoge T 3:7007491a7f28 437 // Set FM volume.
George windoge T 3:7007491a7f28 438 flushSerial();
George windoge T 3:7007491a7f28 439 pcSerial.printf("Set FM Vol [0-6]:");
George windoge T 3:7007491a7f28 440 uint8_t vol = readnumber();
George windoge T 3:7007491a7f28 441 pcSerial.printf("\r\n");
George windoge T 3:7007491a7f28 442 if (!fona.setFMVolume(vol)) {
George windoge T 3:7007491a7f28 443 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 444 } else {
George windoge T 3:7007491a7f28 445 pcSerial.printf("OK!\r\n");
George windoge T 3:7007491a7f28 446 }
George windoge T 3:7007491a7f28 447 break;
George windoge T 3:7007491a7f28 448 }
George windoge T 3:7007491a7f28 449 case 'M': {
George windoge T 3:7007491a7f28 450 // Get FM volume.
George windoge T 3:7007491a7f28 451 int8_t fmvol = fona.getFMVolume();
George windoge T 3:7007491a7f28 452 if (fmvol < 0) {
George windoge T 3:7007491a7f28 453 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 454 } else {
George windoge T 3:7007491a7f28 455 pcSerial.printf("FM volume: %d\r\n", fmvol);
George windoge T 3:7007491a7f28 456 }
George windoge T 3:7007491a7f28 457 break;
George windoge T 3:7007491a7f28 458 }
George windoge T 3:7007491a7f28 459 case 'q': {
George windoge T 3:7007491a7f28 460 // Get FM station signal level (in decibels).
George windoge T 3:7007491a7f28 461 flushSerial();
George windoge T 3:7007491a7f28 462 pcSerial.printf("FM Freq (eg 1011 == 101.1 MHz): ");
George windoge T 3:7007491a7f28 463 uint16_t station = readnumber();
George windoge T 3:7007491a7f28 464 pcSerial.printf("\r\n");
George windoge T 3:7007491a7f28 465 int8_t level = fona.getFMSignalLevel(station);
George windoge T 3:7007491a7f28 466 if (level < 0) {
George windoge T 3:7007491a7f28 467 pcSerial.printf("Failed! Make sure FM radio is on (tuned to station).\r\n");
George windoge T 3:7007491a7f28 468 } else {
George windoge T 3:7007491a7f28 469 pcSerial.printf("Signal level (dB): %d\r\n", level);
George windoge T 3:7007491a7f28 470 }
George windoge T 3:7007491a7f28 471 break;
George windoge T 3:7007491a7f28 472 }
George windoge T 3:7007491a7f28 473
George windoge T 3:7007491a7f28 474 /*** PWM ***/
George windoge T 6:15fe38e607ed 475 /*
George windoge T 3:7007491a7f28 476 case 'P': {
George windoge T 3:7007491a7f28 477 // PWM Buzzer output @ 2KHz max
George windoge T 3:7007491a7f28 478 flushSerial();
George windoge T 3:7007491a7f28 479 pcSerial.printf("PWM Freq, 0 = Off, (1-2000): ");
George windoge T 3:7007491a7f28 480 uint16_t freq = readnumber();
George windoge T 3:7007491a7f28 481 pcSerial.printf("\r\n");
George windoge T 3:7007491a7f28 482 if (! fona.setPWM(freq)) {
George windoge T 3:7007491a7f28 483 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 484 } else {
George windoge T 3:7007491a7f28 485 pcSerial.printf("OK!\r\n");
George windoge T 3:7007491a7f28 486 }
George windoge T 3:7007491a7f28 487 break;
George windoge T 3:7007491a7f28 488 }
George windoge T 3:7007491a7f28 489
George windoge T 3:7007491a7f28 490 /*** Call ***/
George windoge T 6:15fe38e607ed 491 /*
George windoge T 3:7007491a7f28 492 case 'c': {
George windoge T 3:7007491a7f28 493 // call a phone!
George windoge T 3:7007491a7f28 494 char number[30];
George windoge T 3:7007491a7f28 495 flushSerial();
George windoge T 3:7007491a7f28 496 pcSerial.printf("Call #");
George windoge T 3:7007491a7f28 497 readline(number, 30);
George windoge T 3:7007491a7f28 498 pcSerial.printf("\r\n");
George windoge T 3:7007491a7f28 499 pcSerial.printf("Calling %s\r\n", number);
George windoge T 3:7007491a7f28 500 if (!fona.callPhone(number)) {
George windoge T 3:7007491a7f28 501 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 502 } else {
George windoge T 3:7007491a7f28 503 pcSerial.printf("Sent!\r\n");
George windoge T 3:7007491a7f28 504 }
George windoge T 3:7007491a7f28 505
George windoge T 3:7007491a7f28 506 break;
George windoge T 3:7007491a7f28 507 }
George windoge T 3:7007491a7f28 508 case 'h': {
George windoge T 3:7007491a7f28 509 // hang up!
George windoge T 3:7007491a7f28 510 if (! fona.hangUp()) {
George windoge T 3:7007491a7f28 511 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 512 } else {
George windoge T 3:7007491a7f28 513 pcSerial.printf("OK!\r\n");
George windoge T 3:7007491a7f28 514 }
George windoge T 3:7007491a7f28 515 break;
George windoge T 3:7007491a7f28 516 }
George windoge T 3:7007491a7f28 517
George windoge T 3:7007491a7f28 518 case 'p': {
George windoge T 3:7007491a7f28 519 // pick up!
George windoge T 3:7007491a7f28 520 if (! fona.pickUp()) {
George windoge T 3:7007491a7f28 521 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 522 } else {
George windoge T 3:7007491a7f28 523 pcSerial.printf("OK!\r\n");
George windoge T 3:7007491a7f28 524 }
George windoge T 3:7007491a7f28 525 break;
George windoge T 3:7007491a7f28 526 }
George windoge T 3:7007491a7f28 527
George windoge T 3:7007491a7f28 528 /*** SMS ***/
George windoge T 6:15fe38e607ed 529 /*
George windoge T 3:7007491a7f28 530 case 'N': {
George windoge T 3:7007491a7f28 531 // read the number of SMS's!
George windoge T 3:7007491a7f28 532 int8_t smsnum = fona.getNumSMS();
George windoge T 3:7007491a7f28 533 if (smsnum < 0) {
George windoge T 3:7007491a7f28 534 pcSerial.printf("Could not read # SMS\r\n");
George windoge T 3:7007491a7f28 535 } else {
George windoge T 3:7007491a7f28 536 pcSerial.printf("%d SMS's on SIM card!\r\n", smsnum);
George windoge T 3:7007491a7f28 537 }
George windoge T 3:7007491a7f28 538 break;
George windoge T 3:7007491a7f28 539 }
George windoge T 3:7007491a7f28 540 case 'r': {
George windoge T 3:7007491a7f28 541 // read an SMS
George windoge T 3:7007491a7f28 542 flushSerial();
George windoge T 3:7007491a7f28 543 pcSerial.printf("Read #");
George windoge T 3:7007491a7f28 544 uint8_t smsn = readnumber();
George windoge T 3:7007491a7f28 545 pcSerial.printf("\r\nReading SMS #%d\r\n", smsn);
George windoge T 3:7007491a7f28 546
George windoge T 3:7007491a7f28 547 // Retrieve SMS sender address/phone number.
George windoge T 3:7007491a7f28 548 if (! fona.getSMSSender(smsn, replybuffer, 250)) {
George windoge T 3:7007491a7f28 549 pcSerial.printf("Failed!\r\n");
George windoge T 3:7007491a7f28 550 break;
George windoge T 3:7007491a7f28 551 }
George windoge T 3:7007491a7f28 552 pcSerial.printf("FROM: %s\r\n", replybuffer);
George windoge T 3:7007491a7f28 553
George windoge T 3:7007491a7f28 554 // Retrieve SMS value.
George windoge T 3:7007491a7f28 555 uint16_t smslen;
George windoge T 3:7007491a7f28 556 if (! fona.readSMS(smsn, replybuffer, 250, &smslen)) { // pass in buffer and max len!
George windoge T 3:7007491a7f28 557 pcSerial.printf("Failed!\r\n");
George windoge T 3:7007491a7f28 558 break;
George windoge T 3:7007491a7f28 559 }
George windoge T 3:7007491a7f28 560 pcSerial.printf("***** SMS #%d (%d) bytes *****\r\n", smsn, smslen);
George windoge T 3:7007491a7f28 561 pcSerial.printf("%s\r\n", replybuffer);
George windoge T 3:7007491a7f28 562 pcSerial.printf("*****\r\n");
George windoge T 3:7007491a7f28 563
George windoge T 3:7007491a7f28 564 break;
George windoge T 3:7007491a7f28 565 }
George windoge T 3:7007491a7f28 566 case 'R': {
George windoge T 3:7007491a7f28 567 // read all SMS
George windoge T 3:7007491a7f28 568 int8_t smsnum = fona.getNumSMS();
George windoge T 3:7007491a7f28 569 uint16_t smslen;
George windoge T 3:7007491a7f28 570 for (int8_t smsn=1; smsn<=smsnum; smsn++) {
George windoge T 3:7007491a7f28 571 pcSerial.printf("\r\nReading SMS #%d\r\n", smsn);
George windoge T 3:7007491a7f28 572 if (!fona.readSMS(smsn, replybuffer, 250, &smslen)) { // pass in buffer and max len!
George windoge T 3:7007491a7f28 573 pcSerial.printf("Failed!\r\n");
George windoge T 3:7007491a7f28 574 break;
George windoge T 3:7007491a7f28 575 }
George windoge T 3:7007491a7f28 576 // if the length is zero, its a special case where the index number is higher
George windoge T 3:7007491a7f28 577 // so increase the max we'll look at!
George windoge T 3:7007491a7f28 578 if (smslen == 0) {
George windoge T 3:7007491a7f28 579 pcSerial.printf("[empty slot]\r\n");
George windoge T 3:7007491a7f28 580 smsnum++;
George windoge T 3:7007491a7f28 581 continue;
George windoge T 3:7007491a7f28 582 }
George windoge T 3:7007491a7f28 583
George windoge T 3:7007491a7f28 584 pcSerial.printf("***** SMS #%d (%d) bytes *****\r\n", smsn, smslen);
George windoge T 3:7007491a7f28 585 pcSerial.printf("%s\r\n", replybuffer);
George windoge T 3:7007491a7f28 586 pcSerial.printf("*****\r\n");
George windoge T 3:7007491a7f28 587 }
George windoge T 3:7007491a7f28 588 break;
George windoge T 3:7007491a7f28 589 }
George windoge T 3:7007491a7f28 590
George windoge T 3:7007491a7f28 591 case 'd': {
George windoge T 3:7007491a7f28 592 // delete an SMS
George windoge T 3:7007491a7f28 593 flushSerial();
George windoge T 3:7007491a7f28 594 pcSerial.printf("Delete #");
George windoge T 3:7007491a7f28 595 uint8_t smsn = readnumber();
George windoge T 3:7007491a7f28 596
George windoge T 3:7007491a7f28 597 pcSerial.printf("\r\nDeleting SMS #%d\r\n", smsn);
George windoge T 3:7007491a7f28 598 if (fona.deleteSMS(smsn)) {
George windoge T 3:7007491a7f28 599 pcSerial.printf("OK!\r\n");
George windoge T 3:7007491a7f28 600 } else {
George windoge T 3:7007491a7f28 601 pcSerial.printf("Couldn't delete\r\n");
George windoge T 3:7007491a7f28 602 }
George windoge T 3:7007491a7f28 603 break;
George windoge T 3:7007491a7f28 604 }
George windoge T 3:7007491a7f28 605
George windoge T 3:7007491a7f28 606 case 's': {
George windoge T 3:7007491a7f28 607 // send an SMS!
George windoge T 3:7007491a7f28 608 char sendto[21], message[141];
George windoge T 3:7007491a7f28 609 flushSerial();
George windoge T 3:7007491a7f28 610 pcSerial.printf("Send to #");
George windoge T 3:7007491a7f28 611 readline(sendto, 20);
George windoge T 3:7007491a7f28 612 pcSerial.printf("%s\r\n", sendto);
George windoge T 3:7007491a7f28 613 pcSerial.printf("Type out one-line message (140 char): ");
George windoge T 3:7007491a7f28 614 readline(message, 140);
George windoge T 3:7007491a7f28 615 pcSerial.printf("%s\r\n", message);
George windoge T 3:7007491a7f28 616 if (!fona.sendSMS(sendto, message)) {
George windoge T 3:7007491a7f28 617 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 618 } else {
George windoge T 3:7007491a7f28 619 pcSerial.printf("Sent!\r\n");
George windoge T 3:7007491a7f28 620 }
George windoge T 3:7007491a7f28 621
George windoge T 3:7007491a7f28 622 break;
George windoge T 3:7007491a7f28 623 }
George windoge T 3:7007491a7f28 624
George windoge T 3:7007491a7f28 625 /*** Time ***/
George windoge T 6:15fe38e607ed 626 /*
George windoge T 3:7007491a7f28 627 case 'y': {
George windoge T 3:7007491a7f28 628 // enable network time sync
George windoge T 3:7007491a7f28 629 if (!fona.enableNetworkTimeSync(true))
George windoge T 3:7007491a7f28 630 pcSerial.printf("Failed to enable\r\n");
George windoge T 3:7007491a7f28 631 break;
George windoge T 3:7007491a7f28 632 }
George windoge T 3:7007491a7f28 633
George windoge T 3:7007491a7f28 634 case 'Y': {
George windoge T 3:7007491a7f28 635 // enable NTP time sync
George windoge T 3:7007491a7f28 636 if (!fona.enableNTPTimeSync(true, "pool.ntp.org"))
George windoge T 3:7007491a7f28 637 pcSerial.printf("Failed to enable\r\n");
George windoge T 3:7007491a7f28 638 break;
George windoge T 3:7007491a7f28 639 }
George windoge T 3:7007491a7f28 640
George windoge T 3:7007491a7f28 641 case 't': {
George windoge T 3:7007491a7f28 642 // read the time
George windoge T 3:7007491a7f28 643 char buffer[23];
George windoge T 3:7007491a7f28 644
George windoge T 3:7007491a7f28 645 fona.getTime(buffer, 23); // make sure replybuffer is at least 23 bytes!
George windoge T 3:7007491a7f28 646 pcSerial.printf("Time = %s\r\n", buffer);
George windoge T 3:7007491a7f28 647 break;
George windoge T 3:7007491a7f28 648 }
George windoge T 3:7007491a7f28 649
George windoge T 3:7007491a7f28 650 /*********************************** GPS (SIM808 only) */
George windoge T 6:15fe38e607ed 651 /*
George windoge T 3:7007491a7f28 652 case 'o': {
George windoge T 3:7007491a7f28 653 // turn GPS off
George windoge T 3:7007491a7f28 654 if (!fona.enableGPS(false))
George windoge T 3:7007491a7f28 655 pcSerial.printf("Failed to turn off\r\n");
George windoge T 3:7007491a7f28 656 break;
George windoge T 3:7007491a7f28 657 }
George windoge T 3:7007491a7f28 658 case 'O': {
George windoge T 3:7007491a7f28 659 // turn GPS on
George windoge T 3:7007491a7f28 660 if (!fona.enableGPS(true))
George windoge T 3:7007491a7f28 661 pcSerial.printf("Failed to turn on\r\n");
George windoge T 3:7007491a7f28 662 break;
George windoge T 3:7007491a7f28 663 }
George windoge T 3:7007491a7f28 664 case 'x': {
George windoge T 3:7007491a7f28 665 int8_t stat;
George windoge T 3:7007491a7f28 666 // check GPS fix
George windoge T 3:7007491a7f28 667 stat = fona.GPSstatus();
George windoge T 3:7007491a7f28 668 if (stat < 0)
George windoge T 3:7007491a7f28 669 pcSerial.printf("Failed to query\r\n");
George windoge T 3:7007491a7f28 670 if (stat == 0) pcSerial.printf("GPS off\r\n");
George windoge T 3:7007491a7f28 671 if (stat == 1) pcSerial.printf("No fix\r\n");
George windoge T 3:7007491a7f28 672 if (stat == 2) pcSerial.printf("2D fix\r\n");
George windoge T 3:7007491a7f28 673 if (stat == 3) pcSerial.printf("3D fix\r\n");
George windoge T 3:7007491a7f28 674 break;
George windoge T 3:7007491a7f28 675 }
George windoge T 3:7007491a7f28 676
George windoge T 3:7007491a7f28 677 case 'L': {
George windoge T 3:7007491a7f28 678 // check for GPS location
George windoge T 3:7007491a7f28 679 char gpsdata[80];
George windoge T 3:7007491a7f28 680 fona.getGPS(0, gpsdata, 80);
George windoge T 3:7007491a7f28 681 pcSerial.printf("Reply in format: mode,longitude,latitude,altitude,utctime(yyyymmddHHMMSS),ttff,satellites,speed,course\r\n");
George windoge T 3:7007491a7f28 682 pcSerial.printf("%s\r\n", gpsdata);
George windoge T 3:7007491a7f28 683
George windoge T 3:7007491a7f28 684 break;
George windoge T 3:7007491a7f28 685 }
George windoge T 3:7007491a7f28 686
George windoge T 3:7007491a7f28 687 case 'E': {
George windoge T 3:7007491a7f28 688 flushSerial();
George windoge T 3:7007491a7f28 689 pcSerial.printf("GPS NMEA output sentences (0 = off, 34 = RMC+GGA, 255 = all)\r\n");
George windoge T 3:7007491a7f28 690 uint8_t nmeaout = readnumber();
George windoge T 3:7007491a7f28 691
George windoge T 3:7007491a7f28 692 // turn on NMEA output
George windoge T 3:7007491a7f28 693 fona.enableGPSNMEA(nmeaout);
George windoge T 3:7007491a7f28 694
George windoge T 3:7007491a7f28 695 break;
George windoge T 3:7007491a7f28 696 }
George windoge T 3:7007491a7f28 697
George windoge T 3:7007491a7f28 698 /*********************************** GPRS */
George windoge T 6:15fe38e607ed 699 /*
George windoge T 3:7007491a7f28 700 case 'g': {
George windoge T 3:7007491a7f28 701 // turn GPRS off
George windoge T 3:7007491a7f28 702 if (!fona.enableGPRS(false))
George windoge T 3:7007491a7f28 703 pcSerial.printf("Failed to turn off\r\n");
George windoge T 3:7007491a7f28 704 break;
George windoge T 3:7007491a7f28 705 }
George windoge T 3:7007491a7f28 706 case 'G': {
George windoge T 3:7007491a7f28 707 // turn GPRS on
George windoge T 3:7007491a7f28 708 if (!fona.enableGPRS(true))
George windoge T 3:7007491a7f28 709 pcSerial.printf("Failed to turn on\r\n");
George windoge T 3:7007491a7f28 710 break;
George windoge T 3:7007491a7f28 711 }
George windoge T 3:7007491a7f28 712 case 'l': {
George windoge T 3:7007491a7f28 713 // check for GSMLOC (requires GPRS)
George windoge T 3:7007491a7f28 714 uint16_t returncode;
George windoge T 3:7007491a7f28 715
George windoge T 3:7007491a7f28 716 if (!fona.getGSMLoc(&returncode, replybuffer, 250))
George windoge T 3:7007491a7f28 717 pcSerial.printf("Failed!\r\n");
George windoge T 3:7007491a7f28 718 if (returncode == 0) {
George windoge T 3:7007491a7f28 719 pcSerial.printf("%s\r\n", replybuffer);
George windoge T 3:7007491a7f28 720 } else {
George windoge T 3:7007491a7f28 721 pcSerial.printf("Fail code #%d\r\n", returncode);
George windoge T 3:7007491a7f28 722 }
George windoge T 3:7007491a7f28 723
George windoge T 3:7007491a7f28 724 break;
George windoge T 3:7007491a7f28 725 }
George windoge T 3:7007491a7f28 726 case 'w': {
George windoge T 3:7007491a7f28 727 // read website URL
George windoge T 3:7007491a7f28 728 uint16_t statuscode;
George windoge T 3:7007491a7f28 729 int16_t length;
George windoge T 3:7007491a7f28 730 char url[80];
George windoge T 3:7007491a7f28 731
George windoge T 3:7007491a7f28 732 flushSerial();
George windoge T 3:7007491a7f28 733 pcSerial.printf("NOTE: in beta! Use small webpages to read!\r\n");
George windoge T 3:7007491a7f28 734 pcSerial.printf("URL to read (e.g. www.adafruit.com/testwifi/index.html):\r\n");
George windoge T 3:7007491a7f28 735 pcSerial.printf("http://"); readline(url, 79);
George windoge T 3:7007491a7f28 736 pcSerial.printf("%s\r\n", url);
George windoge T 3:7007491a7f28 737
George windoge T 3:7007491a7f28 738 pcSerial.printf("****\r\n");
George windoge T 3:7007491a7f28 739 if (!fona.HTTP_GET_start(url, &statuscode, (uint16_t *)&length)) {
George windoge T 3:7007491a7f28 740 pcSerial.printf("Failed!\r\n");
George windoge T 3:7007491a7f28 741 break;
George windoge T 3:7007491a7f28 742 }
George windoge T 3:7007491a7f28 743 while (length > 0) {
George windoge T 3:7007491a7f28 744 while (fona.readable()) {
George windoge T 3:7007491a7f28 745 char c = fona.getc();
George windoge T 3:7007491a7f28 746 pcSerial.putc(c);
George windoge T 3:7007491a7f28 747 length--;
George windoge T 3:7007491a7f28 748 if (! length) break;
George windoge T 3:7007491a7f28 749 }
George windoge T 3:7007491a7f28 750 }
George windoge T 3:7007491a7f28 751 pcSerial.printf("\r\n****\r\n");
George windoge T 3:7007491a7f28 752 fona.HTTP_GET_end();
George windoge T 3:7007491a7f28 753 break;
George windoge T 3:7007491a7f28 754 }
George windoge T 3:7007491a7f28 755
George windoge T 3:7007491a7f28 756 case 'W': {
George windoge T 3:7007491a7f28 757 // Post data to website
George windoge T 3:7007491a7f28 758 uint16_t statuscode;
George windoge T 3:7007491a7f28 759 int16_t length;
George windoge T 3:7007491a7f28 760 char url[80];
George windoge T 3:7007491a7f28 761 char data[80];
George windoge T 3:7007491a7f28 762
George windoge T 3:7007491a7f28 763 flushSerial();
George windoge T 3:7007491a7f28 764 pcSerial.printf("NOTE: in beta! Use simple websites to post!\r\n");
George windoge T 3:7007491a7f28 765 pcSerial.printf("URL to post (e.g. httpbin.org/post):\r\n");
George windoge T 3:7007491a7f28 766 pcSerial.printf("http://"); readline(url, 79);
George windoge T 3:7007491a7f28 767 pcSerial.printf("%s\r\n", url);
George windoge T 3:7007491a7f28 768 pcSerial.printf("Data to post (e.g. \"foo\" or \"{\"simple\":\"json\"}\"):\r\n");
George windoge T 3:7007491a7f28 769 readline(data, 79);
George windoge T 3:7007491a7f28 770 pcSerial.printf("%s\r\n", data);
George windoge T 3:7007491a7f28 771
George windoge T 3:7007491a7f28 772 pcSerial.printf("****\r\n");
George windoge T 3:7007491a7f28 773 if (!fona.HTTP_POST_start(url, "text/plain", (uint8_t *) data, strlen(data), &statuscode, (uint16_t *)&length)) {
George windoge T 3:7007491a7f28 774 pcSerial.printf("Failed!\r\n");
George windoge T 3:7007491a7f28 775 break;
George windoge T 3:7007491a7f28 776 }
George windoge T 3:7007491a7f28 777 while (length > 0) {
George windoge T 3:7007491a7f28 778 while (fona.readable()) {
George windoge T 3:7007491a7f28 779 char c = fona.getc();
George windoge T 3:7007491a7f28 780 pcSerial.putc(c);
George windoge T 3:7007491a7f28 781 length--;
George windoge T 3:7007491a7f28 782 if (! length) break;
George windoge T 3:7007491a7f28 783 }
George windoge T 3:7007491a7f28 784 }
George windoge T 3:7007491a7f28 785 pcSerial.printf("\r\n****\r\n");
George windoge T 3:7007491a7f28 786 fona.HTTP_POST_end();
George windoge T 3:7007491a7f28 787 break;
George windoge T 3:7007491a7f28 788 }
George windoge T 3:7007491a7f28 789 /*****************************************/
George windoge T 6:15fe38e607ed 790 /*
George windoge T 3:7007491a7f28 791 case 'S': {
George windoge T 3:7007491a7f28 792 pcSerial.printf("Creating SERIAL TUBE\r\n");
George windoge T 3:7007491a7f28 793 while (1) {
George windoge T 3:7007491a7f28 794 while (pcSerial.readable()) {
George windoge T 3:7007491a7f28 795 wait_ms(1);
George windoge T 3:7007491a7f28 796 fona.putc(pcSerial.getc());
George windoge T 3:7007491a7f28 797 }
George windoge T 3:7007491a7f28 798 if (fona.readable()) {
George windoge T 3:7007491a7f28 799 pcSerial.putc(fona.getc());
George windoge T 3:7007491a7f28 800 }
George windoge T 3:7007491a7f28 801 }
George windoge T 3:7007491a7f28 802 }
George windoge T 3:7007491a7f28 803
George windoge T 3:7007491a7f28 804 default: {
George windoge T 3:7007491a7f28 805 pcSerial.printf("Unknown command\r\n");
George windoge T 3:7007491a7f28 806 printMenu();
George windoge T 3:7007491a7f28 807 break;
George windoge T 3:7007491a7f28 808 }
George windoge T 3:7007491a7f28 809 }
George windoge T 3:7007491a7f28 810 // flush input
George windoge T 3:7007491a7f28 811 flushSerial();
George windoge T 3:7007491a7f28 812 while (fona.readable()) {
George windoge T 3:7007491a7f28 813 pcSerial.putc(fona.getc());
George windoge T 3:7007491a7f28 814 }
George windoge T 3:7007491a7f28 815 }
George windoge T 3:7007491a7f28 816 }
George windoge T 6:15fe38e607ed 817 */
George windoge T 6:15fe38e607ed 818
George windoge T 6:15fe38e607ed 819 void printTopLine(void) {
George windoge T 6:15fe38e607ed 820
George windoge T 6:15fe38e607ed 821 uLCD.locate(1,5);
George windoge T 6:15fe38e607ed 822 // read the battery voltage and percentage
George windoge T 6:15fe38e607ed 823 uint16_t vbat;
George windoge T 6:15fe38e607ed 824 if (! fona.getBattPercent(&vbat)) {
George windoge T 6:15fe38e607ed 825 uLCD.printf("BATT:NA\r\n");
George windoge T 6:15fe38e607ed 826 } else {
George windoge T 6:15fe38e607ed 827 uLCD.printf("VPct = %d%%\r\n", vbat);
George windoge T 6:15fe38e607ed 828 }
George windoge T 6:15fe38e607ed 829 }
George windoge T 6:15fe38e607ed 830
George windoge T 3:7007491a7f28 831
George windoge T 3:7007491a7f28 832 void printMenu(void) {
George windoge T 3:7007491a7f28 833 pcSerial.printf("-------------------------------------\r\n");
George windoge T 3:7007491a7f28 834 pcSerial.printf("[?] Print this menu\r\n");
George windoge T 3:7007491a7f28 835 pcSerial.printf("[a] read the ADC (2.8V max)\r\n");
George windoge T 3:7007491a7f28 836 pcSerial.printf("[b] read the Battery V and %% charged\r\n");
George windoge T 3:7007491a7f28 837 pcSerial.printf("[C] read the SIM CCID\r\n");
George windoge T 3:7007491a7f28 838 pcSerial.printf("[U] Unlock SIM with PIN code\r\n");
George windoge T 3:7007491a7f28 839 pcSerial.printf("[i] read RSSI\r\n");
George windoge T 3:7007491a7f28 840 pcSerial.printf("[n] get Network status\r\n");
George windoge T 3:7007491a7f28 841 pcSerial.printf("[v] set audio Volume\r\n");
George windoge T 3:7007491a7f28 842 pcSerial.printf("[V] get Volume\r\n");
George windoge T 3:7007491a7f28 843 pcSerial.printf("[H] set Headphone audio\r\n");
George windoge T 3:7007491a7f28 844 pcSerial.printf("[e] set External audio\r\n");
George windoge T 3:7007491a7f28 845 pcSerial.printf("[T] play audio Tone\r\n");
George windoge T 3:7007491a7f28 846 pcSerial.printf("[P] PWM/Buzzer out\r\n");
George windoge T 3:7007491a7f28 847
George windoge T 3:7007491a7f28 848 // FM (SIM800 only)
George windoge T 3:7007491a7f28 849 pcSerial.printf("[f] tune FM radio\r\n");
George windoge T 3:7007491a7f28 850 pcSerial.printf("[F] turn off FM\r\n");
George windoge T 3:7007491a7f28 851 pcSerial.printf("[m] set FM volume\r\n");
George windoge T 3:7007491a7f28 852 pcSerial.printf("[M] get FM volume\r\n");
George windoge T 3:7007491a7f28 853 pcSerial.printf("[q] get FM station signal level\r\n");
George windoge T 3:7007491a7f28 854
George windoge T 3:7007491a7f28 855 // Phone
George windoge T 3:7007491a7f28 856 pcSerial.printf("[c] make phone Call\r\n");
George windoge T 3:7007491a7f28 857 pcSerial.printf("[h] Hang up phone\r\n");
George windoge T 3:7007491a7f28 858 pcSerial.printf("[p] Pick up phone\r\n");
George windoge T 3:7007491a7f28 859
George windoge T 3:7007491a7f28 860 // SMS
George windoge T 3:7007491a7f28 861 pcSerial.printf("[N] Number of SMSs\r\n");
George windoge T 3:7007491a7f28 862 pcSerial.printf("[r] Read SMS #\r\n");
George windoge T 3:7007491a7f28 863 pcSerial.printf("[R] Read All SMS\r\n");
George windoge T 3:7007491a7f28 864 pcSerial.printf("[d] Delete SMS #\r\n");
George windoge T 3:7007491a7f28 865 pcSerial.printf("[s] Send SMS\r\n");
George windoge T 3:7007491a7f28 866
George windoge T 3:7007491a7f28 867 // Time
George windoge T 3:7007491a7f28 868 pcSerial.printf("[y] Enable network time sync\r\n");
George windoge T 3:7007491a7f28 869 pcSerial.printf("[Y] Enable NTP time sync (GPRS)\r\n");
George windoge T 3:7007491a7f28 870 pcSerial.printf("[t] Get network time\r\n");
George windoge T 3:7007491a7f28 871
George windoge T 3:7007491a7f28 872 // GPRS
George windoge T 3:7007491a7f28 873 pcSerial.printf("[G] Enable GPRS\r\n");
George windoge T 3:7007491a7f28 874 pcSerial.printf("[g] Disable GPRS\r\n");
George windoge T 3:7007491a7f28 875 pcSerial.printf("[l] Query GSMLOC (GPRS)\r\n");
George windoge T 3:7007491a7f28 876 pcSerial.printf("[w] Read webpage (GPRS)\r\n");
George windoge T 3:7007491a7f28 877 pcSerial.printf("[W] Post to website (GPRS)\r\n");
George windoge T 3:7007491a7f28 878
George windoge T 3:7007491a7f28 879 // GPS
George windoge T 3:7007491a7f28 880 pcSerial.printf("[O] Turn GPS on (SIM808)\r\n");
George windoge T 3:7007491a7f28 881 pcSerial.printf("[o] Turn GPS off (SIM808)\r\n");
George windoge T 3:7007491a7f28 882 pcSerial.printf("[x] GPS fix status (SIM808)\r\n");
George windoge T 3:7007491a7f28 883 pcSerial.printf("[L] Query GPS location (SIM808)\r\n");
George windoge T 3:7007491a7f28 884 pcSerial.printf("[E] Raw NMEA out (SIM808)\r\n");
George windoge T 3:7007491a7f28 885
George windoge T 3:7007491a7f28 886 pcSerial.printf("[S] create Serial passthru tunnel\r\n");
George windoge T 3:7007491a7f28 887 pcSerial.printf("-------------------------------------\r\n");
George windoge T 3:7007491a7f28 888 pcSerial.printf("\r\n");
George windoge T 3:7007491a7f28 889 }
George windoge T 3:7007491a7f28 890
George windoge T 3:7007491a7f28 891 void flushSerial() {
George windoge T 3:7007491a7f28 892 while (pcSerial.readable())
George windoge T 3:7007491a7f28 893 pcSerial.getc();
George windoge T 3:7007491a7f28 894 }
George windoge T 3:7007491a7f28 895
George windoge T 3:7007491a7f28 896 char readBlocking() {
George windoge T 3:7007491a7f28 897 while (!pcSerial.readable());
George windoge T 3:7007491a7f28 898 return pcSerial.getc();
George windoge T 3:7007491a7f28 899 }
George windoge T 3:7007491a7f28 900
George windoge T 3:7007491a7f28 901 uint16_t readnumber() {
George windoge T 3:7007491a7f28 902 uint16_t x = 0;
George windoge T 3:7007491a7f28 903 char c;
George windoge T 3:7007491a7f28 904 while (! isdigit(c = readBlocking())) {
George windoge T 3:7007491a7f28 905 //pcSerial.putc(c);
George windoge T 3:7007491a7f28 906 }
George windoge T 3:7007491a7f28 907 pcSerial.putc(c);
George windoge T 3:7007491a7f28 908 x = c - '0';
George windoge T 3:7007491a7f28 909 while (isdigit(c = readBlocking())) {
George windoge T 3:7007491a7f28 910 pcSerial.putc(c);
George windoge T 3:7007491a7f28 911 x *= 10;
George windoge T 3:7007491a7f28 912 x += c - '0';
George windoge T 3:7007491a7f28 913 }
George windoge T 3:7007491a7f28 914 return x;
George windoge T 3:7007491a7f28 915 }
George windoge T 3:7007491a7f28 916
George windoge T 3:7007491a7f28 917 uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) {
George windoge T 3:7007491a7f28 918 uint16_t buffidx = 0;
George windoge T 3:7007491a7f28 919 bool timeoutvalid = true;
George windoge T 3:7007491a7f28 920 if (timeout == 0) timeoutvalid = false;
George windoge T 3:7007491a7f28 921
George windoge T 3:7007491a7f28 922 while (true) {
George windoge T 3:7007491a7f28 923 if (buffidx > maxbuff) {
George windoge T 3:7007491a7f28 924 //pcSerial.printf("SPACE\r\n");
George windoge T 3:7007491a7f28 925 break;
George windoge T 3:7007491a7f28 926 }
George windoge T 3:7007491a7f28 927
George windoge T 3:7007491a7f28 928 while(pcSerial.readable()) {
George windoge T 3:7007491a7f28 929 char c = pcSerial.getc();
George windoge T 3:7007491a7f28 930
George windoge T 3:7007491a7f28 931 //pcSerial.printf("%02x#%c\r\n", c, c);
George windoge T 3:7007491a7f28 932
George windoge T 3:7007491a7f28 933 if (c == '\r') continue;
George windoge T 3:7007491a7f28 934 if (c == 0xA) {
George windoge T 3:7007491a7f28 935 if (buffidx == 0) // the first 0x0A is ignored
George windoge T 3:7007491a7f28 936 continue;
George windoge T 3:7007491a7f28 937
George windoge T 3:7007491a7f28 938 timeout = 0; // the second 0x0A is the end of the line
George windoge T 3:7007491a7f28 939 timeoutvalid = true;
George windoge T 3:7007491a7f28 940 break;
George windoge T 3:7007491a7f28 941 }
George windoge T 3:7007491a7f28 942 buff[buffidx] = c;
George windoge T 3:7007491a7f28 943 buffidx++;
George windoge T 3:7007491a7f28 944 }
George windoge T 3:7007491a7f28 945
George windoge T 3:7007491a7f28 946 if (timeoutvalid && timeout == 0) {
George windoge T 3:7007491a7f28 947 //pcSerial.printf("TIMEOUT\r\n");
George windoge T 3:7007491a7f28 948 break;
George windoge T 3:7007491a7f28 949 }
George windoge T 3:7007491a7f28 950 wait_ms(1);
George windoge T 3:7007491a7f28 951 }
George windoge T 3:7007491a7f28 952 buff[buffidx] = 0; // null term
George windoge T 3:7007491a7f28 953 return buffidx;
George windoge T 3:7007491a7f28 954 }
George windoge T 3:7007491a7f28 955
George windoge T 3:7007491a7f28 956 long map(long x, long in_min, long in_max, long out_min, long out_max)
George windoge T 3:7007491a7f28 957 {
George windoge T 3:7007491a7f28 958 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
George windoge T 3:7007491a7f28 959 }