// SEAN -new actual int run_trials(void) { int i=0; target_foreground_color = RGB(0,0,0); // set background for calibration target_background_color = RGB(255,255,255); // This should match the display set_calibration_colors(target_foreground_color, target_background_color); /*TRIAL_VAR_LABELS message is recorded for EyeLink Data Viewer analysis It specifies the list of trial variables for the trial This should be written once only and put before the recording of individual trials */ eyemsg_printf("TRIAL_VAR_LABELS TRIAL_WORD"); /* PERFORM CAMERA SETUP, CALIBRATION */ do_tracker_setup(); //SEAN -moved from win_main sean_window(sean_nCmdShow, &sean_lpCmdLine); if(eyelink_is_connected()==0 || break_pressed()) /* drop out if link closed */ { return ABORT_EXPT; } return 0; }
bool Eyelink::startDeviceIO(){ boost::mutex::scoped_lock lock(EyelinkDriverLock); if(eyelink_is_connected() && stopped) { //Eyelink to offline mode set_offline_mode(); // Eyelink to record mode if( start_recording(0,1,1,0) ) { merror(M_IODEVICE_MESSAGE_DOMAIN, "Eyelink does not start!"); } shared_ptr<Scheduler> scheduler = Scheduler::instance(); shared_ptr<Eyelink> this_one = component_shared_from_this<Eyelink>(); schedule_node = scheduler->scheduleUS(std::string(FILELINE ": ") + getTag(), update_period, //defer first start one period update_period, //repeat interval M_REPEAT_INDEFINITELY, boost::bind(update_, this_one), M_DEFAULT_IODEVICE_PRIORITY, M_DEFAULT_IODEVICE_WARN_SLOP_US, M_DEFAULT_IODEVICE_FAIL_SLOP_US, M_MISSED_EXECUTION_DROP); stopped = false; mprintf(M_IODEVICE_MESSAGE_DOMAIN, "Eyelink successfully started."); } else { mwarning(M_IODEVICE_MESSAGE_DOMAIN, "Warning! Could not start EyeLink! (StartIO)"); } return !stopped; }
Eyelink::~Eyelink(){ boost::mutex::scoped_lock lock(EyelinkDriverLock); if (Eyelink_Initialized) { if (!stopped) { mwarning(M_IODEVICE_MESSAGE_DOMAIN,"Eyelink is still running !"); //eyelink stop recording if(eyelink_is_connected()) { stop_recording(); } } if (schedule_node) { schedule_node->cancel(); schedule_node.reset(); } if(eyelink_is_connected()) { // Places EyeLink tracker in off-line (idle) mode set_offline_mode(); // close any open data files if ( close_data_file() == 0 ) { mprintf(M_IODEVICE_MESSAGE_DOMAIN,"Eyelink closed data file %s.",data_file_name); } if (eyelink_close(1)) // disconnect from tracker { merror(M_IODEVICE_MESSAGE_DOMAIN, "Could not close Eyelink connection"); } //close_eyelink_system(); mprintf(M_IODEVICE_MESSAGE_DOMAIN, "Eyelink %d System Version %s disconnected.",tracker_version,version_info); } else { mwarning(M_IODEVICE_MESSAGE_DOMAIN,"Error, Eyelink Shutdown failed"); } Eyelink_Initialized = false; } }
//SEAN excluded int run_trials_org(void) { int i=0; int trial; target_foreground_color = RGB(0,0,0); // set background for calibration target_background_color = RGB(255,255,255); // This should match the display set_calibration_colors(target_foreground_color, target_background_color); /*TRIAL_VAR_LABELS message is recorded for EyeLink Data Viewer analysis It specifies the list of trial variables for the trial This should be written once only and put before the recording of individual trials */ eyemsg_printf("TRIAL_VAR_LABELS TRIAL_WORD"); /* PERFORM CAMERA SETUP, CALIBRATION */ do_tracker_setup(); /* loop through trials */ for(trial=1;trial<=NTRIALS;trial++) { if(eyelink_is_connected()==0 || break_pressed()) /* drop out if link closed */ { return ABORT_EXPT; } /* RUN THE TRIAL */ i = do_simple_trial(trial); end_realtime_mode(); // safety: make sure realtime mode stopped switch(i) /* REPORT ANY ERRORS */ { case ABORT_EXPT: /* handle experiment abort or disconnect */ eyemsg_printf("EXPERIMENT ABORTED"); return ABORT_EXPT; case REPEAT_TRIAL: /* trial restart requested */ eyemsg_printf("TRIAL REPEATED"); trial--; break; case SKIP_TRIAL: /* skip trial */ eyemsg_printf("TRIAL ABORTED"); break; case TRIAL_OK: // successful trial eyemsg_printf("TRIAL OK"); break; default: // other error code eyemsg_printf("TRIAL ERROR"); break; } } // END OF TRIAL LOOP return 0; }
/* from the tracker ABORT menu. */ int run_trials(void) { int i; int trial; // INITIAL CALIBRATION: matches following trials target_foreground_color = RGB(0,0,0); // color of calibration target target_background_color = RGB(200,200,200); // background for drift correction set_calibration_colors(target_foreground_color, target_background_color); // tell EXPTSPPT the colors // TRIAL_VAR_LABELS message is recorded for EyeLink Data Viewer analysis // It specifies the list of trial variables for the trial // This should be written once only and put before the recording of individual trials eyemsg_printf("TRIAL_VAR_LABELS TYPE CENTRAL PERIPHERAL"); if(SCRWIDTH!=800 || SCRHEIGHT!=600) alert_printf("Display mode is not 800x600, resizing will slow loading."); /* PERFORM CAMERA SETUP, CALIBRATION */ do_tracker_setup(); /* loop through trials */ for(trial=1;trial<=NTRIALS;trial++) { if(eyelink_is_connected()==0 || break_pressed()) /* drop out if link closed */ { return ABORT_EXPT; } /* RUN THE TRIAL */ i = do_gcwindow_trial(trial); end_realtime_mode(); switch(i) /* REPORT ANY ERRORS */ { case ABORT_EXPT: /* handle experiment abort or disconnect */ eyemsg_printf("EXPERIMENT ABORTED"); return ABORT_EXPT; case REPEAT_TRIAL: /* trial restart requested */ eyemsg_printf("TRIAL REPEATED"); trial--; break; case SKIP_TRIAL: /* skip trial */ eyemsg_printf("TRIAL ABORTED"); break; case TRIAL_OK: // successful trial eyemsg_printf("TRIAL OK"); break; default: // other error code eyemsg_printf("TRIAL ERROR"); break; } } // END OF TRIAL LOOP return 0; }
/******************************** TRIAL LOOP ************************************ This code sequences trials within a block It calls run_trial() to execute a trial, then interperts result code. It places a result message in the EDF file. This example allows trials to be repeated from the tracker ABORT menu. ********************************************************************************/ int run_trials(void) { int i; int trial; SETCOLOR(target_foreground_color,0,0,0); /* set background for calibration */ SETCOLOR(target_background_color,255,255,255); /* This should match the display */ set_calibration_colors(&target_foreground_color, &target_background_color); /* PERFORM CAMERA SETUP, CALIBRATION */ do_tracker_setup(); /* loop through trials */ for(trial=1;trial<=NTRIALS;trial++) { if(eyelink_is_connected()==0 || break_pressed()) /* drop out if link closed */ { return ABORT_EXPT; } /* RUN THE TRIAL */ i = do_simple_trial(trial); end_realtime_mode(); /* safety: make sure realtime mode stopped */ switch(i) /* REPORT ANY ERRORS */ { case ABORT_EXPT: /* handle experiment abort or disconnect */ eyemsg_printf("EXPERIMENT ABORTED"); return ABORT_EXPT; case REPEAT_TRIAL: /* trial restart requested */ eyemsg_printf("TRIAL REPEATED"); trial--; break; case SKIP_TRIAL: /* skip trial */ eyemsg_printf("TRIAL ABORTED"); break; case TRIAL_OK: /* successful trial */ eyemsg_printf("TRIAL OK"); break; default: /* other error code */ eyemsg_printf("TRIAL ERROR"); break; } } /* END OF TRIAL LOOP */ return 0; }
bool Eyelink::stopDeviceIO() { boost::mutex::scoped_lock lock(EyelinkDriverLock); if(!stopped) { if (schedule_node) { schedule_node->cancel(); schedule_node.reset(); } if(eyelink_is_connected()) { //eyelink stop recording stop_recording(); //go to eyelink offline mode set_offline_mode(); } else mwarning(M_IODEVICE_MESSAGE_DOMAIN, "Warning! Could not stop EyeLink! Connection Lost!! (StopIO)"); if (e_time != NULL) e_time -> setValue( (float)MISSING_DATA ); if (e_rx != NULL) e_rx -> setValue( (float)MISSING_DATA ); if (e_ry != NULL) e_ry -> setValue( (float)MISSING_DATA ); if (e_lx != NULL) e_lx -> setValue( (float)MISSING_DATA ); if (e_ly != NULL) e_ly -> setValue( (float)MISSING_DATA ); if (e_x != NULL) e_x -> setValue( (float)MISSING_DATA ); if (e_y != NULL) e_y -> setValue( (float)MISSING_DATA ); if (e_z != NULL) e_z -> setValue( (float)MISSING_DATA ); if (h_rx != NULL) h_rx -> setValue( (float)MISSING_DATA ); if (h_ry != NULL) h_ry -> setValue( (float)MISSING_DATA ); if (h_lx != NULL) h_lx -> setValue( (float)MISSING_DATA ); if (h_ly != NULL) h_ly -> setValue( (float)MISSING_DATA ); if (p_rx != NULL) p_rx -> setValue( (float)MISSING_DATA ); if (p_ry != NULL) p_ry -> setValue( (float)MISSING_DATA ); if (p_lx != NULL) p_lx -> setValue( (float)MISSING_DATA ); if (p_ly != NULL) p_ly -> setValue( (float)MISSING_DATA ); if (p_r != NULL) p_r -> setValue( (float)MISSING_DATA ); if (p_l != NULL) p_l -> setValue( (float)MISSING_DATA ); stopped = true; mprintf(M_IODEVICE_MESSAGE_DOMAIN, "Eyelink successfully stopped."); } return stopped; }
int app_main(char * trackerip, DISPLAYINFO * disp) { UINT16 i, j; char our_file_name[260] = "TEST"; char verstr[50]; int eyelink_ver = 0; int tracker_software_ver = 0; if(trackerip) set_eyelink_address(trackerip); if(open_eyelink_connection(0)) return -1; /* abort if we can't open link */ set_offline_mode(); flush_getkey_queue(); /* initialize getkey() system */ eyelink_ver = eyelink_get_tracker_version(verstr); if (eyelink_ver == 3) tracker_software_ver = get_tracker_sw_version(verstr); if(init_expt_graphics(NULL, disp)) goto shutdown; /* register window with EXPTSPPT */ window = SDL_GetVideoSurface(); get_display_information(&dispinfo); /* get window size, characteristics */ /* NOTE: Camera display does not support 16-color modes NOTE: Picture display examples don't work well with 256-color modes However, all other sample programs should work well. */ if(dispinfo.palsize) /* 256-color modes: palettes not supported by this example */ alert_printf("This program is not optimized for 256-color displays"); i = SCRWIDTH/60; /* select best size for calibration target */ j = SCRWIDTH/300; /* and focal spot in target */ if(j < 2) j = 2; set_target_size(i, j); /* tell DLL the size of target features */ /* color of calibration target */ SETCOLOR(target_foreground_color, 0,0,0); /* background for calibration and drift correction */ SETCOLOR(target_background_color, 128,128,128); /* tell EXPTSPPT the colors */ set_calibration_colors(&target_foreground_color, &target_background_color); set_cal_sounds("", "", ""); set_dcorr_sounds("", "off", "off"); /* draw a title screen */ clear_full_screen_window(target_background_color); /* clear screen */ get_new_font("Times Roman", SCRHEIGHT/32, 1); /* select a font */ /* Draw text */ graphic_printf(window, target_foreground_color, CENTER, SCRWIDTH/2, 1*SCRHEIGHT/30, "EyeLink Demonstration Experiment: Communicate with Listener"); graphic_printf(window, target_foreground_color, CENTER, SCRWIDTH/2, 2*SCRHEIGHT/30, "Included with the Experiment Programming Kit for Windows"); graphic_printf(window, target_foreground_color, CENTER, SCRWIDTH/2, 3*SCRHEIGHT/30, "All code is Copyright (c) 1997-2002 SR Research Ltd."); graphic_printf(window, target_foreground_color, CENTER, SCRWIDTH/5, 4*SCRHEIGHT/30, "Source code may be used as template for your experiments."); SDL_Flip(window); eyelink_set_name("comm_simple"); /* NEW: set our network name */ if(check_for_listener()) /* check for COMM_LISTENER application */ { alert_printf("Could not communicate with COMM_LISTENER application."); goto shutdown; } if(i==1) our_file_name[0] = 0; /* Cancelled: No file name */ if(our_file_name[0]) /* If file name set, open it */ { if(!strstr(our_file_name, ".")) strcat(our_file_name, ".EDF"); /* add extension */ i = open_data_file(our_file_name); /* open file */ if(i!=0) /* check for error */ { alert_printf("Cannot create EDF file '%s'", our_file_name); goto shutdown; } /* add title to preamble */ eyecmd_printf("add_file_preamble_text 'RECORDED BY %s' ", program_name); } /* SET UP TRACKER CONFIGURATION NOTE: set contents before sending messages! set EDF file contents */ if(eyelink_ver>=2) { eyecmd_printf("select_parser_configuration 0"); // 0 = standard sensitivity if(eyelink_ver == 2) //turn off scenelink camera stuff { eyecmd_printf("scene_camera_gazemap = NO"); } } else { eyecmd_printf("saccade_velocity_threshold = 35"); eyecmd_printf("saccade_acceleration_threshold = 9500"); } // NOTE: set contents before sending messages! // set EDF file contents eyecmd_printf("file_event_filter = LEFT,RIGHT,FIXATION,SACCADE,BLINK,MESSAGE,BUTTON"); eyecmd_printf("file_sample_data = LEFT,RIGHT,GAZE,AREA,GAZERES,STATUS%s",(tracker_software_ver>=4)?",HTARGET":""); // set link data (used for gaze cursor) eyecmd_printf("link_event_filter = LEFT,RIGHT,FIXATION,SACCADE,BLINK,BUTTON"); eyecmd_printf("link_sample_data = LEFT,RIGHT,GAZE,GAZERES,AREA,STATUS%s",(tracker_software_ver>=4)?",HTARGET":""); /* NEW: Allow EyeLink I (v2.1+) to echo messages back to listener */ eyecmd_printf("link_nonrecord_events = BUTTONS, MESSAGES"); /* Program button #5 for use in drift correction */ eyecmd_printf("button_function 5 'accept_target_fixation'"); /* Now configure tracker for display resolution */ eyecmd_printf("screen_pixel_coords = %ld %ld %ld %ld", /* Set display resolution */ dispinfo.left, dispinfo.top, dispinfo.right, dispinfo.bottom); eyecmd_printf("calibration_type = HV9"); /* Setup calibration type */ eyemsg_printf("DISPLAY_COORDS %ld %ld %ld %ld",/* Add resolution to EDF file */ dispinfo.left, dispinfo.top, dispinfo.right, dispinfo.bottom); if(dispinfo.refresh>40) eyemsg_printf("FRAMERATE %1.2f Hz.", dispinfo.refresh); /* make sure we're still alive */ if(!eyelink_is_connected() || break_pressed()) goto end_expt; /* RUN THE EXPERIMENTAL TRIALS (code depends on type of experiment) Calling run_trials() performs a calibration followed by trials This is equivalent to one block of an experiment It will return ABORT_EXPT if the program should exit */ i = run_trials(); end_expt: /* END: close, transfer EDF file */ set_offline_mode(); /* set offline mode so we can transfer file */ pump_delay(500); /* delay so tracker is ready */ eyecmd_printf("close_data_file"); /* close data file */ if(break_pressed()) goto shutdown;/* don't get file if we aborted experiment */ if(our_file_name[0]) /* make sure we created a file */ receive_data_file(our_file_name, "", 0); /* transfer the file, ask for a local name */ shutdown: /* CLEANUP */ close_expt_graphics(); /* tell EXPTSPPT to release window */ close_eyelink_connection(); /* disconnect from tracker */ return 0; }
app_main() { int i, j; char our_file_name[260] = "TEST"; if(open_eyelink_connection(0)) return -1; // abort if we can't open link set_offline_mode(); flush_getkey_queue(); // initialize getkey() system is_eyelink2 = (2 == eyelink_get_tracker_version(NULL) ); get_display_information(&dispinfo); // get window size, characteristics // NOTE: Camera display does not support 16-color modes // NOTE: Picture display examples don't work well with 256-color modes // However, all other sample programs should work well. if(dispinfo.palsize==16) // 16-color modes not functional { alert_printf("This program cannot use 16-color displays"); goto shutdown; } if(dispinfo.refresh < 40) // wait_for_refresh doesn't work! { alert_printf("No refresh synchroniztion available!"); } if(dispinfo.palsize) // 256-color modes: palettes not supported by this example { alert_printf("This program is not optimized for 256-color displays"); } //SEAN -display window if(make_full_screen_window(application_instance)) goto shutdown; // create the window if(init_expt_graphics(full_screen_window, NULL)) goto shutdown; // register window with EXPTSPPT i = SCRWIDTH/60; // select best size for calibration target j = SCRWIDTH/300; // and focal spot in target if(j < 2) j = 2; set_target_size(i, j); // tell DLL the size of target features target_foreground_color = RGB(0,0,0); // color of calibration target target_background_color = RGB(128,128,128); // background for calibration and drift correction set_calibration_colors(target_foreground_color, target_background_color); // tell EXPTSPPT the colors set_cal_sounds("", "", ""); set_dcorr_sounds("", "off", "off"); // draw a title screen // SEAN clear_full_screen_window(target_background_color); // clear screen get_new_font("Times Roman", SCRHEIGHT/32, 1); // select a font // Draw text graphic_printf(target_foreground_color, target_background_color, 1, SCRWIDTH/2, 1*SCRHEIGHT/30, "EyeLink Demonstration Experiment: Sample Code"); graphic_printf(target_foreground_color, target_background_color, 1, SCRWIDTH/2, 2*SCRHEIGHT/30, "Included with the Experiment Programming Kit for Windows"); graphic_printf(target_foreground_color, target_background_color, 1, SCRWIDTH/2, 3*SCRHEIGHT/30, "All code is Copyright (c) 1997-2002 SR Research Ltd."); graphic_printf(target_foreground_color, target_background_color, 0, SCRWIDTH/5, 4*SCRHEIGHT/30, "Source code may be used as template for your experiments."); //SEAN - file i/o i = edit_dialog(full_screen_window, "Create EDF File", // Get the EDF file name "Enter Tracker EDF file name:", our_file_name, 8); if(i==-1) goto shutdown; // ALT-F4: terminate if(i==1) our_file_name[0] = 0; // Cancelled: No file name if(our_file_name[0]) // If file name set, open it { if(!strstr(our_file_name, ".")) strcat(our_file_name, ".EDF"); // add extension i = open_data_file(our_file_name); // open file if(i!=0) // check for error { alert_printf("Cannot create EDF file '%s'", our_file_name); goto shutdown; } // add title to preamble eyecmd_printf("add_file_preamble_text 'RECORDED BY %s' ", program_name); } // Now configure tracker for display resolution eyecmd_printf("screen_pixel_coords = %ld %ld %ld %ld", // Set display resolution dispinfo.left, dispinfo.top, dispinfo.right, dispinfo.bottom); eyecmd_printf("calibration_type = HV9"); // Setup calibration type eyemsg_printf("DISPLAY_COORDS %ld %ld %ld %ld", // Add resolution to EDF file dispinfo.left, dispinfo.top, dispinfo.right, dispinfo.bottom); if(dispinfo.refresh>40) eyemsg_printf("FRAMERATE %1.2f Hz.", dispinfo.refresh); // SET UP TRACKER CONFIGURATION // set parser saccade thresholds (conservative settings) if(is_eyelink2) { eyecmd_printf("select_parser_configuration 0"); // 0 = standard sensitivity } else { eyecmd_printf("saccade_velocity_threshold = 35"); eyecmd_printf("saccade_acceleration_threshold = 9500"); } // set EDF file contents eyecmd_printf("file_event_filter = LEFT,RIGHT,FIXATION,SACCADE,BLINK,MESSAGE,BUTTON"); eyecmd_printf("file_sample_data = LEFT,RIGHT,GAZE,AREA,GAZERES,STATUS"); // set link data (used for gaze cursor) eyecmd_printf("link_event_filter = LEFT,RIGHT,FIXATION,SACCADE,BLINK,BUTTON"); eyecmd_printf("link_sample_data = LEFT,RIGHT,GAZE,GAZERES,AREA,STATUS"); // Program button #5 for use in drift correction eyecmd_printf("button_function 5 'accept_target_fixation'"); if(!eyelink_is_connected() || break_pressed()) goto end_expt; // make sure we're still alive // RUN THE EXPERIMENTAL TRIALS (code depends on type of experiment) // Calling run_trials() performs a calibration followed by trials // This is equivalent to one block of an experiment // It will return ABORT_EXPT if the program should exit i = run_trials(); end_expt: // END: close, transfer EDF file set_offline_mode(); // set offline mode so we can transfer file pump_delay(500); // delay so tracker is ready eyecmd_printf("close_data_file"); // close data file if(break_pressed()) goto shutdown; // don't get file if we aborted experiment if(our_file_name[0]) // make sure we created a file receive_data_file(our_file_name, "", 0); // transfer the file, ask for a local name shutdown: // CLEANUP close_expt_graphics(); // tell EXPTSPPT to release window close_eyelink_connection(); // disconnect from tracker close_full_screen_window(); return 0; }
int gaze_control_trial(UINT32 time_limit) { UINT32 trial_start; /* trial start time (for timeout) */ UINT32 drawing_time; /* retrace-to-draw delay*/ int button; /* the button pressed (0 if timeout) */ int error; /* trial result code*/ ALLF_DATA evt; /* buffer to hold sample and event data*/ int eye_used = -1; /* indicates which eye's data to display*/ int i; SDL_Surface *gbm; /* The bitmap containing the stimulus display*/ /* This supplies the title at the bottom of the eyetracker display */ eyecmd_printf("record_status_message 'GAZE CONTROL TRIAL' "); /* Always send a TRIALID message before starting to record. It should contain trial condition data required for analysis. */ eyemsg_printf("TRIALID CONTROL"); /* TRIAL_VAR_DATA message is recorded for EyeLink Data Viewer analysis It specifies the list of trial variables value for the trial This must be specified within the scope of an individual trial (i.e., after "TRIALID" and before "TRIAL_RESULT") */ eyemsg_printf("!V TRIAL_VAR_DATA GAZECTRL"); /* IMGLOAD command is recorded for EyeLink Data Viewer analysis It displays a default image on the overlay mode of the trial viewer screen. Writes the image filename + path info */ eyemsg_printf("!V IMGLOAD FILL images/grid.png"); /* IAREA command is recorded for EyeLink Data Viewer analysis It creates a set of interest areas by reading the segment files Writes segmentation filename + path info */ eyemsg_printf("!V IAREA FILE segments/grid.ias"); /* Before recording, we place reference graphics on the EyeLink display*/ set_offline_mode(); /* Must be offline to draw to EyeLink screen*/ gbm = draw_grid_to_bitmap_segment("grid.ias", "segments", 1);;/* Draw bitmap and EyeLink reference graphics*/ segment_source = gbm; /* Save bitmap and transfer to the tracker pc. Since it takes a long to save the bitmap to the file, the value of sv_options should be set as SV_NOREPLACE to save time */ bitmap_save_and_backdrop(gbm, 0, 0, 0, 0, "grid.png", "images", SV_NOREPLACE, 0, 0, (UINT16)(BX_MAXCONTRAST|((eyelink_get_tracker_version(NULL)>=2)?0:BX_GRAYSCALE))); /* DO PRE-TRIAL DRIFT CORRECTION */ /* We repeat if ESC key pressed to do setup. */ while(1) { /* Check link often so we can exit if tracker stopped*/ if(!eyelink_is_connected()) return ABORT_EXPT; /* We let do_drift_correct() draw target in this example*/ /* 3rd argument would be 0 if we already drew the display*/ error = do_drift_correct((INT16)(SCRWIDTH/2), (INT16)(SCRHEIGHT/2), 1, 1); /* repeat if ESC was pressed to access Setup menu */ if(error!=27) break; } clear_full_screen_window(target_background_color); /* make sure display is blank*/ /* Configure EyeLink to send fixation updates every 50 msec*/ eyecmd_printf("link_event_filter = LEFT,RIGHT,FIXUPDATE"); eyecmd_printf("fixation_update_interval = 50"); eyecmd_printf("fixation_update_accumulate = 50"); init_regions(); /* Initialize regions for this display*/ /* Start data recording to EDF file, BEFORE DISPLAYING STIMULUS You should always start recording 50-100 msec before required otherwise you may lose a few msec of data */ error = start_recording(1,1,0,1); /* send events only through link*/ if(error != 0) /* ERROR: couldn't start recording*/ { SDL_FreeSurface(gbm); /* Be sure to delete bitmap before exiting!*/ return error; /* Return the error code*/ } /* record for 100 msec before displaying stimulus */ begin_realtime_mode(100); /* Windows 2000/XP: no interruptions from now on*/ /* DISPLAY OUR IMAGE TO SUBJECT by copying bitmap to display Because of faster drawing speeds and good refresh locking, we now place the stimulus onset message just after display refresh and before drawing the stimulus. This is accurate and will allow drawing a new stimulus each display refresh. However, we do NOT send the message after the retrace--this may take too long instead, we add a number to the message that represents the delay from the event to the message in msec */ /* COPY BITMAP to display*/ SDL_BlitSurface(gbm, NULL, window,NULL); Flip(window); drawing_time = current_msec(); /* time of retrace*/ trial_start = drawing_time; SDL_BlitSurface(gbm, NULL, window,NULL); /* delay from retrace (time to draw)*/ drawing_time = current_msec()-drawing_time; /* message for RT recording in analysis */ eyemsg_printf("%d DISPLAY ON", drawing_time); /* message marks zero-plot time for EDFVIEW */ eyemsg_printf("SYNCTIME %d", drawing_time); /* Print a title for the trial (for demo only)*/ get_new_font("Times Roman", 24, 1); graphic_printf(window,target_foreground_color, NONE, SCRWIDTH/2, 24, "Gaze Control Trial"); if(!eyelink_wait_for_block_start(100, 0, 1)) /* wait for link event data*/ { end_trial(); alert_printf("ERROR: No link events received!"); return TRIAL_ERROR; } eye_used = eyelink_eye_available(); /* determine which eye(s) are available*/ switch(eye_used) /* select eye, add annotation to EDF file */ { case RIGHT_EYE: eyemsg_printf("EYE_USED 1 RIGHT"); break; case BINOCULAR: /* both eye's data present: use left eye only*/ eye_used = LEFT_EYE; case LEFT_EYE: eyemsg_printf("EYE_USED 0 LEFT"); break; } /* Now get ready for trial loop*/ eyelink_flush_keybuttons(0); /* reset keys and buttons from tracker */ /* we don't use getkey() especially in a time-critical trial as Windows may interrupt us and cause an unpredicatable delay so we would use buttons or tracker keys only Trial loop: till timeout or response -- added code for processing FIXUPDATE events */ while(1) { /* First, check if recording aborted */ if((error=check_recording())!=0) return error; /* Check if trial time limit expired*/ if(current_time() > trial_start+time_limit) { eyemsg_printf("TIMEOUT"); /* message to log the timeout */ end_trial(); /* local function to stop recording*/ button = 0; /* trial result message is 0 if timeout */ break; /* exit trial loop*/ } if(break_pressed()) /* check for program termination or ALT-F4 or CTRL-C keys*/ { end_trial(); /* local function to stop recording*/ return ABORT_EXPT; /* return this code to terminate experiment*/ } /* check for local ESC key to abort trial (useful in debugging) */ if(escape_pressed()) { end_trial(); /* local function to stop recording*/ return SKIP_TRIAL; /* return this code if trial terminated*/ } /* BUTTON RESPONSE TEST */ /* Check for eye-tracker buttons pressed /* This is the preferred way to get response data or end trials */ button = eyelink_last_button_press(NULL); if(button!=0) /* button number, or 0 if none pressed*/ { /* message to log the button press*/ eyemsg_printf("ENDBUTTON %d", button); /* local function to stop recording*/ end_trial(); break; /* exit trial loop*/ } /* GET FIXUPDATE EVENTS, PROCESS*/ i = eyelink_get_next_data(NULL); /* Check for data from link*/ if(i == FIXUPDATE) /* only process FIXUPDATE events*/ { /* get a copy of the FIXUPDATE event */ eyelink_get_float_data(&evt); /* only process if it's from the desired eye?*/ if(evt.fe.eye == eye_used) { /* get average position and duration of the update */ process_fixupdate((int)(evt.fe.gavx), (int)(evt.fe.gavy),/* Process event */ evt.fe.entime-evt.fe.sttime); } } }/* end of loop*/ /* report response result: 0=timeout, else button number*/ eyemsg_printf("TRIAL_RESULT %d", button); /* Call this at the end of the trial, to handle special conditions*/ SDL_FreeSurface(gbm); segment_source = NULL; return check_record_exit(); }
// Trial using bitmap copying // Caller must create and destroy the bitmap int bitmap_recording_trial(HBITMAP gbm, UINT32 time_limit) { UINT32 trial_start; // trial start time (for timeout) UINT32 drawing_time; // retrace-to-draw delay int button; // the button pressed (0 if timeout) int error; // trial result code // NOTE: TRIALID AND TITLE MUST HAVE BEEN SET BEFORE DRIFT CORRECTION! // FAILURE TO INCLUDE THESE MAY CAUSE INCOMPATIBILITIES WITH ANALYSIS SOFTWARE! // DO PRE-TRIAL DRIFT CORRECTION // We repeat if ESC key pressed to do setup. while(1) { // Check link often so we can exit if tracker stopped if(!eyelink_is_connected()) return ABORT_EXPT; // We let do_drift_correct() draw target in this example // 3rd argument would be 0 if we already drew the fixation target error = do_drift_correct((INT16)(SCRWIDTH/2), (INT16)(SCRHEIGHT/2), 1, 1); // repeat if ESC was pressed to access Setup menu if(error!=27) break; } clear_full_screen_window(target_background_color); // make sure display is blank // Start data recording to EDF file, BEFORE DISPLAYING STIMULUS // You should always start recording 50-100 msec before required // otherwise you may lose a few msec of data error = start_recording(1,1,0,0); // record samples and events to EDF file only if(error != 0) return error; // ERROR: couldn't start recording // record for 100 msec before displaying stimulus begin_realtime_mode(100); // Windows 2000/XP: no interruptions till display start marked // DISPLAY OUR IMAGE TO SUBJECT by copying bitmap to display // Because of faster drawing speeds and good refresh locking, // we now place the stimulus onset message just after display refresh // and before drawing the stimulus. This is accurate and will allow // drawing a new stimulus each display refresh. // However, we do NOT send the message after the retrace--this may take too long // instead, we add a number to the message that represents the delay // from the event to the message in msec wait_for_video_refresh(); // synchronize before drawing so all seen at once drawing_time = current_msec(); // time of retrace trial_start = drawing_time; // record the display onset time display_bitmap(full_screen_window, gbm, 0, 0); // COPY BITMAP to display wait_for_drawing(full_screen_window); // wait till bitmap copy finished drawing_time = current_msec()-drawing_time; // delay from retrace (time to draw) eyemsg_printf("%d DISPLAY ON", drawing_time); // message for RT recording in analysis eyemsg_printf("SYNCTIME %d", drawing_time); // message marks zero-plot time for EDFVIEW // we would stay in realtime mode if timing is critical // for example, if a dynamic (changing) stimulus was used // or if display duration accuracy of 1 video refresh. was needed end_realtime_mode(); // we don't care as much about time now, allow keyboard to work // Now get ready for trial loop eyelink_flush_keybuttons(0); // reset keys and buttons from tracker // we don't use getkey() especially in a time-critical trial // as Windows may interrupt us and cause an unpredicatable delay // so we would use buttons or tracker keys only // Trial loop: till timeout or response while(1) { // First, check if recording aborted if((error=check_recording())!=0) return error; // Check if trial time limit expired if(current_time() > trial_start+time_limit) { eyemsg_printf("TIMEOUT"); // message to log the timeout end_trial(); // local function to stop recording button = 0; // trial result message is 0 if timeout break; // exit trial loop } if(break_pressed()) // check for program termination or ALT-F4 or CTRL-C keys { end_trial(); // local function to stop recording return ABORT_EXPT; // return this code to terminate experiment } if(escape_pressed()) // check for local ESC key to abort trial (useful in debugging) { end_trial(); // local function to stop recording return SKIP_TRIAL; // return this code if trial terminated } /* BUTTON RESPONSE TEST */ // Check for eye-tracker buttons pressed // This is the preferred way to get response data or end trials button = eyelink_last_button_press(NULL); if(button!=0) // button number, or 0 if none pressed { eyemsg_printf("ENDBUTTON %d", button); // message to log the button press end_trial(); // local function to stop recording break; // exit trial loop } } // END OF RECORDING LOOP end_realtime_mode(); // safety cleanup code while(getkey()); // dump any accumulated key presses // report response result: 0=timeout, else button number eyemsg_printf("TRIAL_RESULT %d", button); // Call this at the end of the trial, to handle special conditions return check_record_exit(); }
// Run gaze-contingent window trial // <fgbm> is bitmap to display within window // <bgbm> is bitmap to display outside window // <wwidth, wheight> is size of window in pixels // <mask> flags whether to treat window as a mask // <time_limit> is the maximum time the stimuli are displayed int gc_window_trial(HBITMAP fgbm, HBITMAP bgbm, int wwidth, int wheight, int mask, UINT32 time_limit) { UINT32 trial_start=0; // trial start time (for timeout) UINT32 drawing_time; // retrace-to-draw delay int button; // the button pressed (0 if timeout) int error; // trial result code ALLF_DATA evt; // buffer to hold sample and event data int first_display = 1; // used to determine first drawing of display int eye_used = 0; // indicates which eye's data to display float x, y; // gaze position // NOTE: TRIALID AND TITLE MUST HAVE BEEN SET BEFORE DRIFT CORRECTION! // FAILURE TO INCLUDE THESE MAY CAUSE INCOMPATIBILITIES WITH ANALYSIS SOFTWARE! // Set size and type of gaze-contingent window RECT display_rect; display_rect.top = dispinfo.top; display_rect.bottom = dispinfo.bottom; display_rect.left = dispinfo.left; display_rect.right = dispinfo.right; initialize_gc_window(wwidth, wheight, fgbm, bgbm, full_screen_window, display_rect, mask, SCRWIDTH/300); // sets 0.1 degree deadband // DO PRE-TRIAL DRIFT CORRECTION // We repeat if ESC key pressed to do setup. while(1) { // Check link often so we can exit if tracker stopped if(!eyelink_is_connected()) return ABORT_EXPT; // We let do_drift_correct() draw target in this example // 3rd argument would be 0 if we already drew the display error = do_drift_correct((INT16)(SCRWIDTH/2), (INT16)(SCRHEIGHT/2), 1, 1); // repeat if ESC was pressed to access Setup menu if(error!=27) break; } clear_full_screen_window(target_background_color); // make sure display is blank // Start data recording to EDF file, BEFORE DISPLAYING STIMULUS // You should always start recording 50-100 msec before required // otherwise you may lose a few msec of data // tell start_recording() to send link data error = start_recording(1,1,1,1); // record with link data enabled if(error != 0) return error; // ERROR: couldn't start recording // record for 100 msec before displaying stimulus begin_realtime_mode(100); // Windows 2000/XP: no interruptions from now on // DONT DISPLAY OUR IMAGES TO SUBJECT until we have first gaze postion! if(!eyelink_wait_for_block_start(100, 1, 0)) // wait for link sample data { end_trial(); alert_printf("ERROR: No link samples received!"); return TRIAL_ERROR; } eye_used = eyelink_eye_available(); // determine which eye(s) are available switch(eye_used) // select eye, add annotation to EDF file { case RIGHT_EYE: eyemsg_printf("EYE_USED 1 RIGHT"); break; case BINOCULAR: // both eye's data present: use left eye only eye_used = LEFT_EYE; case LEFT_EYE: eyemsg_printf("EYE_USED 0 LEFT"); break; } // Now get ready for trial loop eyelink_flush_keybuttons(0); // reset keys and buttons from tracker // we don't use getkey() especially in a time-critical trial // as Windows may interrupt us and cause an unpredicatable delay // so we would use buttons or tracker keys only // Trial loop: till timeout or response -- added code for reading samples and moving cursor while(1) { // First, check if recording aborted if((error=check_recording())!=0) return error; // Check if trial time limit expired if(current_time() > trial_start+time_limit && trial_start!=0) { eyemsg_printf("TIMEOUT"); // message to log the timeout end_trial(); // local function to stop recording button = 0; // trial result message is 0 if timeout break; // exit trial loop } if(break_pressed()) // check for program termination or ALT-F4 or CTRL-C keys { end_trial(); // local function to stop recording return ABORT_EXPT; // return this code to terminate experiment } if(escape_pressed()) // check for local ESC key to abort trial (useful in debugging) { end_trial(); // local function to stop recording return SKIP_TRIAL; // return this code if trial terminated } /* BUTTON RESPONSE TEST */ // Check for eye-tracker buttons pressed // This is the preferred way to get response data or end trials button = eyelink_last_button_press(NULL); if(button!=0) // button number, or 0 if none pressed { eyemsg_printf("ENDBUTTON %d", button); // message to log the button press end_trial(); // local function to stop recording break; // exit trial loop } // NEW CODE FOR GAZE CONTINGENT WINDOW if(eyelink_newest_float_sample(NULL)>0) // check for new sample update { eyelink_newest_float_sample(&evt); // get the sample x = evt.fs.gx[eye_used]; // yes: get gaze position from sample y = evt.fs.gy[eye_used]; if(x!=MISSING_DATA && y!=MISSING_DATA && evt.fs.pa[eye_used]>0) // make sure pupil is present { if(first_display) // mark display start AFTER first drawing of window { wait_for_video_refresh(); // synchronize before drawing so all seen at once drawing_time = current_msec(); // time of retrace trial_start = drawing_time; // record the display onset time } redraw_gc_window((int)x, (int)y); // move window if visible if(first_display) // mark display start AFTER first drawing of window { first_display = 0; drawing_time = current_msec() - drawing_time; // delay from retrace eyemsg_printf("%d DISPLAY ON", drawing_time); // message for RT recording in analysis eyemsg_printf("SYNCTIME %d", drawing_time); // message marks zero-plot time for EDFVIEW } } else { // Don't move window during blink // To hide window, use: redraw_gc_window(MISSING, MISSING); } } } // END OF RECORDING LOOP end_realtime_mode(); // safety cleanup code while(getkey()); // dump any accumulated key presses // report response result: 0=timeout, else button number eyemsg_printf("TRIAL_RESULT %d", button); // Call this at the end of the trial, to handle special conditions return check_record_exit(); }
// ###################################################################### void EyeTrackerEyeLink::start1() { #ifndef HAVE_EYELINK LFATAL("Proprietary EyeLink developer API not installed"); #else // get the link to the eye-tracker going: if (open_eyelink_connection(0)) LFATAL("Cannot open link to EyeLink tracker - make sure your " "hostname resolves to 100.1.1.2 (check /etc/hosts)"); // Basic initializations: set_offline_mode(); flush_getkey_queue();/* initialize getkey() system */ // Open EyeLink version of SDL openSDL(); // set the display characteristics: DISPLAYINFO di; // defined in eyelink/core_expt.h di.width = itsDims.getVal().w(); di.height = itsDims.getVal().h(); di.left = 0; di.top = 0; di.right = di.width-1; di.bottom = di.height-1; di.bits = 24; di.palsize = 0; di.pages = 0; di.refresh = 60.0F; di.winnt = 0; set_calibration_colors(&target_foreground_color, &target_background_color); // open EDF file if set: if (itsEDFfname.getVal().empty() == false) { if (open_data_file((char *)(itsEDFfname.getVal().c_str())) != 0) LFATAL("Cannot open EDF file '%s'", itsEDFfname.getVal().c_str()); eyecmd_printf(const_cast<char*>("add_file_preamble_text 'RECORDED BY iLab code' ")); } // Add resolution to EDF file: eyemsg_printf(const_cast<char*>("DISPLAY_COORDS %ld %ld %ld %ld"), di.left, di.top, di.right, di.bottom); /* SET UP TRACKER CONFIGURATION */ /* set parser saccade thresholds (conservative settings) */ /* 0 = standard sensitivity */ eyecmd_printf(const_cast<char*>("select_parser_configuration 0")); // set EDF file contents: eyecmd_printf(const_cast<char*>("file_event_filter = LEFT,RIGHT,FIXATION,SACCADE," "BLINK,MESSAGE,BUTTON")); eyecmd_printf(const_cast<char*>("file_sample_data = LEFT,RIGHT,GAZE,AREA,GAZERES,STATUS")); // set link data (used for gaze cursor): eyecmd_printf(const_cast<char*>("link_event_filter = LEFT,RIGHT,FIXATION,FIXUPDATE,SACCADE,BLINK,BUTTON")); eyecmd_printf(const_cast<char*>("link_sample_data = LEFT,RIGHT,GAZE,GAZERES,AREA,STATUS")); // Program button #5 for use in drift correction: eyecmd_printf(const_cast<char*>("button_function 5 'accept_target_fixation'")); // setup eyelink filtering: default is "1 2" eyecmd_printf(const_cast<char*>("heuristic_filter = 1 2")); eyelink_wait_for_mode_ready(500); // make sure we're still alive: if (!eyelink_is_connected() || break_pressed()) LFATAL("Connection to EyeLink broken or aborted"); /* TRIAL_VAR_LABELS message is recorded for EyeLink Data Viewer analysis It specifies the list of trial variables for the trial This should be written once only and put before the recording of individual trials */ eyemsg_printf(const_cast<char*>("TRIAL_VAR_LABELS CONDITION")); // Configure EyeLink to send fixation updates every 50 msec: //eyecmd_printf("link_event_filter = LEFT,RIGHT,FIXUPDATE"); //eyecmd_printf("fixation_update_interval = 50"); //eyecmd_printf("fixation_update_accumulate = 50"); EyeTracker::start1(); #endif }
bool Eyelink::update() { MWTime inputtime; boost::mutex::scoped_lock lock(EyelinkDriverLock); if(eyelink_is_connected()) { while(eyelink_get_next_data(NULL)) { if(eyelink_in_data_block(1,0)) { //only if data contains samples eyelink_get_float_data(&evt); inputtime = this->clock->getCurrentTimeUS(); // occasionally, send the current time together with the sample time back to the tracker (and log it there) if ( ack_msg_counter++ % 512 == 0 ) eyemsg_printf((char*)"SAMPLE %ld received %lld",(long)evt.time,inputtime); // now update all the variables if (e_time != NULL) e_time -> setValue( (long)evt.time ,inputtime); if( evt.gx[RIGHT_EYE] != MISSING_DATA && evt.gy[RIGHT_EYE] != MISSING_DATA && evt.gx[LEFT_EYE] != MISSING_DATA && evt.gy[LEFT_EYE] != MISSING_DATA && (e_x != NULL || e_y != NULL || e_z != NULL) ) { //p4321z = 1; p43x = evt.gx[LEFT_EYE]/e_dist + 1; p43y = evt.gy[LEFT_EYE]/e_dist; p21x = evt.gx[RIGHT_EYE]/e_dist - 2; p21y = evt.gy[RIGHT_EYE]/e_dist; d4321 = p43x * p21x + p43y * p21y + 1; d4343 = p43x * p43x + p43y * p43y + 1; d2121 = p21x * p21x + p21y * p21y + 1; denom = d2121 * d4343 - d4321 * d4321; if (abs(denom) > 1e-6) { // should always be true when e_dist is really tracking range numer = p43x * d4321 - p21x * d4343; mua = numer / denom; mub = (p43x + d4321 * mua) / d4343; pax = 1 + mua * p21x; pay = mua * p21y; paz = -1 + mua; //-p4321z + mua * p4321z; pbx = mub * p43x; pby = mub * p43y; pbz = -1 + mub; //-p4321z + mub * p4321z; if (e_x != NULL) e_x -> setValue(pax + 0.5*(pbx-pax),inputtime); if (e_y != NULL) e_y -> setValue(pay + 0.5*(pby-pay),inputtime); if (e_z != NULL) e_z -> setValue(paz + 0.5*(pbz-paz),inputtime); } } else { if (e_x != NULL && e_x->getValue().getFloat() != MISSING_DATA) e_x -> setValue((float)MISSING_DATA,inputtime); if (e_y != NULL && e_y->getValue().getFloat() != MISSING_DATA) e_y -> setValue((float)MISSING_DATA,inputtime); if (e_z != NULL && e_z->getValue().getFloat() != MISSING_DATA) e_z -> setValue((float)MISSING_DATA,inputtime); } if( evt.gx[RIGHT_EYE] != MISSING_DATA && evt.gy[RIGHT_EYE] != MISSING_DATA ){ if (e_rx != NULL) e_rx -> setValue( evt.gx[RIGHT_EYE] ,inputtime); if (e_ry != NULL) e_ry -> setValue( evt.gy[RIGHT_EYE] ,inputtime); } else { if (e_rx != NULL && e_rx->getValue().getFloat() != MISSING_DATA) e_rx -> setValue((float)MISSING_DATA,inputtime); if (e_ry != NULL && e_ry->getValue().getFloat() != MISSING_DATA) e_ry -> setValue((float)MISSING_DATA,inputtime); } if( evt.gx[LEFT_EYE] != MISSING_DATA && evt.gy[LEFT_EYE] != MISSING_DATA ){ if (e_lx != NULL) e_lx -> setValue( evt.gx[LEFT_EYE] ,inputtime); if (e_ly != NULL) e_ly -> setValue( evt.gy[LEFT_EYE] ,inputtime); } else { if (e_lx != NULL && e_lx->getValue().getFloat() != MISSING_DATA) e_lx -> setValue((float)MISSING_DATA,inputtime); if (e_ly != NULL && e_ly->getValue().getFloat() != MISSING_DATA) e_ly -> setValue((float)MISSING_DATA,inputtime); } if( evt.hx[RIGHT_EYE] != -7936.0f && evt.hy[RIGHT_EYE] != -7936.0f ){ if (h_rx != NULL) h_rx -> setValue( evt.hx[RIGHT_EYE] ,inputtime); if (h_ry != NULL) h_ry -> setValue( evt.hy[RIGHT_EYE] ,inputtime); } else { if (h_rx != NULL && h_rx->getValue().getFloat() != MISSING_DATA) h_rx -> setValue((float)MISSING_DATA,inputtime); if (h_ry != NULL && h_ry->getValue().getFloat() != MISSING_DATA) h_ry -> setValue((float)MISSING_DATA,inputtime); } if( evt.hx[LEFT_EYE] != -7936.0f && evt.hy[LEFT_EYE] != -7936.0f ){ if (h_lx != NULL) h_lx -> setValue( evt.hx[LEFT_EYE] ,inputtime); if (h_ly != NULL) h_ly -> setValue( evt.hy[LEFT_EYE] ,inputtime); } else { if (h_lx != NULL && h_lx->getValue().getFloat() != MISSING_DATA) h_lx -> setValue((float)MISSING_DATA,inputtime); if (h_ly != NULL && h_ly->getValue().getFloat() != MISSING_DATA) h_ly -> setValue((float)MISSING_DATA,inputtime); } if( evt.px[RIGHT_EYE] != MISSING_DATA && evt.py[RIGHT_EYE] != MISSING_DATA ){ if (p_rx != NULL) p_rx -> setValue( evt.px[RIGHT_EYE] ,inputtime); if (p_ry != NULL) p_ry -> setValue( evt.py[RIGHT_EYE] ,inputtime); } else { if (p_rx != NULL && p_rx->getValue().getFloat() != MISSING_DATA) p_rx -> setValue((float)MISSING_DATA,inputtime); if (p_ry != NULL && p_ry->getValue().getFloat() != MISSING_DATA) p_ry -> setValue((float)MISSING_DATA,inputtime); } if( evt.px[LEFT_EYE] != MISSING_DATA && evt.py[LEFT_EYE] != MISSING_DATA ){ if (p_lx != NULL) p_lx -> setValue( evt.px[LEFT_EYE] ,inputtime); if (p_ly != NULL) p_ly -> setValue( evt.py[LEFT_EYE] ,inputtime); } else { if (p_lx != NULL && p_lx->getValue().getFloat() != MISSING_DATA) p_lx -> setValue((float)MISSING_DATA,inputtime); if (p_ly != NULL && p_ly->getValue().getFloat() != MISSING_DATA) p_ly -> setValue((float)MISSING_DATA,inputtime); } if( evt.pa[RIGHT_EYE] != 0 ){ if (p_r != NULL) p_r -> setValue( evt.pa[RIGHT_EYE] ,inputtime); } else { if (p_r != NULL && p_r->getValue().getFloat() != 0) p_r -> setValue((float)MISSING_DATA,inputtime); } if( evt.pa[LEFT_EYE] != 0 ){ if (p_l != NULL) p_l -> setValue( evt.pa[LEFT_EYE] ,inputtime); } else { if (p_l != NULL && p_l->getValue().getFloat() != 0) p_l -> setValue((float)MISSING_DATA,inputtime); } } } } else { if(++errors * update_period > (MWorksTime)1000000) { //just a quick hack but impossible to ignore by the user merror(M_IODEVICE_MESSAGE_DOMAIN, "Fatal Error! EyeLink Connection Lost!!"); errors = 0; } } return true; }
bool Eyelink::initialize(){ boost::mutex::scoped_lock lock(EyelinkDriverLock); if (Eyelink_Initialized) { merror(M_IODEVICE_MESSAGE_DOMAIN,"Eyelink was previously initialized! Trying again, but this is dangerous!!"); } Eyelink_Initialized = false; // Initializes the link //mprintf(M_IODEVICE_MESSAGE_DOMAIN, "Trying to find Eyelink System at %s",tracker_ip); if (set_eyelink_address( &tracker_ip[0] ) ) merror(M_IODEVICE_MESSAGE_DOMAIN,"Failed to set Tracker to address %s", tracker_ip.c_str()); if(open_eyelink_connection(0)) merror(M_IODEVICE_MESSAGE_DOMAIN,"Failed to connect to Tracker at %s", tracker_ip.c_str()); else { ELINKNODE node; // generate data file name time_t now = time(NULL); struct tm* t = gmtime(&now); sprintf(data_file_name, "%02d%06d.edf",(t->tm_year-100),t->tm_yday*1440 + t->tm_hour*60 + t->tm_min); //YYMMMMMM : YY=Years since 2k, MMMMMM=Minutes in current year if ( open_data_file( data_file_name ) ) { mwarning(M_IODEVICE_MESSAGE_DOMAIN,"Eyelink datafile setting failed (%s)",data_file_name); } else { mprintf(M_IODEVICE_MESSAGE_DOMAIN,"Eyelink logs to local file %s",data_file_name); } // Tell the tracker what data to include in samples if (OK_RESULT != eyecmd_printf("link_sample_data = LEFT,RIGHT,GAZE,HREF,PUPIL,AREA")) { mwarning(M_IODEVICE_MESSAGE_DOMAIN, "Eyelink did not respond to link_sample_data command; sample data may be incomplete"); } // tell the tracker who we are eyelink_set_name((char*)("MWorks_over_Socket")); // verify the name if( eyelink_get_node(0,&node) != OK_RESULT ) merror(M_IODEVICE_MESSAGE_DOMAIN,"Error, EyeLink doesn't respond"); else eyemsg_printf((char*)("%s connected"), node.name); // Enable link data reception eyelink_reset_data(1); } // Eyelink should now be in "TCP-Link Open" mode if(eyelink_is_connected()) { tracker_version = eyelink_get_tracker_version(version_info); mprintf(M_IODEVICE_MESSAGE_DOMAIN, "Eyelink %d System Version %s connected via Socket",tracker_version,version_info); Eyelink_Initialized = true; stopped = true; } else { merror(M_IODEVICE_MESSAGE_DOMAIN,"Error, Eyelink Connection could not be established"); } return Eyelink_Initialized; }