<> <> <> <> <> 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 <> isLShigh: BOOLEAN _ FALSE; isLSlowAgain: BOOLEAN _ FALSE; isVChigh: BOOLEAN _ FALSE; isVClowAgain: BOOLEAN _ FALSE; isVDlow: BOOLEAN _ FALSE; --initial value in controller before printing isVDhigh: BOOLEAN _ FALSE; isVDlowAgain: BOOLEAN _ FALSE; sample: ARRAY SampleIndex OF SampleItem _ ALL[LOOPHOLE[FIRST[CARDINAL]]]; sampleIndex: SampleIndex; sampleSize: CARDINAL = 256; <> 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]]; <> 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; <> 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; <> 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]; <> 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.