This is example 12. This example demonstrates the following:
-
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:
-
Press
x
to calleyevec_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. -
Press
o
to calleyevec_open()
. Eye-tracker should go from off mode to idle mode. -
Press
s
to calleyevec_enter_setup_mode()
. Eye-tracker should go from idle mode to setup mode. Now perform the baseline measurement. -
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.