def define_stimuli(self):
     """
     Creates standard and deviant stimuli.          
     """
     # The stimului. This can be anything compatible with VisionEgg
     dev = FilledCircle(
         color=(0, 1.0, 0),
         position=[self.geometry[2] / 2, self.geometry[3] / 2],
         radius=100)
     std1 = Target2D(color=(0, 0, 1.0),
                     position=[self.geometry[2] / 2, self.geometry[3] / 2],
                     size=(200, 200))
     std2 = Target2D(color=(1.0, 0, 0),
                     position=[self.geometry[2] / 2, self.geometry[3] / 2],
                     size=(200, 200))
     #dev = Text(text='Deviant', font_size=72, position=(300, 200), anchor='center')
     #std1 = Text(text='Standard I', font_size=72, position=(300, 200), anchor='center')
     #std2 = Text(text='Standard II', font_size=72, position=(300, 200), anchor='center')
     return [std1, std2], [dev]
Exemplo n.º 2
0
    def __init_screen(self):
        ## create screen:
        if not self.fullscreen:
            os.environ['SDL_VIDEO_WINDOW_POS'] = '%d, %d' % (self.geometry[0],
                                                             self.geometry[1])
        self._screen = Screen(size=(self.geometry[2], self.geometry[3]),
                              fullscreen=self.fullscreen,
                              bgcolor=self.bg_color,
                              sync_swap=True)

        ## create letter box on top:
        self._ve_letterbox = Target2D(position=(self._centerPos[0],
                                                self.geometry[3] * (1 - 0.01) -
                                                self.letterbox_size[1] / 2.),
                                      size=(self.letterbox_size[0],
                                            self.letterbox_size[1]),
                                      color=self.phrase_color)
        self._ve_innerbox = Target2D(position=(self._centerPos[0],
                                               self.geometry[3] * (1 - 0.01) -
                                               self.letterbox_size[1] / 2.),
                                     size=(self.letterbox_size[0] - 6,
                                           self.letterbox_size[1] - 6),
                                     color=self.bg_color)

        self._current_letter_position = (self._centerPos[0],
                                         self.geometry[3] * (1 - 0.015) -
                                         self.letterbox_size[1] / 2.)
        self._ve_current_letter = Text(
            position=self._current_letter_position,
            text=(len(self._desired_letters[:1]) == 0 and " "
                  or self._desired_letters[:1]),
            font_size=self.font_size_current_letter,
            color=self.current_letter_color,
            anchor='center')

        self._ve_desired_letters = Text(
            position=(self._centerPos[0] + 5 + self.letterbox_size[0] / 2.,
                      self._current_letter_position[1]),
            text=(len(self._desired_letters[1:]) == 0 and " "
                  or self._desired_letters[1:]),
            font_size=self.font_size_phrase,
            color=self.phrase_color,
            anchor='left')

        self._ve_spelled_phrase = Text(
            position=(self._centerPos[0] - 5 - self.letterbox_size[0] / 2.,
                      self._current_letter_position[1]),
            text=(len(self._spelled_phrase) == 0 and " "
                  or self._spelled_phrase),
            font_size=self.font_size_phrase,
            color=self.phrase_color,
            anchor='right')

        # if we're in free spelling mode, we hide all text fields but
        # the _ve_spelled_phrase. we also need a multiline
        # _ve_spelled_phrase instead of the single lined one
        if self.offline == self.copy_spelling == False:
            self._spelled_phrase = "   "
            self._ve_spelled_phrase = WrappedText(
                position=(0, self._current_letter_position[1]),
                text=(len(self._spelled_phrase) == 0 and " "
                      or self._spelled_phrase),
                font_size=self.font_size_phrase,
                color=self.phrase_color,
                size=(float(self.geometry[2]), float(self.geometry[3])))
            for i in self._ve_letterbox, self._ve_innerbox, self._ve_current_letter, self._ve_desired_letters:
                i.set(on=False)

        ## add word box to elementlist:
        self._ve_elements.extend([
            self._ve_letterbox, self._ve_innerbox, self._ve_current_letter,
            self._ve_desired_letters, self._ve_spelled_phrase
        ])

        ## create countdown:
        self._ve_countdown = Text(position=self._centerPos,
                                  text=" ",
                                  font_size=self.font_size_countdown,
                                  color=self.countdown_color,
                                  anchor='center',
                                  on=False)

        ## create countdown shapes
        self._ve_countdown_shape = self.countdown_shapes[
            self.countdown_shape_select](radius=90,
                                         position=self._centerPos,
                                         color=self.countdown_shape_color,
                                         on=False)

        ## create oscillator circle:
        self._ve_oscillator = FilledCircle(position=(self.osc_size / 2 + 10,
                                                     self.osc_size / 2 + 10),
                                           radius=self.osc_size / 2,
                                           color=self.osc_color,
                                           on=False)

        ## create shapes and letters:
        self.init_screen_elements()

        ## add remaining elements to element list:
        self._ve_elements.extend([
            self._ve_countdown_shape, self._ve_countdown, self._ve_oscillator
        ])

        ## add elements to viewport:
        self._viewport = Viewport(screen=self._screen,
                                  stimuli=self._ve_elements)
        self._presentation = Presentation(viewports=[self._viewport],
                                          handle_event_callbacks=[
                                              (pygame.KEYDOWN,
                                               self.keyboard_input),
                                              (pygame.QUIT, self.__stop)
                                          ])
Exemplo n.º 3
0
 def init_screen_elements(self):
     '''
     Initializing screen elements
     '''
     self._letter_positions = []        
     ## create and place the circles and letters:
     circle_layout = CircularLayout(nr_elements=self._nr_elements,
                                    radius=self.speller_radius,
                                    start=NP.pi/6.*5)
     circle_layout.positions.reverse()
     self._letter_layout = CircularLayout(nr_elements=self._nr_elements,
                                    radius=self.circle_radius*0.65,
                                    start=NP.pi/6.*5)
     self._letter_layout.positions.reverse()
     self._shape_positions = [(x+self.geometry[2]/2, y+self._spellerHeight/2) for (x,y) in circle_layout.positions]
     # add the standard elements:
     for i in xrange(self._nr_elements):
         self._ve_edges.append(FilledCircle(radius=self._edge_radius,
                                             position=self._shape_positions[i],
                                             color=self.edge_color))
         self._ve_shapes.append(FilledCircle(radius=self._circle_radius,
                                             position=self._shape_positions[i],
                                             color=self.shape_color))
         # add the letters of level 1:
         for j in xrange(len(self.letter_set[i])): # warning: self.letter_set must be at least of length self._nr_elements!!!
             self._letter_positions.append((self._letter_layout.positions[j][0]+self._shape_positions[i][0],
                                            self._letter_layout.positions[j][1]+self._shape_positions[i][1]))
             self._ve_letters.append(Text(position=self._letter_positions[-1],
                                          text=self.letter_set[i][j],
                                          font_size=self.font_size_level1,
                                          color=self.letter_color,
                                          anchor='center'))
     
     # add the stimuli letters of level 1:
     letter_layout2 = CircularLayout(nr_elements=self._nr_elements,
                                    radius=self.circle_radius*0.65*self.flash_size_factor,
                                    start=NP.pi/6.*5)
     letter_layout2.positions.reverse()
     for i in xrange(self._nr_elements):
         for j in xrange(len(self.letter_set[i])): # warning: self.letter_set must be at least of length self._nr_elements!!!
             self._letter_positions.append((letter_layout2.positions[j][0]+self._shape_positions[i][0],
                                            letter_layout2.positions[j][1]+self._shape_positions[i][1]))
             self._ve_letters.append(Text(position=self._letter_positions[-1],
                                          text=self.letter_set[i][j],
                                          font_size=int(NP.floor(self.font_size_level1*self.flash_size_factor)),
                                          color=self.letter_stimulus_color,
                                          anchor='center',
                                          on=False))
     
     # add letters of level 2:
     for i in xrange(self._nr_elements):
         self._ve_letters.append(Text(position=self._shape_positions[i],
                                      text=" ",
                                      font_size=self.font_size_level2,
                                      color=self.letter_color,
                                      anchor='center',
                                      on=False))
         
     # add stimuli letters of level 2:
     for i in xrange(self._nr_elements):
         self._ve_letters.append(Text(position=self._shape_positions[i],
                                      text=" ",
                                      font_size=int(NP.floor(self.font_size_level2*self.flash_size_factor)),
                                      color=self.letter_stimulus_color,
                                      anchor='center',
                                      on=False))
         
     ## add fixation point:
     self._ve_fixationpoint = FilledCircle(radius=self.fixationpoint_size,
                                           position=self._centerPos,
                                           color=self.fixationpoint_color)
             
     
     ## create feedback box:
     self._ve_feedback_box = Target2D(position=self._centerPos,
                                      size=(self.feedbackbox_size, self.feedbackbox_size),
                                      color=self.feedback_color,
                                      on=False)
     
     ## add feedback letters:
     self._ve_feedback_letters = []
     for i in xrange(self._nr_elements-1):
         self._ve_feedback_letters.append(Text(position=(self._letter_layout.positions[i][0]+self._centerPos[0],
                                                         self._letter_layout.positions[i][1]+self._centerPos[1]),
                                               color=self.letter_color,
                                               font_size=self.font_size_level1,
                                               text=" ",
                                               on=False,
                                               anchor="center"))
     self._ve_feedback_letters.append(Text(position=self._centerPos,
                                           color=self.letter_color,
                                           font_size=self.font_size_level2,
                                           text=" ",
                                           anchor='center',
                                           on=False))
     
     ## put all in elements container:
     self._ve_elements.extend(self._ve_edges)
     self._ve_elements.extend(self._ve_shapes)
     self._ve_elements.extend(self._ve_letters)
     self._ve_elements.extend([self._ve_feedback_box])
     self._ve_elements.extend(self._ve_feedback_letters)
     self._ve_elements.append(self._ve_fixationpoint)
    def init_screen_elements(self):
        '''
        Initializing screen elements
        '''

        ## create shapes:
        if self.do_animation:
            for i in xrange(self._nr_elements):
                self._ve_shapes.append(
                    self.registered_shapes[self.shapes[i][0]](
                        position=self._centerPos,
                        color=self.shape_color[i],
                        on=False,
                        **self.shapes[i][1]))

            ## add letters of level 1:
            circle_layout = CircularLayout(nr_elements=self._nr_elements,
                                           radius=self.speller_radius,
                                           start=NP.pi / 6. * 5)
            circle_layout.positions.reverse()
            self._letter_layout = CircularLayout(nr_elements=self._nr_elements,
                                                 radius=self.letter_radius,
                                                 start=NP.pi / 6. * 5)
            self._letter_layout.positions.reverse()
            for i in xrange(self._nr_elements):
                # store countdown position:
                self._countdown_shape_positions.append(
                    (self._centerPos[0] + circle_layout.positions[i][0],
                     self._centerPos[1] + circle_layout.positions[i][1]))

                # put shape in container:
                self._ve_elements.append(self._ve_shapes[i])

                for j in xrange(
                        len(self.letter_set[i])
                ):  # warning: self.letter_set must be at least of length self._nr_elements!!!
                    # store position:
                    self._letter_positions.append(
                        (self._letter_layout.positions[j][0] +
                         self._centerPos[0],
                         self._letter_layout.positions[j][1] +
                         self._centerPos[1]))

                    # store countdown position:
                    self._countdown_letter_positions.append(
                        (self._letter_layout.positions[j][0] +
                         self._countdown_shape_positions[-1][0],
                         self._letter_layout.positions[j][1] +
                         self._countdown_shape_positions[-1][1]))

                    # add letter:
                    self._ve_letters.append(
                        Text(position=self._letter_positions[-1],
                             text=self.letter_set[i][j],
                             font_size=self.font_size_level1,
                             color=self.letter_color,
                             anchor='center',
                             on=False))

            # add letters of level 2:
            for i in xrange(self._nr_elements):
                self._letter_positions.append(self._centerPos)
                self._countdown_letter_positions.append(
                    self._countdown_shape_positions[i])
                self._ve_letters.append(
                    Text(position=self._centerPos,
                         text=" ",
                         font_size=self.font_size_level2,
                         color=(self.level_2_letter_colors
                                and self.stimuli_colors[i]
                                or self.letter_color),
                         anchor='center',
                         on=False))

                # put letters in container:
            self._ve_elements.extend(self._ve_letters)

            ## create feedback box:
            self._ve_feedback_box = Target2D(position=self._centerPos,
                                             size=(self.feedbackbox_size,
                                                   self.feedbackbox_size),
                                             color=self.feedback_color,
                                             on=False)

            ## add feedback letters:
            self._ve_feedback_letters = []
            for i in xrange(self._nr_elements):
                self._ve_feedback_letters.append(
                    Text(position=(self._letter_layout.positions[i][0] +
                                   self._centerPos[0],
                                   self._letter_layout.positions[i][1] +
                                   self._centerPos[1]),
                         color=self.letter_color,
                         font_size=self.font_size_level1,
                         text=" ",
                         on=False,
                         anchor="center"))
                self._ve_feedback_letters.append(
                    Text(position=self._centerPos,
                         color=self.letter_color,
                         font_size=self.font_size_level2,
                         text=" ",
                         anchor='center',
                         on=False))

            ## add feedback note (whether or not there was an ErrP detected):
            self._ve_feedback_ErrP = Text(
                position=self._centerPos,
                color=self.feedback_ErrP_color,
                text="X",
                font_size=self.font_size_feedback_ErrP,
                anchor='center',
                on=False)

            ## add fixation point:
            self._ve_fixationpoint = FilledCircle(
                radius=self.fixationpoint_size,
                position=self._centerPos,
                color=self.fixationpoint_color,
                on=False)

            ##################### IF NOT DO ANIMATION #########################
        else:
            ## add letters of level 1:
            circle_layout = CircularLayout(nr_elements=self._nr_elements,
                                           radius=self.speller_radius,
                                           start=NP.pi / 6. * 5)
            self._letter_layout = CircularLayout(nr_elements=self._nr_elements,
                                                 radius=self.letter_radius,
                                                 start=NP.pi / 6. * 5)
            circle_layout.positions.reverse()
            self._letter_layout.positions.reverse()

            for i in xrange(self._nr_elements):
                self._ve_shapes.append(
                    self.registered_shapes[self.shapes[i][0]](
                        position=(self._centerPos[0] +
                                  circle_layout.positions[i][0],
                                  self._centerPos[1] +
                                  circle_layout.positions[i][1]),
                        color=self.shape_color[i],
                        on=False,
                        **self.shapes[i][1]))

            for i in xrange(self._nr_elements):
                # store countdown position:
                self._countdown_shape_positions.append(
                    (self._centerPos[0] + circle_layout.positions[i][0],
                     self._centerPos[1] + circle_layout.positions[i][1]))
                # put shape in container:
                self._ve_elements.append(self._ve_shapes[i])

                for j in xrange(
                        len(self.letter_set[i])
                ):  # warning: self.letter_set must be at least of length self._nr_elements!!!
                    # store position:
                    self._letter_positions.append(
                        (self._letter_layout.positions[j][0] +
                         self._centerPos[0],
                         self._letter_layout.positions[j][1] +
                         self._centerPos[1]))

                    # store countdown position:
                    self._countdown_letter_positions.append(
                        (self._letter_layout.positions[j][0] +
                         self._countdown_shape_positions[-1][0],
                         self._letter_layout.positions[j][1] +
                         self._countdown_shape_positions[-1][1]))

                    # add letter:
                    self._ve_letters.append(
                        Text(position=(self._letter_layout.positions[j][0] +
                                       self._centerPos[0] +
                                       circle_layout.positions[i][0],
                                       self._letter_layout.positions[j][1] +
                                       self._centerPos[1] +
                                       circle_layout.positions[i][1]),
                             text=self.letter_set[i][j],
                             font_size=self.font_size_level1,
                             color=self.letter_color,
                             anchor='center',
                             on=False))

            # add letters of level 2:
            for i in xrange(self._nr_elements):
                self._letter_positions.append(
                    (self._letter_layout.positions[i][0] + self._centerPos[0],
                     self._letter_layout.positions[i][1] + self._centerPos[1]))
                self._countdown_letter_positions.append(
                    (self._letter_layout.positions[i][0] +
                     self._countdown_shape_positions[-1][0],
                     self._letter_layout.positions[i][1] +
                     self._countdown_shape_positions[-1][1]))
                self._ve_letters.append(
                    Text(position=(self._letter_layout.positions[i][0] +
                                   self._centerPos[0] +
                                   circle_layout.positions[i][0],
                                   self._letter_layout.positions[i][1] +
                                   self._centerPos[1] +
                                   circle_layout.positions[i][1]),
                         text=" ",
                         font_size=self.font_size_level2,
                         color=(self.level_2_letter_colors
                                and self.stimuli_colors[i]
                                or self.letter_color),
                         anchor='center',
                         on=False))

            # put letters in container:
            self._ve_elements.extend(self._ve_letters)

            ## create feedback box:
            self._ve_feedback_box = Target2D(position=self._centerPos,
                                             size=(self.feedbackbox_size,
                                                   self.feedbackbox_size),
                                             color=self.feedback_color,
                                             on=False)

            ## add feedback letters:
            self._ve_feedback_letters = []
            for i in xrange(self._nr_elements):
                self._ve_feedback_letters.append(
                    Text(position=(self._letter_layout.positions[i][0] +
                                   self._centerPos[0],
                                   self._letter_layout.positions[i][1] +
                                   self._centerPos[1]),
                         color=self.letter_color,
                         font_size=self.font_size_level1,
                         text=" ",
                         on=False,
                         anchor="center"))
                self._ve_feedback_letters.append(
                    Text(position=self._centerPos,
                         color=self.letter_color,
                         font_size=self.font_size_level2,
                         text=" ",
                         anchor='center',
                         on=False))

            ## add feedback note (whether or not there was an ErrP detected):
            self._ve_feedback_ErrP = Text(
                position=self._centerPos,
                color=self.feedback_ErrP_color,
                text="X",
                font_size=self.font_size_feedback_ErrP,
                anchor='center',
                on=False)

            ## add fixation point:
            self._ve_fixationpoint = FilledCircle(
                radius=self.fixationpoint_size,
                position=self._centerPos,
                color=self.fixationpoint_color,
                on=False)

        # put letters in container:
        self._ve_elements.append(self._ve_feedback_box)
        self._ve_elements.extend(self._ve_feedback_letters)
        self._ve_elements.append(self._ve_feedback_ErrP)
        self._ve_elements.append(self._ve_fixationpoint)
Exemplo n.º 5
0
    def init_screen_elements(self):
        '''
        Initialize screen elements
        '''
        self._letter_positions = []
        ## create triangles:
        self._letter_layout = CircularLayout(nr_elements=self._nr_elements,
                                             radius=self.letter_radius,
                                             start=NP.pi / 6. * 5)
        self._letter_layout.positions.reverse()
        a = self.speller_radius / 2.
        b = a * NP.sqrt(3) / 3.
        self._shape_positions = [
            (self._centerPos[0], self._centerPos[1] + 2 * b),
            (self._centerPos[0] + a, self._centerPos[1] + b),
            (self._centerPos[0] + a, self._centerPos[1] - b),
            (self._centerPos[0], self._centerPos[1] - 2 * b),
            (self._centerPos[0] - a, self._centerPos[1] - b),
            (self._centerPos[0] - a, self._centerPos[1] + b)
        ]
        orientaion = [180., 0., 180., 0., 180., 0.]
        for i in xrange(self._nr_elements):
            self._ve_edges.append(
                FilledTriangle(size=self.speller_radius,
                               position=self._shape_positions[i],
                               orientation=orientaion[i],
                               color=self.edge_color))
            self._ve_shapes.append(
                FilledTriangle(size=self.speller_radius - self.edge_size,
                               position=self._shape_positions[i],
                               orientation=orientaion[i],
                               color=self.shape_color))

            ## add the letters of level 1:
            for j in xrange(
                    len(self.letter_set[i])
            ):  # warning: self.letter_set must be at least of length self._nr_elements!!!
                self._letter_positions.append(
                    (self._letter_layout.positions[j][0] +
                     self._shape_positions[i][0],
                     self._letter_layout.positions[j][1] +
                     self._shape_positions[i][1]))
                self._ve_letters.append(
                    Text(position=self._letter_positions[-1],
                         text=self.letter_set[i][j],
                         font_size=self.font_size_level1,
                         color=self.letter_color,
                         anchor='center'))

        ## add letters of level 2:
        for i in xrange(self._nr_elements):
            self._ve_letters.append(
                Text(position=self._shape_positions[i],
                     text=" ",
                     font_size=self.font_size_level2,
                     color=self.letter_color,
                     anchor='center',
                     on=False))

        ## add fixation point:
        self._ve_fixationpoint = FilledCircle(radius=self.fixationpoint_size,
                                              position=self._centerPos,
                                              color=self.fixationpoint_color)

        ## create feedback box:
        self._ve_feedback_box = Target2D(position=self._centerPos,
                                         size=(self.feedbackbox_size,
                                               self.feedbackbox_size),
                                         color=self.feedback_color,
                                         on=False)

        ## add feedback letters:
        self._ve_feedback_letters = []
        for i in xrange(self._nr_elements - 1):
            self._ve_feedback_letters.append(
                Text(position=(self._letter_layout.positions[i][0] +
                               self._centerPos[0],
                               self._letter_layout.positions[i][1] +
                               self._centerPos[1]),
                     color=self.letter_color,
                     font_size=self.font_size_level1,
                     text=" ",
                     on=False,
                     anchor="center"))
        self._ve_feedback_letters.append(
            Text(position=self._centerPos,
                 color=self.letter_color,
                 font_size=self.font_size_level2,
                 text=" ",
                 anchor='center',
                 on=False))

        ## put all in elements container:
        self._ve_elements.extend(self._ve_edges)
        self._ve_elements.extend(self._ve_shapes)
        self._ve_elements.extend(self._ve_letters)
        self._ve_elements.append(self._ve_feedback_box)
        self._ve_elements.extend(self._ve_feedback_letters)
        self._ve_elements.append(self._ve_fixationpoint)