Dream Team / Mbed 2 deprecated FONA_CellPhone

Dependencies:   mbed

Committer:
George windoge T
Date:
Fri Mar 11 02:55:42 2016 -0500
Revision:
8:3bb66cdfabac
Parent:
7:7f116e2a184b
GT: added radio functionality except volume

Who changed what in which revision?

UserRevisionLine numberNew contents of line
George windoge T 3:7007491a7f28 1 /***************************************************
George windoge T 3:7007491a7f28 2 This is an example for our Adafruit FONA Cellular Module
George windoge T 3:7007491a7f28 3
George windoge T 3:7007491a7f28 4 Designed specifically to work with the Adafruit FONA
George windoge T 3:7007491a7f28 5 ----> http://www.adafruit.com/products/1946
George windoge T 3:7007491a7f28 6 ----> http://www.adafruit.com/products/1963
George windoge T 3:7007491a7f28 7 ----> http://www.adafruit.com/products/2468
George windoge T 3:7007491a7f28 8 ----> http://www.adafruit.com/products/2542
George windoge T 3:7007491a7f28 9
George windoge T 3:7007491a7f28 10 These cellular modules use TTL Serial to communicate, 2 pins are
George windoge T 3:7007491a7f28 11 required to interface
George windoge T 3:7007491a7f28 12 Adafruit invests time and resources providing this open source code,
George windoge T 3:7007491a7f28 13 please support Adafruit and open-source hardware by purchasing
George windoge T 3:7007491a7f28 14 products from Adafruit!
George windoge T 3:7007491a7f28 15
George windoge T 3:7007491a7f28 16 Written by Limor Fried/Ladyada for Adafruit Industries.
George windoge T 3:7007491a7f28 17 BSD license, all text above must be included in any redistribution
George windoge T 3:7007491a7f28 18 ****************************************************/
George windoge T 3:7007491a7f28 19
George windoge T 3:7007491a7f28 20 /*
George windoge T 3:7007491a7f28 21 * Modified by Marc PLOUHINEC 27/06/2015 for use in mbed
George windoge T 3:7007491a7f28 22 */
George windoge T 3:7007491a7f28 23
George windoge T 3:7007491a7f28 24 /*
George windoge T 3:7007491a7f28 25 THIS CODE IS STILL IN PROGRESS!
George windoge T 3:7007491a7f28 26
George windoge T 3:7007491a7f28 27 Open up the serial console on the Arduino at 4800 baud to interact with FONA
George windoge T 3:7007491a7f28 28
George windoge T 3:7007491a7f28 29 Note that if you need to set a GPRS APN, username, and password scroll down to
George windoge T 3:7007491a7f28 30 the commented section below just before the main "while (true)" loop.
George windoge T 3:7007491a7f28 31 */
George windoge T 3:7007491a7f28 32
George windoge T 3:7007491a7f28 33 #include <ctype.h>
George windoge T 3:7007491a7f28 34 //#include "SoftSerial.h" I dont think we need this
George windoge T 3:7007491a7f28 35 #include "Adafruit_FONA.h"
gtzintzarov3 4:b80a906adcdc 36 #include "PinDetect.h"
gtzintzarov3 4:b80a906adcdc 37 #include "uLCD_4DGL.h"
George windoge T 3:7007491a7f28 38
George windoge T 3:7007491a7f28 39 #define FONA_RST p12
George windoge T 3:7007491a7f28 40 #define FONA_TX p13
George windoge T 3:7007491a7f28 41 #define FONA_RX p14
George windoge T 3:7007491a7f28 42 #define FONA_RI p11
George windoge T 3:7007491a7f28 43
George windoge T 3:7007491a7f28 44 // this is a large buffer for replies
George windoge T 3:7007491a7f28 45 char replybuffer[255];
George windoge T 3:7007491a7f28 46
George windoge T 3:7007491a7f28 47
George windoge T 3:7007491a7f28 48 Serial pcSerial(USBTX, USBRX);
George windoge T 3:7007491a7f28 49 Adafruit_FONA fona(FONA_TX, FONA_RX, FONA_RST, FONA_RI);
George windoge T 3:7007491a7f28 50 uLCD_4DGL uLCD(p28,p27,p30);
George windoge T 3:7007491a7f28 51
George windoge T 3:7007491a7f28 52 PinDetect pbUp(p20);
George windoge T 3:7007491a7f28 53 PinDetect pbMid(p19);
George windoge T 3:7007491a7f28 54 PinDetect pbDown(p21);
George windoge T 5:fc20c90c8650 55 PinDetect pbBACK(p18);
George windoge T 3:7007491a7f28 56
George windoge T 3:7007491a7f28 57 // Turn on a LED when somebody call the FONA
George windoge T 3:7007491a7f28 58 DigitalOut led1(LED1);
George windoge T 3:7007491a7f28 59 class FonaEventListener : public Adafruit_FONA::EventListener {
George windoge T 3:7007491a7f28 60 virtual void onRing() {
George windoge T 3:7007491a7f28 61 led1 = 1;
George windoge T 3:7007491a7f28 62 }
George windoge T 3:7007491a7f28 63
George windoge T 3:7007491a7f28 64 virtual void onNoCarrier() {
George windoge T 3:7007491a7f28 65 led1 = 0;
George windoge T 3:7007491a7f28 66 }
George windoge T 3:7007491a7f28 67 };
George windoge T 3:7007491a7f28 68 FonaEventListener fonaEventListener;
George windoge T 3:7007491a7f28 69
George windoge T 3:7007491a7f28 70 // Functions defined after main()
George windoge T 3:7007491a7f28 71 uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);
George windoge T 3:7007491a7f28 72 void printMenu(void);
George windoge T 6:15fe38e607ed 73 void printTopLine(void);
George windoge T 6:15fe38e607ed 74 void printTime(void);
George windoge T 3:7007491a7f28 75 void flushSerial();
George windoge T 3:7007491a7f28 76 char readBlocking();
George windoge T 3:7007491a7f28 77 uint16_t readnumber();
George windoge T 3:7007491a7f28 78 long map(long x, long in_min, long in_max, long out_min, long out_max);
George windoge T 3:7007491a7f28 79
George windoge T 3:7007491a7f28 80
George windoge T 3:7007491a7f28 81
George windoge T 5:fc20c90c8650 82
George windoge T 7:7f116e2a184b 83 enum TOPMENU {PHONE, SMS, RADIO, radio_TUNE, radio_OFF, radio_VOLUME, EXECUTE_TUNE, EXECUTE_radio_OFF};
George windoge T 5:fc20c90c8650 84 TOPMENU myTopMenu = PHONE;
George windoge T 5:fc20c90c8650 85
George windoge T 7:7f116e2a184b 86
George windoge T 7:7f116e2a184b 87 bool printFirst = true;
George windoge T 7:7f116e2a184b 88 bool blockInterrupts = false;
George windoge T 7:7f116e2a184b 89
George windoge T 3:7007491a7f28 90 DigitalOut led2(LED2);
George windoge T 3:7007491a7f28 91 DigitalOut led3(LED3);
George windoge T 3:7007491a7f28 92 DigitalOut led4(LED4);
George windoge T 3:7007491a7f28 93 //Button interrupt functions
George windoge T 3:7007491a7f28 94 void pbUp_hit_callback(void) {
George windoge T 7:7f116e2a184b 95 if (!blockInterrupts){
George windoge T 7:7f116e2a184b 96 printFirst = true;
George windoge T 7:7f116e2a184b 97 switch(myTopMenu) {
George windoge T 7:7f116e2a184b 98 case PHONE: {
George windoge T 7:7f116e2a184b 99 myTopMenu = RADIO;
George windoge T 7:7f116e2a184b 100 uLCD.cls();
George windoge T 7:7f116e2a184b 101 //printTopLine();
George windoge T 7:7f116e2a184b 102 uLCD.locate(0,3);
George windoge T 7:7f116e2a184b 103 uLCD.printf("RADIO");
George windoge T 7:7f116e2a184b 104 break;
George windoge T 7:7f116e2a184b 105 }
George windoge T 7:7f116e2a184b 106 case SMS: {
George windoge T 7:7f116e2a184b 107 myTopMenu = PHONE;
George windoge T 7:7f116e2a184b 108 uLCD.cls();
George windoge T 7:7f116e2a184b 109 //printTopLine();
George windoge T 7:7f116e2a184b 110 uLCD.locate(0,3);
George windoge T 7:7f116e2a184b 111 uLCD.printf("PHONE");
George windoge T 7:7f116e2a184b 112 break;
George windoge T 7:7f116e2a184b 113 }
George windoge T 7:7f116e2a184b 114 case RADIO: {
George windoge T 7:7f116e2a184b 115 myTopMenu = SMS;
George windoge T 7:7f116e2a184b 116 uLCD.cls();
George windoge T 7:7f116e2a184b 117 //printTopLine();
George windoge T 7:7f116e2a184b 118 uLCD.locate(0,3);
George windoge T 7:7f116e2a184b 119 uLCD.printf("SMS");
George windoge T 7:7f116e2a184b 120 break;
George windoge T 7:7f116e2a184b 121 }
George windoge T 7:7f116e2a184b 122 case radio_TUNE: {
George windoge T 7:7f116e2a184b 123 myTopMenu = radio_VOLUME;
George windoge T 8:3bb66cdfabac 124 uLCD.cls();
George windoge T 7:7f116e2a184b 125 //printTopLine();
George windoge T 7:7f116e2a184b 126 //uLCD.locate(0,3);
George windoge T 7:7f116e2a184b 127 //uLCD.printf("RADIO\n->VOLUME");
George windoge T 8:3bb66cdfabac 128 uLCD.locate(0,3);
George windoge T 8:3bb66cdfabac 129 uLCD.printf("RADIO\n->VOLUME");
George windoge T 7:7f116e2a184b 130 break;
George windoge T 7:7f116e2a184b 131 }
George windoge T 7:7f116e2a184b 132 case radio_OFF: {
George windoge T 7:7f116e2a184b 133 myTopMenu = radio_TUNE;
George windoge T 8:3bb66cdfabac 134 uLCD.cls();
George windoge T 7:7f116e2a184b 135 //printTopLine();
George windoge T 7:7f116e2a184b 136 //uLCD.locate(0,3);
George windoge T 7:7f116e2a184b 137 //uLCD.printf("RADIO\n->TUNE");
George windoge T 8:3bb66cdfabac 138 uLCD.locate(0,3);
George windoge T 8:3bb66cdfabac 139 uLCD.printf("RADIO\n->TUNE");
George windoge T 7:7f116e2a184b 140 break;
George windoge T 7:7f116e2a184b 141 }
George windoge T 7:7f116e2a184b 142 case radio_VOLUME: {
George windoge T 7:7f116e2a184b 143 myTopMenu = radio_OFF;
George windoge T 8:3bb66cdfabac 144 uLCD.cls();
George windoge T 7:7f116e2a184b 145 //printTopLine();
George windoge T 7:7f116e2a184b 146 //uLCD.locate(0,3);
George windoge T 7:7f116e2a184b 147 //uLCD.printf("RADIO\n->OFF");
George windoge T 8:3bb66cdfabac 148 uLCD.locate(0,3);
George windoge T 8:3bb66cdfabac 149 uLCD.printf("RADIO\n->OFF");
George windoge T 7:7f116e2a184b 150 break;
George windoge T 7:7f116e2a184b 151 }
George windoge T 5:fc20c90c8650 152 }
George windoge T 5:fc20c90c8650 153 }
George windoge T 3:7007491a7f28 154 }
George windoge T 3:7007491a7f28 155 void pbMid_hit_callback(void) {
George windoge T 7:7f116e2a184b 156 if (!blockInterrupts){
George windoge T 7:7f116e2a184b 157 printFirst = true;
George windoge T 7:7f116e2a184b 158 switch(myTopMenu) {
George windoge T 7:7f116e2a184b 159 case PHONE: {
George windoge T 7:7f116e2a184b 160 led2=!led2;
George windoge T 7:7f116e2a184b 161 break;
George windoge T 7:7f116e2a184b 162 }
George windoge T 7:7f116e2a184b 163 case SMS: {
George windoge T 7:7f116e2a184b 164 led3=!led3;
George windoge T 7:7f116e2a184b 165 break;
George windoge T 7:7f116e2a184b 166 }
George windoge T 8:3bb66cdfabac 167 case RADIO: {
George windoge T 7:7f116e2a184b 168 myTopMenu = radio_TUNE;
George windoge T 7:7f116e2a184b 169 break;
George windoge T 7:7f116e2a184b 170 //led4=!led4;
George windoge T 7:7f116e2a184b 171 }
George windoge T 7:7f116e2a184b 172 case radio_TUNE: {
George windoge T 8:3bb66cdfabac 173 //uLCD.cls();
George windoge T 7:7f116e2a184b 174 //printTopLine()
George windoge T 7:7f116e2a184b 175 myTopMenu = EXECUTE_TUNE;
George windoge T 7:7f116e2a184b 176 break;
George windoge T 7:7f116e2a184b 177 //led4=!led4;
George windoge T 7:7f116e2a184b 178 }
George windoge T 7:7f116e2a184b 179 case radio_OFF: {
George windoge T 8:3bb66cdfabac 180 //uLCD.cls();
George windoge T 7:7f116e2a184b 181 //printTopLine();
George windoge T 7:7f116e2a184b 182 myTopMenu = EXECUTE_radio_OFF;
George windoge T 7:7f116e2a184b 183 break;
George windoge T 7:7f116e2a184b 184 //led4=!led4;
George windoge T 7:7f116e2a184b 185 }
George windoge T 5:fc20c90c8650 186 }
George windoge T 5:fc20c90c8650 187 }
George windoge T 3:7007491a7f28 188 }
George windoge T 3:7007491a7f28 189 void pbDown_hit_callback(void) {
George windoge T 7:7f116e2a184b 190 if (!blockInterrupts){
George windoge T 7:7f116e2a184b 191 printFirst = true;
George windoge T 7:7f116e2a184b 192 switch(myTopMenu) {
George windoge T 7:7f116e2a184b 193 case PHONE: {
George windoge T 7:7f116e2a184b 194 myTopMenu = SMS;
George windoge T 7:7f116e2a184b 195 uLCD.cls();
George windoge T 7:7f116e2a184b 196 uLCD.locate(0,3);
George windoge T 7:7f116e2a184b 197 uLCD.printf("SMS");
George windoge T 7:7f116e2a184b 198 break;
George windoge T 7:7f116e2a184b 199 }
George windoge T 7:7f116e2a184b 200 case SMS: {
George windoge T 7:7f116e2a184b 201 myTopMenu = RADIO;
George windoge T 7:7f116e2a184b 202 uLCD.cls();
George windoge T 7:7f116e2a184b 203 uLCD.locate(0,3);
George windoge T 7:7f116e2a184b 204 uLCD.printf("RADIO");
George windoge T 7:7f116e2a184b 205 break;
George windoge T 7:7f116e2a184b 206 }
George windoge T 7:7f116e2a184b 207 case RADIO: {
George windoge T 7:7f116e2a184b 208 myTopMenu = PHONE;
George windoge T 7:7f116e2a184b 209 uLCD.cls();
George windoge T 7:7f116e2a184b 210 uLCD.locate(0,3);
George windoge T 7:7f116e2a184b 211 uLCD.printf("PHONE");
George windoge T 7:7f116e2a184b 212 break;
George windoge T 7:7f116e2a184b 213 }
George windoge T 7:7f116e2a184b 214 case radio_TUNE: {
George windoge T 7:7f116e2a184b 215 myTopMenu = radio_OFF;
George windoge T 8:3bb66cdfabac 216 uLCD.cls();
George windoge T 7:7f116e2a184b 217 //printTopLine();
George windoge T 8:3bb66cdfabac 218 uLCD.locate(0,3);
George windoge T 8:3bb66cdfabac 219 uLCD.printf("RADIO\n->OFF");
George windoge T 7:7f116e2a184b 220 break;
George windoge T 7:7f116e2a184b 221 }
George windoge T 7:7f116e2a184b 222 case radio_OFF: {
George windoge T 7:7f116e2a184b 223 myTopMenu = radio_VOLUME;
George windoge T 8:3bb66cdfabac 224 uLCD.cls();
George windoge T 7:7f116e2a184b 225 //printTopLine();
George windoge T 8:3bb66cdfabac 226 uLCD.locate(0,3);
George windoge T 8:3bb66cdfabac 227 uLCD.printf("RADIO\n->VOLUME");
George windoge T 7:7f116e2a184b 228 break;
George windoge T 7:7f116e2a184b 229 }
George windoge T 7:7f116e2a184b 230 case radio_VOLUME: {
George windoge T 7:7f116e2a184b 231 myTopMenu = radio_TUNE;
George windoge T 8:3bb66cdfabac 232 uLCD.cls();
George windoge T 7:7f116e2a184b 233 //printTopLine();
George windoge T 8:3bb66cdfabac 234 uLCD.locate(0,3);
George windoge T 8:3bb66cdfabac 235 uLCD.printf("RADIO\n->TUNE");
George windoge T 7:7f116e2a184b 236 break;
George windoge T 7:7f116e2a184b 237 }
George windoge T 5:fc20c90c8650 238 }
George windoge T 5:fc20c90c8650 239 }
George windoge T 5:fc20c90c8650 240 }
George windoge T 5:fc20c90c8650 241 void pbBACK_hit_callback(void) {
George windoge T 3:7007491a7f28 242 led4=!led4;
George windoge T 3:7007491a7f28 243 }
George windoge T 3:7007491a7f28 244
George windoge T 3:7007491a7f28 245
George windoge T 3:7007491a7f28 246 int main() {
George windoge T 3:7007491a7f28 247 // Set the LCD screen up
George windoge T 3:7007491a7f28 248 uLCD.display_control(PORTRAIT);
George windoge T 3:7007491a7f28 249 uLCD.cls();
George windoge T 3:7007491a7f28 250 uLCD.baudrate(BAUD_3000000);
George windoge T 3:7007491a7f28 251 uLCD.background_color(BLACK);
George windoge T 3:7007491a7f28 252
George windoge T 3:7007491a7f28 253 //set up button interrupts
George windoge T 3:7007491a7f28 254 pbUp.mode(PullUp);
George windoge T 3:7007491a7f28 255 pbMid.mode(PullUp);
George windoge T 3:7007491a7f28 256 pbDown.mode(PullUp);
George windoge T 5:fc20c90c8650 257 pbBACK.mode(PullUp);
George windoge T 7:7f116e2a184b 258 wait(.5);
George windoge T 3:7007491a7f28 259 pbUp.attach_deasserted(&pbUp_hit_callback);
George windoge T 3:7007491a7f28 260 pbMid.attach_deasserted(&pbMid_hit_callback);
George windoge T 3:7007491a7f28 261 pbDown.attach_deasserted(&pbDown_hit_callback);
George windoge T 5:fc20c90c8650 262 pbBACK.attach_deasserted(&pbBACK_hit_callback);
George windoge T 3:7007491a7f28 263 pbUp.setSampleFrequency();
George windoge T 3:7007491a7f28 264 pbMid.setSampleFrequency();
George windoge T 3:7007491a7f28 265 pbDown.setSampleFrequency();
George windoge T 5:fc20c90c8650 266 pbBACK.setSampleFrequency();
George windoge T 3:7007491a7f28 267
George windoge T 3:7007491a7f28 268 //pcSerial.baud(9600);
George windoge T 3:7007491a7f28 269 wait(1);
George windoge T 3:7007491a7f28 270 //pcSerial.printf("\r\n");
George windoge T 3:7007491a7f28 271
George windoge T 3:7007491a7f28 272 uLCD.printf("FONA basic test\r\n");
George windoge T 6:15fe38e607ed 273 uLCD.printf("Initializing....\r\n");
George windoge T 3:7007491a7f28 274
George windoge T 3:7007491a7f28 275 // See if the FONA is responding
George windoge T 3:7007491a7f28 276 if (! fona.begin(9600)) {
George windoge T 3:7007491a7f28 277 uLCD.cls();
George windoge T 3:7007491a7f28 278 uLCD.printf("Couldn't find FONA\r\n");
George windoge T 3:7007491a7f28 279 while (1);
George windoge T 3:7007491a7f28 280 }
George windoge T 3:7007491a7f28 281 fona.setEventListener(&fonaEventListener);
George windoge T 3:7007491a7f28 282 uLCD.cls();
George windoge T 3:7007491a7f28 283 pcSerial.printf("FONA is OK\r\n");
George windoge T 6:15fe38e607ed 284 wait(1);
George windoge T 3:7007491a7f28 285
George windoge T 3:7007491a7f28 286 // Print SIM card IMEI number.
George windoge T 3:7007491a7f28 287 char imei[15] = {0}; // MUST use a 16 character buffer for IMEI!
George windoge T 3:7007491a7f28 288 uint8_t imeiLen = fona.getIMEI(imei);
George windoge T 3:7007491a7f28 289 if (imeiLen > 0) {
George windoge T 6:15fe38e607ed 290 uLCD.printf("SIM card IMEI:\n %s\r\n", imei);
George windoge T 3:7007491a7f28 291 }
George windoge T 3:7007491a7f28 292
George windoge T 3:7007491a7f28 293 // Optionally configure a GPRS APN, username, and password.
George windoge T 3:7007491a7f28 294 // You might need to do this to access your network's GPRS/data
George windoge T 3:7007491a7f28 295 // network. Contact your provider for the exact APN, username,
George windoge T 3:7007491a7f28 296 // and password values. Username and password are optional and
George windoge T 3:7007491a7f28 297 // can be removed, but APN is required.
George windoge T 3:7007491a7f28 298 //fona.setGPRSNetworkSettings("your APN", "your username", "your password");
George windoge T 3:7007491a7f28 299 //fona.setGPRSNetworkSettings("web.pt.lu", "", "");
George windoge T 3:7007491a7f28 300
George windoge T 3:7007491a7f28 301 // Optionally configure HTTP gets to follow redirects over SSL.
George windoge T 3:7007491a7f28 302 // Default is not to follow SSL redirects, however if you uncomment
George windoge T 3:7007491a7f28 303 // the following line then redirects over SSL will be followed.
George windoge T 3:7007491a7f28 304 //fona.setHTTPSRedirect(true);
George windoge T 3:7007491a7f28 305
George windoge T 3:7007491a7f28 306 //printMenu();
George windoge T 3:7007491a7f28 307
George windoge T 6:15fe38e607ed 308 wait(1);
George windoge T 6:15fe38e607ed 309 //set up the time
George windoge T 6:15fe38e607ed 310 if (!fona.enableNetworkTimeSync(true)){
George windoge T 6:15fe38e607ed 311 uLCD.printf("NA\r\n");
George windoge T 6:15fe38e607ed 312 }
George windoge T 6:15fe38e607ed 313
George windoge T 7:7f116e2a184b 314 uLCD.cls();
George windoge T 6:15fe38e607ed 315 printTopLine();
George windoge T 6:15fe38e607ed 316
George windoge T 7:7f116e2a184b 317
George windoge T 6:15fe38e607ed 318 while (true) {
George windoge T 6:15fe38e607ed 319 switch(myTopMenu){
George windoge T 6:15fe38e607ed 320 case PHONE: {
George windoge T 7:7f116e2a184b 321 if (printFirst){
George windoge T 7:7f116e2a184b 322 printTopLine();
George windoge T 7:7f116e2a184b 323 printFirst = false;
George windoge T 7:7f116e2a184b 324 }
George windoge T 6:15fe38e607ed 325 break;
George windoge T 6:15fe38e607ed 326 }
George windoge T 6:15fe38e607ed 327 case SMS:{
George windoge T 7:7f116e2a184b 328 if (printFirst){
George windoge T 7:7f116e2a184b 329 printTopLine();
George windoge T 7:7f116e2a184b 330 printFirst = false;
George windoge T 7:7f116e2a184b 331 }
George windoge T 6:15fe38e607ed 332 break;
George windoge T 6:15fe38e607ed 333 }
George windoge T 6:15fe38e607ed 334 case RADIO: {
George windoge T 7:7f116e2a184b 335 if (printFirst){
George windoge T 7:7f116e2a184b 336 printTopLine();
George windoge T 7:7f116e2a184b 337 printFirst = false;
George windoge T 3:7007491a7f28 338 }
George windoge T 3:7007491a7f28 339 break;
George windoge T 3:7007491a7f28 340 }
George windoge T 7:7f116e2a184b 341 case radio_TUNE: {
George windoge T 7:7f116e2a184b 342 if (printFirst){
George windoge T 7:7f116e2a184b 343 printTopLine();
George windoge T 7:7f116e2a184b 344 printFirst = false;
George windoge T 7:7f116e2a184b 345 wait(.5);
George windoge T 3:7007491a7f28 346 }
George windoge T 3:7007491a7f28 347 break;
George windoge T 3:7007491a7f28 348 }
George windoge T 7:7f116e2a184b 349 case radio_OFF: {
George windoge T 7:7f116e2a184b 350 if (printFirst){
George windoge T 7:7f116e2a184b 351 printTopLine();
George windoge T 7:7f116e2a184b 352 printFirst = false;
George windoge T 3:7007491a7f28 353 }
George windoge T 3:7007491a7f28 354 break;
George windoge T 3:7007491a7f28 355 }
George windoge T 7:7f116e2a184b 356 case radio_VOLUME: {
George windoge T 7:7f116e2a184b 357 if (printFirst){
George windoge T 7:7f116e2a184b 358 printTopLine();
George windoge T 7:7f116e2a184b 359 printFirst = false;
George windoge T 7:7f116e2a184b 360 }
George windoge T 7:7f116e2a184b 361 break;
George windoge T 7:7f116e2a184b 362 }
George windoge T 7:7f116e2a184b 363 case EXECUTE_TUNE: {
George windoge T 7:7f116e2a184b 364 blockInterrupts = true;
George windoge T 7:7f116e2a184b 365 uLCD.cls();
George windoge T 3:7007491a7f28 366 // get freq
George windoge T 3:7007491a7f28 367 flushSerial();
George windoge T 7:7f116e2a184b 368 uLCD.printf("COMPUTER PORT->");
George windoge T 3:7007491a7f28 369 pcSerial.printf("FM Freq (eg 1011 == 101.1 MHz): ");
George windoge T 3:7007491a7f28 370 uint16_t station = readnumber();
George windoge T 3:7007491a7f28 371 pcSerial.printf("\r\n");
George windoge T 3:7007491a7f28 372 // FM radio ON using headset
George windoge T 3:7007491a7f28 373 if (fona.FMradio(true, FONA_HEADSETAUDIO)) {
George windoge T 3:7007491a7f28 374 pcSerial.printf("Opened\r\n");
George windoge T 3:7007491a7f28 375 }
George windoge T 3:7007491a7f28 376 if (! fona.tuneFMradio(station)) {
George windoge T 3:7007491a7f28 377 pcSerial.printf("Failed\r\n");
George windoge T 3:7007491a7f28 378 } else {
George windoge T 3:7007491a7f28 379 pcSerial.printf("Tuned\r\n");
George windoge T 3:7007491a7f28 380 }
George windoge T 7:7f116e2a184b 381 uLCD.printf("\n\nTuned!");
George windoge T 7:7f116e2a184b 382 wait(1);
George windoge T 7:7f116e2a184b 383 printFirst = true;
George windoge T 7:7f116e2a184b 384 blockInterrupts = false;
George windoge T 7:7f116e2a184b 385 myTopMenu = radio_TUNE;
George windoge T 3:7007491a7f28 386 break;
George windoge T 3:7007491a7f28 387 }
George windoge T 7:7f116e2a184b 388 case EXECUTE_radio_OFF: {
George windoge T 7:7f116e2a184b 389 blockInterrupts = true;
George windoge T 7:7f116e2a184b 390 if (printFirst){
George windoge T 7:7f116e2a184b 391 if (! fona.FMradio(false)) {
George windoge T 7:7f116e2a184b 392 uLCD.printf("\n\nFailed\r\n");
George windoge T 7:7f116e2a184b 393 wait(1);
George windoge T 7:7f116e2a184b 394 }
George windoge T 7:7f116e2a184b 395 else {
George windoge T 7:7f116e2a184b 396 uLCD.printf("\n\nOK!\r\n");
George windoge T 7:7f116e2a184b 397 wait(1);
George windoge T 3:7007491a7f28 398 }
George windoge T 7:7f116e2a184b 399 printFirst = true;
George windoge T 7:7f116e2a184b 400 blockInterrupts = false;
George windoge T 7:7f116e2a184b 401 myTopMenu = radio_OFF;
George windoge T 3:7007491a7f28 402 }
George windoge T 3:7007491a7f28 403 break;
George windoge T 3:7007491a7f28 404 }
George windoge T 7:7f116e2a184b 405
George windoge T 7:7f116e2a184b 406
George windoge T 7:7f116e2a184b 407
George windoge T 7:7f116e2a184b 408
George windoge T 3:7007491a7f28 409 }
George windoge T 3:7007491a7f28 410 }
George windoge T 3:7007491a7f28 411 }
George windoge T 7:7f116e2a184b 412
George windoge T 7:7f116e2a184b 413
George windoge T 7:7f116e2a184b 414
George windoge T 7:7f116e2a184b 415
George windoge T 6:15fe38e607ed 416
George windoge T 6:15fe38e607ed 417 void printTopLine(void) {
George windoge T 7:7f116e2a184b 418 uLCD.locate(5,0);
George windoge T 6:15fe38e607ed 419 // read the battery voltage and percentage
George windoge T 6:15fe38e607ed 420 uint16_t vbat;
George windoge T 6:15fe38e607ed 421 if (! fona.getBattPercent(&vbat)) {
George windoge T 6:15fe38e607ed 422 uLCD.printf("BATT:NA\r\n");
George windoge T 7:7f116e2a184b 423 }
George windoge T 7:7f116e2a184b 424 else {
George windoge T 7:7f116e2a184b 425 uLCD.printf("b=%d%%\r\n", vbat);
George windoge T 6:15fe38e607ed 426 }
George windoge T 6:15fe38e607ed 427 }
George windoge T 6:15fe38e607ed 428
George windoge T 3:7007491a7f28 429
George windoge T 7:7f116e2a184b 430
George windoge T 3:7007491a7f28 431 void printMenu(void) {
George windoge T 3:7007491a7f28 432 pcSerial.printf("-------------------------------------\r\n");
George windoge T 3:7007491a7f28 433 pcSerial.printf("[?] Print this menu\r\n");
George windoge T 3:7007491a7f28 434 pcSerial.printf("[a] read the ADC (2.8V max)\r\n");
George windoge T 3:7007491a7f28 435 pcSerial.printf("[b] read the Battery V and %% charged\r\n");
George windoge T 3:7007491a7f28 436 pcSerial.printf("[C] read the SIM CCID\r\n");
George windoge T 3:7007491a7f28 437 pcSerial.printf("[U] Unlock SIM with PIN code\r\n");
George windoge T 3:7007491a7f28 438 pcSerial.printf("[i] read RSSI\r\n");
George windoge T 3:7007491a7f28 439 pcSerial.printf("[n] get Network status\r\n");
George windoge T 3:7007491a7f28 440 pcSerial.printf("[v] set audio Volume\r\n");
George windoge T 3:7007491a7f28 441 pcSerial.printf("[V] get Volume\r\n");
George windoge T 3:7007491a7f28 442 pcSerial.printf("[H] set Headphone audio\r\n");
George windoge T 3:7007491a7f28 443 pcSerial.printf("[e] set External audio\r\n");
George windoge T 3:7007491a7f28 444 pcSerial.printf("[T] play audio Tone\r\n");
George windoge T 3:7007491a7f28 445 pcSerial.printf("[P] PWM/Buzzer out\r\n");
George windoge T 3:7007491a7f28 446
George windoge T 3:7007491a7f28 447 // FM (SIM800 only)
George windoge T 3:7007491a7f28 448 pcSerial.printf("[f] tune FM radio\r\n");
George windoge T 3:7007491a7f28 449 pcSerial.printf("[F] turn off FM\r\n");
George windoge T 3:7007491a7f28 450 pcSerial.printf("[m] set FM volume\r\n");
George windoge T 3:7007491a7f28 451 pcSerial.printf("[M] get FM volume\r\n");
George windoge T 3:7007491a7f28 452 pcSerial.printf("[q] get FM station signal level\r\n");
George windoge T 3:7007491a7f28 453
George windoge T 3:7007491a7f28 454 // Phone
George windoge T 3:7007491a7f28 455 pcSerial.printf("[c] make phone Call\r\n");
George windoge T 3:7007491a7f28 456 pcSerial.printf("[h] Hang up phone\r\n");
George windoge T 3:7007491a7f28 457 pcSerial.printf("[p] Pick up phone\r\n");
George windoge T 3:7007491a7f28 458
George windoge T 3:7007491a7f28 459 // SMS
George windoge T 3:7007491a7f28 460 pcSerial.printf("[N] Number of SMSs\r\n");
George windoge T 3:7007491a7f28 461 pcSerial.printf("[r] Read SMS #\r\n");
George windoge T 3:7007491a7f28 462 pcSerial.printf("[R] Read All SMS\r\n");
George windoge T 3:7007491a7f28 463 pcSerial.printf("[d] Delete SMS #\r\n");
George windoge T 3:7007491a7f28 464 pcSerial.printf("[s] Send SMS\r\n");
George windoge T 3:7007491a7f28 465
George windoge T 3:7007491a7f28 466 // Time
George windoge T 3:7007491a7f28 467 pcSerial.printf("[y] Enable network time sync\r\n");
George windoge T 3:7007491a7f28 468 pcSerial.printf("[Y] Enable NTP time sync (GPRS)\r\n");
George windoge T 3:7007491a7f28 469 pcSerial.printf("[t] Get network time\r\n");
George windoge T 3:7007491a7f28 470
George windoge T 3:7007491a7f28 471 // GPRS
George windoge T 3:7007491a7f28 472 pcSerial.printf("[G] Enable GPRS\r\n");
George windoge T 3:7007491a7f28 473 pcSerial.printf("[g] Disable GPRS\r\n");
George windoge T 3:7007491a7f28 474 pcSerial.printf("[l] Query GSMLOC (GPRS)\r\n");
George windoge T 3:7007491a7f28 475 pcSerial.printf("[w] Read webpage (GPRS)\r\n");
George windoge T 3:7007491a7f28 476 pcSerial.printf("[W] Post to website (GPRS)\r\n");
George windoge T 3:7007491a7f28 477
George windoge T 3:7007491a7f28 478 // GPS
George windoge T 3:7007491a7f28 479 pcSerial.printf("[O] Turn GPS on (SIM808)\r\n");
George windoge T 3:7007491a7f28 480 pcSerial.printf("[o] Turn GPS off (SIM808)\r\n");
George windoge T 3:7007491a7f28 481 pcSerial.printf("[x] GPS fix status (SIM808)\r\n");
George windoge T 3:7007491a7f28 482 pcSerial.printf("[L] Query GPS location (SIM808)\r\n");
George windoge T 3:7007491a7f28 483 pcSerial.printf("[E] Raw NMEA out (SIM808)\r\n");
George windoge T 3:7007491a7f28 484
George windoge T 3:7007491a7f28 485 pcSerial.printf("[S] create Serial passthru tunnel\r\n");
George windoge T 3:7007491a7f28 486 pcSerial.printf("-------------------------------------\r\n");
George windoge T 3:7007491a7f28 487 pcSerial.printf("\r\n");
George windoge T 3:7007491a7f28 488 }
George windoge T 3:7007491a7f28 489
George windoge T 3:7007491a7f28 490 void flushSerial() {
George windoge T 3:7007491a7f28 491 while (pcSerial.readable())
George windoge T 3:7007491a7f28 492 pcSerial.getc();
George windoge T 3:7007491a7f28 493 }
George windoge T 3:7007491a7f28 494
George windoge T 3:7007491a7f28 495 char readBlocking() {
George windoge T 3:7007491a7f28 496 while (!pcSerial.readable());
George windoge T 3:7007491a7f28 497 return pcSerial.getc();
George windoge T 3:7007491a7f28 498 }
George windoge T 3:7007491a7f28 499
George windoge T 3:7007491a7f28 500 uint16_t readnumber() {
George windoge T 3:7007491a7f28 501 uint16_t x = 0;
George windoge T 3:7007491a7f28 502 char c;
George windoge T 3:7007491a7f28 503 while (! isdigit(c = readBlocking())) {
George windoge T 3:7007491a7f28 504 //pcSerial.putc(c);
George windoge T 3:7007491a7f28 505 }
George windoge T 3:7007491a7f28 506 pcSerial.putc(c);
George windoge T 3:7007491a7f28 507 x = c - '0';
George windoge T 3:7007491a7f28 508 while (isdigit(c = readBlocking())) {
George windoge T 3:7007491a7f28 509 pcSerial.putc(c);
George windoge T 3:7007491a7f28 510 x *= 10;
George windoge T 3:7007491a7f28 511 x += c - '0';
George windoge T 3:7007491a7f28 512 }
George windoge T 3:7007491a7f28 513 return x;
George windoge T 3:7007491a7f28 514 }
George windoge T 3:7007491a7f28 515
George windoge T 3:7007491a7f28 516 uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) {
George windoge T 3:7007491a7f28 517 uint16_t buffidx = 0;
George windoge T 3:7007491a7f28 518 bool timeoutvalid = true;
George windoge T 3:7007491a7f28 519 if (timeout == 0) timeoutvalid = false;
George windoge T 3:7007491a7f28 520
George windoge T 3:7007491a7f28 521 while (true) {
George windoge T 3:7007491a7f28 522 if (buffidx > maxbuff) {
George windoge T 3:7007491a7f28 523 //pcSerial.printf("SPACE\r\n");
George windoge T 3:7007491a7f28 524 break;
George windoge T 3:7007491a7f28 525 }
George windoge T 3:7007491a7f28 526
George windoge T 3:7007491a7f28 527 while(pcSerial.readable()) {
George windoge T 3:7007491a7f28 528 char c = pcSerial.getc();
George windoge T 3:7007491a7f28 529
George windoge T 3:7007491a7f28 530 //pcSerial.printf("%02x#%c\r\n", c, c);
George windoge T 3:7007491a7f28 531
George windoge T 3:7007491a7f28 532 if (c == '\r') continue;
George windoge T 3:7007491a7f28 533 if (c == 0xA) {
George windoge T 3:7007491a7f28 534 if (buffidx == 0) // the first 0x0A is ignored
George windoge T 3:7007491a7f28 535 continue;
George windoge T 3:7007491a7f28 536
George windoge T 3:7007491a7f28 537 timeout = 0; // the second 0x0A is the end of the line
George windoge T 3:7007491a7f28 538 timeoutvalid = true;
George windoge T 3:7007491a7f28 539 break;
George windoge T 3:7007491a7f28 540 }
George windoge T 3:7007491a7f28 541 buff[buffidx] = c;
George windoge T 3:7007491a7f28 542 buffidx++;
George windoge T 3:7007491a7f28 543 }
George windoge T 3:7007491a7f28 544
George windoge T 3:7007491a7f28 545 if (timeoutvalid && timeout == 0) {
George windoge T 3:7007491a7f28 546 //pcSerial.printf("TIMEOUT\r\n");
George windoge T 3:7007491a7f28 547 break;
George windoge T 3:7007491a7f28 548 }
George windoge T 3:7007491a7f28 549 wait_ms(1);
George windoge T 3:7007491a7f28 550 }
George windoge T 3:7007491a7f28 551 buff[buffidx] = 0; // null term
George windoge T 3:7007491a7f28 552 return buffidx;
George windoge T 3:7007491a7f28 553 }
George windoge T 3:7007491a7f28 554
George windoge T 3:7007491a7f28 555 long map(long x, long in_min, long in_max, long out_min, long out_max)
George windoge T 3:7007491a7f28 556 {
George windoge T 3:7007491a7f28 557 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
George windoge T 3:7007491a7f28 558 }