FX3.py 27 KB

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