From 724aa78ff2e2d352c572563bf0b70be84a1b1a0a Mon Sep 17 00:00:00 2001 From: andchiind Date: Fri, 17 Jan 2025 11:54:22 +0100 Subject: [PATCH] Move create return home to starting mission --- .../api/Controllers/ReturnToHomeController.cs | 2 +- backend/api/Controllers/RobotController.cs | 2 +- backend/api/Services/MissionRunService.cs | 33 ++--- .../api/Services/MissionSchedulingService.cs | 119 ++++++------------ backend/api/Services/ReturnToHomeService.cs | 13 +- 5 files changed, 51 insertions(+), 118 deletions(-) diff --git a/backend/api/Controllers/ReturnToHomeController.cs b/backend/api/Controllers/ReturnToHomeController.cs index c2ae9472..368d38fe 100644 --- a/backend/api/Controllers/ReturnToHomeController.cs +++ b/backend/api/Controllers/ReturnToHomeController.cs @@ -36,7 +36,7 @@ [FromRoute] string robotId } var returnToHomeMission = - await returnToHomeService.ScheduleReturnToHomeMissionRunIfNotAlreadyScheduledOrRobotIsHome( + await returnToHomeService.ScheduleReturnToHomeMissionRunIfNotAlreadyScheduled( robot.Id ); if (returnToHomeMission is null) diff --git a/backend/api/Controllers/RobotController.cs b/backend/api/Controllers/RobotController.cs index dcc3c9b2..be56e05b 100644 --- a/backend/api/Controllers/RobotController.cs +++ b/backend/api/Controllers/RobotController.cs @@ -670,7 +670,7 @@ public async Task ResetRobot([FromRoute] string robotId) try { - await missionSchedulingService.AbortAllScheduledMissions( + await missionSchedulingService.AbortAllScheduledNormalMissions( robot.Id, "Aborted: Robot was reset" ); diff --git a/backend/api/Services/MissionRunService.cs b/backend/api/Services/MissionRunService.cs index c3d78b6d..40ed2a53 100644 --- a/backend/api/Services/MissionRunService.cs +++ b/backend/api/Services/MissionRunService.cs @@ -28,19 +28,14 @@ public Task> ReadAll( public Task ReadByIsarMissionId(string isarMissionId, bool readOnly = true); - public Task> ReadMissionRunQueue(string robotId, bool readOnly = true); + public Task> ReadMissionRunQueue(string robotId, MissionRunType type = MissionRunType.Normal, bool readOnly = true); public Task ReadNextScheduledRunByMissionId( string missionId, bool readOnly = true ); - public Task ReadNextScheduledMissionRun(string robotId, bool readOnly = true); - - public Task ReadNextScheduledEmergencyMissionRun( - string robotId, - bool readOnly = true - ); + public Task ReadNextScheduledMissionRun(string robotId, MissionRunType type = MissionRunType.Normal, bool readOnly = true); public Task> ReadMissionRuns( string robotId, @@ -188,12 +183,13 @@ public async Task> ReadAll( public async Task> ReadMissionRunQueue( string robotId, + MissionRunType type = MissionRunType.Normal, bool readOnly = true ) { return await GetMissionRunsWithSubModels(readOnly: readOnly) .Where(missionRun => - missionRun.Robot.Id == robotId && missionRun.Status == MissionStatus.Pending + missionRun.Robot.Id == robotId && missionRun.Status == MissionStatus.Pending && missionRun.MissionRunType == type ) .OrderBy(missionRun => missionRun.DesiredStartTime) .ToListAsync(); @@ -201,27 +197,14 @@ public async Task> ReadMissionRunQueue( public async Task ReadNextScheduledMissionRun( string robotId, + MissionRunType type = MissionRunType.Normal, bool readOnly = true ) { return await GetMissionRunsWithSubModels(readOnly: readOnly) .OrderBy(missionRun => missionRun.DesiredStartTime) .FirstOrDefaultAsync(missionRun => - missionRun.Robot.Id == robotId && missionRun.Status == MissionStatus.Pending - ); - } - - public async Task ReadNextScheduledEmergencyMissionRun( - string robotId, - bool readOnly = true - ) - { - return await GetMissionRunsWithSubModels(readOnly: readOnly) - .OrderBy(missionRun => missionRun.DesiredStartTime) - .FirstOrDefaultAsync(missionRun => - missionRun.Robot.Id == robotId - && missionRun.MissionRunType == MissionRunType.Emergency - && missionRun.Status == MissionStatus.Pending + missionRun.Robot.Id == robotId && missionRun.Status == MissionStatus.Pending && missionRun.MissionRunType == type ); } @@ -273,8 +256,8 @@ public async Task> ReadMissionRuns( public async Task PendingOrOngoingReturnToHomeMissionRunExists(string robotId) { - var pendingMissionRuns = await ReadMissionRunQueue(robotId, readOnly: true); - if (pendingMissionRuns.Any((m) => m.IsReturnHomeMission())) + var pendingMissionRuns = await ReadNextScheduledMissionRun(robotId, type: MissionRunType.ReturnHome, readOnly: true); + if (pendingMissionRuns != null) return true; var ongoingMissionRuns = await GetMissionRunsWithSubModels(readOnly: true) diff --git a/backend/api/Services/MissionSchedulingService.cs b/backend/api/Services/MissionSchedulingService.cs index 17ffd9bf..a92ca52c 100644 --- a/backend/api/Services/MissionSchedulingService.cs +++ b/backend/api/Services/MissionSchedulingService.cs @@ -17,7 +17,7 @@ public interface IMissionSchedulingService public Task StopCurrentMissionRun(string robotId); - public Task AbortAllScheduledMissions(string robotId, string? abortReason = null); + public Task AbortAllScheduledNormalMissions(string robotId, string? abortReason = null); public Task ScheduleMissionToDriveToDockPosition(string robotId); @@ -61,9 +61,11 @@ public async Task StartNextMissionRunIfSystemIsAvailable(Robot robot) return; } + if (missionRun == null) + return; + if ( robot.MissionQueueFrozen - && missionRun != null && !(missionRun.IsEmergencyMission() || missionRun.IsReturnHomeMission()) ) { @@ -74,44 +76,6 @@ public async Task StartNextMissionRunIfSystemIsAvailable(Robot robot) return; } - if (missionRun == null) - { - logger.LogInformation( - "The robot was ready to start mission, but no mission is scheduled" - ); - - if ( - robot.RobotCapabilities != null - && robot.RobotCapabilities.Contains(RobotCapabilitiesEnum.return_to_home) - ) - { - try - { - missionRun = - await returnToHomeService.ScheduleReturnToHomeMissionRunIfNotAlreadyScheduledOrRobotIsHome( - robot.Id - ); - } - catch (ReturnToHomeMissionFailedToScheduleException) - { - signalRService.ReportGeneralFailToSignalR( - robot, - $"Failed to schedule return home for robot {robot.Name}", - "" - ); - logger.LogError( - "Failed to schedule a return home mission for robot {RobotId}", - robot.Id - ); - } - } - } - - if (missionRun == null) - { - return; - } - if (!TheSystemIsAvailableToRunAMission(robot, missionRun)) { logger.LogInformation( @@ -151,7 +115,7 @@ await robotService.UpdateCurrentInspectionArea( ); try { - await AbortAllScheduledMissions( + await AbortAllScheduledNormalMissions( robot.Id, "Aborted: Robot was at different inspection area" ); @@ -164,19 +128,6 @@ await AbortAllScheduledMissions( ); } - try - { - await returnToHomeService.ScheduleReturnToHomeMissionRunIfNotAlreadyScheduledOrRobotIsHome( - robot.Id - ); - } - catch (ReturnToHomeMissionFailedToScheduleException) - { - logger.LogError( - "Failed to schedule a return home mission for robot {RobotId}", - robot.Id - ); - } return; } @@ -185,11 +136,8 @@ await returnToHomeService.ScheduleReturnToHomeMissionRunIfNotAlreadyScheduledOrR && !(missionRun.IsReturnHomeMission() || missionRun.IsEmergencyMission()) ) { - missionRun = await HandleBatteryAndPressureLevel(robot); - if (missionRun == null) - { - return; - } + await HandleBatteryAndPressureLevel(robot); + return; } try @@ -219,7 +167,7 @@ await missionRunService.SetMissionRunToFailed( catch (RobotBusyException) { } } - public async Task HandleBatteryAndPressureLevel(Robot robot) + public async Task HandleBatteryAndPressureLevel(Robot robot) { if (robot.IsRobotPressureTooLow()) { @@ -248,7 +196,7 @@ await missionRunService.SetMissionRunToFailed( try { - await AbortAllScheduledMissions( + await AbortAllScheduledNormalMissions( robot.Id, "Aborted: Robot pressure or battery values are too low." ); @@ -257,24 +205,6 @@ await AbortAllScheduledMissions( { logger.LogError("Failed to abort scheduled missions for robot {RobotId}", robot.Id); } - - MissionRun? missionRun; - try - { - missionRun = - await returnToHomeService.ScheduleReturnToHomeMissionRunIfNotAlreadyScheduledOrRobotIsHome( - robot.Id - ); - } - catch (ReturnToHomeMissionFailedToScheduleException) - { - logger.LogError( - "Failed to schedule a return home mission for robot {RobotId}", - robot.Id - ); - return null; - } - return missionRun; } public async Task OngoingMission(string robotId) @@ -358,7 +288,7 @@ public async Task StopCurrentMissionRun(string robotId) catch (RobotNotFoundException) { } } - public async Task AbortAllScheduledMissions(string robotId, string? abortReason) + public async Task AbortAllScheduledNormalMissions(string robotId, string? abortReason) { var robot = await robotService.ReadById(robotId, readOnly: true); if (robot == null) @@ -370,6 +300,7 @@ public async Task AbortAllScheduledMissions(string robotId, string? abortReason) var pendingMissionRuns = await missionRunService.ReadMissionRunQueue( robotId, + type: MissionRunType.Normal, readOnly: true ); if (pendingMissionRuns is null) @@ -472,17 +403,24 @@ public void TriggerRobotAvailable(RobotAvailableEventArgs e) private async Task SelectNextMissionRun(Robot robot) { - var missionRun = await missionRunService.ReadNextScheduledEmergencyMissionRun( + var missionRun = await missionRunService.ReadNextScheduledMissionRun( robot.Id, + type: MissionRunType.Emergency, readOnly: true ); if (robot.MissionQueueFrozen == false && missionRun == null) { missionRun = await missionRunService.ReadNextScheduledMissionRun( robot.Id, + type: MissionRunType.Normal, readOnly: true ); } + missionRun ??= await missionRunService.ReadNextScheduledMissionRun( + robot.Id, + type: MissionRunType.ReturnHome, + readOnly: true + ); return missionRun; } @@ -587,6 +525,25 @@ private async Task StartMissionRun(MissionRun queuedMissionRun, Robot robot) throw new IsarCommunicationException(ErrorMessage); } + try + { + await returnToHomeService.ScheduleReturnToHomeMissionRunIfNotAlreadyScheduled( + robot.Id + ); + } + catch (ReturnToHomeMissionFailedToScheduleException) + { + signalRService.ReportGeneralFailToSignalR( + robot, + $"Failed to schedule return home for robot {robot.Name}", + "" + ); + logger.LogError( + "Failed to schedule a return home mission for robot {RobotId}", + robot.Id + ); + } + await missionRunService.UpdateWithIsarInfo(missionRun.Id, isarMission); await missionRunService.UpdateMissionRunProperty( missionRun.Id, diff --git a/backend/api/Services/ReturnToHomeService.cs b/backend/api/Services/ReturnToHomeService.cs index 1b8707ee..f830ebaf 100644 --- a/backend/api/Services/ReturnToHomeService.cs +++ b/backend/api/Services/ReturnToHomeService.cs @@ -5,7 +5,7 @@ namespace Api.Services { public interface IReturnToHomeService { - public Task ScheduleReturnToHomeMissionRunIfNotAlreadyScheduledOrRobotIsHome( + public Task ScheduleReturnToHomeMissionRunIfNotAlreadyScheduled( string robotId ); public Task GetActiveReturnToHomeMissionRun( @@ -20,7 +20,7 @@ public class ReturnToHomeService( IMissionRunService missionRunService ) : IReturnToHomeService { - public async Task ScheduleReturnToHomeMissionRunIfNotAlreadyScheduledOrRobotIsHome( + public async Task ScheduleReturnToHomeMissionRunIfNotAlreadyScheduled( string robotId ) { @@ -28,15 +28,8 @@ string robotId "Scheduling return home mission if not already scheduled or the robot is home for robot {RobotId}", robotId ); - var lastMissionRun = await missionRunService.ReadLastExecutedMissionRunByRobot(robotId); - if ( - await IsReturnToHomeMissionAlreadyScheduled(robotId) - || ( - lastMissionRun != null - && (lastMissionRun.IsReturnHomeMission() || lastMissionRun.IsEmergencyMission()) - ) - ) + if (await IsReturnToHomeMissionAlreadyScheduled(robotId)) { logger.LogInformation( "ReturnToHomeMission is already scheduled for Robot {RobotId}",