protected override IEnumerator<ITask> GetCallback(Myro.Services.Generic.Vector.GetRequestInfo request, PortSet<Myro.Services.Generic.Vector.CallbackResponseType, Fault> responsePort) { if (request is vector.GetAllRequestInfo) { PortSet<DefaultQueryResponseType, Fault> responses = new PortSet<DefaultQueryResponseType, Fault>(); for (int i = 0; i < _state.Values.Count; i++) { int myI = i; Activate(Arbiter.Choice(_scribblerPort.GetObstacle(i), delegate(brick.UInt16Body r) { //_state.Set(myI, RSUtils.NormalizeUShort(r.Value), DateTime.Now); _state.Set(myI, r.Value, DateTime.Now); responses.Post(DefaultQueryResponseType.Instance); }, delegate(Fault f) { responses.Post(f); })); } yield return Arbiter.MultipleItemReceive(responses, _state.Values.Count, delegate(ICollection<DefaultQueryResponseType> ss, ICollection<Fault> fs) { if (fs.Count == 0) responsePort.Post(vector.CallbackResponseType.Instance); else { responsePort.Post(fs.First()); //// f.Reason was sometimes null //var reasons = new List<ReasonText>(); //foreach (var f in fs) // reasons.AddRange(f.Reason.AsEnumerable()); //responsePort.Post(new Fault() { Detail = new Detail() { Any = fs.ToArray() }, Reason = reasons.ToArray() }); } }); } else { var info = (vector.GetElementRequestInfo)request; yield return Arbiter.Choice(_scribblerPort.GetObstacle(info.Index), delegate(brick.UInt16Body r) { _state.Set(info.Index, RSUtils.NormalizeUShort(r.Value), DateTime.Now); responsePort.Post(vector.CallbackResponseType.Instance); }, delegate(Fault f) { responsePort.Post(f); }); } yield break; }
/// <summary> /// Actuator callback /// </summary> protected override IEnumerator<ITask> SetCallback(Myro.Services.Generic.Vector.SetRequestInfo request, PortSet<vector.CallbackResponseType, Fault> responsePort) { var req = request as vector.SetElementsRequestInfo; if (req != null) { bool play = false; bool loud = false; foreach (var i in req.Indices) if (i == 0 || i == 1 || i == 2) play = true; else if (i == 3) loud = true; Fault error = null; if (loud) yield return Arbiter.Choice(setLoud(), delegate(vector.CallbackResponseType s) { }, delegate(Fault f) { error = f; }); if (error == null && play) yield return Arbiter.Choice(playTone(), delegate(vector.CallbackResponseType s1) { }, delegate(Fault f) { error = f; }); if (error == null) responsePort.Post(vector.CallbackResponseType.Instance); else responsePort.Post(error); } else { // Otherwise it was a SetAllRequestInfo Activate(Arbiter.Choice(setLoud(), delegate(vector.CallbackResponseType s) { Activate(Arbiter.Choice(playTone(), delegate(vector.CallbackResponseType s1) { responsePort.Post(vector.CallbackResponseType.Instance); }, delegate(Fault f) { responsePort.Post(f); })); }, delegate(Fault f) { responsePort.Post(f); })); } yield break; }