def wait(self, events, duration=None): """Wait for (a) certain event(s). Events to wait for are in the form of a list with 4 elements and do not include a timestamp: [status, data1, data2, data3] Parameters ---------- events : int or list event(s) to wait for duration : int, optional maximal time to wait in ms Returns ------- evt : int found event rt : int reaction timein ms """ start = Clock._cpu_time() rt = None _event = None self.clear() if type(events) is list and \ len(events) == 4 and \ type(events[0]) is int and \ type(events[1]) is int and \ type(events[2]) is int and \ type(events[3]) is int: events = [events] done = False while not done: expyriment._active_exp._execute_wait_callback() event = self.read(1) if event is not None and event[0][0] in events: rt = int((Clock._cpu_time() - start) * 1000) _event = event[0][0] done = True break if Keyboard.process_control_keys(): done = True break if duration: if int((Clock._cpu_time() - start) * 1000) >= duration: done = True break time.sleep(0.0005) if self._logging: expyriment._active_exp._event_file_log( "MIDI In ({0}),received,{1},wait".format(self.id, _event), 2) return _event, rt
def wait(self, events, duration=None): """Wait for (a) certain event(s). Events to wait for are in the form of a list with 4 elements and do not include a timestamp: [status, data1, data2, data3] Parameters ---------- events : int or list event(s) to wait for duration : int, optional maximal time to wait in ms Returns ------- evt : int found event rt : int reaction time in ms See Also -------- design.experiment.register_wait_callback_function """ if expyriment.control.defaults._skip_wait_functions: return None, None start = get_time() rt = None _event = None self.clear() if type(events) is list and \ len(events) == 4 and \ type(events[0]) is int and \ type(events[1]) is int and \ type(events[2]) is int and \ type(events[3]) is int: events = [events] done = False while not done: rtn_callback = expyriment._active_exp._execute_wait_callback() if isinstance(rtn_callback, expyriment.control.CallbackQuitEvent): return rtn_callback, int((get_time() - start) * 1000) event = self.read(1) if event is not None and event[0][0] in events: rt = int((get_time() - start) * 1000) _event = event[0][0] done = True break if Keyboard.process_control_keys(): done = True break if duration: if int((get_time() - start) * 1000) >= duration: done = True break time.sleep(0.0005) if self._logging: expyriment._active_exp._event_file_log( "MIDI In ({0}),received,{1},wait".format(self.id, _event), 2) return _event, rt
def wait(self, length, package_size=None, duration=None, check_control_keys=True): """Wait for data. Parameters: ----------- length : int The length of the data to be waited for in bytes. If not set, a single package will be waited for. package_size : int, optional The size of the package to be waited for, optional. If not set, the default package size will be used. If length < package_size, package_size = length. duration: int, optional The duration to wait in milliseconds. process_control_keys : bool, optional Check if control key has been pressed (default = True). Returns: -------- data : str The received data. rt : int The time it took to receive the data in milliseconds. """ if expyriment.control.defaults._skip_wait_functions: return None, None start = get_time() data = None rt = None if package_size is None: package_size = self._default_package_size if length is None: length = package_size elif length < package_size: package_size = length while True: try: if data is None: data = self._client[0].recv(package_size) while len(data) < length: if length - len(data) >= package_size: data = data + self._client[0].recv(package_size) else: data = data + self._client[0].recv(length - len(data)) if duration: if int((get_time() - start) * 1000) >= duration: data = None rt = None break rt = int((get_time() - start) * 1000) break except socket.error, e: err = e.args[0] if err == errno.EAGAIN or err == errno.EWOULDBLOCK: rtn_callback = expyriment._active_exp._execute_wait_callback() if isinstance(rtn_callback, expyriment.control.CallbackQuitEvent): return rtn_callback, int((get_time() - start) * 1000) if check_control_keys: if Keyboard.process_control_keys(): break if duration: if int((get_time() - start) * 1000) >= duration: data = None rt = None break