touch_screen.py 3.5 KB

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