File LSEPDiagnosticsImpl.mesa
Copyright © 1986 by Xerox Corporation. All rights reserved.
This module implements the Image Test.
Last edited by Strickberger 19-Jul-85 2:17:03
Tim Diebert: October 28, 1986 3:22:24 pm PST
DIRECTORY
Basics USING [BITNOT, BITAND],
DLionInputOutput USING [Input],
LSEPDiagnostics USING [ImageFault, ImageSamplingPhase],
Process USING [Pause];
LSEPDiagnosticsImpl: CEDAR PROGRAM
IMPORTS Basics, DLionInputOutput, Process
EXPORTS LSEPDiagnostics = BEGIN
Constants/Variables:
isLShigh: BOOLEANFALSE;
isLSlowAgain: BOOLEANFALSE;
isVChigh: BOOLEANFALSE;
isVClowAgain: BOOLEANFALSE;
isVDlow: BOOLEANFALSE; --initial value in controller before printing
isVDhigh: BOOLEANFALSE;
isVDlowAgain: BOOLEANFALSE;
sample: ARRAY SampleIndex OF SampleItem ← ALL[LOOPHOLE[FIRST[CARDINAL]]];
sampleIndex: SampleIndex;
sampleSize: CARDINAL = 256;
TYPEs:
Bit: TYPE = MACHINE DEPENDENT{H(0), L(1)}; --PAY ATTENTION: A 1 in the eStatus Reg. is a logic 0.
SampleIndex: TYPE = CARDINAL [0..sampleSize);
SampleItem: TYPE = MACHINE DEPENDENT RECORD [
LS(0:0..0), VC(0:1..1), VD(0:2..2): Bit, NA(0:3..15): [0B..17777B]];
PUBLIC PROCEDUREs:
BuildImageSample: PUBLIC PROCEDURE [phase: LSEPDiagnostics.ImageSamplingPhase] = TRUSTED BEGIN
IF phase = prePrinting THEN sampleIndex ← FIRST[SampleIndex];
THROUGH [0..(SELECT phase FROM printing => 248, ENDCASE => 4)) DO
Process.Pause[1];
sample[sampleIndex] ← LOOPHOLE[DLionInputOutput.Input[EStatus], SampleItem];
IF sampleIndex # LAST[SampleIndex]
THEN sampleIndex ← SUCC[sampleIndex]
ELSE EXIT;
ENDLOOP;
END;
InterpretImageSample: PUBLIC PROCEDURE RETURNS [LSEPDiagnostics.ImageFault] = BEGIN
HighOrLow: TYPE = {H, L};
LSorVCorVD: TYPE = {LS, VC, VD};
checkIt: PROCEDURE [max: SampleIndex, mask: LSorVCorVD, HorL: HighOrLow] RETURNS [state: BOOLEAN] = BEGIN
isItThere: PROCEDURE [mask: LSorVCorVD, HorL: HighOrLow] RETURNS [set: BOOLEAN] = BEGIN
maskValue: CARDINAL;
valueToTest: CARDINAL;
SELECT mask FROM
LS => {maskValue ← 100000B};
VC => {maskValue ← 40000B};
VD => {maskValue ← 20000B};
ENDCASE => NULL;
PAY ATTENTION: I invert the incomming bits because a 1 in the eStatus Reg. is really a logic zero!
valueToTest ← LOOPHOLE[Basics.BITAND[Basics.BITNOT[LOOPHOLE[sample[arrayIndex]]], maskValue]];
IF (HorL = L) --If L we are testing for no bits.-- THEN maskValue ← 0;
IF (valueToTest = maskValue) THEN set ← TRUE ELSE set ← FALSE;
END; --isItThere
state ← FALSE;
UNTIL (arrayIndex = max) OR (state = TRUE) DO
state ← isItThere[mask, HorL]; arrayIndex ← arrayIndex + 1; ENDLOOP;
END; --checkIt
arrayIndex: SampleIndex;
beforePrinting: SampleIndex ← 4;
duringPrinting: SampleIndex ← 251;
afterPrinting: SampleIndex ← 255;
see if Video Data is stuck before printing.
arrayIndex ← 0; --NOTICE this is in the sample of 4 before printing.
isVDlow ← checkIt[beforePrinting, VD, L];
IF (isVDlow = FALSE) THEN RETURN[fault1];
arrayIndex ← beforePrinting; --see if Line Sync made any transitions.
FOR i: CARDINAL IN [0..5) DO --This loop is here to remove noise that we have seen!
isLShigh ← checkIt[duringPrinting, LS, H]; ENDLOOP;
isLShigh ← FALSE;
isLShigh ← checkIt[duringPrinting, LS, H]; --Now make the check!
IF (isLShigh = TRUE) THEN isLSlowAgain ← checkIt[duringPrinting, LS, L];
arrayIndex ← beforePrinting; --see if Video Clock made any transitions.
FOR i: CARDINAL IN [0..5) DO --This loop is here to remove noise that we have seen!
isVChigh ← checkIt[duringPrinting, VC, H]; ENDLOOP;
isVChigh ← FALSE;
isVChigh ← checkIt[duringPrinting, VC, H]; --Now make the check!
IF (isVChigh = TRUE) THEN isVClowAgain ← checkIt[duringPrinting, VC, L];
see if Video Data made any transitions.
arrayIndex ← beforePrinting;
isVDhigh ← checkIt[duringPrinting, VD, H];
IF isVDhigh THEN isVDlowAgain ← checkIt[duringPrinting, VD, L];
IF isLSlowAgain THEN
IF NOT isVClowAgain THEN
IF isVChigh AND (NOT isVClowAgain) THEN RETURN[fault7] --stuck low
ELSE RETURN[fault8] --stuck high
ELSE
IF (NOT isVDlowAgain) OR (NOT isVDhigh) THEN RETURN[fault2] --no transitions
ELSE RETURN[noFault] --Everything is WORKING!
ELSE
IF NOT isLShigh THEN
IF isVClowAgain THEN RETURN[fault5] --VC is OK but LS is stuck high
ELSE RETURN[fault6] --no transitions
ELSE
IF isVClowAgain THEN RETURN[fault3] --VC is OK but LS is stuck low
ELSE RETURN[fault4]; --no transitions
END; --InterpretImageSample
END. --LSEPDiagnosticsImpl
LOG
When / Who / What.
1981/Jim Peterson/Created as RavenDiagnosticsAImpl.
September 8, 1981 7:39 PM/Jim Peterson/Updated.
October 23, 1981 3:22 PM/Claude Pany/Merged in RavenDiagnosticsBImpl and renamed RavenDiagnosticsImpl.
10-Feb-82/Claude Pany/Replaced RavenDriver with RavenChannel.
28-Sep-82 8:35:47 - Alfvin - Converted to Pilot 9.0.
9-Apr-85 0:58:49 / Strickberger / Updated for Raven engine driver redesign.
19-Jul-85 2:17:03 / Strickberger / Renamed to LSEPDiagnosticsImpl. FixArrows.