vpu_live.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. import math
  2. import random
  3. import time
  4. import os
  5. from optparse import OptionParser
  6. ...
  7. parser = OptionParser()
  8. parser.add_option("-m", "--mode", dest="mode",
  9. help="pixel mode") #, metavar="FILE")
  10. #parser.add_option("-f", "--file", dest="filename",
  11. # help="write report to FILE", metavar="FILE")
  12. #parser.add_option("-q", "--quiet",
  13. # action="store_false", dest="verbose", default=True,
  14. # help="don't print status messages to stdout")
  15. (options, args) = parser.parse_args()
  16. # ===== ARTNET DMX =========
  17. import memcache
  18. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  19. def read_index():
  20. ips=mc.get("index")#cmd)
  21. if ips is None:
  22. ips = {}
  23. #for k,v in ips.items():
  24. # print(k,v)
  25. return ips
  26. def select_ip(ips, univ=2): # artnet univ
  27. _univ = ":{}".format(univ)
  28. for ip in ips: #high priority
  29. if "2.0.0" in ip and _univ in ip:
  30. return ip
  31. for ip in ips:
  32. if "ltp-out" in ip and _univ in ip:
  33. return ip
  34. def read_dmx(ip):
  35. global frame
  36. r = ""
  37. if ip:
  38. #t = int(math.sin(time.time() - s)*10)
  39. r = mc.get(ip) #"2.0.0.13:2")
  40. frame += 1
  41. rr = [0]*512
  42. for i,v in enumerate(r):
  43. try: #cleanup ltp-out to int
  44. v = int(v)
  45. rr[i] = v
  46. except:pass
  47. r = rr
  48. if not r:
  49. c = 0
  50. time.sleep(0.1)
  51. r = [0] *512
  52. for i in range(12*8+1):
  53. dmx = i*4
  54. #print(dmx)
  55. r[dmx:dmx+4] = [255,10,10,40]
  56. return r
  57. # ===== ARTNET DMX =========
  58. p = 30
  59. block = [p,p]
  60. _x = 12
  61. _y = 5
  62. #HD = "0"
  63. if options.mode:
  64. try:
  65. HD = options.mode
  66. p,_x,_y = HD.split(",")
  67. _x = int(_x)
  68. _y = int(_y)
  69. block = [int(p),int(p)]
  70. except Exception as e:
  71. print( "Exc",options.mode,e)
  72. # ===== GUI =========
  73. import pygame
  74. import pygame.gfxdraw
  75. import pygame.font
  76. os.environ['SDL_VIDEO_WINDOW_POS'] = '%i,%i' % (200,184)
  77. os.environ['SDL_VIDEO_CENTERED'] = '0'
  78. pg = pygame
  79. pygame.init()
  80. f = pygame.font.get_fonts()
  81. for i in f:
  82. if "mono" in i.lower():
  83. print(i)
  84. font = pygame.font.SysFont("freemonobold",22)
  85. font10 = pygame.font.SysFont("freemonobold",10)
  86. font12 = pygame.font.SysFont("freemonobold",12)
  87. font15 = pygame.font.SysFont("freemonobold",15)
  88. #font = pygame.font.SysFont(None,30)
  89. fr = font.render("hallo" ,1, (200,0,255))
  90. main_size=(600,500)
  91. try:
  92. wx = 100+block[0] * _x
  93. wy = 100+block[1] * _y
  94. main_size=(wx,wy)
  95. except Exception as e:
  96. print("Exception:",e)
  97. #main_size=(280,200)
  98. window = pygame.display.set_mode(main_size,pg.RESIZABLE)#,32)#,pygame.FULLSCREEN) #x left->right ,y top-> bottom
  99. pg.display.set_caption('LibreLight LED-SCREEN')
  100. NR = 0
  101. running = True
  102. def event():
  103. global NR,running
  104. for event in pygame.event.get():
  105. print(event)
  106. print(event.type)
  107. print(dir(event) ) #event.button)
  108. try:
  109. print(event.dict ) #event.button)
  110. if event.type == 5:
  111. if "button" in event.dict and event.dict["button"] == 1: #event.button)
  112. NR += 1
  113. if NR > 2:
  114. NR = 0
  115. if "button" in event.dict and event.dict["button"] == 3: #event.button)
  116. NR -= 1
  117. if NR < 0:
  118. NR = 2
  119. except Exception as e:
  120. print(e)
  121. if event.type==pygame.QUIT:
  122. running=False
  123. fps = 0
  124. frame = 0
  125. frame_t = time.time()
  126. IP = "yyy"
  127. def draw_overlay():
  128. global fps
  129. fr = font.render("fps:{}".format(fps) ,1, (200,0,255))
  130. window.blit(fr,(10,10))
  131. fr = font.render("ip:{}".format(IP) ,1, (200,0,255))
  132. window.blit(fr,(80,10))
  133. def FPS():
  134. global fps,frame,frame_t
  135. t = time.time()
  136. if frame_t+1 < t:
  137. fps = frame #frame_t- t #frame
  138. frame = 1
  139. frame_t = time.time()
  140. # ===== GUI =========
  141. class Fix():
  142. def __init__(self,pos,dmx,ch):
  143. self.dmx = dmx
  144. self.ch = ch
  145. self.pos = pos
  146. self.rgb = [0,0,40]
  147. self.block = [10,10]
  148. self.strobo = time.time()
  149. self.bmp = 250
  150. def calc(self,data):
  151. dmx_sub = [210]*10
  152. if self.dmx+self.ch < len(data):
  153. dmx_sub = data[self.dmx:self.dmx+self.ch]
  154. dim = dmx_sub[0]/255
  155. r = dmx_sub[1]*dim
  156. g = dmx_sub[2]*dim
  157. b = dmx_sub[3]*dim
  158. r = int(r)
  159. g = int(g)
  160. b = int(b)
  161. self.rgb = [r,g,b]
  162. return self.rgb
  163. def POS(self,x=0,y=0,a=0,b=0):
  164. A = (self.pos[0])*self.block[0]
  165. B = (self.pos[1]-1)*self.block[1]
  166. C = self.block[0]-a
  167. D = self.block[1]-b
  168. return [x+A,y+B,C,D]
  169. def init_gird():
  170. GRID = []
  171. #init loop
  172. dmx = 1-1
  173. ch = 4
  174. #if HD == "8,24,16":
  175. # block = [8,8]
  176. # _x = 24
  177. # _y = 16
  178. #elif HD == "2":
  179. # block = [22,22]
  180. # _x = 24
  181. # _y = 16
  182. #else:
  183. # block = [16,16]
  184. # block = [22,22]
  185. # block = [30,30]
  186. # _x = 12
  187. # _y = 8
  188. #
  189. # #_x = 24
  190. # #_y = 16
  191. y=0
  192. x=0
  193. for i in range((_y)*(_x)):
  194. if i%_x == 0:
  195. x=0
  196. y+=1
  197. pos=[x,y]
  198. f = Fix(pos,dmx,ch)
  199. f.block = block
  200. GRID.append(f)
  201. #print(f)
  202. dmx += ch
  203. x+=1
  204. return GRID
  205. NR = 0
  206. START_UNIV=2
  207. def main():
  208. global IP,GRIP
  209. GRID = init_gird()
  210. print("GRID LEN:",len(GRID))
  211. s=time.time()
  212. print("run")
  213. r = ""
  214. IP = "xx"
  215. while running:
  216. event()
  217. pygame.display.flip()
  218. window.fill((0,0,0))
  219. FPS()
  220. draw_overlay()
  221. ips = read_index()
  222. ip = select_ip(ips,univ=START_UNIV)
  223. IP = ip
  224. #print("IP",ip)
  225. data = read_dmx(ip)
  226. ip = select_ip(ips,univ=START_UNIV+1)
  227. data3 = read_dmx(ip)
  228. data.extend(data3)
  229. ip = select_ip(ips,univ=START_UNIV+2)
  230. data3 = read_dmx(ip)
  231. data.extend(data3)
  232. #ip = select_ip(ips,univ=START_UNIV+4)
  233. #data3 = read_dmx(ip)
  234. #data.extend(data3)
  235. # GRID loop
  236. i = 0
  237. dmx = 1
  238. for fix in GRID:
  239. fix.calc(data)
  240. pos = fix.POS(40,60)
  241. rgb = fix.rgb
  242. #print(fix.dmx,rgb,pos)
  243. pygame.draw.rect(window,rgb,pos)
  244. if NR == 1:
  245. fr = font15.render("{:2}".format(i+1) ,1, (200,0,255))
  246. window.blit(fr,(pos[0]+2,pos[1]+3))
  247. elif NR == 2:
  248. univ = int(dmx/512)
  249. _dmx = dmx
  250. if univ:
  251. _dmx = dmx%512
  252. #_dmx += 1
  253. fr = font12.render("{:2} {}".format(univ+START_UNIV,_dmx) ,1, (200,0,255))
  254. window.blit(fr,(pos[0],pos[1]+3))
  255. if 1:
  256. if fix.pos[0] == 0:
  257. fr = font12.render("{}".format(fix.pos[1]) ,1, (200,200,200))
  258. #fr = font12.render("-" ,1, (100,100,255))
  259. window.blit(fr,(10,pos[1]+3 ))
  260. if fix.pos[1] == 1:
  261. fr = font12.render("{}".format(fix.pos[0]+1) ,1, (200,200,200))
  262. #fr = font12.render("-" ,1, (100,100,255))
  263. window.blit(fr,(pos[0]+2,35 ))
  264. dmx += 4
  265. i += 1
  266. pygame.display.flip()
  267. pg.time.wait(10)
  268. if __name__ == "__main__":
  269. main()