/// <summary> /// DriveDistance Initialization Constructor /// </summary> /// <param name="body"></param> public DriveDistance(DriveDistanceRequest body) { Body = body; }
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); }