<> <> <> <> <> DIRECTORY BansheeControl USING [Display, EngineStatus, EventContext, GetEngineStatus, RunTurnaroundTest, SendEngineCommand, SetToCurrentEventContext, WaitEngineDiagnostic, WaitEngineEvent, WaitEngineStatus], BansheeCounter USING [Get, Handle, Item], BansheeEngine USING [--Job, SetJob, -- SetPrintingState, WaitPrintingState], BansheeTest USING [], BasicTime USING [Now], Convert USING [AppendCard, AppendTime], <> <> Loader USING [BCDBuildTime], LSEPDiagnostics USING [BuildImageSample, ImageFault, InterpretImageSample], NSExec USING [GetTTY, localExec, OutputHandle], NSString USING [AppendToMesaString, CopyString, MakeString, nullString, String, StringRep, StringFromMesaString], Process USING [GetPriority, Pause, Priority, priorityForeground, SecondsToTicks, SetPriority], PSCommand USING [PrintFile], <> RavenBansheeMessage USING [GetNSMessage, Key], RefText USING [Append], Rope USING [ToRefText], StringSequence USING [Handle, learSieglerStringLength], TestPattern USING [Name, NotFound], TextInput USING [Choices, ChoiceIndex, GetChoice, GetYesNo], ThisMachine USING [ProcessorID], TTY USING [Handle, Rubout], XFormat USING [CR, Handle, NSLine, NSString], XMessage USING [Compose, StringArray]; BansheeTestImpl: CEDAR PROGRAM IMPORTS BasicTime, BansheeControl, BansheeCounter, BansheeEngine, Convert, Loader, LSEPDiagnostics, NSExec, NSString, PSCommand, Process, RavenBansheeMessage, RefText, Rope, TestPattern, TextInput, ThisMachine, TTY, XFormat, XMessage EXPORTS BansheeTest = BEGIN <> LogItem: TYPE = RECORD [counter: BansheeCounter.Item, message: RavenBansheeMessage.Key]; <> jamList: ARRAY [0..4) OF LogItem = [ [noPaper, c4noPaper], [preregistrationJam, e2PreregistrationJam], [ fuserJam, e3PreExitJam], [noExit, e4PostExitJam]]; commandList: ARRAY [0..5) OF LogItem = [ [feed, feed], [solicitStatus, solicitStatus], [chime, beep], [ solicitPaperSize, solicitPaperSize], [enterLoopbackMode, enterLoopbackMode]]; statusList: ARRAY [0..38) OF LogItem = [ [pageSync, pageSync], [readyToFeed, readyToFeed], [ pageAtOutputTray, pageAtOutputTray], [feedRejected, feedRejected], [ noToner, noToner], [clamShellOpen, clamShellOpen], [ feedTrayNotEngaged, feedTrayNotEngaged], [diagnosticMode, diagnosticMode], [ callForService, callForService], [copyMode, copyMode], [ paperLetter, paperLetter], [paperA4, paperA4], [paper215X330, paper215X330], [ paperLegal, paperLegal], [paperEnvelope10, paperEnvelope10], [ paperEnvelopeRX, paperEnvelopeRX], [keyOffLine, keyOffLine], [ keyReset, keyReset], [keyLastPage, keyLastPage], [keyTest36, diagnostic36], [ keyTest37, diagnostic37], [keyTest38, diagnostic38], [keyTest39, diagnostic39], [keyTest40, diagnostic40], [keyTest41, diagnostic41], [ keyTest42, diagnostic42], [keyTest43, diagnostic43], [keyTest44, diagnostic44], [keyTest45, diagnostic45], [keyTest46, diagnostic46], [ keyTest47Loopback, diagnostic47], [keyTestStop, stopDiagnostic], [ testPrintRequest, softReset], [parityError, parityError], [ statusError, statusError], [noStatus, noStatus], [ statusOverRun, statusOverRun], [undefinedStatus, undefinedStatus]]; plateStatusList: ARRAY [0..2) OF LogItem = [ [bandOverrun, bandOverrun], [pageSyncMiss, pageSyncMiss]]; statusExtrasList: ARRAY [0..5) OF LogItem = [ [imageFault1, imageFault1], [imageFault2, imageFault2], [ imageFault3, imageFault3], [sequenceFault, sequenceFault], [ communicationFault, communicationFault]]; <> localTTY: TTY.Handle _ NSExec.GetTTY[NSExec.localExec]; localOutput: XFormat.Handle _ NSExec.OutputHandle[NSExec.localExec]; <> RunServeTestMode: PUBLIC PROCEDURE = BEGIN ENABLE TTY.Rubout => CONTINUE; testChoices: REF TextInput.Choices _ NEW[TextInput.Choices[6]]; testChoices.data[0] _ RavenBansheeMessage.GetNSMessage[exit]; testChoices.data[1] _ RavenBansheeMessage.GetNSMessage[commandStatusTurnaroundTest]; testChoices.data[2] _ RavenBansheeMessage.GetNSMessage[imageTest]; testChoices.data[3] _ RavenBansheeMessage.GetNSMessage[displayTechRepLog]; testChoices.data[4] _ RavenBansheeMessage.GetNSMessage[printTechRepLog]; testChoices.data[5] _ RavenBansheeMessage.GetNSMessage[resetTechRepLog]; DO <> SELECT TextInput.GetChoice[ tty: localTTY, prompt: RavenBansheeMessage.GetNSMessage[selectFrom], choices: testChoices, default: 0 ! TTY.Rubout => EXIT] FROM 0 => EXIT; 1 => BEGIN -- command status turnaround test localOutput.CR[]; localOutput.NSString[ -- display heading s: RavenBansheeMessage.GetNSMessage[commandStatusTurnaroundTest2]]; localOutput.NSLine[ s: RavenBansheeMessage.GetNSMessage[ IF BansheeControl.RunTurnaroundTest[] THEN working ELSE failing]]; localOutput.CR[]; IF TextInput.GetYesNo[ tty: localTTY, -- prompt for repeat test response prompt: RavenBansheeMessage.GetNSMessage[repeatTest], default: yes ! TTY.Rubout => GOTO abortTests] = no THEN EXIT; localOutput.CR[]; END; 2 => BEGIN -- image test fault: LSEPDiagnostics.ImageFault; localOutput.CR[]; localOutput.NSString[s: RavenBansheeMessage.GetNSMessage[imageTest2]]; fault _ RunImageTest[]; localOutput.NSLine[s: RavenBansheeMessage.GetNSMessage[ SELECT fault FROM noFault => working, fault1 => imageTestFailingCode1, fault2 => imageTestFailingCode2, fault3 => imageTestFailingCode3, fault4 => imageTestFailingCode4, fault5 => imageTestFailingCode5, fault6 => imageTestFailingCode6, fault7 => imageTestFailingCode7, fault8 => imageTestFailingCode8, aborted => imageTestAbortedOther, ENDCASE => imageTestAbortedTPProblem]]; localOutput.CR[]; END; 3 => BEGIN -- display tech rep log DisplayTechRepLog[]; END; 4 => BEGIN -- print tech rep log PrintTechRepLog[copies: 1]; END; 5 => BEGIN -- reset tech rep log IF TextInput.GetYesNo[tty: localTTY, -- prompt for repeat test response prompt: RavenBansheeMessage.GetNSMessage[pleaseConfirm], default: no ! TTY.Rubout => GOTO abortTests] = yes THEN ResetTechRepLog[]; END; ENDCASE; ENDLOOP; EXITS abortTests => NULL; END; -- RunServeTestMode RunRepairMode: PUBLIC PROCEDURE = BEGIN <> <> DO SELECT BansheeControl.GetEngineStatus[] FROM diagnosticOkay, diagnosticNotReady => NULL; -- stay in diagnostic mode ENDCASE => EXIT; -- back in normal mode SELECT BansheeControl.WaitEngineDiagnostic[] FROM test36 => BansheeControl.Display[blank, blank]; test37 => BansheeControl.Display[blank, blank]; test38 => BansheeControl.Display[blank, blank]; test39 => BansheeControl.Display[blank, blank]; test40 => BansheeControl.Display[blank, blank]; test41 => BansheeControl.Display[blank, blank]; test42 => BEGIN PSCommand.PrintFile[fileName: TestPattern.Name[11 ! TestPattern.NotFound => BEGIN BansheeControl.Display[E, F]; LOOP; END], senderName: RavenBansheeMessage.GetNSMessage[repairMode], copies: LAST[CARDINAL], options: [var: bansheeDl[]]]; END; test43 => PrintTechRepLog[copies: LAST[CARDINAL]]; test44 => BEGIN <> fault: LSEPDiagnostics.ImageFault; fault _ RunImageTest[]; Process.Pause[Process.SecondsToTicks[6]]; -- wait to display SELECT fault FROM noFault => BansheeControl.SendEngineCommand[displayJJ]; -- ok aborted => BansheeControl.Display[blank, blank]; notTested => BansheeControl.Display[E, F]; -- File Error ENDCASE => BansheeControl.Display[LOOPHOLE[fault], F]; -- Fault # END; test45 => BansheeControl.Display[blank, blank]; test46 => BansheeControl.Display[blank, blank]; test47Loopback => NULL; -- done in BansheeControlImpl testStop => BEGIN BansheeControl.Display[blank, blank]; BansheeEngine.SetPrintingState[completed]; END; endDiagnosticMode => EXIT; ENDCASE => NULL; -- whatever ENDLOOP; END; -- RunRepairMode WaitRepairModeRequest: PUBLIC PROCEDURE = BEGIN <> <> status: BansheeControl.EngineStatus _ BansheeControl.GetEngineStatus[]; DO SELECT status FROM diagnosticOkay, diagnosticNotReady => EXIT; ENDCASE => status _ BansheeControl.WaitEngineStatus[]; ENDLOOP; END; -- WaitRepairModeRequest <> BuildTechRepLog: PROCEDURE [sequence: StringSequence.Handle] = BEGIN <> dataBase: BansheeCounter.Handle; ExpandAppendFreeBump: PROCEDURE [messageKey: RavenBansheeMessage.Key] = BEGIN <> <> expandedString _ XMessage.Compose[ source: RavenBansheeMessage.GetNSMessage[messageKey], args: expansionString]; NSString.AppendToMesaString[to: sequence[index], from: expandedString]; index _ index + 1; END; -- ExpandAppendFreeBump FormatLogCounterMessage: PROCEDURE [item: BansheeCounter.Item, messageKey: RavenBansheeMessage.Key] = BEGIN mesaString.length _ 0; mesaString _ Convert.AppendCard[mesaString, dataBase.counter[item]]; expansionString.data[1] _ mesaString; ExpandAppendFreeBump[messageKey]; expansionString.data[1] _ NSString.nullString; END; -- FormatLogCounterMessage expansionString: REF XMessage.StringArray _ NEW[XMessage.StringArray[2]]; -- for arguments to embed in message expandedString: NSString.String; -- string for message with embedded arguments index: CARDINAL _ 0; <> mesaString: REF TEXT _ NEW[TEXT[StringSequence.learSieglerStringLength]]; nsString: NSString.String _ NSString.MakeString[bytes: StringSequence.learSieglerStringLength]; <> sDateAndTime: NSString.String _ NEW[NSString.StringRep[40]]; nsDateAndTime: NSString.String _ NSString.StringFromMesaString[sDateAndTime]; <> <> <> <> <> <> <> counterFieldWidth: CARDINAL = 10; dataBase _ BansheeCounter.Get[]; -- get event counts from log expansionString.data[0] _ NSString.nullString; <> nsString.length _ 0; nsDateAndTime.length _ 0; nsDateAndTime _ Convert.AppendTime[to: nsDateAndTime, from: BasicTime.Now[]]; <> expansionString.data[1] _ nsDateAndTime; ExpandAppendFreeBump[xeroxBansheeTechRepLogOf]; <> mesaString.length _ 0; expansionString.data[1] _ Rope.ToRefText[ThisMachine.ProcessorID[$ProductSoftware]]; ExpandAppendFreeBump[host]; <> nsString.length _ 0; nsDateAndTime.length _ 0; nsDateAndTime _ Convert.AppendTime[to: nsDateAndTime, from: Loader.BCDBuildTime[], end: seconds]; expansionString.data[1] _ nsDateAndTime; ExpandAppendFreeBump[softwareOf]; <> mesaString.length _ 0; expansionString.data[1] _ NSString.StringFromMesaString[s: mesaString]; ExpandAppendFreeBump[iotRevision]; <> nsString.length _ 0; nsDateAndTime.length _ 0; nsDateAndTime _ Convert.AppendTime[to: nsDateAndTime, from: dataBase.resetTime, end: seconds]; expansionString.data[1] _ nsDateAndTime; ExpandAppendFreeBump[lastResetOn]; <> mesaString.length _ 0; mesaString _ Convert.AppendCard[mesaString, dataBase.counter[pageSync]]; expansionString.data[1] _ mesaString; ExpandAppendFreeBump[feedsSinceLastReset]; index _ index + 1; <> ExpandAppendFreeBump[jamCountersTotalRate]; <> FOR i: CARDINAL IN [0..LENGTH[jamList]) DO mesaString.length _ 0; mesaString _ Convert.AppendCard[mesaString, dataBase.counter[jamList[i].counter]]; FOR character: CARDINAL IN [0..counterFieldWidth - 1) DO IF mesaString[character] = '0 THEN mesaString[character] _ '. ELSE EXIT; ENDLOOP; expansionString[0] _ NSString.CopyString[mesaString]; mesaString.length _ 0; IF dataBase.counter[pageSync] = 0 THEN mesaString _ RefText.Append[to: mesaString, from: "**********"] ELSE BEGIN mesaString _ Convert.AppendCard[mesaString, (dataBase.counter[pageSync]) * 1000]; FOR character: CARDINAL IN [0..counterFieldWidth - 1) DO IF mesaString[character] = '0 THEN mesaString[character] _ '. ELSE EXIT; ENDLOOP; END; expansionString.data[1] _ mesaString; ExpandAppendFreeBump[jamList[i].message]; ENDLOOP; expansionString.data[0] _ expansionString.data[1] _ NSString.nullString; <> ExpandAppendFreeBump[rateTotalTotalFeeds]; <> index _ index + 1; ExpandAppendFreeBump[commandCounters]; FOR i: CARDINAL IN [0..LENGTH[commandList]) DO FormatLogCounterMessage[commandList[i].counter, commandList[i].message]; ENDLOOP; <> index _ index + 1; ExpandAppendFreeBump[statusCounters]; FOR i: CARDINAL IN [0..LENGTH[statusList]) DO FormatLogCounterMessage[statusList[i].counter, statusList[i].message]; ENDLOOP; <> index _ index + 1; ExpandAppendFreeBump[plateStatusCounters]; FOR i: CARDINAL IN [0..LENGTH[plateStatusList]) DO FormatLogCounterMessage[ plateStatusList[i].counter, plateStatusList[i].message]; ENDLOOP; <> index _ index + 1; ExpandAppendFreeBump[statusExtrasCounters]; FOR i: CARDINAL IN [0..LENGTH[statusExtrasList]) DO FormatLogCounterMessage[ statusExtrasList[i].counter, statusExtrasList[i].message]; ENDLOOP; END; -- BuildTechRepLog DisplayTechRepLog: PROCEDURE = BEGIN <> <> <> <> <> <> <> <> <> <> <> <> END; -- DisplayTechRepLog PrintTechRepLog: PROCEDURE [copies: CARDINAL] = BEGIN <> <> <> <<>> <> <> <> <> <> <> <> <> <<[] _ BansheeEngine.WaitPrintingState[>> <> <> <> <<[] _ BansheeEngine.WaitPrintingState[targetState: started, targetEqual: TRUE];>> <> <> <> <> <> END; -- PrintTechRepLog ResetTechRepLog: PROCEDURE = BEGIN <> <> <> END; -- ResetTechRepLog RunImageTest: PROCEDURE RETURNS [imagefault: LSEPDiagnostics.ImageFault] = BEGIN eventContext: REF BansheeControl.EventContext _ NEW[BansheeControl.EventContext]; <> <> oldPriority: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityForeground]; TRUSTED BEGIN <> BansheeEngine.SetPrintingState[completed]; -- abort any current job [] _ BansheeEngine.WaitPrintingState[targetState: completed, targetEqual: TRUE]; LSEPDiagnostics.BuildImageSample[phase: prePrinting]; PSCommand.PrintFile[ fileName: TestPattern.Name[9 ! TestPattern.NotFound => GOTO noTestPattern], senderName: RavenBansheeMessage.GetNSMessage[imageTest], copies: 1, options: [var: bansheeDl[]]]; <> DO SELECT BansheeControl.GetEngineStatus[] FROM IN [okay..diagnosticOkay], IN [imageFault1..sequenceFault] => EXIT; callForService, diagnosticNotReady, communicationFault => GOTO testingError; -- don't bother ENDCASE => [] _ BansheeControl.WaitEngineStatus[]; ENDLOOP; <> BansheeControl.SetToCurrentEventContext[eventContext]; DO SELECT BansheeControl.WaitEngineEvent[eventContext] FROM feeding, pageDelivery, feedError, hardError => EXIT; ENDCASE => NULL; -- all others loop ENDLOOP; LSEPDiagnostics.BuildImageSample[phase: printing]; BansheeEngine.SetPrintingState[completed]; -- make sure engine is done (kill error retries) [] _ BansheeEngine.WaitPrintingState[targetState: completed, targetEqual: TRUE]; LSEPDiagnostics.BuildImageSample[phase: postPrinting]; imagefault _ LSEPDiagnostics.InterpretImageSample[]; EXITS noTestPattern => imagefault _ notTested; testingError => imagefault _ aborted; END; Process.SetPriority[oldPriority]; -- restore priority END; -- RunImageTest END. LOG When / Who / What. 27-Feb-85 15:18:39 / Strickberger / Created. 1-Apr-85 23:45:17 / Strickberger / Do InterpretImageSample if engineEvent = hardError to avoid wrong message for real image fault (AR13793). 22-Apr-85 22:54:34 / Strickberger / More fixes to RunImageTest (AR13793 again). 14-Jun-85 17:22:43 / Strickberger / Even more fixes to RunImageTest, run at priorityForeground (AR13793). Check BansheeControl.GetEngineStatus for diagnostic mode before BansheeControl.WaitEngineDiagnostic to avoid hanging in RunRepairMode if diagnostic mode exited during a test. Abort image test if communicationFault status. Change image test displays in RunRepairMode: FE for notTested, JJ for ok. Pause 6 seconds before displaying fault to allow IOT to redisplay test ID. 30-Jul-85 21:30:55 / Strickberger / Update for Euclid. All messages now in RavenBansheeMessage. FixArrows. 23-Aug-85 15:32:36 / Strickberger / Make TTY.Rubout exit RunServeTestMode. 1-Apr-86 0:44:11 / Strickberger / Abort current job before starting image test (AR2805). 14-May-86 20:11:19 / Prochaska / Update for new BansheeControl, add call to BansheeControl.SetToCurrentEventContext.