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.
Dependencies: mbed
Diff: main_withULCD.cpp
- Revision:
- 7:7f116e2a184b
- Parent:
- 6:15fe38e607ed
- Child:
- 8:3bb66cdfabac
diff -r 15fe38e607ed -r 7f116e2a184b main_withULCD.cpp
--- 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");