touch_screen.py 4.2 KB

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