FX3.py 28 KB

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