-
Notifications
You must be signed in to change notification settings - Fork 0
/
eyeTracker.py
123 lines (100 loc) · 4.88 KB
/
eyeTracker.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import constants
import pylink
from EyeLinkCoreGraphicsPsychoPy import EyeLinkCoreGraphicsPsychoPy
from psychopy import visual, event
from datetime import datetime
class EyeTracker(object):
def __init__(self, win, fileName, folderName, dummy=False):
self.win = win
self.text = visual.TextStim(self.win, text="hello")
if dummy == False:
self.tk = pylink.EyeLink("100.1.1.1")
else:
self.tk = pylink.EyeLink(None)
self.dataFileName = fileName
self.dataFolderName = folderName
genv = EyeLinkCoreGraphicsPsychoPy(self.tk, win)
pylink.openGraphicsEx(genv)
def calibrate(self):
self.tk.setOfflineMode()
self.tk.sendCommand('sample_rate 500')
self.tk.sendCommand("screen_pixel_coords = 0 0 %d %d" % (constants.WINDOW_SIZE[0]-1, constants.WINDOW_SIZE[1]-1))
self.tk.sendMessage("DISPLAY_COORDS = 0 0 %d %d" % (constants.WINDOW_SIZE[0]-1, constants.WINDOW_SIZE[1]-1))
self.tk.sendCommand("calibration_type = HV9") # self.tk.setCalibrationType('HV9') also works, see the Pylink manual
eyelinkVer = self.tk.getTrackerVersion()
#turn off scenelink camera stuff (EyeLink II/I only)
if eyelinkVer == 2: self.tk.sendCommand("scene_camera_gazemap = NO")
# Set the tracker to parse Events using "GAZE" (or "HREF") data
self.tk.sendCommand("recording_parse_type = GAZE")
if eyelinkVer>=2:
self.tk.sendCommand('select_parser_configuration 0')
# get Host tracking software version
hostVer = 0
if eyelinkVer == 3:
tvstr = self.tk.getTrackerVersionString()
vindex = tvstr.find("EYELINK CL")
hostVer = int(float(tvstr[(vindex + len("EYELINK CL")):].strip()))
# specify the EVENT and SAMPLE data that are stored in EDF or retrievable from the Link
# See Section 4 Data Files of the EyeLink user manual
self.tk.sendCommand("file_event_filter = LEFT,RIGHT,FIXATION,SACCADE,BLINK,MESSAGE,BUTTON,INPUT")
self.tk.sendCommand("link_event_filter = LEFT,RIGHT,FIXATION,FIXUPDATE,SACCADE,BLINK,BUTTON,INPUT")
if hostVer>=4:
self.tk.sendCommand("file_sample_data = LEFT,RIGHT,GAZE,AREA,GAZERES,STATUS,HTARGET,INPUT")
self.tk.sendCommand("link_sample_data = LEFT,RIGHT,GAZE,GAZERES,AREA,STATUS,HTARGET,INPUT")
else:
self.tk.sendCommand("file_sample_data = LEFT,RIGHT,GAZE,AREA,GAZERES,STATUS,INPUT")
self.tk.sendCommand("link_sample_data = LEFT,RIGHT,GAZE,GAZERES,AREA,STATUS,INPUT")
self.tk.doTrackerSetup()
def start_recording(self, trial_number):
self.tk.startRecording(1,1,1,1)
self.tk.sendMessage("trial_start {}".format(trial_number))
self.manager.dataDict["trial_start"] = datetime.now()
def stop_recording(self):
self.tk.stopRecording()
def close_tracker(self):
self.tk.setOfflineMode()
self.tk.closeDataFile()
self.tk.receiveDataFile(self.dataFileName, self.dataFolderName + self.dataFileName)
self.tk.close()
def open_file(self, fileName):
self.tk.openDataFile(fileName)
self.tk.sendCommand("add_file_preamble_text 'Psychopy teleological task'")
def close_dataFile(self, fileName, folderName):
self.tk.closeDataFile()
self.tk.receiveDataFile(fileName, folderName + fileName)
def display_message(self, message):
self.tk.sendCommand("record_status_message '{}'".format(message))
def sound_start(self):
self.tk.sendMessage("sound_start")
self.manager.dataDict["sound_start"] = datetime.now()
def sound_end(self):
self.tk.sendMessage("sound_end")
self.manager.dataDict["sound_end"] = datetime.now()
def response_start(self):
self.tk.sendMessage("response_start")
self.manager.dataDict["response_start"] = datetime.now()
def response_given(self):
self.tk.sendMessage("response_given")
self.manager.dataDict["response_given"] = datetime.now()
def response_end(self):
self.tk.sendMessage("response_end")
self.manager.dataDict["response_end"] = datetime.now()
def feedback_start(self):
self.tk.sendMessage("feedback_start")
self.manager.dataDict["feedback_start"] = datetime.now()
def fixation_cross_start(self):
self.tk.sendMessage("fixation_start")
self.manager.dataDict["fixation_start"] = datetime.now()
def practice_start(self):
self.tk.sendMessage("practice_start")
def practice_end(self):
self.tk.sendMessage("practice_end")
def set_manager(self, manager):
self.manager = manager
def update(self):
keys = event.getKeys()
print("update")
if 'space' in keys:
self.manager.start_experiment()
def draw(self):
self.text.draw()