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