RobotApp/RobotApp/Services/Robot/RobotControllerInitialize.cs
Đăng Nguyễn 73038de662 update
2025-11-04 10:57:41 +07:00

121 lines
4.4 KiB
C#

using RobotApp.Common.Shares.Enums;
using RobotApp.Interfaces;
namespace RobotApp.Services.Robot;
public partial class RobotController
{
private readonly AutoResetEvent StartButtonPressedEvent = new(false);
private readonly AutoResetEvent StopButtonPressedEvent = new(false);
private readonly AutoResetEvent ResetButtonPressedEvent = new(false);
private async Task InitializationingHandler(CancellationToken cancellationToken)
{
try
{
StateManager.InitializeHierarchyStates();
PeripheralManager.SetSytemState(SystemState.INIT);
PeripheralManager.OnPeripheralModeChanged += SwichModeChanged;
PeripheralManager.OnButtonPressed += OnButtonPressed;
PeripheralManager.OnStop += OnStop;
while (!cancellationToken.IsCancellationRequested)
{
if (StateManager.CurrentStateName == Enum.GetName(SystemStateType.Initializing))
{
if (PeripheralManager.IsReady &&
PeripheralManager.LiftMotorReady &&
PeripheralManager.LeftMotorReady &&
PeripheralManager.RightMotorReady &&
BatteryManager.IsReady &&
Localization.IsReady &&
NavigationManager.IsReady &&
RobotConfiguration.IsReady
) break;
}
await Task.Delay(1000, cancellationToken);
}
Logger.Info("Robot đã khởi tạo xong. Đang kết nối tới Fleet Manager.");
ConnectionManager.OrderUpdated += NewOrderUpdated;
ConnectionManager.ActionUpdated += NewInstantActionUpdated;
await ConnectionManager.StartConnection(cancellationToken);
Logger.Info("Robot đã kết nối tới Fleet Manager.");
StateManager.TransitionTo(SystemStateType.Standby);
if (!RobotConfiguration.IsSimulation)
{
StartButtonPressedEvent.Reset();
Logger.Info("Chờ nút Start được nhấn để vào chế độ hoạt động...");
if (StartButtonPressedEvent.WaitOne())
{
StateManager.TransitionTo(RootStateType.Auto);
PeripheralManager.SetSytemState(SystemState.IDLE);
}
}
else StateManager.TransitionTo(RootStateType.Auto);
}
catch (Exception ex)
{
Logger.Error($"Khởi tạo RobotController xảy ra lỗi: {ex.Message} - {ex.StackTrace}");
}
}
private void StopHandler()
{
var stopConnection = ConnectionManager.StopConnection();
stopConnection.Wait();
PeripheralManager.OnPeripheralModeChanged -= SwichModeChanged;
PeripheralManager.OnButtonPressed -= OnButtonPressed;
PeripheralManager.OnStop -= OnStop;
}
private void SwichModeChanged(PeripheralMode mode)
{
switch (mode)
{
case PeripheralMode.AUTOMATIC:
if (StartButtonPressedEvent.WaitOne())
{
StateManager.TransitionTo(RootStateType.Auto);
PeripheralManager.SetSytemState(SystemState.IDLE);
}
break;
case PeripheralMode.MANUAL:
StateManager.TransitionTo(RootStateType.Manual);
PeripheralManager.SetSytemState(SystemState.NONE);
break;
case PeripheralMode.SERVICE:
StateManager.TransitionTo(RootStateType.Service);
PeripheralManager.SetSytemState(SystemState.NONE);
break;
default:
break;
}
}
private void OnButtonPressed(PeripheralButton buttonPressed)
{
switch(buttonPressed)
{
case PeripheralButton.Start:
StartButtonPressedEvent.Set();
break;
case PeripheralButton.Reset:
ResetButtonPressedEvent.Set();
break;
case PeripheralButton.Stop:
StopButtonPressedEvent.Set();
break;
default:
break;
}
}
private void OnStop(StopStateType state)
{
StateManager.TransitionToStop(state);
PeripheralManager.SetSytemState(SystemState.PAUSED);
}
}