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 eter Full Scale"; I 3910 IF I <> 0 THEN TF