Adafruit FONA 800H breakout

Dependencies:   mbed

Committer:
gtzintzarov3
Date:
Thu Mar 10 05:52:15 2016 +0000
Revision:
1:dba6dedf6cd3
Parent:
0:851248a56628
Child:
2:aaef20ac9044
GT: I think I changed some comments around

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