This module is part of the original MMBasic library. It is reproduced here with kind permission of Hugh Buckle and Geoff Graham. Be aware it may reference functionality which has changed or is deprecated in the latest versions of MMBasic.¶
Note: Any required file(s) are available in the attachments tab (top right).
This is nice - you need to test the GPS input to your project but the GPS module not arrived yet (or suspect)? This will drive it for you.
GPS-SIM.BAS
' GPS Simulator (Geoff Graham, Sept 2013)
' Configuration settings
ComPort$ = "COM1:4800"
SecondsToGetLock = 10
SpeedInKnots = 5
Cls
Print
Print "GPS Simulator (Geoff Graham, Sept 2013)"
Print "Simulates an EM-408 GPS module made by GlobalSat Technology."
Print
Print "Output is at " Mid$(ComPort$,6) " baud on I/O pin 16 (COM1: Tx pin)"
Print "The output will simulate the startup with" SecondsToGetLock " seconds to get a"
Print "lock. It will then simulate travelling east at" SpeedInKnots " knots."
LoopBack:
If lon <> 0 Then Close #1
Print
Print "Press any key to start followed by any key to stop."
' wait for the key press
Do : Loop While Inkey$ = ""
' initialise
t$ = Time$
sec = 0
lat = 3128.1234
lon = 11600.1234
Open ComPort$ As #1
' output the startup messages typically produced by the EM-408
PrintToGPS "$PSRFTXT,Version:GSW3.2.4_3.1.00.12-SDK003P1.00a"
PrintToGPS "$PSRFTXT,Version2:F-GPS-03-0701301"
PrintToGPS "$PSRFTXT,WAAS Enable"
PrintToGPS "$PSRFTXT,TOW: 0"
PrintToGPS "$PSRFTXT,WK: 1399"
PrintToGPS "$PSRFTXT,POS: 6378137 0 0"
PrintToGPS "$PSRFTXT,CLK: 96250"
PrintToGPS "$PSRFTXT,CHNL: 12"
PrintToGPS "$PSRFTXT,Baud rate: " + Mid$(ComPort$,6)
' now pretend that we are searching to get a fix on the satellites
Do
Do : Loop While t$ = Time$
t$ = Time$
sec = sec + 1
If Inkey$ <> "" Then GoTo LoopBack
SendGGA "V"
SendGSA "V"
SendRMC "V"
If sec Mod 5 = 0 Then SendGSV "V"
If Inkey$ <> "" Then GoTo LoopBack
Loop While sec < 20
' now pretend that we have a fix and are moving east
Do
Do : Loop While t$ = Time$
t$ = Time$
sec = sec + 1
If Inkey$ <> "" Then GoTo LoopBack
SendGGA "A", lat, lon
SendGSA "A"
SendRMC "A", lat, lon
If sec Mod 5 = 0 Then SendGSV "A"
lon = lon + SpeedInKnots/3600 ' this simulates movement east
If Inkey$ <> "" Then GoTo LoopBack
Loop
' output the NMEA RMC message
Sub SendRMC status$, lat, lon
Local msg$, tim$, dat$
tim$ = Time$
tim$ = Left$(tim$, 2) + Mid$(tim$, 4, 2) + Right$(tim$, 2) + ".000"
dat$ = Date$
dat$ = Left$(dat$, 2) + Mid$(dat$, 4, 2) + Right$(dat$, 2)
msg$ = "GPRMC," + tim$ + "," + status$ + "," + Format$(lat, "%09.4f") + ",S,"
msg$ = msg$ + Format$(lon, "%010.4f")
If status$ = "V" Then
msg$ = msg$ + ",E,0.00,90," + dat$ + ",,"
Else
msg$ = msg$ + ",E," + Format$(SpeedInKnots, "%04.2f") + ",90," + dat$ + ",,"
EndIf
SendToGPS msg$
End Sub
' output the GSV message
Sub SendGSV status$
If status$ = "V" Then
SendToGPS "GPGSV,3,1,12,20,00,000,43,10,00,000,,31,00,000,,27,00,000,"
SendToGPS "GPGSV,3,2,12,19,00,000,,07,00,000,,04,00,000,,24,00,000,"
SendToGPS "GPGSV,3,3,12,16,00,000,,28,00,000,,26,00,000,,29,00,000,"
Else
SendToGPS "GPGSV,3,1,12,11,75,324,36,01,59,146,27,32,58,161,34,20,56,209,30"
SendToGPS "GPGSV,3,2,12,23,52,301,40,25,42,101,,13,23,311,23,17,19,237,23"
SendToGPS "GPGSV,3,3,12,31,12,136,,19,08,358,13,14,06,136,,27,05,350,"
EndIf
End Sub
' output the GGA message
Sub SendGGA status$, lat, lon
Local msg$, tim$
tim$ = Time$
tim$ = Left$(tim$, 2) + Mid$(tim$, 4, 2) + Right$(tim$, 2) + ".000"
msg$ = "GPGGA," + tim$
If status$ = "V" Then
msg$ = msg$ + ",,,,,0,00,,,M,0.0,M,,0000"
Else
msg$ = msg$ + "," + Format$(lat, "%09.4f") + ",S," + Format$(lon, "%010.4f")
msg$ = msg$ + ",E,1,05,3.4,25.0,M,-29.3,M,,0000"
EndIf
SendToGPS msg$
End Sub
' output the GSA message
Sub SendGSA status$
If status$ = "V" Then
SendToGPS "GPGSA,A,1,,,,,,,,,,,,,,,"
Else
SendToGPS "GPGSA,A,3,23,20,13,11,32,,,,,,,,4.7,3.4,3.4"
EndIf
End Sub
' take a message and add the checksum and output
Sub SendToGPS msg$
Local cs, m$, i
For i = 1 To Len(msg$)
cs = (cs Xor Asc(Mid$(msg$, i, 1))) And &hFF
Next i
m$ = Hex$(cs)
If Len(m$) = 1 Then m$ = "0" + m$
PrintToGPS "$" + msg$ + "*" + m$
End Sub
' print the message to the COM port and the screen
Sub PrintToGPS msg$
Print #1, msg$
Print msg$
End Sub