FX3.py 28 KB

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