This commit is contained in:
cheykrym 2026-04-01 04:35:38 +03:00
parent 7a74991910
commit e8452bef7c
2 changed files with 79 additions and 6 deletions

View File

@ -114,19 +114,24 @@ class IrRemoteService(QObject):
ready, _, _ = select.select([f], [], [], 0.1)
if not ready:
continue
# Читаем событие (16 байт: tv_sec, tv_usec, type, code, value)
# Читаем событие (24 байта: tv_sec, tv_usec, type, code, value)
data = f.read(24)
if len(data) < 24:
continue
tv_sec, tv_usec, ev_type, ev_code, ev_value = struct.unpack("llHHI", data)
# Обрабатываем только MSC_SCAN события
# Обрабатываем MSC_SCAN события (скан-код)
if ev_type == EV_MSC and ev_code == MSC_SCAN:
scancode = f"0x{ev_value:02x}"
self._handle_scancode(scancode)
# Обрабатываем EV_KEY события (отпускание кнопки)
elif ev_type == EV_KEY and ev_value == KEY_UP:
# Кнопка отпущена - сбрасываем состояние
self.reset_button_state()
except (OSError, IOError):
# Устройство недоступно, ждём и пробуем снова
import time

View File

@ -17,6 +17,7 @@ from screens.media import MediaScreen
from screens.stub import StubScreen
from screens.settings import SettingsScreen
from services.bluetooth_service import BluetoothService
from services.ir_remote_service import IrRemoteService
from controllers.media_controller import MediaController
@ -104,6 +105,10 @@ class MainWindowNew(QMainWindow):
self._bt_service = BluetoothService(self)
self._media_controller = MediaController(self._bt_service, self)
# ИК-пульт
self._ir_service = IrRemoteService(self)
self._connect_ir_remote()
self.media_screen = MediaScreen(self._media_controller)
self.stack.addWidget(self.media_screen) # 0
self.stack.addWidget(StubScreen("Car")) # 1
@ -146,6 +151,69 @@ class MainWindowNew(QMainWindow):
mode_text = "Bluetooth" if self._source_mode == "bluetooth" else "CarPlay"
self.lbl_source.setText(f"Media • {mode_text}")
self.lbl_bt.setText(self.media_screen.source.text())
# Запускаем ИК-пульт
self._ir_service.start()
def _connect_ir_remote(self):
"""Подключить сигналы ИК-пульта."""
# Треки
self._ir_service.play_pause_clicked.connect(self._on_ir_play_pause)
self._ir_service.next_track_clicked.connect(self._on_ir_next_track)
self._ir_service.prev_track_clicked.connect(self._on_ir_prev_track)
self._ir_service.next_track_hold.connect(self._on_ir_next_track_hold)
self._ir_service.prev_track_hold.connect(self._on_ir_prev_track_hold)
# Громкость
self._ir_service.volume_up_clicked.connect(self._on_ir_volume_up)
self._ir_service.volume_down_clicked.connect(self._on_ir_volume_down)
self._ir_service.volume_up_hold.connect(self._on_ir_volume_up_hold)
self._ir_service.volume_down_hold.connect(self._on_ir_volume_down_hold)
def _on_ir_play_pause(self):
"""Обработка кнопки Play/Pause с ИК-пульта."""
if self._media_controller:
self._media_controller.toggle_play()
def _on_ir_next_track(self):
"""Обработка кнопки Next с ИК-пульта."""
if self._media_controller:
self._media_controller.next_track()
def _on_ir_prev_track(self):
"""Обработка кнопки Prev с ИК-пульта."""
if self._media_controller:
self._media_controller.previous_track()
def _on_ir_next_track_hold(self):
"""Обработка зажатия Next (перемотка вперед)."""
# TODO: реализовать перемотку вперед
pass
def _on_ir_prev_track_hold(self):
"""Обработка зажатия Prev (перемотка назад)."""
# TODO: реализовать перемотку назад
pass
def _on_ir_volume_up(self):
"""Обработка кнопки Громкость + с ИК-пульта."""
# TODO: реализовать увеличение громкости
pass
def _on_ir_volume_down(self):
"""Обработка кнопки Громкость - с ИК-пульта."""
# TODO: реализовать уменьшение громкости
pass
def _on_ir_volume_up_hold(self):
"""Обработка зажатия Громкость + (быстрое увеличение)."""
# TODO: реализовать быстрое увеличение громкости
pass
def _on_ir_volume_down_hold(self):
"""Обработка зажатия Громкость - (быстрое уменьшение)."""
# TODO: реализовать быстрое уменьшение громкости
pass
def apply_theme(self):
self.app.setStyleSheet(THEME_NIGHT if self.is_night else THEME_DAY)