using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace bbiwarg.Recognition.FingerRecognition { public enum TrackingState { None, Detected, Tracked, Lost, } class FingerHistory { private static List usedIDs = new List(); public int ID { get; private set; } public List Fingers { get; private set; } public List States { get; private set; } public Finger LastFinger { get; private set; } public Finger CurrentFinger { get { return Fingers[Fingers.Count - 1]; } } public TrackingState CurrentState { get { return States[States.Count - 1]; } } public FingerHistory(Finger finger) { ID = FingerHistory.getNextUnusedID(); Fingers = new List(); States = new List(); Fingers.Add(finger); States.Add(TrackingState.Detected); LastFinger = finger; } ~FingerHistory() { FingerHistory.setIDUnused(ID); } public void addFinger(Finger finger) { TrackingState previousState = CurrentState; TrackingState newState = TrackingState.None; int numFramesInCurrentState = getNumFramesInCurrentState(); if (finger == null) newState = TrackingState.Lost; else if (previousState == TrackingState.Tracked) newState = TrackingState.Tracked; else if (previousState == TrackingState.Detected) { if (numFramesInCurrentState == Constants.FingerNumFramesUntilTracked) newState = TrackingState.Tracked; else newState = TrackingState.Detected; } Fingers.Add(finger); States.Add(newState); if (finger != null) LastFinger = finger; } public int getNumFramesInCurrentState() { TrackingState currentState = CurrentState; int count = 0; for (int i = States.Count - 1; i >= 0; i--) { if (States[i] == currentState) count++; else break; } return count; } public static int getNextUnusedID() { int id = 1; while (usedIDs.Contains(id)) id++; usedIDs.Add(id); return id; } public static void setIDUnused(int id) { usedIDs.Remove(id); } } }