Get HMD Gaze Data

clear;

Tobii = EyeTrackingOperations();

eyetracker_address = 'Address of the desired device';
% Example:
% eyetracker_address = 'tet-tcp://10.46.32.51';
try
    eyetracker = Tobii.get_eyetracker(eyetracker_address);
catch ME
    if (strcmp(ME.identifier,'EyeTrackerGet:error204'))
        fprintf('Unable to connect eye tracker.\n');
        return
    end
end

% The first call subscribes to the stream and returns either data
% (might be empty if no data has been received yet) or any error that
% happened during the subscription.
try
    eyetracker.get_hmd_gaze_data();
catch ME
    fprintf(ME.message);
    return
end
pause(1);
result = eyetracker.get_hmd_gaze_data();

if isa(result,'StreamError')
    fprintf('Error: %s\n',string(result.Error.value));
    fprintf('Source: %s\n',string(result.Source.value));
    fprintf('SystemTimeStamp: %d\n',result.SystemTimeStamp);
    fprintf('Message: %s\n',result.Message);

elseif isa(result,'HMDGazeData')

    % Collect data for 1 seconds.
    pause(1);

    % The subsequent calls return the current values in the stream buffer.
    % If a flat structure is prefered just use an extra input 'flat'.
    % i.e. gaze_data = eyetracker.get_gaze_data('flat');
    hmd_gaze_data = eyetracker.get_hmd_gaze_data();

    eyetracker.stop_hmd_gaze_data();

    fprintf('Collected %d data points\n',size(hmd_gaze_data,2));

    % To select the most recent data point simply select the last value of the
    % buffer.
    latest_hmd_gaze_data = hmd_gaze_data(end);

    fprintf('SystemRequestTimeStamp: %d\n',latest_hmd_gaze_data.SystemTimeStamp);
    fprintf('DeviceTimeStamp: %d\n',latest_hmd_gaze_data.DeviceTimeStamp);

    disp('Left Eye');

    fprintf('GazeDirection.UnitVector: %.2f %.2f %.2f\n',latest_hmd_gaze_data.LeftEye.GazeDirection.UnitVector);
    fprintf('GazeDirection.Validity: %s\n',latest_hmd_gaze_data.LeftEye.GazeOrigin.Validity.Value);

    fprintf('GazeOrigin.PositionInHMDCoordinates: %.2f %.2f %.2f\n',latest_hmd_gaze_data.LeftEye.GazeOrigin.PositionInHMDCoordinates);
    fprintf('GazeOrigin.Validity: %s\n',latest_hmd_gaze_data.LeftEye.GazeOrigin.Validity.Value);

    fprintf('Pupil.Diameter: %.2f\n',latest_hmd_gaze_data.LeftEye.Pupil.Diameter);
    fprintf('Pupil.Validity: %s\n',string(latest_hmd_gaze_data.LeftEye.Pupil.Validity.Value));

    fprintf('PupilPosition.PositionInTrackingArea: %.2f %.2f\n',latest_hmd_gaze_data.LeftEye.PupilPosition.PositionInTrackingArea);
    fprintf('PupilPosition.Validity: %s\n',string(latest_hmd_gaze_data.LeftEye.PupilPosition.Validity.Value));

    disp('Right Eye');

    fprintf('GazeDirection.UnitVector: %.2f %.2f %.2f\n',latest_hmd_gaze_data.RightEye.GazeDirection.UnitVector);
    fprintf('GazeDirection.Validity: %s\n',string(latest_hmd_gaze_data.RightEye.GazeOrigin.Validity.Value));

    fprintf('GazeOrigin.PositionInHMDCoordinates: %.2f %.2f %.2f\n',latest_hmd_gaze_data.RightEye.GazeOrigin.PositionInHMDCoordinates);
    fprintf('GazeOrigin.Validity: %s\n',string(latest_hmd_gaze_data.RightEye.GazeOrigin.Validity.Value));

    fprintf('Pupil.Diameter: %.2f\n',latest_hmd_gaze_data.RightEye.Pupil.Diameter);
    fprintf('Pupil.Validity: %s\n',string(latest_hmd_gaze_data.RightEye.Pupil.Validity.Value));

    fprintf('PupilPosition.PositionInTrackingArea: %.2f %.2f\n',latest_hmd_gaze_data.LeftEye.PupilPosition.PositionInTrackingArea);
    fprintf('PupilPosition.Validity: %s\n',string(latest_hmd_gaze_data.LeftEye.PupilPosition.Validity.Value));
end