vpu_live.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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. #font = pygame.font.SysFont(None,30)
  61. fr = font.render("hallo" ,1, (200,0,255))
  62. main_size=(600,300)
  63. main_size=(280,200)
  64. window = pygame.display.set_mode(main_size,pg.RESIZABLE)#,32)#,pygame.FULLSCREEN) #x left->right ,y top-> bottom
  65. pg.display.set_caption('LibreLight LED-SCREEN')
  66. running = True
  67. def event():
  68. global running
  69. for event in pygame.event.get():
  70. print(event,event.type)
  71. if event.type==pygame.QUIT:
  72. running=False
  73. fps = 0
  74. frame = 0
  75. frame_t = time.time()
  76. IP = "yyy"
  77. def draw_overlay():
  78. global fps
  79. fr = font.render("fps:{}".format(fps) ,1, (200,0,255))
  80. window.blit(fr,(10,10))
  81. fr = font.render("ip:{}".format(IP) ,1, (200,0,255))
  82. window.blit(fr,(80,10))
  83. def FPS():
  84. global fps,frame,frame_t
  85. t = time.time()
  86. if frame_t+1 < t:
  87. fps = frame #frame_t- t #frame
  88. frame = 1
  89. frame_t = time.time()
  90. # ===== GUI =========
  91. class Fix():
  92. def __init__(self,pos,dmx,ch):
  93. self.dmx = dmx
  94. self.ch = ch
  95. self.pos = pos
  96. self.rgb = [0,0,40]
  97. self.block = [10,10]
  98. def calc(self,data):
  99. if self.dmx+self.ch < len(data):
  100. dmx_sub = data[self.dmx:self.dmx+self.ch]
  101. dim = dmx_sub[0]/255
  102. r = dmx_sub[1]*dim
  103. g = dmx_sub[2]*dim
  104. b = dmx_sub[3]*dim
  105. r = int(r)
  106. g = int(g)
  107. b = int(b)
  108. self.rgb = [r,g,b]
  109. return self.rgb
  110. def POS(self,x=0,y=0):
  111. A = self.pos[0]*self.block[0]
  112. B = self.pos[1]*self.block[1]
  113. C = self.block[0]
  114. D = self.block[1]
  115. return [x+A,y+B,C,D]
  116. GRID = []
  117. #init loop
  118. dmx = 1-1
  119. ch = 4
  120. block = [16,16]
  121. for y in range(8): # row
  122. for x in range(12): # column
  123. pos=[x,y]
  124. f = Fix(pos,dmx,ch)
  125. f.block = block
  126. GRID.append(f)
  127. print(f)
  128. dmx += ch
  129. s=time.time()
  130. print("run")
  131. r = ""
  132. IP = "xx"
  133. while running:
  134. event()
  135. pygame.display.flip()
  136. window.fill((0,0,0))
  137. FPS()
  138. draw_overlay()
  139. ips = read_index()
  140. ip = select_ip(ips,univ=2)
  141. IP = ip
  142. #print("IP",ip)
  143. data = read_dmx(ip)
  144. # GRID loop
  145. for fix in GRID:
  146. fix.calc(data)
  147. pos = fix.POS(40,40)
  148. rgb = fix.rgb
  149. #print(fix.dmx,rgb,pos)
  150. pygame.draw.rect(window,rgb,pos)
  151. pygame.display.flip()
  152. pg.time.wait(10)