Listing 1

Boolean wf_detect_bt()
//poll BT device until we get a hit
Integer li_sub = 1
Boolean lb_connected = FALSE
UnsignedLong ll_tmp = 3221225472

	is_CommPort = "COM9:"

	//BT Already detected
	If il_hCon > 0 Then
		Return True
	End If

	//try to connect until we get a hit or tired of hitting the messagebox
	Do While li_sub <= 10 And Not lb_connected
		il_hCon = CreateFile(is_CommPort, ll_tmp, 3, 0, 3, 0, 0);
		If il_hCon < 0 Then
			MessageBox(This.Title, "Bluetooth GPS NOT detected " + 
			String(il_hCon))
		Else
			MessageBox(This.Title, "Bluetooth GPS detected " + String
			(il_hCon))
			lb_connected = TRUE
		End If
		li_sub ++
	Loop

	If Not lb_connected Then
		MessageBox(This.Title, "Bluetooth GPS NOT detected ")
	End If

	Return lb_Connected


Listing 2

Boolean wf_close_bt()

	CloseHandle(il_hCon)

	Return True


Listing 3

Boolean wf_write_gps()

//Request Data from GPS

String ls_write
Long ll_write
Long ll_written
Long ll_rc

	ls_write = "$GP"
	ll_write = Len(ls_write)

	ll_rc = WriteFile( il_hcon, ls_write, ll_write, ll_written, Long(0) )

	Return True


Listing 4

Boolean wf_read_gps()
//Read data returning from GPS
OleObject loo_Location, loo_PinCurrentFix
uo_nmea_service 	ln_nmea
str_nmea_data 		lstr_nmea_data

Double	ldb_Minutes
Long ll_read
String ls_read
Long ll_rc
Integer 	li_rc
String ls_Data
Integer	ll_i
String	ls_Sentance
String	ls_SentanceType
Double	ldb_lat, ldb_Long, ldb_Alt
String	ls_Alt, ls_Lat, ls_Long
String	ls_Temp

	ls_read = SPACE(300)

	ll_rc = ReadFile( il_hcon, ls_read, len(ls_read),  ll_read, Long(0) )

	is_Read = ls_Read

	mle_rawdata.text = is_Read

	ln_nmea = CREATE uo_nmea_service
	li_rc = ln_nmea.f_setnmea_data(is_Read)


	ls_sentance = is_Read
	Do While ls_Sentance <> ''
		ls_Sentance = get_token(is_Read, '~n')
		ls_SentanceType = Mid(ls_Sentance, 2, 5)
		ln_nmea.f_setnmea_type(ls_sentancetype)
		lstr_nmea_data = ln_nmea.f_nmea_decode()

		//lets only go for 3-D fix
		If lstr_nmea_data.latitude <> '' and ls_SentanceType = '
              GPGGA' Then

			ls_Alt = Trim(lstr_nmea_data.altitude)
			ls_Lat=  Trim(lstr_nmea_data.latitude)
			ls_Long =Trim(lstr_nmea_data.longitude)

			ldb_lat = Double(ls_Lat)
			ldb_Long = Double(ls_Long)
			ldb_Alt = Double(ls_Alt)

			ldb_lat /= 100
			ldb_Long /= 100
			ldb_Alt /=1000

			//convet to decimal degrees, do some weird math,
			i'm sure this could be improved
			ls_lat = String(ldb_lat)
			ls_long = String(ldb_Long)

			ldb_lat = Truncate(ldb_lat, 0)
			ls_Temp = Mid(ls_lat, 1 + Pos(ls_lat, '.'))
			ldb_Minutes = Round(Double(ls_Temp) / 10000, 5)
			ldb_lat += Round(ldb_Minutes / 60, 5)

			ldb_Long = Truncate(ldb_Long, 0)
			ls_Temp = Mid(ls_long, 1 + Pos(ls_long, '.'))
			ldb_Minutes = Round(Double(ls_Temp) / 10000 , 5)
			ldb_Long += Round(ldb_Minutes  / 60, 5)

			If lstr_nmea_data.latitue_dir = 'S' Then
				ldb_lat = -ldb_lat
			End If

			If lstr_nmea_data.longitude_dir = 'W' Then
				ldb_Long = -ldb_Long
			End If

			Exit
		End If
	Loop

	DESTROY ln_nmea

	//make sure we have a fix
	If lstr_nmea_data.fix <> '1' Then
		MessageBox('Data Fix', 'Cannot get data fix? : ' +lstr_nmea_data.fix)
		dw_coordinates.Object.Lattitude[1] = ''
		dw_coordinates.Object.Longitude[1] = ''
		dw_coordinates.Object.Altitude[1] = ''
		dw_coordinates.Object.TimeOfFix[1] = ''
		dw_coordinates.Object.Status[1] = 'Initializing'
		Return False
	End If

	//set our data
	dw_coordinates.Object.Lattitude[1] = String(ldb_lat)
	dw_coordinates.Object.Longitude[1] = String(ldb_long)
	dw_coordinates.Object.Altitude[1] = String(ldb_Alt)
	dw_coordinates.Object.TimeOfFix[1] = lstr_nmea_data.fix_utc_time
	dw_coordinates.Object.Status[1] = 'Receiving Data'

	//now map it
	loo_Location = ioo_Map.GetLocation(ldb_Lat, ldb_Long, ldb_Alt)
	loo_PinCurrentFix=ioo_Map.AddPushpin(loo_Location,"You are here!")
	loo_Location.GoTo()
	loo_PinCurrentFix.Select()

	Return True


Listing 5

String wf_get_token(ref string as_string, string as_token)

//a utility function for parsing strings

Long	ll_pos
String	ls_rtn

	ll_pos = Pos ( as_string, as_token )
	If ll_pos = 0 Then
		ls_rtn = as_string
		as_string = ''
	Else
		ls_rtn = Left ( as_string, ll_pos - 1 )
		as_string = Mid ( as_string, ll_pos + Len(as_token) )
	End If

	Return ls_rtn