This is example 12. This example demonstrates the following:

  1. Processing baseline measurement results on baseline procedure completion

This example is based on example 6. It extends the onModeChange() event handler function to print baseline results.

Source code

Source file: example12.c

onModeChange()

In the onModeChange() event handler function we dump baseline results on completion of the baseline measurement procedure.

static int onModeChange(EyeVec* eyevec, int64_t eventtime,
    const EyeVecModeChangeEventData* modedata, void* cldata)
{
    (void)eyevec;

    ClientData* clientdata = (ClientData*)cldata;
    if (clientdata == NULL) return 0;

    clientdata->trackermode = modedata->newmode;

    if (clientdata->showmodechanges) {
        printf("onModeChange:\n");
        printf("    eventtime:                  %" PRId64 "\n",
            eventtime);
        printf("    oldmode:                    %s\n",
            eyevec_tracker_mode_string(modedata->oldmode));
        printf("    newmode:                    %s\n",
            eyevec_tracker_mode_string(modedata->newmode));
        printf("    exitstatus:                 %s\n",
            eyevec_exit_status_string(modedata->exitstatus));
//        printf("    deviceerror:                %d\n",
//            modedata->deviceerror);
    }

    EyeVecResult err;
    int status;
    switch (modedata->oldmode) { (1)
        case EYEVEC_TRACKER_MODE_OFF:
        case EYEVEC_TRACKER_MODE_IDLE:
        case EYEVEC_TRACKER_MODE_SETUP:
        case EYEVEC_TRACKER_MODE_SETUP_TEST:
        case EYEVEC_TRACKER_MODE_SETUP_EVALUATION:
            break;
        case EYEVEC_TRACKER_MODE_SETUP_BASELINE: (1)
            if (clientdata->showprocresults < 1) break;
            if (modedata->exitstatus != EYEVEC_EXIT_STATUS_OK) break; (2)
            err = eyevec_get_baseline_status(eyevec, &status); (3)
            if (err)
                printError("eyevec_get_baseline_status()", err);
            else {
                printf("eyevec_get_baseline_status() -> %d\n", status);
                if (status <= 0) break; // No baseline measurement performed.
                EyeVecBaselineResult result;
                err = eyevec_get_baseline_result(eyevec, &result); (4)
                if (err) {
                    printError("eyevec_get_baseline_result()", err);
                }
                else {
                    printf("eyevec_get_baseline_result() ->\n");
                    if (result.havedata) { (5)
                        printf("    distance                    %.1f\n",
                            (double)result.distance);
                        printf("    ipd                         %.1f\n",
                            (double)result.ipd);
                        for (int n = EYEVEC_RIGHT_EYE; n <= EYEVEC_LEFT_EYE;
                                n++) {
                            if (result.haveeye[n]) {
                                printf("    irissize[%d]                 %.1f\n",
                                    n,
                                    (double)result.irissize[n]);
                                printf("    pupilsize[%d]                %.1f\n",
                                    n,
                                    (double)result.pupilsize[n]);
                                if (clientdata->showprocresults >= 2) {
                                    printf("    pupilrmse[%d]                %.3f, %.3f\n",
                                        n,
                                        (double)result.pupilrmse[n].x,
                                        (double)result.pupilrmse[n].y);
                                    printf("    crrmse[%d]                   %.3f, %.3f\n",
                                        n,
                                        (double)result.crrmse[n].x,
                                        (double)result.crrmse[n].y);
                                }
                            }
                        }
                    }
                    else {
                        printf("    no data\n");
                    }
                }
            }
            break;
        case EYEVEC_TRACKER_MODE_SETUP_CALIBRATION:
        case EYEVEC_TRACKER_MODE_SETUP_VALIDATION:
        case EYEVEC_TRACKER_MODE_SETUP_DRIFT_CHECK:
        case EYEVEC_TRACKER_MODE_SETUP_RECORDING:
        case EYEVEC_TRACKER_MODE_DATA:
        case EYEVEC_TRACKER_MODE_DRIFT_CHECK:
        case EYEVEC_TRACKER_MODE_RECORDING:
            break;
    }
    switch (modedata->newmode) {
        case EYEVEC_TRACKER_MODE_OFF:
        case EYEVEC_TRACKER_MODE_IDLE:
        case EYEVEC_TRACKER_MODE_SETUP:
        case EYEVEC_TRACKER_MODE_SETUP_TEST:
        case EYEVEC_TRACKER_MODE_SETUP_EVALUATION:
        case EYEVEC_TRACKER_MODE_SETUP_BASELINE:
        case EYEVEC_TRACKER_MODE_SETUP_CALIBRATION:
        case EYEVEC_TRACKER_MODE_SETUP_VALIDATION:
        case EYEVEC_TRACKER_MODE_SETUP_DRIFT_CHECK:
        case EYEVEC_TRACKER_MODE_SETUP_RECORDING:
        case EYEVEC_TRACKER_MODE_DATA:
        case EYEVEC_TRACKER_MODE_DRIFT_CHECK:
        case EYEVEC_TRACKER_MODE_RECORDING:
            break;
    }

    return 0;
}
1 Check if the eye-tracker is leaving baseline mode, signifying baseline measurement procedure completion.
2 Check exitstatus of the baseline measurement procedure. If not OK, there’s nothing to print.
3 Check if baseline measurement results are available.
4 Retrieve the baseline measurement results into an EyeVecBaselineResult struct.
5 Check if the result struct contains data and if so proceed with printing the baseline measurement results.

Running

After a succesful build run the program:

  1. Press x to call eyevec_set_show_gui_on_setup_mode(). This sets the show-gui-on-setup-mode flag to make the user-interface show on setup mode enter.

  2. Press o to call eyevec_open(). Eye-tracker should go from off mode to idle mode.

  3. Press s to call eyevec_enter_setup_mode(). Eye-tracker should go from idle mode to setup mode. Now perform the baseline measurement.

  4. Press q to quit.

Output might look like this (empty lines added for clarity):

eyevec_create_thread(): OK
eyevec_initialize(): OK
Type q to quit, ? for help.

[x]
eyevec_set_show_gui_on_setup_mode(true): OK

[o]
eyevec_open(): OK
onModeChange:
    eventtime:                  1750676186339785
    oldmode:                    TRACKER_MODE_OFF
    newmode:                    TRACKER_MODE_IDLE
    exitstatus:                 EXIT_STATUS_NONE

[s]
onModeChange:
    eventtime:                  1750676188250067
eyevec_enter_setup_mode(): OK
    oldmode:                    TRACKER_MODE_IDLE
    newmode:                    TRACKER_MODE_SETUP
    exitstatus:                 EXIT_STATUS_NONE

onModeChange:
    eventtime:                  1750676191281540
    oldmode:                    TRACKER_MODE_SETUP
    newmode:                    TRACKER_MODE_SETUP_BASELINE
    exitstatus:                 EXIT_STATUS_NONE
onModeChange:
    eventtime:                  1750676194833342
    oldmode:                    TRACKER_MODE_SETUP_BASELINE
    newmode:                    TRACKER_MODE_SETUP
    exitstatus:                 EXIT_STATUS_OK

eyevec_get_baseline_status() -> 1
eyevec_get_baseline_result() ->
    distance                    650.0
    ipd                         58.7
    irissize[0]                 13.3
    pupilsize[0]                3.6
    irissize[1]                 13.2
    pupilsize[1]                3.9

[q]
eyevec_cleanup(): OK
eyevec_destroy_thread(): OK

The results printed are the same as shown in the user-interface.

Repeating the above with showprocresults in the client data struct raised to 2 will also print the noise levels of the pupil and corneal reflection.