Adafruit FONA 800H breakout

Dependencies:   mbed

Committer:
gtzintzarov3
Date:
Thu Mar 10 05:25:28 2016 +0000
Revision:
0:851248a56628
Child:
1:dba6dedf6cd3
Init push

Who changed what in which revision?

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