/// <summary>
 /// Raises when the load button is clicked.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void OnLoadGesturesClick(object sender, RoutedEventArgs e)
 {
     using (System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog()) {
         if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
             m_pGestureRecognizer = new GestureRecognizer(dialog.SelectedPath);
             m_pGestures = new ObservableCollection<IavaGesture>(GestureFolderReader.Read(dialog.SelectedPath));
             foreach (IavaGesture g in m_pGestures) {
                 m_pGestureRecognizer.Subscribe(g.Name, OnGestureDetected);
             }
             this.lstGestures.ItemsSource = m_pGestures;
             btnStartTest.IsEnabled = true;
         }
     }
 }
        /// <summary>
        /// Default Constructor
        /// </summary>
        public MainWindow()
        {
            InitializeComponent();

            const string gesturesPath = @"..\..\..\Gestures\";
            m_pGestureRecognizer = new Gesture.GestureRecognizer(gesturesPath);
            m_pAudioRecognizer = new AudioRecognizer();

            m_pAudioRecognizer.AudioConfidenceThreshold = 0.8f;

            // Initialize the CityLocations class by calling a method on it
            CityLocations.GetCityLocation("test");

            // Events
            m_pAudioRecognizer.StatusChanged    += OnAudioRecognizerStatusChanged;
            m_pGestureRecognizer.StatusChanged  += OnGestureRecognizerStatusChanged;
            m_pAudioRecognizer.Synced           += OnAudioRecognizerSynced;
            m_pGestureRecognizer.Synced         += OnGestureRecognizerSynced;
            m_pAudioRecognizer.Unsynced         += OnAudioRecognizerUnsynced;
            m_pGestureRecognizer.Unsynced       += OnGestureRecognizerUnsynced;

            // Gesture Callbacks
            string[] mappedGestureNames = new[]
                {
                    "Zoom In",
                    "Zoom Out",
                    "Swipe Left",
                    "Swipe Right",
                    "Swipe Up",
                    "Swipe Down"
                };
            m_pGestureRecognizer.Subscribe(mappedGestureNames[0], GestureZoomInCallback);
            m_pGestureRecognizer.Subscribe(mappedGestureNames[1], GestureZoomOutCallback);
            m_pGestureRecognizer.Subscribe(mappedGestureNames[2], GestureSwipeLeftCallback);
            m_pGestureRecognizer.Subscribe(mappedGestureNames[3], GestureSwipeRightCallback);
            m_pGestureRecognizer.Subscribe(mappedGestureNames[4], GestureSwipeUpCallback);
            m_pGestureRecognizer.Subscribe(mappedGestureNames[5], GestureSwipeDownCallback);

            // Add unmapped gestures so that they will be recognized
            foreach (IavaGesture gesture in GestureFolderReader.Read(gesturesPath))
            {
                if (!Equals("Sync", gesture.Name) && !mappedGestureNames.Contains<string>(gesture.Name))
                {
                    m_pGestureRecognizer.Subscribe(gesture.Name, GestureUnmappedCallback);
                }
            }

            // Audio Callbacks
            m_pAudioRecognizer.Subscribe("Zoom In", ZoomInCallback);
            m_pAudioRecognizer.Subscribe("Zoom Out", ZoomOutCallback);
            m_pAudioRecognizer.Subscribe("Move North", MoveNorthCallback);
            m_pAudioRecognizer.Subscribe("Move South", MoveSouthCallback);
            m_pAudioRecognizer.Subscribe("Move East", MoveEastCallback);
            m_pAudioRecognizer.Subscribe("Move West", MoveWestCallback);
            m_pAudioRecognizer.Subscribe("Exit Application", BlowUp);
            m_pAudioRecognizer.Subscribe("Locate *", LocateCityCallback);
            m_pAudioRecognizer.Subscribe("Get Recognizer Statuses", GetRecognizerStatusesCallback);

            IavaCamera.ImageFrameReady += OnCameraImageFrameReady;
            IavaCamera.SkeletonFrameReady += OnCameraSkeletonFrameReady;

            m_pAudioSyncTimer = new System.Timers.Timer(1000);
            m_pAudioSyncTimer.Elapsed += OnAudioSyncTimerElapsed;

            m_pGestureSyncTimer = new System.Timers.Timer(1000);
            m_pGestureSyncTimer.Elapsed += OnGestureSyncTimerElapsed;

            m_pConsoleTxtBox = new TextBoxStreamWriter(this.txtConsole);
            Console.SetOut(m_pConsoleTxtBox);

            // UI theme stuff...
            lblAudioStatus.Background = lblGestureStatus.Background = unsyncedBrush;
            lblAudioSyncTime.Background = lblGestureSyncTime.Background = backgroundBrush;
            lblAudioTTL.Background = lblGestureTTL.Background = backgroundBrush;
        }
        public void OnGestureRecognizedTest()
        {
            try {
                GestureRecognizer recognizer = new GestureRecognizer(_directoryPath);

                bool syncEventFired = false;
                bool waveCallbackInvoked = false;
                bool shakeCallbackInvoked = false;

                // Set the Sync Gesture
                PrivateObject privateObject = new PrivateObject(recognizer);
                privateObject.SetProperty("SyncGesture", new IavaGesture("Sync", new List<IavaSnapshot>()));

                // Register for some Gestures
                recognizer.Synced += (parm1, param2) => { syncEventFired = true; };
                recognizer.Subscribe("Wave", (eventArgs) => { waveCallbackInvoked = true; });
                recognizer.Subscribe("Shake", (eventArgs) => { shakeCallbackInvoked = true; });
                recognizer.Start();

                try {
                    // Recognize the Wave gesture
                    privateObject.Invoke("OnGestureRecognized", null, new GestureEventArgs("Wave"));
                    Thread.Sleep(50);

                    // Make sure the Wave callback fired
                    Assert.IsTrue(waveCallbackInvoked);

                }
                catch (Exception ex) {
                    Assert.Fail(ex.Message);
                }

                try {
                    // Recognize the Shake gesture
                    privateObject.Invoke("OnGestureRecognized", null, new GestureEventArgs("Shake"));
                    Thread.Sleep(50);

                    // Make sure the Shake callback fired
                    Assert.IsTrue(shakeCallbackInvoked);

                }
                catch (Exception ex) {
                    Assert.Fail(ex.Message);
                }

                try {
                    // Recognize the Sync gesture
                    privateObject.Invoke("OnGestureRecognized", null, new GestureEventArgs("Sync"));
                    Thread.Sleep(50);

                    // Make sure the Sync event fired,
                    Assert.IsTrue(syncEventFired);

                }
                catch (Exception ex) {
                    Assert.Fail(ex.Message);
                }

                try {
                    // Reset the Sync, Wave, and Shake callbacks
                    syncEventFired = false;
                    waveCallbackInvoked = false;
                    shakeCallbackInvoked = false;

                    // Recognize the Wave gesture again
                    privateObject.Invoke("OnGestureRecognized", null, new GestureEventArgs("Wave"));
                    Thread.Sleep(50);

                    // Make sure the Wave callback fired
                    Assert.IsTrue(waveCallbackInvoked);

                    // Recognize the Shake gesture again
                    privateObject.Invoke("OnGestureRecognized", null, new GestureEventArgs("Shake"));
                    Thread.Sleep(50);

                    // Make sure the Shake callback fired
                    Assert.IsTrue(shakeCallbackInvoked);
                }
                catch (Exception ex) {
                    Assert.Fail(ex.Message);
                }

                recognizer.Stop();
            }
            catch (Exception ex) {
                Assert.Fail(ex.Message);
            }
        }