Skip to content
github-actions[bot] edited this page Apr 3, 2026 · 19 revisions

FastSense Advanced Dashboard — Home Page

Welcome to FastSense Advanced Dashboard, the home page for the v1.0 milestone release. This guide introduces the five core libraries and the new features released in phases 01–08.


What Is FastSense?

FastSense is an ultra-fast MATLAB/Octave time series plotting and monitoring library optimized for 100M+ point datasets. It combines:

  • Smart downsampling (MinMax + LTTB algorithms with SIMD acceleration)
  • Interactive dashboards (responsive grid layouts, multi-page navigation, widget composition)
  • Sensor monitoring (state-dependent threshold rules, live event detection)
  • Real-time visualization (file polling, 5s live refresh, WebBridge web integration)

It requires MATLAB R2020b+ or Octave 7+ with no toolbox dependencies.


Why FastSense Exists

Plotting 10M+ points in MATLAB is traditionally slow: plot() must render every pixel, causing zoom latency, high GPU memory, and CPU spikes. FastSense solves this by:

  1. Down-sampling intelligently — reduces 10M points to ~4K visible points per zoom level
  2. Pre-computing multi-resolution pyramids — enables instant zoom-out on 50M+ datasets
  3. Updating incrementallyupdateData() re-downsamples without full rebuild
  4. Accelerating with MEX+SIMD — optional C kernels with AVX2/NEON intrinsics

Result: 4.7ms zoom cycles (212 FPS) on 10M points, 99.96% point reduction, 0.06MB GPU memory vs 153MB for plot().


Five Core Libraries

Library Purpose Key Classes
FastSense Time-series plotting with dynamic downsampling, dashboard layouts, interactive toolbar, themes FastSense, FastSenseGrid, FastSenseDock, FastSenseToolbar, FastSenseDataStore
Dashboard Widget-based dashboards with 24-column responsive grid, multi-page navigation, JSON persistence DashboardEngine, DashboardWidget, GroupWidget, FastSenseWidget, NumberWidget, GaugeWidget, StatusWidget
SensorThreshold Sensor data containers with state-dependent threshold rules, violation detection Sensor, StateChannel, ThresholdRule, SensorRegistry, ExternalSensorRegistry
EventDetection Threshold violation detection, event clustering, Gantt-style visualization, live pipelines EventDetector, IncrementalEventDetector, EventViewer, EventStore, LiveEventPipeline
WebBridge TCP server for web-based dashboards with NDJSON protocol, REST API, WebSocket support WebBridge, WebBridgeProtocol, Python FastAPI bridge

v1.0 Advanced Dashboard Features (Phases 01–08)

Phase 1: Infrastructure Hardening

  • ✅ Timer error handling (DashboardEngine.LiveTimer has ErrorFcn that keeps timer running on errors)
  • ✅ Fixed GroupWidget .m export that was dropping children
  • ✅ Unified jsondecode struct-to-cell normalization across serialization paths

Phase 2: Collapsible Sections

  • Collapsible GroupWidget — collapse/expand triggers layout reflow, reclaiming vertical space
  • Tab persistence — active tab in GroupWidget persists through save/load
  • Tab contrast validation — all 6 theme presets have sufficient tab color contrast

Phase 3: Widget Info Tooltips

  • Info icons — every widget with a non-empty Description shows an (i) icon
  • Markdown-rendered popups — clicking info icon displays description text rendered as plain text (via MarkdownRenderer)
  • Dismissible popups — close via Escape key or click outside
  • Universal coverage — all 20+ widget types inherit the feature via DashboardLayout.realizeWidget()

Phase 4: Multi-Page Navigation

  • DashboardPage model — define multiple named pages within one dashboard
  • Page navigation UI — toolbar buttons switch between pages
  • Page scoping — only active page widgets are rendered and refreshed (inactive pages hidden)
  • Persistence — page structure + active page index survive JSON save/load and .m export
  • Backward compatibility — pre-existing single-page dashboards load without errors

Phase 5: Detachable Widgets

  • Detach buttons — every widget header has a detach button for pop-out to standalone figure
  • Live sync — detached widgets receive data updates from the engine's timer (no extra timers)
  • Independent zoom — detached FastSenseWidget has UseGlobalTime=false for independent panning
  • Cleanup on close — closing a detached window removes it from the registry
  • Read-only mirrors — detached widgets don't edit the original (one-way sync)

Phase 6: Serialization & Persistence

  • Multi-page JSON round-trip — pages + active index preserved through save/load
  • Multi-page .m export — MATLAB function script exports reconstruct multi-page layouts
  • Collapsed state persistenceGroupWidget.Collapsed survives JSON round-trip
  • Detached exclusion — detached widget state not persisted (session-only)
  • Legacy JSON compatibility — pre-v1.0 single-page JSON imports without error

Phase 7: Tech Debt Cleanup

  • Multi-page time controls — time panel methods scope to active page only
  • Test label corrections — LAYOUT-05/06 requirement references fixed

Phase 8: Widget Improvements

  • DividerWidget — new horizontal separator widget for visual section breaks
  • addCollapsible() convenience API — shorthand for creating collapsible GroupWidget
  • Y-axis limitsFastSenseWidget.YLimits property for fixed or auto-scaled Y ranges

Key Features Shipped with v1.0

Dashboard Architecture

  • 24-column responsive grid — widgets auto-position with overlap resolution
  • Grid reflow — collapsing/expanding sections automatically re-compact grid
  • Multi-page layouts — organize dashboards into navigable sections with active-page filtering
  • Detachable widgets — pop any widget into a standalone monitored figure
  • Edit mode — drag-to-move, resize-to-grid, widget palette (via DashboardBuilder)
  • Theme inheritance — cascading theme override from element → tile → figure → preset

Widget Types (8 Built-In)

  1. FastSenseWidget — time-series plots with thresholds, violation markers, zoom/pan
  2. NumberWidget — large formatted value with trend (up/flat/down) and units
  3. GaugeWidget — arc/donut/bar/thermometer styles with auto-scaled ranges
  4. StatusWidget — color-coded status dot (ok/warn/alarm) with label
  5. TextWidget — static text/labels for section headers
  6. TableWidget — tabular data from sensors or callbacks
  7. RawAxesWidget — custom MATLAB plots via user-supplied PlotFcn
  8. EventTimelineWidget — Gantt-style event bar timeline with optional sensor overlay

Data Binding

  • Sensor-first model — widgets automatically derive value, units, range, colors from bound Sensor
  • State-dependent thresholds — rules activate/deactivate based on system state channels
  • Violation tracking — threshold crossings pre-computed and cached per sensor
  • Event detection — violations clustered into events with statistics (peak, duration, mean, RMS)

Live Mode

  • File polling — dashboard auto-refreshes from live .mat files at configurable intervals
  • View modes — preserve (fixed viewport), follow (scroll to new data), reset (auto-scale)
  • Incremental updates — only changed widgets refresh (dirty-flag optimization)
  • Multi-sensor sync — all sensors update on single timer tick (no drift)

Serialization

  • JSON format — compact config with widget definitions, sensor bindings, page structure
  • MATLAB export — pure .m function scripts that reconstruct dashboards programmatically
  • Round-trip fidelity — save/load and .m export preserve all properties, state, relationships
  • Backward compat — pre-v1.0 configurations load without errors (warnings on unknown fields)

Quick-Start Example

%% Install FastSense
install;

%% Create a dashboard with multiple pages
d = DashboardEngine('Name', 'Motor Health Monitor', 'Theme', 'dark');

%% Page 1: Overview
d.addPage('Overview');

% Create sensors with state-dependent thresholds
motor_rpm = Sensor('rpm', 'X', (0:1000)', 'Y', randi([500 3500], 1, 1001), 'Units', 'RPM');
motor_rpm.addThresholdRule(struct(), 2500, 'upper', 'Label', 'Max Speed');
motor_rpm.resolve();

% Add widgets to Overview page
d.addWidget('fastsense', 'Title', 'Motor RPM', 'Sensor', motor_rpm, 'Position', [1, 1, 12, 3]);
d.addWidget('number', 'Title', 'Current', 'ValueFcn', @() motor_rpm.Y(end), 'Position', [13, 1, 6, 1]);

%% Page 2: Diagnostics
d.addPage('Diagnostics');

% Add detailed analysis widgets
d.addWidget('gauge', 'Title', 'Speed %', 'ValueFcn', @() 100*motor_rpm.Y(end)/3500, ...
    'Range', [0 100], 'Position', [1, 1, 6, 2]);

%% Render and display
d.render();

%% Save for later
d.save('motor_dashboard.json');

%% Load from file
d2 = DashboardEngine.load('motor_dashboard.json');

Navigation

Getting Started

  • Installation — setup instructions and MEX compilation
  • Getting Started — step-by-step tutorials (basic plots, dashboards, sensors, live mode)

Feature Guides

Internals & Performance

API Reference

Examples & Use Cases


Technology Stack

Component Stack
Core MATLAB R2020b+ / Octave 7+ (pure MATLAB)
Rendering Native MATLAB figure/uipanel/uicontrol (no App Designer, no toolboxes)
Acceleration Optional C MEX with SIMD (AVX2 x86_64, NEON ARM64)
Data SQLite3 (bundled) for disk-backed storage
Web Python FastAPI + JavaScript uPlot for WebBridge (optional)

Support

  • GitHub Issues — bug reports, feature requests
  • Discussions — Q&A, usage patterns, performance tuning
  • Wiki — reference documentation, guides, examples

Clone this wiki locally