dmx.py 14 KB

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