@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();
}
}