vpu_live.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. import math
  2. import random
  3. import time
  4. import os
  5. # ===== ARTNET DMX =========
  6. import memcache
  7. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  8. def read_index():
  9. ips=mc.get("index")#cmd)
  10. if ips is None:
  11. ips = {}
  12. #for k,v in ips.items():
  13. # print(k,v)
  14. return ips
  15. def select_ip(ips, univ=2): # artnet univ
  16. _univ = ":{}".format(univ)
  17. for ip in ips: #high priority
  18. if "2.0.0" in ip and _univ in ip:
  19. return ip
  20. for ip in ips:
  21. if "ltp-out" in ip and _univ in ip:
  22. return ip
  23. r = ""
  24. def read_dmx(ip):
  25. global frame
  26. if ip:
  27. #t = int(math.sin(time.time() - s)*10)
  28. r = mc.get(ip) #"2.0.0.13:2")
  29. frame += 1
  30. rr = [0]*512
  31. for i,v in enumerate(r):
  32. try: #cleanup ltp-out to int
  33. v = int(v)
  34. rr[i] = v
  35. except:pass
  36. r = rr
  37. if not r:
  38. c = 0
  39. time.sleep(0.1)
  40. r = [0] *512
  41. for i in range(12*8+1):
  42. dmx = i*4
  43. #print(dmx)
  44. r[dmx:dmx+4] = [255,10,10,40]
  45. return r
  46. # ===== ARTNET DMX =========
  47. # ===== GUI =========
  48. import pygame
  49. import pygame.gfxdraw
  50. import pygame.font
  51. os.environ['SDL_VIDEO_WINDOW_POS'] = '%i,%i' % (200,184)
  52. os.environ['SDL_VIDEO_CENTERED'] = '0'
  53. pg = pygame
  54. pygame.init()
  55. f = pygame.font.get_fonts()
  56. for i in f:
  57. if "mono" in i.lower():
  58. print(i)
  59. font = pygame.font.SysFont("freemonobold",22)
  60. font10 = pygame.font.SysFont("freemonobold",10)
  61. font15 = pygame.font.SysFont("freemonobold",15)
  62. #font = pygame.font.SysFont(None,30)
  63. fr = font.render("hallo" ,1, (200,0,255))
  64. main_size=(600,300)
  65. main_size=(280,200)
  66. window = pygame.display.set_mode(main_size,pg.RESIZABLE)#,32)#,pygame.FULLSCREEN) #x left->right ,y top-> bottom
  67. pg.display.set_caption('LibreLight LED-SCREEN')
  68. NR = 0
  69. running = True
  70. def event():
  71. global NR,running
  72. for event in pygame.event.get():
  73. print(event)
  74. print(event.type)
  75. print(dir(event) ) #event.button)
  76. try:
  77. print(event.dict ) #event.button)
  78. if event.type == 5:
  79. if "button" in event.dict and event.dict["button"] == 1: #event.button)
  80. if NR:
  81. NR = 0
  82. else:
  83. NR = 1
  84. except Exception as e:
  85. print(e)
  86. if event.type==pygame.QUIT:
  87. running=False
  88. fps = 0
  89. frame = 0
  90. frame_t = time.time()
  91. IP = "yyy"
  92. def draw_overlay():
  93. global fps
  94. fr = font.render("fps:{}".format(fps) ,1, (200,0,255))
  95. window.blit(fr,(10,10))
  96. fr = font.render("ip:{}".format(IP) ,1, (200,0,255))
  97. window.blit(fr,(80,10))
  98. def FPS():
  99. global fps,frame,frame_t
  100. t = time.time()
  101. if frame_t+1 < t:
  102. fps = frame #frame_t- t #frame
  103. frame = 1
  104. frame_t = time.time()
  105. # ===== GUI =========
  106. class Fix():
  107. def __init__(self,pos,dmx,ch):
  108. self.dmx = dmx
  109. self.ch = ch
  110. self.pos = pos
  111. self.rgb = [0,0,40]
  112. self.block = [10,10]
  113. self.strobo = time.time()
  114. self.bmp = 250
  115. def calc(self,data):
  116. dmx_sub = [10]*10
  117. if self.dmx+self.ch < len(data):
  118. dmx_sub = data[self.dmx:self.dmx+self.ch]
  119. dim = dmx_sub[0]/255
  120. r = dmx_sub[1]*dim
  121. g = dmx_sub[2]*dim
  122. b = dmx_sub[3]*dim
  123. r = int(r)
  124. g = int(g)
  125. b = int(b)
  126. self.rgb = [r,g,b]
  127. return self.rgb
  128. def POS(self,x=0,y=0):
  129. A = self.pos[0]*self.block[0]
  130. B = self.pos[1]*self.block[1]
  131. C = self.block[0]-1
  132. D = self.block[1]-1
  133. return [x+A,y+B,C,D]
  134. def init_gird():
  135. GRID = []
  136. #init loop
  137. dmx = 1-1
  138. ch = 4
  139. block = [16,16]
  140. for y in range(8): # row
  141. for x in range(12): # column
  142. pos=[x,y]
  143. f = Fix(pos,dmx,ch)
  144. f.block = block
  145. GRID.append(f)
  146. #print(f)
  147. dmx += ch
  148. return GRID
  149. NR = 0
  150. def main():
  151. global IP,GRIP
  152. GRID = init_gird()
  153. print("GRID LEN:",len(GRID))
  154. s=time.time()
  155. print("run")
  156. r = ""
  157. IP = "xx"
  158. while running:
  159. event()
  160. pygame.display.flip()
  161. window.fill((0,0,0))
  162. FPS()
  163. draw_overlay()
  164. ips = read_index()
  165. ip = select_ip(ips,univ=2)
  166. IP = ip
  167. #print("IP",ip)
  168. data = read_dmx(ip)
  169. # GRID loop
  170. i = 0
  171. for fix in GRID:
  172. fix.calc(data)
  173. pos = fix.POS(40,40)
  174. rgb = fix.rgb
  175. #print(fix.dmx,rgb,pos)
  176. pygame.draw.rect(window,rgb,pos)
  177. if NR:
  178. fr = font15.render("{:2}".format(i+1) ,1, (200,0,255))
  179. window.blit(fr,(pos[0]+2,pos[1]+3))
  180. i += 1
  181. pygame.display.flip()
  182. pg.time.wait(10)
  183. if __name__ == "__main__":
  184. main()