FX3.py 29 KB

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