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()
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()
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()