BansheeTestImpl.mesa
Copyright (C) Xerox Corporation 1984, 1985, 1986. All rights reserved.
Last edited by Prochaska 14-May-86 20:12:17
Ruseli Binsol: November 6, 1986 2:26:45 pm PST
Tim Diebert: December 2, 1986 3:02:20 pm PST
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],
Format USING [HostNumber, LongNumber, Number, NumberFormat, StringProc],
Heap USING [systemZone],
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],
RasterLogFont USING [TransferStringSequence],
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
TYPEs:
LogItem: TYPE = RECORD [counter: BansheeCounter.Item, message: RavenBansheeMessage.Key];
Constants
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]];
Variables:
localTTY: TTY.Handle ← NSExec.GetTTY[NSExec.localExec];
localOutput: XFormat.Handle ← NSExec.OutputHandle[NSExec.localExec];
PUBLIC PROCEDUREs:
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
display a list of numbered test choices and get input; default is exit
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
Runs Banshee server based diagnostics depending on Banshee console input.
Returns when Banshee printer is returned to normal mode.
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
builds images, prints test patterns
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
Returns when Banshee printer is placed in repair mode.
RunRepairMode should then be called to execute server based printer diagnostic requests.
status: BansheeControl.EngineStatus ← BansheeControl.GetEngineStatus[];
DO
SELECT status FROM
diagnosticOkay, diagnosticNotReady => EXIT;
ENDCASE => status ← BansheeControl.WaitEngineStatus[];
ENDLOOP;
END; -- WaitRepairModeRequest
PRIVATE PROCEDUREs:
BuildTechRepLog: PROCEDURE [sequence: StringSequence.Handle] = BEGIN
called by DisplayLog to put appropriate text into sequence
dataBase: BansheeCounter.Handle;
ExpandAppendFreeBump: PROCEDURE [messageKey: RavenBansheeMessage.Key] = BEGIN
inserts arguments into a message, places the string into the string sequence,
and increments the index
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;
body of BuildTechRepLog
mesaString: REF TEXTNEW[TEXT[StringSequence.learSieglerStringLength]];
nsString: NSString.String ← NSString.MakeString[bytes: StringSequence.learSieglerStringLength];
used for appending dates:
sDateAndTime: NSString.String ← NEW[NSString.StringRep[40]];
nsDateAndTime: NSString.String ← NSString.StringFromMesaString[sDateAndTime];
used for appending counters:
rateFormat: Format.NumberFormat = [
base: 10, zerofill: TRUE, unsigned: TRUE, columns: counterFieldWidth];
decFormat: Format.NumberFormat = [
base: 10, zerofill: FALSE, unsigned: TRUE, columns: 0];
hexFormat: Format.NumberFormat = [
base: 16, zerofill: FALSE, unsigned: TRUE, columns: 0];
counterFieldWidth: CARDINAL = 10;
dataBase ← BansheeCounter.Get[]; -- get event counts from log
expansionString.data[0] ← NSString.nullString;
Make "Tech Rep Log Of..." line
nsString.length ← 0;
nsDateAndTime.length ← 0;
nsDateAndTime ← Convert.AppendTime[to: nsDateAndTime, from: BasicTime.Now[]];
appends time to nsDateAndTime
expansionString.data[1] ← nsDateAndTime;
ExpandAppendFreeBump[xeroxBansheeTechRepLogOf];
Make "Host #" line
mesaString.length ← 0;
expansionString.data[1] ← Rope.ToRefText[ThisMachine.ProcessorID[$ProductSoftware]];
ExpandAppendFreeBump[host];
Make "Software Of..." line
nsString.length ← 0;
nsDateAndTime.length ← 0;
nsDateAndTime ← Convert.AppendTime[to: nsDateAndTime, from: Loader.BCDBuildTime[],
end: seconds];
expansionString.data[1] ← nsDateAndTime;
ExpandAppendFreeBump[softwareOf];
Make "IOT Firmware..." line
mesaString.length ← 0;
expansionString.data[1] ← NSString.StringFromMesaString[s: mesaString];
ExpandAppendFreeBump[iotRevision];
Make "Last Reset On..." line
nsString.length ← 0;
nsDateAndTime.length ← 0;
nsDateAndTime ← Convert.AppendTime[to: nsDateAndTime, from: dataBase.resetTime, end: seconds];
expansionString.data[1] ← nsDateAndTime;
ExpandAppendFreeBump[lastResetOn];
Make "Feeds..." line
mesaString.length ← 0;
mesaString ← Convert.AppendCard[mesaString, dataBase.counter[pageSync]];
expansionString.data[1] ← mesaString;
ExpandAppendFreeBump[feedsSinceLastReset];
index ← index + 1;
Make "Jam Counters" line
ExpandAppendFreeBump[jamCountersTotalRate];
Make the Jam Counters log block
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;
Make "Rate =..." line
ExpandAppendFreeBump[rateTotalTotalFeeds];
Make the Command Counters log block
index ← index + 1;
ExpandAppendFreeBump[commandCounters];
FOR i: CARDINAL IN [0..LENGTH[commandList]) DO
FormatLogCounterMessage[commandList[i].counter, commandList[i].message];
ENDLOOP;
Make the Status Counters log block
index ← index + 1;
ExpandAppendFreeBump[statusCounters];
FOR i: CARDINAL IN [0..LENGTH[statusList]) DO
FormatLogCounterMessage[statusList[i].counter, statusList[i].message];
ENDLOOP;
Make the Plate Status Counters log block
index ← index + 1;
ExpandAppendFreeBump[plateStatusCounters];
FOR i: CARDINAL IN [0..LENGTH[plateStatusList]) DO
FormatLogCounterMessage[
plateStatusList[i].counter, plateStatusList[i].message];
ENDLOOP;
Make the Status Extras Counters log block
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
builds and displays the tech rep log
sequence: StringSequence.Handle;
sequence ← StringSequence.Create[
sequenceLength: 72, stringLength: StringSequence.learSieglerStringLength];
BuildTechRepLog[sequence: sequence];
FOR index: CARDINAL IN [0..sequence.length) DO
screen display loop
NSExec.PutMessage[
exec: NSExec.localExec,
string: NSString.StringFromMesaString[s: sequence[index]]];
ENDLOOP;
StringSequence.Delete[sequence: sequence];
END; -- DisplayTechRepLog
PrintTechRepLog: PROCEDURE [copies: CARDINAL] = BEGIN
builds and prints the tech rep log
jobData: BansheeEngine.Job;
sequence: StringSequence.Handle;
sequence ← StringSequence.Create[
sequenceLength: 72, stringLength: StringSequence.learSieglerStringLength];
BuildTechRepLog[sequence: sequence];
jobData ← [
banner: suppressed, printOrder: firstPageOutFirst, copyCount: copies,
document: RasterLogFont.TransferStringSequence[sequence], firstPage: 0,
lastPage: LAST[CARDINAL]];
StringSequence.Delete[sequence];
[] ← BansheeEngine.WaitPrintingState[
targetState: completed, targetEqual: TRUE];
BansheeEngine.SetJob[@jobData];
BansheeEngine.SetPrintingState[started];
[] ← BansheeEngine.WaitPrintingState[targetState: started, targetEqual: TRUE];
UNTIL BansheeEngine.GetPrintingState[] = completed DO
IF BansheeControl.GetEngineStatus[] NOT IN [okay..diagnosticOkay] THEN
BansheeEngine.SetPrintingState[completed];
Process.Pause[Process.SecondsToTicks[1]];
ENDLOOP;
END; -- PrintTechRepLog
ResetTechRepLog: PROCEDURE = BEGIN
resets all event counters to zero
BansheeCounter.Reset;
Process.Pause[ticks: Process.SecondsToTicks[seconds: 1]];
END; -- ResetTechRepLog
RunImageTest: PROCEDURE RETURNS [imagefault: LSEPDiagnostics.ImageFault] = BEGIN
eventContext: REF BansheeControl.EventContext ← NEW[BansheeControl.EventContext];
check Video Data, Line Sync, and Video Clock signals
run at priorityForeground
oldPriority: Process.Priority ← Process.GetPriority[];
Process.SetPriority[Process.priorityForeground];
TRUSTED BEGIN
make sure engine is idle
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[]]];
wait for testable status indication
DO
SELECT BansheeControl.GetEngineStatus[] FROM
IN [okay..diagnosticOkay], IN [imageFault1..sequenceFault] => EXIT;
callForService, diagnosticNotReady, communicationFault =>
GOTO testingError; -- don't bother
ENDCASE => [] ← BansheeControl.WaitEngineStatus[];
ENDLOOP;
wait for page sync (feeding) or error event
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.