vpu_live.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  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. def read_dmx(ip):
  24. global frame
  25. r = ""
  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. font12 = pygame.font.SysFont("freemonobold",12)
  62. font15 = pygame.font.SysFont("freemonobold",15)
  63. #font = pygame.font.SysFont(None,30)
  64. fr = font.render("hallo" ,1, (200,0,255))
  65. main_size=(600,500)
  66. #main_size=(280,200)
  67. window = pygame.display.set_mode(main_size,pg.RESIZABLE)#,32)#,pygame.FULLSCREEN) #x left->right ,y top-> bottom
  68. pg.display.set_caption('LibreLight LED-SCREEN')
  69. NR = 0
  70. running = True
  71. def event():
  72. global NR,running
  73. for event in pygame.event.get():
  74. print(event)
  75. print(event.type)
  76. print(dir(event) ) #event.button)
  77. try:
  78. print(event.dict ) #event.button)
  79. if event.type == 5:
  80. if "button" in event.dict and event.dict["button"] == 1: #event.button)
  81. NR += 1
  82. if NR > 2:
  83. NR = 0
  84. if "button" in event.dict and event.dict["button"] == 3: #event.button)
  85. NR -= 1
  86. if NR < 0:
  87. NR = 2
  88. except Exception as e:
  89. print(e)
  90. if event.type==pygame.QUIT:
  91. running=False
  92. fps = 0
  93. frame = 0
  94. frame_t = time.time()
  95. IP = "yyy"
  96. def draw_overlay():
  97. global fps
  98. fr = font.render("fps:{}".format(fps) ,1, (200,0,255))
  99. window.blit(fr,(10,10))
  100. fr = font.render("ip:{}".format(IP) ,1, (200,0,255))
  101. window.blit(fr,(80,10))
  102. def FPS():
  103. global fps,frame,frame_t
  104. t = time.time()
  105. if frame_t+1 < t:
  106. fps = frame #frame_t- t #frame
  107. frame = 1
  108. frame_t = time.time()
  109. # ===== GUI =========
  110. class Fix():
  111. def __init__(self,pos,dmx,ch):
  112. self.dmx = dmx
  113. self.ch = ch
  114. self.pos = pos
  115. self.rgb = [0,0,40]
  116. self.block = [10,10]
  117. self.strobo = time.time()
  118. self.bmp = 250
  119. def calc(self,data):
  120. dmx_sub = [210]*10
  121. if self.dmx+self.ch < len(data):
  122. dmx_sub = data[self.dmx:self.dmx+self.ch]
  123. dim = dmx_sub[0]/255
  124. r = dmx_sub[1]*dim
  125. g = dmx_sub[2]*dim
  126. b = dmx_sub[3]*dim
  127. r = int(r)
  128. g = int(g)
  129. b = int(b)
  130. self.rgb = [r,g,b]
  131. return self.rgb
  132. def POS(self,x=0,y=0,a=0,b=0):
  133. A = self.pos[0]*self.block[0]
  134. B = self.pos[1]*self.block[1]
  135. C = self.block[0]-a
  136. D = self.block[1]-b
  137. return [x+A,y+B,C,D]
  138. def init_gird():
  139. GRID = []
  140. #init loop
  141. dmx = 1-1
  142. ch = 4
  143. block = [22,22]
  144. _x = 6
  145. _y = 3
  146. HD = 1
  147. if HD:
  148. block = [8,8]
  149. _x = 24
  150. _y = 16
  151. else:
  152. block = [16,16]
  153. _x = 12
  154. _y = 8
  155. _x = 24
  156. _y = 16
  157. y=0
  158. x=0
  159. for i in range((_y)*(_x)):
  160. if i%_x == 0:
  161. x=0
  162. y+=1
  163. pos=[x,y]
  164. f = Fix(pos,dmx,ch)
  165. f.block = block
  166. GRID.append(f)
  167. #print(f)
  168. dmx += ch
  169. x+=1
  170. return GRID
  171. NR = 0
  172. START_UNIV=2
  173. def main():
  174. global IP,GRIP
  175. GRID = init_gird()
  176. print("GRID LEN:",len(GRID))
  177. s=time.time()
  178. print("run")
  179. r = ""
  180. IP = "xx"
  181. while running:
  182. event()
  183. pygame.display.flip()
  184. window.fill((0,0,0))
  185. FPS()
  186. draw_overlay()
  187. ips = read_index()
  188. ip = select_ip(ips,univ=START_UNIV)
  189. IP = ip
  190. #print("IP",ip)
  191. data = read_dmx(ip)
  192. ip = select_ip(ips,univ=START_UNIV+1)
  193. data3 = read_dmx(ip)
  194. data.extend(data3)
  195. #ip = select_ip(ips,univ=START_UNIV+2)
  196. #data3 = read_dmx(ip)
  197. #data.extend(data3)
  198. #ip = select_ip(ips,univ=START_UNIV+4)
  199. #data3 = read_dmx(ip)
  200. #data.extend(data3)
  201. # GRID loop
  202. i = 0
  203. dmx = 1
  204. for fix in GRID:
  205. fix.calc(data)
  206. pos = fix.POS(40,40,-2,-2)
  207. rgb = fix.rgb
  208. #print(fix.dmx,rgb,pos)
  209. pygame.draw.rect(window,rgb,pos)
  210. if NR == 1:
  211. fr = font15.render("{:2}".format(i+1) ,1, (200,0,255))
  212. window.blit(fr,(pos[0]+2,pos[1]+3))
  213. elif NR == 2:
  214. univ = int(dmx/512)
  215. _dmx = dmx
  216. if univ:
  217. _dmx = dmx%512
  218. #_dmx += 1
  219. fr = font12.render("{:2} {}".format(univ+START_UNIV,_dmx) ,1, (200,0,255))
  220. window.blit(fr,(pos[0],pos[1]+3))
  221. if 1:
  222. if fix.pos[0] == 0:
  223. fr = font12.render("{}".format(fix.pos[1]) ,1, (200,200,200))
  224. #fr = font12.render("-" ,1, (100,100,255))
  225. window.blit(fr,(10,pos[1]+3 ))
  226. if fix.pos[1] == 1:
  227. fr = font12.render("{}".format(fix.pos[0]+1) ,1, (200,200,200))
  228. #fr = font12.render("-" ,1, (100,100,255))
  229. window.blit(fr,(pos[0]+2,35 ))
  230. dmx += 4
  231. i += 1
  232. pygame.display.flip()
  233. pg.time.wait(10)
  234. if __name__ == "__main__":
  235. main()