The standard PRESENT function terminates as soon as a button has been pressed. You could immediately re-present the stimulus for the remaining duration, but this creates an annoying flicker.
I sub-classed Text and Image to add a PRESENT_FIXED_DUR function that deals with this problem. This issue was also raised on the PyEPL mailing list.
For images:
#!/usr/bin/python
# from pyepl.hardware.graphics import Image
from pyepl.locals import Image
from pyepl.display import VideoTrack
from pyepl.locals import PresentationClock
class Image2(Image):
def present_fixed_dur(self, clk=None, duration=None, bc=None, minDuration=None):
"""
This is just like the standard Image.present, except
that if you press a button, the image stays on the
screen until the full duration has passed.
I got rid of the jitter argument, because it makes
things complicated.
"""
v = VideoTrack.lastInstance()
# get the clock if needed
if clk is None: clk = PresentationClock()
# show the image
t = v.showCentered(self)
timestamp = v.updateScreen(clk)
if bc:
# wait for button press
button,bc_time = bc.waitWithTime(minDuration,duration,clk)
# figure out how much time is remaining, now
# that they've pressed the button, and delay for
# just that
rt = bc_time[0] - timestamp[0]
clk.delay(duration-rt)
else:
clk.delay(duration)
# unshow that image
v.unshow(t)
upd_ts = v.updateScreen(clk)
# print 'presented for %ims' % (upd_ts[0] - timestamp[0])
if bc: return timestamp,button,bc_time
else: return timestamp
For text:
#!/usr/bin/python
# from pyepl.hardware.graphics import Image
from pyepl.locals import Text
from pyepl.display import VideoTrack
class Text2(Text):
def present_fixed_dur(self, clk=None, duration=None, bc=None, minDuration=None, xProp=.5, yProp=.5):
"""
Just as Text2.present, but (like
Image2.present_fixed_dur): the standard
Text.present, except that if you press a button, the
stimulus stays on the screen until the full duration
has passed.
"""
# print 'starting present_fixed_dur'
v = VideoTrack.lastInstance()
# get the clock if needed
if clk is None: clk = exputils.PresentationClock()
# show the image
t = v.showProportional(self,xProp,yProp)
timestamp = v.updateScreen(clk)
if bc:
# wait for button press
button,bc_time = bc.waitWithTime(minDuration,duration,clk)
rt = bc_time[0] - timestamp[0]
# print 'delaying by %i' % (duration-rt)
# only delay if duration is True
if duration and (duration-rt): clk.delay(duration-rt)
else:
# print 'delaying by %i' % duration
if duration: clk.delay(duration)
v.unshow(t)
v.updateScreen(clk)
# print 'ending present_fixed_dur'
if bc: return timestamp,button,bc_time
else: return timestamp
No comments:
Post a Comment