@page "/lidar" @using RobotNet10.RobotApp.Devices @using RobotNet10.Shared @using RobotNet10.RobotApp.Client.Shared.Devices @rendermode InteractiveServer @attribute [Authorize] @inject IDeviceProvider DeviceProvider Tim781S LiDAR Visualization

Tim781S LiDAR Visualization

Scan Frequency
@scanFrequency Hz
Points Per Scan
@pointCount
Min Range
@minRange.ToString("F2") m
Max Range
@maxRange.ToString("F2") m
Valid Points
@validPoints
@code { private IJSRuntime? JS { get; set; } private bool isConnected = false; private int scanFrequency = 0; private int pointCount = 0; private float minRange = 0.0f; private float maxRange = 0.0f; private int validPoints = 0; private ILidar? lidar; private System.Threading.Timer? updateTimer; [Inject] public required IJSRuntime JSRuntime { get; set; } protected override async Task OnInitializedAsync() { JS = JSRuntime; // Find Tim781S LiDAR device var devices = DeviceProvider.GetDevicesByType(DeviceType.Lidar).OfType(); lidar = devices.FirstOrDefault(d => (d as DeviceBase)?.DeviceId.Contains("tim781s", StringComparison.OrdinalIgnoreCase) == true); if (lidar != null) { lidar.ScanDataReceived += OnScanDataReceived; var deviceBase = lidar as DeviceBase; isConnected = deviceBase?.Status == DeviceStatus.Connected; } // Start update timer for stats updateTimer = new System.Threading.Timer(async _ => { await InvokeAsync(StateHasChanged); }, null, TimeSpan.Zero, TimeSpan.FromMilliseconds(10)); } private async void OnScanDataReceived(object? sender, LidarScanDataEventArgs e) { if (JS == null) return; var scan = e.MeasurementData; // Update stats pointCount = scan.Ranges.Length; minRange = (float)scan.RangeMin; maxRange = (float)scan.RangeMax; validPoints = scan.Ranges.Count(r => r >= scan.RangeMin && r <= scan.RangeMax); // Calculate scan frequency (simple moving average) if (lidar != null && lidar.ScanFrequencyHz.HasValue) { scanFrequency = (int)lidar.ScanFrequencyHz.Value; } // Prepare data for JavaScript visualization var points = new List(); for (int i = 0; i < scan.Ranges.Length; i++) { float angle = (float)(scan.AngleMin + (i * scan.AngleIncrement)); float range = (float)scan.Ranges[i]; // Only add valid points if (range >= scan.RangeMin && range <= scan.RangeMax) { points.Add(new { angle, range }); } } // Call JavaScript to draw try { await JS.InvokeVoidAsync("drawLidarScan", points); } catch { // Silently ignore if JS not ready } } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender && JS != null) { // Initialize canvas await JS.InvokeVoidAsync("initLidarCanvas"); } } public void Dispose() { updateTimer?.Dispose(); if (lidar != null) { lidar.ScanDataReceived -= OnScanDataReceived; } } }