Skip to content

Commit

Permalink
Send alerts for more safe zone failures
Browse files Browse the repository at this point in the history
  • Loading branch information
andchiind committed Jan 2, 2024
1 parent fd2d0a4 commit 34a7cd4
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 76 deletions.
2 changes: 1 addition & 1 deletion backend/api/Database/Context/InitDb.cs
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ private static List<Area> GetAreas()
Name = "HB",
MapMetadata = new MapMetadata(),
DefaultLocalizationPose = new DefaultLocalizationPose(),
SafePositions = new List<SafePosition>()
SafePositions = new List<SafePosition>(new[] { new SafePosition() })
};

return new List<Area>(new[]
Expand Down
27 changes: 20 additions & 7 deletions backend/api/EventHandlers/MissionEventHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,12 +141,7 @@ private async void OnRobotAvailable(object? sender, RobotAvailableEventArgs e)
try { await ReturnToHomeService.ScheduleReturnToHomeMissionRun(robot.Id); }
catch (Exception ex) when (ex is RobotNotFoundException or AreaNotFoundException or DeckNotFoundException or PoseNotFoundException)
{
var installation = robot.CurrentInstallation;
if (installation != null)
_ = SignalRService.SendMessageAsync(
"Alert",
installation,
new AlertResponse("safezoneFailure", "Safezone failure", $"Failed to send {robot.Name} to a safezone", installation.InstallationCode, robot.Id));
ReportFailureToSignalR(robot, $"Failed to send {robot.Name} to a safe zone");
await RobotService.UpdateCurrentArea(robot.Id, null);
return;
}
Expand All @@ -169,6 +164,16 @@ private async void OnRobotAvailable(object? sender, RobotAvailableEventArgs e)
_scheduleMissionSemaphore.Release();
}

private void ReportFailureToSignalR(Robot robot, string message)
{
var installation = robot.CurrentInstallation;
if (installation != null)
_ = SignalRService.SendMessageAsync(
"Alert",
installation,
new AlertResponse("safezoneFailure", "Safezone failure", message, installation.InstallationCode, robot.Id));
}

private async void OnEmergencyButtonPressedForRobot(object? sender, EmergencyButtonPressedForRobotEventArgs e)
{
_logger.LogInformation("Triggered EmergencyButtonPressed event for robot ID: {RobotId}", e.RobotId);
Expand All @@ -183,6 +188,7 @@ private async void OnEmergencyButtonPressedForRobot(object? sender, EmergencyBut
if (area == null)
{
_logger.LogError("Could not find area with ID {AreaId}", robot.CurrentArea!.Id);
ReportFailureToSignalR(robot, $"Robot {robot.Name} was not correctly localised. Could not find area {robot.CurrentArea.Name}");
return;
}

Expand All @@ -193,6 +199,7 @@ private async void OnEmergencyButtonPressedForRobot(object? sender, EmergencyBut
catch (SafeZoneException ex)
{
_logger.LogError(ex, "Failed to schedule return to safe zone mission on robot {RobotName} because: {ErrorMessage}", robot.Name, ex.Message);
ReportFailureToSignalR(robot, $"Failed to send {robot.Name} to a safe zone");
try { await MissionScheduling.UnfreezeMissionRunQueueForRobot(e.RobotId); }
catch (RobotNotFoundException) { return; }
}
Expand All @@ -209,12 +216,14 @@ private async void OnEmergencyButtonPressedForRobot(object? sender, EmergencyBut
if (ex.IsarStatusCode != StatusCodes.Status409Conflict)
{
_logger.LogError(ex, "Failed to stop the current mission on robot {RobotName} because: {ErrorMessage}", robot.Name, ex.Message);
ReportFailureToSignalR(robot, $"Failed to stop current mission for robot {robot.Name}");
return;
}
}
catch (Exception ex)
{
const string Message = "Error in ISAR while stopping current mission, cannot drive to safe position";
ReportFailureToSignalR(robot, $"Robot {robot.Name} failed to drive to safe position");
_logger.LogError(ex, "{Message}", Message);
return;
}
Expand All @@ -233,7 +242,11 @@ private async void OnEmergencyButtonDepressedForRobot(object? sender, EmergencyB
}

var area = await AreaService.ReadById(robot.CurrentArea!.Id);
if (area == null) { _logger.LogError("Could not find area with ID {AreaId}", robot.CurrentArea!.Id); }
if (area == null)
{
_logger.LogError("Could not find area with ID {AreaId}", robot.CurrentArea!.Id);
ReportFailureToSignalR(robot, $"Robot {robot.Name} could not be sent from safe zone as it is not correctly localised");
}

try { await MissionScheduling.UnfreezeMissionRunQueueForRobot(e.RobotId); }
catch (RobotNotFoundException) { return; }
Expand Down
54 changes: 34 additions & 20 deletions frontend/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,42 @@ import { MissionFilterProvider } from 'components/Contexts/MissionFilterContext'
import { MissionsProvider } from 'components/Contexts/MissionListsContext'
import { SafeZoneProvider } from 'components/Contexts/SafeZoneContext'
import { AlertProvider } from 'components/Contexts/AlertContext'
import { InstallationProvider } from 'components/Contexts/InstallationContext'
import { AuthProvider } from 'components/Contexts/AuthProvider'
import { SignalRProvider } from 'components/Contexts/SignalRContext'
import { RobotProvider } from 'components/Contexts/RobotContext'

const App = () => (
<AlertProvider>
<SafeZoneProvider>
<MissionsProvider>
<LanguageProvider>
<MissionControlProvider>
<UnauthenticatedTemplate>
<div className="sign-in-page">
<AssetSelectionPage></AssetSelectionPage>
</div>
</UnauthenticatedTemplate>
<AuthenticatedTemplate>
<MissionFilterProvider>
<FlotillaSite />
</MissionFilterProvider>
</AuthenticatedTemplate>
</MissionControlProvider>
</LanguageProvider>
</MissionsProvider>
</SafeZoneProvider>
</AlertProvider>
<InstallationProvider>
<AuthProvider>
<SignalRProvider>
<RobotProvider>
<MissionsProvider>
<AlertProvider>
<SafeZoneProvider>
<MissionsProvider>
<LanguageProvider>
<MissionControlProvider>
<UnauthenticatedTemplate>
<div className="sign-in-page">
<AssetSelectionPage></AssetSelectionPage>
</div>
</UnauthenticatedTemplate>
<AuthenticatedTemplate>
<MissionFilterProvider>
<FlotillaSite />
</MissionFilterProvider>
</AuthenticatedTemplate>
</MissionControlProvider>
</LanguageProvider>
</MissionsProvider>
</SafeZoneProvider>
</AlertProvider>
</MissionsProvider>
</RobotProvider>
</SignalRProvider>
</AuthProvider>
</InstallationProvider>
)

export default App
10 changes: 8 additions & 2 deletions frontend/src/components/Contexts/AlertContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,12 @@ export const AlertProvider: FC<Props> = ({ children }) => {
return [...failedMissions, newFailedMission]
})
})
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [registerEvent, connectionReady, installationCode])

useEffect(() => {
if (connectionReady) {
registerEvent(SignalREventLabels.alert, (username: string, message: string) => {
const backendAlert: Alert = JSON.parse(message)
const alertType = alertTypeEnumMap[backendAlert.alertCode]
Expand All @@ -137,11 +143,11 @@ export const AlertProvider: FC<Props> = ({ children }) => {
// Here we could update the robot state manually, but this is best done on the backend
}

setAlert(alertType, <FailedSafeZoneAlertContent message={backendAlert.alertDescription} />)
setAlert(alertType, <FailedSafeZoneAlertContent message={backendAlert.alertMessage} />)
})
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [registerEvent, connectionReady, installationCode])
}, [registerEvent, connectionReady, installationCode, enabledRobots])

useEffect(() => {
if (newFailedMissions.length > 0) {
Expand Down
60 changes: 15 additions & 45 deletions frontend/src/components/Pages/FlotillaSite.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,60 +2,30 @@ import { config } from 'config'
import { BrowserRouter, Route, Routes } from 'react-router-dom'
import { FrontPage } from './FrontPage/FrontPage'
import { MissionPage } from './MissionPage/MissionPage'
import { InstallationProvider } from 'components/Contexts/InstallationContext'
import { MissionHistoryPage } from './MissionHistoryPage/MissionHistoryPage'
import { RobotPage } from './RobotPage/RobotPage'
import { AuthProvider } from 'components/Contexts/AuthProvider'
import { APIUpdater } from 'components/Contexts/APIUpdater'
import { MissionDefinitionPage } from './MissionDefinitionPage/MissionDefinitionPage'
import { AssetSelectionPage } from './AssetSelectionPage/AssetSelectionPage'
import { SignalRProvider } from 'components/Contexts/SignalRContext'
import { MissionsProvider } from 'components/Contexts/MissionListsContext'
import { RobotProvider } from 'components/Contexts/RobotContext'

export const FlotillaSite = () => {
return (
<>
<InstallationProvider>
<AuthProvider>
<SignalRProvider>
<RobotProvider>
<MissionsProvider>
<APIUpdater>
<BrowserRouter>
<Routes>
<Route
path={`${config.FRONTEND_BASE_ROUTE}/`}
element={<AssetSelectionPage />}
/>
<Route
path={`${config.FRONTEND_BASE_ROUTE}/FrontPage`}
element={<FrontPage />}
/>
<Route
path={`${config.FRONTEND_BASE_ROUTE}/mission/:missionId`}
element={<MissionPage />}
/>
<Route
path={`${config.FRONTEND_BASE_ROUTE}/mission-definition/:missionId`}
element={<MissionDefinitionPage />}
/>
<Route
path={`${config.FRONTEND_BASE_ROUTE}/history`}
element={<MissionHistoryPage />}
/>
<Route
path={`${config.FRONTEND_BASE_ROUTE}/robot/:robotId`}
element={<RobotPage />}
/>
</Routes>
</BrowserRouter>
</APIUpdater>
</MissionsProvider>
</RobotProvider>
</SignalRProvider>
</AuthProvider>
</InstallationProvider>
<APIUpdater>
<BrowserRouter>
<Routes>
<Route path={`${config.FRONTEND_BASE_ROUTE}/`} element={<AssetSelectionPage />} />
<Route path={`${config.FRONTEND_BASE_ROUTE}/FrontPage`} element={<FrontPage />} />
<Route path={`${config.FRONTEND_BASE_ROUTE}/mission/:missionId`} element={<MissionPage />} />
<Route
path={`${config.FRONTEND_BASE_ROUTE}/mission-definition/:missionId`}
element={<MissionDefinitionPage />}
/>
<Route path={`${config.FRONTEND_BASE_ROUTE}/history`} element={<MissionHistoryPage />} />
<Route path={`${config.FRONTEND_BASE_ROUTE}/robot/:robotId`} element={<RobotPage />} />
</Routes>
</BrowserRouter>
</APIUpdater>
</>
)
}
2 changes: 1 addition & 1 deletion frontend/src/models/Alert.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export interface Alert {
alertCode: string
alertName: string
alertDescription: string
alertMessage: string
robotId?: string
}

0 comments on commit 34a7cd4

Please sign in to comment.