Загрузка данных


def start_new_wait_cycle(self):
        """
        ГЛАВНОЕ ИЗМЕНЕНИЕ.
        Эта функция запускается ТОЛЬКО тогда, когда робот полностью остановился.
        """
        self.current_state = STATE_IDLE
        self.state_timer = time.ticks_ms() # Засекаем время старта ожидания
        
        # Генерируем число от 1 до 20
        rand_val = random.randint(1, 20)
        self.wait_duration = rand_val * 1000 # Переводим в миллисекунды
        print(f"[ОЖИДАНИЕ] Выпало число: {rand_val} (Ждем {rand_val} сек)")
            
        self.has_looked = False
        self.has_blinked = False


















    def run(self):
        print("Робот LOIK запущен!")
        self.start_new_wait_cycle() # Запускаем самый первый цикл при включении
        
        while True:
            now = time.ticks_ms()

            # 1. Обновление DHT11 (независимо от состояния)
            if time.ticks_diff(now, self.last_dht_time) > 3000:
                try:
                    self.dht_sensor.measure()
                    self.update_display_text(self.dht_sensor.temperature(), self.dht_sensor.humidity())
                except OSError: pass
                self.last_dht_time = now

            # 2. Проверка края стола (наивысший приоритет)
            if self.current_state != STATE_EMERGENCY:
                if self.check_edge():
                    self.execute_emergency()
                    continue # Если спаслись, пропускаем остальную логику кадра

            # 3. Логика состояний
            if self.current_state == STATE_IDLE:
                elapsed = time.ticks_diff(now, self.state_timer)
                
                # 3.1 Моргание (ровно на 10 секунде)
                if elapsed >= 10000 and not self.has_blinked:
                    play_animation(self.tft, 'BLINK.bin', fps=30)
                    self.has_blinked = True

                # 3.2 Осмотр (ровно на 10 секунде, если время ожидания >= 14 сек)
                if elapsed >= 10000 and not self.has_looked:
                    wait_seconds = self.wait_duration // 1000
                    if wait_seconds >= 14:
                        print(f"[ОСМОТР] Крутим шеей...")
                        self.set_servo_angle(180); time.sleep(2)
                        self.set_servo_angle(0); time.sleep(4)
                        self.set_servo_angle(90); time.sleep(1)
                        
                        # ВАЖНО: Мы потратили 7 секунд на осмотр.
                        # Чтобы робот не поехал сразу, мы сдвигаем время старта назад.
                        self.state_timer = time.ticks_add(self.state_timer, 7000)
                        
                    self.has_looked = True
                
                # 3.3 Начало движения
                if elapsed >= self.wait_duration:
                    # Время вышло - едем
                    action = random.choice(['forward', 'forward', 'forward', 'left', 'right'])
                    duration = random.uniform(1.0, 2.5)
                    
                    self.action_type = action
                    self.action_timer = time.ticks_add(now, int(duration * 1000))
                    self.current_state = STATE_MOVING
                    print(f"[ДВИЖЕНИЕ] Едем {action} ({duration:.1f} сек)")

            elif self.current_state == STATE_MOVING:
                # Проверяем, не закончилась ли поездка
                if time.ticks_diff(now, self.action_timer) >= 0:
                    self.stop_motors()
                    self.start_new_wait_cycle() # ОСТАНОВИЛИСЬ - ЗАПУСКАЕМ НОВОЕ ОЖИДАНИЕ
                else:
                    # Едем микро-шагами, чтобы не пропустить край
                    if self.action_type == 'forward':
                        self.move_forward(); time.sleep_ms(50); self.stop_motors()
                    elif self.action_type == 'left':
                        self.turn_left(); time.sleep_ms(50); self.stop_motors()
                    elif self.action_type == 'right':
                        self.turn_right(); time.sleep_ms(50); self.stop_motors()

            time.sleep_ms(10)