10 REM Dashboard mockup 21 Mar 85
20 REM
30 REM --------- Instruments --------------
40 REM	Sx	Speedo
50 REM	Tx	Tachometer
60 REM	Fx	Fuel
70 REM	Wx	Water Temp
80 REM	Px	Oil Pressure
90 REM	Ox	Oil temp
100 REM	Vx	Vaccuum
110 REM Fake instruments, genrated from other
120 REM sensor data:
130 REM	Qx	Power
140 REM
150 REM --- Instrument Variables -----------
160 REM	xX,xY	zero screen locations
170 REM	xM	full scale position offset
180 REM	xF	full scale value
190 REM	xC	current displayed value
200 REM	xP	needle width
210 REM
220 REM ----- Global work variables --------
230 REM	x,y	Box subroutine parameters
240 REM h,w	Box height and width
250 REM	t	Box thickness
260 REM	f1	formal arg 0
270 REM	f2	formal arg 1
280 REM
290 REM Set all the global variables, and the default
300 REM full scale values for all the instruments.
310 REM
320	XMAX = 319 : YMAX = 239
330	QF = 150000!			:' effort
340	OF = 400			:' oil temp
350	PF = 80				:' oil pressure
360	WF = 250			:' ater temp
370	FF = 20				:' fuel
380	VF = 30				:' vaccuum
390	TF = 4000			:' tach
400	SF = 140			:' speedo
410	S = 0 : T = 500 : F = 10 : V = 18
420	O = 200 : W = 190 : P = 40
430 REM
440 REM Main entry point to draw the basic screen.
450 REM
460	SL = -1 : TL = -1 : FL = -1 	:' clear last values
470	VL = -1 : OL = -1 : WL = -1 : PL = -1
480	PRINT CHR$(27); "c"; CHR$(27);"U "
490	GRAPH
500	X= 0 : Y = 0 
510	W = XMAX : H = YMAX : T = 1
520	GOSUB 1780			:' draw border (box)
530	X =  10 : Y = YMAX - 40
540	W = XMAX - 80 : H = 14
550 REM
560 REM Speedometer
570 REM
580	T = 2				:' box thickness
590	SX = X + T 			:' location of speedo zero
600	SY = Y + (H / 2)		:' X and Y,
610	SM = W - (2 * T)		:' max. length
620	SC = 0				:' current setting
630	SP = H - (2 * T)		:' needle size
640	GOSUB 1780			:' draw speedo box
650	F1 = SF : F2 = 10		:' full scale, tick interval
660	F3 = SM : F4 = 1		:' display width, 1 == horiz
670	GOSUB 3160			:' draw ruler
680 REM
690 REM Tachometer
700 REM
710	Y = Y - 40
720	TX = X + T			:' tach zero
730	TY = Y + (H / 2)		:' X and Y
740	TM = W - (2 * T)
750	TP = H - (2 * T)		:' needle width
760	TC = 0
770	GOSUB 1780			:' tach box
780	F1 = TF : F2 = 500		:' full scale, tick interval,
790	F3 = TM : F4 = 1		:' display width, horizontal
800	GOSUB 3160
810 REM
820	Y = Y - 40
830	VX = X + T			:' vaccuum zero
840	VY = Y + (H / 2)		:' X and Y
850	VM = W - (2 * T)
860	VP = H - (2 * T)		:' needle width
870	VC = 0
880	GOSUB 1780			:' draw tach box
890	F1 = VF : F2 = 5
900	F3 = VM : F4 = 1
910	GOSUB 3160			:' draw ruler
920 REM
930 REM Draw the small gauges
940 REM
950	Y = 45
960	X = 120
970	H = 50
980	W = 10
990 REM
1000 REM Draw all the little boxes, and their titles in
1010 REM small characters.
1020 REM
1030	FM = H - (2 * T) 
1040	FP = W - (2 * T) : FY = Y + T
1050	FX = X + (W / 2)
1060	L = Y - 20 : C = X + 4
1070	GOSUB 3470
1080	PRINT "FUEL";
1090	GOSUB 1780			:' draw fuel box
1100	F1 = FF : F2 = 4
1110	F3 = FM : F4 = 0
1120	GOSUB 3160
1130 REM
1140	X = X + 40
1150	WX = X + (W / 2)
1160	WM = FM : WP = W - (2 * T) : WY = Y + T
1170	L = Y - 20 : C = X
1180	GOSUB 3470
1190	PRINT "WATER";
1200	L = Y - 30 : C = X
1210	GOSUB 3470
1220	PRINT "TEMP";
1230	GOSUB 1780			:' draw water temp box
1240	F1 = WF : F2 = 80
1250	F3 = WM : F4 = 0
1260	GOSUB 3160
1270 REM
1280	X = X + 40
1290	PX = X + (W / 2)
1300	PM = FM : PP = W - (2 * T) : PY = Y + T
1310	L = Y - 20 : C = X
1320	GOSUB 3470
1330	PRINT "OIL";
1340	L = Y - 30 : C = X
1350	GOSUB 3470
1360	PRINT "PRES";
1370	GOSUB 1780			:' draw oil pressure box
1380	F1 = PF : F2 = 20
1390	F3 = PM : F4 = 0
1400	GOSUB 3160
1410 REM
1420	X = X + 40
1430	OM = FM : OP = W - (2 * T) : OY = Y + T
1440	L = Y - 20 : C = X
1450	GOSUB 3470
1460	PRINT "OIL";
1470	L = Y - 30 : C = X
1480	GOSUB 3470
1490	PRINT "TEMP";
1500	OX = X + (W / 2)
1510	GOSUB 1780			:' draw oil temp box
1520	F1 = OF : F2 = 50
1530	F3 = OM : F4 = 0
1540	GOSUB 3160
1550 REM
1560	X = X + 60 : Y = 5 * T
1570	H = YMAX - 10 * T
1580	QX = X + (W / 2) 
1590	QM = YMAX - (10 * T) : QP = W - (2 * T) : QY = 5 * T
1600	GOSUB 1780			:' draw power box
1610 REM
1620 REM Main loop. Watch the keyboard, sensors, and
1630 REM update all the displays.
1640 REM
1650	A$ = INKEY$
1660	IF A$ = CHR$(27) THEN GOTO 3780	:' change full scale
1670	IF A$ <> "" THEN GOSUB 3600	:' handle keyboard
1680	GOSUB 2080			:' update tach
1690	GOSUB 1900			:' update speedo
1700	GOSUB 2400			:' update oil temp
1710	GOSUB 2560			:' oil pressure
1720	GOSUB 2720			:' water temp
1730	GOSUB 2880			:' fuel
1740	GOSUB 2240
1750	GOSUB 3040			:' power
1760	GOTO 1650
1770	STOP
1780 REM
1790 REM draw a box from X,Y to X + W and Y + H,
1800 REM of thickness T
1810 REM
1820	FOR IT = 0 TO T - 1
1830		PLOT (X  - IT,Y - IT)
1840		PLOT TO (X - IT,Y + H + IT)
1850		PLOT TO (X + W + IT,Y + H + IT)
1860		PLOT TO (X + W + IT,Y - IT)
1870		PLOT TO (X - IT,Y - IT)
1880	NEXT IT
1890	RETURN
1900 REM
1910 REM Plot the speedometer
1920 REM
1930	S = INT(T / 2.56 / 20)
1940	IF S > SF THEN S = SF
1950	IF S < 0 THEN S = 0
1960	IF S = SL THEN RETURN 
1970	SL = S
1980	SC = (S / SF) * SM				:' calculate new
1990	GRAPH M(255,255)
2000	PLOT F(SX,SY + (SP / 2)) (SX + SC - 1,SY - (SP / 2))
2010	GRAPH M(0,0)
2020	PLOT F(SX + SC,SY + (SP / 2)) (SX + SM,SY - (SP / 2))
2030	L = SY - 10 : C = SX + SM + 10
2040	GOSUB 3470
2050	N = S : GOSUB 3520				:'right justified
2060	PRINT "MPH";
2070	RETURN
2080 REM
2090 REM Plot the tachometer
2100 REM
2110	IF T > TF THEN T = TF
2120	IF T < 0 THEN T = 0
2130	IF T = TL THEN RETURN
2140	TL = T
2150	TC = (T / TF) * TM				:' calculate new
2160	GRAPH M(255,255)
2170	PLOT F(TX,TY + (TP / 2)) (TX + TC - 1,TY - (TP / 2))
2180	GRAPH M(0,0)
2190	PLOT F(TX + TC,TY + (TP / 2)) (TX + TM,TY - (TP / 2))
2200	L = TY - 10 : C = TX + TM + 10
2210	GOSUB 3470
2220	N = T : GOSUB 3520 : PRINT "RPM";
2230	RETURN
2240 REM
2250 REM Plot vaccuum
2260 REM
2270	IF V > VF THEN V = VF
2280	IF V < 0 THEN V = 0
2290	IF V = VL THEN RETURN
2300	VL = V
2310	VC = (V / VF) * VM				:' calculate new
2320	GRAPH M(255,255)
2330	PLOT F(VX,VY + (VP / 2)) (VX + VC - 1,VY - (VP / 2))
2340	GRAPH M(0,0)
2350	PLOT F(VX + VC,VY + (VP / 2)) (VX + VM,VY - (VP / 2))
2360	L = VY - 10 : C = VX + VM + 10
2370	GOSUB 3470
2380	N = V : GOSUB 3520 : PRINT "IN.";
2390	RETURN
2400 REM
2410 REM Plot Oil temp
2420 REM
2430	IF O > OF THEN O = OF
2440	IF O < 0 THEN O = 0
2450	IF O = OL THEN RETURN
2460	OL = O
2470	OC = (O / OF) * OM				:' calculate new
2480	GRAPH M(255,255)
2490	PLOT F(OX - (OP / 2), OY) (OX + (OP / 2),OY + OC - 1)
2500	GRAPH M(0,0)
2510	PLOT F(OX - (OP / 2),OY + OC) (OX + (OP / 2),OY + OM)
2520	L = OY + OM + 10 : C = OX - 12
2530	GOSUB 3470
2540	N = O : GOSUB 3520
2550	RETURN
2560 REM
2570 REM Plot Oil pressure
2580 REM
2590	IF P > PF THEN P = PF
2600	IF P < 0 THEN P = 0
2610	IF P = PL THEN RETURN
2620	PL = P
2630	PC = (P / PF) * PM				:' calculate new
2640	GRAPH M(255,255)
2650	PLOT F(PX - (PP / 2), PY) (PX + (PP / 2),PY + PC - 1)
2660	GRAPH M(0,0)
2670	PLOT F(PX - (PP / 2),PY + PC) (PX + (PP / 2),PY + PM)
2680	L = PY + PM + 10 : C = PX - 12
2690	GOSUB 3470
2700	N = P : GOSUB 3520
2710	RETURN
2720 REM
2730 REM Plot Water temp
2740 REM
2750	IF W > WF THEN W = WF
2760	IF W < 0 THEN W = 0
2770	IF W = WL THEN RETURN
2780	WL = W
2790	WC = (W / WF) * WM				:' calculate new
2800	GRAPH M(255,255)
2810	PLOT F(WX - (WP / 2), WY) (WX + (WP / 2),WY + WC - 1)
2820	GRAPH M(0,0)
2830	PLOT F(WX - (WP / 2),WY + WC) (WX + (WP / 2),WY + WM)
2840	L = WY + WM + 10 : C = WX - 12
2850	GOSUB 3470
2860	N = W : GOSUB 3520
2870	RETURN
2880 REM
2890 REM Plot fuel
2900 REM
2910	IF F > FF THEN F = FF
2920	IF F < 0 THEN F = 0
2930	IF F = FL THEN RETURN
2940	FL = F
2950	FC = (F / FF) * FM				:' calculate new
2960	GRAPH M(255,255)
2970	PLOT F(FX - (FP / 2), FY) (FX + (FP / 2),FY + FC - 1)
2980	GRAPH M(0,0)
2990	PLOT F(FX - (FP / 2),FY + FC) (FX + (FP / 2),FY + FM)
3000	L = FY + FM + 10 : C = FX - 12
3010	GOSUB 3470
3020	N = F : GOSUB 3520
3030	RETURN
3040 REM
3050 REM Plot power
3060 REM
3070	Q = (VF - V) * T : IF Q > QF THEN Q = QF
3080	IF Q = QL THEN RETURN
3090	QL = Q
3100	QC = (Q / QF) * QM
3110	GRAPH M(255,255)
3120	PLOT F(QX - (QP / 2), QY) (QX + (QP / 2),QY + QC - 1)
3130	GRAPH M(0,0)
3140	PLOT F(QX - (QP / 2),QY + QC) (QX + (QP / 2),QY + QM)
3150	RETURN
3160 REM
3170 REM Draw a ruler beside a box, either vertically or horizontally.
3180 REM
3190 REM	F1	Full scale value
3200 REM	F2	Tick interval
3210 REM	F3	Display size
3220 REM	X,Y	origin of the box
3230 REM	H,W,T	Height, width and thickness of the box
3240 REM
3250	PRINT CHR$(27);"S0";			:' small char set
3260	FOR I = 0 TO F1 STEP F2			:' draw ticks and numbers
3270		IF F4 = 0 THEN GOTO 3360
3280			N = X + (I / F1) * F3	:' relative X offset
3290			PLOT (N, Y + H + T)	:' make tick mark
3300			PLOT TO (N,Y + H + T + 4)
3310			L = Y + H + T : C = N - 1
3320			GOSUB 3470
3330			IF F1 >= 1000 THEN PRINT I / 10;
3340			IF F1 < 1000 THEN PRINT I;
3350			GOTO 3440
3360		REM else
3370			N = Y + ( I / F1) * F3	:' same but Y varies
3380			PLOT (X + W + T,N)
3390			PLOT TO (X + W + T + 4,N)
3400			L = N - 5 : C = X + T + W + 5
3410			GOSUB 3470
3420			IF F1 >= 1000 THEN PRINT I / 10;
3430			IF F1 < 1000 THEN PRINT I;
3440		REM endif
3450	NEXT I
3460	RETURN
3470 REM
3480 REM Position the text cursor to graphic line L column C
3490 REM
3500	GRAPH L((YMAX - L) / 10,(C + 3) / 4 - .5)
3510	RETURN
3520 REM
3530 REM print N right justified, four digits
3540 REM
3550	IF N < 1000 THEN PRINT " ";
3560	IF N < 100 THEN PRINT " ";
3570	IF N < 10 THEN PRINT " ";
3580	PRINT N;
3590	RETURN
3600 REM
3610 REM Handle the keyboard
3620 REM
3630	IF A$ = "S" THEN S = S + 10
3640	IF A$ = "s" THEN S = S - 10
3650	IF A$ = "T" THEN T = T + 100
3660	IF A$ = "t" THEN T = T - 100
3670	IF A$ = "V" THEN V = V + 2
3680	IF A$ = "v" THEN V = V - 2
3690	IF A$ = "F" THEN F = F + 2
3700	IF A$ = "f" THEN F = F - 2
3710	IF A$ = "W" THEN W = W + 20
3720	IF A$ = "w" THEN W = W - 20
3730	IF A$ = "P" THEN P = P + 5
3740	IF A$ = "p" THEN P = P - 5
3750	IF A$ = "O" THEN O = O + 10
3760	IF A$ = "o" THEN O = O - 10
3770	RETURN
3780 REM
3790 REM Change default settings, then restart.
3800 REM
3810	PRINT CHR$(27); "3";		:' clear graphics
3820	GRAPH L(1,1)			:' home
3830	PRINT CHR$(27); "J";		:' clear screen
3840	PRINT CHR$(27); "S1";		:' large char set
3850	PRINT CHR$(27); "d";		:' enable cursor
3860	PRINT : PRINT
3870	PRINT "Display Change"
3880	INPUT "Speedometer Full Scale"; I
3890	IF I <> 0 THEN SF = I
3900	INPUT "Tachometer Full Scale"; I
3910	IF I <> 0 THEN TF = I
3920	INPUT "Effort Full Scale"; I
3930	IF I <> 0 THEN QF = I
3940	GOTO 430
