def __init__(self, ipcon, uid, version): PluginBase.__init__(self, ipcon, uid, 'DC Brick', version) self.setupUi(self) self.dc = BrickDC(uid, ipcon) self.device = self.dc self.update_timer = QTimer() self.update_timer.timeout.connect(self.update_data) self.speedometer = SpeedoMeter() self.vertical_layout_right.insertWidget(4, self.speedometer) self.new_value = 0 self.update_counter = 0 self.full_brake_time = 0 self.velocity_slider.sliderReleased.connect(self.velocity_slider_released) self.velocity_slider.valueChanged.connect(self.velocity_spin.setValue) self.velocity_spin.editingFinished.connect(self.velocity_spin_finished) self.acceleration_slider.sliderReleased.connect(self.acceleration_slider_released) self.acceleration_slider.valueChanged.connect(self.acceleration_spin.setValue) self.acceleration_spin.editingFinished.connect(self.acceleration_spin_finished) self.frequency_slider.sliderReleased.connect(self.frequency_slider_released) self.frequency_slider.valueChanged.connect(self.frequency_spin.setValue) self.frequency_spin.editingFinished.connect(self.frequency_spin_finished) self.radio_mode_brake.toggled.connect(self.brake_value_changed) self.radio_mode_coast.toggled.connect(self.coast_value_changed) self.minimum_voltage_button.pressed.connect(self.minimum_voltage_button_pressed) self.full_brake_button.pressed.connect(self.full_brake_pressed) self.enable_checkbox.stateChanged.connect(self.enable_state_changed) self.emergency_signal = None self.under_signal = None self.current_velocity_signal = None self.velocity_reached_signal = None self.qem = QErrorMessage(self) self.qtcb_under_voltage.connect(self.cb_under_voltage) self.dc.register_callback(self.dc.CALLBACK_UNDER_VOLTAGE, self.qtcb_under_voltage.emit) self.qtcb_emergency_shutdown.connect(self.cb_emergency_shutdown) self.dc.register_callback(self.dc.CALLBACK_EMERGENCY_SHUTDOWN, self.qtcb_emergency_shutdown.emit) self.qtcb_position_reached.connect(self.update_velocity) self.dc.register_callback(self.dc.CALLBACK_VELOCITY_REACHED, self.qtcb_position_reached.emit) self.dc.register_callback(self.dc.CALLBACK_CURRENT_VELOCITY, self.qtcb_position_reached.emit)
def __init__ (self, ipcon, uid): PluginBase.__init__(self, ipcon, uid) self.setupUi(self) self.dc = brick_dc.DC(self.uid) self.device = self.dc self.ipcon.add_device(self.dc) self.version = '.'.join(map(str, self.dc.get_version()[1])) self.update_timer = QTimer() self.update_timer.timeout.connect(self.update_data) self.speedometer = SpeedoMeter() self.vertical_layout_right.insertWidget(4, self.speedometer) self.new_value = 0 self.update_counter = 0 self.full_brake_time = 0 self.velocity_slider.sliderReleased.connect(self.velocity_slider_released) self.velocity_slider.valueChanged.connect(self.velocity_spin.setValue) self.velocity_spin.editingFinished.connect(self.velocity_spin_finished) self.acceleration_slider.sliderReleased.connect(self.acceleration_slider_released) self.acceleration_slider.valueChanged.connect(self.acceleration_spin.setValue) self.acceleration_spin.editingFinished.connect(self.acceleration_spin_finished) self.frequency_slider.sliderReleased.connect(self.frequency_slider_released) self.frequency_slider.valueChanged.connect(self.frequency_spin.setValue) self.frequency_spin.editingFinished.connect(self.frequency_spin_finished) self.radio_mode_brake.toggled.connect(self.brake_value_changed) self.radio_mode_coast.toggled.connect(self.coast_value_changed) self.minimum_voltage_button.pressed.connect(self.minimum_voltage_button_pressed) self.full_brake_button.pressed.connect(self.full_brake_pressed) self.enable_checkbox.stateChanged.connect(self.enable_state_changed) self.emergency_signal = None self.under_signal = None self.current_velocity_signal = None self.velocity_reached_signal = None self.qem = QErrorMessage(self) self.qtcb_under_voltage.connect(self.cb_under_voltage) self.dc.register_callback(self.dc.CALLBACK_UNDER_VOLTAGE, self.qtcb_under_voltage.emit) self.qtcb_emergency_shutdown.connect(self.cb_emergency_shutdown) self.dc.register_callback(self.dc.CALLBACK_EMERGENCY_SHUTDOWN, self.qtcb_emergency_shutdown.emit) self.qtcb_position_reached.connect(self.update_velocity) self.dc.register_callback(self.dc.CALLBACK_VELOCITY_REACHED, self.qtcb_position_reached.emit) self.dc.register_callback(self.dc.CALLBACK_CURRENT_VELOCITY, self.qtcb_position_reached.emit)
class DC(PluginBase, Ui_DC): qtcb_position_reached = pyqtSignal(int) qtcb_under_voltage = pyqtSignal(int) qtcb_emergency_shutdown = pyqtSignal() def __init__ (self, ipcon, uid): PluginBase.__init__(self, ipcon, uid) self.setupUi(self) self.dc = brick_dc.DC(self.uid) self.device = self.dc self.ipcon.add_device(self.dc) self.version = '.'.join(map(str, self.dc.get_version()[1])) self.update_timer = QTimer() self.update_timer.timeout.connect(self.update_data) self.speedometer = SpeedoMeter() self.vertical_layout_right.insertWidget(4, self.speedometer) self.new_value = 0 self.update_counter = 0 self.full_brake_time = 0 self.velocity_slider.sliderReleased.connect(self.velocity_slider_released) self.velocity_slider.valueChanged.connect(self.velocity_spin.setValue) self.velocity_spin.editingFinished.connect(self.velocity_spin_finished) self.acceleration_slider.sliderReleased.connect(self.acceleration_slider_released) self.acceleration_slider.valueChanged.connect(self.acceleration_spin.setValue) self.acceleration_spin.editingFinished.connect(self.acceleration_spin_finished) self.frequency_slider.sliderReleased.connect(self.frequency_slider_released) self.frequency_slider.valueChanged.connect(self.frequency_spin.setValue) self.frequency_spin.editingFinished.connect(self.frequency_spin_finished) self.radio_mode_brake.toggled.connect(self.brake_value_changed) self.radio_mode_coast.toggled.connect(self.coast_value_changed) self.minimum_voltage_button.pressed.connect(self.minimum_voltage_button_pressed) self.full_brake_button.pressed.connect(self.full_brake_pressed) self.enable_checkbox.stateChanged.connect(self.enable_state_changed) self.emergency_signal = None self.under_signal = None self.current_velocity_signal = None self.velocity_reached_signal = None self.qem = QErrorMessage(self) self.qtcb_under_voltage.connect(self.cb_under_voltage) self.dc.register_callback(self.dc.CALLBACK_UNDER_VOLTAGE, self.qtcb_under_voltage.emit) self.qtcb_emergency_shutdown.connect(self.cb_emergency_shutdown) self.dc.register_callback(self.dc.CALLBACK_EMERGENCY_SHUTDOWN, self.qtcb_emergency_shutdown.emit) self.qtcb_position_reached.connect(self.update_velocity) self.dc.register_callback(self.dc.CALLBACK_VELOCITY_REACHED, self.qtcb_position_reached.emit) self.dc.register_callback(self.dc.CALLBACK_CURRENT_VELOCITY, self.qtcb_position_reached.emit) def start(self): self.update_timer.start(1000) try: self.dc.set_current_velocity_period(100) self.update_start() self.update_data() except ip_connection.Error: return def stop(self): self.update_timer.stop() try: self.dc.set_current_velocity_period(0) except ip_connection.Error: return @staticmethod def has_name(name): return 'DC Brick' in name def cb_emergency_shutdown(self): if not self.qem.isVisible(): self.qem.setWindowTitle("Emergency Shutdown") self.qem.showMessage("Emergency Shutdown: Short-Circuit or Over-Temperature") def cb_under_voltage(self, ov): mv_str = self.minimum_voltage_label.text() ov_str = "%gV" % round(ov/1000.0, 1) if not self.qem.isVisible(): self.qem.setWindowTitle("Under Voltage") self.qem.showMessage("Under Voltage: Output Voltage of " + ov_str + " is below minimum voltage of " + mv_str) def enable_state_changed(self, state): try: if state == Qt.Checked: self.dc.enable() elif state == Qt.Unchecked: self.dc.disable() except ip_connection.Error: return def brake_value_changed(self, checked): if checked: try: self.dc.set_drive_mode(0) except ip_connection.Error: return def coast_value_changed(self, checked): if checked: try: self.dc.set_drive_mode(1) except ip_connection.Error: return def full_brake_pressed(self): try: self.dc.full_brake() except ip_connection.Error: return def minimum_voltage_selected(self, value): try: self.dc.set_minimum_voltage(value) except ip_connection.Error: return def minimum_voltage_button_pressed(self): qid = QInputDialog(self) qid.setInputMode(QInputDialog.IntInput) qid.setIntMinimum(5000) qid.setIntMaximum(0xFFFF) qid.setIntStep(100) try: qid.setIntValue(self.dc.get_minimum_voltage()) except ip_connection.Error: return qid.intValueSelected.connect(self.minimum_voltage_selected) qid.setLabelText("Choose minimum motor voltage in mV.") qid.open() def stack_input_voltage_update(self, sv): sv_str = "%gV" % round(sv/1000.0, 1) self.stack_voltage_label.setText(sv_str) def external_input_voltage_update(self, ev): ev_str = "%gV" % round(ev/1000.0, 1) self.external_voltage_label.setText(ev_str) def minimum_voltage_update(self, mv): mv_str = "%gV" % round(mv/1000.0, 1) self.minimum_voltage_label.setText(mv_str) def drive_mode_update(self, dm): if dm == 0: self.radio_mode_brake.setChecked(True) self.radio_mode_coast.setChecked(False) else: self.radio_mode_brake.setChecked(False) self.radio_mode_coast.setChecked(True) def current_consumption_update(self, cc): if cc >= 1000: cc_str = "%gA" % round(cc/1000.0, 1) else: cc_str = "%gmA" % cc self.current_label.setText(cc_str) def update_velocity(self, value): if value != self.speedometer.value(): self.speedometer.set_velocity(value) def update_start(self): try: dm = self.dc.get_drive_mode() self.drive_mode_update(dm) if not self.velocity_slider.isSliderDown(): velocity = self.dc.get_velocity() if velocity != self.velocity_slider.sliderPosition(): self.velocity_slider.setSliderPosition(velocity) self.velocity_spin.setValue(velocity) if not self.acceleration_slider.isSliderDown(): acceleration = self.dc.get_acceleration() if acceleration != self.acceleration_slider.sliderPosition(): self.acceleration_slider.setSliderPosition(acceleration) self.acceleration_spin.setValue(acceleration) if not self.frequency_slider.isSliderDown(): frequency = self.dc.get_pwm_frequency() if frequency != self.frequency_slider.sliderPosition(): self.frequency_slider.setSliderPosition(frequency) self.frequency_spin.setValue(frequency) enabled = self.dc.is_enabled() if enabled: self.enable_checkbox.setCheckState(Qt.Checked) else: self.enable_checkbox.setCheckState(Qt.Unchecked) except ip_connection.Error: return def update_data(self): try: sv = self.dc.get_stack_input_voltage() ev = self.dc.get_external_input_voltage() mv = self.dc.get_minimum_voltage() cc = self.dc.get_current_consumption() except ip_connection.Error: return self.stack_input_voltage_update(sv) self.external_input_voltage_update(ev) self.minimum_voltage_update(mv) self.current_consumption_update(cc) def acceleration_slider_released(self): value = self.acceleration_slider.value() self.acceleration_spin.setValue(value) try: self.dc.set_acceleration(value) except ip_connection.Error: return def acceleration_spin_finished(self): value = self.acceleration_spin.value() self.acceleration_slider.setValue(value) try: self.dc.set_acceleration(value) except ip_connection.Error: return def velocity_slider_released(self): value = self.velocity_slider.value() self.velocity_spin.setValue(value) try: self.dc.set_velocity(value) except ip_connection.Error: return def velocity_spin_finished(self): value = self.velocity_spin.value() self.velocity_slider.setValue(value) try: self.dc.set_velocity(value) except ip_connection.Error: return def frequency_slider_released(self): value = self.frequency_slider.value() self.frequency_spin.setValue(value) try: self.dc.set_pwm_frequency(value) except ip_connection.Error: return def frequency_spin_finished(self): value = self.frequency_spin.value() self.frequency_slider.setValue(value) try: self.dc.set_pwm_frequency(value) except ip_connection.Error: return
def __init__ (self, ipcon, uid): PluginBase.__init__(self, ipcon, uid) self.setupUi(self) self.stepper = brick_stepper.Stepper(self.uid) self.device = self.stepper self.ipcon.add_device(self.stepper) version = self.stepper.get_version() self.version = '.'.join(map(str, version[1])) self.version_minor = version[1][1] self.version_release = version[1][2] self.endis_all(False) self.update_timer = QTimer() self.update_timer.timeout.connect(self.update_data) self.speedometer = SpeedoMeter() self.vertical_layout_right.insertWidget(5, self.speedometer) self.new_value = 0 self.update_counter = 0 self.full_brake_time = 0 self.qem = QErrorMessage(self) self.qem.setWindowTitle("Under Voltage") self.velocity_slider.sliderReleased.connect(self.velocity_slider_released) self.velocity_slider.valueChanged.connect(self.velocity_spin.setValue) self.velocity_spin.editingFinished.connect(self.velocity_spin_finished) self.acceleration_slider.sliderReleased.connect(self.acceleration_slider_released) self.acceleration_slider.valueChanged.connect(self.acceleration_spin.setValue) self.acceleration_spin.editingFinished.connect(self.acceleration_spin_finished) self.deceleration_slider.sliderReleased.connect(self.deceleration_slider_released) self.deceleration_slider.valueChanged.connect(self.deceleration_spin.setValue) self.deceleration_spin.editingFinished.connect(self.deceleration_spin_finished) # self.decay_slider.sliderReleased.connect(self.decay_slider_released) # self.decay_slider.valueChanged.connect(self.decay_spin.setValue) # self.decay_spin.editingFinished.connect(self.decay_spin_finished) self.enable_checkbox.stateChanged.connect(self.enable_state_changed) self.forward_button.pressed.connect(self.forward_pressed) self.stop_button.pressed.connect(self.stop_pressed) self.full_brake_button.pressed.connect(self.full_brake_pressed) self.backward_button.pressed.connect(self.backward_pressed) self.to_button.pressed.connect(self.to_button_pressed) self.steps_button.pressed.connect(self.steps_button_pressed) self.motor_current_button.pressed.connect(self.motor_current_button_pressed) self.minimum_motor_voltage_button.pressed.connect(self.minimum_motor_voltage_button_pressed) self.mode_dropbox.currentIndexChanged.connect(self.mode_changed) self.qtcb_position_reached.connect(self.cb_position_reached) self.stepper.register_callback(self.stepper.CALLBACK_POSITION_REACHED, self.qtcb_position_reached.emit) self.qtcb_under_voltage.connect(self.cb_under_voltage) self.stepper.register_callback(self.stepper.CALLBACK_UNDER_VOLTAGE, self.qtcb_under_voltage.emit) self.update_data_async_thread = None self.update_data_alive = False self.ste = 0 self.pos = 0 self.current_velocity = 0 self.cur = 0 self.sv = 0 self.ev = 0 self.mv = 0 self.mod = 0
class Stepper(PluginBase, Ui_Stepper): qtcb_position_reached = pyqtSignal(int) qtcb_under_voltage = pyqtSignal(int) def __init__ (self, ipcon, uid): PluginBase.__init__(self, ipcon, uid) self.setupUi(self) self.stepper = brick_stepper.Stepper(self.uid) self.device = self.stepper self.ipcon.add_device(self.stepper) version = self.stepper.get_version() self.version = '.'.join(map(str, version[1])) self.version_minor = version[1][1] self.version_release = version[1][2] self.endis_all(False) self.update_timer = QTimer() self.update_timer.timeout.connect(self.update_data) self.speedometer = SpeedoMeter() self.vertical_layout_right.insertWidget(5, self.speedometer) self.new_value = 0 self.update_counter = 0 self.full_brake_time = 0 self.qem = QErrorMessage(self) self.qem.setWindowTitle("Under Voltage") self.velocity_slider.sliderReleased.connect(self.velocity_slider_released) self.velocity_slider.valueChanged.connect(self.velocity_spin.setValue) self.velocity_spin.editingFinished.connect(self.velocity_spin_finished) self.acceleration_slider.sliderReleased.connect(self.acceleration_slider_released) self.acceleration_slider.valueChanged.connect(self.acceleration_spin.setValue) self.acceleration_spin.editingFinished.connect(self.acceleration_spin_finished) self.deceleration_slider.sliderReleased.connect(self.deceleration_slider_released) self.deceleration_slider.valueChanged.connect(self.deceleration_spin.setValue) self.deceleration_spin.editingFinished.connect(self.deceleration_spin_finished) # self.decay_slider.sliderReleased.connect(self.decay_slider_released) # self.decay_slider.valueChanged.connect(self.decay_spin.setValue) # self.decay_spin.editingFinished.connect(self.decay_spin_finished) self.enable_checkbox.stateChanged.connect(self.enable_state_changed) self.forward_button.pressed.connect(self.forward_pressed) self.stop_button.pressed.connect(self.stop_pressed) self.full_brake_button.pressed.connect(self.full_brake_pressed) self.backward_button.pressed.connect(self.backward_pressed) self.to_button.pressed.connect(self.to_button_pressed) self.steps_button.pressed.connect(self.steps_button_pressed) self.motor_current_button.pressed.connect(self.motor_current_button_pressed) self.minimum_motor_voltage_button.pressed.connect(self.minimum_motor_voltage_button_pressed) self.mode_dropbox.currentIndexChanged.connect(self.mode_changed) self.qtcb_position_reached.connect(self.cb_position_reached) self.stepper.register_callback(self.stepper.CALLBACK_POSITION_REACHED, self.qtcb_position_reached.emit) self.qtcb_under_voltage.connect(self.cb_under_voltage) self.stepper.register_callback(self.stepper.CALLBACK_UNDER_VOLTAGE, self.qtcb_under_voltage.emit) self.update_data_async_thread = None self.update_data_alive = False self.ste = 0 self.pos = 0 self.current_velocity = 0 self.cur = 0 self.sv = 0 self.ev = 0 self.mv = 0 self.mod = 0 def start(self): self.update_timer.start(100) self.update_start() self.update_data_alive = True self.update_data_async_thread = Thread(target=self.update_data_async) self.update_data_async_thread.daemon = True self.update_data_async_thread.start() def stop(self): self.update_timer.stop() self.update_data_alive = False def has_reset_device(self): return self.version_minor > 1 or (self.version_minor == 1 and self.version_release > 4) def reset_device(self): if self.has_reset_device(): self.stepper.reset() def get_chip_temperature(self): if self.version_minor > 1 or (self.version_minor == 1 and self.version_release > 4): return u'{0} °C'.format(self.stepper.get_chip_temperature()/10.0) else: return '(> 1.1.4 needed)' @staticmethod def has_name(name): return 'Stepper Brick' in name def cb_position_reached(self, position): self.position_update(position) self.endis_all(True) def disable_list(self, button_list): for button in button_list: button.setEnabled(False) def endis_all(self, value): self.forward_button.setEnabled(value) self.stop_button.setEnabled(value) self.backward_button.setEnabled(value) self.to_button.setEnabled(value) self.steps_button.setEnabled(value) self.full_brake_button.setEnabled(value) def mode_changed(self, index): try: self.stepper.set_step_mode(1 << index) self.mod = 1 << index except ip_connection.Error: return def forward_pressed(self): try: self.stepper.drive_forward() except ip_connection.Error: return self.disable_list([self.to_button, self.steps_button]) def backward_pressed(self): try: self.stepper.drive_backward() except ip_connection.Error: return self.disable_list([self.to_button, self.steps_button]) def stop_pressed(self): try: self.stepper.stop() except ip_connection.Error: return self.endis_all(True) def full_brake_pressed(self): try: self.stepper.full_brake() except ip_connection.Error: return self.endis_all(True) def to_button_pressed(self): drive_to = self.to_spin.value() try: self.stepper.set_target_position(drive_to) except ip_connection.Error: return self.disable_list([self.to_button, self.steps_button, self.forward_button, self.backward_button]) def steps_button_pressed(self): drive_steps = self.steps_spin.value() try: self.stepper.set_steps(drive_steps) except ip_connection.Error: return self.disable_list([self.to_button, self.steps_button, self.forward_button, self.backward_button]) def motor_current_button_pressed(self): qid = QInputDialog(self) qid.setInputMode(QInputDialog.IntInput) qid.setIntMinimum(0) qid.setIntMaximum(2500) qid.setIntStep(100) try: qid.setIntValue(self.stepper.get_motor_current()) except ip_connection.Error: return qid.intValueSelected.connect(self.motor_current_selected) qid.setLabelText("Choose motor current in mA.") # "<font color=red>Setting this too high can destroy your Motor.</font>") qid.open() def minimum_motor_voltage_button_pressed(self): qid = QInputDialog(self) qid.setInputMode(QInputDialog.IntInput) qid.setIntMinimum(0) qid.setIntMaximum(40000) qid.setIntStep(100) try: qid.setIntValue(self.stepper.get_minimum_voltage()) except ip_connection.Error: return qid.intValueSelected.connect(self.minimum_motor_voltage_selected) qid.setLabelText("Choose minimum motor voltage in mV.") qid.open() def motor_current_selected(self, value): try: self.stepper.set_motor_current(value) except ip_connection.Error: return def minimum_motor_voltage_selected(self, value): try: self.stepper.set_minimum_voltage(value) except ip_connection.Error: return def cb_under_voltage(self, ov): mv_str = self.minimum_voltage_label.text() ov_str = "%gV" % round(ov/1000.0, 1) if not self.qem.isVisible(): self.qem.showMessage("Under Voltage: Output Voltage of " + ov_str + " is below minimum voltage of " + mv_str, "Stepper_UnderVoltage") def enable_state_changed(self, state): try: if state == Qt.Checked: self.endis_all(True) self.stepper.enable() elif state == Qt.Unchecked: self.endis_all(False) self.stepper.disable() except ip_connection.Error: return def stack_input_voltage_update(self, sv): sv_str = "%gV" % round(sv/1000.0, 1) self.stack_voltage_label.setText(sv_str) def external_input_voltage_update(self, ev): ev_str = "%gV" % round(ev/1000.0, 1) self.external_voltage_label.setText(ev_str) def minimum_voltage_update(self, mv): mv_str = "%gV" % round(mv/1000.0, 1) self.minimum_voltage_label.setText(mv_str) def maximum_current_update(self, cur): cur_str = "%gA" % round(cur/1000.0, 1) self.maximum_current_label.setText(cur_str) def position_update(self, pos): pos_str = "%d" % pos self.position_label.setText(pos_str) def remaining_steps_update(self, ste): ste_str = "%d" % ste self.remaining_steps_label.setText(ste_str) def mode_update(self, mod): if mod == 8: index = 3 elif mod == 4: index = 2 elif mod == 2: index = 1 else: index = 0 self.mode_dropbox.setCurrentIndex(index) def update_start(self): try: if not self.velocity_slider.isSliderDown(): velocity = self.stepper.get_max_velocity() if velocity != self.velocity_slider.sliderPosition(): self.velocity_slider.setSliderPosition(velocity) self.velocity_spin.setValue(velocity) if not self.acceleration_slider.isSliderDown() and \ not self.deceleration_slider.isSliderDown(): acc, dec = self.stepper.get_speed_ramping() if acc != self.acceleration_slider.sliderPosition(): self.acceleration_slider.setSliderPosition(acc) self.acceleration_spin.setValue(acc) if dec != self.deceleration_slider.sliderPosition(): self.deceleration_slider.setSliderPosition(dec) self.deceleration_spin.setValue(dec) # if not self.decay_slider.isSliderDown(): # dec = self.stepper.get_decay() # if dec != self.decay_slider.sliderPosition(): # self.decay_slider.setSliderPosition(dec) # self.decay_spin.setValue(dec) enabled = self.stepper.is_enabled() if enabled: if self.enable_checkbox.checkState() != Qt.Checked: self.endis_all(True) self.enable_checkbox.setCheckState(Qt.Checked) else: if self.enable_checkbox.checkState() != Qt.Unchecked: self.endis_all(False) self.enable_checkbox.setCheckState(Qt.Unchecked) except ip_connection.Error: return def update_data(self): self.remaining_steps_update(self.ste) self.position_update(self.pos) if self.current_velocity != self.speedometer.value(): self.speedometer.set_velocity(self.current_velocity) self.maximum_current_update(self.cur) self.stack_input_voltage_update(self.sv) self.external_input_voltage_update(self.ev) self.minimum_voltage_update(self.mv) self.mode_update(self.mod) def update_data_async(self): while self.update_data_alive: try: self.ste = self.stepper.get_remaining_steps() self.pos = self.stepper.get_current_position() self.current_velocity = self.stepper.get_current_velocity() self.update_counter += 1 if self.update_counter % 10 == 0: self.cur = self.stepper.get_motor_current() self.sv = self.stepper.get_stack_input_voltage() self.ev = self.stepper.get_external_input_voltage() self.mv = self.stepper.get_minimum_voltage() self.mod = self.stepper.get_step_mode() except: pass time.sleep(0.1) def velocity_slider_released(self): value = self.velocity_slider.value() self.velocity_spin.setValue(value) try: self.stepper.set_max_velocity(value) except ip_connection.Error: return def velocity_spin_finished(self): value = self.velocity_spin.value() self.velocity_slider.setValue(value) try: self.stepper.set_max_velocity(value) except ip_connection.Error: return def acceleration_slider_released(self): acc = self.acceleration_slider.value() dec = self.deceleration_slider.value() self.acceleration_spin.setValue(acc) try: self.stepper.set_speed_ramping(acc, dec) except ip_connection.Error: return def acceleration_spin_finished(self): acc = self.acceleration_spin.value() dec = self.deceleration_spin.value() self.acceleration_slider.setValue(acc) try: self.stepper.set_speed_ramping(acc, dec) except ip_connection.Error: return def deceleration_slider_released(self): acc = self.acceleration_slider.value() dec = self.deceleration_slider.value() self.deceleration_spin.setValue(dec) try: self.stepper.set_speed_ramping(acc, dec) except ip_connection.Error: return def deceleration_spin_finished(self): acc = self.acceleration_spin.value() dec = self.deceleration_spin.value() self.deceleration_slider.setValue(dec) try: self.stepper.set_speed_ramping(acc, dec) except ip_connection.Error: return
def __init__(self, ipcon, uid): PluginBase.__init__(self, ipcon, uid) self.setupUi(self) self.stepper = brick_stepper.Stepper(self.uid) self.device = self.stepper self.ipcon.add_device(self.stepper) self.version = '.'.join(map(str, self.stepper.get_version()[1])) self.endis_all(False) self.update_timer = QTimer() self.update_timer.timeout.connect(self.update_data) self.speedometer = SpeedoMeter() self.vertical_layout_right.insertWidget(5, self.speedometer) self.new_value = 0 self.update_counter = 0 self.full_brake_time = 0 self.qem = QErrorMessage(self) self.qem.setWindowTitle("Under Voltage") self.velocity_slider.sliderReleased.connect( self.velocity_slider_released) self.velocity_slider.valueChanged.connect(self.velocity_spin.setValue) self.velocity_spin.editingFinished.connect(self.velocity_spin_finished) self.acceleration_slider.sliderReleased.connect( self.acceleration_slider_released) self.acceleration_slider.valueChanged.connect( self.acceleration_spin.setValue) self.acceleration_spin.editingFinished.connect( self.acceleration_spin_finished) self.deceleration_slider.sliderReleased.connect( self.deceleration_slider_released) self.deceleration_slider.valueChanged.connect( self.deceleration_spin.setValue) self.deceleration_spin.editingFinished.connect( self.deceleration_spin_finished) self.decay_slider.sliderReleased.connect(self.decay_slider_released) self.decay_slider.valueChanged.connect(self.decay_spin.setValue) self.decay_spin.editingFinished.connect(self.decay_spin_finished) self.enable_checkbox.stateChanged.connect(self.enable_state_changed) self.forward_button.pressed.connect(self.forward_pressed) self.stop_button.pressed.connect(self.stop_pressed) self.full_brake_button.pressed.connect(self.full_brake_pressed) self.backward_button.pressed.connect(self.backward_pressed) self.to_button.pressed.connect(self.to_button_pressed) self.steps_button.pressed.connect(self.steps_button_pressed) self.motor_current_button.pressed.connect( self.motor_current_button_pressed) self.minimum_motor_voltage_button.pressed.connect( self.minimum_motor_voltage_button_pressed) self.mode_dropbox.currentIndexChanged.connect(self.mode_changed) self.qtcb_position_reached.connect(self.cb_position_reached) self.stepper.register_callback(self.stepper.CALLBACK_POSITION_REACHED, self.qtcb_position_reached.emit) self.qtcb_under_voltage.connect(self.cb_under_voltage) self.stepper.register_callback(self.stepper.CALLBACK_UNDER_VOLTAGE, self.qtcb_under_voltage.emit)
class Stepper(PluginBase, Ui_Stepper): qtcb_position_reached = pyqtSignal(int) qtcb_under_voltage = pyqtSignal(int) def __init__(self, ipcon, uid): PluginBase.__init__(self, ipcon, uid) self.setupUi(self) self.stepper = brick_stepper.Stepper(self.uid) self.device = self.stepper self.ipcon.add_device(self.stepper) self.version = '.'.join(map(str, self.stepper.get_version()[1])) self.endis_all(False) self.update_timer = QTimer() self.update_timer.timeout.connect(self.update_data) self.speedometer = SpeedoMeter() self.vertical_layout_right.insertWidget(5, self.speedometer) self.new_value = 0 self.update_counter = 0 self.full_brake_time = 0 self.qem = QErrorMessage(self) self.qem.setWindowTitle("Under Voltage") self.velocity_slider.sliderReleased.connect( self.velocity_slider_released) self.velocity_slider.valueChanged.connect(self.velocity_spin.setValue) self.velocity_spin.editingFinished.connect(self.velocity_spin_finished) self.acceleration_slider.sliderReleased.connect( self.acceleration_slider_released) self.acceleration_slider.valueChanged.connect( self.acceleration_spin.setValue) self.acceleration_spin.editingFinished.connect( self.acceleration_spin_finished) self.deceleration_slider.sliderReleased.connect( self.deceleration_slider_released) self.deceleration_slider.valueChanged.connect( self.deceleration_spin.setValue) self.deceleration_spin.editingFinished.connect( self.deceleration_spin_finished) self.decay_slider.sliderReleased.connect(self.decay_slider_released) self.decay_slider.valueChanged.connect(self.decay_spin.setValue) self.decay_spin.editingFinished.connect(self.decay_spin_finished) self.enable_checkbox.stateChanged.connect(self.enable_state_changed) self.forward_button.pressed.connect(self.forward_pressed) self.stop_button.pressed.connect(self.stop_pressed) self.full_brake_button.pressed.connect(self.full_brake_pressed) self.backward_button.pressed.connect(self.backward_pressed) self.to_button.pressed.connect(self.to_button_pressed) self.steps_button.pressed.connect(self.steps_button_pressed) self.motor_current_button.pressed.connect( self.motor_current_button_pressed) self.minimum_motor_voltage_button.pressed.connect( self.minimum_motor_voltage_button_pressed) self.mode_dropbox.currentIndexChanged.connect(self.mode_changed) self.qtcb_position_reached.connect(self.cb_position_reached) self.stepper.register_callback(self.stepper.CALLBACK_POSITION_REACHED, self.qtcb_position_reached.emit) self.qtcb_under_voltage.connect(self.cb_under_voltage) self.stepper.register_callback(self.stepper.CALLBACK_UNDER_VOLTAGE, self.qtcb_under_voltage.emit) def start(self): self.update_timer.start(100) self.update_start() def stop(self): self.update_timer.stop() @staticmethod def has_name(name): return 'Stepper Brick' in name def cb_position_reached(self, position): self.position_update(position) self.endis_all(True) def disable_list(self, button_list): for button in button_list: button.setEnabled(False) def endis_all(self, value): self.forward_button.setEnabled(value) self.stop_button.setEnabled(value) self.backward_button.setEnabled(value) self.to_button.setEnabled(value) self.steps_button.setEnabled(value) self.full_brake_button.setEnabled(value) def mode_changed(self, index): try: self.stepper.set_step_mode(1 << index) except ip_connection.Error: return def forward_pressed(self): try: self.stepper.drive_forward() except ip_connection.Error: return self.disable_list([self.to_button, self.steps_button]) def backward_pressed(self): try: self.stepper.drive_backward() except ip_connection.Error: return self.disable_list([self.to_button, self.steps_button]) def stop_pressed(self): try: self.stepper.stop() except ip_connection.Error: return self.endis_all(True) def full_brake_pressed(self): try: self.stepper.full_brake() except ip_connection.Error: return self.endis_all(True) def to_button_pressed(self): drive_to = self.to_spin.value() try: self.stepper.set_target_position(drive_to) except ip_connection.Error: return self.disable_list([ self.to_button, self.steps_button, self.forward_button, self.backward_button ]) def steps_button_pressed(self): drive_steps = self.steps_spin.value() try: self.stepper.set_steps(drive_steps) except ip_connection.Error: return self.disable_list([ self.to_button, self.steps_button, self.forward_button, self.backward_button ]) def motor_current_button_pressed(self): qid = QInputDialog(self) qid.setInputMode(QInputDialog.IntInput) qid.setIntMinimum(0) qid.setIntMaximum(2500) qid.setIntStep(100) try: qid.setIntValue(self.stepper.get_motor_current()) except ip_connection.Error: return qid.intValueSelected.connect(self.motor_current_selected) qid.setLabelText("Choose motor current in mA.") # "<font color=red>Setting this too high can destroy your Motor.</font>") qid.open() def minimum_motor_voltage_button_pressed(self): qid = QInputDialog(self) qid.setInputMode(QInputDialog.IntInput) qid.setIntMinimum(0) qid.setIntMaximum(40000) qid.setIntStep(100) try: qid.setIntValue(self.stepper.get_minimum_voltage()) except ip_connection.Error: return qid.intValueSelected.connect(self.minimum_motor_voltage_selected) qid.setLabelText("Choose minimum motor voltage in mV.") qid.open() def motor_current_selected(self, value): try: self.stepper.set_motor_current(value) except ip_connection.Error: return def minimum_motor_voltage_selected(self, value): try: self.stepper.set_minimum_voltage(value) except ip_connection.Error: return def cb_under_voltage(self, ov): mv_str = self.minimum_voltage_label.text() ov_str = "%gV" % round(ov / 1000.0, 1) if not self.qem.isVisible(): self.qem.showMessage("Under Voltage: Output Voltage of " + ov_str + " is below minimum voltage of " + mv_str) def enable_state_changed(self, state): try: if state == Qt.Checked: self.endis_all(True) self.stepper.enable() elif state == Qt.Unchecked: self.endis_all(False) self.stepper.disable() except ip_connection.Error: return def stack_input_voltage_update(self, sv): sv_str = "%gV" % round(sv / 1000.0, 1) self.stack_voltage_label.setText(sv_str) def external_input_voltage_update(self, ev): ev_str = "%gV" % round(ev / 1000.0, 1) self.external_voltage_label.setText(ev_str) def minimum_voltage_update(self, mv): mv_str = "%gV" % round(mv / 1000.0, 1) self.minimum_voltage_label.setText(mv_str) def maximum_current_update(self, cur): cur_str = "%gA" % round(cur / 1000.0, 1) self.maximum_current_label.setText(cur_str) def position_update(self, pos): pos_str = "%g" % pos self.position_label.setText(pos_str) def remaining_steps_update(self, ste): ste_str = "%g" % ste self.remaining_steps_label.setText(ste_str) def mode_update(self, mod): if mod == 8: index = 3 elif mod == 4: index = 2 elif mod == 2: index = 1 else: index = 0 self.mode_dropbox.setCurrentIndex(index) def update_start(self): try: if not self.velocity_slider.isSliderDown(): velocity = self.stepper.get_max_velocity() if velocity != self.velocity_slider.sliderPosition(): self.velocity_slider.setSliderPosition(velocity) self.velocity_spin.setValue(velocity) if not self.acceleration_slider.isSliderDown() and \ not self.deceleration_slider.isSliderDown(): acc, dec = self.stepper.get_speed_ramping() if acc != self.acceleration_slider.sliderPosition(): self.acceleration_slider.setSliderPosition(acc) self.acceleration_spin.setValue(acc) if dec != self.deceleration_slider.sliderPosition(): self.deceleration_slider.setSliderPosition(dec) self.deceleration_spin.setValue(dec) if not self.decay_slider.isSliderDown(): dec = self.stepper.get_decay() if dec != self.decay_slider.sliderPosition(): self.decay_slider.setSliderPosition(dec) self.decay_spin.setValue(dec) enabled = self.stepper.is_enabled() if enabled: if self.enable_checkbox.checkState() != Qt.Checked: self.endis_all(True) self.enable_checkbox.setCheckState(Qt.Checked) else: if self.enable_checkbox.checkState() != Qt.Unchecked: self.endis_all(False) self.enable_checkbox.setCheckState(Qt.Unchecked) except ip_connection.Error: return def update_infos(self): try: cur = self.stepper.get_motor_current() sv = self.stepper.get_stack_input_voltage() ev = self.stepper.get_external_input_voltage() mv = self.stepper.get_minimum_voltage() mod = self.stepper.get_step_mode() except ip_connection.Error: return self.maximum_current_update(cur) self.stack_input_voltage_update(sv) self.external_input_voltage_update(ev) self.minimum_voltage_update(mv) self.mode_update(mod) def update_values(self): try: ste = self.stepper.get_remaining_steps() pos = self.stepper.get_current_position() self.remaining_steps_update(ste) self.position_update(pos) current_velocity = self.stepper.get_current_velocity() if current_velocity != self.speedometer.value(): self.speedometer.set_velocity(current_velocity) except ip_connection.Error: return def update_data(self): try: ste = self.stepper.get_remaining_steps() pos = self.stepper.get_current_position() self.remaining_steps_update(ste) self.position_update(pos) current_velocity = self.stepper.get_current_velocity() if current_velocity != self.speedometer.value(): self.speedometer.set_velocity(current_velocity) except ip_connection.Error: return self.update_counter += 1 if self.update_counter % 10 == 0: self.update_infos() self.update_values() def velocity_slider_released(self): value = self.velocity_slider.value() self.velocity_spin.setValue(value) try: self.stepper.set_max_velocity(value) except ip_connection.Error: return def velocity_spin_finished(self): value = self.velocity_spin.value() self.velocity_slider.setValue(value) try: self.stepper.set_max_velocity(value) except ip_connection.Error: return def acceleration_slider_released(self): acc = self.acceleration_slider.value() dec = self.deceleration_slider.value() self.acceleration_spin.setValue(acc) try: self.stepper.set_speed_ramping(acc, dec) except ip_connection.Error: return def acceleration_spin_finished(self): acc = self.acceleration_spin.value() dec = self.deceleration_spin.value() self.acceleration_slider.setValue(acc) try: self.stepper.set_speed_ramping(acc, dec) except ip_connection.Error: return def deceleration_slider_released(self): acc = self.acceleration_slider.value() dec = self.deceleration_slider.value() self.deceleration_spin.setValue(dec) try: self.stepper.set_speed_ramping(acc, dec) except ip_connection.Error: return def deceleration_spin_finished(self): acc = self.acceleration_spin.value() dec = self.deceleration_spin.value() self.deceleration_slider.setValue(dec) try: self.stepper.set_speed_ramping(acc, dec) except ip_connection.Error: return def decay_slider_released(self): value = self.decay_slider.value() self.decay_spin.setValue(value) try: self.stepper.set_decay(value) except ip_connection.Error: return def decay_spin_finished(self): value = self.decay_spin.value() self.decay_slider.setValue(value) try: self.stepper.set_decay(value) except ip_connection.Error: return