Package VisionEgg :: Package PyroApps :: Module TargetServer |
[frames] | no frames]

# Source Code for Module VisionEgg.PyroApps.TargetServer

      1  #!/usr/bin/env python
      2  #
      3  # The Vision Egg: TargetServer
      4  #
      5  # Copyright (C) 2001-2003 Andrew Straw.
      6  # Author: Andrew Straw <astraw@users.sourceforge.net>
      7  # URL: <http://www.visionegg.org/>
      8  #
      9  # Distributed under the terms of the GNU Lesser General Public License
     10  # (LGPL). See LICENSE.TXT that came with this file.
     11  #
     12  # $Id$
     13
     14  """Handle small targets gratings (server-side)"""
     15
     16  import VisionEgg
     17  __version__ = VisionEgg.release_name
     18  __cvs__ = '$Revision$'.split()[1]
     19  __date__ = ' '.join('$Date$'.split()[1:3])
     20  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>'
     21
     22  import sys, os, math
     23  import VisionEgg.Core
     24  import VisionEgg.FlowControl
     25  import VisionEgg.MoreStimuli
     26  import VisionEgg.PyroHelpers
     27  import Pyro.core
     28
     29  from VisionEgg.PyroApps.TargetGUI import TargetMetaParameters
     30
     31 -class TargetExperimentMetaController( Pyro.core.ObjBase ):
     32 -    def __init__(self,screen,presentation,stimuli):
     33          Pyro.core.ObjBase.__init__(self)
     34
     35          # get stimulus
     36          assert( stimuli[0][0] == '2d_overlay')
     37          target = stimuli[0][1]
     38
     39          self.meta_params = TargetMetaParameters()
     40          if not isinstance(screen,VisionEgg.Core.Screen):
     41              raise ValueError("Expecting instance of VisionEgg.Core.Screen")
     42          if not isinstance(presentation,VisionEgg.FlowControl.Presentation):
     43              raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation")
     44          if not isinstance(target,VisionEgg.MoreStimuli.Target2D):
     45              raise ValueError("Expecting instance of VisionEgg.MoreStimuli.Target2D")
     46
     47          self.screen = screen
     48          self.p = presentation
     49          self.stim = target
     50
     51          self.p.add_controller(self.stim,'on',VisionEgg.FlowControl.FunctionController(
     52              during_go_func=self.on_function_during_go,
     53              between_go_func=self.on_function_between_go))
     54
     55          self.p.add_controller(self.stim,'position',VisionEgg.FlowControl.FunctionController(
     56              during_go_func=self.center_during_go,
     57              between_go_func=self.center_between_go))
     58
     59          self.update() # set stimulus parameters to initial defaults
     60
     61 -    def __del__(self):
     62          self.p.remove_controller(self.stim,'on')
     63          self.p.remove_controller(self.stim,'position')
     64          Pyro.core.ObjBase.__del__(self) # call base class
     65
     66 -    def on_function_during_go(self,t):
     67          if t <= self.meta_params.pre_stim_sec:
     68              return 0 # not on yet
     69          elif t <= (self.meta_params.pre_stim_sec + self.meta_params.stim_sec):
     70              return 1 # on
     71          else:
     72              return 0 # off again
     73
     74 -    def on_function_between_go(self):
     75          return 0
     76
     77 -    def center_during_go(self,t):
     78          t_adjusted = t - self.meta_params.pre_stim_sec
     79          distance = self.meta_params.velocity_pps * t_adjusted
     80          x_offset = math.cos(self.meta_params.direction_deg / 180.0 * math.pi)*distance
     81          y_offset = math.sin(self.meta_params.direction_deg / 180.0 * math.pi)*distance
     82
     83          return (self.meta_params.start_x + x_offset,
     84                  self.meta_params.start_y + y_offset)
     85
     86 -    def center_between_go(self):
     87          return (0.0, 0.0) # doesn't matter -- it's off
     88
     89 -    def get_parameters(self):
     90          return self.meta_params
     91
     92 -    def set_parameters(self, new_parameters):
     93          if isinstance(new_parameters, TargetMetaParameters):
     94              self.meta_params = new_parameters
     95          else:
     96              raise ValueError("Argument to set_parameters must be instance of TargetMetaParameters")
     97          self.update()
     98
     99 -    def update(self):
    100          stim_params = self.stim.parameters # shorthand
    101          meta_params = self.meta_params # shorthand
    102
    103          # colors
    104          stim_params.color = meta_params.color
    105          self.screen.parameters.bgcolor = meta_params.bgcolor
    106
    107          # size and orientation
    108          stim_params.size = (meta_params.width, meta_params.height)
    109          stim_params.orientation = meta_params.orientation_deg
    110
    111          self.p.parameters.go_duration = ( meta_params.pre_stim_sec + meta_params.stim_sec + meta_params.post_stim_sec, 'seconds')
    112
    113 -    def go(self):
    114          self.p.parameters.enter_go_loop = 1
    115
    116 -    def quit_server(self):
    117          self.p.parameters.quit = 1
    118
    119 -def get_meta_controller_class():
    120      return TargetExperimentMetaController
    121
    122 -def make_stimuli():
    123      stimulus = VisionEgg.MoreStimuli.Target2D(anchor='center')
    124      return [('2d_overlay',stimulus)]
    125
    126 -def get_meta_controller_stimkey():
    127      return "target_server"
    128
    129  # Don't do anything unless this script is being run
    130  if __name__ == '__main__':
    131
    132      pyro_server = VisionEgg.PyroHelpers.PyroServer()
    133
    134      screen = VisionEgg.Core.Screen.create_default()
    135
    136      # get Vision Egg stimulus ready to go
    137      stimuli = make_stimuli()
    138      stimulus = stimuli[0][1]
    139      viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus])
    140      p = VisionEgg.FlowControl.Presentation(viewports=[viewport])
    141
    142      # now hand over control of grating and mask to FlatGratingExperimentMetaController
    143      meta_controller = TargetExperimentMetaController(screen,p,stimuli)
    144      pyro_server.connect(meta_controller,get_meta_controller_stimkey())
    145
    146      # get listener controller and register it
    147      p.add_controller(None,None, pyro_server.create_listener_controller())
    148
    149      # enter endless loop
    150      p.run_forever()
    151