REM *************************************************************************
REM *  Copyright Sutter Instrument Company (C) 1998
REM *
REM *  Version 2.1 N.B.: This is written in Power BASIC
REM *
REM *    1) Velocity now contains the step resolution in the high-order bit
REM *       Set = 50 usteps/step;  Clear = 10 usteps/step
REM *       N.B. Max. value is 32767 and RSPEED contains the resolution bit
REM *
REM *    2) Nine new commands have been added
REM *          C Absolute movement mode for program vectors (output "a")
REM *          L Relative ....                              (output "b")
REM *          D Download program TO controller in VECTORS  (output "d")
REM *          U Upload  ...  FROM  ...                     (output "u")
REM *          H Separate help screen
REM *          R Reset controller                           (output "r")
REM *          E Interrupt PAUSE in robotics                (output "e")
REM *          X Toggle; No position query & slow download
REM *          J A built-in centering routine
REM *
REM *    3) Lame timeout incorporated (ON TIMER)
REM *
REM *  Version 1.2/1.3 Modifications
REM *
REM *	1) Parity can now be accomodated if desired. Use:
REM *         OPEN "COM1:9600,E,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
REM *
REM *   2) The parameter RSPEED now comes in on the 32 byte stats string
REM *         Now, all 32 bytes are read;  See SHOWSTATS
REM *
REM *	3) The display has been revised
REM *
REM *   4) The input and display for the MOVE command has been revised such
REM *      that the step and æm displays are valid for 50 and 10 æsteps/step.
REM *
REM *   5) Three new commands have been added.
REM *         N   "reNew" causes a complete rewrite of the VFD display
REM *         D   toggles the position display and input from steps to æm
REM *         Z   sends an invalid command ("z") to test SIO error 4
REM *
REM * Notes:  N, Z do not behave properly unless vectors are displayed on VFD
REM *         Parity must be implemented by modifying the OPEN instructions
REM *
REM *************************************************************************

$EVENT ON
ON TIMER (2) GOSUB TIMEOUT

UNION fourbytes
    longfield  AS LONG
    fourstring AS STRING*4
END UNION

UNION twobytes
    wordfield  AS WORD
    numbfield  AS INTEGER
    twostring  AS STRING*2
END UNION

UNION onebyte
    bytefield  AS BYTE
    onestring  AS STRING*1
END UNION

DIM XVAL     AS fourbytes
DIM YVAL     AS fourbytes
DIM ZVAL     AS fourbytes
DIM FLAGS    AS onebyte
DIM UDIRX    AS onebyte
DIM UDIRY    AS onebyte
DIM UDIRZ    AS onebyte
DIM DEAD     AS twobytes
DIM UOFFSET  AS twobytes
DIM URANGE   AS twobytes
DIM PULSE    AS twobytes
DIM USPEED   AS twobytes
DIM POWER    AS onebyte
DIM ECHOSTAT AS onebyte
DIM SAFELO   AS twobytes
DIM SAFEHI   AS twobytes
DIM BAUDHI   AS onebyte
DIM BAUDLO   AS onebyte
DIM STEPDIV  AS twobytes
DIM STEPMUL  AS twobytes
DIM RSPEED   AS twobytes
DIM XPARAM   AS twobytes
DIM VELOCITY AS twobytes

DIM PROGRAMNUMBER   AS twobytes
DIM NUMBERofVECTORS AS twobytes
DIM UPLOADCOUNT     AS twobytes

DIM USTEPS AS WORD

ROBOFILE$ = "TEST.DAT"
SAVEFILE$ = "MP185.DAT"
DOWNLOAD$ = "DOWNLOAD.DAT"
UPLOAD$   = "UPLOAD.DAT"

OPEN SAVEFILE$ FOR OUTPUT AS #2

DISPLAYTYPE%=1
PULSESTR$="PULSE speed (æs/æstep):"
BAUDRATE=9600
PORTVAL=1
RSPEED.wordfield=6550
QUERYFLAG = 1

GOSUB MP185INIT

MAIN:
LOCATE 1,1,0
PRINT " Press H for help "
SLEEP 2
LOCATE 1,1,0
PRINT "                  "

WHILE(1)
REM OPEN "COM1:19200,E,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    GOSUB OPENCOM
    WHILE NOT INSTAT
    	IF QUERYFLAG THEN
	    	IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    	    GOSUB GETLOCATION
        	GOSUB SHOWLOCATION
        END IF
	DELAY 0.1
WEND
    MYKEY$ = INKEY$
    IF     MYKEY$ = " "                 THEN
        GOSUB QUIETCOMMAND
    ELSEIF MYKEY$ = "A" OR MYKEY$ = "a" THEN
        GOSUB GETSTATSCOMMAND
    ELSEIF MYKEY$ = "B" OR MYKEY$ = "b" THEN
        GOSUB GETSPEEDCOMMAND
    ELSEIF MYKEY$ = "C" OR MYKEY$ = "c" THEN
    	GOSUB SETABSOLUTEMODE
    ELSEIF MYKEY$ = "D" OR MYKEY$ = "d" THEN
    	GOSUB DOWNLOADPROGRAM
    ELSEIF MYKEY$ = "E" OR MYKEY$ = "e" THEN
        GOSUB ENDPAUSECOMMAND
    ELSEIF MYKEY$ = "F" OR MYKEY$ = "f" THEN
        GOSUB INFILECOMMAND
    ELSEIF MYKEY$ = "G" OR MYKEY$ = "g" THEN
        GOSUB GETLOCUSCOMMAND
    ELSEIF MYKEY$ = "H" OR MYKEY$ = "h" THEN
        GOSUB HELPCOMMAND
    ELSEIF MYKEY$ = "I" OR MYKEY$ = "i" THEN
        GOSUB INTERRUPTMOVE
    ELSEIF MYKEY$ = "J" OR MYKEY$ = "j" THEN
        GOSUB FINDCENTER
    ELSEIF MYKEY$ = "L" OR MYKEY$ = "l" THEN
    	GOSUB SETRELATIVEMODE
    ELSEIF MYKEY$ = "M" OR MYKEY$ = "m" THEN
        GOSUB MOVECOMMAND
    ELSEIF MYKEY$ = "N" OR MYKEY$ = "n" THEN
        GOSUB VFDRENEWCOMMAND
    ELSEIF MYKEY$ = "O" OR MYKEY$ = "o" THEN
        GOSUB ORIGINCOMMAND
    ELSEIF MYKEY$ = "P" OR MYKEY$ = "p" THEN
        GOSUB PLAYCOMMAND
    ELSEIF MYKEY$ = "Q" OR MYKEY$ = "q" THEN
        GOTO  MP185END
    ELSEIF MYKEY$ = "R" OR MYKEY$ = "r" THEN
        GOSUB RESETCOMMAND
    ELSEIF MYKEY$ = "S" OR MYKEY$ = "s" THEN
        GOSUB SHOWSTATSCOMMAND
    ELSEIF MYKEY$ = "T" OR MYKEY$ = "t" THEN
        GOSUB TESTER
    ELSEIF MYKEY$ = "U" OR MYKEY$ = "u" THEN
    	GOSUB UPLOADPROGRAM
    ELSEIF MYKEY$ = "V" OR MYKEY$ = "v" THEN
        GOSUB VELOCITYCOMMAND
    ELSEIF MYKEY$ = "W" OR MYKEY$ = "w" THEN
        GOSUB OUTFILECOMMAND
    ELSEIF MYKEY$ = "X" OR MYKEY$ = "x" THEN
        GOSUB QUERYTOGGLECOMMAND
    ELSEIF MYKEY$ = "Y" OR MYKEY$ = "y" THEN
        GOSUB SHOWPARAMS
    ELSEIF MYKEY$ = "Z" OR MYKEY$ = "z" THEN
        GOSUB BOGUSCOMMAND
    ELSEIF LEN(MYKEY$) = 2              THEN
    	PRINT VAL(MID$(MYKEY$,2,1))
        SECONDVAL = VAL (MID$ (MYKEY$,2,1))
        IF     SECONDVAL = 1 THEN GOSUB HELPCOMMAND
    ELSE
    	OTHERCHAR = VAL(MID$(MYKEY$,1,1))
        IF OTHERCHAR=3 OR OTHERCHAR=27 THEN
	        IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    	    PRINT #1, CHR$(03);
        	PRINT #1, CHR$(13);
	        DONEFLAG$ = INPUT$(1,#1)
        ELSE
            LOCATE 1,1,0
            PRINT ">"
            SLEEP 0.1
            LOCATE 1,1,0
            PRINT " "
        END IF
    END IF
	IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    CLOSE #1
WEND

REM *************************************************************************
REM * Keyboard command routines
REM *************************************************************************
REM *
REM * QUIETCOMMAND                  = space
REM * GETSTATSCOMMAND               = A
REM * GETSPEEDCOMMAND               = B
REM * SETABSOLUTEMODE               = C
REM * DOWNLOADPROGRAM               = D
REM *     WAITforRESPONSE
REM * ENDPAUSECOMMAND               = E
REM * INFILECOMMAND                 = F
REM * GETLOCUSCOMMAND               = G
REM * HELPCOMMAND                   = H
REM * INTERRUPTMOVE                 = I
REM * FINDCENTER                    = J
REM *     MP285CENTER
REM * SETRELATIVEMODE               = L
REM * MOVECOMMAND                   = M
REM *     PUTLOCATION
REM * VFDRENEWCOMMAND               = N
REM * ORIGINCOMMAND                 = O
REM * PLAYCOMMAND                   = P
REM * MP185END                      = Q
REM * RESETCOMMAND                  = R
REM * SHOWSTATSCOMMAND              = S
REM * TESTER                        = T
REM * UPLOADPROGRAM                 = U
REM * VELOCITYCOMMAND               = V
REM *     PUTVELOCITY
REM * OUTFILECOMMAND                = W
REM * QUERYTOGGLECOMMAND            = X
REM * SHOWPARAMS                    = Y
REM *     SHOWINTERNALPARAMETERS
REM * BOGUSCOMMAND                  = Z
REM *
REM *************************************************************************
REM * Display routines
REM *************************************************************************
REM *
REM * REFRESHDISPLAY
REM * GETLOCATION
REM * SHOWLOCATION
REM * SHOWSTATS
REM * GETFILENAME
REM *
REM *************************************************************************
REM * Initializations and others
REM *************************************************************************
REM *
REM * MP185INIT
REM * INITCOM
REM * OPENCOM
REM * OPENCOM1
REM * OPENCOM2
REM * TIMEOUT
REM * KEYWAIT
REM * MP185RESET
REM * MP185END
REM *
REM *************************************************************************

QUIETCOMMAND:
    LOCATE 1,1,0
    PRINT "REMOTE DISABLED ... press any key to resume";
    LOCATE 3,60,0
    PRINT"Remote  disabled";
    WHILE NOT INSTAT : WEND
    MYKEY$ = "s"
    LOCATE 1,1,0
    PRINT "                                           ";
    GOSUB SHOWSTATSCOMMAND
    RETURN

GETSTATSCOMMAND:
    GOSUB SHOWSTATSCOMMAND
    WRITE #2, "a",FLAGS.bytefield,UDIRX.bytefield,UDIRY.bytefield,UDIRZ.bytefield,_
              DEAD.wordfield,UOFFSET.wordfield,URANGE.wordfield,PULSE.wordfield,_
              USPEED.wordfield,POWER.bytefield,ECHOSTAT.bytefield,_
              SAFELO.wordfield,SAFEHI.wordfield,RSPEED.wordfield
    LOCATE 24,63,0
    PRINT "Line ";LCOUNTER;" saved"
    LCOUNTER = LCOUNTER + 1
    RETURN

GETSPEEDCOMMAND:
    GOSUB SHOWSTATSCOMMAND
    WRITE #2, "v",RSPEED.wordfield
    LOCATE 24,63,0
    PRINT "Line ";LCOUNTER;" saved"
    LCOUNTER = LCOUNTER + 1
    RETURN

SETABSOLUTEMODE:
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, "a"
    PRINT #1, CHR$(13);
    DONEFLAG$ = INPUT$(1,#1)
    RETURN

DOWNLOADPROGRAM:
	LOCATE 1,1,0
    PRINT "Press 1 to confirm download"
    WHILE NOT INSTAT : WEND
    MYKEY$ = INKEY$
    IF MYKEY$ <> "1" THEN
    	LOCATE 1,1,0
    	PRINT "                           "
        RETURN
    END IF
	LOCATE 1,1,0
    PRINT "                                                "
    PRINT "                        "
    OPEN DOWNLOAD$ FOR INPUT AS #4
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, "d";
    IF QUERYFLAG = 0 THEN SLEEP 1
    INPUT #4, PROGRAMNUMBER.wordfield
    PRINT #1, PROGRAMNUMBER.twostring;
    IF QUERYFLAG = 0 THEN SLEEP 1
    INPUT #4, NUMBERofVECTORS.wordfield
    PRINT #1, NUMBERofVECTORS.twostring;
    IF QUERYFLAG = 0 THEN SLEEP 1
    INPUT #4, spacer$
    PRINT #1, CHR$(13);
    I=0
    linenumber=NUMBERofVECTORS.wordfield
    GOSUB WAITforRESPONSE
    IF DONEFLAG$ <> CHR$(13) THEN RETURN

    LOCATE 1,1,0
    PRINT "                             "
    LOCATE 1,1,0
    PRINT "Download:";PROGRAMNUMBER.wordfield

    FOR I=1 TO linenumber

        INPUT #4, VELOCITY.numbfield
        INPUT #4, XVAL.longfield
        INPUT #4, YVAL.longfield
        INPUT #4, ZVAL.longfield
        INPUT #4, spacer$

        PRINT #1, VELOCITY.twostring;
        IF QUERYFLAG = 0 THEN SLEEP 1
		PRINT #1, XVAL.fourstring;
	    IF QUERYFLAG = 0 THEN SLEEP 1
        PRINT #1, YVAL.fourstring;
	    IF QUERYFLAG = 0 THEN SLEEP 1
        PRINT #1, ZVAL.fourstring;
	    IF QUERYFLAG = 0 THEN SLEEP 1

        LOCATE 2,1,0
	    PRINT "Line";I;"of";linenumber;
        LOCATE 1,15,0
        PRINT "                             "
        LOCATE 2,15,0
        PRINT "                                      ";
        LOCATE 1,15,0
        PRINT  " V: "; VELOCITY.numbfield
        LOCATE 2,15,0
		XVAL.longfield = XVAL.longfield * STEPDIV.wordfield
    	YVAL.longfield = YVAL.longfield * STEPDIV.wordfield
	    ZVAL.longfield = ZVAL.longfield * STEPDIV.wordfield
        PRINT  " X: "; XVAL.longfield;
        PRINT ", Y: "; YVAL.longfield;
        PRINT ", Z: "; ZVAL.longfield;

        GOSUB WAITforRESPONSE
        IF DONEFLAG$ <> CHR$(13) THEN RETURN

    NEXT I

    LOCATE 1,1,0
    PRINT "                             "
    PRINT "                                                 ";
    LOCATE 1,1,0
    PRINT "Download OK; Press a key.    ";
    WHILE NOT INSTAT : WEND
    LOCATE 1,1,0
    PRINT "                             ";
    CLOSE #4
	RETURN

WAITforRESPONSE:
	IF QUERYFLAG THEN
		TIMER ON
	    DONEFLAG$=INPUT$(1,#1)
	    TIMER OFF
	    IF DONEFLAG$ <> CHR$(13) THEN
	    	CLOSE #4
	        LOCATE 3,60,0
	        PRINT "Error: vector ";I
	        REM BEEP 3
	        WHILE NOT INSTAT : WEND
	    END IF
    ELSE
    	SLEEP 1
    END IF
    SLEEP 0.1
    RETURN

ENDPAUSECOMMAND:
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, "e";
    PRINT #1, CHR$(13);
    DONEFLAG$ = INPUT$(1,#1)
    LOCATE 1,1,0
	PRINT " End pause sent       "
    SLEEP 0.1
    LOCATE 1,1,0
    PRINT "                      "
	RETURN

INFILECOMMAND:
    GOSUB GETFILENAME
    ROBOFILE$ = WHATFILE$
    LOCATE 24,43,0
    PRINT "                    "
    LOCATE 24,43,0
    PRINT ROBOFILE$
    LCOUNTER = 1
    LOCATE 24,63,0
    PRINT "              "
    RETURN

GETLOCUSCOMMAND:
    GOSUB GETLOCATION
    GOSUB SHOWLOCATION
    WRITE #2, "m",XVAL.longfield, YVAL.longfield, ZVAL.longfield
    LOCATE 24,63,0
    PRINT "Line ";LCOUNTER;" saved"
    LCOUNTER = LCOUNTER + 1
    RETURN

HELPCOMMAND:
	CLS
    PRINT "                      PRESS A KEY TO RETURN "
    PRINT
    PRINT " M = MOVE to XYZ                               E = End programmed pause "
    PRINT " O = Reset ORIGIN and resolution               X = Turn on/off position query "
    PRINT " V = Change speed and resolution               N = Renew the VFD display "
    PRINT " Q = END this program                          S = Update stats "
    PRINT " R = RESET controller and END                  J = Centering routine "
    PRINT " <Space bar> = disable serial communication
    PRINT
    PRINT "     Current program source file is: "; ROBOFILE$
    PRINT " F = Name a new input file "
    PRINT " P = Execute command sequence saved in the input file "
    PRINT " C = Set absolute coordinate mode for robotics"
    PRINT " L = Set relative coordinate mode for robotics"
    PRINT " D = Download robotics program from DOWNLOAD.DAT to controller"
    PRINT " U = Upload robotics program from controller to UPLOAD.DAT"
    PRINT
    PRINT "     Current capture file is: "; SAVEFILE$
    PRINT " W = Name a new output file "
    PRINT " A = Save stats in output file "
    PRINT " G = Save XYZ coordinates in output file "
    PRINT " B = Save speed in output file "
    PRINT " Z = Bad command to test serial routines"
    PRINT " H = Help                                      Y = Show input parameters "
    WHILE NOT INSTAT : WEND
    CLS
    GOSUB REFRESHDISPLAY
    RETURN

INTERRUPTMOVE:
	RETURN

	REM  N.B.!  This hangs the controller if used to interrupt
    REM         execution of internal robotics program. A controller
    REM         reset after hanging will recover but it's messy. Ugh.

    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, CHR$(03);
    PRINT #1, CHR$(13);
    DONEFLAG$ = INPUT$(1,#1)
    LOCATE 1,1,0
	PRINT " Interrupt sent "
    SLEEP 0.1
    LOCATE 1,1,0
    PRINT "                "
	RETURN

FINDCENTER:
	LOCATE 1,1,0
    PRINT "Press 1 to confirm centering routine.   "
    WHILE NOT INSTAT : WEND
    MYKEY$ = INKEY$
    IF MYKEY$ = "1" THEN GOTO MP285CENTER
	LOCATE 1,1,0
    PRINT "                                        "
    PRINT "                                        "
    RETURN

MP285CENTER:
	LOCATE 1,1,0
    PRINT "Finding endpoint. Please be patient.    "
    PRINT "OK to interrupt with Enter at endpoint. "
    XVAL.longfield=-30000*25
    YVAL.longfield=-30000*25
    ZVAL.longfield=-30000*25
    GOSUB PUTLOCATION
    IF INSTAT THEN MYKEY$ = INKEY$
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    LOCATE 1,1,0
    PRINT "Endpoint found. Origin reset. Returning."
    PRINT "                                        "
    GOSUB ORIGINCOMMAND
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    GOSUB GETLOCATION
    GOSUB SHOWLOCATION
    SLEEP 1
    XVAL.longfield=30000*25
    YVAL.longfield=30000*25
    ZVAL.longfield=30000*25
    GOSUB PUTLOCATION
    IF INSTAT THEN MYKEY$ = INKEY$
    LOCATE 1,1,0
    PRINT "Max excursion found. Centering now.     "
    SLEEP 1
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    GOSUB GETLOCATION
    GOSUB SHOWLOCATION
    LOCATE 2,1,0
    PRINT "X: "; XVAL.longfield/25, "  +/-"; XVAL.longfield/50
    PRINT "Y: "; YVAL.longfield/25, "  +/-"; YVAL.longfield/50
    PRINT "Z: "; ZVAL.longfield/25, "  +/-"; ZVAL.longfield/50
    XVAL.longfield=XVAL.longfield/2
    YVAL.longfield=YVAL.longfield/2
    ZVAL.longfield=ZVAL.longfield/2
    GOSUB PUTLOCATION
    IF INSTAT THEN MYKEY$ = INKEY$
    SLEEP 2
    GOSUB ORIGINCOMMAND
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    GOSUB GETLOCATION
    GOSUB SHOWLOCATION
    LOCATE 1,1,0
    PRINT "****Centering complete. Press Enter.****";
    IF INSTAT THEN MYKEY$ = INKEY$
    WHILE NOT INSTAT : WEND
    LOCATE 1,1,0
    PRINT "                                        "
    PRINT "                                  "
    PRINT "                                  "
    PRINT "                                  "
    RETURN

SETRELATIVEMODE:
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, "b"
    PRINT #1, CHR$(13);
    DONEFLAG$ = INPUT$(1,#1)
    RETURN

MOVECOMMAND:
    LOCATE 5,30,0
    PRINT " Move to:";
    IF DISPLAYTYPE%=1 THEN
    	LOCATE 7,36,0
    	INPUT "X = ";X
    	LOCATE 8,36,0
    	INPUT "Y = ";Y
    	LOCATE 9,36,0
    	INPUT "Z = ";Z
		XVAL.longfield = X * STEPDIV.wordfield
    	YVAL.longfield = Y * STEPDIV.wordfield
    	ZVAL.longfield = Z * STEPDIV.wordfield
    ELSE
    	LOCATE 7,36,0
    	INPUT "XSteps = ";XS
        LOCATE 7,52,0
        INPUT "XæSteps = ";XUS
    	LOCATE 8,36,0
    	INPUT "YSteps = ";YS
        LOCATE 8,52,0
        INPUT "YæSteps = ";YUS
    	LOCATE 9,36,0
    	INPUT "ZSteps = ";ZS
        LOCATE 9,52,0
        INPUT "ZæSteps = ";ZUS
        XVAL.longfield = (XS*USTEPS)+XUS
        YVAL.longfield = (YS*USTEPS)+YUS
        ZVAL.longfield = (ZS*USTEPS)+ZUS
    END IF
    LOCATE 5,30,0
    PRINT "               ";
    LOCATE 7,36,0
    PRINT "                                ";
    LOCATE 8,36,0
    PRINT "                                ";
    LOCATE 9,36,0
    PRINT "                                ";
    GOSUB PUTLOCATION
    RETURN

PUTLOCATION:
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, "m";
    PRINT #1, XVAL.fourstring;
    PRINT #1, YVAL.fourstring;
    PRINT #1, ZVAL.fourstring;
    PRINT #1, CHR$(13);
    DONEFLAG$ = "X"
    BLINKCOUNTER = 0
    WHILE NOT INSTAT
        LOCATE 3,60,0
        IF BLINKCOUNTER < 1000 THEN PRINT "Move in progress";
        IF BLINKCOUNTER > 1000 AND BLINKCOUNTER < 2000 THEN PRINT "                ";
        IF BLINKCOUNTER > 2000 THEN BLINKCOUNTER = 0
        BLINKCOUNTER = BLINKCOUNTER + 1
        IF LOC(1)>0 THEN
            DONEFLAG$=INPUT$(1,#1)
            EXIT
        END IF
    WEND
    IF DONEFLAG$="X" THEN
        PRINT #1, CHR$(03)
        DONEFLAG$=INPUT$(1,#1)
        LOCATE 3,60,0
        PRINT"Move interrupted";
        REM BEEP 2
    ELSE
        LOCATE 3,60,0
	   	PRINT" Move completed ";
        REM BEEP
    END IF
    RETURN

VFDRENEWCOMMAND:
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, "n"
    PRINT #1, CHR$(13);
    DONEFLAG$ = INPUT$(1,#1)
    RETURN

ORIGINCOMMAND:
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, "o"
    PRINT #1, CHR$(13);
    DONEFLAG$ = INPUT$(1,#1)
    RETURN

PLAYCOMMAND:
    LOCATE 1,1,0
    ENDLESSLOOP=0
    INPUT "Loop continuously? (Y=yes)";ANSWER$
    IF ANSWER$="Y" OR ANSWER$="y" THEN ENDLESSLOOP=1
    LOCATE 1,1,0
    PRINT "Now executing "; ROBOFILE$; "                    "
    PRINT "Press any key to halt                        "
    WHILE NOT INSTAT
        OPEN ROBOFILE$ FOR INPUT AS #3
        WHILE NOT EOF(3)
            IF INSTAT THEN EXIT
            INPUT #3, CMD$
            IF     CMD$="m" THEN
                INPUT #3, XVAL.longfield
                INPUT #3, YVAL.longfield
                INPUT #3, ZVAL.longfield
                GOSUB PUTLOCATION
                GOSUB SHOWLOCATION
            ELSEIF CMD$="v" THEN
                INPUT #3, USPEED.wordfield
                GOSUB PUTVELOCITY
                GOSUB SHOWSTATSCOMMAND
            ELSEIF CMD$="o" THEN
                GOSUB ORIGINCOMMAND
            ELSEIF CMD$="d" THEN
                INPUT #3, SNOOZETIME!
                SLEEP SNOOZETIME
            ELSEIF CMD$="s" THEN
                GOSUB SHOWSTATSCOMMAND
            ELSEIF CMD$="p" THEN
            	LOCATE 1,1,0
            	PRINT "Programmed pause in execution               "
            	PRINT "Press e to end program; any other to restart"
                WHILE NOT INSTAT : WEND
                MYKEY$ = INKEY$
                IF MYKEY$ = "E" OR MYKEY$ = "e" THEN
					EXIT LOOP
                ELSE
                	LOCATE 1,1,0
	    			PRINT "Now executing "; ROBOFILE$; "                            "
    				PRINT "Press any key to halt                       "
                END IF
            ELSE
            END IF
            IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
REM         FOR I=0 TO 1000
REM         NEXT I
        WEND
        CLOSE #3
        IF ENDLESSLOOP=0 THEN EXIT
        IF MYKEY$ = "E" OR MYKEY$ = "e" THEN
        	MYKEY$ = ""
            EXIT LOOP
        END IF
    WEND
    IF INSTAT THEN
        IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
        PRINT #1, CHR$(03);
        PRINT #1, CHR$(13);
        DONEFLAG$ = INPUT$(1,#1)
    END IF
    LOCATE 1,1,0
    PRINT "                                           "
    PRINT "                                           "
    MYKEY$ = INKEY$
    MYKEY$ = ""
    RETURN

REM MP185END is at the end of this program

RESETCOMMAND:
	LOCATE 1,1,0
    PRINT "WARNING. Controller reset / program termination."
    PRINT "Press 1 to confirm reset"
    WHILE NOT INSTAT : WEND
    MYKEY$ = INKEY$
    IF MYKEY$ = "1" THEN GOTO MP185RESET
	LOCATE 1,1,0
    PRINT "                                                "
    PRINT "                        "
    RETURN

SHOWSTATSCOMMAND:
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, "s";
    PRINT #1, CHR$(13);
    GOSUB GETSTATS
	GOSUB SHOWSTATS
    LOCATE 3,60,0
    PRINT"       OK       ";
    DELAY 0.5
    LOCATE 3,60,0
    PRINT"**** Online ****";
    RETURN

GETSTATS:
	TIMER ON
	FLAGS.onestring   = INPUT$(1,#1)
    UDIRX.onestring   = INPUT$(1,#1)
    UDIRY.onestring   = INPUT$(1,#1)
    UDIRZ.onestring   = INPUT$(1,#1)
    DEAD.twostring    = INPUT$(2,#1)
    UOFFSET.twostring = INPUT$(2,#1)
    URANGE.twostring  = INPUT$(2,#1)
    PULSE.twostring   = INPUT$(2,#1)
    USPEED.twostring  = INPUT$(2,#1)
    POWER.onestring   = INPUT$(1,#1)
    ECHOSTAT.onestring= INPUT$(1,#1)
    SAFELO.twostring  = INPUT$(2,#1)
    SAFEHI.twostring  = INPUT$(2,#1)
    BAUDHI.onestring  = INPUT$(2,#1)
    BAUDLO.onestring  = INPUT$(2,#1)
    STEPDIV.twostring = INPUT$(2,#1)
    STEPMUL.twostring = INPUT$(2,#1)
    XPARAM.twostring  = INPUT$(2,#1)
    RSPEED.twostring  = INPUT$(2,#1)
    DONEFLAG$         = INPUT$(1,#1)
    IF STEPMUL.wordfield=25 THEN USTEPS=10.0
    IF STEPMUL.wordfield=5  THEN USTEPS=50.0
    TIMER OFF
    RETURN

TESTER:
	LOCATE 1,1,0
    PRINT "Done. Press a key.                  "
    WHILE NOT INSTAT : WEND
    LOCATE 1,1,0
    PRINT "                                    "
    RETURN

UPLOADPROGRAM:
	LOCATE 1,1,0
    INPUT "Enter program number to upload "; PROGRAMNUMBER.wordfield
	LOCATE 2,1,0
    PRINT "Press 1 to confirm upload"
    WHILE NOT INSTAT : WEND
    MYKEY$ = INKEY$
    IF MYKEY$ <> "1" THEN
    	LOCATE 1,1,0
        PRINT "                                 "
        PRINT "                         "
        RETURN
    END IF

    PRINT #1, "u";
    PRINT #1, PROGRAMNUMBER.twostring
    REM    PRINT #1, CHR$(13);

    UPLOADCOUNT.twostring = INPUT$(2,#1)
    vectorcount = UPLOADCOUNT.numbfield

	LOCATE 1,1,0
    PRINT "Uploading ";UPLOADCOUNT.wordfield;" vectors to ";SAVEFILE$;"        "
    PRINT "                         "
    PRINT #2, PROGRAMNUMBER.numbfield
    PRINT #2, UPLOADCOUNT.numbfield
  	PRINT #2,
    FOR I=1 TO vectorcount
        RSPEED.twostring = INPUT$(2,#1)
        XVAL.fourstring  = INPUT$(4,#1)
        YVAL.fourstring  = INPUT$(4,#1)
        ZVAL.fourstring  = INPUT$(4,#1)
        IF RSPEED.numbfield < 0 THEN
		    PRINT #2, (RSPEED.numbfield AND &H7FFF) * -1
        ELSE
        	PRINT #2, RSPEED.numbfield
        END IF
	    PRINT #2, XVAL.longfield
	    PRINT #2, YVAL.longfield
	    PRINT #2, ZVAL.longfield
    	PRINT #2,
   	NEXT I

    LOCATE 2,1,0
    PRINT "Done. Press a key.                  "
    WHILE NOT INSTAT : WEND
    LOCATE 1,1,0
    PRINT "                                    "
    PRINT "                                    "
    RETURN

VELOCITYCOMMAND:
    LOCATE 1,1,0
    PRINT "Resolution: (h/l): ";
    RKEY$ = INPUT$ (1)
    PRINT " "; RKEY$
    INPUT "    Speed in um/s:  ", RSPEED.wordfield
    IF RKEY$ = "L" OR RKEY$ = "l" THEN
    	IF RSPEED.wordfield > 1310 THEN RSPEED.wordfield = 1310
    	IF RSPEED.wordfield < 1 THEN RSPEED.wordfield = 1
        RSPEED.wordfield = RSPEED.wordfield OR 32768
    ELSE
    	IF RSPEED.wordfield > 6553 THEN RSPEED.wordfield = 6553
    	IF RSPEED.wordfield < 1 THEN RSPEED.wordfield = 1
    END IF
    GOSUB PUTVELOCITY
    GOSUB SHOWSTATSCOMMAND
    LOCATE 1,1,0
    PRINT "                                           ";
    PRINT "                                           ";
    RETURN

PUTVELOCITY:
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, "v";
    PRINT #1, RSPEED.twostring;
    PRINT #1, CHR$(13);
    DONEFLAG$ = INPUT$(1,#1)
    LOCATE 14,35,0
    IF RKEY$ = "L" OR RKEY$ = "l" THEN
    	PRINT "low ";
    ELSE
    	PRINT "high";
    END IF
    LOCATE 14,18,0
    PRINT RSPEED.wordfield AND &H7FFF;
    RETURN

OUTFILECOMMAND:
    GOSUB GETFILENAME
    IF WHATFILE$ <> "" THEN
    	CLOSE #2
        SAVEFILE$ = WHATFILE$
        OPEN SAVEFILE$ FOR OUTPUT AS #2
    END IF
    LOCATE 24,65,0
    PRINT "                "
    LOCATE 24,63,0
    PRINT SAVEFILE$
    RETURN

QUERYTOGGLECOMMAND:
	LOCATE 1,1,0
	IF QUERYFLAG THEN
		INPUT "Position query off + slow download? (Y/N): "; QT$
        IF QT$ = "Y" OR QT$ = "y" THEN QUERYFLAG = 0
    ELSE
		INPUT "Turn position query on? (Y/N): "; QT$
        IF QT$ = "Y" OR QT$ = "y" THEN QUERYFLAG = 1
    END IF
    GOSUB REFRESHDISPLAY
    LOCATE 1,1,0
    PRINT "                                                       "
    RETURN

SHOWPARAMS:
	CLS
    GOSUB SHOWINTERNALPARAMETERS
    LOCATE 14,30,0
    IF (FLAGS.bytefield AND 64) THEN
        PRINT "CONSTANT"
    ELSE
        PRINT "PULSE   "
    END IF
    LOCATE 15,30,0
    IF (FLAGS.bytefield AND 32) THEN
        PRINT "RELATIVE"
    ELSE
        PRINT "ABSOLUTE"
    END IF
    LOCATE 16,29,0
    PRINT URANGE.wordfield
    LOCATE 17,29,0
    PRINT UOFFSET.wordfield
    LOCATE 18,29,0
    PRINT SAFELO.wordfield
    LOCATE 19,29,0
    PRINT SAFEHI.wordfield
    LOCATE 20,29,0
    PRINT PULSE.wordfield
    LOCATE 21,29,0
    PRINT USPEED.wordfield
    LOCATE 22,29,0
    IF (128 AND FLAGS.bytefield) > 0 THEN
        PRINT (15 AND FLAGS.bytefield)+1
    ELSE
        PRINT "    "
    END IF
    LOCATE 23,29,0
    PRINT BAUDRATE
    LOCATE 24,29,0
    PRINT USTEPS
    WHILE NOT INSTAT : WEND
    CLS
    GOSUB REFRESHDISPLAY
    RETURN

SHOWINTERNALPARAMETERS:
    LOCATE 1,1,0
    PRINT " Press ENTER to return"
    PRINT
    PRINT
    PRINT
    PRINT
    PRINT
    PRINT
    PRINT
    PRINT
    PRINT
    PRINT
    PRINT "-----INTERNAL PROGRAM PARAMETERS-----   "
    PRINT "                                        "
    PRINT "  Manual operation mode is:             "
    PRINT "       VFD display mode is:             "
    PRINT " Constant mode speed range:             "
    PRINT "      Constant mode offset:             "
    PRINT "Constant mode speed cutoff:             "
    PRINT "     Min constant interval:             "
    PRINT "No. 25 nm usteps per PULSE:             "
    PRINT           "    ";PULSESTR$;"             "
    PRINT "     Stored program in use:             "
    PRINT "         Current Baud rate:             "
    PRINT "      æSteps per full Step:             "
	RETURN


BOGUSCOMMAND:
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, "Z"
    DONEFLAG$ = INPUT$(1,#1)
    LOCATE 13,29,0
    PRINT DONEFLAG$;" "
    LOCATE 1,1,0
    PRINT "Bogus command sent"
    PRINT "Check SIO report sites then press a key"
    WHILE NOT INSTAT : WEND
    GOSUB VFDRENEWCOMMAND
    LOCATE 1,1,0
    PRINT "                                           ";
    PRINT "                                       ";
    MYKEY$ = "X"
    RETURN

REM *************************************************************************
REM *
REM * REFRESHDISPLAY
REM * GETLOCATION
REM * SHOWLOCATION
REM * SHOWSTATS
REM * GETFILENAME
REM *
REM *************************************************************************

REFRESHDISPLAY:
    LOCATE 1,1,0
    PRINT "                           "
    PRINT "                                                         ";CHR$(201);"----- Status -----";CHR$(187);
    PRINT "                                                         ";CHR$(186);"                  ";CHR$(186);
    PRINT "                                                         ";CHR$(200);"------------------";CHR$(188);
    IF QUERYFLAG THEN
    	PRINT " Current Absolute Location:"
    ELSE
    	PRINT " Location query disabled  :"
    end if
    PRINT
    PRINT REM        X = _____.___ um
    PRINT REM        Y = _____.___ um
    PRINT REM        Z = _____.___ um
    PRINT
    PRINT
    PRINT " ";CHR$(201);"------Remote Control Parameters------";CHR$(187);_
          "    --- File I/O data ---"
    PRINT " ";CHR$(186);" Serial port status is:              ";CHR$(186);_
          "    Current   source file: "
    PRINT " ";CHR$(186);" Remote Speed:       æm/s  Res:      ";CHR$(186);_
          "    Current  capture file: "
    PRINT " ";CHR$(200);"-------------------------------------";CHR$(188);_
          "    Current download file: "
    GOSUB SHOWSTATSCOMMAND
	RETURN

GETLOCATION:
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, "c";
    PRINT #1, CHR$(13);
REM    TIMER ON
    XVAL.fourstring = INPUT$(4,#1)
    YVAL.fourstring = INPUT$(4,#1)
    ZVAL.fourstring = INPUT$(4,#1)
    DONEFLAG$       = INPUT$(1,#1)
REM    TIMER OFF
    RETURN

SHOWLOCATION:
    LOCATE 7,1,0
	PRINT USING "           X =+#####.### um  ";XVAL.longfield/STEPDIV.wordfield
	PRINT USING "           Y =+#####.### um  ";YVAL.longfield/STEPDIV.wordfield
	PRINT USING "           Z =+#####.### um  ";ZVAL.longfield/STEPDIV.wordfield
    LOCATE 13,29,0
    IF DONEFLAG$=CHR$(13) THEN
        PRINT "OK"
    ELSE
    	PRINT DONEFLAG$;" "
    END IF
    MYKEY$ = "X"
    RETURN

SHOWSTATS:
    LOCATE 13,29,0
    PRINT "      "
    LOCATE 14,18,0
    PRINT "      "
    LOCATE 13,29,0
    IF DONEFLAG$=CHR$(13) THEN
        PRINT "OK"
    ELSE
    	PRINT DONEFLAG$;" "
    END IF
    LOCATE 13,68,0
    PRINT ROBOFILE$
    CHECKVAL = RSPEED.wordfield AND &H8000
    LOCATE 14,35,0
    IF CHECKVAL <> 0 THEN
    	PRINT "low ";
    ELSE
    	PRINT "high";
    END IF
    LOCATE 14,18,0
    PRINT RSPEED.wordfield AND &H7FFF
    LOCATE 14,68,0
    PRINT SAVEFILE$
    LOCATE 15,68,0
    PRINT DOWNLOAD$
    RETURN

GETFILENAME:
    LOCATE 1,1,0
    INPUT "Filename:  ", WHATFILE$
    LOCATE 1,1,0
    PRINT "                                       "
    RETURN

MP185INIT:
    COLOR 15,1,8
    CLS
    LCOUNTER = 1
    GOSUB INITCOM
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, "v";
    PRINT #1, RSPEED.twostring;
    PRINT #1, CHR$(13);
    DONEFLAG$ = INPUT$(1,#1)
    GOSUB REFRESHDISPLAY
    CLOSE #1
    LOCATE 3,60,0
    PRINT"**** Online ****";
    MYKEY$ = ""
    RETURN

INITCOM:
    CLS
    PRINT "Default Baud rate is 9600"
    INPUT "Enter serial IO Baud rate: ",BAUDSTR$
    IF BAUDSTR$ = "" THEN
        BAUDRATE = 9600
    ELSE
    	BAUDRATE = VAL(BAUDSTR$)
    END IF
    PRINT "Default COM port is 1"
    INPUT "Enter 1 or 2: ",PORTVAL$
    IF PORTVAL$ = "" THEN
        PORTVAL = 1
    ELSE
    	PORTVAL = 2
    END IF

OPENCOM:
    IF PORTVAL <> 1 THEN GOTO OPENCOM2

OPENCOM1:
    IF     BAUDRATE=1200 THEN
        OPEN   "COM1:1200,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSEIF BAUDRATE=2400 THEN
        OPEN   "COM1:2400,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSEIF BAUDRATE=4800 THEN
        OPEN   "COM1:4800,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSEIF BAUDRATE=9600 THEN
        OPEN   "COM1:9600,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSEIF BAUDRATE=19200 THEN
        OPEN  "COM1:19200,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSEIF BAUDRATE=38400 THEN
        OPEN  "COM1:38400,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSEIF BAUDRATE=115200 THEN
        OPEN "COM1:115200,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSE
        PRINT"Illegal Baud rate"
        GOTO INITCOM
    END IF
    RETURN

OPENCOM2:
    IF     BAUDRATE=1200 THEN
        OPEN   "COM2:1200,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSEIF BAUDRATE=2400 THEN
        OPEN   "COM2:2400,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSEIF BAUDRATE=4800 THEN
        OPEN   "COM2:4800,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSEIF BAUDRATE=9600 THEN
        OPEN   "COM2:9600,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSEIF BAUDRATE=19200 THEN
        OPEN  "COM2:19200,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSEIF BAUDRATE=38400 THEN
        OPEN  "COM2:38400,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSEIF BAUDRATE=115200 THEN
        OPEN "COM2:115200,N,8,1,CD0,CS0,DS0,RS" AS #1 LEN = 1024
    ELSE
        PRINT"Illegal Baud rate"
        GOTO INITCOM
    END IF
    RETURN

TIMEOUT:
	CLS
    PRINT "Timeout error -- program terminated";
	WHILE NOT INSTAT : WEND
    END
    RETURN

KEYWAIT:
    WHILE NOT INSTAT : WEND
    MYKEY$ = INKEY$
    MYKEY$ = ""
    RETURN

MP185RESET:
    IF LOC(1)>0 THEN MP185$=INPUT$(LOC(1),#1)
    PRINT #1, "r"

MP185END:
    CLOSE #1
    CLOSE #2
    CLOSE #3
    CLOSE #4
    CLS
END












