touch_screen.py 3.7 KB

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