touch_screen.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import logging
  2. import os
  3. import traceback
  4. from threading import Thread
  5. from mopidy import core, exceptions
  6. import pygame
  7. import pykka
  8. from .screen_manager import ScreenManager
  9. logger = logging.getLogger(__name__)
  10. class TouchScreen(pykka.ThreadingActor, core.CoreListener):
  11. def __init__(self, config, core):
  12. super(TouchScreen, self).__init__()
  13. self.core = core
  14. self.running = False
  15. self.cursor = config['touchscreen']['cursor']
  16. self.cache_dir = config['touchscreen']['cache_dir']
  17. self.fullscreen = config['touchscreen']['fullscreen']
  18. self.screen_size = (config['touchscreen']['screen_width'],
  19. config['touchscreen']['screen_height'])
  20. self.resolution_factor = (config['touchscreen']['resolution_factor'])
  21. if config['touchscreen']['sdl_fbdev'].lower() != "none":
  22. os.environ["SDL_FBDEV"] = config['touchscreen']['sdl_fbdev']
  23. if config['touchscreen']['sdl_mousdrv'].lower() != "none":
  24. os.environ["SDL_MOUSEDRV"] = (
  25. config['touchscreen']['sdl_mousdrv'])
  26. if config['touchscreen']['sdl_mousedev'].lower() != "none":
  27. os.environ["SDL_MOUSEDEV"] = config['touchscreen']['sdl_mousedev']
  28. if config['touchscreen']['sdl_audiodriver'].lower() != "none":
  29. os.environ["SDL_AUDIODRIVER"] = (
  30. config['touchscreen']['sdl_audiodriver'])
  31. os.environ["SDL_PATH_DSP"] = config['touchscreen']['sdl_path_dsp']
  32. pygame.init()
  33. pygame.display.set_caption("Mopidy-Touchscreen")
  34. self.get_display_surface(self.screen_size)
  35. pygame.mouse.set_visible(self.cursor)
  36. self.screen_manager = ScreenManager(self.screen_size,
  37. self.core,
  38. self.cache_dir,
  39. self.resolution_factor)
  40. # Raspberry pi GPIO
  41. self.gpio = config['touchscreen']['gpio']
  42. if self.gpio:
  43. from .input import GPIOManager
  44. pins = {}
  45. pins['left'] = config['touchscreen']['gpio_left']
  46. pins['right'] = config['touchscreen']['gpio_right']
  47. pins['up'] = config['touchscreen']['gpio_up']
  48. pins['down'] = config['touchscreen']['gpio_down']
  49. pins['enter'] = config['touchscreen']['gpio_enter']
  50. self.gpio_manager = GPIOManager(pins)
  51. def get_display_surface(self, size):
  52. try:
  53. if self.fullscreen:
  54. self.screen = pygame.display.set_mode(
  55. size, pygame.FULLSCREEN)
  56. else:
  57. self.screen = pygame.display.set_mode(size, pygame.RESIZABLE)
  58. except Exception:
  59. raise exceptions.FrontendError("Error on display init:\n"
  60. + traceback.format_exc())
  61. def start_thread(self):
  62. clock = pygame.time.Clock()
  63. pygame.event.set_blocked(pygame.MOUSEMOTION)
  64. while self.running:
  65. clock.tick(12)
  66. self.screen_manager.update(self.screen)
  67. for event in pygame.event.get():
  68. if event.type == pygame.QUIT:
  69. os.system("pkill mopidy")
  70. elif event.type == pygame.KEYUP and event.key == pygame.K_q:
  71. os.system("pkill mopidy")
  72. elif event.type == pygame.VIDEORESIZE:
  73. self.get_display_surface(event.size)
  74. self.screen_manager.resize(event)
  75. else:
  76. self.screen_manager.event(event)
  77. pygame.quit()
  78. def on_start(self):
  79. try:
  80. self.running = True
  81. thread = Thread(target=self.start_thread)
  82. thread.start()
  83. except:
  84. traceback.print_exc()
  85. def on_stop(self):
  86. self.running = False
  87. def track_playback_started(self, tl_track):
  88. try:
  89. self.screen_manager.track_started(tl_track)
  90. except:
  91. traceback.print_exc()
  92. def volume_changed(self, volume):
  93. self.screen_manager.volume_changed(volume)
  94. def playback_state_changed(self, old_state, new_state):
  95. self.screen_manager.playback_state_changed(old_state,
  96. new_state)
  97. def tracklist_changed(self):
  98. try:
  99. self.screen_manager.tracklist_changed()
  100. except:
  101. traceback.print_exc()
  102. def track_playback_ended(self, tl_track, time_position):
  103. self.screen_manager.track_playback_ended(tl_track,
  104. time_position)
  105. def options_changed(self):
  106. try:
  107. self.screen_manager.options_changed()
  108. except:
  109. traceback.print_exc()
  110. def playlists_loaded(self):
  111. self.screen_manager.playlists_loaded()