touch_screen.py 3.8 KB

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