main.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #!./bin/python3
  2. import sys, os, time
  3. import traceback
  4. import yaml
  5. # Include pygame without support prompt
  6. # Typing only available from version >= 2.0
  7. os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide"
  8. import pygame # type: ignore
  9. from display import Display
  10. from player import Player
  11. # Configuration
  12. config = yaml.safe_load(open("config.yml"))
  13. fbdev = config.get("fbdev", "/dev/fb1")
  14. dx = config.get("dimx", 128)
  15. dy = config.get("dimy", 160)
  16. # Initialise pygame
  17. os.environ["SDL_FBDEV"] = fbdev
  18. pygame.init()
  19. # Create the display
  20. pydsp = pygame.display.set_mode((dx, dy), 0, 32)
  21. pygame.display.set_caption("Musikautomat")
  22. pygame.mouse.set_visible(False)
  23. pygame.key.set_repeat(400, 100)
  24. # Initialise state objects
  25. display = Display(config, pydsp)
  26. display.update()
  27. eventSink = display
  28. player = Player(config, pydsp)
  29. clk = pygame.time.Clock()
  30. # Run the game loop
  31. while True:
  32. clk.tick(10) # We only need 10 FPS
  33. try:
  34. for event in pygame.event.get():
  35. # Handle exit event
  36. if event.type == pygame.QUIT:
  37. pygame.quit()
  38. sys.exit()
  39. # Handle key events
  40. if event.type == pygame.KEYDOWN:
  41. if event.key == pygame.K_DOWN:
  42. eventSink.action("down")
  43. elif event.key == pygame.K_UP:
  44. eventSink.action("up")
  45. elif event.key == pygame.K_RIGHT:
  46. # Activate player
  47. item = display.currentItem()
  48. eventSink = player
  49. # TODO File selection depending on type
  50. path = item.get("path")
  51. files = os.listdir(path)
  52. player.setData([{
  53. "name" : f,
  54. "path" : os.path.join(path, f)
  55. } for f in files])
  56. player.update()
  57. elif event.key == pygame.K_LEFT:
  58. # Get back to display
  59. eventSink = display
  60. display.update()
  61. elif event.key == pygame.K_RETURN:
  62. # Play / pause current item
  63. player.togglePlay()
  64. except Exception as e:
  65. # Display error
  66. traceback.print_exc()
  67. pydsp.fill((0,0,0))
  68. font = pygame.font.Font('freesansbold.ttf', 12)
  69. s = str(e)
  70. n = int(dx / 6)
  71. for i, start in enumerate(range(0, len(s), n)):
  72. text = font.render(s[start:start+n], True, (255, 0, 0) , (0, 0, 0))
  73. pydsp.blit(text, (0, i * 12))
  74. eventSink = display
  75. pygame.display.update()