touch_screen.py 4.7 KB

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