Drawing Filter v2
The drawing filter accumulates all signals and relevant events to create visualization. This version of a drawing filter is supercedes the Drawing filter (legacy). However, not all features of the legacy filter are supported in this version and are yet to be implemented.
It uses SVG as an exchange format - the GUI needs to support SVG graphics format to properly draw it in its widgets.
The drawing filter currently supports the following views:
- Graph view - an overview plot of all signals
- CVGA - Control variability grid analysis; this visualizes every time segment as a single dot in a grid to depict the quality of glucose control
Configuration
Default_Width
(integer) - default width of the canvas, to which the renderer will draw; this can be later changed in drawing requestDefault_Height
(integer) - default height of the canvas, to which the renderer will draw; this can be later changed in drawing requestGraph_View_Filename
(string) - path to an output file for graph viewCvga_Filename
(string) - path to an output file for CVGA view
Supported interfaces
scgms::IDrawing_Filter_Inspection_v2
scgms::ILogical_Clock
General function
The drawing filter instance accumulates all events and draws a set of plots upon request. The request is usually triggered periodically by the GUI, or upon receiving a Shut_Down
device event. Once the Shut_Down
device event arrives, the filter stores the generated drawings into given output files.
This filter chooses visualization elements based on the actual signal descriptors, unlike the legacy filter, Drawing filter (legacy).
The filter maintains an internal logical clock. When a new event arrives, that would cause an update to the drawings, the logical clock increments. An external controller can determine, if a redraw is needed based on this value. The
logical clock value could be retrieved using HRESULT Logical_Clock(ULONG* clock)
method. The clock
pointer points to a current value of the clock seen by the external source. The implementation
then compares the current logical clock value to the supplied one, and outputs S_FALSE
if the clock value did not change, S_OK
if the clock value changed and also updates the referenced clock value, or
E_ILLEGAL_STATE_CHANGE
if the referenced value is greater, than the internal clock value (thus indicating an error in controller logic).
The external controller code can determine the supported plots via the HRESULT Get_Capabilities(refcnt::IVector_Container<scgms::TPlot_Descriptor>* descs)
method call. The container holds a vector of plot descriptors,
which are just a pair of GUID
and a textual description (const wchar_t*
).
For the purpose of GUI interactivity, the external controller might retrieve visualizable segments via the HRESULT Get_Available_Segments(refcnt::IVector_Container<uint64_t>* segments)
call. This call retrieves
a vector of time segment IDs, that are currently stored in the drawing filter memory and could be visualized.
The same applies to retrieving all available signals via the HRESULT Get_Available_Signals(uint64_t segment_id, refcnt::IVector_Container<GUID>* out_signals)
call. The GUI controller can retrieve a set of
signals for a given time segment. The method fills the vector of drawable signals (i.e., their respective GUIDs).
Once the GUI controller decides to perform drawing, it calls the HRESULT Draw(const GUID* plot_id, refcnt::str_container* svg, const scgms::TDraw_Options* options)
method. It requests the view identified by the
GUID stored in plot_id
parametrized by the options stored in options
container. Once the drawing is finished, it stores the resulting SVG graphics into the svg
string container.
The options container structure contains the following parameters:
segments
(array of integers) - contains an array of segment IDs to be drawn; if set tonullptr
, the filter draws all segmentssegment_count
(integer) - contains the size of thesegments
arrayin_signals
(array of GUIDs) - contains an array of signal GUIDs to be drawn; if set tonullptr
, all signals are drawnreference_signals
(array of GUIDs) - contains an array of reference signal GUIDs to the matching signals (on the same index) in thein_signals
array; this is needed for e.g., the error grid analysis and ECDF viewssignal_count
(integer) - contains the size of thein_signals
andreference_signals
arrayswidth
(integer) - requested canvas width; if set to 0, default width is usedheight
(integer) - requested canvas height; if set to 0, default height is used