コード例 #1
0
    def __init__(self, parent, title):
        wx.Frame.__init__(self,
                          parent,
                          title=title,
                          size=(275, 3 * 120),
                          style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)

        try:
            self.maze = PlusMaze()
        except DeviceError:
            wx.MessageBox(
                'Error initializing the FPGA.\nSee console for detailed information.',
                'PlusMazeController', wx.OK | wx.ICON_ERROR)
            self.Close()

        # Set up GUI
        self._initialize_menu()
        self._initialize_buttons()
        self.CreateStatusBar()
        self.StatusBar.SetFieldsCount(3)
        self.StatusBar.SetStatusWidths([-3, -1, -1])  # Relative widths 3:1:1

        # Sample initial location of mouse (may be garbage)
        self.prev_pos = self.maze.get_last_detected_pos()
        print_msg("Initial detected position: {}".format(self.prev_pos))
        self.StatusBar.SetStatusText(self.prev_pos, 1)

        # Start polling of maze
        self.poll_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.default_polling, self.poll_timer)
        self.start_default_polling()

        self.Show(True)
コード例 #2
0
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(275,3*120),
                          style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)

        try:
            self.maze = PlusMaze()
        except DeviceError:
            wx.MessageBox('Error initializing the FPGA.\nSee console for detailed information.',
                          'PlusMazeController', wx.OK | wx.ICON_ERROR)
            self.Close()

        # Set up GUI
        self._initialize_menu()
        self._initialize_buttons()
        self.CreateStatusBar()
        self.StatusBar.SetFieldsCount(3)
        self.StatusBar.SetStatusWidths([-3, -1, -1]) # Relative widths 3:1:1

        # Sample initial location of mouse (may be garbage)
        self.prev_pos = self.maze.get_last_detected_pos()
        print_msg("Initial detected position: {}".format(self.prev_pos))
        self.StatusBar.SetStatusText(self.prev_pos, 1)

        # Start polling of maze
        self.poll_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.default_polling , self.poll_timer)
        self.start_default_polling()

        self.Show(True)
コード例 #3
0
class PlusMazeController(wx.Frame):
    '''
    User interface for the plus maze
    '''

    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(275,3*120),
                          style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)

        try:
            self.maze = PlusMaze()
        except DeviceError:
            wx.MessageBox('Error initializing the FPGA.\nSee console for detailed information.',
                          'PlusMazeController', wx.OK | wx.ICON_ERROR)
            self.Close()

        # Set up GUI
        self._initialize_menu()
        self._initialize_buttons()
        self.CreateStatusBar()
        self.StatusBar.SetFieldsCount(3)
        self.StatusBar.SetStatusWidths([-3, -1, -1]) # Relative widths 3:1:1

        # Sample initial location of mouse (may be garbage)
        self.prev_pos = self.maze.get_last_detected_pos()
        print_msg("Initial detected position: {}".format(self.prev_pos))
        self.StatusBar.SetStatusText(self.prev_pos, 1)

        # Start polling of maze
        self.poll_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.default_polling , self.poll_timer)
        self.start_default_polling()

        self.Show(True)


    def _initialize_menu(self):
        menubar = wx.MenuBar()

        # Maze options
        maze_menu = wx.Menu()
        self.maintain_t_maze = maze_menu.Append(wx.ID_ANY,
                                         'Maintain T-maze',
                                         'Maintain T-maze',
                                         kind=wx.ITEM_CHECK)
        maze_menu.Check(self.maintain_t_maze.GetId(), True)

        # Autoreward options
        reward_menu = wx.Menu()
        self.reward_enable = reward_menu.Append(wx.ID_ANY,
                                                'Enable',
                                                'Enable autoreward',
                                                kind=wx.ITEM_CHECK)
        reward_menu.AppendSeparator()
        self.reward_every_arm = reward_menu.Append(wx.ID_ANY,
                                                   'Reward every arm entry',
                                                   'Reward every arm entry',
                                                   kind=wx.ITEM_RADIO)
        self.reward_right_turns = reward_menu.Append(wx.ID_ANY,
                                                     'Reward right turns',
                                                     'Reward right turns only',
                                                     kind=wx.ITEM_RADIO)
        self.reward_left_turns  = reward_menu.Append(wx.ID_ANY,
                                                     'Reward left turns',
                                                     'Reward left turns only',
                                                     kind=wx.ITEM_RADIO)
        maze_menu.AppendMenu(wx.ID_ANY, '&Autoreward', reward_menu)
        maze_menu.AppendSeparator()
        maze_menu.Append(wx.ID_EXIT, 'Exit', 'Exit the program')
        self.Bind(wx.EVT_MENU, self.on_exit, id=wx.ID_EXIT)
        menubar.Append(maze_menu, '&Maze')

        # Trial options
        expt_menu = wx.Menu()

        expt_menu.Append(ID_EXPT_EGOTRAIN, 'Continuous egocentric training', '')
        self.Bind(wx.EVT_MENU, self.run_ego_training, id=ID_EXPT_EGOTRAIN)

        expt_menu.Append(ID_EXPT_SEMIAUTO, 'Semi-auto trials...', '')
        self.Bind(wx.EVT_MENU, self.run_semiauto_trials, id=ID_EXPT_SEMIAUTO)

        menubar.Append(expt_menu, '&Experiment')

        # Dev options
        dev_menu = wx.Menu()

        dev_menu.Append(ID_DEV_QUERYCNT, 'Query miniscope counter', '')
        self.Bind(wx.EVT_MENU, self.query_counter, id=ID_DEV_QUERYCNT)
        dev_menu.Append(ID_DEV_RESETCNT, 'Reset miniscope counter', '')
        self.Bind(wx.EVT_MENU, self.reset_counter, id=ID_DEV_RESETCNT)
        dev_menu.Append(ID_DEV_PULLBUF, 'Pull lickometer buffer', '')
        self.Bind(wx.EVT_MENU, self.pull_lickometer_buffer, id=ID_DEV_PULLBUF)

        menubar.Append(dev_menu, '&Dev')

        self.SetMenuBar(menubar)


    def _initialize_buttons(self):
        gs = wx.GridSizer(3,1)

        null_st = wx.StaticText(self, wx.ID_ANY, '')
        header_font = wx.Font(pointSize=12,
                              family=wx.DEFAULT,
                              style=wx.SLANT,
                              weight=wx.BOLD)

        # Gate
        gate_st = wx.StaticText(self, wx.ID_ANY, 'Gates:')
        gate_st.SetFont(header_font)

        gate_gs = wx.GridSizer(3,2)
        gate_gs.Add(gate_st, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
        gate_gs.Add(null_st, 0, wx.EXPAND)
        for d in PlusMaze.ordered_dirs:
            gate_btn = wx.ToggleButton(self, label=d)
            gate_btn.Bind(wx.EVT_TOGGLEBUTTON, self.actuate_gate)
            gate_gs.Add(gate_btn, 0, wx.EXPAND)
        
        gs.Add(gate_gs, 0, wx.EXPAND | wx.ALL, border=5)

        # Dosing
        dosing_st = wx.StaticText(self, wx.ID_ANY, 'Dosing:')
        dosing_st.SetFont(header_font)

        dosing_gs = wx.GridSizer(3,2)
        dosing_gs.Add(dosing_st, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)

        for d in ['all',] + PlusMaze.ordered_dirs:
            dose_btn = wx.Button(self, label=d)
            dose_btn.Bind(wx.EVT_BUTTON, self.dose)
            dosing_gs.Add(dose_btn, 0, wx.EXPAND)

        gs.Add(dosing_gs, 0, wx.EXPAND | wx.ALL, border=5)

        # Rotation
        rotate_st = wx.StaticText(self, wx.ID_ANY, 'Rotation:')
        rotate_st.SetFont(header_font)

        rotate_gs = wx.GridSizer(3,2)
        rotate_gs.Add(rotate_st, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
        rotate_gs.Add(null_st, 0, wx.EXPAND)

        for r in ['center ccw', 'center cw', 'maze ccw', 'maze cw']:
            rot_btn = wx.Button(self, label=r)
            rot_btn.Bind(wx.EVT_BUTTON, self.rotate)
            rotate_gs.Add(rot_btn, 0, wx.EXPAND)

        gs.Add(rotate_gs, 0, wx.EXPAND | wx.ALL, border=5)

        self.SetSizer(gs)


    def start_default_polling(self):
        print_msg("Start default maze polling")
        self.poll_timer.Start(PlusMaze.POLL_PERIOD)


    def stop_default_polling(self):
        self.poll_timer.Stop()
        print_msg("Stopped default maze polling")


    def default_polling(self, e):
        pos = self.maze.get_last_detected_pos()

        if (self.prev_pos != pos):
            print "*"
            print_msg("Detected mouse at {}".format(pos))

            try:
                turn = PlusMaze.pos_to_turn[(self.prev_pos, pos)]
                print_msg("Mouse executed {} turn".format(turn))

                # Autoreward
                if self.reward_enable.IsChecked():
                    if self.reward_every_arm.IsChecked():
                        print_msg("Autoreward (every arm)")
                        self.maze.dose(pos)
                    elif (self.reward_right_turns.IsChecked() & (turn=='right')):
                        print_msg("Autoreward (right turn)")
                        self.maze.dose(pos)
                    elif (self.reward_left_turns.IsChecked() & (turn=='left')):
                        print_msg("Autoreward (left turn)")
                        self.maze.dose(pos)

                # Maintain T-maze
                if self.maintain_t_maze.IsChecked():
                    self.maze.rotate(PlusMaze.turn_compensation[turn])

            except KeyError, e:
                print_msg("Warning! Did the mouse jump over the T-block?")

        # Set status
        self.prev_pos = pos
        self.StatusBar.SetStatusText(self.prev_pos, 1)

        lick = self.maze.get_lick_state()
        if lick:
            self.StatusBar.SetStatusText('Lick!', 2)
        else:
            self.StatusBar.SetStatusText('', 2)
コード例 #4
0
class PlusMazeController(wx.Frame):
    '''
    User interface for the plus maze
    '''
    def __init__(self, parent, title):
        wx.Frame.__init__(self,
                          parent,
                          title=title,
                          size=(275, 3 * 120),
                          style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)

        try:
            self.maze = PlusMaze()
        except DeviceError:
            wx.MessageBox(
                'Error initializing the FPGA.\nSee console for detailed information.',
                'PlusMazeController', wx.OK | wx.ICON_ERROR)
            self.Close()

        # Set up GUI
        self._initialize_menu()
        self._initialize_buttons()
        self.CreateStatusBar()
        self.StatusBar.SetFieldsCount(3)
        self.StatusBar.SetStatusWidths([-3, -1, -1])  # Relative widths 3:1:1

        # Sample initial location of mouse (may be garbage)
        self.prev_pos = self.maze.get_last_detected_pos()
        print_msg("Initial detected position: {}".format(self.prev_pos))
        self.StatusBar.SetStatusText(self.prev_pos, 1)

        # Start polling of maze
        self.poll_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.default_polling, self.poll_timer)
        self.start_default_polling()

        self.Show(True)

    def _initialize_menu(self):
        menubar = wx.MenuBar()

        # Maze options
        maze_menu = wx.Menu()
        self.maintain_t_maze = maze_menu.Append(wx.ID_ANY,
                                                'Maintain T-maze',
                                                'Maintain T-maze',
                                                kind=wx.ITEM_CHECK)
        maze_menu.Check(self.maintain_t_maze.GetId(), True)

        # Autoreward options
        reward_menu = wx.Menu()
        self.reward_enable = reward_menu.Append(wx.ID_ANY,
                                                'Enable',
                                                'Enable autoreward',
                                                kind=wx.ITEM_CHECK)
        reward_menu.AppendSeparator()
        self.reward_every_arm = reward_menu.Append(wx.ID_ANY,
                                                   'Reward every arm entry',
                                                   'Reward every arm entry',
                                                   kind=wx.ITEM_RADIO)
        self.reward_right_turns = reward_menu.Append(wx.ID_ANY,
                                                     'Reward right turns',
                                                     'Reward right turns only',
                                                     kind=wx.ITEM_RADIO)
        self.reward_left_turns = reward_menu.Append(wx.ID_ANY,
                                                    'Reward left turns',
                                                    'Reward left turns only',
                                                    kind=wx.ITEM_RADIO)
        maze_menu.AppendMenu(wx.ID_ANY, '&Autoreward', reward_menu)
        maze_menu.AppendSeparator()
        maze_menu.Append(wx.ID_EXIT, 'Exit', 'Exit the program')
        self.Bind(wx.EVT_MENU, self.on_exit, id=wx.ID_EXIT)
        menubar.Append(maze_menu, '&Maze')

        # Trial options
        expt_menu = wx.Menu()

        expt_menu.Append(ID_EXPT_EGOTRAIN, 'Continuous egocentric training',
                         '')
        self.Bind(wx.EVT_MENU, self.run_ego_training, id=ID_EXPT_EGOTRAIN)

        expt_menu.Append(ID_EXPT_SEMIAUTO, 'Semi-auto trials...', '')
        self.Bind(wx.EVT_MENU, self.run_semiauto_trials, id=ID_EXPT_SEMIAUTO)

        menubar.Append(expt_menu, '&Experiment')

        # Dev options
        dev_menu = wx.Menu()

        dev_menu.Append(ID_DEV_QUERYCNT, 'Query miniscope counter', '')
        self.Bind(wx.EVT_MENU, self.query_counter, id=ID_DEV_QUERYCNT)
        dev_menu.Append(ID_DEV_RESETCNT, 'Reset miniscope counter', '')
        self.Bind(wx.EVT_MENU, self.reset_counter, id=ID_DEV_RESETCNT)
        dev_menu.Append(ID_DEV_PULLBUF, 'Pull lickometer buffer', '')
        self.Bind(wx.EVT_MENU, self.pull_lickometer_buffer, id=ID_DEV_PULLBUF)

        menubar.Append(dev_menu, '&Dev')

        self.SetMenuBar(menubar)

    def _initialize_buttons(self):
        gs = wx.GridSizer(3, 1)

        null_st = wx.StaticText(self, wx.ID_ANY, '')
        header_font = wx.Font(pointSize=12,
                              family=wx.DEFAULT,
                              style=wx.SLANT,
                              weight=wx.BOLD)

        # Gate
        gate_st = wx.StaticText(self, wx.ID_ANY, 'Gates:')
        gate_st.SetFont(header_font)

        gate_gs = wx.GridSizer(3, 2)
        gate_gs.Add(gate_st, 0,
                    wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
        gate_gs.Add(null_st, 0, wx.EXPAND)
        for d in PlusMaze.ordered_dirs:
            gate_btn = wx.ToggleButton(self, label=d)
            gate_btn.Bind(wx.EVT_TOGGLEBUTTON, self.actuate_gate)
            gate_gs.Add(gate_btn, 0, wx.EXPAND)

        gs.Add(gate_gs, 0, wx.EXPAND | wx.ALL, border=5)

        # Dosing
        dosing_st = wx.StaticText(self, wx.ID_ANY, 'Dosing:')
        dosing_st.SetFont(header_font)

        dosing_gs = wx.GridSizer(3, 2)
        dosing_gs.Add(dosing_st, 0,
                      wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)

        for d in [
                'all',
        ] + PlusMaze.ordered_dirs:
            dose_btn = wx.Button(self, label=d)
            dose_btn.Bind(wx.EVT_BUTTON, self.dose)
            dosing_gs.Add(dose_btn, 0, wx.EXPAND)

        gs.Add(dosing_gs, 0, wx.EXPAND | wx.ALL, border=5)

        # Rotation
        rotate_st = wx.StaticText(self, wx.ID_ANY, 'Rotation:')
        rotate_st.SetFont(header_font)

        rotate_gs = wx.GridSizer(3, 2)
        rotate_gs.Add(rotate_st, 0,
                      wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
        rotate_gs.Add(null_st, 0, wx.EXPAND)

        for r in ['center ccw', 'center cw', 'maze ccw', 'maze cw']:
            rot_btn = wx.Button(self, label=r)
            rot_btn.Bind(wx.EVT_BUTTON, self.rotate)
            rotate_gs.Add(rot_btn, 0, wx.EXPAND)

        gs.Add(rotate_gs, 0, wx.EXPAND | wx.ALL, border=5)

        self.SetSizer(gs)

    def start_default_polling(self):
        print_msg("Start default maze polling")
        self.poll_timer.Start(PlusMaze.POLL_PERIOD)

    def stop_default_polling(self):
        self.poll_timer.Stop()
        print_msg("Stopped default maze polling")

    def default_polling(self, e):
        pos = self.maze.get_last_detected_pos()

        if (self.prev_pos != pos):
            print "*"
            print_msg("Detected mouse at {}".format(pos))

            try:
                turn = PlusMaze.pos_to_turn[(self.prev_pos, pos)]
                print_msg("Mouse executed {} turn".format(turn))

                # Autoreward
                if self.reward_enable.IsChecked():
                    if self.reward_every_arm.IsChecked():
                        print_msg("Autoreward (every arm)")
                        self.maze.dose(pos)
                    elif (self.reward_right_turns.IsChecked() &
                          (turn == 'right')):
                        print_msg("Autoreward (right turn)")
                        self.maze.dose(pos)
                    elif (self.reward_left_turns.IsChecked() &
                          (turn == 'left')):
                        print_msg("Autoreward (left turn)")
                        self.maze.dose(pos)

                # Maintain T-maze
                '''
                if self.maintain_t_maze.IsChecked():
                    self.maze.rotate(PlusMaze.turn_compensation[turn])
                '''
                dice = random.randint(0, 1)

                if (turn == 'straight'):
                    if dice:
                        print_msg("Rotate block by 180 deg")
                        self.maze.rotate('center ccw')
                        sleep(1)
                        self.maze.rotate('center ccw')
                    else:
                        print_msg("Block kept in same position")
                else:
                    self.maze.rotate('center ccw' if dice else 'center cw')

            except KeyError, e:
                print_msg("Warning! Did the mouse jump over the T-block?")

        # Set status
        self.prev_pos = pos
        self.StatusBar.SetStatusText(self.prev_pos, 1)

        lick = self.maze.get_lick_state()
        if lick:
            self.StatusBar.SetStatusText('Lick!', 2)
        else:
            self.StatusBar.SetStatusText('', 2)