' Read GPS string from serial port and set time ' August 2019 Guus Assmann ' *** ' Set serialport and clear buffer OPEN "",#1,"aux:" ~XBIOS(15,1,0,-1,-1,-1,-1) ' 9600 Baud,N,8,1 ' Now remove data from buffer WHILE BIOS(1,1)=-1 c&=INP(1) WEND CLOSEW 1 TITLEW #1,"GPS clock set" INFOW #1,"Reads NMAE $GPRMC string" OPENW 1 get_zone t$="" REPEAT PRINT AT(17,5);TIME$ PRINT AT(17,6);DATE$ nmeat$="" get_gps PRINT AT(3,2);"Lattitude : ";MID$(nmeat$,13,8);" N | Longitude : ";MID$(nmeat$,26,9);" E" PRINT AT(3,10);RIGHT$(nmeat$,59) correct_timezone PRINT AT(41,5);tset$ date_format PRINT AT(41,6);datum$ PRINT AT(3,7);"Push Y to set clock : " t$=INKEY$ PAUSE 45 UNTIL MOUSEK=2 OR t$="Y" OR t$="y" IF t$="Y" OR t$="y" TIME$=tset$ DATE$=datum$ ENDIF PRINT AT(3,12);"System time : ";TIME$ PRINT AT(3,13);" date : ";DATE$ PAUSE 200 END ' ' get_time in nmeat$ as hhmmss.00 > PROCEDURE get_gps nmeat$="" REPEAT WHILE BIOS(1,1)=-1 c&=INP(1) IF c&=36 c&=INP(1) IF c&=71 c&=INP(1) IF c&=80 c&=INP(1) IF c&=82 c&=INP(1) IF c&=77 c&=INP(1) IF c&=67 c&=INP(1) IF c&=44 FOR x=0 TO 58 c&=INP(1) nmeat$=nmeat$+CHR$(c&) NEXT x time!=TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF WEND UNTIL time! RETURN > PROCEDURE get_zone REPEAT PRINT AT(3,4);"Time-zone UTC, UTC+1, UTC+2,0,1,2 :"; INPUT a$ PRINT AT(3,5);"System time : | GPS time :" PRINT AT(3,6);" date : | date :" a&=VAL(a$) UNTIL a&=0 OR a&=1 OR a&=2 RETURN > PROCEDURE correct_timezone date_corr!=FALSE hour&=VAL(LEFT$(nmeat$,2)) hour&=hour&+a& IF hour&=24 hour&=0 date_corr!=TRUE ENDIF IF hour&=25 hour&=1 date_corr!=TRUE ENDIF tset$=STR$(hour&)+":"+MID$(nmeat$,3,2)+":"+MID$(nmeat$,5,2) RETURN > PROCEDURE date_format datum$=MID$(nmeat$,47,2)+"."+MID$(nmeat$,49,2)+".20"+MID$(nmeat$,51,2) day&=VAL(LEFT$(datum$,2)) IF date_corr! day&=day&+1 datum$=STR$(day&)+RIGHT$(datum$,8) ENDIF RETURN