Adafruit FONA 800H breakout

Dependencies:   mbed

Committer:
jbaker66
Date:
Wed Mar 30 16:19:51 2016 +0000
Revision:
17:b01377595122
Parent:
14:0c0bbca5ac26
udpated library files jb;

Who changed what in which revision?

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