/* Initialize All Members*/ public void Init(ASLAlphabetDetectedHandler letterCallback = null, ASLSimilarityDetectedHandler similarityCallback = null) { MyLeapListener listener; Leap.Controller controller; if (_instance != null) { listener = _instance.leapListener; controller = _instance.leapController; } else { listener = new MyLeapListener(); controller = new Leap.Controller(listener); } _instance = this; // Set-up the Listener leapListener = listener; leapController = controller; // Initialize Local Data letterHandler = letterCallback; similarityHandler = similarityCallback; lastLetterTime = DateTime.Now.Ticks; currentLetter = INVALID_ASL_LETTER; currentSimilarity = ASLTest.INVALID_ASL_TEST; lastResult = INVALID_ASL_LETTER; FirstPassInit(); SecondPassInit(); }
/* ========================= Initialize Tracking Algorithms ============================ */ /* Method for the Distance Between Palm and Pointer */ private static void OnLeapMotionUpdate(Leap.Hand hand) { // Get Instance InputManager IM = _instance; if (IM == null) { return; } // Complete First Pass FingerLift[] fingerTest = IM.RetrieveFingerLift(hand); ASLTest firstPassResults = IM.FirstPassAlgorithm(fingerTest); // Call Similarity Handler IM.UpdateCurrentSimilarity(firstPassResults); /*if(IM.similarityHandler != null) * { * IM.similarityHandler(firstPassResults); * }*/ if (firstPassResults == ASLTest.INVALID_ASL_TEST) { IM.UpdateCurrentLetter(INVALID_ASL_LETTER); return; } // Complete Second Pass char secondPassResults = IM.SecondPassAlgorithm(firstPassResults, hand); // Determine if Successful bool finalResults = (secondPassResults >= 'A' && secondPassResults <= 'Z') || (secondPassResults >= 'a' && secondPassResults <= 'z'); if (IM.lastResult != secondPassResults) { IM.lastResult = secondPassResults; IM.lastLetterTime = DateTime.Now.Ticks; } // Call Letter Handler if (finalResults) { if (((DateTime.Now.Ticks - IM.lastLetterTime) / TimeSpan.TicksPerMillisecond) >= (IM.dwellTime * 1000)) { IM.UpdateCurrentLetter(secondPassResults); } else { IM.UpdateCurrentLetter(INVALID_ASL_LETTER); } } else { IM.UpdateCurrentLetter(INVALID_ASL_LETTER); } }
/* Returns the alphabet that this algorithm has detected, a non-alphabet (whitespace) otherwise */ private char SecondPassAlgorithm(ASLTest test, Leap.Hand hand) { // (For Reassurance Purposes) if (hand == null) { Debug.Log("Lift Result is Null. This should not happen."); return(INVALID_ASL_LETTER); } // Call Respective ASL Test (using fancy delegates!) return(DoASLTestCall[(int)test](hand)); }
/* Set Current Similarity Result */ private void UpdateCurrentSimilarity(ASLTest test) { if (currentSimilarity != test) { currentSimilarity = test; if (similarityHandler != null) { if (debugMode) { Debug.Log("ASL Similary Handler Called. Value: " + test); } similarityHandler(test); } } }
/* ========================= Initialize First-Pass Algorithms ========================== */ void FirstPassInit() { // Distance Threshold Initialize DownDistanceThreshold = new int[5]; DownDistanceThreshold[(int)MyFingerType.TYPE_THUMB] = 10; DownDistanceThreshold[(int)MyFingerType.TYPE_INDEX] = 65; //70; DownDistanceThreshold[(int)MyFingerType.TYPE_MIDDLE] = 65; //70; DownDistanceThreshold[(int)MyFingerType.TYPE_RING] = 65; //70; DownDistanceThreshold[(int)MyFingerType.TYPE_PINKY] = 60; //60; MiddleDistanceThreshold = new int[5]; MiddleDistanceThreshold[(int)MyFingerType.TYPE_THUMB] = 50; MiddleDistanceThreshold[(int)MyFingerType.TYPE_INDEX] = 80; MiddleDistanceThreshold[(int)MyFingerType.TYPE_MIDDLE] = 80; MiddleDistanceThreshold[(int)MyFingerType.TYPE_RING] = 80; MiddleDistanceThreshold[(int)MyFingerType.TYPE_PINKY] = 70; // ASL Test Map Initialize ASLTestMapping = new ASLTest[3][][][][]; for (int i = 0; i < 3; ++i) { ASLTestMapping[i] = new ASLTest[3][][][]; for (int j = 0; j < 3; ++j) { ASLTestMapping[i][j] = new ASLTest[3][][]; for (int k = 0; k < 3; ++k) { ASLTestMapping[i][j][k] = new ASLTest[3][]; for (int l = 0; l < 3; ++l) { ASLTestMapping[i][j][k][l] = new ASLTest[3]; for (int m = 0; m < 3; ++m) { ASLTestMapping[i][j][k][l][m] = ASLTest.INVALID_ASL_TEST; } } } } } int DOWN = (int)FingerLift.FINGER_DOWN; int MID_ = (int)FingerLift.FINGER_MIDDLE; int UP__ = (int)FingerLift.FINGER_UP; // Initialize the ASLTest Function calls to its respective ASL Test enumeration //=============== TEST A-E-M-N-S-T Test ========================== //_____________THMB__INDX__MID___RING__PNKY_______________________ ASLTestMapping[DOWN][DOWN][DOWN][DOWN][DOWN] = ASLTest.TEST_AEMNST; ASLTestMapping[MID_][DOWN][DOWN][DOWN][DOWN] = ASLTest.TEST_AEMNST; //=============== TEST H-K-R-U-V Test ============================ //_____________THMB__INDX__MID___RING__PNKY_______________________ ASLTestMapping[DOWN][UP__][UP__][DOWN][DOWN] = ASLTest.TEST_HKRUV; ASLTestMapping[MID_][UP__][UP__][DOWN][DOWN] = ASLTest.TEST_HKRUV; //================ TEST D-G-P-Q-Z Test =========================== //_____________THMB__INDX__MID___RING__PNKY_______________________ ASLTestMapping[DOWN][UP__][DOWN][DOWN][DOWN] = ASLTest.TEST_DGPQZ; ASLTestMapping[MID_][UP__][DOWN][DOWN][DOWN] = ASLTest.TEST_DGPQZ; ASLTestMapping[MID_][UP__][DOWN][DOWN][DOWN] = ASLTest.TEST_DGPQZ; ASLTestMapping[MID_][UP__][DOWN][DOWN][MID_] = ASLTest.TEST_DGPQZ; ASLTestMapping[MID_][UP__][DOWN][MID_][DOWN] = ASLTest.TEST_DGPQZ; ASLTestMapping[MID_][UP__][DOWN][MID_][MID_] = ASLTest.TEST_DGPQZ; ASLTestMapping[MID_][UP__][MID_][DOWN][DOWN] = ASLTest.TEST_DGPQZ; ASLTestMapping[MID_][UP__][MID_][DOWN][MID_] = ASLTest.TEST_DGPQZ; ASLTestMapping[MID_][UP__][MID_][MID_][DOWN] = ASLTest.TEST_DGPQZ; ASLTestMapping[MID_][UP__][MID_][MID_][MID_] = ASLTest.TEST_DGPQZ; ASLTestMapping[DOWN][UP__][MID_][MID_][MID_] = ASLTest.TEST_DGPQZ; //====================== TEST L Test ============================= //_____________THMB__INDX__MID___RING__PNKY_______________________ ASLTestMapping[UP__][UP__][DOWN][DOWN][DOWN] = ASLTest.TEST_L; //==================== TEST I-J Test ============================= //_____________THMB__INDX__MID___RING__PNKY_______________________ ASLTestMapping[DOWN][DOWN][DOWN][DOWN][UP__] = ASLTest.TEST_IJ; ASLTestMapping[MID_][DOWN][DOWN][DOWN][UP__] = ASLTest.TEST_IJ; //==================== TEST C-O Test ============================= //_____________THMB__INDX__MID___RING__PNKY_______________________ ASLTestMapping[MID_][UP__][UP__][UP__][UP__] = ASLTest.TEST_CO; //ASLTestMapping[MID_][UP__][UP__][UP__][MID_] = ASLTest.TEST_CO; //ASLTestMapping[MID_][UP__][UP__][MID_][UP__] = ASLTest.TEST_CO; //ASLTestMapping[MID_][UP__][UP__][MID_][MID_] = ASLTest.TEST_CO; //ASLTestMapping[MID_][UP__][MID_][UP__][UP__] = ASLTest.TEST_CO; //ASLTestMapping[MID_][UP__][MID_][UP__][MID_] = ASLTest.TEST_CO; //ASLTestMapping[MID_][UP__][MID_][MID_][UP__] = ASLTest.TEST_CO; //ASLTestMapping[MID_][UP__][MID_][MID_][MID_] = ASLTest.TEST_CO; // Same as PQ //ASLTestMapping[MID_][MID_][UP__][UP__][UP__] = ASLTest.TEST_CO; //ASLTestMapping[MID_][MID_][UP__][UP__][MID_] = ASLTest.TEST_CO; //ASLTestMapping[MID_][MID_][UP__][MID_][UP__] = ASLTest.TEST_CO; //ASLTestMapping[MID_][MID_][UP__][MID_][MID_] = ASLTest.TEST_CO; //ASLTestMapping[MID_][MID_][MID_][UP__][UP__] = ASLTest.TEST_CO; //ASLTestMapping[MID_][MID_][MID_][UP__][MID_] = ASLTest.TEST_CO; //ASLTestMapping[MID_][MID_][MID_][MID_][UP__] = ASLTest.TEST_CO; ASLTestMapping[MID_][MID_][MID_][MID_][MID_] = ASLTest.TEST_CO; ASLTestMapping[DOWN][MID_][MID_][MID_][MID_] = ASLTest.TEST_CO; //===================== TEST B Test ============================== //_____________THMB__INDX__MID___RING__PNKY_______________________ ASLTestMapping[DOWN][UP__][UP__][UP__][UP__] = ASLTest.TEST_B; //====================== TEST F Test ============================= //_____________THMB__INDX__MID___RING__PNKY_______________________ //ASLTestMapping[DOWN][DOWN][UP__][UP__][UP__] = ASLTest.TEST_F; ASLTestMapping[MID_][DOWN][UP__][UP__][UP__] = ASLTest.TEST_F; ASLTestMapping[MID_][MID_][UP__][UP__][UP__] = ASLTest.TEST_F; //==================== TEST W Test =============================== //_____________THMB__INDX__MID___RING__PNKY_______________________ ASLTestMapping[DOWN][UP__][UP__][UP__][DOWN] = ASLTest.TEST_W; ASLTestMapping[DOWN][UP__][UP__][UP__][MID_] = ASLTest.TEST_W; /*ASLTestMapping[DOWN][MID_][UP__][UP__][DOWN] = ASLTest.TEST_W; * ASLTestMapping[DOWN][UP__][UP__][MID_][DOWN] = ASLTest.TEST_W; * ASLTestMapping[DOWN][MID_][UP__][MID_][DOWN] = ASLTest.TEST_W; * ASLTestMapping[DOWN][UP__][MID_][UP__][DOWN] = ASLTest.TEST_W; * ASLTestMapping[DOWN][MID_][MID_][UP__][DOWN] = ASLTest.TEST_W; * ASLTestMapping[DOWN][UP__][MID_][MID_][DOWN] = ASLTest.TEST_W; * ASLTestMapping[DOWN][MID_][MID_][MID_][DOWN] = ASLTest.TEST_W;*/ //===================== TEST X Test ============================== //_____________THMB__INDX__MID___RING__PNKY_______________________ ASLTestMapping[DOWN][MID_][DOWN][DOWN][DOWN] = ASLTest.TEST_X; ASLTestMapping[MID_][MID_][DOWN][DOWN][DOWN] = ASLTest.TEST_X; // Middle or up //==================== TEST Y Test =============================== //_____________THMB__INDX__MID___RING__PNKY_______________________ ASLTestMapping[UP__][DOWN][DOWN][DOWN][UP__] = ASLTest.TEST_Y; ASLTestMapping[UP__][DOWN][DOWN][DOWN][MID_] = ASLTest.TEST_Y; }