Update to work with latest mBed
Fork of FONA_CellPhone by
Revision 7:7f116e2a184b, committed 2016-03-11
- Comitter:
- George windoge T
- Date:
- Fri Mar 11 02:40:06 2016 -0500
- Parent:
- 6:15fe38e607ed
- Child:
- 8:3bb66cdfabac
- Commit message:
- GT: Added menu functionality up to radio
Changed in this revision
main_withULCD.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main_withULCD.cpp Thu Mar 10 23:52:21 2016 -0500 +++ b/main_withULCD.cpp Fri Mar 11 02:40:06 2016 -0500 @@ -80,58 +80,149 @@ -enum TOPMENU {PHONE, SMS, RADIO}; +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) { - switch(myTopMenu) { - case PHONE: { - myTopMenu = RADIO; - break; - } - case SMS: { - myTopMenu = PHONE; - break; - } - case RADIO: { - myTopMenu = SMS; - break; + 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"); + break; + } + case radio_OFF: { + myTopMenu = radio_TUNE; + //uLCD.cls(); + //printTopLine(); + //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"); + break; + } } } } void pbMid_hit_callback(void) { - switch(myTopMenu) { - case PHONE: { - led2=!led2; - break; - } - case SMS: { - led3=!led3; - break; - } - case RADIO: { - led4=!led4; - break; + 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) { - switch(myTopMenu) { - case PHONE: { - myTopMenu = SMS; - break; - } - case SMS: { - myTopMenu = RADIO; - break; - } - case RADIO: { - myTopMenu = PHONE; - break; + 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(); + break; + } + case radio_OFF: { + myTopMenu = radio_VOLUME; + //uLCD.cls(); + //printTopLine(); + break; + } + case radio_VOLUME: { + myTopMenu = radio_TUNE; + //uLCD.cls(); + //printTopLine(); + break; + } } } } @@ -152,7 +243,7 @@ pbMid.mode(PullUp); pbDown.mode(PullUp); pbBACK.mode(PullUp); - wait(0.1); + wait(.5); pbUp.attach_deasserted(&pbUp_hit_callback); pbMid.attach_deasserted(&pbMid_hit_callback); pbDown.attach_deasserted(&pbDown_hit_callback); @@ -208,208 +299,70 @@ uLCD.printf("NA\r\n"); } + uLCD.cls(); printTopLine(); - + while (true) { switch(myTopMenu){ case PHONE: { - uLCD.cls(); - printTopLine(); - uLCD.locate(3,1); - uLCD.printf("PHONE"); + if (printFirst){ + printTopLine(); + printFirst = false; + } break; } case SMS:{ - uLCD.cls(); - printTopLine(); - uLCD.locate(3,1); - uLCD.printf("SMS"); + if (printFirst){ + printTopLine(); + printFirst = false; + } break; } case RADIO: { - uLCD.cls(); - printTopLine(); - uLCD.locate(3,1); - uLCD.printf("RADIO"); - break; - } - - - } - } - - - - - /* - while (true) { - pcSerial.printf("FONA> "); - // 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 - while (! pcSerial.readable() ) { - if (fona.readable()) { - pcSerial.putc(fona.getc()); - } - } - - // get the input command from the terminal - char command = pcSerial.getc(); - pcSerial.printf("%c\r\n", command); //loops back to COM port - - - switch (command) { - case '?': { - printMenu(); - break; - } - - case 'a': { - // read the ADC - uint16_t adc; - if (! fona.getADCVoltage(&adc)) { - pcSerial.printf("Failed to read ADC\r\n"); - } else { - pcSerial.printf("ADC = %d mV\r\n", adc); + if (printFirst){ + printTopLine(); + printFirst = false; } break; } - - case 'b': { - // read the battery voltage and percentage - uint16_t vbat; - if (! fona.getBattVoltage(&vbat)) { - pcSerial.printf("Failed to read Batt\r\n"); - } else { - pcSerial.printf("VBat = %d mV\r\n", vbat); - } - - if (! fona.getBattPercent(&vbat)) { - pcSerial.printf("Failed to read Batt\r\n"); - } else { - pcSerial.printf("VPct = %d%%\r\n", vbat); - } - - break; - } - - case 'U': { - // Unlock the SIM with a PIN code - char PIN[5]; - flushSerial(); - pcSerial.printf("Enter 4-digit PIN\r\n"); - readline(PIN, 3); - pcSerial.printf("%s\r\n", PIN); - pcSerial.printf("Unlocking SIM card: "); - if (! fona.unlockSIM(PIN)) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("OK!\r\n"); - } - break; - } - - case 'C': { - // read the CCID - fona.getSIMCCID(replybuffer); // make sure replybuffer is at least 21 bytes! - pcSerial.printf("SIM CCID = %s\r\n", replybuffer); - break; - } - - case 'i': { - // read the RSSI - uint8_t n = fona.getRSSI(); - int8_t r = 0; - - pcSerial.printf("RSSI = %d: ", n); - if (n == 0) r = -115; - if (n == 1) r = -111; - if (n == 31) r = -52; - if ((n >= 2) && (n <= 30)) { - r = map(n, 2, 30, -110, -54); - } - pcSerial.printf("%d dBm\r\n", r); - - break; - } - - case 'n': { - // read the network/cellular status - uint8_t n = fona.getNetworkStatus(); - pcSerial.printf("Network status %d: ", n); - if (n == 0) pcSerial.printf("Not registered\r\n"); - if (n == 1) pcSerial.printf("Registered (home)\r\n"); - if (n == 2) pcSerial.printf("Not registered (searching)\r\n"); - if (n == 3) pcSerial.printf("Denied\r\n"); - if (n == 4) pcSerial.printf("Unknown\r\n"); - if (n == 5) pcSerial.printf("Registered roaming\r\n"); - break; - } - - /*** Audio ***/ - /* - case 'v': { - // set volume - flushSerial(); - pcSerial.printf("Set Vol %%"); - uint8_t vol = readnumber(); - pcSerial.printf("\r\n"); - if (! fona.setVolume(vol)) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("OK!\r\n"); + case radio_TUNE: { + if (printFirst){ + uLCD.cls(); + printTopLine(); + uLCD.locate(0,3); + uLCD.printf("RADIO\n->TUNE"); + printFirst = false; + wait(.5); } break; } - - case 'V': { - uint8_t v = fona.getVolume(); - pcSerial.printf("%d%%\r\n", v); - - break; - } - - case 'H': { - // Set Headphone output - if (! fona.setAudio(FONA_HEADSETAUDIO)) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("OK!\r\n"); - } - fona.setMicVolume(FONA_HEADSETAUDIO, 15); - break; - } - case 'e': { - // Set External output - if (! fona.setAudio(FONA_EXTAUDIO)) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("OK!\r\n"); - } - - fona.setMicVolume(FONA_EXTAUDIO, 10); - break; - } - - case 'T': { - // play tone - flushSerial(); - pcSerial.printf("Play tone #"); - uint8_t kittone = readnumber(); - pcSerial.printf("\r\n"); - // play for 1 second (1000 ms) - if (! fona.playToolkitTone(kittone, 1000)) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("OK!\r\n"); + case radio_OFF: { + if (printFirst){ + uLCD.cls(); + printTopLine(); + uLCD.locate(0,3); + uLCD.printf("RADIO\n->OFF"); + printFirst = false; } break; } - - /*** FM Radio ***/ - /* - case 'f': { + case radio_VOLUME: { + if (printFirst){ + uLCD.cls(); + printTopLine(); + uLCD.locate(0,3); + uLCD.printf("RADIO\n->VOLUME"); + 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"); @@ -422,413 +375,56 @@ } else { pcSerial.printf("Tuned\r\n"); } - break; - } - case 'F': { - // FM radio off - if (! fona.FMradio(false)) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("OK!\r\n"); - } - break; - } - case 'm': { - // Set FM volume. - flushSerial(); - pcSerial.printf("Set FM Vol [0-6]:"); - uint8_t vol = readnumber(); - pcSerial.printf("\r\n"); - if (!fona.setFMVolume(vol)) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("OK!\r\n"); - } - break; - } - case 'M': { - // Get FM volume. - int8_t fmvol = fona.getFMVolume(); - if (fmvol < 0) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("FM volume: %d\r\n", fmvol); - } - break; - } - case 'q': { - // Get FM station signal level (in decibels). - flushSerial(); - pcSerial.printf("FM Freq (eg 1011 == 101.1 MHz): "); - uint16_t station = readnumber(); - pcSerial.printf("\r\n"); - int8_t level = fona.getFMSignalLevel(station); - if (level < 0) { - pcSerial.printf("Failed! Make sure FM radio is on (tuned to station).\r\n"); - } else { - pcSerial.printf("Signal level (dB): %d\r\n", level); - } - break; - } - - /*** PWM ***/ - /* - case 'P': { - // PWM Buzzer output @ 2KHz max - flushSerial(); - pcSerial.printf("PWM Freq, 0 = Off, (1-2000): "); - uint16_t freq = readnumber(); - pcSerial.printf("\r\n"); - if (! fona.setPWM(freq)) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("OK!\r\n"); - } - break; - } - - /*** Call ***/ - /* - case 'c': { - // call a phone! - char number[30]; - flushSerial(); - pcSerial.printf("Call #"); - readline(number, 30); - pcSerial.printf("\r\n"); - pcSerial.printf("Calling %s\r\n", number); - if (!fona.callPhone(number)) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("Sent!\r\n"); - } - + uLCD.printf("\n\nTuned!"); + wait(1); + printFirst = true; + blockInterrupts = false; + myTopMenu = radio_TUNE; break; } - case 'h': { - // hang up! - if (! fona.hangUp()) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("OK!\r\n"); - } - break; - } - - case 'p': { - // pick up! - if (! fona.pickUp()) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("OK!\r\n"); - } - break; - } - - /*** SMS ***/ - /* - case 'N': { - // read the number of SMS's! - int8_t smsnum = fona.getNumSMS(); - if (smsnum < 0) { - pcSerial.printf("Could not read # SMS\r\n"); - } else { - pcSerial.printf("%d SMS's on SIM card!\r\n", smsnum); - } - break; - } - case 'r': { - // read an SMS - flushSerial(); - pcSerial.printf("Read #"); - uint8_t smsn = readnumber(); - pcSerial.printf("\r\nReading SMS #%d\r\n", smsn); - - // Retrieve SMS sender address/phone number. - if (! fona.getSMSSender(smsn, replybuffer, 250)) { - pcSerial.printf("Failed!\r\n"); - break; - } - pcSerial.printf("FROM: %s\r\n", replybuffer); - - // Retrieve SMS value. - uint16_t smslen; - if (! fona.readSMS(smsn, replybuffer, 250, &smslen)) { // pass in buffer and max len! - pcSerial.printf("Failed!\r\n"); - break; - } - pcSerial.printf("***** SMS #%d (%d) bytes *****\r\n", smsn, smslen); - pcSerial.printf("%s\r\n", replybuffer); - pcSerial.printf("*****\r\n"); - - break; - } - case 'R': { - // read all SMS - int8_t smsnum = fona.getNumSMS(); - uint16_t smslen; - for (int8_t smsn=1; smsn<=smsnum; smsn++) { - pcSerial.printf("\r\nReading SMS #%d\r\n", smsn); - if (!fona.readSMS(smsn, replybuffer, 250, &smslen)) { // pass in buffer and max len! - pcSerial.printf("Failed!\r\n"); - 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); } - // if the length is zero, its a special case where the index number is higher - // so increase the max we'll look at! - if (smslen == 0) { - pcSerial.printf("[empty slot]\r\n"); - smsnum++; - continue; - } - - pcSerial.printf("***** SMS #%d (%d) bytes *****\r\n", smsn, smslen); - pcSerial.printf("%s\r\n", replybuffer); - pcSerial.printf("*****\r\n"); - } - break; - } - - case 'd': { - // delete an SMS - flushSerial(); - pcSerial.printf("Delete #"); - uint8_t smsn = readnumber(); - - pcSerial.printf("\r\nDeleting SMS #%d\r\n", smsn); - if (fona.deleteSMS(smsn)) { - pcSerial.printf("OK!\r\n"); - } else { - pcSerial.printf("Couldn't delete\r\n"); + printFirst = true; + blockInterrupts = false; + myTopMenu = radio_OFF; } break; } - - case 's': { - // send an SMS! - char sendto[21], message[141]; - flushSerial(); - pcSerial.printf("Send to #"); - readline(sendto, 20); - pcSerial.printf("%s\r\n", sendto); - pcSerial.printf("Type out one-line message (140 char): "); - readline(message, 140); - pcSerial.printf("%s\r\n", message); - if (!fona.sendSMS(sendto, message)) { - pcSerial.printf("Failed\r\n"); - } else { - pcSerial.printf("Sent!\r\n"); - } - - break; - } - - /*** Time ***/ - /* - case 'y': { - // enable network time sync - if (!fona.enableNetworkTimeSync(true)) - pcSerial.printf("Failed to enable\r\n"); - break; - } - - case 'Y': { - // enable NTP time sync - if (!fona.enableNTPTimeSync(true, "pool.ntp.org")) - pcSerial.printf("Failed to enable\r\n"); - break; - } - - case 't': { - // read the time - char buffer[23]; - - fona.getTime(buffer, 23); // make sure replybuffer is at least 23 bytes! - pcSerial.printf("Time = %s\r\n", buffer); - break; - } - - /*********************************** GPS (SIM808 only) */ - /* - case 'o': { - // turn GPS off - if (!fona.enableGPS(false)) - pcSerial.printf("Failed to turn off\r\n"); - break; - } - case 'O': { - // turn GPS on - if (!fona.enableGPS(true)) - pcSerial.printf("Failed to turn on\r\n"); - break; - } - case 'x': { - int8_t stat; - // check GPS fix - stat = fona.GPSstatus(); - if (stat < 0) - pcSerial.printf("Failed to query\r\n"); - if (stat == 0) pcSerial.printf("GPS off\r\n"); - if (stat == 1) pcSerial.printf("No fix\r\n"); - if (stat == 2) pcSerial.printf("2D fix\r\n"); - if (stat == 3) pcSerial.printf("3D fix\r\n"); - break; - } - - case 'L': { - // check for GPS location - char gpsdata[80]; - fona.getGPS(0, gpsdata, 80); - pcSerial.printf("Reply in format: mode,longitude,latitude,altitude,utctime(yyyymmddHHMMSS),ttff,satellites,speed,course\r\n"); - pcSerial.printf("%s\r\n", gpsdata); - - break; - } - - case 'E': { - flushSerial(); - pcSerial.printf("GPS NMEA output sentences (0 = off, 34 = RMC+GGA, 255 = all)\r\n"); - uint8_t nmeaout = readnumber(); - - // turn on NMEA output - fona.enableGPSNMEA(nmeaout); - - break; - } - - /*********************************** GPRS */ - /* - case 'g': { - // turn GPRS off - if (!fona.enableGPRS(false)) - pcSerial.printf("Failed to turn off\r\n"); - break; - } - case 'G': { - // turn GPRS on - if (!fona.enableGPRS(true)) - pcSerial.printf("Failed to turn on\r\n"); - break; - } - case 'l': { - // check for GSMLOC (requires GPRS) - uint16_t returncode; - - if (!fona.getGSMLoc(&returncode, replybuffer, 250)) - pcSerial.printf("Failed!\r\n"); - if (returncode == 0) { - pcSerial.printf("%s\r\n", replybuffer); - } else { - pcSerial.printf("Fail code #%d\r\n", returncode); - } - - break; - } - case 'w': { - // read website URL - uint16_t statuscode; - int16_t length; - char url[80]; - - flushSerial(); - pcSerial.printf("NOTE: in beta! Use small webpages to read!\r\n"); - pcSerial.printf("URL to read (e.g. www.adafruit.com/testwifi/index.html):\r\n"); - pcSerial.printf("http://"); readline(url, 79); - pcSerial.printf("%s\r\n", url); - - pcSerial.printf("****\r\n"); - if (!fona.HTTP_GET_start(url, &statuscode, (uint16_t *)&length)) { - pcSerial.printf("Failed!\r\n"); - break; - } - while (length > 0) { - while (fona.readable()) { - char c = fona.getc(); - pcSerial.putc(c); - length--; - if (! length) break; - } - } - pcSerial.printf("\r\n****\r\n"); - fona.HTTP_GET_end(); - break; - } - - case 'W': { - // Post data to website - uint16_t statuscode; - int16_t length; - char url[80]; - char data[80]; - - flushSerial(); - pcSerial.printf("NOTE: in beta! Use simple websites to post!\r\n"); - pcSerial.printf("URL to post (e.g. httpbin.org/post):\r\n"); - pcSerial.printf("http://"); readline(url, 79); - pcSerial.printf("%s\r\n", url); - pcSerial.printf("Data to post (e.g. \"foo\" or \"{\"simple\":\"json\"}\"):\r\n"); - readline(data, 79); - pcSerial.printf("%s\r\n", data); - - pcSerial.printf("****\r\n"); - if (!fona.HTTP_POST_start(url, "text/plain", (uint8_t *) data, strlen(data), &statuscode, (uint16_t *)&length)) { - pcSerial.printf("Failed!\r\n"); - break; - } - while (length > 0) { - while (fona.readable()) { - char c = fona.getc(); - pcSerial.putc(c); - length--; - if (! length) break; - } - } - pcSerial.printf("\r\n****\r\n"); - fona.HTTP_POST_end(); - break; - } - /*****************************************/ - /* - case 'S': { - pcSerial.printf("Creating SERIAL TUBE\r\n"); - while (1) { - while (pcSerial.readable()) { - wait_ms(1); - fona.putc(pcSerial.getc()); - } - if (fona.readable()) { - pcSerial.putc(fona.getc()); - } - } - } - - default: { - pcSerial.printf("Unknown command\r\n"); - printMenu(); - break; - } - } - // flush input - flushSerial(); - while (fona.readable()) { - pcSerial.putc(fona.getc()); + + + + } } } -*/ + + + + void printTopLine(void) { - - uLCD.locate(1,5); + 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("VPct = %d%%\r\n", vbat); + } + else { + uLCD.printf("b=%d%%\r\n", vbat); } } + void printMenu(void) { pcSerial.printf("-------------------------------------\r\n"); pcSerial.printf("[?] Print this menu\r\n");