User Tools

Site Tools


mmbasic_original:gps_simulator

GPS simulator

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.

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

mmbasic_original/gps_simulator.txt · Last modified: 2024/01/19 09:39 by 127.0.0.1