Python RGB Matrix games and animations https://www.xythobuz.de/ledmatrix_v2.html
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mapper.py 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #!/usr/bin/env python3
  2. # ----------------------------------------------------------------------------
  3. # "THE BEER-WARE LICENSE" (Revision 42):
  4. # <xythobuz@xythobuz.de> wrote this file. As long as you retain this notice
  5. # you can do whatever you want with this stuff. If we meet some day, and you
  6. # think this stuff is worth it, you can buy me a beer in return. Thomas Buck
  7. # ----------------------------------------------------------------------------
  8. import util
  9. import time
  10. import sys
  11. useNTP = False
  12. try:
  13. import ntptime
  14. useNTP = True
  15. except:
  16. pass
  17. # Does nothing. Take this as parent for new mappers.
  18. class MapperNull:
  19. def __init__(self, g):
  20. self.gui = g
  21. self.width = self.gui.width
  22. self.height = self.gui.height
  23. self.multiplier = self.gui.multiplier
  24. self.panelW = self.gui.panelW
  25. self.panelH = self.gui.panelH
  26. if hasattr(self.gui, "matrix"):
  27. self.matrix = self.gui.matrix
  28. def batteryCache(self, refresh = False):
  29. return self.gui.batteryCache(refresh)
  30. def loop_start(self):
  31. return self.gui.loop_start()
  32. def loop_end(self):
  33. self.gui.loop_end()
  34. def loop(self, func = None):
  35. self.gui.loop(func)
  36. def set_pixel(self, x, y, color):
  37. self.gui.set_pixel(x, y, color)
  38. # For some reason the red and green LEDs on older Pimoroni panels
  39. # are far brighter than on newer panels.
  40. # Adjust this by multiplying rg channels with 0.75, depending
  41. # on hard-corded coordinate ranges.
  42. class MapperColorAdjust(MapperNull):
  43. def set_pixel(self, x, y, color):
  44. # third panel from the left, with 64 <= x < 96,
  45. # is "old" type with brighter LEDs.
  46. # rest of panels to the left and right are less bright.
  47. # so adjust brightness of inner panel rg channels down.
  48. if (x >= (self.gui.panelW * 2)) and (x < (self.gui.panelW * 3)):
  49. color = (int(color[0] * 0.75), int(color[1] * 0.75), color[2])
  50. self.gui.set_pixel(x, y, color)
  51. # This converts a long 128x32 strip to a 64x64 panel.
  52. # The Pi is always connected to d, the last subpanel.
  53. #
  54. # (0, 0) (128, 0)
  55. # a b c d
  56. # (0, 32) (128, 32)
  57. #
  58. # on the hardware is converted to this for the effects:
  59. #
  60. # (0, 0) (64, 0)
  61. # a b
  62. # c d
  63. # (0, 64) (64, 64)
  64. class MapperStripToRect(MapperNull):
  65. def __init__(self, g):
  66. super().__init__(g)
  67. self.width = int(self.gui.width / 2)
  68. self.height = self.gui.height * 2
  69. def set_pixel(self, x, y, color):
  70. if y >= self.gui.height:
  71. x += self.width
  72. y -= self.panelH
  73. self.gui.set_pixel(x, y, color)
  74. # Fetches current time via NTP.
  75. # System time will be in UTC afterwards, not with local time-zone
  76. # offset like when using rshell (eg. when using with a Pico).
  77. #
  78. # Brightness of display will be adjusted according to current time.
  79. # To avoid being too bright at night.
  80. #
  81. # When used with the Interstate75 Pico implementation,
  82. # this needs to be the "first" element of the mapper chain.
  83. # Otherwise special handling for PicoText will not work.
  84. class MapperReduceBrightness(MapperNull):
  85. def __init__(self, g):
  86. super().__init__(g)
  87. self.last = None
  88. self.connected = False
  89. self.refresh = 60 * 60 * 6
  90. self.factor = 1.0
  91. def fetch(self):
  92. self.factor = 1.0
  93. if not useNTP:
  94. return
  95. if not self.connected:
  96. self.connected = util.connectToWiFi()
  97. if self.connected:
  98. now = time.time()
  99. if (self.last == None) or ((now - self.last) >= self.refresh) or (now < self.last):
  100. self.last = now
  101. try:
  102. print("Before sync: " + str(time.localtime()))
  103. ntptime.settime()
  104. print("After sync: " + str(time.localtime()))
  105. except Exception as e:
  106. print()
  107. if hasattr(sys, "print_exception"):
  108. sys.print_exception(e)
  109. else:
  110. print(e)
  111. print()
  112. return
  113. # (year, month, day, hour, minute, second, ?, ?)
  114. now = time.localtime()
  115. # 8pm utc == 22pm dst germany
  116. night = (now[0], now[1], now[2], 20, 0, 0, 0, 0)
  117. # 5am utc == 7am dst germany
  118. morning = (now[0], now[1], now[2], 5, 0, 0, 0, 0)
  119. if (now > morning) and (now < night):
  120. self.factor = 1.0
  121. else:
  122. self.factor = 0.42
  123. def adjust(self, color):
  124. return (int(color[0] * self.factor), int(color[1] * self.factor), int(color[2] * self.factor))
  125. def loop_end(self):
  126. super().loop_end()
  127. self.fetch()
  128. def set_pixel(self, x, y, color):
  129. color = self.adjust(color)
  130. self.gui.set_pixel(x, y, color)