dmx.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. #from pyray import *
  2. import pyray
  3. #for i in dir(pyray):
  4. # if i.startswith("draw_"):
  5. # print(i)
  6. #exit()
  7. #pyray.ConfigFlags(pyray.FLAG_MSAA_4X_HINT) #|pyray.FLAG_WINDOW_RESIZABLE )
  8. #pyray.ConfigFlags(pyray.FLAG_WINDOW_RESIZABLE )
  9. #pyray.ConfigFlags(pyray.FLAG_WINDOW_HIGHDPI )
  10. pyray.init_window(760, 450, "RAY-DMX")#,10,10,10,10)
  11. #pyray.TextureFilter(font10,1)
  12. import sys
  13. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  14. import tool.tk_elm as tk_elm
  15. #import tool.sdl_elm as sdl_elm
  16. img = "/opt/LibreLight/Xdesk/icon/scribble.png"
  17. IMG = pyray.load_image(img)
  18. print(pyray.set_window_icon(IMG))
  19. import time
  20. import memcache
  21. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  22. #x=mc.get(k)
  23. old_x = -10
  24. old_y = -10
  25. start = time.time()
  26. frame_count = 0
  27. fps_count = 0
  28. #a = "resources/pixantiqua.ttf"
  29. #a = "/lib/firefox-esr/fonts/TwemojiMozilla.ttf"
  30. #a = "/lib/python3/dist-packages/pygame/freesansbold.ttf"
  31. #a = "/usr/share/fonts/truetype/freefont/FreeMono.ttf"
  32. #a = "/usr/share/fonts/truetype/freefont/FreeSerif.ttf"
  33. #a = "/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf"
  34. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  35. a = "/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf"
  36. a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
  37. #a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  38. k=200
  39. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  40. font10l = pyray.load_font_ex(a, 10, None, 0);
  41. a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
  42. font10 = pyray.load_font_ex(a, 12, None, 0);
  43. print(dir(font10))
  44. print(font10.baseSize)
  45. ##exit()
  46. font20 = pyray.load_font_ex(a, 20, None, 0);
  47. a = "/usr/share/fonts/truetype/freefont/FreeMono.ttf"
  48. a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
  49. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  50. font25 = pyray.load_font_ex(a, 25, None, 0);
  51. pyray.TextureFilter(3)
  52. class EVENT():
  53. def __init__(self):
  54. self.dict = {}
  55. self.type = 0
  56. self.button=10
  57. self.buttons=[0,0,0,0]
  58. xevent=EVENT()
  59. class BUTTON():
  60. def __init__(self,master=None,txt="<BUTTON>",pos=[10,10,20,90]):
  61. #self.btn = tk_elm.Button(None,pos=[390,12,20,90])
  62. self.btn = tk_elm.Button(master,pos=pos)
  63. self.btn.btn1.color = [127,127,127,255]
  64. #self.btn.btn1.type = "toggle"
  65. #self.btn.btn2.type = "toggle"
  66. #self.btn.btn3.type = "toggle"
  67. #btn.btn1.color_on = [155,155,155,255]
  68. #btn.btn2.color = [155,55,155,255]
  69. #btn.btn2.color_on = [155,155,155,255]
  70. self.btn.btn3.color = [55,155,155,255]
  71. self.btn.btn3.color_on = [55,255,255,255]
  72. self.btn.btn2.color_on = [55,255,255,255]
  73. self.btn.btn1.name=txt
  74. #x=btn.btn1.name
  75. def draw(self,event=None):
  76. font_size = font10.baseSize
  77. pos=self.btn.pos
  78. c=[122,122,122,122] #btn.btn2.get_color()
  79. pyray.draw_rectangle(pos[1],pos[0],pos[3],pos[2],c)
  80. c=self.btn.btn1.get_color()
  81. pyray.draw_rectangle(pos[1]+2,pos[0]+2,pos[3]-4,pos[2]-4,c)
  82. c=self.btn.btn3.get_color()
  83. #pyray.draw_rectangle(pos[1]+1,pos[0]+1,pos[3]-2,pos[2]-2,c)
  84. pyray.draw_rectangle_lines_ex([pos[1]+1,pos[0]+1,pos[3]-2,pos[2]-2],1,c)
  85. x=self.btn.btn1.name
  86. pyray.draw_text_ex(font10,str(x), [pos[1]+4,pos[0]+4], font_size, 0, [0,0,0,255])#pyray.YELLOW)#[0,255,0,255]) #pyray.YELLOW)
  87. def event(self,x,y,mouse):
  88. try:
  89. #print("POS:",old_x,old_y,mouse,xevent.type)
  90. xevent.dict={"pos":[old_y,old_x],"button":1,"buttons":[0,0,0]}
  91. #xevent.type=3
  92. for i,v in enumerate(mouse):
  93. if i==0:
  94. if v == "release":
  95. xevent.type=6
  96. xevent.dict["button"] = 1
  97. #self.btn.btn1.val.set(0)
  98. if v == "press":
  99. xevent.type=5
  100. xevent.dict["button"] = 1
  101. #self.btn.btn1.val.set(255)
  102. xevent.dict["buttons"] = mouse
  103. #print(xevent.dict,xevent.type,xevent.button)
  104. self.btn.event(xevent)
  105. except Exception as e:
  106. import traceback
  107. print(traceback.format_exc())
  108. raise e
  109. mouse_box_on = 0
  110. mouse_box_on_pos = [0,0]
  111. def draw_mouse_box(window,pos1,mouse=[None,None,None],color=[128,128,128],text=1):
  112. global mouse_box_on_pos
  113. global mouse_box_on
  114. if mouse[0]=="click":#"press":
  115. if mouse_box_on == 0:
  116. pos2 = pos1[:]
  117. mouse_box_on_pos = pos2
  118. mouse_box_on = 1
  119. else:
  120. mouse_box_on = 0
  121. if mouse[0]=="press":
  122. pos2 = mouse_box_on_pos[:]
  123. w=pos1[0]-pos2[0]
  124. h=pos1[1]-pos2[1]
  125. pos = pos2[:]
  126. #print(pos1,pos2,h,w)
  127. wd=1
  128. hd=1
  129. if w < 0:
  130. pos[0] = pos1[0]
  131. w*=-1
  132. wd=-1
  133. if h < 0:
  134. pos[1] = pos1[1]
  135. h*=-1
  136. hd=-1
  137. if w > 10 or h > 10:
  138. c=[255,255,255,255]
  139. pyray.draw_rectangle_lines_ex([pos[0],pos[1],w,h],1,c)
  140. font_size = font10l.baseSize
  141. pyray.draw_text_ex(font10l,str(pos1[0])+" "+str(pos1[1]), [pos1[0],pos1[1]-10], font_size, 0, pyray.WHITE)
  142. pyray.draw_text_ex(font10l,str(pos2[0])+" "+str(pos2[1]), [pos2[0]+5,pos2[1]+10], font_size, 0, pyray.WHITE)
  143. pyray.draw_text_ex(font10l,str(w), [pos2[0]+5+w/2*wd,pos2[1]], font_size, 0, pyray.WHITE)
  144. pyray.draw_text_ex(font10l,str(h), [pos2[0]+5,pos2[1]+h/2*hd], font_size, 0, pyray.WHITE)
  145. return pos1,pos2
  146. mouse_old=[None,None,None]
  147. def check_area_v(v1,v2,event_v):#elm_pos,event_pos):
  148. if event_v < v1+1:
  149. return 0
  150. if event_v > v2-1:
  151. return 0
  152. return 1
  153. def check_area(pos,event_pos):
  154. v2 = pos[0]+pos[2]
  155. x = check_area_v(pos[0],v2,event_pos[0])
  156. v2 = pos[1]+pos[3]
  157. y = check_area_v(pos[1],v2,event_pos[1])
  158. if x and y:
  159. return 1
  160. spectrum = [[255,127]]*40
  161. def render_spectrum(cur,x,y):
  162. pyray.draw_text_ex(font25,"SRC:{}".format(cur),[x-20,y-50], 25, 0, pyray.VIOLET)
  163. txt="1 DMX"
  164. pyray.draw_text_ex(font10,txt, [x,y-20], font_size, 0, [0,255,0,255]) #pyray.YELLOW)
  165. txt="255"
  166. pyray.draw_text_ex(font10,txt, [x+230,y-20], font_size, 0, [0,255,0,255]) #pyray.YELLOW)
  167. txt="512 DMX"
  168. pyray.draw_text_ex(font10,txt, [x+470,y-20], font_size, 0, [0,255,0,255]) #pyray.YELLOW)
  169. DMX=mc.get(cur)
  170. spectrum.append(DMX)
  171. if len(spectrum) > 40:
  172. spectrum.pop(0)
  173. for i,lines in enumerate(spectrum):
  174. for j,pix in enumerate(lines):
  175. if type(pix) is not int:
  176. pix=0
  177. if pix > 255:
  178. pix=255
  179. if pix < 0:
  180. pix=0
  181. c=[255,255,255,pix]
  182. #pyray.draw_pixel(x+j,y+i*6,c)
  183. pyray.draw_line(x+j,y+i*6,x+j,y+i*6-5,c)
  184. def render_grid(cur,x,y):
  185. xi=0
  186. yi=0
  187. grid_x = x #250
  188. grid_y = y #60
  189. for i,v in enumerate(range(20)):
  190. # COL NUMBER -> 1 2... 20
  191. x2 = grid_x+i*25#+xi
  192. y2 = grid_y-20 #+yi
  193. txt=str(i+1)
  194. pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, [0,255,0,255]) #pyray.YELLOW)
  195. i+=1
  196. DMX=mc.get(cur)
  197. pyray.draw_text_ex(font25,"SRC:{}".format(cur),[grid_x-20,grid_y-50], 25, 0, pyray.VIOLET)
  198. for i,v in enumerate(DMX):
  199. if v:
  200. host_list[k][-1] +=1
  201. txt = str(v)
  202. x2 = grid_x+xi*25
  203. y2 = grid_y+yi*15
  204. try:
  205. pyray.draw_rectangle(x2-2, y2-2,24,13,[255,255,255,int(v)])
  206. except:
  207. pyray.draw_rectangle(x2-2, y2-2,24,13,[255,2,2,255])
  208. try:
  209. int(v)
  210. except:
  211. v=0
  212. if int(v) > 100:
  213. pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, pyray.BLACK)# pyray.VIOLET)
  214. else:
  215. pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, GREY)# pyray.VIOLET)
  216. xi+=1
  217. if xi % 20 == 0:
  218. txt = str(int(yi*20)+1)
  219. pyray.draw_text_ex(font10,txt, [grid_x-30,y2], font_size, 0, pyray.YELLOW)# pyray.VIOLET) # ROEW NR
  220. xi = 0
  221. yi += 1
  222. txt = str(int(yi*20)+1)
  223. pyray.draw_text_ex(font10,txt, [grid_x-30,y2], font_size, 0, pyray.YELLOW)# pyray.VIOLET) # ROEW NR
  224. buttons={} #[]
  225. cur = None
  226. history = []
  227. spectrum_btn=BUTTON(None,"SPECTRUM",[3,610,20,90])
  228. spectrum_btn.btn.btn1.color = pyray.YELLOW # [127,127,127,255]
  229. spectrum_btn.btn.btn1.color_on = pyray.YELLOW # [127,127,127,255]
  230. add=0
  231. while not pyray.window_should_close():
  232. pyray.begin_drawing()
  233. pyray.clear_background(pyray.BLACK)
  234. pyray.Color(255,0,0,0)
  235. pyray.rl_enable_smooth_lines()
  236. font_size = font10.baseSize
  237. try:
  238. DATA=mc.get("index")#cmd)
  239. GREY = [122,122,122,255]
  240. p=0
  241. keys = []
  242. host_list = {}
  243. for k in DATA:
  244. #print(k,DATA[k])
  245. #print(k)
  246. keys.append(k)
  247. host_list[k] = DATA[k] #[0]).ljust(" ",18) #,0,"=",0]
  248. keys.sort()
  249. k=keys[0]
  250. if cur is None:
  251. cur = k #k[3] #"xx123" # k
  252. if spectrum_btn.btn.btn1.val.get():
  253. render_spectrum(cur,240,50)
  254. else:
  255. render_grid(cur,250,50)
  256. p=0
  257. for k,v in host_list.items():
  258. x2 = 10
  259. y2 = 60+p #grid_y+p
  260. v = str(v).replace(" ","").replace("[","").replace("]","")
  261. txt = str(k)+" "+str(v)
  262. key = txt.split(" ")[0]
  263. p+=22
  264. if key in buttons:
  265. btn = buttons[key]
  266. else:
  267. btn=BUTTON(None,txt,[y2,x2,20,190])
  268. buttons[key] = btn
  269. print("ADD",key,btn)
  270. add=1
  271. btn.btn.btn1.name = txt
  272. btn.btn.btn1.color_on = [255,255,0,255]
  273. btn.btn.btn1.val.set(0)
  274. if cur in btn.btn.btn1.name:
  275. btn.btn.btn1.val.set(255)
  276. #btn.btn.btn1.press() #val.set(255)
  277. if add:
  278. add=0
  279. print()
  280. w=200
  281. h=50
  282. x=200
  283. y=200
  284. pyray.draw_text_ex(font25,"FPS:{}".format(fps_count),[10,5], 25, 0, pyray.VIOLET)
  285. m=pyray.get_mouse_position()
  286. #print(m)
  287. if m.x != old_x or m.y != old_y:
  288. old_x = m.x
  289. old_y = m.y
  290. mouse=[None,None,None]
  291. mouse_change=0
  292. for i in range(3):
  293. ev = ""
  294. if pyray.is_mouse_button_released(i):
  295. ev = "release"
  296. if pyray.is_mouse_button_pressed(i):
  297. ev = "click" #"press"
  298. if ev and ev != mouse[i]:
  299. mouse[i] = ev
  300. mouse_change=1
  301. if mouse != mouse_old and mouse != [None,None,None]:
  302. #print(mouse)
  303. mouse_old = mouse[:]
  304. spectrum_btn.event(old_x,old_y,mouse_old) #abtn.btn1.name = "SPECTRUM"
  305. if check_area(spectrum_btn.btn.pos,[old_y,old_x]):#event_pos):
  306. if "release" == mouse_old[0]:
  307. print( spectrum_btn.btn.btn1.val.get(),mouse_old)
  308. if spectrum_btn.btn.btn1.val.get():
  309. spectrum_btn.btn.btn1.val.set(0)
  310. spectrum_btn.btn.btn1.name = "SPECTRUM"
  311. else:
  312. spectrum_btn.btn.btn1.val.set(255)
  313. spectrum_btn.btn.btn1.name = "DMX-GRID"
  314. spectrum_btn.draw()
  315. for k,btn in buttons.items():
  316. btn.event(old_x,old_y,mouse_old)
  317. #if "press" == mouse_old[0]:
  318. if "release" == mouse_old[0]:
  319. btn.button = 1
  320. #if check_area(btn.btn.pos,[old_x,old_y]):#event_pos):
  321. if check_area(btn.btn.pos,[old_y,old_x]):#event_pos):
  322. #print(k,btn.btn.pos)
  323. #btn.btn.btn1.val.set(255)
  324. #cur = k
  325. cur = k # btn.btn.btn1.name
  326. btn.draw()
  327. aapos = draw_mouse_box(None,[old_x,old_y],mouse_old,color=[128,128,128],text=1)
  328. pyray.draw_text_ex(font20,"POS:{}:{}".format(int(m.x),int(m.y)),[10,34], 20, 0, pyray.VIOLET)
  329. pyray.draw_rectangle(int(old_x-10),int(old_y-1),20,2,[255,0,255,255])
  330. pyray.draw_rectangle(int(old_x-1),int(old_y-10),2,20,[255,0,255,255])
  331. pyray.end_drawing()
  332. time.sleep(1/11)
  333. for i,v in enumerate(mouse_old):
  334. if v == "release":
  335. mouse_old[i] = None
  336. if v == "click":
  337. mouse_old[i] = "press"
  338. #print(mouse_old)
  339. frame_count += 1
  340. if time.time()-start > 1:
  341. start = time.time()
  342. fps_count = frame_count
  343. frame_count = 0
  344. except KeyboardInterrupt as e:
  345. raise e
  346. except Exception as e:# KeyInterupt
  347. print("err",e)
  348. import traceback
  349. print(traceback.format_exc())
  350. time.sleep(1)
  351. pyray.close_window()