vpu_live.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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. 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,300)
  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 = 0
  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):
  133. A = self.pos[0]*self.block[0]
  134. B = self.pos[1]*self.block[1]
  135. C = self.block[0]-1
  136. D = self.block[1]-1
  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 = [16,16]
  144. block = [8,8]
  145. _x = 12
  146. _y = 8
  147. _x = 24
  148. _y = 16
  149. y=0
  150. x=0
  151. for i in range((_y+1)*(_x+1)):
  152. if i%_x == 0:
  153. x=0
  154. y+=1
  155. pos=[x,y]
  156. f = Fix(pos,dmx,ch)
  157. f.block = block
  158. GRID.append(f)
  159. #print(f)
  160. dmx += ch
  161. x+=1
  162. return GRID
  163. NR = 0
  164. def main():
  165. global IP,GRIP
  166. GRID = init_gird()
  167. print("GRID LEN:",len(GRID))
  168. s=time.time()
  169. print("run")
  170. r = ""
  171. IP = "xx"
  172. while running:
  173. event()
  174. pygame.display.flip()
  175. window.fill((0,0,0))
  176. FPS()
  177. draw_overlay()
  178. ips = read_index()
  179. ip = select_ip(ips,univ=2)
  180. IP = ip
  181. #print("IP",ip)
  182. data = read_dmx(ip)
  183. # GRID loop
  184. i = 0
  185. for fix in GRID:
  186. fix.calc(data)
  187. pos = fix.POS(40,40)
  188. rgb = fix.rgb
  189. #print(fix.dmx,rgb,pos)
  190. pygame.draw.rect(window,rgb,pos)
  191. if NR == 1:
  192. fr = font15.render("{:2}".format(i+1) ,1, (200,0,255))
  193. window.blit(fr,(pos[0]+2,pos[1]+3))
  194. elif NR == 2:
  195. fr = font12.render("{:2}".format(i*4+1) ,1, (200,0,255))
  196. window.blit(fr,(pos[0]+2,pos[1]+3))
  197. i += 1
  198. pygame.display.flip()
  199. pg.time.wait(10)
  200. if __name__ == "__main__":
  201. main()