logger
This commit is contained in:
parent
ac7fd5fd4b
commit
ae558f1362
@ -70,6 +70,12 @@ class IrRemoteService(QObject):
|
||||
|
||||
def _find_ir_device(self) -> str | None:
|
||||
"""Найти устройство ИК-пульта в /dev/input."""
|
||||
# Сначала пробуем lirc устройства
|
||||
for path in Path("/dev").glob("lirc*"):
|
||||
logger.info(f"Found lirc device: {path}")
|
||||
return str(path)
|
||||
|
||||
# Затем ищем event устройства с ir/rc в имени
|
||||
for path in Path("/dev/input").glob("event*"):
|
||||
try:
|
||||
# Проверяем, поддерживает ли устройство MSC_SCAN
|
||||
@ -78,13 +84,19 @@ class IrRemoteService(QObject):
|
||||
EVIOCGNAME = 0x80000000 | (16 << 8) | ord('E') << 24 | 6
|
||||
import fcntl
|
||||
name = fcntl.ioctl(f.fileno(), EVIOCGNAME, b'\x00' * 256)
|
||||
if b"ir" in name.lower() or b"rc" in name.lower():
|
||||
name_str = name.decode('utf-8', errors='ignore').lower()
|
||||
if "ir" in name_str or "rc" in name_str:
|
||||
logger.info(f"Found IR device by name: {path} ({name_str})")
|
||||
return str(path)
|
||||
except (OSError, IOError):
|
||||
continue
|
||||
# Если не нашли по имени, пробуем первое event
|
||||
for path in Path("/dev/input").glob("event*"):
|
||||
|
||||
# Если не нашли по имени, пробуем все event устройства
|
||||
for path in sorted(Path("/dev/input").glob("event*")):
|
||||
logger.info(f"Trying event device: {path}")
|
||||
return str(path)
|
||||
|
||||
logger.warning("No IR device found")
|
||||
return None
|
||||
|
||||
def start(self) -> bool:
|
||||
@ -111,34 +123,45 @@ class IrRemoteService(QObject):
|
||||
|
||||
def _event_loop(self) -> None:
|
||||
"""Цикл обработки событий."""
|
||||
logger.info(f"Event loop started for {self._device_path}")
|
||||
while self._running:
|
||||
try:
|
||||
with open(self._device_path, "rb") as f:
|
||||
logger.info(f"Opened {self._device_path} successfully")
|
||||
while self._running:
|
||||
# Используем select для неблокирующего чтения
|
||||
ready, _, _ = select.select([f], [], [], 0.1)
|
||||
ready, _, _ = select.select([f], [], [], 0.5)
|
||||
if not ready:
|
||||
continue
|
||||
|
||||
# Читаем событие (24 байта: tv_sec, tv_usec, type, code, value)
|
||||
data = f.read(24)
|
||||
if len(data) < 24:
|
||||
logger.warning(f"Read incomplete data: {len(data)} bytes")
|
||||
continue
|
||||
|
||||
# Логируем сырые байты для отладки
|
||||
logger.debug(f"Raw bytes: {data.hex()}")
|
||||
|
||||
tv_sec, tv_usec, ev_type, ev_code, ev_value = struct.unpack("llHHI", data)
|
||||
|
||||
logger.debug(f"Raw event: type={ev_type} (0x{ev_type:02x}), code={ev_code} (0x{ev_code:02x}), value={ev_value} (0x{ev_value:02x})")
|
||||
|
||||
# Обрабатываем MSC_SCAN события (скан-код)
|
||||
if ev_type == EV_MSC and ev_code == MSC_SCAN:
|
||||
scancode = f"0x{ev_value:02x}"
|
||||
logger.debug(f"MSC_SCAN event: scancode={scancode}")
|
||||
self._handle_scancode(scancode)
|
||||
|
||||
# Обрабатываем EV_KEY события (отпускание кнопки)
|
||||
elif ev_type == EV_KEY and ev_value == KEY_UP:
|
||||
logger.debug(f"KEY_UP event: code={ev_code}")
|
||||
# Кнопка отпущена - сбрасываем состояние
|
||||
self.reset_button_state()
|
||||
|
||||
except (OSError, IOError):
|
||||
except (OSError, IOError) as e:
|
||||
# Устройство недоступно, ждём и пробуем снова
|
||||
logger.warning(f"Device error: {e}, retrying...")
|
||||
import time
|
||||
time.sleep(1.0)
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user