FX3.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. #!/usr/bin/python3
  2. import json
  3. import time
  4. import sys
  5. import os
  6. import tkinter as tk
  7. import traceback
  8. import _thread as thread
  9. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  10. gui=None
  11. INIT_OK = 1
  12. IS_GUI = 0
  13. import __main__ as MAIN
  14. import lib.meta as meta
  15. import tool.git as git
  16. CAPTION = "FX3"
  17. title = CAPTION
  18. title += git.get_all()
  19. from lib.cprint import cprint
  20. import lib.libtk as libtk
  21. import lib.libtk2 as libtk2
  22. import lib.zchat as chat
  23. import lib.mytklib as mytklib
  24. import lib.tkevent as tkevent
  25. #import tkgui.draw as draw
  26. import tool.movewin as movewin
  27. movewin.check_is_started("FX3","/opt/LibreLight/Xdesk/tkgui/FX3.py")
  28. def _add_space(frame,r,c):
  29. b = tk.Canvas(frame,bg="black", height=2,bd=0,width=6,highlightthickness=0) #,bd="black")
  30. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  31. r+=1
  32. c=0
  33. return r,c
  34. def basic():
  35. for i in range(4):
  36. k = "GRP:1" #.format(i+1)
  37. MAIN.meta.fx3_grid[k].val("POS")
  38. k = "ATTR:1" #.format(i+1)
  39. MAIN.meta.fx3_grid[k].val("-")
  40. k = "ATTR:2" #.format(i+1)
  41. MAIN.meta.fx3_grid[k].val("-")
  42. k = "ATTR:3" #.format(i+1)
  43. MAIN.meta.fx3_grid[k].val("-")
  44. k = "ATTR:4" #.format(i+1)
  45. MAIN.meta.fx3_grid[k].val("-")
  46. k = "SIZE:{}".format(i+1)
  47. MAIN.meta.fx3_grid[k].val(255)
  48. MAIN.meta.fx3_grid[k].data["init_value"] = 255
  49. MAIN.meta.fx3_grid[k].data["max"] = 512
  50. MAIN.meta.fx3_grid[k].data["cycle"] = [0,127,255]
  51. k = "SPEED:{}".format(i+1)
  52. MAIN.meta.fx3_grid[k].val(10)
  53. MAIN.meta.fx3_grid[k].data["init_value"] = 10
  54. MAIN.meta.fx3_grid[k].data["max"] = 255
  55. MAIN.meta.fx3_grid[k].data["cycle"] = [0,5,25,30,100,255]
  56. k = "OFFSET:{}".format(i+1)
  57. MAIN.meta.fx3_grid[k].val(100)
  58. MAIN.meta.fx3_grid[k].data["init_value"] = 100
  59. MAIN.meta.fx3_grid[k].data["inc"] = 25
  60. k = "WIDTH:{}".format(i+1)
  61. MAIN.meta.fx3_grid[k].val(25)
  62. MAIN.meta.fx3_grid[k].data["init_value"] = 25
  63. MAIN.meta.fx3_grid[k].data["max"] = 100
  64. MAIN.meta.fx3_grid[k].data["inc"] = 5
  65. k = "START:{}".format(i+1)
  66. MAIN.meta.fx3_grid[k].val(0)
  67. MAIN.meta.fx3_grid[k].data["init_value"] = 0
  68. MAIN.meta.fx3_grid[k].data["max"] = 255
  69. MAIN.meta.fx3_grid[k].data["inc"] = 5
  70. k = "SHUFFLE:{}".format(i+1)
  71. MAIN.meta.fx3_grid[k].val(0)
  72. MAIN.meta.fx3_grid[k].data["init_value"] = 0
  73. MAIN.meta.fx3_grid[k].data["max"] = 2
  74. k = "DIR:{}".format(i+1)
  75. MAIN.meta.fx3_grid[k].val(1)
  76. MAIN.meta.fx3_grid[k].data["init_value"] = 1
  77. MAIN.meta.fx3_grid[k].data["max"] = 0
  78. k = "INVERT:{}".format(i+1)
  79. MAIN.meta.fx3_grid[k].val(1)
  80. MAIN.meta.fx3_grid[k].data["init_value"] = 1
  81. MAIN.meta.fx3_grid[k].data["max"] = 1
  82. basic()
  83. def circle():
  84. #basic()
  85. k = "GRP:1" #.format(i+1)
  86. MAIN.meta.fx3_grid[k].val("POS")
  87. k = "GRP:2" #.format(i+1)
  88. MAIN.meta.fx3_grid[k].val("POS")
  89. k = "ATTR:1" #.format(i+1)
  90. MAIN.meta.fx3_grid[k].val("PAN")
  91. k = "ATTR:2" #.format(i+1)
  92. MAIN.meta.fx3_grid[k].val("TILT")
  93. k = "ATTR:3" #.format(i+1)
  94. MAIN.meta.fx3_grid[k].val(" ")
  95. k = "TYPE:1"
  96. MAIN.meta.fx3_grid[k].val("SIN")
  97. k = "TYPE:2"
  98. MAIN.meta.fx3_grid[k].val("COS")
  99. def size(val=255):
  100. for i in range(4):
  101. k = "SIZE:{}".format(i+1)
  102. print(" ",k,val)
  103. MAIN.meta.fx3_grid[k].val(val)
  104. __refresh_fx3(_filter="SIZE")
  105. def speed(val=255):
  106. for i in range(4):
  107. k = "SPEED:{}".format(i+1)
  108. print(" ",k,val)
  109. MAIN.meta.fx3_grid[k].val(val)
  110. __refresh_fx3(_filter="SPEED")
  111. def rgb():
  112. #basic()
  113. k = "GRP:1"
  114. MAIN.meta.fx3_grid[k].val("RGB")
  115. k = "GRP:2"
  116. MAIN.meta.fx3_grid[k].val("RGB")
  117. k = "GRP:3"
  118. MAIN.meta.fx3_grid[k].val("RGB")
  119. k = "ATTR:1"
  120. MAIN.meta.fx3_grid[k].val("RED")
  121. k = "ATTR:2"
  122. MAIN.meta.fx3_grid[k].val("GREEN")
  123. k = "ATTR:3"
  124. MAIN.meta.fx3_grid[k].val("BLUE")
  125. k = "TYPE:1"
  126. MAIN.meta.fx3_grid[k].val("FD")
  127. k = "TYPE:2"
  128. MAIN.meta.fx3_grid[k].val("STATIC")
  129. k = "TYPE:3"
  130. MAIN.meta.fx3_grid[k].val("STATIC")
  131. __refresh_fx3()
  132. def clear():
  133. basic()
  134. k = "GRP:1"
  135. MAIN.meta.fx3_grid[k].val(" ")
  136. k = "GRP:2"
  137. MAIN.meta.fx3_grid[k].val(" ")
  138. k = "GRP:3"
  139. MAIN.meta.fx3_grid[k].val(" ")
  140. k = "ATTR:1"
  141. MAIN.meta.fx3_grid[k].val(" ")
  142. k = "ATTR:2"
  143. MAIN.meta.fx3_grid[k].val(" ")
  144. k = "ATTR:3"
  145. MAIN.meta.fx3_grid[k].val(" ")
  146. k = "TYPE:1"
  147. MAIN.meta.fx3_grid[k].val(" ")
  148. k = "TYPE:2"
  149. MAIN.meta.fx3_grid[k].val(" ")
  150. k = "TYPE:3"
  151. MAIN.meta.fx3_grid[k].val(" ")
  152. circle()
  153. def _refresh_fx3x(): #frame,c,r,gui,mode="FX"):
  154. time.sleep(5)
  155. while 1:
  156. print("Ö " *22)
  157. circle()
  158. time.sleep(3)
  159. rgb()
  160. time.sleep(3)
  161. clear()
  162. time.sleep(3)
  163. print("Ö " *22)
  164. break
  165. def __refresh_fx3(_filter=""):
  166. ct = MAIN.meta.fx3 #moves
  167. prm = MAIN.meta.fx3_prm
  168. for comm in ct.labels:
  169. if comm not in ct.elem:
  170. continue
  171. b = ct.elem[comm]
  172. if comm in MAIN.meta.fx3_grid:
  173. if _filter and _filter != comm:
  174. continue
  175. v2 = MAIN.meta.fx3_grid[comm].val()
  176. v1 = b["text"]
  177. if "ATTR" in comm or "GRP" in comm:
  178. print([comm,v1,v2,b])
  179. if str(v2) != str(v1):
  180. print(" change")
  181. #print([comm,b,v1,v2])
  182. b["text"] = str(v2)
  183. def _refresh_fx3(): #frame,c,r,gui,mode="FX"):
  184. while 1:
  185. __refresh_fx3()
  186. time.sleep(2)
  187. def _draw_fx3(frame,c,r,gui,mode="FX"):
  188. ct = MAIN.meta.fx3 #moves
  189. prm = MAIN.meta.fx3_prm
  190. for comm in ct.labels:
  191. print(" draw3",comm)
  192. if comm == "\n\n":
  193. b = tk.Label(frame,bg="black", text="-",font=space_font)
  194. b.grid(row=r, column=c,pady=0,padx=0, sticky=tk.W+tk.E)
  195. c=0
  196. r+=1
  197. continue
  198. if comm == "\n":
  199. c=0
  200. r+=1
  201. continue
  202. v=0
  203. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=1)
  204. ct.elem[comm] = b
  205. ct.val[comm] = 0
  206. def _XXX(xcb,xcomm,xb):
  207. def XXX(event=None,**data):
  208. print("BTN:",xb["text"],xcomm)
  209. print("xXx "*22)
  210. print("XXX",event,data)
  211. if xcomm == "CIRCLE":
  212. circle()
  213. elif xcomm == "RED":
  214. rgb()
  215. elif xcomm == "MINI":
  216. size(10)
  217. elif xcomm == "SMALL":
  218. size(25)
  219. elif xcomm == "NORMAL":
  220. size(50)
  221. elif xcomm == "BIG":
  222. size(100)
  223. elif xcomm == "SLOW":
  224. speed(5)
  225. elif xcomm == "MID":
  226. speed(25)
  227. elif xcomm == "FAST":
  228. speed(100)
  229. elif xcomm == "TURBO":
  230. speed(200)
  231. xcb(event) #,data)
  232. return XXX
  233. _cb = tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb
  234. _comm = comm
  235. _b = b
  236. XXX = _XXX(_cb,_comm,_b)
  237. b.bind("<Button>",XXX)
  238. #b.bind("<Button>",tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  239. if comm == "xREC-FX":
  240. b["bg"] = "grey"
  241. elif comm == "xFX OFF":
  242. b["bg"] = "magenta"
  243. elif comm[:3] == "xFX:" or comm[:3] == "x2D:":
  244. b["text"] = comm
  245. b["bg"] = "#ffbf00"
  246. if comm == "START":
  247. b["bg"] = "orange"
  248. b.config(activebackground="#dd0")
  249. if comm in MAIN.meta.fx3_grid:
  250. fx_func = MAIN.meta.fx3_grid[comm]
  251. fx_func.data["wrap"] = 1
  252. #fx_func.inc()
  253. v=fx_func.val()
  254. print("3>",[comm,fx_func,v])
  255. b["text"] = v
  256. if comm.startswith("TYPE:"):
  257. b["bg"] = "orange"
  258. b.config(activebackground="#dd0")
  259. for a in ["SPEED:","SIZE:","START:","OFFSET:"]:
  260. if comm.startswith(a):
  261. b["bg"] = "lightgreen"
  262. b.config(activebackground="#0d0")
  263. if comm:
  264. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  265. c+=1
  266. if c >=6:
  267. c=0
  268. r+=1
  269. c=0
  270. r+=1
  271. return c,r
  272. def _draw_fx(frame,c,r,gui,mode="FX"):
  273. ct = None
  274. prm = None
  275. if mode=="FX-MAIN":
  276. ct = MAIN.meta.fx_main
  277. prm = MAIN.meta.fx_prm_main
  278. print("-- draw")
  279. for comm in ct.labels:
  280. print(" draw",comm)
  281. if comm == "\n\n":
  282. b = tk.Label(frame,bg="black", text="-",font=space_font)
  283. b.grid(row=r, column=c,pady=0,padx=0, sticky=tk.W+tk.E)
  284. c=0
  285. r+=1
  286. continue
  287. if comm == "\n":
  288. c=0
  289. r+=1
  290. continue
  291. v=0
  292. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  293. ct.elem[comm] = b
  294. ct.val[comm] = 0
  295. b.bind("<Button>",tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  296. if comm == "REC-FX":
  297. b["bg"] = "grey"
  298. elif comm == "FX OFF":
  299. b["bg"] = "magenta"
  300. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  301. c+=1
  302. if c >=6:
  303. c=0
  304. r+=1
  305. c=0
  306. r+=1
  307. return c,r
  308. def draw_fx3(gui,xframe):
  309. frame_fx=xframe
  310. i=0
  311. c=0
  312. r=0
  313. frame = tk.Frame(frame_fx,bg="black")
  314. frame.pack(fill=tk.X, side=tk.TOP)
  315. # ------------------------------
  316. b = tk.Button(frame,bg="lightblue", text="FX3",width=6)
  317. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  318. c+=1
  319. _add_space(frame,r,c)
  320. c,r = _draw_fx(frame,c,r,gui,mode="FX-MAIN")
  321. r,c=_add_space(frame,r,c)
  322. c,r = _draw_fx3(frame,c,r,gui,mode="FX-3")
  323. _global_short_key = 1
  324. root = None
  325. cmd_client = chat.Client(port=30003)
  326. try:
  327. import memcache
  328. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  329. #data = mc.get("MODES")
  330. except:
  331. mc = None
  332. class MANAGER_X(): # DUMMY
  333. def __init__(self,*arg,**args):
  334. print(self,"__init__",arg,args)
  335. def send(self,nr,*arg,**args): #val=None,xfade=None,event=None,button="",ptfade=None):
  336. if _global_key_lock:
  337. return
  338. print(self,"MASTER",nr,arg,args)
  339. btn_nr = nr
  340. v = args["val"]
  341. msg=json.dumps([{"event":"EXEC","EXEC":btn_nr+1,"VAL":v,"NR-KEY":btn_nr}]).encode("utf-8")
  342. msg=json.dumps([{"event":"XXX","YYY":1,"VAL":12}]).encode("utf-8")
  343. cprint("SEND MASTER._GO:",msg,color="green")
  344. cmd_client.send(msg)
  345. import lib.manager as manager
  346. master = manager.MANAGER() #{}
  347. class Modes(): # DUMMY
  348. def __init__(self,*arg,**args):
  349. print("Modes.__init__",arg,args)
  350. self.modes = {}
  351. def val(self,*arg,**args):
  352. #print("Modes.val",arg,args)
  353. pass
  354. class Gui(): # DUMMY
  355. def __init__(self):
  356. self.elem_exec = []
  357. self.elem_meta = [None]*512
  358. self.old_btn_nr = -1
  359. self.METAS = []
  360. for i in range(512):
  361. self.METAS.append({})
  362. def _load_meta(self,nr):
  363. data = {}
  364. try:
  365. data = mc.get("EXEC-META-"+str(nr))
  366. data = json.loads(data)
  367. except Exception as e:
  368. print(" ER1R mc...",e)
  369. return data
  370. def _refresh_data(self,*arg,**args):
  371. start = time.time()
  372. METAS = []
  373. for i in range(512):
  374. nr = i #+1
  375. METAS.append( self._load_meta(nr) )
  376. self.METAS = METAS
  377. for nr,b in enumerate( self.elem_exec): #[nr]
  378. self._refresh_data_single(nr,b,METAS)
  379. print(__file__.split("/")[-1], "_refresh_data:",int((time.time()-start)*10)/10 )
  380. def _refresh_data_single(self,nr,b,METAS=None):
  381. start = time.time()
  382. no_meta = 0
  383. if not METAS:
  384. no_meta = 1
  385. try:
  386. data = mc.get("EXEC-META-"+str(nr)) #,json.dumps(index))
  387. data = json.loads(data)
  388. self.METAS[nr] = data #.append(data)
  389. #print(time.time())
  390. print(" _REFRESH_EXEC_SINGLE",nr,b,data["LABEL"])
  391. except Exception as e:
  392. print(" ER1R mc...",e)
  393. METAS = self.METAS
  394. #manager = MANAGER()
  395. #master = MANAGER()
  396. modes = Modes()
  397. gui = Gui()
  398. root = tk.Tk()
  399. root.maxsize(600,800)
  400. win_title="FX3"
  401. store = movewin.load_all_sdl(win_title)
  402. print(store)
  403. W=380
  404. H=550
  405. POS=[800,200]
  406. if store:
  407. W = store[-4]
  408. H = store[-3]
  409. POS=[store[-2],store[-1]]
  410. root.geometry('%dx%d+%d+%d' % (W, H, POS[0],POS[1]))
  411. root.tk_setPalette(background='#bbb', foreground='black', activeBackground='#aaa', activeForeground="black")
  412. defaultFont = tk.font.nametofont("TkDefaultFont")
  413. defaultFont.configure(family="FreeSans", size=10, weight="bold")
  414. # MAIN MENUE
  415. try:
  416. ico_path = "/opt/LibreLight/Xdesk/icon/"
  417. root.iconphoto(False, tk.PhotoImage(file=ico_path+"scribble.png"))
  418. except Exception as e:
  419. print(" Exception GUIWindowContainer.__init__",e)
  420. xframe = libtk.ScrollFrame(root,width=820,height=400,bd=1,bg="black",head=None,foot=None)
  421. draw_fx3(gui,xframe)
  422. root.title(title)
  423. root.bind("<Button>",libtk2.tk_event)#
  424. root.bind("<Key>",libtk2.tk_event)#,self.callback)
  425. root.bind("<KeyRelease>",libtk2.tk_event)#,self.callback)
  426. #root.bind("<FocusIn>",libtk2.tk_event)#, on_focus(self.args["title"],"In").cb)
  427. #root.bind("<FocusOut>",libtk2.tk_event)#, on_focus(self.args["title"],"Out").cb)
  428. _global_key_lock = 0
  429. def focus_in(event=None):
  430. _global_short_key = 0 # protect key-press-repeat
  431. cmd = "xset -display :0.0 r off"
  432. print("FOCUS_IN1", cmd)
  433. os.system(cmd)
  434. time.sleep(0.3)
  435. print("FOCUS_IN2", cmd)
  436. os.system(cmd)
  437. _global_short_key = 1 # protect key-press-repeat
  438. time.sleep(0.3)
  439. _global_key_lock = 0
  440. def focus_out(event=None):
  441. _global_key_lock = 1
  442. _global_short_key = 0
  443. cmd="xset -display :0.0 r rate 240 20"
  444. print("FOCUS_OUT", cmd)
  445. #os.system(cmd) # DISABLED
  446. root.bind("<FocusIn>", focus_in)
  447. root.bind("<FocusOut>", focus_out)
  448. def _refr_loop():
  449. time.sleep(3)
  450. while 1:
  451. try:
  452. gui._refresh_data()
  453. time.sleep(3)
  454. except Exception as e:
  455. print(" ER5R refr_loop()...",e)
  456. time.sleep(3)
  457. time.sleep(0.1)
  458. def _refr_loop2():
  459. time.sleep(3)
  460. while 1:
  461. try:
  462. global root,title
  463. data = mc.get("MODES")
  464. title2 = title +" "+str(data)
  465. data = json.loads(data)
  466. #print("MODES",data)
  467. modes.modes = data
  468. if root:
  469. root.title(title2)
  470. if "S-KEY" in data:
  471. _global_short_key = 0
  472. if data["S-KEY"]:
  473. _global_short_key = 1
  474. for k in data:
  475. #print("title",k)
  476. for kk in ["RESTART","PRO","EASY","EXIT"]:
  477. if kk in str(k):
  478. print("RESTART !!! EXIT !!")
  479. time.sleep(0.1)
  480. root.quit()
  481. #sys.exit()
  482. fx3_line = {}
  483. for comm,v in MAIN.meta.fx3_grid.items():
  484. #print(":",comm,v.val())
  485. if comm.startswith("ATTR:"):
  486. fx3_line[comm] = 1
  487. except Exception as e:
  488. print(" ER7R mc...",e)
  489. time.sleep(3)
  490. time.sleep(0.1)
  491. thread.start_new_thread(_refr_loop,())
  492. thread.start_new_thread(_refr_loop2,())
  493. thread.start_new_thread(_refresh_fx3,())
  494. #thread.start_new_thread(_refresh_fx3x,())
  495. root.mainloop()