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