Beispiel #1
0
 public void StartGazeDataStreams(GazePointCallback gazePointCallback, FixationCallback fixationCallback, EyePositionCallback eyePositionCallback)
 {
     if (gazePointCallback != null)
     {
         if (gazePointDataStream == null)
         {
             gazePointDataStream = eyeXHost.CreateGazePointDataStream(Tobii.EyeX.Framework.GazePointDataMode.Unfiltered);
         }
         gazePointDataStream.Next += InvokeGazePointEvent;
         GazePointEvent           += gazePointCallback;
         GazePointEvent           += RecordGazePoint;
     }
     if (fixationCallback != null)
     {
         if (fixationDataStream == null)
         {
             fixationDataStream = eyeXHost.CreateFixationDataStream(FixationDataMode.Sensitive);
         }
         fixationDataStream.Next += InvokeFixationEvent;
         FixationEvent           += fixationCallback;
         FixationEvent           += RecordFixation;
     }
     if (eyePositionCallback != null)
     {
         if (eyePositionDataStream == null)
         {
             eyePositionDataStream = eyeXHost.CreateEyePositionDataStream();
         }
         eyePositionDataStream.Next += InvokeEyePositionEvent;
         EyePositionEvent           += eyePositionCallback;
         EyePositionEvent           += RecordEyePosition;
     }
 }
        /*************************EYE_X_COMPONENT.INIT********************/

        /*
         * Receive method for the EyeX gaze data stream.
         */
        private void ReceiveGazeData(Envelope e)
        {
            using (gazeDataStream = host.CreateGazePointDataStream(GazePointDataMode.LightlyFiltered))
            {
                Console.WriteLine("EyeX data stream initiated.");

                gazePoint.Post(gazeDataStream, e.OriginatingTime);

                using (eyePositionStream = host.CreateEyePositionDataStream())
                {
                    Console.WriteLine("EyeX eye position stream initiated.");

                    eyeData.Post(eyePositionStream, e.OriginatingTime);

                    gazeDataStream.Next += (s, q) =>
                    {
                        frameDataX = q.X;
                        frameDataY = q.Y;
                    };

                    eyePositionStream.Next += (s, q) =>
                    {
                        leftEyeX = q.LeftEye.X;
                        leftEyeY = q.LeftEye.Y;
                        leftEyeZ = q.LeftEye.Z;

                        leftEyeNormalizedX = q.LeftEyeNormalized.X;
                        leftEyeNormalizedY = q.LeftEyeNormalized.Y;
                        leftEyeNormalizedZ = q.LeftEyeNormalized.Z;

                        rightEyeX = q.RightEye.X;
                        rightEyeY = q.RightEye.Y;
                        rightEyeZ = q.RightEye.Z;

                        rightEyeNormalizedX = q.RightEyeNormalized.X;
                        rightEyeNormalizedY = q.RightEyeNormalized.Y;
                        rightEyeNormalizedZ = q.RightEyeNormalized.Z;
                    };

                    Console.WriteLine("Listening for gaze data...");

                    using (FixationDataStream fixationStream = host.CreateFixationDataStream(FixationDataMode.Sensitive))
                    {
                        fixationData.Post(fixationStream, e.OriginatingTime);

                        fixationStream.Next += (s, q) =>
                        {
                            fixationX = q.X;
                            fixationY = q.Y;
                        };

                        Console.WriteLine("Recording fixation points...");
                        Console.In.Read();
                    }
                }
            }
        }
Beispiel #3
0
        public webBro()
        {
            InitializeComponent();
            InitBrowser();

            synth.SetOutputToDefaultAudioDevice();
            synth.SpeakCompleted += synth_SpeakCompleted;

            rgx = new Regex(pattern);

            try
            {
                defaultStyle    = File.ReadAllText(".\\Data\\style.css");
                monochromeStyle = File.ReadAllText(".\\Data\\monochrome.css");
                style           = defaultStyle;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }

            eyeXHost = new EyeXHost();
            eyeXHost.Start();
            stream       = eyeXHost.CreateGazePointDataStream(Tobii.EyeX.Framework.GazePointDataMode.Unfiltered);
            stream.Next += (s, e) =>
            {
                setPos((int)e.X, (int)e.Y);
            };
            position       = eyeXHost.CreateEyePositionDataStream();
            position.Next += (s, e) =>
            {
                leftClose  = e.LeftEye.X == 0 && e.LeftEye.Y == 0;
                rightClose = e.RightEye.X == 0 && e.RightEye.Y == 0;
            };

            controller = new Controller();
            listener   = new LeapEventListener(this);
            controller.AddListener(listener);

            if (File.Exists("parameters.cfg"))
            {
                StreamReader sr = new StreamReader("parameters.cfg");
                fingerMove.Checked = sr.ReadLine() == "1";
                keyCheck.Checked   = sr.ReadLine() == "1";
                borderLeft         = float.Parse(sr.ReadLine());
                borderUp           = float.Parse(sr.ReadLine());
                borderRight        = float.Parse(sr.ReadLine());
                borderDown         = float.Parse(sr.ReadLine());
                sr.Close();

                if (borderLeft != -200)
                {
                    firstLeap = false;
                }
            }
        }
Beispiel #4
0
        private void Eye()
        {
            using (var eyeXHost = new EyeXHost())
            {
                eyeXHost.Start();

                using (var stream = eyeXHost.CreateEyePositionDataStream())
                {
                    stream.Next += (s, e) =>
                    {
                        Console.SetCursorPosition(0, 0);

                        // Output information about the left eye.
                        Console.WriteLine("LEFT EYE");
                        Console.WriteLine("========");
                        Console.WriteLine("3D Position: ({0:0.0}, {1:0.0}, {2:0.0})                   ",
                                          e.LeftEye.X, e.LeftEye.Y, e.LeftEye.Z);
                        Console.WriteLine("Normalized : ({0:0.0}, {1:0.0}, {2:0.0})                   ",
                                          e.LeftEyeNormalized.X, e.LeftEyeNormalized.Y, e.LeftEyeNormalized.Z);

                        // Output information about the right eye.
                        Console.WriteLine();
                        Console.WriteLine("RIGHT EYE");
                        Console.WriteLine("=========");
                        Console.WriteLine("3D Position: {0:0.0}, {1:0.0}, {2:0.0}                   ",
                                          e.RightEye.X, e.RightEye.Y, e.RightEye.Z);
                        Console.WriteLine("Normalized : {0:0.0}, {1:0.0}, {2:0.0}                   ",
                                          e.RightEyeNormalized.X, e.RightEyeNormalized.Y, e.RightEyeNormalized.Z);
                    };

                    Console.SetCursorPosition(0, 12);
                    Console.WriteLine("");
                    Console.WriteLine("The 3D position consists of X,Y,Z coordinates expressed in millimeters");
                    Console.WriteLine("in relation to the center of the screen where the eye tracker is mounted.");
                    Console.WriteLine("\n");
                    Console.WriteLine("The normalized coordinates are expressed in relation to the track box,");
                    Console.WriteLine("i.e. the volume in which the eye tracker is theoretically able to track eyes.");
                    Console.WriteLine("- (0,0,0) represents the upper, right corner closest to the eye tracker.");
                    Console.WriteLine("- (1,1,1) represents the lower, left corner furthest away from the eye tracker.");
                    Console.WriteLine();
                    Console.WriteLine("---------------------------------------------------------");
                    Console.WriteLine("Listening for eye position data, press any key to exit...");

                    Console.In.Read();
                }
            }
        }
Beispiel #5
0
        public override Action Start()
        {
            host = new EyeXHost();
            host.Start();

            host.UserPresenceChanged            += HostOnUserPresenceChanged;
            host.EyeTrackingDeviceStatusChanged += HostOnEyeTrackingDeviceStatusChanged;
            host.UserProfileNameChanged         += HostOnUserProfileNameChanged;
            host.DisplaySizeChanged             += HostOnDisplaySizeChanged;

            gazeDataStream = host.CreateGazePointDataStream(GazePointDataMode.Unfiltered);
            eyeDataStream  = host.CreateEyePositionDataStream();

            gazeDataStream.Next += GazeDataStreamOnNext;
            eyeDataStream.Next  += EyeDataStreamOnNext;

            return(null);
        }
Beispiel #6
0
 public Record(bool filteered, string filenameWithoutExtention, bool takeScreenshot)
 {
     this.takeScreenshot           = takeScreenshot;
     this.filenameWithoutExtention = filenameWithoutExtention;
     //Directory.CreateDirectory(filenameWithoutExtention + "_screenshots");
     eyeXHost.Start();
     if (filtered)
     {
         lightlyFilteredGazeDataStream = eyeXHost.CreateGazePointDataStream(GazePointDataMode.LightlyFiltered);
         gpdm = GazePointDataMode.LightlyFiltered;
     }
     else
     {
         gpdm = GazePointDataMode.Unfiltered;
         lightlyFilteredGazeDataStream = eyeXHost.CreateGazePointDataStream(GazePointDataMode.Unfiltered);
     }
     eyePosStream = eyeXHost.CreateEyePositionDataStream();
 }
Beispiel #7
0
        private void Window_Loaded(object sender, RoutedEventArgs routedEventArgs)
        {
            FetchRawDpi(out rawDpiX, out rawDpiY);

            screenSize = SystemParameters.WorkArea;

            var dpiScale = VisualTreeHelper.GetDpi(this);

            conversionFactorX = (rawDpiX / dpiScale.DpiScaleX) / 25.4;
            conversionFactorY = (rawDpiY / dpiScale.DpiScaleY) / 25.4;

            D40.Width  = conversionFactorX * 40;
            D40.Height = conversionFactorY * 40;

            // There seems to be a 90mm offset for the data. It does not map to the screen height,
            // but instead seems to be realatively consistent across multiple devices.
            verticalOffset = 90 * conversionFactorY;

            eyeXHost = new EyeXHost();
            eyeXHost.Start();

            eyePositionDataStream       = eyeXHost.CreateEyePositionDataStream();
            eyePositionDataStream.Next += (s, e) =>
            {
                Dispatcher.BeginInvoke((Action)(() =>
                {
                    var sb = new StringBuilder();

                    UpdateEyeData("Left", e.LeftEye, LeftEyePositionEllipse, sb);
                    UpdateEyeData("Right", e.RightEye, RightEyePositionEllipse, sb);
                    if (e.LeftEye.IsValid && e.RightEye.IsValid)
                    {
                        sb.AppendLine($"          IPD ({e.RightEye.X - e.LeftEye.X,7:F1}mm)");
                    }

                    StatusTextBlock.Text = sb.ToString();
                }));
            };
        }
        public static void Main(string[] args)
        {
            tcpServer = new JsonTcpServer(6555);
            frameData = new FrameData();

            switch (EyeXHost.EyeXAvailability)
            {
            case EyeXAvailability.NotAvailable:
                Console.WriteLine("This server requires the EyeX Engine, but it isn't available.");
                Console.WriteLine("Please install the EyeX Engine and try again.");
                return;

            case EyeXAvailability.NotRunning:
                Console.WriteLine("This server requires the EyeX Engine, but it isn't running.");
                Console.WriteLine("Please make sure that the EyeX Engine is started.");
                break;
            }

            Thread clientUpdateThread = new Thread(new ThreadStart(StartUpdatingToClients));

            using (var eyeXHost = new EyeXHost())
            {
                eyeXHost.Start();
                Console.WriteLine("SERVER: eyeXHost started");

                // Create a data stream: lightly filtered gaze point data.
                // Other choices of data streams include EyePositionDataStream and FixationDataStream.

                eyeXHost.ScreenBoundsChanged += (s, e) =>
                {
                    Console.WriteLine("[EVENT] Screen Bounds in pixels (state-changed event): {0}", e);
                };

                eyeXHost.DisplaySizeChanged += (s, e) => {
                    Console.WriteLine("[EVENT] Display Size in millimeters (state-changed event): {0}", e);
                };

                eyeXHost.EyeTrackingDeviceStatusChanged += (s, e) => {
                    Console.WriteLine("[EVENT] Eye tracking device status (state-changed event): {0}", e);
                    EyeXAPIEvent message = new EyeXAPIEvent();
                    message.eventType = "device_state_changed";
                    tcpServer.sendToAllClients(message.toJson());
                    Thread.Sleep(60);
                };

                eyeXHost.UserPresenceChanged += (s, e) => {
                    Console.WriteLine("[EVENT] User presence (state-changed event): {0}", e);
                    //TODO save it to send in frame
                };

                eyeXHost.UserProfileNameChanged += (s, e) =>
                {
                    Console.WriteLine("[EVENT] Active profile name (state-changed event): {0}", e);
                };

                // This state-changed event required EyeX Engine 1.4.
                eyeXHost.UserProfilesChanged += (s, e) =>
                {
                    Console.WriteLine("[EVENT] User profile names (state-changed event): {0}", e);
                };

                eyeXHost.GazeTrackingChanged += (s, e) =>
                {
                    Console.WriteLine("[EVENT] Gaze tracking (state-changed event): {0}", e);
                    //TODO save it to send in frame
                };

                using (var gazeDataStream = eyeXHost.CreateGazePointDataStream(GazePointDataMode.LightlyFiltered))
                {
                    Console.WriteLine("[EYEX]: GazeDataStream started");
                    using (var eyePositionStream = eyeXHost.CreateEyePositionDataStream())
                    {
                        Console.WriteLine("[EYEX]: EyePositionStream started");

                        // Write the data to the console.
                        gazeDataStream.Next += (s, e) => {
                            //Console.WriteLine("Gaze point at ({0:0.0}, {1:0.0}) @{2:0}", e.X, e.Y, e.Timestamp);

                            frameData.Gaze         = e;
                            frameData.userPresence = eyeXHost.UserPresence;
                        };

                        eyePositionStream.Next += (s, e) =>
                        {
                            //Console.WriteLine("3D Position: ({0:0.0}, {1:0.0}, {2:0.0})                   ",
                            //   e.LeftEye.X, e.LeftEye.Y, e.LeftEye.Z);

                            frameData.updateEyePosition(e);
                            frameData.userPresence = eyeXHost.UserPresence;
                        };

                        tcpServer.ClientMessageReceieved += (TcpClient client, JObject json) =>
                        {
                            if (json["type"].ToString() == "request")
                            {
                                int requestId = (int)json["requestId"];
                                if (json["resource"].ToString() == "calibration" && json["path"].ToString() == "start")
                                {
                                    Console.WriteLine("[Client] Calibration requested");
                                    EyeXAPIResponse response = new EyeXAPIResponse();
                                    response.statusCode = 200;
                                    response.requestId  = requestId;
                                    tcpServer.sendToClient(client, response.toJson());
                                    eyeXHost.LaunchGuestCalibration();
                                }

                                if (json["resource"].ToString() == "tracker")
                                {
                                    if (json["path"].ToString() == "get.basic_info")
                                    {
                                        EyeXAPIResponse response = new EyeXAPIResponse();
                                        response.statusCode = 200;
                                        response.requestId  = requestId;
                                        Dictionary <string, object> result = new Dictionary <string, object>();
                                        result.Add("screen_bounds", eyeXHost.ScreenBounds.Value);
                                        result.Add("display_size", eyeXHost.DisplaySize.Value);
                                        response.results = result;
                                        tcpServer.sendToClient(client, response.toJson());
                                    }
                                    else
                                    {
                                        //TODO return api error: unknown method
                                    }
                                }
                            }
                            else if (json["type"].ToString() == "event")
                            {
                                // Client side events is not supported yet
                            }
                        };

                        clientUpdateThread.Start();

                        Console.WriteLine("Listening for gaze data, press any key to exit...");
                        Console.In.Read();
                    } // using EyePositionDataStream
                }     // using GazeDataStream
            }         // using eyeXHost
        }