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 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 }