JaMIDunnImpl.mesa
Copyright © 1985 by Xerox Corporation.  All rights reserved.
Last edited by: Mik Lamming - June 18, 1986 11:37:42 am PDT
 
DIRECTORY BasicTime, Convert, CommandTool, Interpress, Interpreter, ThisMachine, IO, ImagerPixelMap, Terminal, InterminalBackdoor, ImagerSmooth, ImagerOps, DicentraRS232CAsync, MessageWindow, JaM, JaMIPrivate, Imager, Rope;
JaMIDunnImpl: 
CEDAR MONITOR
IMPORTS BasicTime, Convert, CommandTool, Interpreter, Interpress, IO, ThisMachine, ImagerPixelMap, Rope, Terminal, InterminalBackdoor, ImagerSmooth, ImagerOps, DicentraRS232CAsync, MessageWindow, Imager, JaM, JaMIPrivate
 
DunnHost: Rope.ROPE ← "York";
DunnWS: Rope.ROPE ← "Reprisal";
s: IO.STREAM;
Map: TYPE = ARRAY [0..255] OF NAT;
red, grn, blu: Map;
copies: NAT ← 1;
simulate: BOOLEAN ← FALSE;
cmdCode: TYPE = MACHINE DEPENDENT {
    from RS232 Interface Specs for Dunn Models 631 and 632 Color Camera Systems
    videoInvertHigh   (2EH),
    videoInvertLow   (2FH),
    readyTest     (3AH),
    statusRequest    (3BH),
    expose8x5TimeReq  (3CH),
    exposeAuxTimeReq  (3DH),
    exposeAdjFactorReq  (3EH),
    advAuxFrameCnt  (3FH),
    reset8x10ExposeStat  (40H), 
    restoreFilterWheel  (41H),
    recovDefaultVals  (42H), 
    select8x10Mode   (43H),
    selectAuxMode   (44H), 
    selectBW     (45H),
    selectColor    (46H), 
    selectNrmSeqMode  (47H),
    selectSepSeqMode  (48H), 
    exposeSeq     (49H),
    selectVidAndExpose  (4AH),
    set8x10ExposeTimes  (4BH),
    setAuxExposeTimes  (4CH),
    setExposeAdjFactors  (4DH),
    openAuxShutter   (4EH),
    closeAuxShutter   (4FH),
    unblankMonitor   (50H), 
    blankMonitor   (51H),
    selectVideoChannel  (52H), 
    positionFilterWheel  (53H),
    immExposeNoVidSw  (54H), 
    yAxisRasterCompOn  (55H),
    yAxisRasterCompOff (56H), 
    clearYAxisOffset   (57H),
    stepYAxisOffset   (58H), 
    clearXAxisOffset   (59H),
    stepXAxisOffset   (5AH),
    select35mmAuxCam  (5BH),
    select16mmAuxCam  (5CH),
    select4x5AuxCam  (5DH),
    selectSX70AuxCam  (5EH),
    setNumPadChars   (5FH),
    resetAuxNoFilmStats (60H), 
    fastOn     (61H),
    fastOff     (62H)
    };
ApplyLinearMap: 
PROC [self: JaM.State] ~ {
FOR i: 
NAT 
IN [0..255] 
DO
red[i] ← grn[i] ← blu[i] ← i;
ENDLOOP;
 
};
 
ApplyForceClose: 
PROC [self: JaM.State] ~ {
IF NOT simulate THEN Close[s];
};
 
ApplySetCopies: 
PROC [self: JaM.State] ~ {
info: JaMIPrivate.Info ← JaMIPrivate.GetInfo[self];
copies ← JaM.PopInt[self];
};
 
ApplyInterpret: 
PROC [self: JaM.State] ~ {
info: JaMIPrivate.Info ← JaMIPrivate.GetInfo[self];
command: Rope.ROPE ← JaM.PopRope[self];
errorRope: Rope.ROPE ← NIL;
[ , errorRope, ] ← Interpreter.Evaluate[command];
JaM.PushRope[self, errorRope];
};
 
ApplyDate: 
PROC [self: JaM.State] ~ {
info: JaMIPrivate.Info ← JaMIPrivate.GetInfo[self];
JaM.PushRope[self, Convert.RopeFromTime[from:BasicTime.Now[], start:months, end:seconds, includeDayOfWeek:TRUE, includeZone:FALSE]];
};
 
IpOpenFailed: ERROR[msg: Rope.ROPE] = CODE;
LogError: Interpress.LogProc ~ {
ERROR IpOpenFailed[Rope.Concat["Interpress error: ", explanation]];
};
 
ApplyShowIP: 
PROC [self: JaM.State] ~ {
GetContext: 
PROC [self: JaM.State] 
RETURNS [Imager.Context] ~ {
info: JaMIPrivate.Info ← JaMIPrivate.GetInfo[self];
IF info = NIL THEN ERROR;
IF info.ipenabled THEN RETURN [info.ipdc];
RETURN[info.vdc];
};
 
Action: 
PROC ~ {
Log : Interpress.LogProc ~ { ERROR JaM.Error[type: InvalidArgs, msg: explanation] };
Imager.ScaleT[context, 1.0/Imager.metersPerPoint];
Interpress.DoPage[master: master, page: page, context: context, log:Log]
};
 
info: JaMIPrivate.Info ← JaMIPrivate.GetInfo[self];
context: Imager.Context ~ GetContext[self];
file: Rope.ROPE ← JaM.PopRope[self];
page: INT ← JaM.PopInt[self];
master: Interpress.Master;
master ← Interpress.Open[file, LogError ! IpOpenFailed => {
ERROR JaM.Error[type: OpenFailed, msg: msg]
}];
 
 
page ← MAX[1, MIN[page, master.pages]];
Imager.DoSaveAll[context, Action];
};
 
ApplyCommand: 
PROC [self: JaM.State] ~ {
info: JaMIPrivate.Info ← JaMIPrivate.GetInfo[self];
JaM.Push[self, CommandTool.DoCommand[JaM.PopRope[self], NIL]];
};
 
ApplyDunnSnap: 
ENTRY PROC [self: JaM.State] ~ {
saveR, saveG, saveB: Map;
vt: Terminal.Virtual ← InterminalBackdoor.terminal;
{ 
-- extra block to make vt in scope for abort
ENABLE 
UNWIND => {
FOR i: 
NAT 
IN [0..255] 
DO
Terminal.SetColor[vt, i, 0, saveR[i], saveG[i], saveB[i]];
ENDLOOP;
IF NOT simulate THEN Close[s];
};
 
 
-- Open a stream to the Dunn camera
-- set up the color map as per user's spec.
FOR i: 
NAT 
IN [0..255] 
DO
[saveR[i], saveG[i], saveB[i]] ← Terminal.GetColor[vt, i, 0];
ENDLOOP;
 
-- make three spearations.
Snap[s, vt, self];
-- Close down the Dunn channel
Close[s];
-- Reset the color maps as we found them
FOR i: 
NAT 
IN [0..255] 
DO
Terminal.SetColor[vt, i, 0, saveR[i], saveG[i], saveB[i]];
ENDLOOP;
 
};
 
};
Open: 
PROC [host: Rope.
ROPE ← 
NIL] 
RETURNS [stream: 
IO.
STREAM] ~ {
simulate ← TRUE;
MessageWindow.Clear[];
IF ThisMachine.Name[].Equal[DunnWS, 
FALSE]  
THEN {
MessageWindow.Append[" Opening connection.."];
stream ← DicentraRS232CAsync.CreateStream[host: host !
IO.Error, IO.EndOfStream => ERROR;
DicentraRS232CAsync.CommError => ERROR;
DicentraRS232CAsync.CommBusy => ERROR;
];
 
MessageWindow.Append[" Open"];
simulate ← FALSE
}
 
ELSE 
MessageWindow.Append[" Simulation"];
 
};
 
Close: 
PROC [stream: 
IO.
STREAM] ~ {
IF 
NOT simulate
 THEN {
MessageWindow.Append[" Closing"];
IO.Flush[stream];
IO.Close[stream];
};
 
MessageWindow.Append[" Done"];
};
 
Cmd: 
PROC [code:
 cmdCode] ~ {
IF simulate THEN RETURN [];
IO.PutChar[s, LOOPHOLE[code, CHAR]]; 
IO.Flush[s];
IF NOT CheckReady[s] THEN ERROR;
};
 
CheckReady: 
PROC [s: 
IO.
STREAM] 
RETURNS [ok:
BOOL ← 
TRUE] ~ {
IO.PutChar[s, LOOPHOLE[cmdCode[readyTest], CHAR]];
IO.Flush[s];
IF 
IO.GetChar[s] # 'R 
THEN 
{
MessageWindow.Append[" Not Ready"];
RETURN [FALSE];
};
 
IF 
IO.GetChar[s] # '\n 
THEN 
{
MessageWindow.Append[" Not OK"];
RETURN [FALSE];
};
 
};
 
Snap: 
PROC [s: 
IO.
STREAM, vt: Terminal.Virtual, self: JaM.State] ~ {
info: JaMIPrivate.Info ← JaMIPrivate.GetInfo[self];
x: JaM.Any ~ JaM.Pop[self];
pm: ImagerPixelMap.PixelMap ← ImagerOps.PixelMapFromFrameBuffer[Terminal.GetColorFrameBufferA[vt]];
oldScreen: ImagerPixelMap.PixelMap ← pm.Copy[];
redScreen, grnScreen, bluScreen: ImagerPixelMap.PixelMap;
action: 
PROC [] ~ {
pm.Fill[[0,0,pm.sSize, pm.fSize], 255];
Imager.ScaleT[ctx, 0.0254/72];
{
ENABLE UNWIND => { info.ipenabled← FALSE };
info.ipenabled← TRUE;
info.ipdc← ctx;
JaM.Execute[self, x];
info.ipenabled← FALSE;
};
 
};
 
ctx: Imager.Context ← ImagerSmooth.Create[
pm,
$Intensity,
ImagerSmooth.LikeScreen[vt.colorHeight],
72/0.0254];
 
IF info = NIL THEN ERROR;
{
ENABLE 
UNWIND => {
Cmd[cmdCode[selectNrmSeqMode]];
Cmd[cmdCode[exposeSeq]];
Cmd[cmdCode[restoreFilterWheel]];
MessageWindow.Append[" aborted"];
pm.Transfer[oldScreen];
pm.refRep.ref ← NIL; pm.refRep ← NIL;
IF redScreen.refRep # NIL THEN redScreen.refRep.ref ← NIL;
redScreen.refRep ← NIL;
IF grnScreen.refRep # NIL THEN grnScreen.refRep.ref ← NIL;
grnScreen.refRep ← NIL;
IF bluScreen.refRep # NIL THEN bluScreen.refRep.ref ← NIL;
bluScreen.refRep ← NIL;
};
 
-- set up red color map, build image and cache bits
MessageWindow.Append[" Building separations"];
FOR i: 
NAT 
IN [0..255] 
DO
Terminal.SetColor[vt, i, 0, red[i], 0, 0];
ENDLOOP;
 
ImagerSmooth.SetComponent[ctx, $Red];
ctx.DoSaveAll[action];
redScreen ← pm.Copy[];
MessageWindow.Append[" R"];
-- set up green color map, build image and cache bits
FOR i: 
NAT 
IN [0..255] 
DO
Terminal.SetColor[vt, i, 0, 0, grn[i], 0];
ENDLOOP;
 
ImagerSmooth.SetComponent[ctx, $Green];
ctx.DoSaveAll[action];
grnScreen ← pm.Copy[];
MessageWindow.Append["G"];
-- set up blue color map, build image and cache bits
FOR i: 
NAT 
IN [0..255] 
DO
Terminal.SetColor[vt, i, 0, 0, 0, blu[i]];
ENDLOOP;
 
ImagerSmooth.SetComponent[ctx, $Blue];
ctx.DoSaveAll[action];
bluScreen ← pm.Copy[];
MessageWindow.Append["B"];
MessageWindow.Append[" Snapping "];
Cmd[cmdCode[closeAuxShutter]];
Cmd[cmdCode[restoreFilterWheel]];
Cmd[cmdCode[selectSepSeqMode]];
-- set up red color map, restore image and expose it
THROUGH [1..copies] 
DO
IF JaM.GetAbort[self] THEN EXIT;
FOR i: 
NAT 
IN [0..255] 
DO
Terminal.SetColor[vt, i, 0, red[i], 0, 0];
ENDLOOP;
 
pm.Transfer[redScreen];
Cmd[cmdCode[exposeSeq]];
MessageWindow.Append[" R"];
-- set up green color map, restore image and expose it
FOR i: 
NAT 
IN [0..255] 
DO
Terminal.SetColor[vt, i, 0, 0, grn[i], 0];
ENDLOOP;
 
ImagerSmooth.SetComponent[ctx, $Green];
pm.Transfer[grnScreen];
Cmd[cmdCode[exposeSeq]];
MessageWindow.Append["G"];
-- set up blue color map, restore image and expose it
FOR i: 
NAT 
IN [0..255] 
DO
Terminal.SetColor[vt, i, 0, 0, 0, blu[i]];
ENDLOOP;
 
ImagerSmooth.SetComponent[ctx, $Blue];
pm.Transfer[bluScreen];
Cmd[cmdCode[exposeSeq]];
MessageWindow.Append["B"];
ENDLOOP;
 
pm.Transfer[oldScreen];
pm.refRep.ref ← NIL; pm.refRep ← NIL;
redScreen.refRep.ref ← NIL; redScreen.refRep ← NIL;
grnScreen.refRep.ref ← NIL; grnScreen.refRep ← NIL;
bluScreen.refRep.ref ← NIL; bluScreen.refRep ← NIL;
};
 
};
 
 
ApplySetMap: 
PROC [self: JaM.State] ~ {
info: JaMIPrivate.Info ← JaMIPrivate.GetInfo[self];
map: JaM.Array ~ JaM.PopArray[self];
length: NAT ← map.length;
nEntries:NAT ← map.length / 4;
IF nEntries > 256 THEN ERROR;
FOR i: 
NAT 
IN [0..255] 
DO
red[i] ← grn[i] ← blu[i] ← 0;
ENDLOOP;
 
FOR i: 
NAT 
IN [0..nEntries) 
DO
index: NAT ← NatFromAny[JaM.AGet[map, i*4+0]];
red[index] ← NatFromAny[JaM.AGet[map, i*4+1]];
grn[index] ← NatFromAny[JaM.AGet[map, i*4+2]];
blu[index] ← NatFromAny[JaM.AGet[map, i*4+3]];
ENDLOOP;
 
};
NatFromAny: 
PROC [x: JaM.Any] 
RETURNS [
NAT] ~ {
i:
INT ←
WITH x 
SELECT 
FROM
x: REF INT => x^,
ENDCASE => ERROR JaM.Error[WrongType, "color map should contain CARDINALS [0-255]"];
 
 
IF i IN [0..255]
 THEN
RETURN [i]
 
ELSE
ERROR JaM.Error[WrongType, "color map should contain CARDINALS [0-255]"]
 
};
 
 
RegisterDunn: 
PUBLIC 
PROC [self: JaM.State] ~ {
-- called with (JaMIDunnImpl) .callinit
JaM.Register[self, ".dunnsnap", ApplyDunnSnap];
JaM.Register[self, ".preparecolormaps", ApplySetMap];
JaM.Register[self, ".linearmaps", ApplyLinearMap];
JaM.Register[self, ".forcedunnclosed", ApplyForceClose];
JaM.Register[self, ".copies", ApplySetCopies];
JaM.Register[self, ".interpret", ApplyInterpret];
JaM.Register[self, ".command", ApplyCommand];
JaM.Register[self, ".date", ApplyDate];
JaM.Register[self, ".showip", ApplyShowIP];
};
 
Init: 
PROC [] 
RETURNS [] ~ {
FOR i: 
NAT 
IN [0..255] 
DO
red[i] ← grn[i] ← blu[i] ← i;
ENDLOOP;
 
JaM.RegisterInit["JaMIDunnImpl", RegisterDunn];
};
 
Init[];