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(); } } } }
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; } } }
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(); } } }
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); }
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(); }
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 }