public JsonResult Enqueue(string json) { var jObject = (JObject)JsonConvert.DeserializeObject <JObject>(json); var typeInt = jObject["Type"].ToObject <int>(); var type = (EActionType)typeInt; TinBotAction action = null; switch (type) { case EActionType.Speak: action = jObject.ToObject <SpeakAction>(); break; case EActionType.Face: action = jObject.ToObject <FaceAction>(); break; case EActionType.Move: action = jObject.ToObject <MovementAcion>(); break; case EActionType.Saved: action = jObject.ToObject <SavedAction>(); break; case EActionType.Sequence: action = jObject.ToObject <SequenceAction>(); break; case EActionType.Toggle: action = jObject.ToObject <ToggleAction>(); break; } SuperDataBase.Queue.Add(new ActionContainer(action)); return(Json("OK")); }
public async Task ExecuteAction(TinBotAction action) { if (action == null || !_body.IsReady) { return; } try { for (int i = 0; i < Math.Max(1, action.Repeat); i++) { switch (action.Type) { case EActionType.Speak: await Speak(((SpeakAction)action).Text); break; case EActionType.Face: var sb = Faces[((FaceAction)action).TinBotFaces]; await ExecuteOnMainThread(() => PlayAndPause(sb)); break; case EActionType.Toggle: if (_body.IsReady) { await ExecuteToggle((ToggleAction)action); } break; case EActionType.Move: if (_body.IsReady) { var moveAction = (MovementAcion)action; if (_body.Servos.ContainsKey(moveAction.Servo)) { await Move(moveAction); } } break; case EActionType.Saved: var found = ActionsLib.AllActions().FirstOrDefault( x => x.Name.Equals(((SavedAction)action).ActionName, StringComparison.OrdinalIgnoreCase)); if (found != null) { await ExecuteAction(found); } break; case EActionType.Sequence: var sequenceAction = (SequenceAction)action; foreach (var paralellAction in sequenceAction.Sequence) { List <Task> waiters = new List <Task>(); foreach (var actionContainer in paralellAction) { var a = actionContainer.GetAction(); var t = ExecuteAction(a); if (!a.IgnoreBlockingInSeries) { waiters.Add(t); } } await Task.WhenAll(waiters); } break; } await Task.Delay(action.ExtraWaitTime); } } catch (Exception ex) { return; } }