REM Data logging with GPS unit and 1PPS timing
MODE 7
VDU3 : REM Disable printer
OFF : REM Cursor off
INSTALL @lib$+"DATELIB"
SYS "timeBeginPeriod", 1
VS1 = OPENUP "COM1: baud=19200 parity=N data=8 stop=1 xon=off"
REM Flush VS1 buffer
*FX 15,1
PRINTTAB(2,5) CHR$(130); " SSM VELOCITY BEAM"
PRINTTAB(0,6) CHR$(130);"_____________________________"
PROCInitTiming
PROCStartDayFile
REPEAT
REM Check PPS pin
SYS "GetCommModemStatus", @hfile%(VS1), ^modemstatus%
IF modemstatus%=32 AND PinHigh=FALSE THEN
PinHigh=TRUE
SYS "timeGetTime" TO Then%
SSM=(SSM+1) MOD 86400
IF SSM=0 THEN
PROCCloseDayFile
DayNumber%+=1
PROCStartDayFile
ENDIF
ENDIF
IF modemstatus%<>32 AND PinHigh=TRUE THEN PinHigh=FALSE
ENDIF
REM VS1 data collecting part
IF EXT#VS1>0 THEN
SYS "timeGetTime" TO Now%
A$=FNGetStringFromPort(VS1)
SSM$=STR$(SSM+(Now%-Then%)/1000) : Velocity$=FNExtractString(A$,1): Beam$=FNExtractString(A$,2)
Info$=" "
MID$(Info$,1)=SSM$ : MID$(Info$,14)=Velocity$ : MID$(Info$,24)=Beam$
PRINTTAB(0,7) CHR$(130); Info$
PRINT#DayFileHandle,SSM$+" "+Velocity$: BPUT#DayFileHandle,10
ENDIF
UNTIL FALSE
END
DEFPROCStartDayFile
DayFileName$=FN_date$(DayNumber%, "yyy MM dd")+".txt"
REM Replace gaps with "-"
MID$(DayFileName$,5,1)="-"
MID$(DayFileName$,8,1)="-"
PRINTTAB(8,0) CHR$(134); DayFileName$
DayFileHandle=OPENOUT DayFileName$
FileOpen=TRUE
ENDPROC
DEFPROCCloseDayFile
CLOSE#DayFileHandle
FileOpen=FALSE
ENDPROC
DEFPROCInitTiming
REM Initialises the timing using PC clock. Start by waiting for the seconds to change.
Then$=TIME$
REPEAT
Now$=TIME$
UNTIL Now$<>Then$
SSM=3600*VAL(MID$(Now$,17,2)) + 60*VAL(MID$(Now$,20,2)) + VAL(MID$(Now$,23,2))
SYS "timeGetTime" TO Then%
DayNumber%=FN_today
PinHigh=FALSE
ENDPROC
DEF FNExtractString(InStr$,WhichStr%)
REM Extracts sub-string WhichStr% (counting from left) in InStr$. NB: Assumes single spaces between sub-strings
LOCAL StrIndex%, Left$, Work$
Work$=InStr$
IF WhichStr%=1 THEN
Left$=LEFT$(Work$,INSTR(Work$," ")-1)
ELSE
FOR StrIndex%=2 TO WhichStr%
Work$=MID$(Work$, INSTR(Work$," ")+1)
Left$=LEFT$(Work$,INSTR(Work$," ")-1)
NEXT
ENDIF
=Left$
DEF FNDayToString(Offset%)
REM Formats today's date (with offset) to a string of form yyyy-mm-dd
REM Get Julian Day Number
Day%=FN_today+Offset%
REM Format date string
Date$=FN_date$(Day%, "yyy MM dd")
REM Replace gaps with "-"
MID$(Date$,5,1)="-"
MID$(Date$,8,1)="-"
=Date$
DEF FNGetStringFromPort(Where%)
LOCAL Data%, Reply$
Reply$=""
REPEAT
IF EXT#Where%>0 THEN
Data%=BGET#Where%
IF Data%<>10 AND Data%<>13 THEN Reply$=Reply$+CHR$(Data%)
ENDIF
UNTIL Data%=10
=Reply$
REPEAT
REM Check PPS pin
SYS "GetCommModemStatus", @hfile%(VS1), ^modemstatus%
IF modemstatus%=32 AND PinHigh=FALSE THEN
PinHigh=TRUE
SYS "timeGetTime" TO Then%
SSM=(SSM+1) MOD 86400
IF SSM=0 THEN
PROCCloseDayFile
DayNumber%+=1
PROCStartDayFile
ENDIF
ENDIF
IF modemstatus%<>32 AND PinHigh=TRUE THEN PinHigh=FALSE
ENDIF
REM Monitor incoming Serial Data and a Pulse Per Second signal.
REM By Richard Russell, http://www.rtrussell.co.uk/, 10-Jan-2013
REM!WC Windows Constants:
EV_RLSD = 32
EV_RXCHAR = 1
MS_RLSD_ON = &80
HIGH_PRIORITY_CLASS = &80
NORMAL_PRIORITY_CLASS = 32
WAIT_TIMEOUT = 258
REM Settings:
SerialPort$ = "COM1:19200,N,8,1"
PPS_Status% = MS_RLSD_ON
PPS_Event% = EV_RLSD
PPS_Edge% = FALSE
REM Initialise:
MODE 7
*FONT BBCWin
SYS "timeBeginPeriod", 1
SYS "GetCurrentProcess" TO hprocess%
SYS "SetPriorityClass", hprocess%, HIGH_PRIORITY_CLASS
DIM overlapped{Internal%, InternalHigh%, Offset%, OffsetHigh%, hEvent%}
REM Boilerplate:
ON ERROR PROCcleanup : SYS "MessageBox", @hwnd%, REPORT$, 0, 0 : QUIT
ON CLOSE PROCcleanup : QUIT
REM Open serial port:
port% = OPENUP(SerialPort$)
IF port% = 0 ERROR 100, "Cannot open port"
overlapped.hEvent% = @hevent%
REM Set event(s) to be monitored:
SYS "SetCommMask", @hfile%(port%), PPS_Event% OR EV_RXCHAR TO res%
IF res% = 0 ERROR 100, "SetCommMask failed"
REM Main loop:
SSM% = 0
Was% = 0
Reply$ = ""
REPEAT
REM Await serial event:
SYS "WaitCommEvent", @hfile%(port%), ^evtmask%, overlapped{} TO res%
IF res% = 0 THEN
REPEAT
SYS "WaitForSingleObject", @hevent%, 2000 TO res%
UNTIL res% <> WAIT_TIMEOUT
SYS "GetOverlappedResult", @hfile%(port%), overlapped{}, ^temp%, 0
ENDIF
REM Process Pulse Per Second events:
IF evtmask% AND PPS_Event% THEN
SYS "GetCommModemStatus", @hfile%(port%), ^status%
IF (status% AND PPS_Status%)==0 EOR PPS_Edge% THEN
SYS "timeGetTime" TO Was%
SSM% = (SSM% + 1) MOD 86400
ENDIF
ENDIF
REM Process received data events:
IF evtmask% AND EV_RXCHAR THEN
WHILE EXT#port%
Reply$ += CHR$BGET#port%
ENDWHILE
IF RIGHT$(Reply$) = CHR$10 THEN
SYS "timeGetTime" TO Now%
PRINT SSM% + (Now%-Was%)/1000 " " Reply$ ;
Reply$ = ""
ENDIF
ENDIF
UNTIL FALSE
PROCcleanup
END
REM Cleanup before exit:
DEF PROCcleanup
LOCAL hprocess%
SYS "GetCurrentProcess" TO hprocess%
SYS "SetPriorityClass", hprocess%, NORMAL_PRIORITY_CLASS
ENDPROC