/// <summary> /// Connects the given tracker. /// </summary> /// <returns>Identifier for the tracker. Less than 0 if starting was not successful.</returns> /// <param name="tracker">Tracker.</param> /// <param name="settings">Settings.</param> public int StartTracker(IPoseTracker tracker) { if (tracker == null) { throw new ArgumentNullException("tracker"); } lock (trackerSync) { int id; // find unused index for (id = 0; id < trackers.Count; id++) { if (trackers[id] == null) { break; } } // add or insert tracker if (id < trackers.Count) { trackers[id] = tracker; } else { trackers.Add(tracker); } // the tracker signals when it has data to process // to let it process we pick up the signal tracker.InputAvailable += SignalStep; if (!tracker.Start()) { return(-1); } return(id); } }
/// <summary> /// Executes a single iteration of all started trackers. /// </summary> private void StopTrackers() { lock (stepSync) { while (toStep.Count > 0) { IPoseTracker tracker = toStep.Dequeue(); tracker.Step(); } } }
/// <summary> /// Signals this instance to step the trackers due to available data to process. /// </summary> /// <param name="sender">Ignnored.</param> /// <param name="args">Ignored.</param> private void SignalStep(object sender, EventArgs args) { IPoseTracker tracker = sender as IPoseTracker; if (tracker != null) { lock (stepSync) { toStep.Enqueue(tracker); } } invokeSignal.Set(); }
/// <summary> /// Stops, disposes and removes the tracker specified by the given identifier. /// </summary> /// <returns><c>true</c>, if the tracker existed, <c>false</c> otherwise.</returns> /// <param name="id">Tracker identifier previously returned by <see cref="StartTracker"></see>.</param> public IPoseTracker StopTracker(int id) { lock (trackerSync) { if (id < 0 || id >= trackers.Count) { return(null); } if (trackers[id] == null) { return(null); } IPoseTracker result = trackers[id]; trackers[id] = null; result.InputAvailable -= SignalStep; result.Stop(); return(result); } }
private HttpStatusCode RespondGet(JsonString requestSubject, JsonString responseSubject, int[] positions) { object dataSync = new object(); JsonString data; lock (dataSync) { // TODO lock required? data = JsonString.CreateDict(); } var readySignal = new ManualResetEvent(false); TrackingSystem.Instance.Invoke((object sender, EventArgs args) => { var system = (TrackingSystem)sender; foreach (int pos in positions) { var entry = JsonString.CreateDict(); IPoseTracker tracker = system.GetTracker(pos); if (tracker == null) { entry.AddTerminal("inuse", "false"); } else if (tracker is P3CapTracker) { var capTracker = (P3CapTracker)tracker; EquipmentSettings settings = capTracker.GetSettings(); entry.AddTerminal("inuse", "true"); entry.AddJsonString("settings", EquipmentSettings.ToJson(settings)); } data.AddJsonString(JsonString.Stringify(pos), entry); } readySignal.Set(); }); readySignal.WaitOne(); lock (dataSync) { responseSubject.AddJsonString("data", data); } return(HttpStatusCode.OK); }