///////////////////////////////////////////////////////////////////
            // __use__.snippet0.snippet.noop - [(__use__.snippet0.snippet.expr1 - __use__.snippet0.snippet.join)(__use__.snippet0.snippet.expr0 - &__use__.snippet0.snippet.join)(__use__.snippet0.snippet.expr - &__use__.snippet0.snippet.join)] - __use__.snippet0.call - __use__.snippet0.call.iftype
            ///////////////////////////////////////////////////////////////////

            public IEnumerator <ccr.ITask> RunHandler(RotateRequest message, dssp.DsspResponsePort <RotateResponse> responsePort)
            {
                _responsePort = responsePort;
                Increment();

                drive.RotateDegreesRequest request = new drive.RotateDegreesRequest();
                request.RotateDegreesStage = Microsoft.Robotics.Services.Drive.Proxy.DriveStage.InitialRequest;
                request.Power   = message.Power;
                request.Degrees = message.Degrees;

                Increment();
                Activate(
                    ccr.Arbiter.Choice(
                        GenericDifferentialDrivePort.RotateDegrees(request),
                        OnRotateDegreesSuccess,
                        delegate(soap.Fault fault)
                {
                    base.FaultHandler(fault, @"GenericDifferentialDrivePort.RotateDegrees(request)");
                    Decrement();
                }
                        )
                    );

                Decrement();

                yield return(WaitUntilComplete());
            }
Beispiel #2
0
        /// <summary>
        /// Turns the drive relative to its current heading.
        /// </summary>
        /// <param name="angle">angle in degrees</param>
        /// <returns>response port</returns>
        PortSet <DefaultUpdateResponseType, Fault> Turn(int angle)
        {
            if (_state.DriveState == null || !_state.DriveState.IsEnabled)
            {
                EnableMotor();
            }

            drive.RotateDegreesRequest request = new drive.RotateDegreesRequest();
            request.Degrees = (double)(-angle);

            return(_drivePort.RotateDegrees(request));
        }
        public IEnumerator <ITask> RotateHandler(diffdrive.RotateDegrees rotate)
        {
            if (_entity == null)
            {
                throw new InvalidOperationException("Simulation entity not registered with service");
            }

            if (!_state.IsEnabled)
            {
                rotate.ResponsePort.Post(Fault.FromException(new Exception("Drive is not enabled.")));
                LogError("RotateDegrees request to disabled drive.");
                yield break;
            }

            _state.RotateDegreesStage = rotate.Body.RotateDegreesStage;
            if (rotate.Body.RotateDegreesStage == diffdrive.DriveStage.InitialRequest)
            {
                Port <simengine.OperationResult> entityResponse = new Port <simengine.OperationResult>();
                Activate(Arbiter.Receive <simengine.OperationResult>(false, entityResponse, delegate(simengine.OperationResult result)
                {
                    // post a message to ourselves indicating that the drive distance has completed
                    diffdrive.RotateDegreesRequest req = new diffdrive.RotateDegreesRequest(0, 0);
                    switch (result)
                    {
                    case simengine.OperationResult.Error:
                        req.RotateDegreesStage = diffdrive.DriveStage.Canceled;
                        break;

                    case simengine.OperationResult.Canceled:
                        req.RotateDegreesStage = diffdrive.DriveStage.Canceled;
                        break;

                    case simengine.OperationResult.Completed:
                        req.RotateDegreesStage = diffdrive.DriveStage.Completed;
                        break;
                    }
                    _mainPort.Post(new diffdrive.RotateDegrees(req));
                }));

                _entity.RotateDegrees((float)rotate.Body.Degrees, (float)rotate.Body.Power, entityResponse);

                diffdrive.RotateDegreesRequest req2 = new diffdrive.RotateDegreesRequest(0, 0);
                req2.RotateDegreesStage = diffdrive.DriveStage.Started;
                _mainPort.Post(new diffdrive.RotateDegrees(req2));
            }
            else
            {
                base.SendNotification(_subMgrPort, rotate);
            }
            rotate.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            yield break;
        }
Beispiel #4
0
        /// <summary>
        /// Handle Motion Commands
        /// </summary>
        /// <param name="onCommand">The motion command</param>
        /// <returns>An Iterator</returns>
        private IEnumerator <ITask> OnMotionCommandHandler(OnMotionCommand onCommand)
        {
            if (onCommand.DashboardForm == this.dashboardForm && this.drivePort != null)
            {
                switch (onCommand.Command)
                {
                case MOTIONCOMMANDS.Rotate:

                    var rotRequest = new drive.RotateDegreesRequest
                    {
                        Degrees = onCommand.Parameter, Power = onCommand.Power * MotorPowerSaleFactor
                    };

                    yield return(Arbiter.Choice(this.drivePort.RotateDegrees(rotRequest), EmptyHandler, LogError));

                    break;

                case MOTIONCOMMANDS.Translate:
                    var transRequest = new drive.DriveDistanceRequest
                    {
                        Distance = onCommand.Parameter, Power = onCommand.Power * MotorPowerSaleFactor
                    };

                    yield return(Arbiter.Choice(this.drivePort.DriveDistance(transRequest), EmptyHandler, LogError));

                    break;

                case MOTIONCOMMANDS.Enable:
                    var request = new drive.EnableDriveRequest {
                        Enable = true
                    };

                    yield return(Arbiter.Choice(this.drivePort.EnableDrive(request), EmptyHandler, LogError));

                    break;

                default:
                    LogInfo("Requesting EStop");
                    var stopRequest = new drive.AllStopRequest();

                    yield return(Arbiter.Choice(this.drivePort.AllStop(stopRequest), EmptyHandler, LogError));

                    break;
                }
            }

            yield break;
        }
Beispiel #5
0
        /// <summary>
        /// Turns the drive relative to its current heading.
        /// </summary>
        /// <param name="angle">angle in degrees</param>
        /// <returns>response port</returns>
        PortSet<DefaultUpdateResponseType, Fault> Turn(int angle)
        {
            if (_state.DriveState == null || !_state.DriveState.IsEnabled)
            {
                EnableMotor();
            }

            drive.RotateDegreesRequest request = new drive.RotateDegreesRequest();
            request.Degrees = (double)(-angle);

            return _drivePort.RotateDegrees(request);
        }
        IEnumerator<ITask> OnRotateHandler(OnRotate onRotate)
        {
            if (onRotate.DriveControl == _driveControl && _drivePort != null)
            {
                drive.RotateDegreesRequest request = new drive.RotateDegreesRequest();
                request.Degrees = onRotate.Angle;
                request.Power = (double)onRotate.Power * MOTOR_POWER_SCALE_FACTOR;

                yield return Arbiter.Choice(
                    _drivePort.RotateDegrees(request),
                    delegate(DefaultUpdateResponseType response) { },
                    delegate(Fault f)
                    {
                        LogError(f);
                    }
                );
            }
        }
        /// <summary>
        /// Notified subscribers a success or fault to completed Drive request.
        /// </summary>
        /// <param name="driveDistance"></param>
        /// <param name="success"></param>
        /// <param name="fault"></param>
        public void HandleDriveResponseForGenericOperationsNotifications(DriveDistance driveDistance, bool success, Fault fault)
        {
            if (fault == null)
            {
                if (driveDistance.Body.isGenericOperation == true)
                {
                    //notify subscribers of generic drive distance -- complete

                    switch (driveDistance.Body.DriveRequestOperation)
                    {
                        case pxdrive.DriveRequestOperation.DriveDistance:
                            pxdrive.DriveDistanceRequest driveDistanceRequest = new pxdrive.DriveDistanceRequest();
                            driveDistanceRequest.DriveDistanceStage = pxdrive.DriveStage.Completed;

                            pxdrive.DriveDistance driveDistanceUpdate = new pxdrive.DriveDistance(driveDistanceRequest);
                            SendNotification<pxdrive.DriveDistance>(_genericSubMgrPort, driveDistanceUpdate);
                            break;

                        case pxdrive.DriveRequestOperation.RotateDegrees:
                            pxdrive.RotateDegreesRequest rotateDegreesRequest = new pxdrive.RotateDegreesRequest();
                            rotateDegreesRequest.RotateDegreesStage = pxdrive.DriveStage.Completed;

                            pxdrive.RotateDegrees rotateDegreesUpdate = new pxdrive.RotateDegrees(rotateDegreesRequest);
                            SendNotification<pxdrive.RotateDegrees>(_genericSubMgrPort, rotateDegreesUpdate);
                            break;
                    }
                }
                else
                {
                    // Operation canceled.
                    driveDistance.Body.DriveDistanceStage = pxdrive.DriveStage.Canceled;
                    SendNotification<pxdrive.SetDrivePower>(_genericSubMgrPort, driveDistance.Body);
                }
                _internalPendingDriveOperation = pxdrive.DriveRequestOperation.NotSpecified;
            }
        }