add logger

This commit is contained in:
cheykrym 2026-04-01 04:52:47 +03:00
parent e8452bef7c
commit ac7fd5fd4b
4 changed files with 50 additions and 11 deletions

14
app.py
View File

@ -1,4 +1,5 @@
import sys import sys
import logging
from pathlib import Path from pathlib import Path
from PySide6.QtCore import QSettings from PySide6.QtCore import QSettings
@ -10,8 +11,21 @@ from themes import THEME_DAY, THEME_NIGHT
from ui.language_dialog import LanguageDialog from ui.language_dialog import LanguageDialog
from ui.main_window_new import MainWindowNew from ui.main_window_new import MainWindowNew
# Настраиваем логирование
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.StreamHandler(sys.stdout),
logging.FileHandler('/tmp/car_ui.log', encoding='utf-8'),
]
)
logger = logging.getLogger(__name__)
def run_app(): def run_app():
logger.info("Starting Car UI application")
app = QApplication(sys.argv) app = QApplication(sys.argv)
_apply_reset_if_requested() _apply_reset_if_requested()
_ensure_language_selected(app) _ensure_language_selected(app)

View File

@ -2,4 +2,4 @@
set -euo pipefail set -euo pipefail
export DISPLAY=:0 export DISPLAY=:0
./.venv/bin/python3 ./main.py ./.venv/bin/python3 ./main.py 2>&1 | tee debug.log

View File

@ -4,6 +4,7 @@ import os
import select import select
import struct import struct
import threading import threading
import logging
from pathlib import Path from pathlib import Path
from typing import Callable from typing import Callable
@ -11,6 +12,8 @@ from PySide6.QtCore import QObject, Signal
import build_info import build_info
logger = logging.getLogger(__name__)
# Типы событий из Linux input.h # Типы событий из Linux input.h
EV_MSC = 0x04 EV_MSC = 0x04
@ -87,11 +90,13 @@ class IrRemoteService(QObject):
def start(self) -> bool: def start(self) -> bool:
"""Запустить обработку событий ИК-пульта.""" """Запустить обработку событий ИК-пульта."""
if not self._device_path: if not self._device_path:
logger.warning("IR remote device not found")
return False return False
if self._running: if self._running:
return True return True
logger.info(f"Starting IR remote service, device: {self._device_path}")
self._running = True self._running = True
self._thread = threading.Thread(target=self._event_loop, daemon=True) self._thread = threading.Thread(target=self._event_loop, daemon=True)
self._thread.start() self._thread.start()
@ -141,53 +146,67 @@ class IrRemoteService(QObject):
"""Обработать скан-код кнопки.""" """Обработать скан-код кнопки."""
action = self._scancode_to_action.get(scancode) action = self._scancode_to_action.get(scancode)
if not action: if not action:
logger.debug(f"Unknown scancode: {scancode}")
return return
logger.debug(f"Scancode: {scancode}, action: {action}")
# Увеличиваем счётчик повторений # Увеличиваем счётчик повторений
self._repeat_counts[scancode] = self._repeat_counts.get(scancode, 0) + 1 self._repeat_counts[scancode] = self._repeat_counts.get(scancode, 0) + 1
repeat_count = self._repeat_counts[scancode] repeat_count = self._repeat_counts[scancode]
# Проверяем, было ли зажатие уже обработано # Проверяем, было ли зажатие уже обработано
hold_triggered = self._hold_triggered.get(scancode, False) hold_triggered = self._hold_triggered.get(scancode, False)
# Определяем тип события # Определяем тип события
is_repeat = repeat_count > 1 is_repeat = repeat_count > 1
is_hold = repeat_count >= build_info.IR_REPEAT_COUNT_FOR_HOLD is_hold = repeat_count >= build_info.IR_REPEAT_COUNT_FOR_HOLD
logger.debug(f" repeat_count={repeat_count}, is_repeat={is_repeat}, is_hold={is_hold}")
# Отправляем сигналы # Отправляем сигналы
if action == "play_pause": if action == "play_pause":
# Play/Pause - только клик (первое нажатие) # Play/Pause - только клик (первое нажатие)
if not is_repeat: if not is_repeat:
logger.info("Emitting play_pause_clicked")
self.play_pause_clicked.emit() self.play_pause_clicked.emit()
elif action in ("volume_up", "volume_down"): elif action in ("volume_up", "volume_down"):
# Громкость - клик + зажатие # Громкость - клик + зажатие
if not is_repeat: if not is_repeat:
if action == "volume_up": if action == "volume_up":
logger.info("Emitting volume_up_clicked")
self.volume_up_clicked.emit() self.volume_up_clicked.emit()
else: else:
logger.info("Emitting volume_down_clicked")
self.volume_down_clicked.emit() self.volume_down_clicked.emit()
if is_hold and not hold_triggered: if is_hold and not hold_triggered:
self._hold_triggered[scancode] = True self._hold_triggered[scancode] = True
if action == "volume_up": if action == "volume_up":
logger.info("Emitting volume_up_hold")
self.volume_up_hold.emit() self.volume_up_hold.emit()
else: else:
logger.info("Emitting volume_down_hold")
self.volume_down_hold.emit() self.volume_down_hold.emit()
elif action in ("next_track", "prev_track"): elif action in ("next_track", "prev_track"):
# Треки - клик + зажатие (перемотка) # Треки - клик + зажатие (перемотка)
if not is_repeat: if not is_repeat:
if action == "next_track": if action == "next_track":
logger.info("Emitting next_track_clicked")
self.next_track_clicked.emit() self.next_track_clicked.emit()
else: else:
logger.info("Emitting prev_track_clicked")
self.prev_track_clicked.emit() self.prev_track_clicked.emit()
if is_hold and not hold_triggered: if is_hold and not hold_triggered:
self._hold_triggered[scancode] = True self._hold_triggered[scancode] = True
if action == "next_track": if action == "next_track":
logger.info("Emitting next_track_hold")
self.next_track_hold.emit() self.next_track_hold.emit()
else: else:
logger.info("Emitting prev_track_hold")
self.prev_track_hold.emit() self.prev_track_hold.emit()
def reset_button_state(self, scancode: str | None = None) -> None: def reset_button_state(self, scancode: str | None = None) -> None:

View File

@ -19,6 +19,9 @@ from screens.settings import SettingsScreen
from services.bluetooth_service import BluetoothService from services.bluetooth_service import BluetoothService
from services.ir_remote_service import IrRemoteService from services.ir_remote_service import IrRemoteService
from controllers.media_controller import MediaController from controllers.media_controller import MediaController
import logging
logger = logging.getLogger(__name__)
class MainWindowNew(QMainWindow): class MainWindowNew(QMainWindow):
@ -172,16 +175,19 @@ class MainWindowNew(QMainWindow):
def _on_ir_play_pause(self): def _on_ir_play_pause(self):
"""Обработка кнопки Play/Pause с ИК-пульта.""" """Обработка кнопки Play/Pause с ИК-пульта."""
logger.info("IR: Play/Pause clicked")
if self._media_controller: if self._media_controller:
self._media_controller.toggle_play() self._media_controller.toggle_play()
def _on_ir_next_track(self): def _on_ir_next_track(self):
"""Обработка кнопки Next с ИК-пульта.""" """Обработка кнопки Next с ИК-пульта."""
logger.info("IR: Next track clicked")
if self._media_controller: if self._media_controller:
self._media_controller.next_track() self._media_controller.next_track()
def _on_ir_prev_track(self): def _on_ir_prev_track(self):
"""Обработка кнопки Prev с ИК-пульта.""" """Обработка кнопки Prev с ИК-пульта."""
logger.info("IR: Prev track clicked")
if self._media_controller: if self._media_controller:
self._media_controller.previous_track() self._media_controller.previous_track()