FX3.py 26 KB

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