 		Serial.print(F("GSMLOC Fail code #"));
 		Serial.println(returncode);
 	}
-	
+
 	post_data_to_website("httpbin.org/post", "foo");
 
 }
 
+int read_network_status()
+{
+	// read the network/cellular status
+	uint8_t n = fona.getNetworkStatus();
+	Serial.print(F("Network status "));
+	Serial.print(n);
+	Serial.print(F(": "));
+	if (n == 0)
+		Serial.println(F("Not registered"));
+	if (n == 1)
+		Serial.println(F("Registered (home)"));
+	if (n == 2)
+		Serial.println(F("Not registered (searching)"));
+	if (n == 3)
+		Serial.println(F("Denied"));
+	if (n == 4)
+		Serial.println(F("Unknown"));
+	if (n == 5)
+		Serial.println(F("Registered roaming"));
+	return n;
+}
 void post_data_to_website(char* url, char* data)
 {
 	// Post data to website

		}
	}
	Serial.println(F("\n****"));
	fona.HTTP_POST_end();	
}

void printMenu(void)
{
	Serial.println(F("-------------------------------------"));
	Serial.println(F("[?] Print this menu"));
	Serial.println(F("[a] read the ADC 2.8V max (FONA800 & 808)"));
	Serial.println(F("[b] read the Battery V and % charged"));
	Serial.println(F("[C] read the SIM CCID"));
	Serial.println(F("[U] Unlock SIM with PIN code"));
	Serial.println(F("[i] read RSSI"));
	Serial.println(F("[n] get Network status"));
	Serial.println(F("[v] set audio Volume"));
	Serial.println(F("[V] get Volume"));
	Serial.println(F("[H] set Headphone audio (FONA800 & 808)"));
	Serial.println(F("[e] set External audio (FONA800 & 808)"));
	Serial.println(F("[T] play audio Tone"));
	Serial.println(F("[P] PWM/Buzzer out (FONA800 & 808)"));

	// FM (SIM800 only!)
	Serial.println(F("[f] tune FM radio (FONA800)"));
	Serial.println(F("[F] turn off FM (FONA800)"));
	Serial.println(F("[m] set FM volume (FONA800)"));
	Serial.println(F("[M] get FM volume (FONA800)"));
	Serial.println(F("[q] get FM station signal level (FONA800)"));

	// Phone
	Serial.println(F("[c] make phone Call"));
	Serial.println(F("[A] get call status"));
	Serial.println(F("[h] Hang up phone"));
	Serial.println(F("[p] Pick up phone"));

	// SMS
	Serial.println(F("[N] Number of SMSs"));
	Serial.println(F("[r] Read SMS #"));
	Serial.println(F("[R] Read All SMS"));
	Serial.println(F("[d] Delete SMS #"));
	Serial.println(F("[s] Send SMS"));
	Serial.println(F("[u] Send USSD"));

	// Time
	Serial.println(F("[y] Enable network time sync (FONA 800 & 808)"));
	Serial.println(F("[Y] Enable NTP time sync (GPRS FONA 800 & 808)"));
	Serial.println(F("[t] Get network time"));

	// GPRS
	Serial.println(F("[G] Enable GPRS"));
	Serial.println(F("[g] Disable GPRS"));
	Serial.println(F("[l] Query GSMLOC (GPRS)"));
	Serial.println(F("[w] Read webpage (GPRS)"));
	Serial.println(F("[W] Post to website (GPRS)"));

	// GPS
	if ((type == FONA3G_A) || (type == FONA3G_E) || (type == FONA808_V1)
			|| (type == FONA808_V2))
	{
		Serial.println(F("[O] Turn GPS on (FONA 808 & 3G)"));
		Serial.println(F("[o] Turn GPS off (FONA 808 & 3G)"));
		Serial.println(F("[L] Query GPS location (FONA 808 & 3G)"));
		if (type == FONA808_V1)
		{
			Serial.println(F("[x] GPS fix status (FONA808 v1 only)"));
		}
		Serial.println(F("[E] Raw NMEA out (FONA808)"));
	}

	Serial.println(F("[S] create Serial passthru tunnel"));
	Serial.println(F("-------------------------------------"));
	Serial.println(F(""));

}

void loop()
{
	delay(10000);
}

void loop2()
{
	Serial.print(F("FONA> "));
	while (!Serial.available())
	{
		if (fona.available())
		{
			Serial.write(fona.read());
		}
	}

	char command = Serial.read();
	Serial.println(command);

	switch (command)
	{
	case '?':
	{
		printMenu();
		break;
	}

	case 'a':
	{
		// read the ADC
		uint16_t adc;
		if (!fona.getADCVoltage(&adc))
		{
			Serial.println(F("Failed to read ADC"));
		}
		else
		{
			Serial.print(F("ADC = "));
			Serial.print(adc);
			Serial.println(F(" mV"));
		}
		break;
	}

	case 'b':
	{
		// read the battery voltage and percentage
		uint16_t vbat;
		if (!fona.getBattVoltage(&vbat))
		{
			Serial.println(F("Failed to read Batt"));
		}
		else
		{
			Serial.print(F("VBat = "));
			Serial.print(vbat);
			Serial.println(F(" mV"));
		}

		if (!fona.getBattPercent(&vbat))
		{
			Serial.println(F("Failed to read Batt"));
		}
		else
		{
			Serial.print(F("VPct = "));
			Serial.print(vbat);
			Serial.println(F("%"));
		}

		break;
	}

	case 'U':
	{
		// Unlock the SIM with a PIN code
		char PIN[5];
		flushSerial();
		Serial.println(F("Enter 4-digit PIN"));
		readline(PIN, 3);
		Serial.println(PIN);
		Serial.print(F("Unlocking SIM card: "));
		if (!fona.unlockSIM(PIN))
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("OK!"));
		}
		break;
	}

	case 'C':
	{
		// read the CCID
		fona.getSIMCCID(replybuffer); // make sure replybuffer is at least 21 bytes!
		Serial.print(F("SIM CCID = "));
		Serial.println(replybuffer);
		break;
	}

	case 'i':
	{
		// read the RSSI
		uint8_t n = fona.getRSSI();
		int8_t r;

		Serial.print(F("RSSI = "));
		Serial.print(n);
		Serial.print(": ");
		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);
		}
		Serial.print(r);
		Serial.println(F(" dBm"));

		break;
	}

	case 'n':
	{
		// read the network/cellular status
		uint8_t n = fona.getNetworkStatus();
		Serial.print(F("Network status "));
		Serial.print(n);
		Serial.print(F(": "));
		if (n == 0)
			Serial.println(F("Not registered"));
		if (n == 1)
			Serial.println(F("Registered (home)"));
		if (n == 2)
			Serial.println(F("Not registered (searching)"));
		if (n == 3)
			Serial.println(F("Denied"));
		if (n == 4)
			Serial.println(F("Unknown"));
		if (n == 5)
			Serial.println(F("Registered roaming"));
		break;
	}

		/*** Audio ***/
	case 'v':
	{
		// set volume
		flushSerial();
		if ((type == FONA3G_A) || (type == FONA3G_E))
		{
			Serial.print(F("Set Vol [0-8] "));
		}
		else
		{
			Serial.print(F("Set Vol % [0-100] "));
		}
		uint8_t vol = readnumber();
		Serial.println();
		if (!fona.setVolume(vol))
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("OK!"));
		}
		break;
	}

	case 'V':
	{
		uint8_t v = fona.getVolume();
		Serial.print(v);
		if ((type == FONA3G_A) || (type == FONA3G_E))
		{
			Serial.println(" / 8");
		}
		else
		{
			Serial.println("%");
		}
		break;
	}

	case 'H':
	{
		// Set Headphone output
		if (!fona.setAudio(FONA_HEADSETAUDIO))
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("OK!"));
		}
		fona.setMicVolume(FONA_HEADSETAUDIO, 15);
		break;
	}
	case 'e':
	{
		// Set External output
		if (!fona.setAudio(FONA_EXTAUDIO))
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("OK!"));
		}

		fona.setMicVolume(FONA_EXTAUDIO, 10);
		break;
	}

	case 'T':
	{
		// play tone
		flushSerial();
		Serial.print(F("Play tone #"));
		uint8_t kittone = readnumber();
		Serial.println();
		// play for 1 second (1000 ms)
		if (!fona.playToolkitTone(kittone, 1000))
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("OK!"));
		}
		break;
	}

		/*** FM Radio ***/

	case 'f':
	{
		// get freq
		flushSerial();
		Serial.print(F("FM Freq (eg 1011 == 101.1 MHz): "));
		uint16_t station = readnumber();
		Serial.println();
		// FM radio ON using headset
		if (fona.FMradio(true, FONA_HEADSETAUDIO))
		{
			Serial.println(F("Opened"));
		}
		if (!fona.tuneFMradio(station))
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("Tuned"));
		}
		break;
	}
	case 'F':
	{
		// FM radio off
		if (!fona.FMradio(false))
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("OK!"));
		}
		break;
	}
	case 'm':
	{
		// Set FM volume.
		flushSerial();
		Serial.print(F("Set FM Vol [0-6]:"));
		uint8_t vol = readnumber();
		Serial.println();
		if (!fona.setFMVolume(vol))
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("OK!"));
		}
		break;
	}
	case 'M':
	{
		// Get FM volume.
		uint8_t fmvol = fona.getFMVolume();
		if (fmvol < 0)
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.print(F("FM volume: "));
			Serial.println(fmvol, DEC);
		}
		break;
	}
	case 'q':
	{
		// Get FM station signal level (in decibels).
		flushSerial();
		Serial.print(F("FM Freq (eg 1011 == 101.1 MHz): "));
		uint16_t station = readnumber();
		Serial.println();
		int8_t level = fona.getFMSignalLevel(station);
		if (level < 0)
		{
			Serial.println(
					F("Failed! Make sure FM radio is on (tuned to station)."));
		}
		else
		{
			Serial.print(F("Signal level (dB): "));
			Serial.println(level, DEC);
		}
		break;
	}

		/*** PWM ***/

	case 'P':
	{
		// PWM Buzzer output @ 2KHz max
		flushSerial();
		Serial.print(F("PWM Freq, 0 = Off, (1-2000): "));
		uint16_t freq = readnumber();
		Serial.println();
		if (!fona.setPWM(freq))
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("OK!"));
		}
		break;
	}

		/*** Call ***/
	case 'c':
	{
		// call a phone!
		char number[30];
		flushSerial();
		Serial.print(F("Call #"));
		readline(number, 30);
		Serial.println();
		Serial.print(F("Calling "));
		Serial.println(number);
		if (!fona.callPhone(number))
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("Sent!"));
		}

		break;
	}
	case 'A':
	{
		// get call status
		int8_t callstat = fona.getCallStatus();
		switch (callstat)
		{
		case 0:
			Serial.println(F("Ready"));
			break;
		case 1:
			Serial.println(F("Could not get status"));
			break;
		case 3:
			Serial.println(F("Ringing (incoming)"));
			break;
		case 4:
			Serial.println(F("Ringing/in progress (outgoing)"));
			break;
		default:
			Serial.println(F("Unknown"));
			break;
		}
		break;
	}

	case 'h':
	{
		// hang up!
		if (!fona.hangUp())
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("OK!"));
		}
		break;
	}

	case 'p':
	{
		// pick up!
		if (!fona.pickUp())
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("OK!"));
		}
		break;
	}

		/*** SMS ***/

	case 'N':
	{
		// read the number of SMS's!
		int8_t smsnum = fona.getNumSMS();
		if (smsnum < 0)
		{
			Serial.println(F("Could not read # SMS"));
		}
		else
		{
			Serial.print(smsnum);
			Serial.println(F(" SMS's on SIM card!"));
		}
		break;
	}
	case 'r':
	{
		// read an SMS
		flushSerial();
		Serial.print(F("Read #"));
		uint8_t smsn = readnumber();
		Serial.print(F("\n\rReading SMS #"));
		Serial.println(smsn);

		// Retrieve SMS sender address/phone number.
		if (!fona.getSMSSender(smsn, replybuffer, 250))
		{
			Serial.println("Failed!");
			break;
		}
		Serial.print(F("FROM: "));
		Serial.println(replybuffer);

		// Retrieve SMS value.
		uint16_t smslen;
		if (!fona.readSMS(smsn, replybuffer, 250, &smslen))
		{ // pass in buffer and max len!
			Serial.println("Failed!");
			break;
		}
		Serial.print(F("***** SMS #"));
		Serial.print(smsn);
		Serial.print(" (");
		Serial.print(smslen);
		Serial.println(F(") bytes *****"));
		Serial.println(replybuffer);
		Serial.println(F("*****"));

		break;
	}
	case 'R':
	{
		// read all SMS
		int8_t smsnum = fona.getNumSMS();
		uint16_t smslen;
		int8_t smsn;

		if ((type == FONA3G_A) || (type == FONA3G_E))
		{
			smsn = 0; // zero indexed
			smsnum--;
		}
		else
		{
			smsn = 1;  // 1 indexed
		}

		for (; smsn <= smsnum; smsn++)
		{
			Serial.print(F("\n\rReading SMS #"));
			Serial.println(smsn);
			if (!fona.readSMS(smsn, replybuffer, 250, &smslen))
			{  // pass in buffer and max len!
				Serial.println(F("Failed!"));
				break;
			}
			// 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)
			{
				Serial.println(F("[empty slot]"));
				smsnum++;
				continue;
			}

			Serial.print(F("***** SMS #"));
			Serial.print(smsn);
			Serial.print(" (");
			Serial.print(smslen);
			Serial.println(F(") bytes *****"));
			Serial.println(replybuffer);
			Serial.println(F("*****"));
		}
		break;
	}

	case 'd':
	{
		// delete an SMS
		flushSerial();
		Serial.print(F("Delete #"));
		uint8_t smsn = readnumber();

		Serial.print(F("\n\rDeleting SMS #"));
		Serial.println(smsn);
		if (fona.deleteSMS(smsn))
		{
			Serial.println(F("OK!"));
		}
		else
		{
			Serial.println(F("Couldn't delete"));
		}
		break;
	}

	case 's':
	{
		// send an SMS!
		char sendto[21], message[141];
		flushSerial();
		Serial.print(F("Send to #"));
		readline(sendto, 20);
		Serial.println(sendto);
		Serial.print(F("Type out one-line message (140 char): "));
		readline(message, 140);
		Serial.println(message);
		if (!fona.sendSMS(sendto, message))
		{
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("Sent!"));
		}

		break;
	}

	case 'u':
	{
		// send a USSD!
		char message[141];
		flushSerial();
		Serial.print(F("Type out one-line message (140 char): "));
		readline(message, 140);
		Serial.println(message);

		uint16_t ussdlen;
		if (!fona.sendUSSD(message, replybuffer, 250, &ussdlen))
		{ // pass in buffer and max len!
			Serial.println(F("Failed"));
		}
		else
		{
			Serial.println(F("Sent!"));
			Serial.print(F("***** USSD Reply"));
			Serial.print(" (");
			Serial.print(ussdlen);
			Serial.println(F(") bytes *****"));
			Serial.println(replybuffer);
			Serial.println(F("*****"));
		}
	}

		/*** Time ***/

	case 'y':
	{
		// enable network time sync
		if (!fona.enableNetworkTimeSync(true))
			Serial.println(F("Failed to enable"));
		break;
	}

	case 'Y':
	{
		// enable NTP time sync
		if (!fona.enableNTPTimeSync(true, F("pool.ntp.org")))
			Serial.println(F("Failed to enable"));
		break;
	}

	case 't':
	{
		// read the time
		char buffer[23];

		fona.getTime(buffer, 23); // make sure replybuffer is at least 23 bytes!
		Serial.print(F("Time = "));
		Serial.println(buffer);
		break;
	}

		/*********************************** GPS (SIM808 only) */

	case 'o':
	{
		// turn GPS off
		if (!fona.enableGPS(false))
			Serial.println(F("Failed to turn off"));
		break;
	}
	case 'O':
	{
		// turn GPS on
		if (!fona.enableGPS(true))
			Serial.println(F("Failed to turn on"));
		break;
	}
	case 'x':
	{
		int8_t stat;
		// check GPS fix
		stat = fona.GPSstatus();
		if (stat < 0)
			Serial.println(F("Failed to query"));
		if (stat == 0)
			Serial.println(F("GPS off"));
		if (stat == 1)
			Serial.println(F("No fix"));
		if (stat == 2)
			Serial.println(F("2D fix"));
		if (stat == 3)
			Serial.println(F("3D fix"));
		break;
	}

	case 'L':
	{
		// check for GPS location
		char gpsdata[120];
		fona.getGPS(0, gpsdata, 120);
		if (type == FONA808_V1)
			Serial.println(
					F(
							"Reply in format: mode,longitude,latitude,altitude,utctime(yyyymmddHHMMSS),ttff,satellites,speed,course"));
		else
			Serial.println(
					F(
							"Reply in format: mode,fixstatus,utctime(yyyymmddHHMMSS),latitude,longitude,altitude,speed,course,fixmode,reserved1,HDOP,PDOP,VDOP,reserved2,view_satellites,used_satellites,reserved3,C/N0max,HPA,VPA"));
		Serial.println(gpsdata);

		break;
	}

	case 'E':
	{
		flushSerial();
		if (type == FONA808_V1)
		{
			Serial.print(
					F(
							"GPS NMEA output sentences (0 = off, 34 = RMC+GGA, 255 = all)"));
		}
		else
		{
			Serial.print(F("On (1) or Off (0)? "));
		}
		uint8_t nmeaout = readnumber();

		// turn on NMEA output
		fona.enableGPSNMEA(nmeaout);

		break;
	}

		/*********************************** GPRS */

	case 'g':
	{
		// turn GPRS off
		if (!fona.enableGPRS(false))
			Serial.println(F("Failed to turn off"));
		break;
	}
	case 'G':
	{
		// turn GPRS on
		if (!fona.enableGPRS(true))
			Serial.println(F("Failed to turn on"));
		break;
	}
	case 'l':
	{
		// check for GSMLOC (requires GPRS)
		uint16_t returncode;

		if (!fona.getGSMLoc(&returncode, replybuffer, 250))
			Serial.println(F("Failed!"));
		if (returncode == 0)
		{
			Serial.println(replybuffer);
		}
		else
		{
			Serial.print(F("Fail code #"));
			Serial.println(returncode);
		}

		break;
	}
	case 'w':
	{
		// read website URL
		uint16_t statuscode;
		int16_t length;
		char url[80];

		flushSerial();
		Serial.println(F("NOTE: in beta! Use small webpages to read!"));
		Serial.println(
				F("URL to read (e.g. www.adafruit.com/testwifi/index.html):"));
		Serial.print(F("http://"));
		readline(url, 79);
		Serial.println(url);

		Serial.println(F("****"));
		if (!fona.HTTP_GET_start(url, &statuscode, (uint16_t *) &length))
		{
			Serial.println("Failed!");
			break;
		}
		while (length > 0)
		{
			while (fona.available())
			{
				char c = fona.read();

				// Serial.write is too slow, we'll write directly to Serial register!
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
				loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
				UDR0 = c;
#else
				Serial.write(c);
#endif
				length--;
				if (!length)
					break;
			}
		}
		Serial.println(F("\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();
		Serial.println(F("NOTE: in beta! Use simple websites to post!"));
		Serial.println(F("URL to post (e.g. httpbin.org/post):"));
		Serial.print(F("http://"));
		readline(url, 79);
		Serial.println(url);
		Serial.println(
				F("Data to post (e.g. \"foo\" or \"{\"simple\":\"json\"}\"):"));
		readline(data, 79);
		Serial.println(data);

		Serial.println(F("****"));
		if (!fona.HTTP_POST_start(url, F("text/plain"), (uint8_t *) data,
				strlen(data), &statuscode, (uint16_t *) &length))
		{
			Serial.println("Failed!");
			break;
		}
		while (length > 0)
		{
			while (fona.available())
			{
				char c = fona.read();

#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
				loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
				UDR0 = c;
#else
				Serial.write(c);
#endif

				length--;
				if (!length)
					break;
			}
		}
		Serial.println(F("\n****"));
		fona.HTTP_POST_end();
		break;
	}
		/*****************************************/

	case 'S':
	{
		Serial.println(F("Creating SERIAL TUBE"));
		while (1)
		{
			while (Serial.available())
			{
				delay(1);
				fona.write(Serial.read());
			}
			if (fona.available())
			{
				Serial.write(fona.read());
			}
		}
		break;
	}

	default:
	{
		Serial.println(F("Unknown command"));
		printMenu();
		break;
	}
	}
	// flush input
	flushSerial();
	while (fona.available())
	{
		Serial.write(fona.read());
	}

}

void flushSerial()

	while (Serial.available())
		Serial.read();
}
