def _create_value(self, key, text, tooltip): slot = tk.LabelFrame(self.csfm, text=text) label = tk.Label(slot) label.pack(side=tk.TOP, fill=tk.BOTH) slot.pack(side=tk.TOP, fill=tk.BOTH, padx=5) self.values[key] = label Tooltip.create(label, tooltip) return label
def _add_CAN(self, sim, canId, device): # TODO: this is not flexible lcan = len(sim.can) row = (lcan % 6) * 2 col = (lcan // 6) * 5 lbl = tk.Label(sim.can_slot, text=str(canId)) lbl.grid(column=col + 0, row=row) motor = ValueWidget(sim.can_slot, default=0.0) motor.grid(column=col + 1, row=row) sim.set_tooltip(motor, "CAN", canId) fl = CheckButtonWrapper(sim.can_slot, text="F") fl.grid(column=col + 2, row=row) rl = CheckButtonWrapper(sim.can_slot, text="R") rl.grid(column=col + 3, row=row) Tooltip.create(fl, "Forward limit switch") Tooltip.create(rl, "Reverse limit switch") mode_lbl_txt = tk.StringVar(value="") mode_label = tk.Label(sim.can_slot, textvariable=mode_lbl_txt) mode_label.grid(column=col + 4, row=row) labels = tk.Frame(sim.can_slot) labels.grid(column=col + 0, row=row + 1, columnspan=6) enc_value = tk.StringVar(value="E: 0") enc_label = tk.Label(labels, textvariable=enc_value) enc_label.pack(side=tk.LEFT) analog_value = tk.StringVar(value="A: 0") analog_label = tk.Label(labels, textvariable=analog_value) analog_label.pack(side=tk.LEFT) pwm_value = tk.StringVar(value="P: 0") pwm_label = tk.Label(labels, textvariable=pwm_value) pwm_label.pack(side=tk.LEFT) Tooltip.create(enc_label, "Encoder Input") Tooltip.create(analog_label, "Analog Input") Tooltip.create(pwm_label, "PWM Input") sim.can[canId] = ( motor, fl, rl, mode_lbl_txt, enc_value, analog_value, pwm_value, )
def _add_CAN(self, sim, canId, device): # TODO: this is not flexible row = len(self.can) * 2 lbl = tk.Label(sim.can_slot, text=str(canId)) lbl.grid(column=0, row=row) motor = ValueWidget(sim.can_slot, default=0.0) motor.grid(column=1, row=row) sim.set_tooltip(motor, 'CAN', canId) fl = CheckButtonWrapper(sim.can_slot, text='F') fl.grid(column=2, row=row) rl = CheckButtonWrapper(sim.can_slot, text='R') rl.grid(column=3, row=row) Tooltip.create(fl, 'Forward limit switch') Tooltip.create(rl, 'Reverse limit switch') mode_lbl_txt = tk.StringVar( value=self.can_mode_map[device['mode_select']]) mode_label = tk.Label(sim.can_slot, textvariable=mode_lbl_txt) mode_label.grid(column=4, row=row) labels = tk.Frame(sim.can_slot) labels.grid(column=0, row=row + 1, columnspan=6) enc_value = tk.StringVar(value='E: 0') enc_label = tk.Label(labels, textvariable=enc_value) enc_label.pack(side=tk.LEFT) analog_value = tk.StringVar(value='A: 0') analog_label = tk.Label(labels, textvariable=analog_value) analog_label.pack(side=tk.LEFT) pwm_value = tk.StringVar(value='P: 0') pwm_label = tk.Label(labels, textvariable=pwm_value) pwm_label.pack(side=tk.LEFT) Tooltip.create(enc_label, "Encoder Input") Tooltip.create(analog_label, "Analog Input") Tooltip.create(pwm_label, "PWM Input") self.can[canId] = (motor, fl, rl, mode_lbl_txt, enc_value, analog_value, pwm_value)
def set_joy_tooltip(self, widget, idx, typ, idx2): tooltip = self.config_obj['pyfrc']['joysticks'][str(idx)][typ].get( str(idx2)) if tooltip is not None: Tooltip.create(widget, tooltip)
def set_tooltip(self, widget, cat, idx): tooltip = self.config_obj['pyfrc'][cat].get(str(idx)) if tooltip is not None: Tooltip.create(widget, tooltip)
def _setup_widgets(self, frame): top = tk.Frame(frame) top.grid(column=0, row=0) bottom = tk.Frame(frame) bottom.grid(column=0, row=1) self.field = RobotField(frame, self.manager, self.config_obj) self.field.grid(column=1, row=0, rowspan=2) # status bar self.status = tk.Label(frame, bd=1, relief=tk.SUNKEN, anchor=tk.E) self.status.grid(column=0, row=2, columnspan=2, sticky=tk.W + tk.E) # analog slot = tk.LabelFrame(top, text='Analog') self.analog = [] for i in range(len(hal_data['analog_in'])): if hal_data['analog_in'][i]['initialized'] or hal_data[ 'analog_out'][i]['initialized']: label = tk.Label(slot, text=str(i)) label.grid(column=0, row=i + 1) vw = ValueWidget(slot, clickable=True, minval=-10.0, maxval=10.0) vw.grid(column=1, row=i + 1) self.set_tooltip(vw, 'analog', i) else: vw = None self.analog.append(vw) slot.pack(side=tk.LEFT, fill=tk.Y, padx=5) # digital slot = tk.LabelFrame(top, text='Digital') label = tk.Label(slot, text='PWM') label.grid(column=0, columnspan=4, row=0) self.pwm = [] for i in range(len(hal_data['pwm'])): if hal_data['pwm'][i]['initialized']: c = i // 10 label = tk.Label(slot, text=str(i)) label.grid(column=0 + 2 * c, row=1 + i % 10) vw = ValueWidget(slot) vw.grid(column=1 + 2 * c, row=1 + i % 10) self.set_tooltip(vw, 'pwm', i) else: vw = None self.pwm.append(vw) label = tk.Label(slot, text='Digital I/O') label.grid(column=4, columnspan=6, row=0) self.dio = [] for i in range(len(hal_data['dio'])): if hal_data['dio'][i]['initialized']: c = i // 9 label = tk.Label(slot, text=str(i)) label.grid(column=4 + c * 2, row=1 + i % 9) pi = PanelIndicator(slot, clickable=True) pi.grid(column=5 + c * 2, row=1 + i % 9) self.set_tooltip(pi, 'dio', i) else: pi = None self.dio.append(pi) label = tk.Label(slot, text='Relay') label.grid(column=10, columnspan=2, row=0, padx=5) self.relays = [] for i in range(len(hal_data['relay'])): if hal_data['relay'][i]['initialized']: label = tk.Label(slot, text=str(i)) label.grid(column=10, row=1 + i, sticky=tk.E) pi = PanelIndicator(slot) pi.grid(column=11, row=1 + i) self.set_tooltip(pi, 'relay', i) else: pi = None self.relays.append(pi) slot.pack(side=tk.LEFT, fill=tk.Y, padx=5) self.csfm = csfm = tk.Frame(top) # solenoid (pcm) self.pcm = {} # values self.values = {} # CAN self.can_slot = tk.LabelFrame(csfm, text='CAN') self.can_slot.pack(side=tk.LEFT, fill=tk.BOTH, expand=1, padx=5) self.can = {} csfm.pack(side=tk.LEFT, fill=tk.Y) # joysticks slot = tk.LabelFrame(bottom, text='Joysticks') self.joysticks = [] for i in range(4): axes = [] buttons = [] col = 1 + i * 3 row = 0 label = tk.Label(slot, text='Stick %s' % i) label.grid(column=col, columnspan=3, row=row) row += 1 # TODO: make this configurable for j, t in enumerate(['LX', 'LY', 'LT', 'RY', 'RX', 'RT']): label = tk.Label(slot, text=t) label.grid(column=col, row=row) vw = ValueWidget(slot, clickable=True, default=0.0) vw.grid(column=col + 1, row=row, columnspan=2) self.set_joy_tooltip(vw, i, 'axes', t) axes.append(vw) row += 1 # POV: this needs improvement label = tk.Label(slot, text='POV') label.grid(column=col, row=row) pov = ValueWidget(slot, clickable=True, default=-1, minval=-1, maxval=360, step=45, round_to_step=True) pov.grid(column=col + 1, row=row, columnspan=2) row += 1 for j in range(1, 11): var = tk.IntVar() ck = tk.Checkbutton(slot, text=str(j), variable=var) ck.grid(column=col + 1 + (1 - j % 2), row=row + int((j - 1) / 2)) self.set_joy_tooltip(ck, i, 'buttons', j) buttons.append((ck, var)) self.joysticks.append((axes, buttons, [pov])) slot.pack(side=tk.LEFT, fill=tk.Y, padx=5) ctrl_frame = tk.Frame(bottom) # timing control timing_control = tk.LabelFrame(ctrl_frame, text='Time') def _set_realtime(): if realtime_mode.get() == 0: step_button.pack_forget() step_entry.pack_forget() self.on_pause(False) else: step_button.pack(fill=tk.X) step_entry.pack() self.on_pause(True) realtime_mode = tk.IntVar() button = tk.Radiobutton(timing_control, text='Run', variable=realtime_mode, value=0, command=_set_realtime) button.pack(fill=tk.X) button = tk.Radiobutton(timing_control, text='Pause', variable=realtime_mode, value=1, command=_set_realtime) button.pack(fill=tk.X) step_button = tk.Button(timing_control, text='Step', command=self.on_step_time) self.step_entry = tk.StringVar() self.step_entry.set("0.025") step_entry = tk.Entry(timing_control, width=6, textvariable=self.step_entry) Tooltip.create(step_button, 'Click this to increment time by the step value') Tooltip.create(step_entry, 'Time to step (in seconds)') realtime_mode.set(0) timing_control.pack(side=tk.TOP, fill=tk.BOTH, expand=1) # simulation control sim = tk.LabelFrame(ctrl_frame, text='Robot') self.state_buttons = [] self.mode = tk.IntVar() def _set_mode(): self.manager.set_mode(self.mode.get()) button = tk.Radiobutton(sim, text='Disabled', variable=self.mode, \ value=self.manager.MODE_DISABLED, command=_set_mode) button.pack(fill=tk.X) self.state_buttons.append(button) button = tk.Radiobutton(sim, text='Autonomous', variable=self.mode, \ value=self.manager.MODE_AUTONOMOUS, command=_set_mode) button.pack(fill=tk.X) self.state_buttons.append(button) button = tk.Radiobutton(sim, text='Teleoperated', variable=self.mode, \ value=self.manager.MODE_OPERATOR_CONTROL, command=_set_mode) button.pack(fill=tk.X) self.state_buttons.append(button) button = tk.Radiobutton(sim, text='Test', variable=self.mode, \ value=self.manager.MODE_TEST, command=_set_mode) button.pack(fill=tk.X) self.state_buttons.append(button) self.robot_dead = tk.Label(sim, text='Robot died!', fg='red') sim.pack(side=tk.TOP, fill=tk.BOTH, expand=1) # # Set up a combo box that allows you to select an autonomous # mode in the simulator # try: from tkinter.ttk import Combobox except: pass else: auton = tk.LabelFrame(ctrl_frame, text='Autonomous') self.autobox = Combobox(auton, state='readonly') self.autobox.bind('<<ComboboxSelected>>', self.on_auton_selected) self.autobox['width'] = 12 self.autobox.pack(fill=tk.X) Tooltip.create( self.autobox, "Use robotpy_ext.autonomous.AutonomousModeSelector to use this selection box" ) from networktables.util import ChooserControl self.auton_ctrl = ChooserControl( 'Autonomous Mode', lambda v: self.idle_add(self.on_auton_choices, v), lambda v: self.idle_add(self.on_auton_selection, v)) auton.pack(side=tk.TOP) gamedata = tk.LabelFrame(ctrl_frame, text='Game Data') self.gamedataval = tk.StringVar() if hasattr(self.gamedataval, 'trace_add'): self.gamedataval.trace_add('write', self.on_gamedata_selected) else: self.gamedataval.trace_variable('w', self.on_gamedata_selected) self.gamedatabox = Combobox(gamedata, textvariable=self.gamedataval) self.gamedatabox['width'] = 12 self.gamedatabox.pack(fill=tk.X) messages = self.config_obj['pyfrc']['game_specific_messages'] if messages: self.gamedatabox['values'] = messages self.gamedatabox.current(0) self.manager.game_specific_message = self.gamedatabox.get() Tooltip.create( self.gamedatabox, "Use this selection box to simulate game specific data") gamedata.pack(side=tk.TOP) ctrl_frame.pack(side=tk.LEFT, fill=tk.Y)