Dream Team / Mbed 2 deprecated FONA_CellPhone

Dependencies:   mbed

Committer:
George windoge T
Date:
Thu Mar 10 22:43:07 2016 -0500
Revision:
3:7007491a7f28
Child:
4:b80a906adcdc
GT: adding LCD

Who changed what in which revision?

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