Пример #1
0
    def _handle_video_mouse_move(self, pos, orig_button):
        """User is moving mouse in the window while the button is down
        (for performance, these events are not sent when button is up)
        @p pos - current mouse position
        @p orig_button - button from the click event
        This function is rate-limited.
        """
        if not self._mouse_click_info:
            self.logger.debug('Ignoring spurious mouse move')
            return

        # How much we moved (in screen coordinates) -- so the range is
        # (-0.5..0.5) for each axis.
        delta_screen = add_pair(pos, self._mouse_click_info[0], -1.0)

        # Convert to new servo position by multiplying by arbitrary factor
        new_pos = add_pair(self._mouse_click_info[1], delta_screen,
                           25.0)
        if False:
            self.logger.debug(
                'Moving turret to (%+.1f, %+.1f) deg in response '
                'to mouse move at (%+.4f, %+.4f)',
                new_pos[0], new_pos[1], delta_screen[0], delta_screen[1])

        self.control_dict['turret'] = new_pos
        self._send_control()
Пример #2
0
    def _handle_video_mouse_move(self, pos, orig_button):
        """User is moving mouse in the window while the button is down
        (for performance, these events are not sent when button is up)
        @p pos - current mouse position
        @p orig_button - button from the click event
        This function is rate-limited.
        """
        if not self._mouse_click_info:
            self.logger.debug('Ignoring spurious mouse move')
            return

        # How much we moved (in screen coordinates) -- so the range is
        # (-0.5..0.5) for each axis.
        delta_screen = add_pair(pos, self._mouse_click_info[0], -1.0)

        # Convert to new servo position by multiplying by arbitrary factor
        new_pos = add_pair(self._mouse_click_info[1], delta_screen, 25.0)
        if False:
            self.logger.debug(
                'Moving turret to (%+.1f, %+.1f) deg in response '
                'to mouse move at (%+.4f, %+.4f)', new_pos[0], new_pos[1],
                delta_screen[0], delta_screen[1])

        self.control_dict['turret'] = new_pos
        self._send_control()
Пример #3
0
    def _handle_key_press(self, base_name, modifiers):
        arrows = self._ARROW_KEYS.get(base_name)
        if arrows:
            base_name = 'Arrows'

        name = modifiers + base_name

        speed = self.ui_state['speed']
        if name in self._GAIT_KEYS:
            dx, dy, dr = self._GAIT_KEYS[name]
            gait = RIPPLE_COMMAND.copy()
            gait['translate_x_mm_s'] = dx * 0.7 * speed
            gait['translate_y_mm_s'] = dy * 1.0 * speed
            gait['rotate_deg_s'] = dr * 0.3 * speed
            self.control_dict['gait'] = gait
            self.key_gait_active = True
        elif name in self._Z_KEYS:
            dz = self._Z_KEYS[name]
            self._add_z(dz)
        elif name in ['g']:
            change = self._MAX_Z_VALUE - self._MIN_Z_VALUE
            if RIPPLE_COMMAND['body_z_mm'] == self._MIN_Z_VALUE:
                self._add_z(change)
            else:
                self._add_z(-change)
        elif name in self._SPEED_KEYS:
            dspeed = self._SPEED_KEYS[name]
            self.ui_state['speed'] += dspeed
            self.ui_state['speed'] = max(
                self._MIN_SPEED_VALUE,
                min(self._MAX_SPEED_VALUE, self.ui_state['speed']))
        elif name in ['h', 'S-question']:
            self._print_help()
        elif name == 'l':
            self.control_dict['laser_on'] ^= 1
            self.logger.info('Laser set to %d',
                             self.control_dict['laser_on'])
        elif name in ['m', 'S-M']:
            val = self.control_dict['agitator_mode']
            if name == 'm' and val != 1:
                val, val_str = 1, 'auto'
            elif name == 'S-M' and val != 2:
                val, val_str = 2, 'force-on'
            else:
                val, val_str = 0, 'off'
            self.control_dict['agitator_mode'] = val
            self.logger.info('Agitator mode to %s(%d) (pwm %.3f)',
                             val_str, val,
                             self.control_dict['agitator_pwm'])
        elif name == 'S-G':
            self.control_dict['green_led_on'] ^= 1
            self.logger.info('Green LED set to %d',
                             self.control_dict['green_led_on'])
        elif name in ['Return']:
            self._prepare_fire_command(FCMD.now1)
        elif name == 'c':
            self.control_dict['turret'] = (0.0, 0.0)
            self.logger.info('Centered turret')
        elif name in ['C-Arrows', 'C-S-Arrows']:
            # Ctrl + arrows to move reticle center
            step = 1.0 if ('S-' in modifiers) else 0.25
            self.ui_state['reticle_offset'] = add_pair(
                self.ui_state['reticle_offset'], arrows, step)
            self.logger.info('Reticle center offset: %.3f, %.3f' %
                             self.ui_state['reticle_offset'])
        elif name == 'C-r':
            self.ui_state['reticle_offset'] = (0, 0)
            self.logger.info('Zeroed out reticle center offset')
        elif name in ['Arrows', 'S-Arrows']:
            # Move turret
            step = 5.0 if ('S-' in modifiers) else 0.5
            if self.control_dict.get('turret') is None:
                self.logger.warn('Cannot move turret -- center it first')
            else:
                self.control_dict['turret'] = new = add_pair(
                    self.control_dict['turret'], arrows, step)
                self.logger.debug('Moving turret to (%+.1f, %+.1f) deg '
                                  'in response to keys',
                                  new[0], new[1])
        elif name == 'C-S-M-Arrows':
            # Method will do its own logging
            step = 0.25
            self.c_cal.tweak_fixups(arrows[0] * step, arrows[1] * step)
        elif name == 't':
            newmode = (self.ui_state['reticle_mode'] + 1) % 3
            self.ui_state['reticle_mode'] = newmode
            self.logger.info('Set reticle_mode=%r', newmode)
        elif name == 'KP_Add':
            self.ui_state['msg_font_size'] += 1
        elif name == 'KP_Subtract':
            self.ui_state['msg_font_size'] = max(
                4, self.ui_state['msg_font_size'] - 1)
        elif name in ['S-parenleft', 'S-parenright', 'S-asterisk']:
            newval = max(
                0,
                self.ui_state['fire_duration'] +
                (-0.05 if name == 'S-parenleft' else
                  0.05 if name == 'S-parenright' else 0))
            self.ui_state['fire_duration'] = newval
            self.logger.info('Fire duration set to %.2f sec', newval)

        elif name == 'Escape':
            if self.osd_logsaver and self.osd_logsaver.data:
                numlines = len(self.osd_logsaver.data)
                self.logger.info('Cleared on-screen display (%d lines)',
                                 numlines)
                self._log_event('cli-log-osd-cleared', numlines=numlines)
                del self.osd_logsaver.data[:]
            else:
                self.ui_state['status_on'] ^= True
                self.logger.debug('Set status_on=%r',
                                  self.ui_state['status_on'])
        elif name in self._FIRE_COMMANDS:
            self.ui_state['autofire_mode'] = newval = self._FIRE_COMMANDS[name]
            self.logger.info('Right-button autofire mode %d', newval)
            if newval == FCMD.off:
                # Halt firing immediately when autofire is disabled
                self.control_dict['fire_cmd'] = None
        elif base_name in ['Shift_R', 'Shift_L',
                           'Control_R', 'Control_L',
                           'Alt_R', 'Alt_L']:
            # Ignore modifiers
            pass
        else:
            self.logger.debug('Unknown key %r' % name)

        self._state_updated()
        self._send_control()
Пример #4
0
    def _handle_key_press(self, base_name, modifiers):
        arrows = self._ARROW_KEYS.get(base_name)
        if arrows:
            base_name = 'Arrows'

        name = modifiers + base_name

        speed = self.ui_state['speed']
        if name in self._GAIT_KEYS:
            dx, dy, dr = self._GAIT_KEYS[name]
            gait = RIPPLE_COMMAND.copy()
            gait['translate_x_mm_s'] = dx * 0.7 * speed
            gait['translate_y_mm_s'] = dy * 1.0 * speed
            gait['rotate_deg_s'] = dr * 0.3 * speed
            self.control_dict['gait'] = gait
            self.key_gait_active = True
        elif name in self._Z_KEYS:
            dz = self._Z_KEYS[name]
            self._add_z(dz)
        elif name in ['g']:
            change = self._MAX_Z_VALUE - self._MIN_Z_VALUE
            if RIPPLE_COMMAND['body_z_mm'] == self._MIN_Z_VALUE:
                self._add_z(change)
            else:
                self._add_z(-change)
        elif name in self._SPEED_KEYS:
            dspeed = self._SPEED_KEYS[name]
            self.ui_state['speed'] += dspeed
            self.ui_state['speed'] = max(
                self._MIN_SPEED_VALUE,
                min(self._MAX_SPEED_VALUE, self.ui_state['speed']))
        elif name in ['h', 'S-question']:
            self._print_help()
        elif name == 'l':
            self.control_dict['laser_on'] ^= 1
            self.logger.info('Laser set to %d', self.control_dict['laser_on'])
        elif name in ['m', 'S-M']:
            val = self.control_dict['agitator_mode']
            if name == 'm' and val != 1:
                val, val_str = 1, 'auto'
            elif name == 'S-M' and val != 2:
                val, val_str = 2, 'force-on'
            else:
                val, val_str = 0, 'off'
            self.control_dict['agitator_mode'] = val
            self.logger.info('Agitator mode to %s(%d) (pwm %.3f)', val_str,
                             val, self.control_dict['agitator_pwm'])
        elif name == 'S-G':
            self.control_dict['green_led_on'] ^= 1
            self.logger.info('Green LED set to %d',
                             self.control_dict['green_led_on'])
        elif name in ['Return']:
            self._prepare_fire_command(FCMD.now1)
        elif name == 'c':
            self.control_dict['turret'] = (0.0, 0.0)
            self.logger.info('Centered turret')
        elif name in ['C-Arrows', 'C-S-Arrows']:
            # Ctrl + arrows to move reticle center
            step = 1.0 if ('S-' in modifiers) else 0.25
            self.ui_state['reticle_offset'] = add_pair(
                self.ui_state['reticle_offset'], arrows, step)
            self.logger.info('Reticle center offset: %.3f, %.3f' %
                             self.ui_state['reticle_offset'])
        elif name == 'C-r':
            self.ui_state['reticle_offset'] = (0, 0)
            self.logger.info('Zeroed out reticle center offset')
        elif name in ['Arrows', 'S-Arrows']:
            # Move turret
            step = 5.0 if ('S-' in modifiers) else 0.5
            if self.control_dict.get('turret') is None:
                self.logger.warn('Cannot move turret -- center it first')
            else:
                self.control_dict['turret'] = new = add_pair(
                    self.control_dict['turret'], arrows, step)
                self.logger.debug(
                    'Moving turret to (%+.1f, %+.1f) deg '
                    'in response to keys', new[0], new[1])
        elif name == 'C-S-M-Arrows':
            # Method will do its own logging
            step = 0.25
            self.c_cal.tweak_fixups(arrows[0] * step, arrows[1] * step)
        elif name == 't':
            newmode = (self.ui_state['reticle_mode'] + 1) % 3
            self.ui_state['reticle_mode'] = newmode
            self.logger.info('Set reticle_mode=%r', newmode)
        elif name == 'KP_Add':
            self.ui_state['msg_font_size'] += 1
        elif name == 'KP_Subtract':
            self.ui_state['msg_font_size'] = max(
                4, self.ui_state['msg_font_size'] - 1)
        elif name in ['S-parenleft', 'S-parenright', 'S-asterisk']:
            newval = max(
                0, self.ui_state['fire_duration'] +
                (-0.05 if name == 'S-parenleft' else
                 0.05 if name == 'S-parenright' else 0))
            self.ui_state['fire_duration'] = newval
            self.logger.info('Fire duration set to %.2f sec', newval)

        elif name == 'Escape':
            if self.osd_logsaver and self.osd_logsaver.data:
                numlines = len(self.osd_logsaver.data)
                self.logger.info('Cleared on-screen display (%d lines)',
                                 numlines)
                self._log_event('cli-log-osd-cleared', numlines=numlines)
                del self.osd_logsaver.data[:]
            else:
                self.ui_state['status_on'] ^= True
                self.logger.debug('Set status_on=%r',
                                  self.ui_state['status_on'])
        elif name in self._FIRE_COMMANDS:
            self.ui_state['autofire_mode'] = newval = self._FIRE_COMMANDS[name]
            self.logger.info('Right-button autofire mode %d', newval)
            if newval == FCMD.off:
                # Halt firing immediately when autofire is disabled
                self.control_dict['fire_cmd'] = None
        elif base_name in [
                'Shift_R', 'Shift_L', 'Control_R', 'Control_L', 'Alt_R',
                'Alt_L'
        ]:
            # Ignore modifiers
            pass
        else:
            self.logger.debug('Unknown key %r' % name)

        self._state_updated()
        self._send_control()