FX3.py 30 KB

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