This is example 6. This example demonstrates the following:

  1. Switching the eye-tracker to idle mode

  2. Switching the eye-tracker to setup mode

  3. Switching the eye-tracker to data mode

This example merges example 4 and example 5 and adds a few calls to test switching eye-tracker modes programmatically.

Source code

Source file: example6.c

processInput()

The following single character commands are implemented here:
q: quit
o: open/close device
u: show/hide control window
x: toggle show gui on setup mode
X: toggle show gui on data mode
i: enter idle mode
s: enter setup mode
z: enter data mode
m: toggle show mode-change events

When you press i, s or z then eyevec_enter_idle_mode(), eyevec_enter_setup_mode() resp. eyevec_enter_data_mode() will be called. Doing so should result in onModeChange() function being called on each mode-change.

See also processInput() in example 5 about toggling the show-gui-on-setup-mode and show-gui-on-data-mode flags.

Note, when the user-interface is shown and you go from the Camera page to any of the other pages or vice versa this will also yield a mode change.

static int processInput(EyeVec* eyevec, ClientData* clientdata, int ch)
{
    .
    .
    .
    else if (ch == 'i') {
        err = eyevec_enter_idle_mode(eyevec); (1)
        printError("eyevec_enter_idle_mode()", err);
    }
    else if (ch == 's') {
        err = eyevec_enter_setup_mode(eyevec); (2)
        printError("eyevec_enter_setup_mode()", err);
    }
    else if (ch == 'z') {
#if 0
        err = eyevec_enter_data_mode(eyevec, true);
#else
        err = eyevec_enter_data_mode(eyevec, false); (3)
#endif
        printError("eyevec_enter_data_mode()", err);
    }
    .
    .
    .
}
1 Enter idle mode.
2 Enter setup mode.
3 Enter data mode.

See Eye-tracker modes for a description of the eye-tracker modes.

Running

After a succesful build run the program:

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

  2. Press s to call eyevec_enter_setup_mode(). Eye-tracker should go from idle mode to setup mode.

  3. Press i to call eyevec_enter_idle_mode(). Eye-tracker should go from setup mode to idle mode.

  4. Press z to call eyevec_enter_data_mode(). Eye-tracker should go from idle mode to data mode.

  5. Press o to call eyevec_close(). Eye-tracker should go from data mode to off mode (with brief intermediate idle mode).

  6. Press s to call eyevec_enter_setup_mode(). This should fail due to being in the wrong mode.

  7. 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.

[o]
onModeChange:
    eventtime:                  1750422884589148
    oldmode:                    TRACKER_MODE_OFF
    newmode:                    TRACKER_MODE_IDLE
eyevec_open(): OK

[s]
onModeChange:
    eventtime:                  1750422886480493
    oldmode:                    TRACKER_MODE_IDLE
    newmode:                    TRACKER_MODE_SETUP
eyevec_enter_setup_mode(): OK

[i]
onModeChange:
    eventtime:                  1750422888855638
    oldmode:                    TRACKER_MODE_SETUP
    newmode:                    TRACKER_MODE_IDLE
eyevec_enter_idle_mode(): OK

[z]
onModeChange:
    eventtime:                  1750422892650866
    oldmode:                    TRACKER_MODE_IDLE
    newmode:                    TRACKER_MODE_DATA
eyevec_enter_data_mode(): OK

[o]
onModeChange:
    eventtime:                  1750422894875565
    oldmode:                    TRACKER_MODE_DATA
    newmode:                    TRACKER_MODE_IDLE
onModeChange:
    eventtime:                  1750422894879127
    oldmode:                    TRACKER_MODE_IDLE
    newmode:                    TRACKER_MODE_OFF
eyevec_close(): OK

[s]
eyevec_enter_setup_mode(): Operation not possible in current mode (error -2023)

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

You can also switch the mode while the user-interface is shown. Or make the user-interface show automatically when the eye-tracker enters setup mode. Try it yourself.