public override async Task<bool> EmergencyStop(RobotStateArgs args)
        {
            await base.EmergencyStop(args);

            await args.Context.Controller.StopMotorsAll();

            return await args.Context.NextState(new ReadyState());
        }
 public override async Task<bool> Disconnect(RobotStateArgs args)
 {
     try
     {
         args.Context.Controller.Disconnect();
     }
     catch(Exception ex)
     {
         Debug.WriteLine("Disconnect Exception: " + ex.Message);
     }
     finally
     {
         await args.Context.NextState(new OfflineState());
     }
     return true;
 }
        public override async Task<bool> HandleRobotDataChange(RobotStateArgs args)
        {
            await base.HandleRobotDataChange(args);

            if (args.Context.Data.ActiveButton > 0)
            {
                RemoteButton button = (RemoteButton)args.Context.Data.ActiveButton;
                switch (button)
                {
                    case RemoteButton.RedTop:  //Emergency stop button
                        {
                            return await EmergencyStop(args);
                        }
                }
            }
            return true;
        }
 public virtual Task<bool> StartCleaning(RobotStateArgs args) { return Task.FromResult(true);; }
 public virtual Task<bool> TurnCleanerStop(RobotStateArgs args) { return Task.FromResult(true);; }
 public virtual Task<bool> TurnHeadDownStart(RobotStateArgs args) { return Task.FromResult(true);; }
 public virtual Task<bool> DriveStop(RobotStateArgs args) { return Task.FromResult(true);; }
 public virtual Task<bool> DriveBackwardStart(RobotStateArgs args) { return Task.FromResult(true);; }
 public override async Task<bool> TurnHeadDownStart(RobotStateArgs args)
 {
     await args.Context.Controller.TurnHeadDownStart();
     return true;
 }
 public virtual Task<bool> HandleUltraSonicDataChange(RobotStateArgs args) { return Task.FromResult(true); }
 public virtual Task<bool> HandleAngleChange(RobotStateArgs args) { return Task.FromResult(true); }
 public virtual Task<bool> Disconnect(RobotStateArgs args) { return Task.FromResult(true); }
 public virtual Task<bool> InitState(RobotStateArgs args) { return Task.FromResult(true); }
        public override async Task<bool> HandleRobotDataChange(RobotStateArgs args)
        {
            await base.HandleRobotDataChange(args);

            if (args.Context.Data.ActiveButton > 0)
            {
                RemoteButton button = (RemoteButton)args.Context.Data.ActiveButton;
                switch (button)
                {
                    case RemoteButton.BlueTop: 
                        {
                            return await StartCleaning(args);
                        }
                }
            }
            return true;
        }
 public override async Task<bool> StartCleaning(RobotStateArgs args)
 {
     return await args.Context.NextState(new DriveForwardState(DriveForwardState.Mode.NextTurnRight));
 }
 public override async Task<bool> TurnCleanerStop(RobotStateArgs args)
 {
     await args.Context.Controller.TurnCleanerStop();
     return true;
 }
 public virtual Task<bool> EmergencyStop(RobotStateArgs args) { return Task.FromResult(true); }
 public override async Task<bool> DriveStop(RobotStateArgs args)
 {
     await args.Context.Controller.DriveStop();
     return true;
 }