-- Plotter.mesa, an interface for creating and maintaining -- Viewer-world plots of real values -- Last Modified On June 20, 1982 10:02 am By Paul Rovner DIRECTORY RealEvent USING[StreamHandle], RealVec USING[Handle], Rope USING[ROPE], ViewerClasses USING[Viewer]; Plotter: DEFINITIONS = { Object: TYPE; Handle: TYPE = REF Object; -- A plotter is an active object that pulls events from an -- eventSource, incorporates them in a circular buffer of -- events, and maintains a graph showing event values vs. -- event times. PointShape: TYPE = {none, filledBox, emptyBox, filledDiamond, emptyDiamond, dot, circle}; Connectivity: TYPE = {solid, dotted, dashed, dotDash, vertical}; Create: PROC [label: Rope.ROPE, eventSource: RealEvent.StreamHandle, nEvents: NAT, -- the length of the circular buffer. plotValueDifferences: BOOLEAN ← FALSE, plotValuePerSecond: BOOLEAN ← FALSE, autoRepaint: BOOLEAN ← FALSE, -- TRUE => repaint whenever a new event occurs iconic: BOOLEAN ← TRUE, connectivity: Connectivity ← solid, -- how to draw the connecting line between -- adjacent data points pointShape: PointShape ← none -- how to depict data points ] RETURNS[Handle]; -- This provides a "pull-style" plotter. CoCreate: PROC [label: Rope.ROPE, nEvents: NAT, plotValueDifferences: BOOLEAN ← FALSE, plotValuePerSecond: BOOLEAN ← FALSE, autoRepaint: BOOLEAN ← FALSE, iconic: BOOLEAN ← TRUE, connectivity: Connectivity ← solid, pointShape: PointShape ← none ] RETURNS[plotter: Handle, eventSink: RealEvent.StreamHandle]; -- This uses PORTs to provide a "push-style" alternative. Paint: PROC[self: Handle]; Destroy: PROC[self: Handle]; CreatePlotViewer: PROC [label: Rope.ROPE, verticalAxis: RealVec.Handle, horizontalAxis: RealVec.Handle ← NIL, -- default: RealVec.IndexVec[verticalAxis.length] iconic: BOOLEAN ← TRUE, connectivity: Connectivity ← solid, pointShape: PointShape ← none ] RETURNS[ViewerClasses.Viewer]; -- This low-level procedure is used by Create and CoCreate. -- The two RealVec.Object's must have the same length. -- CreatePlotViewer creates a graph of -- verticalAxis[i] vs. horizontalAxis[i] -- for i IN [0..verticalAxis.length) -- Subsequent changes to the two RealVec.Object's will be -- reflected in the graph when it is repainted -- (via ViewerOps.PaintViewer). For the purpose of connecting -- adjacent data points with lines, adjacency of values in -- verticalAxis is determined by the sort order of -- corresponding values in horizontalAxis. }.