FX3.py 30 KB

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