Example #1
0
 def __init__(self, uart_driver):
     self._channel = McuChannel(uart_driver, owner=self)
     self._capacitor_voltage = None
     self._secret_code = None
     self._treasure_completion = None
     self._motor_1_setpoint_completion = None
     self._motor_2_setpoint_completion = None
     self._motor_3_setpoint_completion = None
     self._motor_4_setpoint_completion = None
     self._out_message_queue = queue.Queue(0)
     self._last_command = None
     self._command_sent_delay_timer = 0
     self._init_mcu_controller_threads()
Example #2
0
class McuController:
    __metaclass__ = abc.ABCMeta

    DELAY_WHEN_COMMAND_SENT = 6
    COMPLETED = 100

    def __init__(self, uart_driver):
        self._channel = McuChannel(uart_driver, owner=self)
        self._capacitor_voltage = None
        self._secret_code = None
        self._treasure_completion = None
        self._motor_1_setpoint_completion = None
        self._motor_2_setpoint_completion = None
        self._motor_3_setpoint_completion = None
        self._motor_4_setpoint_completion = None
        self._out_message_queue = queue.Queue(0)
        self._last_command = None
        self._command_sent_delay_timer = 0
        self._init_mcu_controller_threads()

    def _init_mcu_controller_threads(self):
        out_message_process_thread = threading.Thread(group=None, target=self._out_message_process_thread, name='out_message_process_thread', daemon=True)
        out_message_process_thread.start()

    def send_message(self, command):
        while not self._out_message_queue.empty():
            self._out_message_queue.get(True, timeout=None)
        self._out_message_queue.put(command)
        self._channel.send_message(command)
        self._treasure_completion = 0
        self._motor_1_setpoint_completion = 0
        self._motor_2_setpoint_completion = 0
        self._motor_3_setpoint_completion = 0
        self._motor_4_setpoint_completion = 0
        self._command_sent_delay_timer = self.DELAY_WHEN_COMMAND_SENT

    def process_message(self, message):
        if isinstance(message, InMessageHeartbeat):
            self._update_mcu_state(message)
        else:
            raise CommunicationException("Received a different type of message than the expected InMessageHeartbeat from the MCU")

    def _out_message_process_thread(self):
        while True:
            if not self._out_message_queue.empty():
                self._last_command = self._out_message_queue.get(True, timeout=None)

            if self._last_command is not None and self.get_overall_completion() < self.COMPLETED:
                self._channel.send_message(self._last_command)
            time.sleep(Constants.THREAD_SLEEP_DELAY)

    def _update_mcu_state(self, message):
        self._capacitor_voltage = message.get_capacitor_voltage()
        self._secret_code = message.get_secret_code()
        if self._command_sent_delay_timer > 0:
            self._treasure_completion = 0
            self._motor_1_setpoint_completion = 0
            self._motor_2_setpoint_completion = 0
            self._motor_3_setpoint_completion = 0
            self._motor_4_setpoint_completion = 0
            self._command_sent_delay_timer -= 1

        else:
            self._treasure_completion = message.get_treasure_manipulation_completion()
            self._motor_1_setpoint_completion = message.get_motor_completion(MotorIdentifier.FIRST_MOTOR)
            self._motor_2_setpoint_completion = message.get_motor_completion(MotorIdentifier.SECOND_MOTOR)
            self._motor_3_setpoint_completion = message.get_motor_completion(MotorIdentifier.THIRD_MOTOR)
            self._motor_4_setpoint_completion = message.get_motor_completion(MotorIdentifier.FOURTH_MOTOR)

    def get_capacitor_voltage(self):
        return self._capacitor_voltage

    def get_secret_code(self):
        return self._secret_code

    def get_motors_completion(self):
        motors_completion = [self._motor_1_setpoint_completion, self._motor_2_setpoint_completion,
                             self._motor_3_setpoint_completion, self._motor_4_setpoint_completion]
        return motors_completion

    def get_treasure_completion(self):
        return self._treasure_completion

    def get_overall_completion(self):
        minimal_completion = self.COMPLETED
        completion_list = self.get_motors_completion()
        completion_list.append(self.get_treasure_completion())
        for motor_completion in self.get_motors_completion():
            if not isinstance(motor_completion, int):
                minimal_completion = None
            else:
                minimal_completion = min(minimal_completion, motor_completion)
        return minimal_completion