Exemplo n.º 1
0
 /// <summary>
 /// DriveDistance Initialization Constructor
 /// </summary>
 /// <param name="body"></param>
 public DriveDistance(DriveDistanceRequest body)
 {
     Body = body;
 }
Exemplo n.º 2
0
        public void DriveDistanceHandler(diffdrive.DriveDistance driveDistance)
        {
            if (this.driveEntity == null)
            {
                throw new InvalidOperationException("Simulation entity not registered with service");
            }

            if (!this.state.DriveState.IsEnabled)
            {
                driveDistance.ResponsePort.Post(Fault.FromException(new Exception("Drive is not enabled.")));
                LogError("DriveDistance request to disabled drive.");
                return;
            }

            if ((driveDistance.Body.Power > 1.0f) || (driveDistance.Body.Power < -1.0f))
            {
                // invalid drive power
                driveDistance.ResponsePort.Post(Fault.FromException(new Exception("Invalid Power parameter.")));
                LogError("Invalid Power parameter in DriveDistanceHandler.");
                return;
            }

            this.state.DriveState.DriveDistanceStage = driveDistance.Body.DriveDistanceStage;
            if (driveDistance.Body.DriveDistanceStage == diffdrive.DriveStage.InitialRequest)
            {
                var entityResponse = new Port <engine.OperationResult>();
                Activate(
                    Arbiter.Receive(
                        false,
                        entityResponse,
                        result =>
                {
                    // post a message to ourselves indicating that the drive distance has completed
                    var req = new diffdrive.DriveDistanceRequest(0, 0);
                    switch (result)
                    {
                    case engine.OperationResult.Error:
                        req.DriveDistanceStage = diffdrive.DriveStage.Canceled;
                        break;

                    case engine.OperationResult.Canceled:
                        req.DriveDistanceStage = diffdrive.DriveStage.Canceled;
                        break;

                    case engine.OperationResult.Completed:
                        req.DriveDistanceStage = diffdrive.DriveStage.Completed;
                        break;
                    }

                    this.drivePort.Post(new diffdrive.DriveDistance(req));
                }));

                this.driveEntity.DriveDistance(
                    (float)driveDistance.Body.Distance, (float)driveDistance.Body.Power, entityResponse);

                var req2 = new diffdrive.DriveDistanceRequest(0, 0)
                {
                    DriveDistanceStage = diffdrive.DriveStage.Started
                };
                this.drivePort.Post(new diffdrive.DriveDistance(req2));
            }
            else
            {
                SendNotification(this.subMgrPort, driveDistance);
            }

            driveDistance.ResponsePort.Post(DefaultUpdateResponseType.Instance);
        }