@implements IAsyncDisposable @using MudBlazor @using Microsoft.AspNetCore.SignalR.Client @using RobotNet10.RobotApp.Client.Clients @using RobotNet10.RobotApp.Client.Shared.Devices @inject CameraQrHubClient CameraQrHubClient @inject ISnackbar Snackbar @DeviceName @DeviceId Camera Frame
@(CameraQrData.IsConnected ? "Connected" : "Disconnected") Detection Status @if (CameraQrData.Codes is { Count: > 0 }) { Code X (m) Y (m) Z (m) Yaw (deg) Time @kv.Key @kv.Value.Pose.Position.X.ToString("F3") @kv.Value.Pose.Position.Y.ToString("F3") @kv.Value.Pose.Position.Z.ToString("F3") @kv.Value.Pose.Orientation.ToYawDegrees().ToString("F1") @kv.Value.Header.Stamp.ToLocalTime().ToString("HH:mm:ss") Total: @CameraQrData.Codes.Count code(s) } else { No QR detected. }
@code { [Parameter, EditorRequired] public string DeviceId { get; set; } = string.Empty; private string DeviceName { get; set; } = string.Empty; private CameraQrDataDto CameraQrData = new(); private bool IsLoading => !CameraQrHubClient.IsConnected; private bool IsReloading = false; protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender && !string.IsNullOrEmpty(DeviceId)) { await ConnectAsync(); } await base.OnAfterRenderAsync(firstRender); } private async Task ConnectAsync() { try { await CameraQrHubClient.StartAsync(); // Lấy DeviceName từ CameraQrHub var deviceInfo = await CameraQrHubClient.GetDeviceInfoAsync(DeviceId); if (deviceInfo != null) { DeviceName = deviceInfo.DeviceName; } else { DeviceName = DeviceId; // Fallback to DeviceId if not found } CameraQrData = await CameraQrHubClient.GetCameraQrDataAsync(DeviceId); StateHasChanged(); } catch (Exception ex) { Snackbar.Add($"Failed to connect: {ex.Message}", Severity.Error); } } private async Task DisconnectAsync() { try { await CameraQrHubClient.StopAsync(); CameraQrData = new CameraQrDataDto(); // Reset về giá trị mặc định StateHasChanged(); } catch (Exception ex) { Snackbar.Add($"Failed to disconnect: {ex.Message}", Severity.Error); } } private async Task ReloadCameraQrDataAsync() { if (!CameraQrHubClient.IsConnected || IsReloading) return; try { IsReloading = true; StateHasChanged(); CameraQrData = await CameraQrHubClient.GetCameraQrDataAsync(DeviceId); } catch (Exception ex) { Snackbar.Add($"Failed to reload Camera QR data: {ex.Message}", Severity.Error); } finally { IsReloading = false; StateHasChanged(); } } private Color GetConfidenceColor(double confidence) { if (confidence >= 0.9) { return Color.Success; } else if (confidence >= 0.7) { return Color.Info; } else if (confidence >= 0.5) { return Color.Warning; } else { return Color.Error; } } public async ValueTask DisposeAsync() { await DisconnectAsync(); } }