Update to work with latest mBed
Fork of FONA_CellPhone by
Revision 14:0c0bbca5ac26, committed 2016-03-30
- Comitter:
- jbaker66
- Date:
- Wed Mar 30 02:00:59 2016 +0000
- Parent:
- 13:0b9b73b16406
- Child:
- 15:19a02a88836a
- Commit message:
- this should be good;
Changed in this revision
--- a/main.cpp Mon Mar 28 12:20:13 2016 -0400 +++ b/main.cpp Wed Mar 30 02:00:59 2016 +0000 @@ -46,7 +46,7 @@ Serial pcSerial(USBTX, USBRX); Adafruit_FONA fona(FONA_TX, FONA_RX, FONA_RST, FONA_RI); -uLCD_4DGL uLCD(p28,p27,p30); +//uLCD_4DGL uLCD(p28,p27,p30); // Turn on a LED when somebody call the FONA DigitalOut led1(LED1); @@ -805,4 +805,3 @@ { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } -*/ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main_withULCD.bat Wed Mar 30 02:00:59 2016 +0000 @@ -0,0 +1,558 @@ +/*************************************************** + This is an example for our Adafruit FONA Cellular Module + + Designed specifically to work with the Adafruit FONA + ----> http://www.adafruit.com/products/1946 + ----> http://www.adafruit.com/products/1963 + ----> http://www.adafruit.com/products/2468 + ----> http://www.adafruit.com/products/2542 + + These cellular modules use TTL Serial to communicate, 2 pins are + required to interface + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + BSD license, all text above must be included in any redistribution + ****************************************************/ + + /* + * Modified by Marc PLOUHINEC 27/06/2015 for use in mbed + */ + +/* +THIS CODE IS STILL IN PROGRESS! + +Open up the serial console on the Arduino at 4800 baud to interact with FONA + +Note that if you need to set a GPRS APN, username, and password scroll down to +the commented section below just before the main "while (true)" loop. +*/ + +#include <ctype.h> +//#include "SoftSerial.h" I dont think we need this +#include "Adafruit_FONA.h" +#include "PinDetect.h" +#include "uLCD_4DGL.h" + +#define FONA_RST p12 +#define FONA_TX p13 +#define FONA_RX p14 +#define FONA_RI p11 + +// this is a large buffer for replies +char replybuffer[255]; + + +Serial pcSerial(USBTX, USBRX); +Adafruit_FONA fona(FONA_TX, FONA_RX, FONA_RST, FONA_RI); +uLCD_4DGL uLCD(p28,p27,p30); + +PinDetect pbUp(p20); +PinDetect pbMid(p19); +PinDetect pbDown(p21); +PinDetect pbBACK(p18); + +// Turn on a LED when somebody call the FONA +DigitalOut led1(LED1); +class FonaEventListener : public Adafruit_FONA::EventListener { + virtual void onRing() { + led1 = 1; + } + + virtual void onNoCarrier() { + led1 = 0; + } +}; +FonaEventListener fonaEventListener; + +// Functions defined after main() +uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0); +void printMenu(void); +void printTopLine(void); +void printTime(void); +void flushSerial(); +char readBlocking(); +uint16_t readnumber(); +long map(long x, long in_min, long in_max, long out_min, long out_max); + + + + +enum TOPMENU {PHONE, SMS, RADIO, radio_TUNE, radio_OFF, radio_VOLUME, EXECUTE_TUNE, EXECUTE_radio_OFF}; +TOPMENU myTopMenu = PHONE; + + +bool printFirst = true; +bool blockInterrupts = false; + +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); +//Button interrupt functions +void pbUp_hit_callback(void) { + if (!blockInterrupts){ + printFirst = true; + switch(myTopMenu) { + case PHONE: { + myTopMenu = RADIO; + uLCD.cls(); + //printTopLine(); + uLCD.locate(0,3); + uLCD.printf("RADIO"); + break; + } + case SMS: { + myTopMenu = PHONE; + uLCD.cls(); + //printTopLine(); + uLCD.locate(0,3); + uLCD.printf("PHONE"); + break; + } + case RADIO: { + myTopMenu = SMS; + uLCD.cls(); + //printTopLine(); + uLCD.locate(0,3); + uLCD.printf("SMS"); + break; + } + case radio_TUNE: { + myTopMenu = radio_VOLUME; + uLCD.cls(); + //printTopLine(); + //uLCD.locate(0,3); + //uLCD.printf("RADIO\n->VOLUME"); + uLCD.locate(0,3); + uLCD.printf("RADIO\n->VOLUME"); + break; + } + case radio_OFF: { + myTopMenu = radio_TUNE; + uLCD.cls(); + //printTopLine(); + //uLCD.locate(0,3); + //uLCD.printf("RADIO\n->TUNE"); + uLCD.locate(0,3); + uLCD.printf("RADIO\n->TUNE"); + break; + } + case radio_VOLUME: { + myTopMenu = radio_OFF; + uLCD.cls(); + //printTopLine(); + //uLCD.locate(0,3); + //uLCD.printf("RADIO\n->OFF"); + uLCD.locate(0,3); + uLCD.printf("RADIO\n->OFF"); + break; + } + } + } +} +void pbMid_hit_callback(void) { + if (!blockInterrupts){ + printFirst = true; + switch(myTopMenu) { + case PHONE: { + led2=!led2; + break; + } + case SMS: { + led3=!led3; + break; + } + case RADIO: { + myTopMenu = radio_TUNE; + break; + //led4=!led4; + } + case radio_TUNE: { + //uLCD.cls(); + //printTopLine() + myTopMenu = EXECUTE_TUNE; + break; + //led4=!led4; + } + case radio_OFF: { + //uLCD.cls(); + //printTopLine(); + myTopMenu = EXECUTE_radio_OFF; + break; + //led4=!led4; + } + } + } +} +void pbDown_hit_callback(void) { + if (!blockInterrupts){ + printFirst = true; + switch(myTopMenu) { + case PHONE: { + myTopMenu = SMS; + uLCD.cls(); + uLCD.locate(0,3); + uLCD.printf("SMS"); + break; + } + case SMS: { + myTopMenu = RADIO; + uLCD.cls(); + uLCD.locate(0,3); + uLCD.printf("RADIO"); + break; + } + case RADIO: { + myTopMenu = PHONE; + uLCD.cls(); + uLCD.locate(0,3); + uLCD.printf("PHONE"); + break; + } + case radio_TUNE: { + myTopMenu = radio_OFF; + uLCD.cls(); + //printTopLine(); + uLCD.locate(0,3); + uLCD.printf("RADIO\n->OFF"); + break; + } + case radio_OFF: { + myTopMenu = radio_VOLUME; + uLCD.cls(); + //printTopLine(); + uLCD.locate(0,3); + uLCD.printf("RADIO\n->VOLUME"); + break; + } + case radio_VOLUME: { + myTopMenu = radio_TUNE; + uLCD.cls(); + //printTopLine(); + uLCD.locate(0,3); + uLCD.printf("RADIO\n->TUNE"); + break; + } + } + } +} +void pbBACK_hit_callback(void) { + led4=!led4; +} + + +int main() { + // Set the LCD screen up + uLCD.display_control(PORTRAIT); + uLCD.cls(); + uLCD.baudrate(BAUD_3000000); + uLCD.background_color(BLACK); + + //set up button interrupts + pbUp.mode(PullUp); + pbMid.mode(PullUp); + pbDown.mode(PullUp); + pbBACK.mode(PullUp); + wait(.5); + pbUp.attach_deasserted(&pbUp_hit_callback); + pbMid.attach_deasserted(&pbMid_hit_callback); + pbDown.attach_deasserted(&pbDown_hit_callback); + pbBACK.attach_deasserted(&pbBACK_hit_callback); + pbUp.setSampleFrequency(); + pbMid.setSampleFrequency(); + pbDown.setSampleFrequency(); + pbBACK.setSampleFrequency(); + + //pcSerial.baud(9600); + wait(1); + //pcSerial.printf("\r\n"); + + uLCD.printf("FONA basic test\r\n"); + uLCD.printf("Initializing....\r\n"); + + // See if the FONA is responding + if (! fona.begin(9600)) { + uLCD.cls(); + uLCD.printf("Couldn't find FONA\r\n"); + while (1); + } + fona.setEventListener(&fonaEventListener); + uLCD.cls(); + pcSerial.printf("FONA is OK\r\n"); + wait(1); + + // Print SIM card IMEI number. + char imei[15] = {0}; // MUST use a 16 character buffer for IMEI! + uint8_t imeiLen = fona.getIMEI(imei); + if (imeiLen > 0) { + uLCD.printf("SIM card IMEI:\n %s\r\n", imei); + } + + // Optionally configure a GPRS APN, username, and password. + // You might need to do this to access your network's GPRS/data + // network. Contact your provider for the exact APN, username, + // and password values. Username and password are optional and + // can be removed, but APN is required. + //fona.setGPRSNetworkSettings("your APN", "your username", "your password"); + //fona.setGPRSNetworkSettings("web.pt.lu", "", ""); + + // Optionally configure HTTP gets to follow redirects over SSL. + // Default is not to follow SSL redirects, however if you uncomment + // the following line then redirects over SSL will be followed. + //fona.setHTTPSRedirect(true); + + //printMenu(); + + wait(1); + //set up the time + if (!fona.enableNetworkTimeSync(true)){ + uLCD.printf("NA\r\n"); + } + + uLCD.cls(); + printTopLine(); + + + while (true) { + switch(myTopMenu){ + case PHONE: { + if (printFirst){ + printTopLine(); + printFirst = false; + } + break; + } + case SMS:{ + if (printFirst){ + printTopLine(); + printFirst = false; + } + break; + } + case RADIO: { + if (printFirst){ + printTopLine(); + printFirst = false; + } + break; + } + case radio_TUNE: { + if (printFirst){ + printTopLine(); + printFirst = false; + wait(.5); + } + break; + } + case radio_OFF: { + if (printFirst){ + printTopLine(); + printFirst = false; + } + break; + } + case radio_VOLUME: { + if (printFirst){ + printTopLine(); + printFirst = false; + } + break; + } + case EXECUTE_TUNE: { + blockInterrupts = true; + uLCD.cls(); + // get freq + flushSerial(); + uLCD.printf("COMPUTER PORT->"); + pcSerial.printf("FM Freq (eg 1011 == 101.1 MHz): "); + uint16_t station = readnumber(); + pcSerial.printf("\r\n"); + // FM radio ON using headset + if (fona.FMradio(true, FONA_HEADSETAUDIO)) { + pcSerial.printf("Opened\r\n"); + } + if (! fona.tuneFMradio(station)) { + pcSerial.printf("Failed\r\n"); + } else { + pcSerial.printf("Tuned\r\n"); + } + uLCD.printf("\n\nTuned!"); + wait(1); + printFirst = true; + blockInterrupts = false; + myTopMenu = radio_TUNE; + break; + } + case EXECUTE_radio_OFF: { + blockInterrupts = true; + if (printFirst){ + if (! fona.FMradio(false)) { + uLCD.printf("\n\nFailed\r\n"); + wait(1); + } + else { + uLCD.printf("\n\nOK!\r\n"); + wait(1); + } + printFirst = true; + blockInterrupts = false; + myTopMenu = radio_OFF; + } + break; + } + + + + + } + } +} + + + + + +void printTopLine(void) { + uLCD.locate(5,0); + // read the battery voltage and percentage + uint16_t vbat; + if (! fona.getBattPercent(&vbat)) { + uLCD.printf("BATT:NA\r\n"); + } + else { + uLCD.printf("b=%d%%\r\n", vbat); + } +} + + + +void printMenu(void) { + pcSerial.printf("-------------------------------------\r\n"); + pcSerial.printf("[?] Print this menu\r\n"); + pcSerial.printf("[a] read the ADC (2.8V max)\r\n"); + pcSerial.printf("[b] read the Battery V and %% charged\r\n"); + pcSerial.printf("[C] read the SIM CCID\r\n"); + pcSerial.printf("[U] Unlock SIM with PIN code\r\n"); + pcSerial.printf("[i] read RSSI\r\n"); + pcSerial.printf("[n] get Network status\r\n"); + pcSerial.printf("[v] set audio Volume\r\n"); + pcSerial.printf("[V] get Volume\r\n"); + pcSerial.printf("[H] set Headphone audio\r\n"); + pcSerial.printf("[e] set External audio\r\n"); + pcSerial.printf("[T] play audio Tone\r\n"); + pcSerial.printf("[P] PWM/Buzzer out\r\n"); + + // FM (SIM800 only) + pcSerial.printf("[f] tune FM radio\r\n"); + pcSerial.printf("[F] turn off FM\r\n"); + pcSerial.printf("[m] set FM volume\r\n"); + pcSerial.printf("[M] get FM volume\r\n"); + pcSerial.printf("[q] get FM station signal level\r\n"); + + // Phone + pcSerial.printf("[c] make phone Call\r\n"); + pcSerial.printf("[h] Hang up phone\r\n"); + pcSerial.printf("[p] Pick up phone\r\n"); + + // SMS + pcSerial.printf("[N] Number of SMSs\r\n"); + pcSerial.printf("[r] Read SMS #\r\n"); + pcSerial.printf("[R] Read All SMS\r\n"); + pcSerial.printf("[d] Delete SMS #\r\n"); + pcSerial.printf("[s] Send SMS\r\n"); + + // Time + pcSerial.printf("[y] Enable network time sync\r\n"); + pcSerial.printf("[Y] Enable NTP time sync (GPRS)\r\n"); + pcSerial.printf("[t] Get network time\r\n"); + + // GPRS + pcSerial.printf("[G] Enable GPRS\r\n"); + pcSerial.printf("[g] Disable GPRS\r\n"); + pcSerial.printf("[l] Query GSMLOC (GPRS)\r\n"); + pcSerial.printf("[w] Read webpage (GPRS)\r\n"); + pcSerial.printf("[W] Post to website (GPRS)\r\n"); + + // GPS + pcSerial.printf("[O] Turn GPS on (SIM808)\r\n"); + pcSerial.printf("[o] Turn GPS off (SIM808)\r\n"); + pcSerial.printf("[x] GPS fix status (SIM808)\r\n"); + pcSerial.printf("[L] Query GPS location (SIM808)\r\n"); + pcSerial.printf("[E] Raw NMEA out (SIM808)\r\n"); + + pcSerial.printf("[S] create Serial passthru tunnel\r\n"); + pcSerial.printf("-------------------------------------\r\n"); + pcSerial.printf("\r\n"); +} + +void flushSerial() { + while (pcSerial.readable()) + pcSerial.getc(); +} + +char readBlocking() { + while (!pcSerial.readable()); + return pcSerial.getc(); +} + +uint16_t readnumber() { + uint16_t x = 0; + char c; + while (! isdigit(c = readBlocking())) { + //pcSerial.putc(c); + } + pcSerial.putc(c); + x = c - '0'; + while (isdigit(c = readBlocking())) { + pcSerial.putc(c); + x *= 10; + x += c - '0'; + } + return x; +} + +uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) { + uint16_t buffidx = 0; + bool timeoutvalid = true; + if (timeout == 0) timeoutvalid = false; + + while (true) { + if (buffidx > maxbuff) { + //pcSerial.printf("SPACE\r\n"); + break; + } + + while(pcSerial.readable()) { + char c = pcSerial.getc(); + + //pcSerial.printf("%02x#%c\r\n", c, c); + + if (c == '\r') continue; + if (c == 0xA) { + if (buffidx == 0) // the first 0x0A is ignored + continue; + + timeout = 0; // the second 0x0A is the end of the line + timeoutvalid = true; + break; + } + buff[buffidx] = c; + buffidx++; + } + + if (timeoutvalid && timeout == 0) { + //pcSerial.printf("TIMEOUT\r\n"); + break; + } + wait_ms(1); + } + buff[buffidx] = 0; // null term + return buffidx; +} + +long map(long x, long in_min, long in_max, long out_min, long out_max) +{ + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} \ No newline at end of file
--- a/main_withULCD.cpp Mon Mar 28 12:20:13 2016 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,558 +0,0 @@ -/*************************************************** - This is an example for our Adafruit FONA Cellular Module - - Designed specifically to work with the Adafruit FONA - ----> http://www.adafruit.com/products/1946 - ----> http://www.adafruit.com/products/1963 - ----> http://www.adafruit.com/products/2468 - ----> http://www.adafruit.com/products/2542 - - These cellular modules use TTL Serial to communicate, 2 pins are - required to interface - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - BSD license, all text above must be included in any redistribution - ****************************************************/ - - /* - * Modified by Marc PLOUHINEC 27/06/2015 for use in mbed - */ - -/* -THIS CODE IS STILL IN PROGRESS! - -Open up the serial console on the Arduino at 4800 baud to interact with FONA - -Note that if you need to set a GPRS APN, username, and password scroll down to -the commented section below just before the main "while (true)" loop. -*/ - -#include <ctype.h> -//#include "SoftSerial.h" I dont think we need this -#include "Adafruit_FONA.h" -#include "PinDetect.h" -#include "uLCD_4DGL.h" - -#define FONA_RST p12 -#define FONA_TX p13 -#define FONA_RX p14 -#define FONA_RI p11 - -// this is a large buffer for replies -char replybuffer[255]; - - -Serial pcSerial(USBTX, USBRX); -Adafruit_FONA fona(FONA_TX, FONA_RX, FONA_RST, FONA_RI); -uLCD_4DGL uLCD(p28,p27,p30); - -PinDetect pbUp(p20); -PinDetect pbMid(p19); -PinDetect pbDown(p21); -PinDetect pbBACK(p18); - -// Turn on a LED when somebody call the FONA -DigitalOut led1(LED1); -class FonaEventListener : public Adafruit_FONA::EventListener { - virtual void onRing() { - led1 = 1; - } - - virtual void onNoCarrier() { - led1 = 0; - } -}; -FonaEventListener fonaEventListener; - -// Functions defined after main() -uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0); -void printMenu(void); -void printTopLine(void); -void printTime(void); -void flushSerial(); -char readBlocking(); -uint16_t readnumber(); -long map(long x, long in_min, long in_max, long out_min, long out_max); - - - - -enum TOPMENU {PHONE, SMS, RADIO, radio_TUNE, radio_OFF, radio_VOLUME, EXECUTE_TUNE, EXECUTE_radio_OFF}; -TOPMENU myTopMenu = PHONE; - - -bool printFirst = true; -bool blockInterrupts = false; - -DigitalOut led2(LED2); -DigitalOut led3(LED3); -DigitalOut led4(LED4); -//Button interrupt functions -void pbUp_hit_callback(void) { - if (!blockInterrupts){ - printFirst = true; - switch(myTopMenu) { - case PHONE: { - myTopMenu = RADIO; - uLCD.cls(); - //printTopLine(); - uLCD.locate(0,3); - uLCD.printf("RADIO"); - break; - } - case SMS: { - myTopMenu = PHONE; - uLCD.cls(); - //printTopLine(); - uLCD.locate(0,3); - uLCD.printf("PHONE"); - break; - } - case RADIO: { - myTopMenu = SMS; - uLCD.cls(); - //printTopLine(); - uLCD.locate(0,3); - uLCD.printf("SMS"); - break; - } - case radio_TUNE: { - myTopMenu = radio_VOLUME; - uLCD.cls(); - //printTopLine(); - //uLCD.locate(0,3); - //uLCD.printf("RADIO\n->VOLUME"); - uLCD.locate(0,3); - uLCD.printf("RADIO\n->VOLUME"); - break; - } - case radio_OFF: { - myTopMenu = radio_TUNE; - uLCD.cls(); - //printTopLine(); - //uLCD.locate(0,3); - //uLCD.printf("RADIO\n->TUNE"); - uLCD.locate(0,3); - uLCD.printf("RADIO\n->TUNE"); - break; - } - case radio_VOLUME: { - myTopMenu = radio_OFF; - uLCD.cls(); - //printTopLine(); - //uLCD.locate(0,3); - //uLCD.printf("RADIO\n->OFF"); - uLCD.locate(0,3); - uLCD.printf("RADIO\n->OFF"); - break; - } - } - } -} -void pbMid_hit_callback(void) { - if (!blockInterrupts){ - printFirst = true; - switch(myTopMenu) { - case PHONE: { - led2=!led2; - break; - } - case SMS: { - led3=!led3; - break; - } - case RADIO: { - myTopMenu = radio_TUNE; - break; - //led4=!led4; - } - case radio_TUNE: { - //uLCD.cls(); - //printTopLine() - myTopMenu = EXECUTE_TUNE; - break; - //led4=!led4; - } - case radio_OFF: { - //uLCD.cls(); - //printTopLine(); - myTopMenu = EXECUTE_radio_OFF; - break; - //led4=!led4; - } - } - } -} -void pbDown_hit_callback(void) { - if (!blockInterrupts){ - printFirst = true; - switch(myTopMenu) { - case PHONE: { - myTopMenu = SMS; - uLCD.cls(); - uLCD.locate(0,3); - uLCD.printf("SMS"); - break; - } - case SMS: { - myTopMenu = RADIO; - uLCD.cls(); - uLCD.locate(0,3); - uLCD.printf("RADIO"); - break; - } - case RADIO: { - myTopMenu = PHONE; - uLCD.cls(); - uLCD.locate(0,3); - uLCD.printf("PHONE"); - break; - } - case radio_TUNE: { - myTopMenu = radio_OFF; - uLCD.cls(); - //printTopLine(); - uLCD.locate(0,3); - uLCD.printf("RADIO\n->OFF"); - break; - } - case radio_OFF: { - myTopMenu = radio_VOLUME; - uLCD.cls(); - //printTopLine(); - uLCD.locate(0,3); - uLCD.printf("RADIO\n->VOLUME"); - break; - } - case radio_VOLUME: { - myTopMenu = radio_TUNE; - uLCD.cls(); - //printTopLine(); - uLCD.locate(0,3); - uLCD.printf("RADIO\n->TUNE"); - break; - } - } - } -} -void pbBACK_hit_callback(void) { - led4=!led4; -} - - -int main() { - // Set the LCD screen up - uLCD.display_control(PORTRAIT); - uLCD.cls(); - uLCD.baudrate(BAUD_3000000); - uLCD.background_color(BLACK); - - //set up button interrupts - pbUp.mode(PullUp); - pbMid.mode(PullUp); - pbDown.mode(PullUp); - pbBACK.mode(PullUp); - wait(.5); - pbUp.attach_deasserted(&pbUp_hit_callback); - pbMid.attach_deasserted(&pbMid_hit_callback); - pbDown.attach_deasserted(&pbDown_hit_callback); - pbBACK.attach_deasserted(&pbBACK_hit_callback); - pbUp.setSampleFrequency(); - pbMid.setSampleFrequency(); - pbDown.setSampleFrequency(); - pbBACK.setSampleFrequency(); - - //pcSerial.baud(9600); - wait(1); - //pcSerial.printf("\r\n"); - - uLCD.printf("FONA basic test\r\n"); - uLCD.printf("Initializing....\r\n"); - - // See if the FONA is responding - if (! fona.begin(9600)) { - uLCD.cls(); - uLCD.printf("Couldn't find FONA\r\n"); - while (1); - } - fona.setEventListener(&fonaEventListener); - uLCD.cls(); - pcSerial.printf("FONA is OK\r\n"); - wait(1); - - // Print SIM card IMEI number. - char imei[15] = {0}; // MUST use a 16 character buffer for IMEI! - uint8_t imeiLen = fona.getIMEI(imei); - if (imeiLen > 0) { - uLCD.printf("SIM card IMEI:\n %s\r\n", imei); - } - - // Optionally configure a GPRS APN, username, and password. - // You might need to do this to access your network's GPRS/data - // network. Contact your provider for the exact APN, username, - // and password values. Username and password are optional and - // can be removed, but APN is required. - //fona.setGPRSNetworkSettings("your APN", "your username", "your password"); - //fona.setGPRSNetworkSettings("web.pt.lu", "", ""); - - // Optionally configure HTTP gets to follow redirects over SSL. - // Default is not to follow SSL redirects, however if you uncomment - // the following line then redirects over SSL will be followed. - //fona.setHTTPSRedirect(true); - - //printMenu(); - - wait(1); - //set up the time - if (!fona.enableNetworkTimeSync(true)){ - uLCD.printf("NA\r\n"); - } - - uLCD.cls(); - printTopLine(); - - - while (true) { - switch(myTopMenu){ - case PHONE: { - if (printFirst){ - printTopLine(); - printFirst = false; - } - break; - } - case SMS:{ - if (printFirst){ - printTopLine(); - printFirst = false; - } - break; - } - case RADIO: { - if (printFirst){ - printTopLine(); - printFirst = false; - } - break; - } - case radio_TUNE: { - if (printFirst){ - printTopLine(); - printFirst = false; - wait(.5); - } - break; - } - case radio_OFF: { - if (printFirst){ - printTopLine(); - printFirst = false; - } - break; - } - case radio_VOLUME: { - if (printFirst){ - printTopLine(); - printFirst = false; - } - break; - } - case EXECUTE_TUNE: { - blockInterrupts = true; - uLCD.cls(); - // get freq - flushSerial(); - uLCD.printf("COMPUTER PORT->"); - pcSerial.printf("FM Freq (eg 1011 == 101.1 MHz): "); - uint16_t station = readnumber(); - pcSerial.printf("\r\n"); - // FM radio ON using headset - if (fona.FMradio(true, FONA_HEADSETAUDIO)) { - pcSerial.printf("Opened\r\n"); - } - if (! fona.tuneFMradio(station)) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("Tuned\r\n"); - } - uLCD.printf("\n\nTuned!"); - wait(1); - printFirst = true; - blockInterrupts = false; - myTopMenu = radio_TUNE; - break; - } - case EXECUTE_radio_OFF: { - blockInterrupts = true; - if (printFirst){ - if (! fona.FMradio(false)) { - uLCD.printf("\n\nFailed\r\n"); - wait(1); - } - else { - uLCD.printf("\n\nOK!\r\n"); - wait(1); - } - printFirst = true; - blockInterrupts = false; - myTopMenu = radio_OFF; - } - break; - } - - - - - } - } -} - - - - - -void printTopLine(void) { - uLCD.locate(5,0); - // read the battery voltage and percentage - uint16_t vbat; - if (! fona.getBattPercent(&vbat)) { - uLCD.printf("BATT:NA\r\n"); - } - else { - uLCD.printf("b=%d%%\r\n", vbat); - } -} - - - -void printMenu(void) { - pcSerial.printf("-------------------------------------\r\n"); - pcSerial.printf("[?] Print this menu\r\n"); - pcSerial.printf("[a] read the ADC (2.8V max)\r\n"); - pcSerial.printf("[b] read the Battery V and %% charged\r\n"); - pcSerial.printf("[C] read the SIM CCID\r\n"); - pcSerial.printf("[U] Unlock SIM with PIN code\r\n"); - pcSerial.printf("[i] read RSSI\r\n"); - pcSerial.printf("[n] get Network status\r\n"); - pcSerial.printf("[v] set audio Volume\r\n"); - pcSerial.printf("[V] get Volume\r\n"); - pcSerial.printf("[H] set Headphone audio\r\n"); - pcSerial.printf("[e] set External audio\r\n"); - pcSerial.printf("[T] play audio Tone\r\n"); - pcSerial.printf("[P] PWM/Buzzer out\r\n"); - - // FM (SIM800 only) - pcSerial.printf("[f] tune FM radio\r\n"); - pcSerial.printf("[F] turn off FM\r\n"); - pcSerial.printf("[m] set FM volume\r\n"); - pcSerial.printf("[M] get FM volume\r\n"); - pcSerial.printf("[q] get FM station signal level\r\n"); - - // Phone - pcSerial.printf("[c] make phone Call\r\n"); - pcSerial.printf("[h] Hang up phone\r\n"); - pcSerial.printf("[p] Pick up phone\r\n"); - - // SMS - pcSerial.printf("[N] Number of SMSs\r\n"); - pcSerial.printf("[r] Read SMS #\r\n"); - pcSerial.printf("[R] Read All SMS\r\n"); - pcSerial.printf("[d] Delete SMS #\r\n"); - pcSerial.printf("[s] Send SMS\r\n"); - - // Time - pcSerial.printf("[y] Enable network time sync\r\n"); - pcSerial.printf("[Y] Enable NTP time sync (GPRS)\r\n"); - pcSerial.printf("[t] Get network time\r\n"); - - // GPRS - pcSerial.printf("[G] Enable GPRS\r\n"); - pcSerial.printf("[g] Disable GPRS\r\n"); - pcSerial.printf("[l] Query GSMLOC (GPRS)\r\n"); - pcSerial.printf("[w] Read webpage (GPRS)\r\n"); - pcSerial.printf("[W] Post to website (GPRS)\r\n"); - - // GPS - pcSerial.printf("[O] Turn GPS on (SIM808)\r\n"); - pcSerial.printf("[o] Turn GPS off (SIM808)\r\n"); - pcSerial.printf("[x] GPS fix status (SIM808)\r\n"); - pcSerial.printf("[L] Query GPS location (SIM808)\r\n"); - pcSerial.printf("[E] Raw NMEA out (SIM808)\r\n"); - - pcSerial.printf("[S] create Serial passthru tunnel\r\n"); - pcSerial.printf("-------------------------------------\r\n"); - pcSerial.printf("\r\n"); -} - -void flushSerial() { - while (pcSerial.readable()) - pcSerial.getc(); -} - -char readBlocking() { - while (!pcSerial.readable()); - return pcSerial.getc(); -} - -uint16_t readnumber() { - uint16_t x = 0; - char c; - while (! isdigit(c = readBlocking())) { - //pcSerial.putc(c); - } - pcSerial.putc(c); - x = c - '0'; - while (isdigit(c = readBlocking())) { - pcSerial.putc(c); - x *= 10; - x += c - '0'; - } - return x; -} - -uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) { - uint16_t buffidx = 0; - bool timeoutvalid = true; - if (timeout == 0) timeoutvalid = false; - - while (true) { - if (buffidx > maxbuff) { - //pcSerial.printf("SPACE\r\n"); - break; - } - - while(pcSerial.readable()) { - char c = pcSerial.getc(); - - //pcSerial.printf("%02x#%c\r\n", c, c); - - if (c == '\r') continue; - if (c == 0xA) { - if (buffidx == 0) // the first 0x0A is ignored - continue; - - timeout = 0; // the second 0x0A is the end of the line - timeoutvalid = true; - break; - } - buff[buffidx] = c; - buffidx++; - } - - if (timeoutvalid && timeout == 0) { - //pcSerial.printf("TIMEOUT\r\n"); - break; - } - wait_ms(1); - } - buff[buffidx] = 0; // null term - return buffidx; -} - -long map(long x, long in_min, long in_max, long out_min, long out_max) -{ - return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; -} \ No newline at end of file