Dream Team / Mbed 2 deprecated FONA_CellPhone

Dependencies:   mbed

Committer:
George windoge T
Date:
Thu Mar 10 23:17:50 2016 -0500
Revision:
5:fc20c90c8650
Parent:
4:b80a906adcdc
Child:
6:15fe38e607ed
GT: beginning to add MENU

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