@page "/robots/monitor" @attribute [Authorize] @implements IAsyncDisposable @using Microsoft.AspNetCore.Components.WebAssembly.Authentication @using RobotNet.MapShares.Dtos @using RobotNet.RobotShares.Dtos @using RobotNet.RobotShares.Enums @using RobotNet.Shares @using RobotNet.WebApp.Clients @using RobotNet.WebApp.Robots.Components.Monitoring @inject ISnackbar Snackbar @inject IHttpClientFactory HttpFactory @inject RobotHubClient RobotHub Robot Monitoring
@IsDeactiveText
@code { private MonitorMap MonitorMapRef = null!; private MonitorToolbar MonitorToolbarRef = null!; private MonitorInfomation MonitorInfomationRef = null!; private MonitorToolBarModel ToolBarModel = new() { ShowGrid = false, ShowName = true, ShowPath = true, FocusRobot = false, ShowLaser = false, ShowElement = true, }; private List Maps = []; private Guid MapIdSelected = new(); private bool IsDeactive = false; private string IsDeactiveText = "Deactive"; private RobotInfomationDto RobotSelected = new(); protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (!firstRender) return; RobotHub.MapDeactive += OnDeactive; RobotHub.UpdateChanged += OnUpdateChanged; RobotHub.ElementsStateChanged += ElementsStateChanged; await RobotHub.StartAsync(); await LoadMaps(); } private async Task LoadMaps() { try { IsDeactive = true; IsDeactiveText = "IsLoading..."; Maps.Clear(); StateHasChanged(); using var Http = HttpFactory.CreateClient("MapManagerAPI"); var maps = await Http.GetFromJsonAsync>($"api/MapsManager?txtSearch="); if (maps is null || maps.Count() == 0) { IsDeactiveText = "Map Empty"; StateHasChanged(); return; } var mapsActive = maps.Where(m => m.Active).ToList(); if (mapsActive.Count == 0) { IsDeactiveText = "Map Empty"; StateHasChanged(); return; } Maps.AddRange(mapsActive ?? []); if (Maps.Count > 0) { MonitorToolbarRef.LoadMaps(Maps, Maps[0]); await LoadMapData(Maps[0].Id); } IsDeactive = false; StateHasChanged(); } catch (AccessTokenNotAvailableException ex) { ex.Redirect(); return; } } private async Task LoadMapData(Guid Id) { try { IsDeactive = true; IsDeactiveText = "IsLoading..."; StateHasChanged(); using var Http = HttpFactory.CreateClient("MapManagerAPI"); var mapDataResult = await Http.GetFromJsonAsync>($"api/MapsData/{Id}"); if (mapDataResult is not null && mapDataResult.Data is not null) { await MonitorMapRef.LoadMap(null); await MonitorMapRef.LoadMap(mapDataResult.Data); MapIdSelected = mapDataResult.Data.Id; IsDeactive = false; if (RobotHub.IsConnected) await RobotHub.MapActive(MapIdSelected); } else IsDeactiveText = "Map Not Existed"; IsDeactive = false; StateHasChanged(); } catch { IsDeactiveText = "Map Not Existed"; StateHasChanged(); return; } } private async Task ToolbarCheckedClick(MonitorToolbarCheckedType type, bool value) { switch (type) { case MonitorToolbarCheckedType.ShowGrid: ToolBarModel.ShowGrid = value; break; case MonitorToolbarCheckedType.ShowName: ToolBarModel.ShowName = value; break; case MonitorToolbarCheckedType.ShowPath: ToolBarModel.ShowPath = value; break; case MonitorToolbarCheckedType.ShowLaser: ToolBarModel.ShowLaser = value; break; case MonitorToolbarCheckedType.ShowElement: ToolBarModel.ShowElement = value; break; case MonitorToolbarCheckedType.FocusRobot: ToolBarModel.FocusRobot = value; MonitorMapRef.FocusRobot(value); if (value) await MonitorMapRef.FocusRobotAsync(); break; } StateHasChanged(); } private void ExpandChanged(bool value) => MonitorInfomationRef.ExpandedClick(value); private async Task ButtonEventClick(MonitorToolbarButtonType type) { switch (type) { case MonitorToolbarButtonType.Fit: await MonitorMapRef.ScaleFitContentAsync(); break; case MonitorToolbarButtonType.Focus: await MonitorMapRef.FocusRobotAsync(); break; case MonitorToolbarButtonType.ZoomIn: await MonitorMapRef.ScaleZoom(0.5); break; case MonitorToolbarButtonType.ZoomOut: await MonitorMapRef.ScaleZoom(-0.5); break; } } private async Task MapChanged(MapInfoDto map) { if (map.Id != MapIdSelected) await LoadMapData(map.Id); } private void RobotChanged(RobotInfomationDto robot) { if(robot.RobotId != RobotSelected.RobotId) { RobotSelected = robot; MonitorMapRef.RobotSelectedChange(RobotSelected.RobotId); } } private bool IsUpdateing = false; private void OnUpdateChanged(IEnumerable robotInfos) { if (IsUpdateing) return; IsUpdateing = true; InvokeAsync(async () => { var robots = robotInfos.Where(r => r.MapId == MapIdSelected).ToList(); await MonitorMapRef.SetRobotPosition([.. robots]); MonitorToolbarRef.LoadRobots([.. robotInfos]); var robotSelect = robots.FirstOrDefault(r => r.RobotId == RobotSelected.RobotId); if (robotSelect is not null) MonitorInfomationRef.UpdateState(robotSelect); IsUpdateing = false; }); } private void ElementsStateChanged(IEnumerable elementsState) { _ = InvokeAsync(() => { var elements = elementsState.Where(e => e.MapId == MapIdSelected).ToList(); MonitorMapRef.ElementStateUpdated([.. elements]); }); } private void OnDeactive() { IsDeactiveText = "Deactive"; IsDeactive = true; StateHasChanged(); RobotHub.UpdateChanged -= OnUpdateChanged; RobotHub.MapDeactive -= OnDeactive; _ = RobotHub.StopAsync(); } public async ValueTask DisposeAsync() { RobotHub.MapDeactive -= OnDeactive; RobotHub.UpdateChanged -= OnUpdateChanged; await RobotHub.StopAsync(); } }