touch_screen.py 4.2 KB

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