FX3.py 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117
  1. #!/usr/bin/python3
  2. import json
  3. import time
  4. import sys
  5. import copy
  6. import os
  7. import tkinter as tk
  8. import traceback
  9. import _thread as thread
  10. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  11. gui=None
  12. INIT_OK = 1
  13. IS_GUI = 0
  14. import __main__ as MAIN
  15. import lib.meta as meta
  16. import tool.git as git
  17. CAPTION = "FX3"
  18. title = CAPTION
  19. title += git.get_all()
  20. from lib.cprint import cprint
  21. import lib.libtk as libtk
  22. import lib.libtk2 as libtk2
  23. import lib.zchat as chat
  24. import lib.mytklib as mytklib
  25. import lib.tkevent as tkevent
  26. #import tkgui.draw as draw
  27. import tool.movewin as movewin
  28. movewin.check_is_started("FX3","/opt/LibreLight/Xdesk/tkgui/FX3.py")
  29. class rEvent():
  30. def __init__(self):
  31. self.num = 1
  32. self.type = "rEvent <EventType.ButtonPress: '4'>"
  33. console = chat.Client() #port=50001)
  34. def jsend(jdatas):
  35. jtxt = jdatas
  36. #jtxt = json.dumps(jtxt)
  37. #jtxt = jtxt.encode()
  38. console.send( jtxt ) #b"\00 ")
  39. def _add_space(frame,r,c):
  40. b = tk.Canvas(frame,bg="black", height=2,bd=0,width=6,highlightthickness=0) #,bd="black")
  41. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  42. r+=1
  43. c=0
  44. return r,c
  45. def basic():
  46. for i in range(4):
  47. k = "GRP:1" #.format(i+1)
  48. MAIN.meta.fx3_grid[k].val("POS")
  49. k = "ATTR:1" #.format(i+1)
  50. MAIN.meta.fx3_grid[k].val("-")
  51. k = "ATTR:2" #.format(i+1)
  52. MAIN.meta.fx3_grid[k].val("-")
  53. k = "ATTR:3" #.format(i+1)
  54. MAIN.meta.fx3_grid[k].val("-")
  55. k = "ATTR:4" #.format(i+1)
  56. MAIN.meta.fx3_grid[k].val("-")
  57. k = "SIZE:{}".format(i+1)
  58. MAIN.meta.fx3_grid[k].val(255)
  59. MAIN.meta.fx3_grid[k].data["init_value"] = 255
  60. MAIN.meta.fx3_grid[k].data["max"] = 1024
  61. MAIN.meta.fx3_grid[k].data["cycle"] = [0,127,255]
  62. k = "SPEED:{}".format(i+1)
  63. MAIN.meta.fx3_grid[k].val(10)
  64. MAIN.meta.fx3_grid[k].data["init_value"] = 10
  65. MAIN.meta.fx3_grid[k].data["max"] = 1024
  66. MAIN.meta.fx3_grid[k].data["cycle"] = [0,5,25,30,100,255]
  67. k = "OFFSET:{}".format(i+1)
  68. MAIN.meta.fx3_grid[k].val(100)
  69. MAIN.meta.fx3_grid[k].data["init_value"] = 100
  70. MAIN.meta.fx3_grid[k].data["max"] = 1024
  71. MAIN.meta.fx3_grid[k].data["inc"] = 25
  72. k = "WIDTH:{}".format(i+1)
  73. MAIN.meta.fx3_grid[k].val(25)
  74. MAIN.meta.fx3_grid[k].data["init_value"] = 25
  75. MAIN.meta.fx3_grid[k].data["max"] = 100
  76. MAIN.meta.fx3_grid[k].data["inc"] = 5
  77. k = "START:{}".format(i+1)
  78. MAIN.meta.fx3_grid[k].val(0)
  79. MAIN.meta.fx3_grid[k].data["init_value"] = 0
  80. MAIN.meta.fx3_grid[k].data["max"] = 1024
  81. MAIN.meta.fx3_grid[k].data["inc"] = 5
  82. k = "SHUFFLE:{}".format(i+1)
  83. MAIN.meta.fx3_grid[k].val(0)
  84. MAIN.meta.fx3_grid[k].data["init_value"] = 0
  85. MAIN.meta.fx3_grid[k].data["max"] = 1
  86. k = "DIR:{}".format(i+1)
  87. MAIN.meta.fx3_grid[k].val(1)
  88. MAIN.meta.fx3_grid[k].data["init_value"] = 1
  89. MAIN.meta.fx3_grid[k].data["max"] = 1
  90. k = "INVERT:{}".format(i+1)
  91. MAIN.meta.fx3_grid[k].val(1)
  92. MAIN.meta.fx3_grid[k].data["init_value"] = 1
  93. MAIN.meta.fx3_grid[k].data["max"] = 1
  94. k = "BASE:{}".format(i+1)
  95. MAIN.meta.fx3_grid[k].val(1)
  96. MAIN.meta.fx3_grid[k].data["init_value"] = 0
  97. MAIN.meta.fx3_grid[k].data["max"] = 1
  98. MAIN.meta.fx3_grid[k].data["min"] = -1
  99. basic()
  100. def get_fx3_grid():
  101. fx3_grid = MAIN.meta.fx3_grid # OptionBuffer()
  102. out = []
  103. for k,v in fx3_grid.items(): # re-order fx3_grid to command
  104. vv = v.val()
  105. kk,ii = k.split(":")
  106. ii = int(ii)-1
  107. if len(out) <= ii: #extand list
  108. out.append({})
  109. out[ii][kk] = vv
  110. return out
  111. def reshape_grid_to_jdata(grid_data1):
  112. grid_data2 = {}
  113. if not grid_data1:
  114. print("reshape_grid_to_jdata() no grid_data2 !")
  115. return grid_data2
  116. for i in grid_data1:
  117. attr = i["ATTR"].strip()
  118. if attr:
  119. #grid_data2[attr] = {"event":"FX3","MODE":"FX2","DMX":-11,"DMX-FINE":-99,"FIX":"","ATTR":"","VALUE":None,"FX2":i}
  120. grid_data2[attr] = {"event":"FX3","MODE":"FX","DMX":-11,"DMX-FINE":-99,"FIX":"","ATTR":"","VALUE":None,"FX2":i}
  121. return grid_data2
  122. def update_dmx_adresses(grid_data2):
  123. patch = mc_api.get_patch()
  124. patch = mc_api.patch_order_by_fix(patch)
  125. out=[]
  126. for i in grid_data2:
  127. ID = i["FIX"]
  128. attr = i["ATTR"]
  129. #print("address",[ID,attr,i,ID in patch])
  130. if ID in patch:
  131. v = patch[ID]
  132. if attr in v["ATTR"]:
  133. dmx = v["ATTR"][attr]
  134. i["DMX"]=dmx
  135. attr += "-FINE"
  136. if attr in v["ATTR"]:
  137. dmx = v["ATTR"][attr]
  138. i["DMX-FINE"]=dmx
  139. #cprint("333-- FX3:",i,color="yellow")
  140. return grid_data2
  141. def extract_fixture_list(grid_data3):
  142. #print()
  143. out = {}
  144. for k,v in enumerate(grid_data3):
  145. #print("calc_off",k,v)
  146. if v["FIX"] not in out:
  147. out[v["FIX"]] = 0
  148. else:
  149. out[v["FIX"]] += 1
  150. return out
  151. def correct_base(grid_data3):
  152. for k,v in enumerate(grid_data3):
  153. #print("BASE:",[k,v])
  154. if type(v["FX2"]["BASE"]) not in [int,float]:
  155. continue
  156. if v["FX2"]["BASE"] < 0:
  157. v["FX2"]["BASE"] = "-"
  158. elif v["FX2"]["BASE"] > 0:
  159. v["FX2"]["BASE"] = "+"
  160. else:
  161. v["FX2"]["BASE"] = "0"
  162. def calculate_offset(grid_data3,wing=None):
  163. if wing is None:
  164. fix = extract_fixture_list(grid_data3)
  165. else:
  166. fix = wing
  167. #print()
  168. print("---"*10)
  169. offset = {}
  170. if not wing:
  171. cprint("calculate_offset not wing !")
  172. return
  173. if len(wing) <= 0:
  174. cprint("calculate_offset not wing !")
  175. return
  176. offset_len = len(wing[0])-1
  177. if offset_len <= 0:
  178. offset_len = 1
  179. #offset = grid_data3[0]["FX2"]["OFFSET"]/offset_len
  180. for k,v in enumerate(grid_data3):
  181. _offset = v["FX2"]["OFFSET"]
  182. attr = v["ATTR"]
  183. if attr not in offset:
  184. offset[attr] = 0
  185. offset[attr] += _offset/offset_len
  186. for i,wing in enumerate(fix):
  187. for j,f in enumerate(wing):
  188. print(i,j)
  189. for k,v in enumerate(grid_data3):
  190. if f != v["FIX"]:
  191. continue
  192. attr = v["ATTR"]
  193. nof = round( offset[attr]*j,2 ) # ID
  194. v["FX2"]["OFFSET"] = nof
  195. v["FX2"]["WING"] = i
  196. print(" ",f,attr,v["FX2"],nof)
  197. def merge_grid_and_programmer(programmer,grid_data2):
  198. out=[]
  199. for k,v in enumerate(programmer):
  200. attr = v["ATTR"]
  201. ID = v["ID"]
  202. #print("merge_grid..",v)
  203. if attr in grid_data2:
  204. tmp = copy.deepcopy(grid_data2[attr])
  205. if "GRP" in tmp["FX2"]:
  206. del tmp["FX2"]["GRP"]
  207. #print(" tmp",tmp)
  208. _offset = tmp["FX2"]["OFFSET"]
  209. tmp["ATTR"] = attr
  210. tmp["FIX"] = ID
  211. out.append(tmp)
  212. return out
  213. def log(x,name="log",color="yellow"):
  214. #print()
  215. if type(x) in [dict]: #,OrderedDict]:
  216. for k,v in x.items():
  217. cprint(name,[k,v],color=color)
  218. else:
  219. for k,v in enumerate(x):
  220. cprint(name,[k,v],color=color)
  221. import lib.fxlib as fxlib
  222. def calculate_wing_shuffle(grid_data3):
  223. fixtures = []
  224. for i,f in enumerate(grid_data3):
  225. print("WING",i,f)
  226. fix = f["FIX"]
  227. if fix not in fixtures:
  228. fixtures.append(fix)
  229. fx_prm={}
  230. fx_prm["SHUFFLE"] = 1
  231. fx_prm["WING"] = 2
  232. if len(grid_data3) <= 0:
  233. cprint("calculate_wing_shuffle no grid_data3 !")
  234. return
  235. print()
  236. print(grid_data3[0])
  237. fx_prm["WING"] = int(grid_data3[0]["FX2"]["WING"])
  238. fx_prm["SHUFFLE"] = int(grid_data3[0]["FX2"]["SHUFFLE"])
  239. a=fxlib.process_wings(fixtures,fx_prm)
  240. print(a)
  241. return a
  242. def grid_stop(grid_data1):
  243. if not grid_data1:
  244. return
  245. for v in grid_data1:
  246. v["SPEED"] = 0
  247. print("grid_stop",v)
  248. def grid_off(grid_data1):
  249. if not grid_data1:
  250. return
  251. for v in grid_data1:
  252. v["SIZE"] = 0
  253. print("grid_off",v)
  254. class tk_event_fx():
  255. """ global input event Handeler for short cut's ... etc
  256. """
  257. def __init__(self,fix,elem,attr=None,data=None,mode=None):
  258. self.fix = fix
  259. self.data = data # gui / master
  260. self.attr = attr
  261. self.elem = elem
  262. self.mode = mode
  263. self.ATTR_GRP = ""
  264. def command_fx3(self,event=None,mode=""):
  265. prm = []
  266. ct = ""
  267. #print(" --", self.attr)
  268. fx3_grid = MAIN.meta.fx3_grid # OptionBuffer()
  269. if self.attr in ["START","STOP","OFF"]:
  270. grid_data1 = get_fx3_grid()
  271. #if self.attr in ["STOP"]:
  272. # grid_stop(grid_data1)
  273. if self.attr in ["OFF"]:
  274. grid_off(grid_data1)
  275. grid_data2 = reshape_grid_to_jdata(grid_data1)
  276. programmer = mc_api.get_programmer()
  277. grid_data3 = merge_grid_and_programmer(programmer,grid_data2)
  278. wing = calculate_wing_shuffle(grid_data3)
  279. calculate_offset(grid_data3,wing)
  280. correct_base(grid_data3)
  281. update_dmx_adresses(grid_data3)
  282. grid_data4 = []
  283. for i in grid_data3:
  284. cprint(" ", i,color="green")
  285. grid_data4.append(i)
  286. msg=json.dumps(grid_data4).encode("utf-8")
  287. cprint("SEND FX3:",color="green")
  288. cmd_client.send(msg)
  289. if self.attr not in fx3_grid:
  290. fx_data = {}
  291. if self.attr == "CIRCLE":
  292. for k,v in fx3_grid.items():
  293. if k.startswith("ATTR"):
  294. print(self.attr,k,v)
  295. if self.attr == "PLAY":
  296. for k,v in fx3_grid.items():
  297. vv = v.val()
  298. k_name , k_nr = k.split(":")
  299. if k_nr not in fx_data:
  300. fx_data[k_nr] = {}
  301. fx_data[k_nr][k_name] = vv
  302. #print("**",k,vv,v)
  303. for k,v in fx_data.items():
  304. print("fx33",k,v)
  305. if "ATTR" in v and v["ATTR"] != " ":
  306. print("HH",k,v)
  307. #print()
  308. return
  309. fx_func = MAIN.meta.OptionBuffer()
  310. if self.attr.startswith("ATTR:"):
  311. col = self.attr.split(":")[1]
  312. fx_func1 = fx3_grid["GRP:"+str(col)]
  313. GRP = fx_func1.val()
  314. if GRP != self.ATTR_GRP:
  315. self.ATTR_GRP = GRP
  316. fx_func1.val(GRP)
  317. fx3_grid[self.attr] = MAIN.meta.Optionbuffer_create_ATTR(GRP)
  318. fx_func = fx3_grid[self.attr]
  319. print(fx_func.data)
  320. fx_func.data["wrap"] = 1
  321. else:
  322. fx_func = fx3_grid[self.attr]
  323. fx_func.data["wrap"] = 1
  324. print("func",fx_func,fx_func.val())
  325. if event.num == 3:
  326. fx_func.reset()
  327. elif event.num == 4:
  328. fx_func.inc()
  329. elif event.num == 5:
  330. fx_func.dec()
  331. v=fx_func.val()
  332. #print(v)
  333. #print(self.elem)
  334. self.elem["text"] = v
  335. return
  336. def command(self,event=None,mode=""):
  337. cprint("tkevent.tk_event_fx.command")
  338. cprint(" ",self.mode)
  339. prm = None
  340. ct = None
  341. if self.mode == "FX-3":
  342. return self.command_fx3(event,mode=mode)
  343. def cb(self,event):
  344. cprint("tkevent.EVENT_fx.cb:",[self.attr,self.mode,event],color='yellow')
  345. cprint(" ",["type",event.type,"num",event.num])
  346. try:
  347. change = 0
  348. if self.attr == "REC-FX":
  349. msg=json.dumps([{"event":"REC-FX","VALUE":255,"DATA":{}}]).encode("utf-8")
  350. global modes
  351. if "REC-FX" in modes:
  352. msg=json.dumps([{"event":"REC-FX","VALUE":0,"DATA":{}}]).encode("utf-8")
  353. cmd_client.send(msg) # diable LABEL mode
  354. elif self.attr == "FX OFF":
  355. msg=json.dumps([{"event":"FX-OFF","VALUE":255,"DATA":{}}]).encode("utf-8")
  356. cmd_client.send(msg) # diable LABEL mode
  357. elif self.mode.startswith("FX"):
  358. self.command(event)
  359. return 0
  360. except Exception as e:
  361. cprint("== cb EXCEPT",e,color="red")
  362. cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
  363. cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
  364. return 1
  365. def motion(code="circle"):
  366. #basic()
  367. k = "GRP:1" #.format(i+1)
  368. MAIN.meta.fx3_grid[k].val("POS")
  369. MAIN.meta.change_grp(name=k,val="POS")
  370. k = "GRP:2" #.format(i+1)
  371. MAIN.meta.fx3_grid[k].val("POS")
  372. MAIN.meta.change_grp(name=k,val="POS")
  373. k = "GRP:3" #.format(i+1)
  374. MAIN.meta.fx3_grid[k].val(" ")
  375. MAIN.meta.change_grp(name=k,val=" ")
  376. k = "GRP:4" #.format(i+1)
  377. MAIN.meta.fx3_grid[k].val(" ")
  378. MAIN.meta.change_grp(name=k,val=" ")
  379. k = "GRP:5" #.format(i+1)
  380. MAIN.meta.fx3_grid[k].val(" ")
  381. MAIN.meta.change_grp(name=k,val=" ")
  382. k = "GRP:6" #.format(i+1)
  383. MAIN.meta.fx3_grid[k].val(" ")
  384. MAIN.meta.change_grp(name=k,val=" ")
  385. k = "ATTR:1" #.format(i+1)
  386. MAIN.meta.fx3_grid[k].val("PAN")
  387. k = "ATTR:2" #.format(i+1)
  388. MAIN.meta.fx3_grid[k].val("TILT")
  389. k = "ATTR:3" #.format(i+1)
  390. MAIN.meta.fx3_grid[k].val(" ")
  391. k = "ATTR:4" #.format(i+1)
  392. MAIN.meta.fx3_grid[k].val(" ")
  393. k = "ATTR:5" #.format(i+1)
  394. MAIN.meta.fx3_grid[k].val(" ")
  395. k = "ATTR:6" #.format(i+1)
  396. MAIN.meta.fx3_grid[k].val(" ")
  397. k = "TYPE:1"
  398. MAIN.meta.fx3_grid[k].val("sinus")
  399. k = "TYPE:2"
  400. MAIN.meta.fx3_grid[k].val("cosinus")
  401. k = "WIDTH:1"
  402. MAIN.meta.fx3_grid[k].val(255)
  403. k = "WIDTH:2"
  404. MAIN.meta.fx3_grid[k].val(255)
  405. k = "BASE:1"
  406. MAIN.meta.fx3_grid[k].val(0)
  407. k = "BASE:2"
  408. MAIN.meta.fx3_grid[k].val(0)
  409. for i in range(1,5+1):
  410. k = "START:"+str(i)
  411. MAIN.meta.fx3_grid[k].val(0)
  412. if code == "circle":
  413. k = "SIZE:1"
  414. MAIN.meta.fx3_grid[k].val(100)
  415. k = "SIZE:2"
  416. MAIN.meta.fx3_grid[k].val(100)
  417. if code == "pan":
  418. k = "SIZE:1"
  419. MAIN.meta.fx3_grid[k].val(100)
  420. k = "SIZE:2"
  421. MAIN.meta.fx3_grid[k].val(0)
  422. if code == "tilt":
  423. k = "SIZE:1"
  424. MAIN.meta.fx3_grid[k].val(0)
  425. k = "SIZE:2"
  426. MAIN.meta.fx3_grid[k].val(100)
  427. if code == "flay":
  428. k = "SIZE:1"
  429. MAIN.meta.fx3_grid[k].val(0)
  430. k = "SIZE:2"
  431. MAIN.meta.fx3_grid[k].val(100)
  432. k = "SIZE:3"
  433. MAIN.meta.fx3_grid[k].val(100)
  434. k = "START:2"
  435. MAIN.meta.fx3_grid[k].val(20)
  436. k = "TYPE:2"
  437. MAIN.meta.fx3_grid[k].val("ramp")
  438. k = "TYPE:3"
  439. MAIN.meta.fx3_grid[k].val("on")
  440. k = "GRP:3"
  441. MAIN.meta.fx3_grid[k].val("BEAM")
  442. MAIN.meta.change_grp(name=k,val="BEAM")
  443. k = "ATTR:3"
  444. MAIN.meta.fx3_grid[k].val("DIM")
  445. k = "WIDTH:3"
  446. MAIN.meta.fx3_grid[k].val(85)
  447. k = "BASE:3"
  448. MAIN.meta.fx3_grid[k].val(-1)
  449. if code == "street":
  450. k = "SIZE:1"
  451. MAIN.meta.fx3_grid[k].val(100)
  452. k = "SIZE:2"
  453. MAIN.meta.fx3_grid[k].val(0)
  454. k = "SIZE:3"
  455. MAIN.meta.fx3_grid[k].val(100)
  456. k = "START:1"
  457. MAIN.meta.fx3_grid[k].val(20)
  458. k = "TYPE:1"
  459. MAIN.meta.fx3_grid[k].val("ramp")
  460. k = "TYPE:3"
  461. MAIN.meta.fx3_grid[k].val("on")
  462. k = "GRP:3"
  463. MAIN.meta.fx3_grid[k].val("BEAM")
  464. MAIN.meta.change_grp(name=k,val="BEAM")
  465. k = "ATTR:3"
  466. MAIN.meta.fx3_grid[k].val("DIM")
  467. k = "WIDTH:3"
  468. MAIN.meta.fx3_grid[k].val(85)
  469. k = "BASE:3"
  470. MAIN.meta.fx3_grid[k].val(-1)
  471. def size(val=255):
  472. for i in range(4):
  473. k = "SIZE:{}".format(i+1)
  474. kt = "TYPE:{}".format(i+1)
  475. print(" ",k,val)
  476. if MAIN.meta.fx3_grid[kt].val() not in ["STATIC","-"]:
  477. v = MAIN.meta.fx3_grid[k].val()
  478. if v not in [0,0.0]:
  479. MAIN.meta.fx3_grid[k].val(val)
  480. refresh_fx3_elem(_filter="SIZE")
  481. def speed(val=255):
  482. for i in range(4):
  483. k = "SPEED:{}".format(i+1)
  484. kt = "TYPE:{}".format(i+1)
  485. print(" ",k,val)
  486. if MAIN.meta.fx3_grid[kt].val() not in ["STATIC","-"]:
  487. MAIN.meta.fx3_grid[k].val(val)
  488. refresh_fx3_elem(_filter="SPEED")
  489. def dim(code="dim"):
  490. for i in range(1,5+1):
  491. k = "GRP:" +str(i)
  492. MAIN.meta.change_grp(name=k,val="BEAM")
  493. MAIN.meta.fx3_grid[k].val("BEAM")
  494. k = "ATTR:"+str(i)
  495. MAIN.meta.fx3_grid[k].val(" ")
  496. k = "TYPE:"+str(i)
  497. MAIN.meta.fx3_grid[k].val("static")
  498. k = "WIDTH:"+str(i)
  499. MAIN.meta.fx3_grid[k].val(50)
  500. k = "BASE:"+str(i)
  501. MAIN.meta.fx3_grid[k].val(-1)
  502. k = "SIZE:"+str(i)
  503. MAIN.meta.fx3_grid[k].val(0)
  504. k = "ATTR:1"
  505. MAIN.meta.fx3_grid[k].val("DIM")
  506. if code == "dim":
  507. k = "TYPE:1"
  508. MAIN.meta.fx3_grid[k].val("fade")
  509. k = "SIZE:1"
  510. MAIN.meta.fx3_grid[k].val(255)
  511. def rgb(code="red"):
  512. #basic()
  513. for i in range(1,5+1):
  514. k = "GRP:" +str(i)
  515. MAIN.meta.change_grp(name=k,val="RGB")
  516. MAIN.meta.fx3_grid[k].val("RGB")
  517. k = "GRP:6"
  518. MAIN.meta.change_grp(name=k,val=" ")
  519. MAIN.meta.fx3_grid[k].val(" ")
  520. k = "ATTR:1"
  521. MAIN.meta.fx3_grid[k].val("RED")
  522. k = "ATTR:2"
  523. MAIN.meta.fx3_grid[k].val("GREEN")
  524. k = "ATTR:3"
  525. MAIN.meta.fx3_grid[k].val("BLUE")
  526. k = "ATTR:4"
  527. MAIN.meta.fx3_grid[k].val("WHITE")
  528. k = "ATTR:5"
  529. MAIN.meta.fx3_grid[k].val("AMBER")
  530. k = "ATTR:6"
  531. MAIN.meta.fx3_grid[k].val(" ")
  532. for i in range(1,5+1):
  533. k = "TYPE:"+str(i)
  534. MAIN.meta.fx3_grid[k].val("static")
  535. k = "WIDTH:"+str(i)
  536. MAIN.meta.fx3_grid[k].val(50)
  537. k = "BASE:"+str(i)
  538. MAIN.meta.fx3_grid[k].val(-1)
  539. k = "SIZE:"+str(i)
  540. MAIN.meta.fx3_grid[k].val(0)
  541. if code == "red":
  542. k = "TYPE:1"
  543. MAIN.meta.fx3_grid[k].val("fade")
  544. k = "SIZE:1"
  545. MAIN.meta.fx3_grid[k].val(255)
  546. if code == "green":
  547. k = "TYPE:2"
  548. MAIN.meta.fx3_grid[k].val("fade")
  549. k = "SIZE:2"
  550. MAIN.meta.fx3_grid[k].val(255)
  551. if code == "blue":
  552. k = "TYPE:3"
  553. MAIN.meta.fx3_grid[k].val("fade")
  554. k = "SIZE:3"
  555. MAIN.meta.fx3_grid[k].val(255)
  556. if code == "magenta":
  557. k = "TYPE:1"
  558. MAIN.meta.fx3_grid[k].val("fade")
  559. k = "TYPE:3"
  560. MAIN.meta.fx3_grid[k].val("fade")
  561. k = "SIZE:1"
  562. MAIN.meta.fx3_grid[k].val(255)
  563. k = "SIZE:3"
  564. MAIN.meta.fx3_grid[k].val(255)
  565. if code == "cyan":
  566. k = "TYPE:2"
  567. MAIN.meta.fx3_grid[k].val("fade")
  568. k = "TYPE:3"
  569. MAIN.meta.fx3_grid[k].val("fade")
  570. k = "SIZE:2"
  571. MAIN.meta.fx3_grid[k].val(255)
  572. k = "SIZE:3"
  573. MAIN.meta.fx3_grid[k].val(255)
  574. if code == "yellow":
  575. k = "TYPE:1"
  576. MAIN.meta.fx3_grid[k].val("fade")
  577. k = "TYPE:2"
  578. MAIN.meta.fx3_grid[k].val("fade")
  579. k = "SIZE:1"
  580. MAIN.meta.fx3_grid[k].val(255)
  581. k = "SIZE:2"
  582. MAIN.meta.fx3_grid[k].val(255)
  583. refresh_fx3_elem()
  584. def clear():
  585. basic()
  586. for i in range(1,5+1):
  587. k = "GRP:"+str(i)
  588. MAIN.meta.fx3_grid[k].val(" ")
  589. k = "ATTR:"+str(i)
  590. MAIN.meta.fx3_grid[k].val(" ")
  591. k = "TYPE:"+str(i)
  592. MAIN.meta.fx3_grid[k].val(" ")
  593. motion("circle")
  594. def refresh_fx3_elem(_filter=""):
  595. ct = MAIN.meta.fx3 #moves
  596. prm = MAIN.meta.fx3_prm
  597. for comm in ct.labels:
  598. if comm not in ct.elem:
  599. continue
  600. b = ct.elem[comm]
  601. if comm in MAIN.meta.fx3_grid:
  602. if _filter and _filter != comm:
  603. continue
  604. v2 = MAIN.meta.fx3_grid[comm].val()
  605. v1 = b["text"]
  606. v2 = MAIN.meta.fx3_grid[comm].val()
  607. v1 = b["text"]
  608. if str(v2) != str(v1):
  609. #print(" change")
  610. b["text"] = str(v2)
  611. def refresh_fx3_loop():
  612. while 1:
  613. refresh_fx3_elem()
  614. time.sleep(2)
  615. def _XXX(xcb,xcomm,xb):
  616. def XXX(event=None,**data):
  617. print("BTN:",xb["text"],xcomm)
  618. print("xXx "*22)
  619. print("XXX",event,data)
  620. if xcomm == "CIRCLE":
  621. motion("circle")
  622. elif xcomm == "PAN":
  623. motion("pan")
  624. elif xcomm == "TILT":
  625. motion("tilt")
  626. elif xcomm == "FLAY":
  627. motion("flay")
  628. elif xcomm == "STREET":
  629. motion("street")
  630. elif xcomm == "DIM":
  631. dim(code="dim")
  632. elif xcomm == "RED":
  633. rgb("red")
  634. elif xcomm == "GREEN":
  635. rgb("green")
  636. elif xcomm == "BLUE":
  637. rgb("blue")
  638. elif xcomm == "CYAN":
  639. rgb("cyan")
  640. elif xcomm == "MAGENTA":
  641. rgb("magenta")
  642. elif xcomm == "YELLOW":
  643. rgb("yellow")
  644. elif xcomm == "MINI":
  645. size(25)
  646. elif xcomm == "SMALL":
  647. size(50)
  648. elif xcomm == "NORMAL":
  649. size(100)
  650. elif xcomm == "BIG":
  651. size(255)
  652. elif xcomm == "SLOW":
  653. speed(5)
  654. elif xcomm == "MID":
  655. speed(25)
  656. elif xcomm == "FAST":
  657. speed(80)
  658. elif xcomm == "TURBO":
  659. speed(160)
  660. xcb(event) #,data)
  661. return XXX
  662. def _draw_fx3(frame,c,r,gui,mode="FX"):
  663. ct = MAIN.meta.fx3 #moves
  664. prm = MAIN.meta.fx3_prm
  665. for comm in ct.labels:
  666. print(" draw3",comm)
  667. if comm == "\n\n":
  668. b = tk.Label(frame,bg="black", text="-",font=space_font)
  669. b.grid(row=r, column=c,pady=0,padx=0, sticky=tk.W+tk.E)
  670. c=0
  671. r+=1
  672. continue
  673. if comm == "\n":
  674. c=0
  675. r+=1
  676. continue
  677. v=0
  678. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=1)
  679. ct.elem[comm] = b
  680. ct.val[comm] = 0
  681. _cb = tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb
  682. _comm = comm
  683. _b = b
  684. XXX = _XXX(_cb,_comm,_b)
  685. b.bind("<Button>",XXX)
  686. #b.bind("<Button>",tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  687. if comm == "xREC-FX":
  688. b["bg"] = "grey"
  689. elif comm == "xFX OFF":
  690. b["bg"] = "magenta"
  691. elif comm[:3] == "xFX:" or comm[:3] == "x2D:":
  692. b["text"] = comm
  693. b["bg"] = "#ffbf00"
  694. #if comm in ["SHUFFLE:","WING:","BASE:","INVERT:","DIR:","START:","STOP","OFF"]: # not implemented !
  695. if comm in ["INVERT:","STOP","DIR:","WING:"]: # not implemented !
  696. b["fg"] = "#aaa"
  697. b.config(activebackground="#aaa")
  698. #b.config(activebackground="#bbb")
  699. if comm in ["SIZE:","WIDTH:","DIR:","WING:","ATTR:","TYPE:","SPEED:","OFFSET:"]: # OK
  700. b["bg"] = "#bbb"
  701. b.config(activebackground="#bbb")
  702. b.config(activeforeground="#bbb")
  703. #activeForeground
  704. if comm == "START":
  705. b["bg"] = "orange"
  706. b.config(activebackground="#dd0")
  707. if comm in MAIN.meta.fx3_grid:
  708. fx_func = MAIN.meta.fx3_grid[comm]
  709. fx_func.data["wrap"] = 1
  710. #fx_func.inc()
  711. v=fx_func.val()
  712. print("3>",[comm,fx_func,v])
  713. b["text"] = v
  714. if comm.startswith("TYPE:"):
  715. #b["bg"] = "orange"
  716. #b.config(activebackground="#dd0")
  717. b["bg"] = "lightgreen"
  718. b.config(activebackground="#0d0")
  719. for a in ["SPEED:","SIZE:","START:","OFFSET:"]:
  720. if comm.startswith(a):
  721. b["bg"] = "lightgreen"
  722. b.config(activebackground="#0d0")
  723. if comm:
  724. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  725. c+=1
  726. if c >=7:
  727. c=0
  728. r+=1
  729. c=0
  730. r+=1
  731. return c,r
  732. fx_rec_btn = None
  733. def _draw_fx_head(frame,c,r,gui,mode="FX"):
  734. ct = None
  735. prm = None
  736. if mode=="FX-MAIN":
  737. ct = MAIN.meta.fx_main
  738. prm = MAIN.meta.fx_prm_main
  739. print("-- draw")
  740. for comm in ct.labels:
  741. print(" draw",comm)
  742. if comm == "\n\n":
  743. b = tk.Label(frame,bg="black", text="-",font=space_font)
  744. b.grid(row=r, column=c,pady=0,padx=0, sticky=tk.W+tk.E)
  745. c=0
  746. r+=1
  747. continue
  748. if comm == "\n":
  749. c=0
  750. r+=1
  751. continue
  752. v=0
  753. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  754. ct.elem[comm] = b
  755. ct.val[comm] = 0
  756. #b.bind("<Button>",tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  757. b.bind("<Button>",tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  758. if comm == "REC-FX":
  759. b["bg"] = "grey"
  760. global fx_rec_btn
  761. fx_rec_btn = b
  762. elif comm == "FX OFF":
  763. b["bg"] = "magenta"
  764. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  765. c+=1
  766. if c >=6:
  767. c=0
  768. r+=1
  769. c=0
  770. r+=1
  771. return c,r
  772. def draw_fx3(gui,xframe):
  773. frame_fx=xframe
  774. i=0
  775. c=0
  776. r=0
  777. frame = tk.Frame(frame_fx,bg="black")
  778. frame.pack(fill=tk.X, side=tk.TOP)
  779. # ------------------------------
  780. b = tk.Button(frame,bg="lightblue", text="FX3",width=6)
  781. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  782. c+=1
  783. _add_space(frame,r,c)
  784. c,r = _draw_fx_head(frame,c,r,gui,mode="FX-MAIN")
  785. r,c=_add_space(frame,r,c)
  786. c,r = _draw_fx3(frame,c,r,gui,mode="FX-3")
  787. r,c=_add_space(frame,r,c)
  788. _global_short_key = 1
  789. root = None
  790. cmd_client = chat.Client(port=30003)
  791. class GUI(): # DUMMY
  792. def __init__(self):
  793. self.elem_exec = []
  794. self.elem_meta = [None]*512
  795. self.old_btn_nr = -1
  796. self.METAS = []
  797. for i in range(512):
  798. self.METAS.append({})
  799. gui = GUI()
  800. root = tk.Tk()
  801. root.maxsize(600,800)
  802. win_title="FX3"
  803. store = movewin.load_all_sdl(win_title)
  804. print(store)
  805. W=380
  806. H=550
  807. POS=[800,200]
  808. if store:
  809. W = store[-4]
  810. H = store[-3]
  811. POS=[store[-2],store[-1]]
  812. root.geometry('%dx%d+%d+%d' % (W, H, POS[0],POS[1]))
  813. root.tk_setPalette(background='#bbb', foreground='black', activeBackground='#aaa', activeForeground="black")
  814. defaultFont = tk.font.nametofont("TkDefaultFont")
  815. defaultFont.configure(family="FreeSans", size=10, weight="bold")
  816. # MAIN MENUE
  817. try:
  818. ico_path = "/opt/LibreLight/Xdesk/icon/"
  819. root.iconphoto(False, tk.PhotoImage(file=ico_path+"scribble.png"))
  820. except Exception as e:
  821. print(" Exception GUIWindowContainer.__init__",e)
  822. xframe = libtk.ScrollFrame(root,width=820,height=400,bd=1,bg="black",head=None,foot=None)
  823. draw_fx3(gui,xframe)
  824. root.title(title)
  825. root.bind("<Button>",libtk2.tk_event)#
  826. root.bind("<Key>",libtk2.tk_event)#,self.callback)
  827. root.bind("<KeyRelease>",libtk2.tk_event)#,self.callback)
  828. #root.bind("<FocusIn>",libtk2.tk_event)#, on_focus(self.args["title"],"In").cb)
  829. #root.bind("<FocusOut>",libtk2.tk_event)#, on_focus(self.args["title"],"Out").cb)
  830. _global_key_lock = 0
  831. def focus_in(event=None):
  832. _global_short_key = 0 # protect key-press-repeat
  833. cmd = "xset -display :0.0 r off"
  834. print("FOCUS_IN1", cmd)
  835. os.system(cmd)
  836. time.sleep(0.3)
  837. print("FOCUS_IN2", cmd)
  838. os.system(cmd)
  839. _global_short_key = 1 # protect key-press-repeat
  840. time.sleep(0.3)
  841. _global_key_lock = 0
  842. def focus_out(event=None):
  843. _global_key_lock = 1
  844. _global_short_key = 0
  845. cmd="xset -display :0.0 r rate 240 20"
  846. print("FOCUS_OUT", cmd)
  847. #os.system(cmd) # DISABLED
  848. root.bind("<FocusIn>", focus_in)
  849. root.bind("<FocusOut>", focus_out)
  850. import lib.mc_api as mc_api
  851. modes = {}
  852. def modes_refresh_loop():
  853. time.sleep(3)
  854. while 1:
  855. try:
  856. global root,title,modes
  857. data = mc_api.modes_refresh()
  858. title2 = title +" "+str(data)
  859. modes = data
  860. if root:
  861. root.title(title2)
  862. if "REC-FX" in data:
  863. #print("xxxxxxxx REC-FX")
  864. fx_rec_btn["bg"] = "red"
  865. fx_rec_btn.config(activebackground="red")
  866. else:
  867. fx_rec_btn["bg"] = "#ddd"
  868. fx_rec_btn.config(activebackground="#ddd")
  869. if "S-KEY" in data:
  870. _global_short_key = 0
  871. if data["S-KEY"]:
  872. _global_short_key = 1
  873. for k in data:
  874. for kk in ["RESTART","PRO","EASY","EXIT"]:
  875. if kk in str(k):
  876. print("RESTART !!! EXIT !!")
  877. time.sleep(0.1)
  878. root.quit()
  879. fx3_line = {}
  880. for comm,v in MAIN.meta.fx3_grid.items():
  881. if comm.startswith("ATTR:"):
  882. fx3_line[comm] = 1
  883. except Exception as e:
  884. print(" ER44 mode_refr ...",e)
  885. time.sleep(3)
  886. time.sleep(0.1)
  887. #thread.start_new_thread(gui.refresh_meta_loop,())
  888. thread.start_new_thread(modes_refresh_loop,())
  889. thread.start_new_thread(refresh_fx3_loop,())
  890. if "--test" in sys.argv:
  891. def test():
  892. time.sleep(1)
  893. print("TEST...")
  894. time.sleep(1)
  895. print("TEST...")
  896. event = rEvent()
  897. msg = [{'event': 'CLEAR', 'TYPE': 'ENCODERS', 'FIX': '', 'VAL': 'click', 'ATTR': ""}]
  898. msg=json.dumps(msg).encode("utf-8")
  899. cmd_client.send(msg)
  900. time.sleep(1)
  901. for i in range(1,10):
  902. for attr in ["RED","BLUE","GREEN"]: #,"PAN","TILT","DIM"]:
  903. msg = [{'event': 'FIXTURES', 'TYPE': 'ENCODERS', 'FIX': str(3000+i), 'VAL': 'click', 'ATTR': attr}]
  904. msg=json.dumps(msg).encode("utf-8")
  905. print(msg)
  906. cmd_client.send(msg)
  907. #exit()
  908. mode = "FX-MAIN"
  909. attr="FX OFF"
  910. cb0 = tk_event_fx(fix=0,elem=None,attr=attr,data=gui,mode=mode).cb
  911. cb0(event)
  912. mode = "FX-3"
  913. attr="CIRCLE"
  914. attr="RED"
  915. _cb = tk_event_fx(fix=0,elem=None,attr=attr,data=gui,mode=mode).cb
  916. b = tk.Button(root,bg="lightgrey", text=str(attr),width=6,height=1) # dummy button
  917. cb1 = _XXX(_cb,attr,b)
  918. time.sleep(1)
  919. cb1(event)
  920. attr="START"
  921. cb1 = tk_event_fx(fix=0,elem=None,attr=attr,data=gui,mode=mode).cb
  922. time.sleep(1)
  923. cb1(event)
  924. thread.start_new_thread(test,())
  925. root.mainloop()