def __init__(self, vehicle_event_dispatcher, ui_event_dispatcher):
        QtGui.QWidget.__init__(self)
        BasePanelController.__init__(self)
        
        self.ui = Ui_PIDTuningPanel()
        self.ui.setupUi(self)

        self._current_roll_pid = PIDData(100,150,-300)
        self._current_pitch_pid = PIDData(100,150,-300)
        self._current_stick_scaling = 1
        
        self._is_starting = False
        self._user_update_mode = PIDUpdateMode.BEGINNER_MODE
                
        self._roll_pid_controller = PIDWidgetController()
        self.ui.main_layout.addWidget(self._roll_pid_controller)
        self._roll_pid_controller.set_title('PID tuning')
        self._roll_pid_controller.set_default(PIDData(100,150,-350))
        self._roll_pid_controller.set_p_bounds(50,200)
        self._roll_pid_controller.set_p_title('Pitch Gain')
        self._roll_pid_controller.set_i_bounds(100,300)
        self._roll_pid_controller.set_i_title('Error correction')
        self._roll_pid_controller.set_d_bounds(-1000,-100)
        self._roll_pid_controller.set_d_title('Set Point')
        
        self._pitch_pid_controller = PIDWidgetController()
        self.ui.main_layout.addWidget(self._pitch_pid_controller)
        self._pitch_pid_controller.set_title('PID tuning')
        self._pitch_pid_controller.set_default(PIDData(100,150,-350))
        self._pitch_pid_controller.set_p_bounds(50,200)
        self._pitch_pid_controller.set_p_title('Pitch Gain')
        self._pitch_pid_controller.set_i_bounds(100,300)
        self._pitch_pid_controller.set_i_title('Error correction')
        self._pitch_pid_controller.set_d_bounds(-1000,-100)
        self._pitch_pid_controller.set_d_title('Set Point')
        
        self._stick_scaling_controller = ConfigSingleLinePanelController()
        self._stick_scaling_controller.set_title('Stick Scaling')
        self._stick_scaling_controller.set_line_description('Stick Scaling')
        self._stick_scaling_controller.set_bounds(1,6)
        self._stick_scaling_controller.set_default('1')
        self.ui.main_layout.addWidget(self._stick_scaling_controller)
        
        ui_event_dispatcher.register(self._protocol_handler_changed_event, UIEventDispatcher.PROTOCOL_HANDLER_EVENT)
        vehicle_event_dispatcher.register(self._roll_pid_received, VehicleEventDispatcher.PID_ACCRO_ROLL)
        vehicle_event_dispatcher.register(self._pitch_pid_received, VehicleEventDispatcher.PID_ACCRO_PITCH)
        vehicle_event_dispatcher.register(self._accro_stick_scaling_received, VehicleEventDispatcher.PID_ACCRO_STICK_SCALING)
        
        self._cpt_before_send = 5
        self.set_beginner_mode()
 def unpack_data():
     if not self._date_output_queue.empty():
         try:
             data = self._date_output_queue.get()
             serial_data = data.split(',')
             accroRollPidData = PIDData(serial_data[0], serial_data[1],
                                        serial_data[2])
             self._vehicle_event_dispatcher.dispatch_event(
                 VehicleEventDispatcher.PID_ACCRO_ROLL,
                 accroRollPidData)
             accroPitchPidData = PIDData(serial_data[3], serial_data[4],
                                         serial_data[5])
             self._vehicle_event_dispatcher.dispatch_event(
                 VehicleEventDispatcher.PID_ACCRO_PITCH,
                 accroPitchPidData)
             self._vehicle_event_dispatcher.dispatch_event(
                 VehicleEventDispatcher.PID_ACCRO_STICK_SCALING,
                 serial_data[6])
         except:
             logging.error(
                 "Protocol Handler: Failed to notify update rate PID data"
             )
             print "Protocol Handler: Failed to notify update rate PID data"
    def __init__(self, vehicle_event_dispatcher, ui_event_dispatcher):
        QtGui.QWidget.__init__(self)
        BasePanelController.__init__(self)

        self.ui = Ui_PIDTuningPanel()
        self.ui.setupUi(self)

        self._current_roll_pid = PIDData(100, 150, -300)
        self._current_pitch_pid = PIDData(100, 150, -300)
        self._current_stick_scaling = 1

        self._is_starting = False
        self._user_update_mode = PIDUpdateMode.BEGINNER_MODE

        self._roll_pid_controller = PIDWidgetController()
        self.ui.main_layout.addWidget(self._roll_pid_controller)
        self._roll_pid_controller.set_title('PID tuning')
        self._roll_pid_controller.set_default(PIDData(100, 150, -350))
        self._roll_pid_controller.set_p_bounds(50, 200)
        self._roll_pid_controller.set_p_title('Pitch Gain')
        self._roll_pid_controller.set_i_bounds(100, 300)
        self._roll_pid_controller.set_i_title('Error correction')
        self._roll_pid_controller.set_d_bounds(-1000, -100)
        self._roll_pid_controller.set_d_title('Set Point')

        self._pitch_pid_controller = PIDWidgetController()
        self.ui.main_layout.addWidget(self._pitch_pid_controller)
        self._pitch_pid_controller.set_title('PID tuning')
        self._pitch_pid_controller.set_default(PIDData(100, 150, -350))
        self._pitch_pid_controller.set_p_bounds(50, 200)
        self._pitch_pid_controller.set_p_title('Pitch Gain')
        self._pitch_pid_controller.set_i_bounds(100, 300)
        self._pitch_pid_controller.set_i_title('Error correction')
        self._pitch_pid_controller.set_d_bounds(-1000, -100)
        self._pitch_pid_controller.set_d_title('Set Point')

        self._stick_scaling_controller = ConfigSingleLinePanelController()
        self._stick_scaling_controller.set_title('Stick Scaling')
        self._stick_scaling_controller.set_line_description('Stick Scaling')
        self._stick_scaling_controller.set_bounds(1, 6)
        self._stick_scaling_controller.set_default('1')
        self.ui.main_layout.addWidget(self._stick_scaling_controller)

        ui_event_dispatcher.register(self._protocol_handler_changed_event,
                                     UIEventDispatcher.PROTOCOL_HANDLER_EVENT)
        vehicle_event_dispatcher.register(
            self._roll_pid_received, VehicleEventDispatcher.PID_ACCRO_ROLL)
        vehicle_event_dispatcher.register(
            self._pitch_pid_received, VehicleEventDispatcher.PID_ACCRO_PITCH)
        vehicle_event_dispatcher.register(
            self._accro_stick_scaling_received,
            VehicleEventDispatcher.PID_ACCRO_STICK_SCALING)

        self._cpt_before_send = 5
        self.set_beginner_mode()
class AccroPIDTuningController(QtGui.QWidget, BasePanelController):
    
    def __init__(self, vehicle_event_dispatcher, ui_event_dispatcher):
        QtGui.QWidget.__init__(self)
        BasePanelController.__init__(self)
        
        self.ui = Ui_PIDTuningPanel()
        self.ui.setupUi(self)

        self._current_roll_pid = PIDData(100,150,-300)
        self._current_pitch_pid = PIDData(100,150,-300)
        self._current_stick_scaling = 1
        
        self._is_starting = False
        self._user_update_mode = PIDUpdateMode.BEGINNER_MODE
                
        self._roll_pid_controller = PIDWidgetController()
        self.ui.main_layout.addWidget(self._roll_pid_controller)
        self._roll_pid_controller.set_title('PID tuning')
        self._roll_pid_controller.set_default(PIDData(100,150,-350))
        self._roll_pid_controller.set_p_bounds(50,200)
        self._roll_pid_controller.set_p_title('Pitch Gain')
        self._roll_pid_controller.set_i_bounds(100,300)
        self._roll_pid_controller.set_i_title('Error correction')
        self._roll_pid_controller.set_d_bounds(-1000,-100)
        self._roll_pid_controller.set_d_title('Set Point')
        
        self._pitch_pid_controller = PIDWidgetController()
        self.ui.main_layout.addWidget(self._pitch_pid_controller)
        self._pitch_pid_controller.set_title('PID tuning')
        self._pitch_pid_controller.set_default(PIDData(100,150,-350))
        self._pitch_pid_controller.set_p_bounds(50,200)
        self._pitch_pid_controller.set_p_title('Pitch Gain')
        self._pitch_pid_controller.set_i_bounds(100,300)
        self._pitch_pid_controller.set_i_title('Error correction')
        self._pitch_pid_controller.set_d_bounds(-1000,-100)
        self._pitch_pid_controller.set_d_title('Set Point')
        
        self._stick_scaling_controller = ConfigSingleLinePanelController()
        self._stick_scaling_controller.set_title('Stick Scaling')
        self._stick_scaling_controller.set_line_description('Stick Scaling')
        self._stick_scaling_controller.set_bounds(1,6)
        self._stick_scaling_controller.set_default('1')
        self.ui.main_layout.addWidget(self._stick_scaling_controller)
        
        ui_event_dispatcher.register(self._protocol_handler_changed_event, UIEventDispatcher.PROTOCOL_HANDLER_EVENT)
        vehicle_event_dispatcher.register(self._roll_pid_received, VehicleEventDispatcher.PID_ACCRO_ROLL)
        vehicle_event_dispatcher.register(self._pitch_pid_received, VehicleEventDispatcher.PID_ACCRO_PITCH)
        vehicle_event_dispatcher.register(self._accro_stick_scaling_received, VehicleEventDispatcher.PID_ACCRO_STICK_SCALING)
        
        self._cpt_before_send = 5
        self.set_beginner_mode()

    def _protocol_handler_changed_event(self, event, protocol_handler):
        self._protocol_handler = protocol_handler;
        
    def set_beginner_mode(self):
        self._user_update_mode = PIDUpdateMode.BEGINNER_MODE
        self._pitch_pid_controller.hide()
        self._roll_pid_controller.hide_i_line()
        self._roll_pid_controller.set_edit_box_enabled(False)
        self._stick_scaling_controller.set_edit_box_enabled(False)
        
    def set_intermediate_mode(self):
        self._user_update_mode = PIDUpdateMode.INTERMEDIATE_MODE
        self._pitch_pid_controller.show()
        self._roll_pid_controller.hide_i_line()
        self._pitch_pid_controller.hide_i_line()
        self._pitch_pid_controller.show()
        self._roll_pid_controller.set_edit_box_enabled(False)
        self._pitch_pid_controller.set_edit_box_enabled(False)
        self._stick_scaling_controller.set_edit_box_enabled(False)
    
    def set_advanced_mode(self):
        self._user_update_mode = PIDUpdateMode.ADVANCED_MODE
        self._pitch_pid_controller.show()
        self._roll_pid_controller.show_i_line()
        self._pitch_pid_controller.show_i_line()
        self._roll_pid_controller.set_edit_box_enabled(True)
        self._pitch_pid_controller.set_edit_box_enabled(True)
        self._stick_scaling_controller.set_edit_box_enabled(True)
        
    def _roll_pid_received(self, event, roll_pid):
        self._current_roll_pid = roll_pid
        if self._is_starting :
            self._roll_pid_controller.set_current_pid(roll_pid)
        
    def _pitch_pid_received(self, event, pitch_pid):
        self._current_pitch_pid = pitch_pid
        if self._is_starting :
            self._pitch_pid_controller.set_current_pid(pitch_pid)
        
    def _accro_stick_scaling_received(self, event, stick_scaling):
        self._current_stick_scaling = self.translate_current_stick_scaling_from_board(stick_scaling)
        if self._is_starting :
            self._stick_scaling_controller.set_value(self._current_stick_scaling)
            self._set_synched()
            self._is_starting = False
        
        if self.is_synched():
            self._set_synched()
            self._protocol_handler.send_command_wihout_subscription(self._protocol_handler.COMMANDS['WriteUserValuesEEPROM'])
        
    def start(self):
        self._is_starting = True
        self._sync_in_progress = True
        self._protocol_handler.get_accro_pid();
    
    def stop(self):
        self._protocol_handler.unsubscribe_command()
        
    def sync_with_board(self):
        if self._is_starting :
            return

        if self.is_synched() :
            self._protocol_handler.unsubscribe_command()
            self._set_synched()
            return
        
        if self._cpt_before_send == 5 :
            self._protocol_handler.unsubscribe_command()
            self._send_pid_to_board()
            self._cpt_before_send = 0
            self._protocol_handler.get_accro_pid();
        else:
            self._protocol_handler.send_command_wihout_subscription(self._protocol_handler.COMMANDS['GetRatePID']);
            self._cpt_before_send = self._cpt_before_send + 1
            
    def is_synched(self):
        try:
            if not self._current_roll_pid.is_equals(self._roll_pid_controller.get_current_pid()) :
                return False
            elif not self._current_pitch_pid.is_equals(self._pitch_pid_controller.get_current_pid()) :
                return False
            elif float(self._current_stick_scaling) != float(self._stick_scaling_controller.get_value()):
                return False
        except:
            return False
        return True
    
    def _set_synched(self):
        self._roll_pid_controller.p_line.set_same()
        self._roll_pid_controller.i_line.set_same()
        self._roll_pid_controller.d_line.set_same()
        self._pitch_pid_controller.p_line.set_same()
        self._pitch_pid_controller.i_line.set_same()
        self._pitch_pid_controller.d_line.set_same()
        self._stick_scaling_controller._line.set_same()
        
    def _send_pid_to_board(self):
        roll_pid = self._roll_pid_controller.get_current_pid()
        pitch_pid = self.get_pitch_pid_from_panel()
        stick_scaling = self.get_stick_scaling_from_panel()
        self._protocol_handler.set_accro_pid(roll_pid, pitch_pid, stick_scaling)
        
    def get_pitch_pid_from_panel(self):
        if self._user_update_mode == PIDUpdateMode.BEGINNER_MODE :
            self._pitch_pid_controller.set_current_pid(self._roll_pid_controller.get_current_pid())
            return self._roll_pid_controller.get_current_pid()
        else :
            return self._pitch_pid_controller.get_current_pid()
    
    def get_stick_scaling_from_panel(self):
        panel_value = self._stick_scaling_controller.get_value()
        return self.translate_stick_scaling_for_board(panel_value)
     
    def reset_default(self):
        self._roll_pid_controller.reset_default()
        self._pitch_pid_controller.reset_default()
        self._stick_scaling_controller.reset_default()
        
    def translate_current_stick_scaling_from_board(self,stick_scaling):
        if str(stick_scaling) == '1.00':
            return 1
        elif str(stick_scaling) == '0.90':
            return 2
        elif str(stick_scaling) == '0.80':
            return 3
        elif str(stick_scaling) == '0.70':
            return 4
        elif str(stick_scaling) == '0.60':
            return 5
        elif str(stick_scaling) == '0.50':
            return 6
    
    def translate_stick_scaling_for_board(self,panel_value):
        if int(panel_value) == 1 :
            return '1.00'
        elif float(panel_value) == 2 :
            return '0.90'
        elif float(panel_value) == 3 :
            return '0.80'
        elif float(panel_value) == 4 :
            return '0.70'
        elif float(panel_value) == 5 :
            return '0.60'
        elif float(panel_value) == 6 :
            return '0.50'
class AccroPIDTuningController(QtGui.QWidget, BasePanelController):
    def __init__(self, vehicle_event_dispatcher, ui_event_dispatcher):
        QtGui.QWidget.__init__(self)
        BasePanelController.__init__(self)

        self.ui = Ui_PIDTuningPanel()
        self.ui.setupUi(self)

        self._current_roll_pid = PIDData(100, 150, -300)
        self._current_pitch_pid = PIDData(100, 150, -300)
        self._current_stick_scaling = 1

        self._is_starting = False
        self._user_update_mode = PIDUpdateMode.BEGINNER_MODE

        self._roll_pid_controller = PIDWidgetController()
        self.ui.main_layout.addWidget(self._roll_pid_controller)
        self._roll_pid_controller.set_title('PID tuning')
        self._roll_pid_controller.set_default(PIDData(100, 150, -350))
        self._roll_pid_controller.set_p_bounds(50, 200)
        self._roll_pid_controller.set_p_title('Pitch Gain')
        self._roll_pid_controller.set_i_bounds(100, 300)
        self._roll_pid_controller.set_i_title('Error correction')
        self._roll_pid_controller.set_d_bounds(-1000, -100)
        self._roll_pid_controller.set_d_title('Set Point')

        self._pitch_pid_controller = PIDWidgetController()
        self.ui.main_layout.addWidget(self._pitch_pid_controller)
        self._pitch_pid_controller.set_title('PID tuning')
        self._pitch_pid_controller.set_default(PIDData(100, 150, -350))
        self._pitch_pid_controller.set_p_bounds(50, 200)
        self._pitch_pid_controller.set_p_title('Pitch Gain')
        self._pitch_pid_controller.set_i_bounds(100, 300)
        self._pitch_pid_controller.set_i_title('Error correction')
        self._pitch_pid_controller.set_d_bounds(-1000, -100)
        self._pitch_pid_controller.set_d_title('Set Point')

        self._stick_scaling_controller = ConfigSingleLinePanelController()
        self._stick_scaling_controller.set_title('Stick Scaling')
        self._stick_scaling_controller.set_line_description('Stick Scaling')
        self._stick_scaling_controller.set_bounds(1, 6)
        self._stick_scaling_controller.set_default('1')
        self.ui.main_layout.addWidget(self._stick_scaling_controller)

        ui_event_dispatcher.register(self._protocol_handler_changed_event,
                                     UIEventDispatcher.PROTOCOL_HANDLER_EVENT)
        vehicle_event_dispatcher.register(
            self._roll_pid_received, VehicleEventDispatcher.PID_ACCRO_ROLL)
        vehicle_event_dispatcher.register(
            self._pitch_pid_received, VehicleEventDispatcher.PID_ACCRO_PITCH)
        vehicle_event_dispatcher.register(
            self._accro_stick_scaling_received,
            VehicleEventDispatcher.PID_ACCRO_STICK_SCALING)

        self._cpt_before_send = 5
        self.set_beginner_mode()

    def _protocol_handler_changed_event(self, event, protocol_handler):
        self._protocol_handler = protocol_handler

    def set_beginner_mode(self):
        self._user_update_mode = PIDUpdateMode.BEGINNER_MODE
        self._pitch_pid_controller.hide()
        self._roll_pid_controller.hide_i_line()
        self._roll_pid_controller.set_edit_box_enabled(False)
        self._stick_scaling_controller.set_edit_box_enabled(False)

    def set_intermediate_mode(self):
        self._user_update_mode = PIDUpdateMode.INTERMEDIATE_MODE
        self._pitch_pid_controller.show()
        self._roll_pid_controller.hide_i_line()
        self._pitch_pid_controller.hide_i_line()
        self._pitch_pid_controller.show()
        self._roll_pid_controller.set_edit_box_enabled(False)
        self._pitch_pid_controller.set_edit_box_enabled(False)
        self._stick_scaling_controller.set_edit_box_enabled(False)

    def set_advanced_mode(self):
        self._user_update_mode = PIDUpdateMode.ADVANCED_MODE
        self._pitch_pid_controller.show()
        self._roll_pid_controller.show_i_line()
        self._pitch_pid_controller.show_i_line()
        self._roll_pid_controller.set_edit_box_enabled(True)
        self._pitch_pid_controller.set_edit_box_enabled(True)
        self._stick_scaling_controller.set_edit_box_enabled(True)

    def _roll_pid_received(self, event, roll_pid):
        self._current_roll_pid = roll_pid
        if self._is_starting:
            self._roll_pid_controller.set_current_pid(roll_pid)

    def _pitch_pid_received(self, event, pitch_pid):
        self._current_pitch_pid = pitch_pid
        if self._is_starting:
            self._pitch_pid_controller.set_current_pid(pitch_pid)

    def _accro_stick_scaling_received(self, event, stick_scaling):
        self._current_stick_scaling = self.translate_current_stick_scaling_from_board(
            stick_scaling)
        if self._is_starting:
            self._stick_scaling_controller.set_value(
                self._current_stick_scaling)
            self._set_synched()
            self._is_starting = False

        if self.is_synched():
            self._set_synched()
            self._protocol_handler.send_command_wihout_subscription(
                self._protocol_handler.COMMANDS['WriteUserValuesEEPROM'])

    def start(self):
        self._is_starting = True
        self._sync_in_progress = True
        self._protocol_handler.get_accro_pid()

    def stop(self):
        self._protocol_handler.unsubscribe_command()

    def sync_with_board(self):
        if self._is_starting:
            return

        if self.is_synched():
            self._protocol_handler.unsubscribe_command()
            self._set_synched()
            return

        if self._cpt_before_send == 5:
            self._protocol_handler.unsubscribe_command()
            self._send_pid_to_board()
            self._cpt_before_send = 0
            self._protocol_handler.get_accro_pid()
        else:
            self._protocol_handler.send_command_wihout_subscription(
                self._protocol_handler.COMMANDS['GetRatePID'])
            self._cpt_before_send = self._cpt_before_send + 1

    def is_synched(self):
        try:
            if not self._current_roll_pid.is_equals(
                    self._roll_pid_controller.get_current_pid()):
                return False
            elif not self._current_pitch_pid.is_equals(
                    self._pitch_pid_controller.get_current_pid()):
                return False
            elif float(self._current_stick_scaling) != float(
                    self._stick_scaling_controller.get_value()):
                return False
        except:
            return False
        return True

    def _set_synched(self):
        self._roll_pid_controller.p_line.set_same()
        self._roll_pid_controller.i_line.set_same()
        self._roll_pid_controller.d_line.set_same()
        self._pitch_pid_controller.p_line.set_same()
        self._pitch_pid_controller.i_line.set_same()
        self._pitch_pid_controller.d_line.set_same()
        self._stick_scaling_controller._line.set_same()

    def _send_pid_to_board(self):
        roll_pid = self._roll_pid_controller.get_current_pid()
        pitch_pid = self.get_pitch_pid_from_panel()
        stick_scaling = self.get_stick_scaling_from_panel()
        self._protocol_handler.set_accro_pid(roll_pid, pitch_pid,
                                             stick_scaling)

    def get_pitch_pid_from_panel(self):
        if self._user_update_mode == PIDUpdateMode.BEGINNER_MODE:
            self._pitch_pid_controller.set_current_pid(
                self._roll_pid_controller.get_current_pid())
            return self._roll_pid_controller.get_current_pid()
        else:
            return self._pitch_pid_controller.get_current_pid()

    def get_stick_scaling_from_panel(self):
        panel_value = self._stick_scaling_controller.get_value()
        return self.translate_stick_scaling_for_board(panel_value)

    def reset_default(self):
        self._roll_pid_controller.reset_default()
        self._pitch_pid_controller.reset_default()
        self._stick_scaling_controller.reset_default()

    def translate_current_stick_scaling_from_board(self, stick_scaling):
        if str(stick_scaling) == '1.00':
            return 1
        elif str(stick_scaling) == '0.90':
            return 2
        elif str(stick_scaling) == '0.80':
            return 3
        elif str(stick_scaling) == '0.70':
            return 4
        elif str(stick_scaling) == '0.60':
            return 5
        elif str(stick_scaling) == '0.50':
            return 6

    def translate_stick_scaling_for_board(self, panel_value):
        if int(panel_value) == 1:
            return '1.00'
        elif float(panel_value) == 2:
            return '0.90'
        elif float(panel_value) == 3:
            return '0.80'
        elif float(panel_value) == 4:
            return '0.70'
        elif float(panel_value) == 5:
            return '0.60'
        elif float(panel_value) == 6:
            return '0.50'
Exemple #6
0
 def get_current_pid(self):
     return PIDData(self.p_line.get_value(), self.i_line.get_value(),
                    self.d_line.get_value())