DIRECTORY Buttons, Containers, IO, Labels, Menus, MessageWindow, MonitorToolButtons, MonitorToolOps, Rope, Rules, UserExec, VFonts, ViewerOps, ViewerTools, WindowManager ; MonitorToolImpl: CEDAR PROGRAM IMPORTS Buttons, Containers, IO, Labels, Menus, MessageWindow, MonitorToolButtons, MonitorToolOps, Rules, UserExec, VFonts, ViewerOps, ViewerTools, WindowManager SHARES MonitorToolOps = BEGIN OPEN MTB: MonitorToolButtons; entryHeight: CARDINAL = 15; -- how tall to make each line of items entryVSpace: CARDINAL = 6; -- vertical leading space between lines entryHSpace: CARDINAL = 10; -- horizontal space between items in a line entryTabSpace: CARDINAL _ 36*3; -- horizontal tab between items in a line ruleHeight: CARDINAL _ 4; resultWidth: CARDINAL = 12*VFonts.CharWidth['0];-- 12 digits worth of width defaultScreenWidth: Rope.ROPE = "1024"; defaultScreenHeight: Rope.ROPE = "768"; defaultRefresh: Rope.ROPE = "35"; defaultHBlank: Rope.ROPE = "6"; defaultVBlank: Rope.ROPE = "850"; defaultBPP: Rope.ROPE = "8"; MakeMonitorTool: UserExec.CommandProc = TRUSTED { myRule: Rules.Rule; myMenu: Menus.Menu _ Menus.CreateMenu[]; my: MTB.Handle _ NEW[MTB.MTViewerRec]; Menus.AppendMenuEntry[ -- add command to the menu menu: myMenu, entry: Menus.CreateEntry[ name: "Calculate", -- name of the command proc: CalculateProc, -- MenuProc associated with command clientData: my ] ]; Menus.AppendMenuEntry[ -- add command to the menu menu: myMenu, entry: Menus.CreateEntry[ name: "Set", -- name of the command proc: SetParametersProc, -- MenuProc associated with command clientData: my ] ]; Menus.AppendMenuEntry[ -- add command to the menu menu: myMenu, entry: Menus.CreateEntry[ name: "TurnOff", -- name of the command proc: TurnOffProc, -- MenuProc associated with command clientData: my ] ]; my.container _ Containers.Create[info: [-- construct the outer container name: "MonitorTool", -- name displayed in the caption iconic: FALSE, -- so tool won't be iconic (small) when first created column: left, -- initially in the left column menu: myMenu, -- displaying our menu command scrollable: TRUE ]]; -- allow scrolling contents my.screenWidth _ MakeEntryViewer[handle: my, buttonName: "screen width", labelName: "visible pixels", proc: MTB.ScreenWidth, initialData: defaultScreenWidth]; my.screenHeight _ MakeEntryViewer[handle: my, buttonName: "screen height", labelName: "visible pixels", proc: MTB.ScreenHeight, initialData: defaultScreenHeight]; my.refresh _ MakeEntryViewer[handle: my, buttonName: "refresh rate", labelName: "frames per second", proc: MTB.Refresh, initialData: defaultRefresh]; my.hBlank _ MakeEntryViewer[handle: my, buttonName: "hBlank time", labelName: "microseconds", proc: MTB.HBlank, initialData: defaultHBlank]; my.vBlank _ MakeEntryViewer[handle: my, buttonName: "vBlank time", labelName: "microseconds", proc: MTB.VBlank, initialData: defaultVBlank]; my.bpp _ MakeEntryViewer[handle: my, buttonName: "bits per pixel", labelName: "{1,2,4,8,24}", proc: MTB.BitsPerPixel, initialData: defaultBPP]; my.height _ my.height + entryHeight+ entryVSpace; --space down myRule _ Rules.Create[info: [parent: my.container, wx: my.screenWidth.button.wx, wy: my.height, ww: my.container.ww-my.screenWidth.button.wx*2, wh: ruleHeight]]; my.height _ my.height + ruleHeight+ entryVSpace; --space down Containers.ChildXBound[my.container, myRule]; my.fieldTime _ MakeResultViewer[handle: my, leftLabelName: "field time", rightLabelName: "milliseconds"]; my.fieldFreq _ MakeResultViewer[handle: my, leftLabelName: "field freq", rightLabelName: "Hz"]; my.lineTime _ MakeResultViewer[handle: my, leftLabelName: "line time", rightLabelName: "microseconds"]; my.lineFreq _ MakeResultViewer[handle: my, leftLabelName: "line freq", rightLabelName: "KHz"]; my.pixelTime _ MakeResultViewer[handle: my, leftLabelName: "pixel time", rightLabelName: "nanoseconds"]; my.pixelFreq _ MakeResultViewer[handle: my, leftLabelName: "pixel freq", rightLabelName: "MHz"]; my.MUL _ MakeResultViewer[handle: my, leftLabelName: "MUL", rightLabelName: "[0..255]"]; my.DIV _ MakeResultViewer[handle: my, leftLabelName: "DIV", rightLabelName: "[0..15]"]; my.vControl _ MakeResultViewer[handle: my, leftLabelName: "vertical ctrl", rightLabelName: "", entryheight: 4*entryHeight, entrywidth: 3*resultWidth]; my.hControl _ MakeResultViewer[handle: my, leftLabelName: "horizontal ctrl", rightLabelName: "", entryheight: 4*entryHeight, entrywidth: 3*resultWidth]; CalculateProc[parent: NIL, clientData: my]; MessageWindow.Append[message: "Default Parameters for 1024x768 Monitor", clearFirst: TRUE]; ViewerOps.SetOpenHeight[my.container, my.height]; -- hint our desired height ViewerOps.PaintViewer[my.container, all]; -- reflect above change }; TurnOffProc: Menus.MenuProc = TRUSTED { WindowManager.StopColorViewers[]; }; SetParametersProc: Menus.MenuProc = TRUSTED { OPEN MTOps: MonitorToolOps; my: MTB.Handle _ NARROW[clientData]; sw, sh, refresh, bpp: LONG CARDINAL; hBlank, vBlank: REAL; mp: MTOps.MonitorParam; { --for catch phrases sw _ IO.GetCard[IO.RIS[ViewerTools.GetContents[my.screenWidth.input]] ! IO.SyntaxError => { MessageWindow.Append[message: "Input Syntax Error in ", clearFirst: TRUE]; MessageWindow.Append[message: my.screenWidth.button.name, clearFirst: FALSE]; GOTO error};]; sh _ IO.GetCard[IO.RIS[ViewerTools.GetContents[my.screenHeight.input]] ! IO.SyntaxError => { MessageWindow.Append[message: "Input Syntax Error in ", clearFirst: TRUE]; MessageWindow.Append[message: my.screenHeight.button.name, clearFirst: FALSE]; GOTO error};]; refresh _ IO.GetCard[IO.RIS[ViewerTools.GetContents[my.refresh.input]] ! IO.SyntaxError => { MessageWindow.Append[message: "Input Syntax Error in ", clearFirst: TRUE]; MessageWindow.Append[message: my.refresh.button.name, clearFirst: FALSE]; GOTO error};]; bpp _ IO.GetCard[IO.RIS[ViewerTools.GetContents[my.bpp.input]] ! IO.SyntaxError => { MessageWindow.Append[message: "Input Syntax Error in ", clearFirst: TRUE]; MessageWindow.Append[message: my.bpp.button.name, clearFirst: FALSE]; GOTO error};]; hBlank _ 1E-6* IO.GetReal[IO.RIS[ViewerTools.GetContents[my.hBlank.input]] ! IO.SyntaxError => { MessageWindow.Append[message: "Input Syntax Error in ", clearFirst: TRUE]; MessageWindow.Append[message: my.hBlank.button.name, clearFirst: FALSE]; GOTO error};]; vBlank _ 1E-6* IO.GetReal[IO.RIS[ViewerTools.GetContents[my.vBlank.input]] ! IO.SyntaxError => { MessageWindow.Append[message: "Input Syntax Error in ", clearFirst: TRUE]; MessageWindow.Append[message: my.vBlank.button.name, clearFirst: FALSE]; GOTO error};]; mp _ MTOps.DoMonitorParams[sw,sh,refresh,hBlank,vBlank]; MTOps.SetMonitorParams[bpp, mp]; EXITS error => NULL; }; --for catch phrases }; CalculateProc: Menus.MenuProc = TRUSTED { OPEN MTOps: MonitorToolOps; my: MTB.Handle _ NARROW[clientData]; sw, sh, refresh, bpp: LONG CARDINAL; hBlank, vBlank: REAL; mp: MTOps.MonitorParam; { --for catch phrases sw _ IO.GetCard[IO.RIS[ViewerTools.GetContents[my.screenWidth.input]] ! IO.SyntaxError => { MessageWindow.Append[message: "Input Syntax Error in ", clearFirst: TRUE]; MessageWindow.Append[message: my.screenWidth.button.name, clearFirst: FALSE]; GOTO error};]; sh _ IO.GetCard[IO.RIS[ViewerTools.GetContents[my.screenHeight.input]] ! IO.SyntaxError => { MessageWindow.Append[message: "Input Syntax Error in ", clearFirst: TRUE]; MessageWindow.Append[message: my.screenHeight.button.name, clearFirst: FALSE]; GOTO error};]; refresh _ IO.GetCard[IO.RIS[ViewerTools.GetContents[my.refresh.input]] ! IO.SyntaxError => { MessageWindow.Append[message: "Input Syntax Error in ", clearFirst: TRUE]; MessageWindow.Append[message: my.refresh.button.name, clearFirst: FALSE]; GOTO error};]; bpp _ IO.GetCard[IO.RIS[ViewerTools.GetContents[my.bpp.input]] ! IO.SyntaxError => { MessageWindow.Append[message: "Input Syntax Error in ", clearFirst: TRUE]; MessageWindow.Append[message: my.bpp.button.name, clearFirst: FALSE]; GOTO error};]; hBlank _ 1E-6* IO.GetReal[IO.RIS[ViewerTools.GetContents[my.hBlank.input]] ! IO.SyntaxError => { MessageWindow.Append[message: "Input Syntax Error in ", clearFirst: TRUE]; MessageWindow.Append[message: my.hBlank.button.name, clearFirst: FALSE]; GOTO error};]; vBlank _ 1E-6* IO.GetReal[IO.RIS[ViewerTools.GetContents[my.vBlank.input]] ! IO.SyntaxError => { MessageWindow.Append[message: "Input Syntax Error in ", clearFirst: TRUE]; MessageWindow.Append[message: my.vBlank.button.name, clearFirst: FALSE]; GOTO error};]; EXITS error => RETURN; }; --for catch phrases mp _ MTOps.DoMonitorParams[sw,sh,refresh,hBlank,vBlank]; Labels.Set[label: my.fieldTime.data, value: IO.PutFR[format: "%g", v1: IO.real[1E3*MTOps.fieldTime]]]; Labels.Set[label: my.fieldFreq.data, value: IO.PutFR[format: "%g", v1: IO.real[MTOps.fieldFreq]]]; Labels.Set[label: my.lineTime.data, value: IO.PutFR[format: "%g", v1: IO.real[1E6*MTOps.trueLinetime]]]; Labels.Set[label: my.lineFreq.data, value: IO.PutFR[format: "%g", v1: IO.real[1E-3*MTOps.trueLinefreq]]]; Labels.Set[label: my.pixelTime.data, value: IO.PutFR[format: "%g", v1: IO.real[1E9*MTOps.truePixeltime]]]; Labels.Set[label: my.pixelFreq.data, value: IO.PutFR[format: "%g", v1: IO.real[1E-6*MTOps.truePixelfreq]]]; Labels.Set[label: my.MUL.data, value: IO.PutFR[format: "%g", v1: IO.card[MTOps.trueMul]]]; Labels.Set[label: my.DIV.data, value: IO.PutFR[format: "%g", v1: IO.card[MTOps.trueDiv]]]; ViewerTools.EnableUserEdits[my.hControl.data]; ViewerTools.SetContents[viewer: my.hControl.data, contents: IO.PutFR[format: "HRamMaxAddr: %g\nHBlankLeadLength: %g\nHSTrailAddr: %g\nHBTrailLength: %g", v1: IO.card[MTOps.hRamMaxAddr], v2: IO.card[MTOps.hBLeadLength], v3: IO.card[MTOps.hSTrailAddr], v4: IO.card[MTOps.hBTrailLength]]]; ViewerTools.InhibitUserEdits[my.hControl.data]; ViewerTools.EnableUserEdits[my.vControl.data]; ViewerTools.SetContents[viewer: my.vControl.data, contents: IO.PutFR[format: "VBtoVSLines: %g\nVStoVSLines: %g\nVStoVBLines: %g\nVisibleLines: %g", v1: IO.card[MTOps.vbToVS], v2: IO.card[MTOps.vsToVS], v3: IO.card[MTOps.vsToVB], v4: IO.card[MTOps.visibleLines]]]; ViewerTools.InhibitUserEdits[my.vControl.data]; }; MakeEntryViewer: PROCEDURE [handle: MTB.Handle, buttonName: Rope.ROPE, labelName: Rope.ROPE, proc: Buttons.ButtonProc, initialData: Rope.ROPE] RETURNS [ev: MTB.EntryViewer] = { ev _ NEW[MTB.EntryViewerRec]; ev.button_ Buttons.Create[ info: [ name: buttonName, wy: handle.height, -- default the width so that it will be computed for us -- wh: entryHeight, -- specify rather than defaulting so line is uniform parent: handle.container, border: FALSE ], proc: proc, clientData: handle]; -- this will be passed to our button proc ev.input _ ViewerTools.MakeNewTextViewer[ [ parent: handle.container, wx: entryTabSpace, wy: handle.height+2, ww: 12*VFonts.CharWidth['0], -- 12 digits worth of width wh: entryHeight, data: initialData, -- initial contents scrollable: FALSE, border: TRUE]]; ev.units _ Labels.Create[ [ name: labelName, wx: ev.input.wx + ev.input.ww + entryHSpace, wy: handle.height, wh: entryHeight, parent: handle.container, border: FALSE]]; handle.height _ handle.height + entryHeight+ entryVSpace; --space down for next guy }; MakeResultViewer: PROCEDURE [handle: MTB.Handle, leftLabelName, rightLabelName: Rope.ROPE, entryheight: CARDINAL _ entryHeight, entrywidth: CARDINAL _ resultWidth]RETURNS [rv: MTB.ResultViewer] = { initialData: Rope.ROPE = " ????? "; rv _ NEW[MTB.ResultViewerRec]; rv.left _ Labels.Create[ [ name: leftLabelName, wy: handle.height, -- default the width so that it will be computed for us -- wh: entryHeight, parent: handle.container, scrollable: FALSE, border: FALSE]]; rv.data _ ViewerTools.MakeNewTextViewer[ [ data: initialData, wx: entryTabSpace, wy: handle.height, ww: entrywidth, wh: entryheight, scrollable: FALSE, parent: handle.container, border: TRUE]]; rv.right _ Labels.Create[ [ name: rightLabelName, wx: rv.data.wx + rv.data.ww + entryHSpace, wy: handle.height, wh: entryHeight, parent: handle.container, scrollable: FALSE, border: FALSE]]; handle.height _ handle.height + entryheight+ entryVSpace; --space down for next guy }; UserExec.RegisterCommand[name: "MonitorTool", proc: MakeMonitorTool, briefDoc: "Create a color monitor control tool" ]; [ ] _ MakeMonitorTool[NIL, NIL]; -- and create an instance END. βMonitorToolImpl.mesa Last Edited by: Pier, May 29, 1983 3:56 pm default values for 1024X768 monitor --now create output viewers now set up default values MenuProc: TYPE = PROC [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: MouseButton _ red, shift, control: BOOL _ FALSE] ; --adds an entry viewer with a button, text viewer, and suffix label to the container --default ww --adds a result viewer with a label, text viewer, and units to the container --default ww Κ Ϋ˜J™J™*J™šΟk ˜ J˜J˜ Jšœ˜J˜J˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜J˜J˜ J˜J˜ J˜ J˜ J˜—J˜J˜Jšœœ˜Jšœœ„˜₯Jšœ˜Jšœœ˜J˜Jšœ œΟc&˜BJšœ œž'˜CJšœ œž+˜HJšœœ ž)˜JJšœ œ˜Jšœ œž˜KJ™Jšœ#™#Jšœœ ˜'Jšœœ ˜'Jšœœ˜!Jšœœ˜Jšœœ ˜!Jšœœ˜J˜J˜šΟbœœ˜1Iemphasisšœ˜Kšœ(˜(Jšœœ œœ˜&šœž˜2Jšœ ˜ šœ˜Jšœž˜)Jšœž#˜9Jšœ˜Jšœ˜—Jšœ˜šœž˜2Jšœ ˜ šœ˜Jšœ ž˜#Jšœž#˜=Jšœ˜Jšœ˜——Jšœ˜šœž˜2Jšœ ˜ šœ˜Jšœž˜'Jšœž#˜7Jšœ˜Jšœ˜——Jšœ˜J˜—šœ(žœ˜HJšœž ˜5Jšœœž5˜FJšœž˜0Jšœž˜-Jšœ œœž˜1J˜—Jšœlœ/˜žJšœnœ1˜’Jšœkœ'˜•Jšœdœ%˜ŒJšœdœ%˜ŒJšœdœ(˜J˜Jšœ2ž ˜>Jšœ‘˜‘Jšœ1ž ˜=Jšœ-˜-J˜Jšœ™Jšœi˜iJšœ_˜_Jšœg˜gJšœ^˜^Jšœh˜hJšœ`˜`JšœœR˜XJšœœQ˜WJšœ–˜–Jšœ˜˜˜J˜Jšœ™Jšœœ˜+JšœUœ˜[Jšœ2ž˜LJšœ-ž˜DJšœ˜J˜—šŸ œœ˜'J˜!Jšœ˜J˜—šŸœœ˜-JšΟnœœœ œœœœœ™BJšœ0œœ™?J™Jšœ˜Jšœœ œ ˜$Jšœœœ˜$Jšœœ˜Jšœ˜J˜šœž˜š œœ œœ2œ˜[JšœDœ˜JJšœFœ˜MJšœ ˜—š œœ œœ3œ˜\JšœDœ˜JJšœGœ˜NJšœ ˜—š œ œ œœ.œ˜\JšœDœ˜JJšœBœ˜IJšœ ˜—š œœ œœ*œ˜TJšœDœ˜JJšœ>œ˜EJšœ ˜—š œœ œœ-œ˜`JšœDœ˜JJšœAœ˜HJšœ ˜—š œœ œœ-œ˜`JšœDœ˜JJšœAœ˜HJšœ ˜—J˜Jšœ8˜8Jšœ ˜ šœ˜Jšœ˜—Jšœž˜—Jšœ˜—J˜šŸ œœ˜)Jšœ˜J˜Jšœœ œ ˜$Jšœœœ˜$Jšœœ˜Jšœ˜J˜šœž˜š œœ œœ2œ˜[JšœDœ˜JJšœFœ˜MJšœ ˜—š œœ œœ3œ˜\JšœDœ˜JJšœGœ˜NJšœ ˜—š œ œ œœ.œ˜\JšœDœ˜JJšœBœ˜IJšœ ˜—š œœ œœ*œ˜TJšœDœ˜JJšœ>œ˜EJšœ ˜—š œœ œœ-œ˜`JšœDœ˜JJšœAœ˜HJšœ ˜—š œœ œœ-œ˜`JšœDœ˜JJšœAœ˜HJšœ ˜—šœ˜Jšœ˜—Jšœž˜—J˜Jšœ8˜8J˜Jšœ-œœ˜gJšœ-œœ˜cJšœ,œœ ˜iJšœ,œœ!˜jJšœ-œœ!˜kJšœ-œœ"˜lJšœœœœ˜[Jšœœœœ˜[J˜Jšœ.˜.Jš œ=œ`œœœœ˜ŸJšœ/˜/J˜Jšœ.˜.Jš œ=œZœœœœ˜ˆJšœ/˜/Jšœ˜—J˜š œ œ œœœ.œœœ˜°J™TJšœœœ˜šœ˜šœ˜Jšœ˜Jšœ˜Jšž:˜:Jšœž4˜EJšœ˜Jšœœ˜—Jšœ ˜ Jšœž)˜>—šœ+˜+Jšœ˜Jšœ˜Jšœ˜Jšœž˜8Jšœ˜Jšœž˜&Jšœ œ˜Jšœœ˜—šœ˜Jšœ˜Jšœ,˜,Jšœ˜Jšœ ™ Jšœ˜Jšœ˜Jšœœ˜—Jšœ:ž˜SJ˜—J˜š œ œ œ-œœœœœ˜ΖJ˜J™LJšœœ˜%Jšœœœ˜šœ˜Jšœ˜Jšœ˜Jšž:˜:Jšœ˜Jšœ˜Jšœ œ˜Jšœœ˜—šœ*˜*Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ œ˜Jšœ˜Jšœœ˜—šœ˜Jšœ˜Jšœ*˜*Jšœ˜Jšœ ™ Jšœ˜Jšœ˜Jšœ œ˜Jšœœ˜—Jšœ:ž˜SJ˜J˜—šœD˜DJšœ2˜2—Kšœœœž˜:J˜J˜Jšœ˜—…—02<ο