Dream Team / Mbed 2 deprecated FONA_CellPhone

Dependencies:   mbed

Committer:
gtzintzarov3
Date:
Fri Mar 11 03:52:49 2016 +0000
Revision:
4:b80a906adcdc
Parent:
3:7007491a7f28
Child:
5:fc20c90c8650
GT: added PinDetect library.. tested interrupts code

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