@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
@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