-- Copyright (C) 1983 by Xerox Corporation. All rights reserved.
-- CoPilotWatcher.mesa, HGM, 10-Nov-83 19:04:08
DIRECTORY
Ascii USING [CR],
DeviceCleanup USING [Item, Await],
Process USING [Detach, MsecToTicks, Ticks, Pause],
Put USING [Text],
SpecialSpace USING [MakeGlobalFrameResident, MakeProcedureResident, SpecialError],
String USING [AppendChar, AppendLongDecimal, AppendString],
Time USING [AppendCurrent];
CoPilotWatcher: PROGRAM
IMPORTS DeviceCleanup, Process, Put, SpecialSpace, String, Time =
BEGIN
kick: LONG CARDINAL ← 0;
Init: PROCEDURE =
BEGIN
MakeResident[];
AddCleanup[];
Process.Detach[FORK Watch[]];
END;
MakeResident: PROCEDURE =
BEGIN
SpecialSpace.MakeGlobalFrameResident[CoPilotWatcher ! SpecialSpace.SpecialError => CONTINUE];
SpecialSpace.MakeProcedureResident[AddCleanup ! SpecialSpace.SpecialError => CONTINUE];
END;
AddCleanup: PROCEDURE =
BEGIN
item: DeviceCleanup.Item;
DO
SELECT DeviceCleanup.Await[@item] FROM
turnOn => kick ← kick + 1;
ENDCASE;
ENDLOOP
END;
Watch: PROCEDURE =
BEGIN
pause: Process.Ticks = Process.MsecToTicks[5000];
oldKick: LONG CARDINAL ← 0;
DO
Process.Pause[pause];
IF oldKick # kick THEN
BEGIN
temp, missed: LONG CARDINAL;
temp ← kick;
missed ← temp - oldKick;
oldKick ← temp;
WriteMessage[missed];
THROUGH [0..10) DO Process.Pause[pause]; ENDLOOP; -- Don't clutter up screen
END;
ENDLOOP;
END;
WriteMessage: PROCEDURE [howMany: LONG CARDINAL] =
BEGIN
text: STRING = [200];
Time.AppendCurrent[text];
String.AppendString[text, " Looks like we just came back from CoPilot"L];
IF howMany > 1 THEN
BEGIN
String.AppendString[text, " ("L];
String.AppendLongDecimal[text, howMany];
String.AppendString[text, " times)"L];
END;
LogString[text];
END;
LogString: PROCEDURE [text: LONG STRING] =
BEGIN
String.AppendChar[text, '.];
String.AppendChar[text, Ascii.CR];
Put.Text[NIL, text];
END;
Init[];
END.