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