fix.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867
  1. #from pyray import *
  2. import pyray
  3. import sys
  4. import _thread as thread
  5. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  6. from lib.cprint import cprint
  7. CAPTION = 'RAY-FIX-LIST'
  8. import tool.movewin as movewin
  9. import pathlib
  10. _file_path=pathlib.Path(__file__)
  11. print("file:",_file_path)
  12. movewin.check_is_started(CAPTION,_file_path)
  13. win_title =CAPTION.strip().split()[-1]
  14. store = movewin.load_all_sdl(win_title)
  15. print(store)
  16. POS=[10,10]
  17. W=760
  18. H=450
  19. if store:
  20. POS[0] += 5 #frame kompensation
  21. POS[1] += 29 #frame kompensation
  22. POS=[store[-2],store[-1]]
  23. RUN = 1
  24. pyray.set_config_flags(pyray.FLAG_WINDOW_RESIZABLE)
  25. pyray.init_window(W, H, CAPTION) #"RAY-DMX")#,10,10,10,10)
  26. pyray.set_window_min_size(200,200)
  27. pyray.set_window_max_size(1000,1000)
  28. pyray.set_exit_key(-1)
  29. #pyray.set_captur_key(-1)
  30. pyray.begin_drawing()
  31. pyray.clear_background(pyray.BLACK)
  32. pyray.Color(255,0,0,0)
  33. pyray.end_drawing()
  34. pyray.set_target_fps(60)
  35. import json
  36. import lib.zchat as chat
  37. cmd_client = chat.Client(port=30003)
  38. win_con = movewin.Control()
  39. win_con.title = win_title
  40. win_con.winfo()
  41. if POS:
  42. win_con.move(POS[0],POS[1])
  43. print(POS,win_con.title)
  44. #exit()
  45. import sys
  46. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  47. import tool.tk_elm as tk_elm
  48. #import tool.sdl_elm as sdl_elm
  49. img = "/opt/LibreLight/Xdesk/icon/scribble.png"
  50. IMG = pyray.load_image(img)
  51. print(pyray.set_window_icon(IMG))
  52. import time
  53. import memcache
  54. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  55. #x=mc.get(k)
  56. old_x = -10
  57. old_y = -10
  58. start = time.time()
  59. frame_count = 0
  60. fps_count = 0
  61. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  62. a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
  63. k=200
  64. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  65. font_l_10 = pyray.load_font_ex(a, 10, None, 0);
  66. a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
  67. font10 = pyray.load_font_ex(a, 10, None, 0);
  68. font12 = pyray.load_font_ex(a, 12, None, 0);
  69. font14 = pyray.load_font_ex(a, 14, None, 0);
  70. font16 = pyray.load_font_ex(a, 16, None, 0);
  71. font20 = pyray.load_font_ex(a, 20, None, 0);
  72. font22 = pyray.load_font_ex(a, 22, None, 0);
  73. font24 = pyray.load_font_ex(a, 24, None, 0);
  74. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  75. font_l_22 = pyray.load_font_ex(a, 22, None, 0);
  76. a = "/usr/share/fonts/truetype/freefont/FreeMono.ttf"
  77. a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
  78. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  79. font25 = pyray.load_font_ex(a, 25, None, 0);
  80. pyray.TextureFilter(3)
  81. class EVENT():
  82. def __init__(self):
  83. self.dict = {}
  84. self.type = 0
  85. self.button=10
  86. self.buttons=[0,0,0,0]
  87. xevent=EVENT()
  88. class BUTTON():
  89. def __init__(self,master=None,txt="<BUTTON>",pos=[10,10,20,90]):
  90. #self.btn = tk_elm.Button(None,pos=[390,12,20,90])
  91. self.btn = tk_elm.Button(master,pos=pos)
  92. self.btn.btn1.color = [127,127,127,255]
  93. #self.btn.btn1.type = "toggle"
  94. #self.btn.btn2.type = "toggle"
  95. #self.btn.btn3.type = "toggle"
  96. #btn.btn1.color_on = [155,155,155,255]
  97. #btn.btn2.color = [155,55,155,255]
  98. #btn.btn2.color_on = [155,155,155,255]
  99. self.btn.btn3.color = [55,155,155,255]
  100. self.btn.btn3.color_on = [55,255,255,255]
  101. self.btn.btn2.color_on = [55,255,255,255]
  102. self.font = font14
  103. self.val = 0
  104. self.btn.btn1.name=txt
  105. if " " in txt:
  106. self.ATTR = txt.split()[0]
  107. else:
  108. self.ATTR = txt
  109. self.FIX_ID = 0
  110. #x=btn.btn1.name
  111. def __repr__(self):
  112. return "<BUTTON {} {} {}>".format(id(self),str(self.btn.pos),self.btn.btn1.name)
  113. def draw(self,event=None):
  114. pos=self.btn.pos
  115. c=[122,122,122,122] #btn.btn2.get_color()
  116. pyray.draw_rectangle(pos[1],pos[0],pos[3],pos[2],c)
  117. c=self.btn.btn1.get_color()
  118. pyray.draw_rectangle(pos[1]+2,pos[0]+2,pos[3]-4,pos[2]-4,c)
  119. c=self.btn.btn4.color # color bar
  120. pyray.draw_rectangle(pos[1]+2,pos[0]+2,1+int((pos[3]-4)*self.val/255),3,c)
  121. c=self.btn.btn3.get_color()
  122. #pyray.draw_rectangle(pos[1]+1,pos[0]+1,pos[3]-2,pos[2]-2,c)
  123. pyray.draw_rectangle_lines_ex([pos[1]+1,pos[0]+1,pos[3]-2,pos[2]-2],1,c)
  124. x=self.btn.btn1.name
  125. font_size = self.font.baseSize
  126. pyray.draw_text_ex(self.font,str(x), [pos[1]+4,pos[0]+4], font_size, 0, [0,0,0,255])#pyray.YELLOW)#[0,255,0,255]) #pyray.YELLOW)
  127. def event(self,x,y,mouse,change):
  128. pos=self.btn.pos
  129. if not check_area(pos,[y,x]):
  130. return
  131. try:
  132. #xevent.dict={"pos":[y,x],"button":mouse[:],"buttons":mouse[:],"type":""}
  133. for i,v in enumerate(mouse):
  134. _change=change[i]
  135. if i in [0,1]: #==0:
  136. if v and _change:
  137. cprint("POS:",x,y,mouse,change,color="yellow") #,xevent.dict) #,self)
  138. self.btn.btn1.type = "toggle"
  139. self.btn.btn1.val.set(1)
  140. #self.btn.btn1.press()
  141. if self.FIX_ID:
  142. data = {"event": "FIXTURES", "TYPE": "ENCODERS", "FIX": str(self.FIX_ID), "VAL": "click", "ATTR": self.ATTR}
  143. msg=json.dumps([data]).encode("utf-8")
  144. print("send:",msg)
  145. cmd_client.send(msg)
  146. #self.btn.event(xevent)
  147. except Exception as e:
  148. import traceback
  149. cprint(traceback.format_exc(),color="red")
  150. raise e
  151. mouse_box_on = 0
  152. mouse_box_on_pos = [0,0]
  153. def draw_mouse_box(window,pos1,mouse=[None,None,None],color=[128,128,128],text=1):
  154. global mouse_box_on_pos
  155. global mouse_box_on
  156. if mouse[0]=="click":#"press":
  157. if mouse_box_on == 0:
  158. pos2 = pos1[:]
  159. mouse_box_on_pos = pos2
  160. mouse_box_on = 1
  161. else:
  162. mouse_box_on = 0
  163. if mouse[0]=="press":
  164. pos2 = mouse_box_on_pos[:]
  165. w=pos1[0]-pos2[0]
  166. h=pos1[1]-pos2[1]
  167. pos = pos2[:]
  168. #print(pos1,pos2,h,w)
  169. wd=1
  170. hd=1
  171. if w < 0:
  172. pos[0] = pos1[0]
  173. w*=-1
  174. wd=-1
  175. if h < 0:
  176. pos[1] = pos1[1]
  177. h*=-1
  178. hd=-1
  179. if w > 10 or h > 10:
  180. c=[255,255,255,255]
  181. pyray.draw_rectangle_lines_ex([pos[0],pos[1],w,h],1,c)
  182. font_size = font_l_10.baseSize
  183. pyray.draw_text_ex(font_l_10,str(pos1[0])+" "+str(pos1[1]), [pos1[0],pos1[1]-10], font_size, 0, pyray.WHITE)
  184. pyray.draw_text_ex(font_l_10,str(pos2[0])+" "+str(pos2[1]), [pos2[0]+5,pos2[1]+10], font_size, 0, pyray.WHITE)
  185. pyray.draw_text_ex(font_l_10,str(w), [pos2[0]+5+w/2*wd,pos2[1]], font_size, 0, pyray.WHITE)
  186. pyray.draw_text_ex(font_l_10,str(h), [pos2[0]+5,pos2[1]+h/2*hd], font_size, 0, pyray.WHITE)
  187. return pos1,pos2
  188. mouse_old=[None,None,None]
  189. mouse_old_change=[None,None,None]
  190. def check_area_v(v1,v2,event_v):#elm_pos,event_pos):
  191. if event_v < v1+1:
  192. return 0
  193. if event_v > v2-1:
  194. return 0
  195. return 1
  196. def check_area(pos,event_pos):
  197. v2 = pos[0]+pos[2]
  198. x = check_area_v(pos[0],v2,event_pos[0])
  199. v2 = pos[1]+pos[3]
  200. y = check_area_v(pos[1],v2,event_pos[1])
  201. if x and y:
  202. return 1
  203. def is_hidden_attr(attr_name):
  204. if attr_name.endswith("-FINE"):
  205. return 1
  206. if attr_name == "END":
  207. return 1
  208. if attr_name.startswith("_"):
  209. return 1
  210. return 0
  211. def read_dmx():
  212. dmx = {} #univ
  213. iii = 0
  214. y=mc.get("index")
  215. if y:
  216. key=y.keys()
  217. key = list(key)
  218. key.sort()
  219. for k in key:
  220. if k.startswith("ltp-out"):
  221. #v = y[k]
  222. u = k.split(":")[-1]
  223. x=mc.get(k)
  224. dmx[u] = x
  225. return dmx
  226. def read_fix(dmx):
  227. global mc
  228. y=mc.get("fix")#cmd)
  229. if y is None:
  230. print("==== "*10)
  231. print("error -- read_fix(dmx) mc.get('fix') return",y)
  232. print()
  233. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  234. return {}
  235. key=y.keys()
  236. key = list(key)
  237. key.sort()
  238. for k in key:#y.items():
  239. v = y[k]
  240. #print(k,v)
  241. x=mc.get(k)
  242. dmx_start = 0
  243. if "DMX" in v:
  244. dmx_start = v["DMX"]
  245. univ_start = 0
  246. if "UNIVERS" in v:
  247. univ_start = v["UNIVERS"]
  248. if "ATTRIBUT" in v: # and 10:
  249. ATTR = v["ATTRIBUT"]
  250. for k2 in ATTR:
  251. k2_ATTR = ATTR[k2]
  252. k2_ATTR["VALUE2"] = -2
  253. if is_hidden_attr(k2):
  254. #if k2.startswith("_"):
  255. continue
  256. k3 = k+"-"+k2
  257. dmx_nr = 0
  258. if "NR" in k2_ATTR:
  259. if k2_ATTR["NR"] >= 1:
  260. dmx_nr = k2_ATTR["NR"]+1
  261. val2 = ""
  262. if "VALUE" in k2_ATTR:
  263. val2 = k2_ATTR["VALUE"]
  264. dmx_val=-1
  265. dmx_x=-1
  266. if dmx_nr > 0 and dmx_start > 0:
  267. try:
  268. dmx_x = dmx_start-1+dmx_nr-1
  269. dmx_val = dmx[str(univ_start)][dmx_x-1]
  270. except:pass
  271. if type(dmx_val) in [int,float]:
  272. k2_ATTR["VALUE2"] = dmx_val
  273. else:
  274. k2_ATTR["VALUE2"] = 0
  275. return y
  276. _load_fix_DATA = {}
  277. _load_fix_fix_list = {}
  278. _load_fix_last = time.time()
  279. _load_fix_keys = 0
  280. _load_fix_init = 0
  281. _load_fix_keys = []
  282. lock = thread.allocate_lock()
  283. #lock.acquire()
  284. #lock.release()
  285. def get_fix():
  286. lock.acquire()
  287. a=_load_fix_keys #= keys.copy()
  288. b=_load_fix_fix_list #= fix_list.copy()
  289. #a,b = _load_fix_keys.copy(), _load_fix_fix_list.copy()
  290. lock.release()
  291. return a,b
  292. def load_fix():
  293. global _load_fix_DATA
  294. global _load_fix_fix_list
  295. global _load_fix_keys
  296. global _load_fix_init
  297. global _load_fix_last
  298. if not _load_fix_init:
  299. pass
  300. elif _load_fix_last+1 > time.time():
  301. pass
  302. #lock.acquire()
  303. #a,b = _load_fix_keys.copy(), _load_fix_fix_list.copy()
  304. #lock.release()
  305. #return a,b
  306. #return _load_fix_keys.copy(), _load_fix_fix_list.copy()
  307. #print("load_fix update")
  308. _load_fix_last = time.time()
  309. _load_fix_init = 1
  310. DATA=mc.get("fix")#cmd)
  311. keys = []
  312. fix_list = {}
  313. if not DATA:
  314. DATA = {}
  315. print("mc.get ist NONE")
  316. #continue
  317. for k in DATA:
  318. keys.append(k)
  319. fix_list[k] = DATA[k] #[0]).ljust(" ",18) #,0,"=",0]
  320. keys.sort()
  321. lock.acquire()
  322. _load_fix_keys = keys.copy()
  323. _load_fix_fix_list = fix_list.copy()
  324. #a,b = _load_fix_keys.copy(), _load_fix_fix_list.copy()
  325. lock.release()
  326. #return a,b
  327. def loop_load_fix():
  328. global RUN
  329. while RUN:
  330. try:
  331. load_fix()
  332. time.sleep(1)
  333. except Exception as e:
  334. cprint("EXC loop_load_fix:",e,color="red")
  335. load_fix()
  336. thread.start_new_thread(loop_load_fix,())
  337. def check_buttons(buttons,fix_list):
  338. #raylib.enable_event_waiting()
  339. #pyray.disable_event_waiting() # not working , fast clickinb button or key
  340. _x=20
  341. _y=30
  342. H = 22
  343. W = 100
  344. W2 = W+20
  345. _last_v = {}
  346. for i,k in enumerate(fix_list): #.items():
  347. _x=20
  348. key = str(i)
  349. on_color = [255,255,0,255]
  350. on_color = [200,200,50,255] # gold
  351. if key not in buttons: # insert
  352. v=fix_list[k]
  353. _last_v = v
  354. txt="ID:"+str(v["ID"])
  355. btn=BUTTON(None,txt,[_y,_x,H,60])
  356. btn.btn.btn1.color_on = on_color
  357. buttons[key+".ID"] = btn
  358. #print("ADD",key,btn)
  359. _x+=60+2
  360. txt=v["NAME"]
  361. btn=BUTTON(None,txt,[_y,_x,H,W])
  362. btn.btn.btn1.color_on = on_color
  363. buttons[key] = btn
  364. #print("ADD",key,btn)
  365. _x+=W+5
  366. key = str(i)+":dim"
  367. txt = ""
  368. btn=BUTTON(None,txt,[_y,_x,H,10])
  369. btn.btn.btn1.color = [0,0,0,255]
  370. btn.btn.btn1.color_on = on_color
  371. buttons[key] = btn
  372. _x+=10+1
  373. key = str(i)+":rgb"
  374. txt = ""
  375. btn=BUTTON(None,txt,[_y,_x,H,20])
  376. btn.btn.btn1.color = [0,0,0,255]
  377. btn.btn.btn1.color_on = on_color
  378. buttons[key] = btn
  379. _x+=20+5
  380. if "ATTRIBUT" in v:
  381. #print(txt)
  382. ATTR = v["ATTRIBUT"]
  383. if 1:
  384. ay2=_y
  385. ax2=_x
  386. for kk,vv in v["ATTRIBUT"].items():
  387. if "-FINE" in kk or kk.startswith("_"):
  388. continue
  389. key = str(i)+":" +kk
  390. VAL = vv["VALUE"]
  391. #print("-",kk,vv)
  392. txt = kk+" "+str(VAL)
  393. btn=BUTTON(None,txt,[ay2,ax2,H,W2])
  394. btn.FIX_ID = k
  395. btn.btn.btn1.color_on = on_color
  396. #self.btn4.increment = 4.4
  397. #self.btn4.type = "fader"
  398. #self.btn4.nr_on = [4]
  399. #self.btn4.nr_off = [5]
  400. RGB = [255,255,255,255]
  401. if kk == "RED":
  402. RGB = [255,0,0,255]
  403. elif kk == "GREEN":
  404. RGB = [0,255,0,255]
  405. elif kk == "BLUE":
  406. RGB = [0,0,255,255]
  407. btn.btn.btn4.color = RGB
  408. #btn.btn.btn4.val._max = 100
  409. btn.val = 100
  410. #btn.btn.btn4.val.set(50)
  411. buttons[key] = btn
  412. add=1
  413. ax2+=W2+3
  414. _y+=23
  415. for i,k in enumerate(fix_list): #.items():
  416. key = str(i)
  417. v=fix_list[k]
  418. txt=v["NAME"]
  419. btn = buttons[key]
  420. btn1 = buttons[key+".ID"]
  421. if v["ATTRIBUT"]["_ACTIVE"]["ACTIVE"]:
  422. btn.btn.btn1.val.set(1)
  423. btn1.btn.btn1.val.set(1)
  424. else:
  425. btn.btn.btn1.val.set(0)
  426. btn1.btn.btn1.val.set(0)
  427. if key in buttons: # insert
  428. #print(v)
  429. txt="ID:"+str(v["ID"])
  430. btn = buttons[key+".ID"]
  431. key = str(i)+":rgb"
  432. txt = ""
  433. btn = buttons[key]
  434. if "ATTRIBUT" in v:
  435. ATTR = v["ATTRIBUT"]
  436. for kk,vv in v["ATTRIBUT"].items():
  437. if "-FINE" in kk or kk.startswith("_"):
  438. continue
  439. key = str(i)+":" +kk
  440. VAL = vv["VALUE"]
  441. txt = kk+" "+str(VAL)
  442. btn = buttons[key]
  443. btn.val = VAL
  444. if kk in ["RED","GREEN","BLUE"]:
  445. _key = str(i)+":rgb"
  446. if kk == "RED":
  447. buttons[_key].btn.btn1.color[0] = VAL
  448. if kk == "GREEN":
  449. buttons[_key].btn.btn1.color[1] = VAL
  450. if kk == "BLUE":
  451. buttons[_key].btn.btn1.color[2] = VAL
  452. if kk in ["DIM"]:
  453. _key = str(i)+":dim"
  454. _VAL = VAL
  455. if _VAL > 255:
  456. _VAL=255
  457. if _VAL < 0:
  458. _VAL = 0
  459. buttons[_key].btn.btn1.color = [_VAL,_VAL,_VAL,255] #_VAL]
  460. btn.btn.btn1.name = txt
  461. if vv["ACTIVE"]:
  462. btn.btn.btn1.val.set(1)
  463. else:
  464. btn.btn.btn1.val.set(0)
  465. if _last_v:
  466. print("init.button.ok",_last_v)
  467. def update_buttons(buttons):
  468. global mouse_old_change
  469. for k,btn in buttons.items():
  470. btn.event(old_x,old_y,mouse_old,mouse_old_change)
  471. mouse_old_change = [0,0,0] # reset mouse change
  472. def draw_buttons(buttons):
  473. mh = pyray.get_screen_height()
  474. for k,btn in buttons.items():
  475. pos = btn.btn.pos
  476. if pos[0] > (mh-40):
  477. continue # out of screan-view-area
  478. btn.draw()
  479. def event_loop():
  480. global RUN
  481. while RUN:
  482. try:
  483. _event_loop()
  484. time.sleep(0.0001)
  485. except Exception as e:
  486. cprint("EXC event:",e,color="red")
  487. #thread.start_new_thread(event_loop,())
  488. old_x = 0
  489. old_y = 0
  490. wheel = 0
  491. class _M():
  492. def __init__(self):
  493. self.x =0
  494. self.y=0
  495. m = _M() # {"x":0,"y":0}
  496. MOUSE_BTN = [0,0,0]
  497. def _event_loop(buttons):
  498. global RUN
  499. global old_x
  500. global old_y
  501. global wheel
  502. global mouse_old
  503. global mouse_old_change
  504. global m
  505. wheel = pyray.get_mouse_wheel_move()
  506. if wheel:
  507. print("wheel",wheel)
  508. m=pyray.get_mouse_position()
  509. #print(m)
  510. if m.x != old_x or m.y != old_y:
  511. old_x = m.x
  512. old_y = m.y
  513. mouse=[None,None,None]
  514. mouse_change=0
  515. #for i in dir(pyray):
  516. # if "gfwl_" not in i.lower():
  517. # print(i)
  518. #print(pyray.exit_window_requested())
  519. if pyray.window_should_close():
  520. print("sending QUIT ...")
  521. pyray.close_window()
  522. RUN=0
  523. time.sleep(1.3)
  524. exit()
  525. for i in range(3):
  526. #v=pyray.is_mouse_button_down(i)
  527. for ii in range(10):
  528. v=pyray.is_mouse_button_pressed(i)
  529. #print(v)
  530. if v:
  531. if not MOUSE_BTN[i]:
  532. MOUSE_BTN[i] = 1
  533. mouse_change=1
  534. mouse_old_change[i] = 1
  535. #print("mouse",i,v)
  536. print(time.time(),"mouse",i,MOUSE_BTN)#i,v)
  537. for i in range(3):
  538. v=pyray.is_mouse_button_down(i)
  539. if not v:
  540. if MOUSE_BTN[i]:
  541. MOUSE_BTN[i] = 0
  542. mouse_change=1
  543. #print("mouse",i,v)
  544. print(time.time(),"mouse",i,MOUSE_BTN)#i,v)
  545. # KEYBOARD INPUT =========================
  546. _key_del = []
  547. for k in KEY_BUF:
  548. if not pyray.is_key_down(k):
  549. KEY_BUF[k] = [0,1] # release [val,change]
  550. _key_del.append(k)
  551. while RUN:
  552. x = pyray.get_key_pressed()
  553. if x:
  554. if x not in KEY_BUF:
  555. KEY_BUF[x] = [1,1] # press [val,change]
  556. else:
  557. break
  558. for i,k in enumerate(KEY_BUF):
  559. x = k
  560. val,change = KEY_BUF[k]
  561. KEY_BUF[k][1] = 0
  562. if not change:
  563. continue
  564. if x == 256:
  565. if val:
  566. msg=json.dumps([{"event":"ESC"}]).encode("utf-8")
  567. print("ESC",msg)
  568. cmd_client.send(msg)
  569. elif x == 269:
  570. if val:
  571. msg=json.dumps([{"event":"FX-OFF"}]).encode("utf-8")
  572. print("FX-OFF",msg)
  573. cmd_client.send(msg)
  574. elif x >= 290 and x <= 300:
  575. btn_nr = 290-x+81
  576. btn_nr_raw = 81
  577. msg=json.dumps([{"event":"EXEC","EXEC":btn_nr,"VAL":val,"NR-KEY":btn_nr_raw}]).encode("utf-8")
  578. print("SPCIAL-KEY",msg)
  579. cmd_client.send(msg)
  580. else:
  581. print("key",x)
  582. for d in _key_del:
  583. del KEY_BUF[d] # clear KEY BUFFER
  584. # ================================================
  585. #if mouse != mouse_old: # and mouse != [None,None,None]:
  586. if mouse_change:
  587. #mouse_old = mouse[:]
  588. mouse_old =MOUSE_BTN[:]
  589. #print("TT",mouse)
  590. check_scrollbar()
  591. update_buttons(buttons)
  592. MMM = 1
  593. def event_mouse_click():
  594. global MMM
  595. #{'event': 'FIXTURES', 'TYPE': 'ENCODERS', 'FIX': '13', 'VAL': 'click', 'ATTR': 'GREEN'}
  596. # jsbc.remote-key: {'event': 'FIXTURES', 'TYPE': 'ENCODERS', 'FIX': '12', 'VAL': 'click', 'ATTR': '_ACTIVE'}
  597. msg = json.dumps( {'event': 'FIXTURES', 'TYPE': 'ENCODERS', 'FIX': '13', 'VAL': 'click', 'ATTR': 'GREEN'} )
  598. cmd_client.send(msg)
  599. buttons={} #[]
  600. cur = None
  601. history = []
  602. KEY_BUF={}
  603. MOUSE_BUF={}
  604. FIRST_RUN = 1
  605. add=0
  606. core_tick_t = time.time()
  607. dmx_last = time.time()
  608. w = pyray.get_screen_width()
  609. h = pyray.get_screen_height()
  610. mw = w
  611. mh = h
  612. def check_scrollbar():
  613. w = pyray.get_screen_width()
  614. h = pyray.get_screen_height()
  615. mw = w
  616. mh = h
  617. key="scroll-bar"
  618. if key not in buttons:
  619. txt=""
  620. btn=BUTTON(None,txt,[30,mw-35,mh-75,30])
  621. #btn.btn.btn1.color_on = [255,255,0,255]
  622. buttons[key] = btn
  623. btn.btn.btn4.val.set(btn.btn.btn4.val._max*0.4)
  624. import lib.libtk as libtk
  625. def xhelp(event=None):
  626. #print(event)
  627. libtk.online_help("librelight:20-exec")()
  628. btn.btn.btn1.cb_on.set(xhelp)
  629. try:
  630. key="scroll-bar"
  631. buttons[key].btn.pos[1] = mw-35
  632. buttons[key].btn.pos[2] = mh-75
  633. except:pass
  634. #keys,fix_list = get_fix()
  635. #keys,fix_list = get_fix()
  636. while not pyray.window_should_close():
  637. if pyray.is_window_resized():
  638. print( "RESIZE WINDOW OK")
  639. #check_scrollbar()
  640. if dmx_last+1 < time.time():
  641. #print("dmx")
  642. dmx_last = time.time()
  643. dmx = read_dmx()
  644. read_fix(dmx)
  645. font_size = font12.baseSize
  646. try:
  647. #keys,fix_list = load_fix()
  648. keys,fix_list = get_fix()
  649. check_buttons(buttons,fix_list)
  650. for i in range(3): # hack fast event polling button and key
  651. pyray.begin_drawing()
  652. pyray.clear_background(pyray.BLACK)
  653. pyray.Color(255,0,0,0)
  654. pyray.rl_enable_smooth_lines()
  655. GREY = [122,122,122,255]
  656. k=keys[0]
  657. if cur is None:
  658. cur = k #k[3] #"xx123" # k
  659. #check_buttons(buttons,fix_list)
  660. pyray.draw_text_ex(font_l_22,"FIXTURE LIST",[20,2], 22, 0, pyray.GRAY)
  661. pyray.draw_text_ex(font12,"ACTIVE:{:0.1f} {:0.1f}".format(0,0),[220,5], 12, 0, pyray.YELLOW)
  662. pyray.draw_text_ex(font12,"ENCODER:{:0.2f}".format(5),[315,5], 12, 0, pyray.YELLOW)
  663. pyray.draw_text_ex(font12,"FPS:{}".format(fps_count) ,[420,5], 12, 0, pyray.BLUE)
  664. pyray.draw_text_ex(font12,"BTN:{}".format(len(buttons)) ,[460,5], 12, 0, pyray.BLUE)
  665. pyray.draw_text_ex(font12,"FIX:{}".format(len(fix_list)),[520,5], 12, 0, pyray.BLUE)
  666. txt="HELP"
  667. key="HELP"
  668. btn=BUTTON(None,txt,[4,160,16,40])
  669. btn.font = font10
  670. buttons[key] = btn
  671. draw_buttons(buttons)
  672. pyray.draw_text_ex(font12,"X:{}".format(int(m.x)),[590,5], 12, 0, pyray.VIOLET)
  673. pyray.draw_text_ex(font12,"Y:{}".format(int(m.y)),[620,5], 12, 0, pyray.VIOLET)
  674. pyray.draw_rectangle(int(old_x-10),int(old_y-1),20,2,[255,0,255,255])
  675. pyray.draw_rectangle(int(old_x-1),int(old_y-10),2,20,[255,0,255,255])
  676. aapos = draw_mouse_box(None,[old_x,old_y],mouse_old,color=[128,128,128],text=1)
  677. pyray.end_drawing()
  678. # frame tick speed, CPU LOAD. ------
  679. delta = 1/5
  680. if delta > (time.time()-core_tick_t):
  681. delta -= (time.time()-core_tick_t)
  682. #print(delta)
  683. for t in range(8):
  684. time.sleep(delta/8)
  685. _event_loop(buttons)
  686. pyray.begin_drawing()
  687. pyray.end_drawing()
  688. core_tick_t = time.time()
  689. # --------------------------------
  690. frame_count += 1
  691. if time.time()-start > 1:
  692. start = time.time()
  693. fps_count = frame_count
  694. frame_count = 0
  695. FIRST_RUN = 0
  696. except KeyboardInterrupt as e:
  697. raise e
  698. except Exception as e:# KeyInterupt
  699. cprint("err",e,color="red")
  700. import traceback
  701. cprint(traceback.format_exc(),color="red")
  702. time.sleep(1)
  703. pyray.close_window()