MOnocular Calibration Sample

clear;

Tobii = EyeTrackingOperations();

eyetracker_address = 'Address of the desired device';
% Example:
% eyetracker_address = 'tet-tcp://172.28.195.1';
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
calib = ScreenBasedMonocularCalibration(eyetracker);

try
    calib.enter_calibration_mode()
catch ME
    if (strcmp(ME.identifier,'EnterCalibrationMode:error210'))
        fprintf('The previous calibration was not completed!\n');
        calib.leave_calibration_mode()
        fprintf('Calibration is restarted\n');
        calib.enter_calibration_mode()
    else
        fprintf('%s\n', ME.identifier);
        return
    end
end
points_to_collect = [[0.1,0.1];[0.1,0.9];[0.5,0.5];[0.9,0.1];[0.9,0.9]];

% Desired eye(s) to be calibrated.
eye_to_calibrate = SelectedEye.BOTH;

% When collecting data a point should be presented on the screen in the
% appropriate position.
for i=1:size(points_to_collect,1)
    collect_result = calib.collect_data(points_to_collect(i,:), eye_to_calibrate);
    fprintf('Point [%.2f,%.2f] Collect Result: %s\n',points_to_collect(i,:),char(collect_result.value));
end

calibration_result = calib.compute_and_apply();
fprintf('Calibration Status: %d\n',calibration_result.Status.value.value);

% After analisyng the calibration result one might want to re-calibrate
% some of the points
points_to_collect = [[0.1,0.1];[0.1,0.9];[0.5,0.5];[0.9,0.1];[0.9,0.9]];

% When collecting data a point should be presented on the screen in the
% appropriate position.

points_to_recalibrate = [[0.1,0.1];[0.1,0.9]];

for i=1:size(points_to_recalibrate,1)
    calib.discard_data(points_to_recalibrate(i,:), eye_to_calibrate);
    collect_result = calib.collect_data(points_to_recalibrate(i,:), eye_to_calibrate);
    fprintf('Point [%.2f,%.2f] Collect Result: %s\n',points_to_recalibrate(i,:),char(collect_result.value));
end

calibration_result = calib.compute_and_apply();
fprintf('Calibration Status: %d\n',calibration_result.Status.value.value);

if calibration_result.Status == CalibrationStatus.Success
        points = calibration_result.CalibrationPoints;

        number_points = size(points,2);

        for i=1:number_points
            plot(points(i).PositionOnDisplayArea(1),points(i).PositionOnDisplayArea(2),'ok','LineWidth',10);
            mapping_size = size(points(i).RightEye,2);
            set(gca, 'YDir', 'reverse');
            axis([-0.2 1.2 -0.2 1.2])
            hold on;
            for j=1:mapping_size
                if points(i).LeftEye(j).Validity == CalibrationEyeValidity.ValidAndUsed
                    plot(points(i).LeftEye(j).PositionOnDisplayArea(1), points(i).LeftEye(j).PositionOnDisplayArea(2),'-xr','LineWidth',3);
                end
                if points(i).RightEye(j).Validity == CalibrationEyeValidity.ValidAndUsed
                    plot(points(i).RightEye(j).PositionOnDisplayArea(1),points(i).RightEye(j).PositionOnDisplayArea(2),'xb','LineWidth',3);
                end
            end

        end
end

calib.leave_calibration_mode()