DIRECTORY Imager USING [Context], ImagerBitmapContext USING [Brick, Create, SetBitmap, SetBrick], ImagerDevice USING [FontTuner], ImagerSample USING [Clear, GetSize, NewSampleMap, Put, RasterSampleMap, SampleMap], Loader USING [MakeProcedureResident, MakeGlobalFrameResident], LSEPFace, Process USING [Pause, Priority, GetPriority, priorityFaultHandlers, SecondsToTicks, SetPriority], PrincOps USING [bitsPerWord, wordsPerPage, PageCount], RavenCodes, RavenControl, RavenDriver, Rope USING [ROPE]; RavenDriverImpl: MONITOR IMPORTS -- FontTune, -- ImagerBitmapContext, ImagerSample, Loader, LSEPFace, Process, RavenControl EXPORTS RavenDriver ~ BEGIN OPEN RavenDriver; myPixelMap: ImagerSample.RasterSampleMap _ NIL; secondPixelMap: ImagerSample.RasterSampleMap _ NIL; GetPrinterSampleMap: PUBLIC PROC RETURNS [sampleMap: ImagerSample.RasterSampleMap] = {RETURN[myPixelMap]}; ContextFromSampleMap: PUBLIC PROC [sampleMap: ImagerSample.RasterSampleMap, fontTunerParms: Rope.ROPE _ NIL] RETURNS [context: Imager.Context] = BEGIN fontTuner: ImagerDevice.FontTuner _ NIL; context _ ImagerBitmapContext.Create[deviceSpaceSize: ImagerSample.GetSize[sampleMap], scanMode: [slow: right, fast: up], surfaceUnitsPerInch: [300, 300], pixelUnits: FALSE, fontCacheName: $PrinterBitmap, fontTuner: NIL]; ImagerBitmapContext.SetBitmap[context, sampleMap]; ImagerBitmapContext.SetBrick[context, coarseBrick]; ImagerSample.Clear[sampleMap]; END; lastPaperFeed: RavenControl.PaperTray _ top; MakeSimpleBrick: PROC [t: ARRAY [0..4) OF PACKED ARRAY [0..4) OF [0..16)] RETURNS [ImagerBitmapContext.Brick] ~ { b: ImagerSample.SampleMap ~ ImagerSample.NewSampleMap[box: [max: [4, 4]], bitsPerSample: 8]; FOR s: NAT IN [0..4) DO FOR f: NAT IN [0..4) DO ImagerSample.Put[b, [s, f], t[s][f]]; ENDLOOP; ENDLOOP; RETURN [[maxSample: 15, sampleMap: b, phase: 0]] }; coarseBrick: ImagerBitmapContext.Brick _ MakeSimpleBrick[[ [00, 01, 13, 14], [08, 02, 03, 15], [09, 10, 04, 05], [07, 11, 12, 06] ]]; SetRegistration: PUBLIC PROCEDURE [registration: RavenRegistration] = TRUSTED BEGIN DivideUp: PROCEDURE [divident, divisor: CARDINAL] RETURNS [quotient: CARDINAL] = TRUSTED INLINE BEGIN RETURN[quotient: (divident + divisor - 1) / divisor]; END; LSEPFace.SetPageOffsets[ wordsFast: DivideUp[divident: registration.long * registrationTabSize, divisor: PrincOps.bitsPerWord], linesSlow: registration.short * registrationTabSize]; END; -- SetRegistration printing: BOOL _ FALSE; PrintingError: PUBLIC ERROR = CODE; WakeUp: PUBLIC PROCEDURE[] = BEGIN RavenControl.SendEngineCommand[solicitStatus]; -- Jump start the Raven END; PrintFromSampleMap: PUBLIC PROC [sampleMap: ImagerSample.RasterSampleMap, copies: CARDINAL _ 1, paperFeed: RavenDriver.PaperFeed _ alternating] RETURNS [endingStatus: PrinterStatus, type: StatusType] = BEGIN ENABLE ABORTED => printing _ FALSE; eventContext: REF RavenControl.EventContext _ NEW[RavenControl.EventContext]; feedOkay, engineError, transferIsReady, transferWait: BOOL _ FALSE; old: Process.Priority _ Process.GetPriority[]; engineStatus: RavenControl.EngineStatus; paperTray: RavenControl.PaperTray _ SELECT paperFeed FROM bottom => bottom, top => top, alternating => IF lastPaperFeed = top THEN bottom ELSE top, ENDCASE => top; RavenControl.SetToCurrentEventContext[eventContext]; printing _ TRUE; lastPaperFeed _ paperTray; DO -- wait ok loop IF engineStatus IN [imageFault1..imageFault3] THEN engineStatus _ okay; -- clear "sticky" status with new job start SELECT RavenControl.GetEngineStatus[] FROM okay, tonerLow => EXIT; okayFlushRequired, IN [imageFault1..imageFault3] => BEGIN RavenControl.Feed[paperTray, aligned]; DO -- flush printing loop SELECT RavenControl.WaitEngineEvent[eventContext] FROM pageDelivery, idle, feedError, softError, hardError, timeout => EXIT; -- wait for these ENDCASE => LOOP; -- others are in-process ENDLOOP; -- flush printing loop LOOP; -- flushed one sheet, try again END; preRegistrationFault => {Process.Pause[Process.SecondsToTicks[1]]; LOOP}; -- Wait for someone to fix it ENDCASE => BEGIN-- wake up printer / query every second RavenControl.SendEngineCommand[solicitStatus]; Process.Pause[Process.SecondsToTicks[1]]; LOOP; END; ENDLOOP; -- wait ok loop RavenControl.PageTransferSet[sampleMap]; BEGIN ENABLE UNWIND => Process.SetPriority[old]; Process.SetPriority[Process.priorityFaultHandlers]; RavenControl.Feed[paperTray, aligned]; feedOkay _ FALSE; transferIsReady _ TRUE; DO -- page printing loop SELECT RavenControl.WaitEngineEvent[eventContext] FROM readyToFeed => {feedOkay _ TRUE; IF transferWait AND NOT transferIsReady THEN LOOP}; feeding => { -- pageFeed _ pageFeed + 1; --transferIsReady _ FALSE; LOOP}; transferReady => BEGIN transferIsReady _ TRUE; IF (NOT feedOkay) THEN LOOP; END; imaged => LOOP; imagedOverrun => {-- pageTrash _ pageTrash + 1; -- transferWait _ TRUE; LOOP}; pageSyncMiss => EXIT; pageDelivery => EXIT; -- Page is at otuput idle, timeout => EXIT; feedError => {engineError _ TRUE; EXIT}; softError => {engineError _ TRUE; EXIT}; hardError => {engineError _ TRUE; EXIT}; ENDCASE => ERROR; ENDLOOP; -- page printing loop IF engineError THEN {Process.SetPriority[old]; ERROR PrintingError}; END; Process.SetPriority[old]; END; mySP: REF StatusProc _ NIL; RegisterStatusProc: PUBLIC ENTRY PROC [sp: StatusProc] = {mySP _ NEW[StatusProc _ sp]}; UnRegisterStatusProc: PUBLIC ENTRY PROC [sp: StatusProc] = {mySP _ NIL}; activeLength: (0..PrincOps.wordsPerPage] _ ((11*300)+15)/16; Init: PROC [] = BEGIN Loader.MakeProcedureResident[PrintFromSampleMap]; Loader.MakeGlobalFrameResident[PrintFromSampleMap]; RavenControl.Initialize[16*3]; RavenControl.SetScanLineLength[activeLength]; myPixelMap _ RavenControl.GetPageMap[]; RavenControl.SendEngineCommand[solicitStatus]; -- Jump start the Raven END; Init[]; END. RavenDriverImpl.mesa Copyright Σ 1985, 1986, 1987 by Xerox Corporation. All rights reserved. Tim Diebert: April 9, 1987 1:24:19 pm PDT FontTune USING [CreateFontTuner], IF fontTunerParms # NIL THEN fontTuner _ FontTune.CreateFontTuner[fontTunerParms]; sets up arguments for call which will set page offsets reset counters to new starting page "Flush" the printer with a blank sheet to complete previous unfinished imaging IF (NOT transferWait) OR (NOT feedOkay) THEN LOOP; secondPixelMap _ MakePrinterPixelMap[]; ΚΔ˜™IcodešœH™HK™)—K˜šΟk ˜ Kšœ œ™!Kšœœ ˜Kšœœ&˜?Kšœ œ ˜Kšœ œA˜SKšœœ2˜>Kšœ ˜ KšœœT˜aKšœ œ(˜6K˜ K˜ Kšœ ˜ Kšœœœ˜—K˜K˜KšΠlnœ˜KšœΟcœK˜bKšœ ˜šœœœ ˜K˜Kšœ+œ˜/Kšœ/œ˜3K˜Kš Οnœœœœ.œ˜jK˜š  œœœ@œœœ˜–Kšœ$œ˜(Kšœœœ6™RK•StartOfExpansionΖ[deviceSpaceSize: SF.Vec, scanMode: ImagerTransformation.ScanMode, surfaceUnitsPerInch: VEC, pixelUnits: BOOL _ FALSE, fontCacheName: ATOM _ NIL, fontTuner: ImagerDevice.FontTuner _ NIL]šœ§œ,œ˜έKšœ2˜2Kšœ3˜3Kšœ˜Kšœ˜—K˜Kšœ,˜,K˜š œœœœœœœ œ ˜qKšœ\˜\šœœœ˜šœœœ˜Kšœ%˜%Kšœ˜—Kšœ˜—Kšœ*˜0Kšœ˜K˜—šœ:˜:Kšœ˜Kšœ˜Kšœ˜Kšœ˜K˜—K˜K˜š  œœ œ%œ˜SKš œ œœœ œœœœœ0œ˜ Kšœ6™6˜Kšœf˜fKšœ5˜5—KšœŸ˜—K˜Kšœ œœ˜K˜Kš  œœœœ˜#K˜š œœ œ˜"Kšœ0Ÿ˜GKšœ˜—K˜š  œœœ3œ6œ3˜ΟKšœœœ˜#Kšœœœ˜MKšœ6œœ˜CKšœ.˜.Kšœ(˜(šœ$œ ˜9K˜K˜ Kšœœœœ˜;Kšœ˜—Kšœ4˜4Kšœ œ˜Kšœ˜šœŸ˜KšœœœŸ+˜tKšœ#™#šœ ˜*Kšœœ˜šœœ˜9KšœN™NKšœ&˜&šœŸ˜šœ+˜6Kšœ?œŸ˜XKšœœŸ˜*—KšœŸ˜ —KšœŸ˜&Kšœ˜—KšœCœŸ˜gšœŸ'˜7K˜.K˜)Kšœ˜Kšœ˜——KšœŸ˜—Kšœ(˜(šœœœ˜0Kšœ3˜3Kšœ&˜&Kšœ œ˜Kšœœ˜šœŸ˜šœ+˜6šœœ œ˜ Kš œœœœœ˜3—Kš œ ŸœŸœœœ˜Jšœ˜Kšœœ˜Kš œœœœ œœ™2Kšœœ œœ˜Kšœ˜—Kšœ œ˜Kš œŸœŸœœœ˜NKšœœ˜KšœœŸ˜*Kšœœ˜Kšœ œœœ˜(Kšœœœ˜(Kšœœœ˜(Kšœœ˜—KšœŸ˜—Kšœ œœ˜DKšœ˜—Kšœ˜šœ˜K˜——šœœœ˜K˜—Kš  œœœœœ˜WK˜Kš  œœœœœ˜HK˜Kšœ<˜