Adafruit FONA 800H breakout

Dependencies:   mbed

Committer:
George windoge T
Date:
Thu Mar 10 01:53:00 2016 -0500
Revision:
2:aaef20ac9044
Parent:
1:dba6dedf6cd3
GT: commented some of the code

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