Jump to content

Kodiak

Verified Members
  • Posts

    3
  • Joined

  • Last visited

Posts posted by Kodiak

  1. Hi All, 

    I am fairly new to VR eye tracking and have run into a block, I am trying to output some data into a file and every time that I test this out Unity seems to freeze up I also get errors with System.IO and I could really use some help.

    (I have included my code to make it easier) 

    Thank you in advance

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    using System;
    using System.IO;
    using Valve.VR;
    using Valve.VR.InteractionSystem;
    using ViveSR.anipal.Eye;
    using System.Runtime.InteropServices;
    using TMPro;
    
    public class TrackPlayer : MonoBehaviour
    {
        // Object references for use
        public GameObject playerObj = null;
        public GameObject attractorRef = null;
        public Rigidbody attractorrb;
        public Camera playercamera;
    
        // Participant Order
        public string UserID; 
        public  static string participantName;
        public static string Path = Directory.GetCurrentDirectory();
        string File_Path;
    
        // Distance between variable 
        public float DistanceBetweenAandB;
    
        // Attractor animation controls
        private float speed = 0f;
        public Animator deerAnimator;
        
        // Eye data variables 
        private static EyeData eyeData = new EyeData();
        private static bool eye_callback_registered = false;
    
        //Debug text display
        public TMP_Text uiText;
        private float updateSpeed = 0;
        private static float lastTime, currentTime;
    
        // Gaze Directon varibales 
        private static Vector3 Eyeposition;
    
        // 
        private static UInt64 eye_valid_L, eye_valid_R;                 // The bits explaining the validity of eye data.
        private static float openness_L, openness_R;                    // The level of eye openness.
        private static float pupil_diameter_L, pupil_diameter_R;        // Diameter of pupil dilation.
        private static Vector2 pos_sensor_L, pos_sensor_R;              // Positions of pupils.
    
        // Focus information vairables 
        private static Ray testRay;
        private static FocusInfo focusInfo;
    
        // Variables that control how fast to report data back 
        private float nextActionTime = 0.0f;
        public float period = .08f;
        private static int cnt_callback = 0;
        private const int maxframe_count = 120 * 1800;
    
        private void Start()
        {
         UserID = participantName;
         SRanipal_Eye_v2.LaunchEyeCalibration();     // Perform calibration for eye tracking just before running actual experiement.
            
            File_Path = Directory.GetCurrentDirectory() + "\\Test_" + participantName + ".txt";
            Debug.Log(File_Path);
            if (participantName == "")
            {
                participantName = "Blank"; // make sure to fill in particpant ID 
            }
            if (File.Exists(File_Path))
            {
                Debug.Log("File with the same UserID already exists. Please change the UserID in the C# code.");
    
                //  When the same file name is found, we stop playing Unity.
    
                if (UnityEditor.EditorApplication.isPlaying)
                {
                    UnityEditor.EditorApplication.isPlaying = false;
                }
            }
    
        }
    
        // Update is called once per frame
        void Update()
        {
            //PlayerPositionTracking();
    
    
            if (SRanipal_Eye_Framework.Status != SRanipal_Eye_Framework.FrameworkStatus.WORKING) 
                return;
    
            if (SRanipal_Eye_Framework.Instance.EnableEyeDataCallback == true && eye_callback_registered == false)
            {
                SRanipal_Eye.WrapperRegisterEyeDataCallback(Marshal.GetFunctionPointerForDelegate((SRanipal_Eye.CallbackBasic)EyeCallback));
                eye_callback_registered = true;
            }
            else if (SRanipal_Eye_Framework.Instance.EnableEyeDataCallback == false && eye_callback_registered == true)
            {
                SRanipal_Eye.WrapperUnRegisterEyeDataCallback(Marshal.GetFunctionPointerForDelegate((SRanipal_Eye.CallbackBasic)EyeCallback));
                eye_callback_registered = false;
            }
    
                Vector3 GazeOriginCombinedLocal, GazeDirectionCombinedLocal;
            
                if (eye_callback_registered)
                {
                    if (SRanipal_Eye.GetGazeRay(GazeIndex.COMBINE, out GazeOriginCombinedLocal, out GazeDirectionCombinedLocal, eyeData)) { }
                    else if (SRanipal_Eye.GetGazeRay(GazeIndex.LEFT, out GazeOriginCombinedLocal, out GazeDirectionCombinedLocal, eyeData)) { }
                    else if (SRanipal_Eye.GetGazeRay(GazeIndex.RIGHT, out GazeOriginCombinedLocal, out GazeDirectionCombinedLocal, eyeData)) { }
                    else return;
                }
                else
                {
                    if (SRanipal_Eye.GetGazeRay(GazeIndex.COMBINE, out GazeOriginCombinedLocal, out GazeDirectionCombinedLocal)) { }
                    else if (SRanipal_Eye.GetGazeRay(GazeIndex.LEFT, out GazeOriginCombinedLocal, out GazeDirectionCombinedLocal)) { }
                    else if (SRanipal_Eye.GetGazeRay(GazeIndex.RIGHT, out GazeOriginCombinedLocal, out GazeDirectionCombinedLocal)) { }
                    else return;
                }
    
                Eyeposition = Camera.main.transform.TransformDirection(GazeDirectionCombinedLocal);
                Focus();
                FocusName();
    
    
    
            if (Time.time > nextActionTime)
            {
                nextActionTime += period;
    
                //Debug.Log(nextActionTime);
    
                // execute block of code here
                //uiText.text = Eyeposition.ToString();
    
                //PlayerPositionTracking();
                //AddPlayerEYELocationDataToFile();
                AddPlayerLocationDataToFile();
                AddCueLocationDataToFile();
    
                //Debug.Log(FocusName());
    
                //PLAYER HEAD ROTATION
                //Debug.Log("Player X ROTATION: " + playercamera.transform.rotation.x);
                //Debug.Log("Player Y ROTATION: " + playercamera.transform.rotation.y);
    
    
            }
    
    
    
    
    
        }
    
        private void OnDisable()
        {
            Release();
        }
    
        void OnApplicationQuit()
        {
            Release();
        }
        /// <summary>
        /// Release callback thread when disabled or quit
        /// </summary>
        private static void Release()
        {
            if (eye_callback_registered == true)
            {
                SRanipal_Eye.WrapperUnRegisterEyeDataCallback(Marshal.GetFunctionPointerForDelegate((SRanipal_Eye.CallbackBasic)EyeCallback));
                eye_callback_registered = false;
            }
        }
    
        /// <summary>
        /// Required class for IL2CPP scripting backend support
        /// </summary>
        internal class MonoPInvokeCallbackAttribute : System.Attribute
        {
            public MonoPInvokeCallbackAttribute() { }
        }
    
        /// <summary>
        /// Eye tracking data callback thread.
        /// Reports data at ~120hz
        /// MonoPInvokeCallback attribute required for IL2CPP scripting backend
        /// </summary>
        /// <param name="eye_data">Reference to latest eye_data</param>
        [MonoPInvokeCallback]
        private static void EyeCallback(ref EyeData eye_data)
        {
            eyeData = eye_data;
            // do stuff with eyeData...
            while (cnt_callback < maxframe_count)
            {
                openness_L = eyeData.verbose_data.left.eye_openness;
                openness_R = eyeData.verbose_data.right.eye_openness;
                pupil_diameter_L = eyeData.verbose_data.left.pupil_diameter_mm;
                pupil_diameter_R = eyeData.verbose_data.right.pupil_diameter_mm;
                pos_sensor_L = eyeData.verbose_data.left.pupil_position_in_sensor_area;
                pos_sensor_R = eyeData.verbose_data.right.pupil_position_in_sensor_area;
                eye_valid_L = eyeData.verbose_data.left.eye_data_validata_bit_mask;
                eye_valid_R = eyeData.verbose_data.right.eye_data_validata_bit_mask;
    
    
                lastTime = currentTime;
                currentTime = eyeData.timestamp;
    
    
    
                //Player location variables and arrays
                string playerEyeX = Eyeposition.x.ToString();
                string playerEyeY = Eyeposition.y.ToString();
                string playerEyeZ = Eyeposition.z.ToString();
                string playerEyeOpen_Left = openness_L.ToString();
                string playerEyeOpen_Right = openness_R.ToString();
                string playerEyeDiameter_Left = pupil_diameter_L.ToString();
                string playerEyeDiameter_Right = pupil_diameter_R.ToString();
                string playerEyePosInSenSorArea_Left_X = pos_sensor_L.x.ToString();
                string playerEyePosInSenSorArea_Left_Y = pos_sensor_L.y.ToString();
                string playerEyePosInSenSorArea_Right_X = pos_sensor_R.x.ToString();
                string playerEyePosInSenSorArea_Right_Y = pos_sensor_R.y.ToString();
                string playerEyeValid_Left = eye_valid_L.ToString();
                string playerEyeValid_Right = eye_valid_R.ToString();
    
    
                //string objectBeingLookedAt = FocusName();
    
    
                string value =
                playerEyeX + "," +
                playerEyeY + "," +
                playerEyeZ + "," +
                playerEyeOpen_Left + "," +
                playerEyeOpen_Right + "," +
                playerEyeDiameter_Left + "," +
                playerEyeDiameter_Right + "," +
                playerEyePosInSenSorArea_Left_X + "," +
                playerEyePosInSenSorArea_Left_Y + "," +
                playerEyePosInSenSorArea_Right_X + "," +
                playerEyePosInSenSorArea_Right_Y + "," +
                playerEyeValid_Left + "," +
                playerEyeValid_Right + "," +
                //objectBeingLookedAt +
                DateTime.Now.ToString() +
                Environment.NewLine;
    
    
    
                File.AppendAllText("Test_" + participantName + ".txt", value);
                cnt_callback++;
    
    
                //string[] playerEYEData = { "\n" + "X = " + playerEyeX + ",", "" + "Y = " + playerEyeY + ",", "" + "Z = " + playerEyeZ + ",",
                //"" + "Eye Openess_L = " + playerEyeOpen_Left + ",", "" + "Eye Openess_R = " + playerEyeOpen_Right + ",",
                //"" + "Eye Diameter_L = " + playerEyeDiameter_Left + ",", "" + "Eye Diameter_R = " + playerEyeDiameter_Right + ",",
                //"" + "Eye Position In Sense Area_Left_X = " + playerEyePosInSenSorArea_Left_X + ",", "" + "Eye Position In Sense Area_Left_Y = " + playerEyePosInSenSorArea_Left_Y + ",",
                //"" + "Eye Position In Sense Area_Right_X = " + playerEyePosInSenSorArea_Right_X + ",", "" + "Eye Position In Sense Area_Right_Y = " + playerEyePosInSenSorArea_Right_Y + ",",
                //"" + "Eye Validation Bit Mask_Left = " + playerEyeValid_Left + ",",
                //"" + "Eye Validation Bit Mask_Rigth = " + playerEyeValid_Right + ",",
                //"" + "OBJECT = " + objectBeingLookedAt + "," + " " + System.DateTime.Now.ToString() };
                // Content of the file 
    
                // foreach (string playerInfo in playerEYEData)
                // {
                //File.AppendAllText(path, playerInfo);
    
                //}
    
    
            }
    
        }
    
    /// <summary>
    /// Checks for current object in focus.
    /// </summary>
    public static GameObject Focus()
    {
        if (eye_callback_registered == true)
        {
            if (SRanipal_Eye.Focus(GazeIndex.COMBINE, out testRay, out focusInfo)) { }
            else if (SRanipal_Eye.Focus(GazeIndex.LEFT, out testRay, out focusInfo)) { }
            else if (SRanipal_Eye.Focus(GazeIndex.RIGHT, out testRay, out focusInfo)) { }
            else return null;
        }
        if(focusInfo.collider.name != "Body Collider")
            {
                return focusInfo.collider.gameObject;
            }
        else return null;
    }
    /// <summary>
    /// Checks name for current object in focus.
    /// </summary>
    public static string FocusName()
    {
        if (Focus() is null)
            return "";
        else
            return Focus().name;
    }

     

    TrackPlayer.cs

×
×
  • Create New...