Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
78628eb
feat(companion): add EventStore auto-discovery helper
HanSur94 May 8, 2026
23ff512
fix(companion): align discover-event-store runner with sibling patter…
HanSur94 May 8, 2026
fb77912
feat(companion): EventStore constructor option with auto-discovery fa…
HanSur94 May 8, 2026
6afb89b
docs(companion): list EventStore + LivePeriod in class header
HanSur94 May 8, 2026
4b7feb2
feat(companion): fire LiveModeChanged on start/stopLiveMode
HanSur94 May 8, 2026
f18a176
feat(companion): EventGanttCanvas static helpers (rows, colors, open-…
HanSur94 May 8, 2026
eb13f25
feat(companion): EventGanttCanvas.draw renders bars + open-event dash…
HanSur94 May 8, 2026
750b3a9
feat(companion): CompanionEventViewer figure shell + close lifecycle
HanSur94 May 8, 2026
88d84d0
feat(companion): CompanionEventViewer.applyFilters pure filter pipeline
HanSur94 May 8, 2026
d5d8513
feat(companion): viewer preset + setTimeRange logic with roll/snapsho…
HanSur94 May 8, 2026
f701c57
feat(companion): viewer refresh() pulls from store, applies filter, d…
HanSur94 May 8, 2026
11507ba
feat(companion): viewer LiveModeChanged listener + auto-refresh timer
HanSur94 May 8, 2026
50c43c0
feat(companion): viewer filter bar + TimeRangeSelector slider
HanSur94 May 8, 2026
7ffcbff
feat(companion): viewer click handlers (details popup + SensorDetailP…
HanSur94 May 8, 2026
3aebd16
feat(companion): toolbar Events button + single-instance viewer wiring
HanSur94 May 8, 2026
9151173
feat(demo): wire EventStore explicitly + smoke-test viewer launch
HanSur94 May 8, 2026
1ee5ae8
feat(companion): event viewer polish (tooltips, datetime axis, slider…
HanSur94 May 8, 2026
5b0e6fb
fix(sensor-threshold): MonitorTag.fireEventsOnRisingEdges_ deduplicat…
HanSur94 May 8, 2026
5ccd39a
fix(dashboard): chip/multistatus circles stay round at any panel aspect
HanSur94 May 8, 2026
4e8384a
fix(dashboard): widget content respects the 28-px button bar at panel…
HanSur94 May 8, 2026
616021c
Merge remote-tracking branch 'origin/main' into claude/recursing-bhas…
HanSur94 May 8, 2026
4abe5d7
Revert "fix(dashboard): widget content respects the 28-px button bar …
HanSur94 May 8, 2026
9b3b155
style(dashboard): wrap LastSyncedTimeRange_ comment to satisfy mh_sty…
HanSur94 May 8, 2026
392dded
fix(companion): make discover-event-store handle-identity check Octav…
HanSur94 May 8, 2026
c2f66d5
test(monitor-tag): cover open-event branches of recompute_ dedup fix
HanSur94 May 8, 2026
dc895b0
test(dashboard): skip test_dashboard_time_sync_all_pages on Octave
HanSur94 May 8, 2026
e2fe8b7
test(dashboard): search hCellPanel for chrome buttons after WidgetCon…
HanSur94 May 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion demo/industrial_plant/private/buildCompanion.m
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@

companion = FastSenseCompanion( ...
'Dashboards', {ctx.engine}, ...
'Theme', 'light');
'Theme', 'light', ...
'EventStore', ctx.store);
end
25 changes: 13 additions & 12 deletions libs/Dashboard/ChipBarWidget.m
Original file line number Diff line number Diff line change
Expand Up @@ -88,28 +88,29 @@ function render(obj, parentPanel)
set(parentPanel, 'Units', oldUnits);
pxH = pxPos(4);

% Single axes spanning full panel
% Single axes spanning full panel.
% DataAspectRatio=[1 1 1] forces equal data units in pixels so
% circles drawn with cos/sin stay circular regardless of how
% the panel resizes. MATLAB letterboxes the axes if needed; the
% chips remain centered at their integer x-slots.
obj.hAx = axes('Parent', parentPanel, ...
'Units', 'normalized', ...
'Position', [0 0 1 1], ...
'Visible', 'off', ...
'HitTest', 'off', ...
'XLim', [0 nChips], ...
'YLim', [0 1]);
'YLim', [0 1], ...
'DataAspectRatio', [1 1 1]);
try set(obj.hAx, 'PickableParts', 'none'); catch, end
try disableDefaultInteractivity(obj.hAx); catch, end
hold(obj.hAx, 'on');

% Compute aspect ratio correction so circles don't stretch
% Axes spans [0, nChips] x [0, 1] but panel is wider than tall,
% so x-radius must be shrunk relative to y-radius.
pxW = pxPos(3);
ry = 0.22; % radius in y-axis units
if pxW > 0 && pxH > 0
rx = ry * (pxH / pxW) * nChips; % scale x-radius by panel aspect
else
rx = ry;
end
% Equal x/y radii in data units — axes DataAspectRatio handles
% the visual circularity. ry = 0.22 in y-data units (YLim=[0 1])
% gives chips of diameter 0.44 with comfortable spacing relative
% to the per-chip x-slot of width 1.
ry = 0.22;
rx = ry;
theta = linspace(0, 2*pi, 60);
chipFontSz = max(6, min(9, round(pxH * 0.18)));

Expand Down
5 changes: 4 additions & 1 deletion libs/Dashboard/DashboardEngine.m
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,10 @@
hTimeResetBtn = [] % Reset button on time panel (260508-f7p — needed for theme switch)
SliderDebounceTimer = [] % MATLAB timer for coalescing rapid slider events
TimeRangeSelector_ = [] % TimeRangeSelector handle (replaces dual sliders)
LastSyncedTimeRange_ = [] % [tStart tEnd] cache of most recent broadcast (260508-llw); used by switchPage to re-apply current synced window to widgets realized on tab-switch
% [tStart tEnd] cache of most recent broadcast (260508-llw); used by
% switchPage to re-apply the current synced window to widgets that
% get realized on tab-switch.
LastSyncedTimeRange_ = []
Progress_ = [] % DashboardProgress instance (active during render)
% Stale-data banner (shown during live mode when a widget's tMax stops advancing)
hStaleBanner = [] % uipanel overlay; hidden unless live+stale+!dismissed
Expand Down
24 changes: 9 additions & 15 deletions libs/Dashboard/MultiStatusWidget.m
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,15 @@ function render(obj, parentPanel)
% Re-layout on resize so pixel-scaled fonts/geometry stay correct.
try obj.hPanel.SizeChangedFcn = @(~,~) obj.relayout_(); catch, end
theme = obj.getTheme();
% DataAspectRatio=[1 1 1] forces equal data units in pixels so
% circles drawn with cos/sin remain circular regardless of how
% the panel resizes. MATLAB letterboxes the axes if needed.
obj.hAxes = axes('Parent', parentPanel, ...
'Units', 'normalized', ...
'Position', [0.02 0.02 0.96 0.96], ...
'Visible', 'off', ...
'XLim', [0 1], 'YLim', [0 1]);
'XLim', [0 1], 'YLim', [0 1], ...
'DataAspectRatio', [1 1 1]);
obj.refresh();
end

Expand Down Expand Up @@ -55,14 +59,9 @@ function refresh(obj)
warnColor = theme.StatusWarnColor;
alarmColor = theme.StatusAlarmColor;

% Compute aspect ratio correction for circles
oldUnits = get(obj.hPanel, 'Units');
set(obj.hPanel, 'Units', 'pixels');
pxPos = get(obj.hPanel, 'Position');
set(obj.hPanel, 'Units', oldUnits);
pxW = pxPos(3);
pxH = pxPos(4);

% Equal x/y radii — DataAspectRatio=[1 1 1] on the axes (set in
% render()) keeps the drawn ellipses perfectly circular at any
% panel aspect ratio. No pxW/pxH correction needed.
for i = 1:n
col = mod(i-1, cols);
row = floor((i-1) / cols);
Expand All @@ -72,13 +71,8 @@ function refresh(obj)

item = expandedItems{i};

% Draw indicator — aspect-ratio-corrected so circles stay round
ry = 0.3 / max(cols, rows);
if pxW > 0 && pxH > 0
rx = ry * (pxH / pxW);
else
rx = ry;
end
rx = ry;

if isstruct(item)
% Tag-first dispatch (v2.0 Tag API) — falls through to legacy
Expand Down
Loading
Loading