def setup(self):

        ''' 
            process custom settings that might have been set after initializing
            the object.  
        '''
        # check if these parameters / properties / attributes were actually set!
        self.USE_MMAP = getattr(self, 'receive_data_from_matlab', self.USE_MMAP)
        self.SETTINGS.COLOR_TO_USE = getattr(self, 'COLOR_TO_USE', self.SETTINGS.COLOR_TO_USE)

        # add 'abs_plugin_ID' to plugin name.
        self.PLUGIN_NAME = self.PLUGIN_NAME + '-' + str(self.abs_plugin_ID)


        ''' set variables based on init() values. '''
        self.Y_LIMS = [0, self.SETTINGS.WINDOW_HEIGHT_DEFAULT]
        self.SETTINGS.WINDOW_WIDTH_CURRENT = self.SETTINGS.WINDOW_WIDTH_DEFAULT
        self.SETTINGS.WINDOW_HEIGHT_CURRENT = self.SETTINGS.WINDOW_HEIGHT_DEFAULT

        ''' setup mmap or random data interface '''
        status, self.MMAP, self.RANDOM_DATA = setup_incoming_data_interface(self.USE_MMAP, self.PLUGIN_NAME, self.NBR_CHANNELS, self.nPointsToUpdate, self.nPoints, self.SETTINGS.WINDOW_WIDTH_CURRENT, self.SETTINGS.WINDOW_HEIGHT_CURRENT)
        if not status:
             sys.exit(1)


        ''' setup plot queue '''
        self.plot_queue = setup_plotting_queue()


        ''' generate initial positions & colors, and setup VOBs '''
        self.vbo_data, self.vbo_colors, self.x_coords, self.SETTINGS.COLOR_USED = \
            gl_setup_initial_data_and_color_and_vbos(self.nPoints, n_COORDINATES_PER_COLOR, self.NBR_CHANNELS, self.SETTINGS)


        ''' horizontal and vertical lines - setup even if user doesn't want 
            to see them, because we setup key press functions to en-/disable them. '''
        # horizontal line showing the threshold 
        self.line_hor = line_default_horizontal(self)

        # vertical line showing which data point is going to be update next 
        self.line_ver = line_default_vertical(self)

        ''' axes - setup even it user doesn't want to see it, because of kpf. '''
        self.coord_axes, self.y_axis_tics = axes_default_with_y_ticks(self)


        ''' other stuff '''
        # is Tkinter installed and running?
        self.SETTINGS = tkinter_register_with_settings(self.SETTINGS)

        # set the window caption. Can't do it in 'setup_window' because some parameters
        # are not processed there yet.
        self.setup_window_caption()
    def on_key_press(self, symbol, modifiers):

        # offset that needs to be added to 'key.MOD_*' in order to match the
        # 'modifiers' value
        mod_offset = 16

        """ key press function for y limits """
        key_matched = self.kpf_change_y_lims(symbol, modifiers, mod_offset)
        # skip remainder of key press function in case 'kpf_change_y_lims' had a hit.
        if key_matched:
            return

        """ key press function for horizontal line """
        key_matched = self.kpf_change_horizontal_line(symbol, modifiers, mod_offset)
        # skip remainder of key press function in case 'kpf_change_horizontal_line' had a hit.
        if key_matched:
            return

        """ remaining keys """
        if symbol == key.A:
            if modifiers == key.MOD_CTRL + mod_offset:
                if self.SHOW_AXES:
                    self.coord_axes, self.y_axis_tics, self.SHOW_AXES = False, False, False
                else:
                    self.SHOW_AXES = True
                    self.coord_axes, self.y_axis_tics = axes_default_with_y_ticks(self.SETTINGS, self.Y_LIMS)

        elif symbol == key.C:
            self.plot_queue = setup_plotting_queue()
            print "Cleared Plot-Queue"

        elif symbol == key.F:  # show / hide FPS display
            self.SHOW_FPS = not self.SHOW_FPS

        elif symbol == key.H:  # show help menu
            print " "
            print "      *** HELP ***"
            print " "
            print "\t 0: \t\t\trestore original y-lims"
            print "\t 1: \t\t\tdecrease upper y-lim"
            print "\t 2: \t\t\tincrease upper y-lim"
            print "\t 3: \t\t\tdecrease lower y-lim"
            print "\t 4: \t\t\tincrease lower y-lim"
            print "\t a + ctrl: \t\tshow / hide axes"
            print "\t f: \t\t\tshow / hide FPS display"
            print "\t q: \t\t\tshow number of elements in plot queue"
            print "\t t: \t\t\tset position of horizontal line"
            print "\t t + shift: \t\tprint out current position of horizontal line"
            print "\t t + ctrl: \t\tshow / hide horizontal line"
            print "\t v + ctrl: \t\tshow / hide vertical line"
            print "\t y: \t\t\tset upper y-lim to value from command line"
            print "\t y + shift: \t\tset lower y-lim to value from command line"
            print "\t y + ctrl: \t\tset upper and lower y limits through GUI"
            print "\t arrow up: \t\tmove horizontal line up by one"
            print "\t arrow down: \t\tmove horizontal line down by one"
            print "\t arrow up + shift: \tmove horizontal line up by five"
            print "\t arrow down + shift: \tmove horizontal line down by five"
            print "\t space bar: \t\tpause / resume screen update"
            print " "

        elif symbol == key.Q:  # show number of elements in plot queue
            print "Plot-Queue size: %d" % (len(self.plot_queue))

        elif symbol == key.V:  # show / hide vertical line (toggle display of vertical line)
            if modifiers == key.MOD_CTRL + mod_offset:
                if not self.SHOW_VERTICAL_LINE:
                    self.line_ver = line_default_vertical(self.SETTINGS.WINDOW_HEIGHT_CURRENT, self.x_coords)
                self.SHOW_VERTICAL_LINE = not self.SHOW_VERTICAL_LINE

        elif symbol == key.ESCAPE:  # quit program
            sys.exit()

        elif symbol == key.SPACE:  # freeze / resume plotting
            self.DO_DRAW = not self.DO_DRAW
    def setup(self):

        """ set variables based on init() values. """
        self.Y_LIMS = [0, self.SETTINGS.WINDOW_HEIGHT_DEFAULT]
        self.SETTINGS.WINDOW_WIDTH_CURRENT = self.SETTINGS.WINDOW_WIDTH_DEFAULT
        self.SETTINGS.WINDOW_HEIGHT_CURRENT = self.SETTINGS.WINDOW_HEIGHT_DEFAULT

        # add 'abs_plugin_ID' to plugin name.
        self.PLUGIN_NAME = self.PLUGIN_NAME + "-" + str(self.abs_plugin_ID)

        """ setup mmap or random data interface """
        status, self.MMAP, self.DATA = setup_incoming_data_interface(
            self.USE_MMAP,
            self.PLUGIN_NAME,
            self.NBR_CHANNELS,
            self.nPointsToUpdate,
            self.nPoints,
            self.SETTINGS.WINDOW_WIDTH_CURRENT,
            self.SETTINGS.WINDOW_HEIGHT_CURRENT,
        )
        if not status:
            sys.exit(1)

        """ setup plot queue """
        self.plot_queue = setup_plotting_queue()

        """ generate initial positions & colors, and setup VOBs """
        self.vbo_data, self.vbo_colors, self.x_coords = gl_setup_initial_data_and_color_and_vbos(
            self.nPoints,
            n_COORDINATES_PER_COLOR,
            self.NBR_CHANNELS,
            self.SETTINGS.WINDOW_WIDTH_DEFAULT,
            self.SETTINGS.WINDOW_HEIGHT_DEFAULT,
        )

        """ horizontal and vertical lines """
        # horizontal line showing the threshold
        if self.SHOW_HORIZONTAL_LINE:
            self.line_hor = line_default_horizontal(self)

            # vertical line showing which data point is going to be update next
        if self.SHOW_VERTICAL_LINE:
            self.line_ver = line_default_vertical(self)

        """ axes """
        if self.SHOW_AXES:
            self.coord_axes, self.y_axis_tics = axes_default_with_y_ticks(self)

        """ other stuff """
        # is Tkinter installed and running?
        self.SETTINGS = tkinter_register_with_settings(self.SETTINGS)

        # set default gl modes
        set_gl_defaults(self.POINT_SIZE)

        # try to render a smooth line (if supported by driver)
        gl_enable_line_smoothing()

        # set window title
        win_title = "generating random data"
        if self.USE_MMAP:
            win_title = "receiving data from matlab"
        nbr_points_shown = " -- showing %s points per panel." % self.nPoints
        self.set_caption(self.PLUGIN_NAME + " -- " + win_title + nbr_points_shown)

        # hide mouse - disabled.
        # self.set_mouse_visible(False)

        # schedule the 'update()' method to be called each 'update_interval'
        pyglet.clock.schedule_interval(self.update, self.update_interval)

        # Create a font for our FPS clock
        ft = pyglet.font.load("Arial", 28)
        self.fps_display = pyglet.clock.ClockDisplay(font=ft, interval=0.125, format="FPS %(fps).2f")