FX3.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  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. #MAIN.meta.fx3_grid["ATTR:1"].val("PAN")
  35. #MAIN.meta.fx3_grid["TYPE:1"].val("COS")
  36. def basic():
  37. for i in range(4):
  38. k = "GRP:1" #.format(i+1)
  39. MAIN.meta.fx3_grid[k].val("POS")
  40. k = "ATTR:1" #.format(i+1)
  41. MAIN.meta.fx3_grid[k].val("PAN")
  42. k = "ATTR:2" #.format(i+1)
  43. MAIN.meta.fx3_grid[k].val("TILT")
  44. k = "SIZE:{}".format(i+1)
  45. MAIN.meta.fx3_grid[k].val(255)
  46. MAIN.meta.fx3_grid[k].data["init_value"] = 255
  47. MAIN.meta.fx3_grid[k].data["max"] = 512
  48. MAIN.meta.fx3_grid[k].data["cycle"] = [0,127,255]
  49. k = "SPEED:{}".format(i+1)
  50. MAIN.meta.fx3_grid[k].val(10)
  51. MAIN.meta.fx3_grid[k].data["init_value"] = 10
  52. MAIN.meta.fx3_grid[k].data["max"] = 255
  53. MAIN.meta.fx3_grid[k].data["cycle"] = [0,5,25,30,100,255]
  54. k = "OFFSET:{}".format(i+1)
  55. MAIN.meta.fx3_grid[k].val(100)
  56. MAIN.meta.fx3_grid[k].data["init_value"] = 100
  57. MAIN.meta.fx3_grid[k].data["inc"] = 25
  58. k = "WIDTH:{}".format(i+1)
  59. MAIN.meta.fx3_grid[k].val(25)
  60. MAIN.meta.fx3_grid[k].data["init_value"] = 25
  61. MAIN.meta.fx3_grid[k].data["max"] = 100
  62. MAIN.meta.fx3_grid[k].data["inc"] = 5
  63. k = "START:{}".format(i+1)
  64. MAIN.meta.fx3_grid[k].val(0)
  65. MAIN.meta.fx3_grid[k].data["init_value"] = 0
  66. MAIN.meta.fx3_grid[k].data["max"] = 255
  67. MAIN.meta.fx3_grid[k].data["inc"] = 5
  68. k = "SHUFFLE:{}".format(i+1)
  69. MAIN.meta.fx3_grid[k].val(0)
  70. MAIN.meta.fx3_grid[k].data["init_value"] = 0
  71. MAIN.meta.fx3_grid[k].data["max"] = 2
  72. k = "DIR:{}".format(i+1)
  73. MAIN.meta.fx3_grid[k].val(1)
  74. MAIN.meta.fx3_grid[k].data["init_value"] = 1
  75. MAIN.meta.fx3_grid[k].data["max"] = 0
  76. k = "INVERT:{}".format(i+1)
  77. MAIN.meta.fx3_grid[k].val(1)
  78. MAIN.meta.fx3_grid[k].data["init_value"] = 1
  79. MAIN.meta.fx3_grid[k].data["max"] = 1
  80. def circle():
  81. basic()
  82. k = "GRP:1" #.format(i+1)
  83. MAIN.meta.fx3_grid[k].val("POS")
  84. k = "ATTR:1" #.format(i+1)
  85. MAIN.meta.fx3_grid[k].val("PAN")
  86. k = "ATTR:2" #.format(i+1)
  87. MAIN.meta.fx3_grid[k].val("TILT")
  88. circle()
  89. def _refresh_fx3(): #frame,c,r,gui,mode="FX"):
  90. while 1:
  91. ct = MAIN.meta.fx3 #moves
  92. prm = MAIN.meta.fx3_prm
  93. #MAIN.meta.fx3_grid["ATTR:1"].val("PAN")
  94. #print("_-| "*22)
  95. #MAIN.meta.fx3_grid["ATTR:1"].val("PAN")
  96. #MAIN.meta.fx3_grid["TYPE:1"].val("COS")
  97. for comm in ct.labels:
  98. #comm = comm.strip()
  99. if comm not in ct.elem:
  100. continue
  101. b = ct.elem[comm]
  102. if comm in MAIN.meta.fx3_grid:
  103. v2 = MAIN.meta.fx3_grid[comm].val()
  104. v1 = b["text"]
  105. if "ATTR" in comm:
  106. print([comm,v1,v2])
  107. if str(v2) != str(v1):
  108. print([comm,b,v1,v2])
  109. b["text"] = str(v2)
  110. time.sleep(4)
  111. def _draw_fx3(frame,c,r,gui,mode="FX"):
  112. ct = MAIN.meta.fx3 #moves
  113. prm = MAIN.meta.fx3_prm
  114. for comm in ct.labels:
  115. if comm == "\n\n":
  116. b = tk.Label(frame,bg="black", text="-",font=space_font)
  117. b.grid(row=r, column=c,pady=0,padx=0, sticky=tk.W+tk.E)
  118. c=0
  119. r+=1
  120. continue
  121. if comm == "\n":
  122. c=0
  123. r+=1
  124. continue
  125. v=0
  126. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=1)
  127. ct.elem[comm] = b
  128. ct.val[comm] = 0
  129. def XXX(event=None,**data):
  130. print("XXX",event,data)
  131. #b.bind("<Button>",XXX) #tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  132. #print(":",[comm])
  133. b.bind("<Button>",tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  134. if comm == "xREC-FX":
  135. b["bg"] = "grey"
  136. elif comm == "xFX OFF":
  137. b["bg"] = "magenta"
  138. elif comm[:3] == "xFX:" or comm[:3] == "x2D:":
  139. b["text"] = comm
  140. b["bg"] = "#ffbf00"
  141. if comm == "START":
  142. b["bg"] = "orange"
  143. b.config(activebackground="#dd0")
  144. if comm in MAIN.meta.fx3_grid:
  145. fx_func = MAIN.meta.fx3_grid[comm]
  146. fx_func.data["wrap"] = 1
  147. #fx_func.inc()
  148. v=fx_func.val()
  149. print("3>",[comm,fx_func,v])
  150. b["text"] = v
  151. if comm.startswith("TYPE:"):
  152. b["bg"] = "orange"
  153. b.config(activebackground="#dd0")
  154. for a in ["SPEED:","SIZE:","START:","OFFSET:"]:
  155. if comm.startswith(a):
  156. b["bg"] = "lightgreen"
  157. b.config(activebackground="#0d0")
  158. if comm:
  159. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  160. c+=1
  161. if c >=6:
  162. c=0
  163. r+=1
  164. c=0
  165. r+=1
  166. return c,r
  167. def _draw_fx(frame,c,r,gui,mode="FX"):
  168. ct = None
  169. prm = None
  170. if mode=="FX-MAIN":
  171. ct = MAIN.meta.fx_main
  172. prm = MAIN.meta.fx_prm_main
  173. for comm in ct.labels:
  174. if comm == "\n\n":
  175. b = tk.Label(frame,bg="black", text="-",font=space_font)
  176. b.grid(row=r, column=c,pady=0,padx=0, sticky=tk.W+tk.E)
  177. c=0
  178. r+=1
  179. continue
  180. if comm == "\n":
  181. c=0
  182. r+=1
  183. continue
  184. v=0
  185. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  186. ct.elem[comm] = b
  187. ct.val[comm] = 0
  188. b.bind("<Button>",tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  189. if comm == "REC-FX":
  190. b["bg"] = "grey"
  191. elif comm == "FX OFF":
  192. b["bg"] = "magenta"
  193. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  194. c+=1
  195. if c >=6:
  196. c=0
  197. r+=1
  198. c=0
  199. r+=1
  200. return c,r
  201. def draw_fx3(gui,xframe):
  202. frame_fx=xframe
  203. i=0
  204. c=0
  205. r=0
  206. frame = tk.Frame(frame_fx,bg="black")
  207. frame.pack(fill=tk.X, side=tk.TOP)
  208. # ------------------------------
  209. b = tk.Button(frame,bg="lightblue", text="FX3",width=6)
  210. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  211. c+=1
  212. _add_space(frame,r,c)
  213. c,r = _draw_fx(frame,c,r,gui,mode="FX-MAIN")
  214. r,c=_add_space(frame,r,c)
  215. c,r = _draw_fx3(frame,c,r,gui,mode="FX-3")
  216. _global_short_key = 1
  217. root = None
  218. cmd_client = chat.Client(port=30003)
  219. try:
  220. import memcache
  221. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  222. #data = mc.get("MODES")
  223. except:
  224. mc = None
  225. class MANAGER_X(): # DUMMY
  226. def __init__(self,*arg,**args):
  227. print(self,"__init__",arg,args)
  228. def send(self,nr,*arg,**args): #val=None,xfade=None,event=None,button="",ptfade=None):
  229. if _global_key_lock:
  230. return
  231. print(self,"MASTER",nr,arg,args)
  232. btn_nr = nr
  233. v = args["val"]
  234. msg=json.dumps([{"event":"EXEC","EXEC":btn_nr+1,"VAL":v,"NR-KEY":btn_nr}]).encode("utf-8")
  235. msg=json.dumps([{"event":"XXX","YYY":1,"VAL":12}]).encode("utf-8")
  236. cprint("SEND MASTER._GO:",msg,color="green")
  237. cmd_client.send(msg)
  238. import lib.manager as manager
  239. master = manager.MANAGER() #{}
  240. class Modes(): # DUMMY
  241. def __init__(self,*arg,**args):
  242. print("Modes.__init__",arg,args)
  243. self.modes = {}
  244. def val(self,*arg,**args):
  245. #print("Modes.val",arg,args)
  246. pass
  247. class Gui(): # DUMMY
  248. def __init__(self):
  249. self.elem_exec = []
  250. self.elem_meta = [None]*512
  251. self.old_btn_nr = -1
  252. self.METAS = []
  253. for i in range(512):
  254. self.METAS.append({})
  255. def _load_meta(self,nr):
  256. data = {}
  257. try:
  258. data = mc.get("EXEC-META-"+str(nr))
  259. data = json.loads(data)
  260. except Exception as e:
  261. print(" ER1R mc...",e)
  262. return data
  263. def _refresh_data(self,*arg,**args):
  264. start = time.time()
  265. METAS = []
  266. for i in range(512):
  267. nr = i #+1
  268. METAS.append( self._load_meta(nr) )
  269. self.METAS = METAS
  270. for nr,b in enumerate( self.elem_exec): #[nr]
  271. self._refresh_data_single(nr,b,METAS)
  272. print(__file__.split("/")[-1], "_refresh_data:",int((time.time()-start)*10)/10 )
  273. def _refresh_data_single(self,nr,b,METAS=None):
  274. start = time.time()
  275. no_meta = 0
  276. if not METAS:
  277. no_meta = 1
  278. try:
  279. data = mc.get("EXEC-META-"+str(nr)) #,json.dumps(index))
  280. data = json.loads(data)
  281. self.METAS[nr] = data #.append(data)
  282. #print(time.time())
  283. print(" _REFRESH_EXEC_SINGLE",nr,b,data["LABEL"])
  284. except Exception as e:
  285. print(" ER1R mc...",e)
  286. METAS = self.METAS
  287. #manager = MANAGER()
  288. #master = MANAGER()
  289. modes = Modes()
  290. gui = Gui()
  291. root = tk.Tk()
  292. root.maxsize(600,800)
  293. win_title="FX3"
  294. store = movewin.load_all_sdl(win_title)
  295. print(store)
  296. W=380
  297. H=550
  298. POS=[800,200]
  299. if store:
  300. W = store[-4]
  301. H = store[-3]
  302. POS=[store[-2],store[-1]]
  303. root.geometry('%dx%d+%d+%d' % (W, H, POS[0],POS[1]))
  304. root.tk_setPalette(background='#bbb', foreground='black', activeBackground='#aaa', activeForeground="black")
  305. defaultFont = tk.font.nametofont("TkDefaultFont")
  306. defaultFont.configure(family="FreeSans", size=10, weight="bold")
  307. # MAIN MENUE
  308. try:
  309. ico_path = "/opt/LibreLight/Xdesk/icon/"
  310. root.iconphoto(False, tk.PhotoImage(file=ico_path+"scribble.png"))
  311. except Exception as e:
  312. print(" Exception GUIWindowContainer.__init__",e)
  313. xframe = libtk.ScrollFrame(root,width=820,height=400,bd=1,bg="black",head=None,foot=None)
  314. draw_fx3(gui,xframe)
  315. root.title(title)
  316. root.bind("<Button>",libtk2.tk_event)#
  317. root.bind("<Key>",libtk2.tk_event)#,self.callback)
  318. root.bind("<KeyRelease>",libtk2.tk_event)#,self.callback)
  319. #root.bind("<FocusIn>",libtk2.tk_event)#, on_focus(self.args["title"],"In").cb)
  320. #root.bind("<FocusOut>",libtk2.tk_event)#, on_focus(self.args["title"],"Out").cb)
  321. _global_key_lock = 0
  322. def focus_in(event=None):
  323. _global_short_key = 0 # protect key-press-repeat
  324. cmd = "xset -display :0.0 r off"
  325. print("FOCUS_IN1", cmd)
  326. os.system(cmd)
  327. time.sleep(0.3)
  328. print("FOCUS_IN2", cmd)
  329. os.system(cmd)
  330. _global_short_key = 1 # protect key-press-repeat
  331. time.sleep(0.3)
  332. _global_key_lock = 0
  333. def focus_out(event=None):
  334. _global_key_lock = 1
  335. _global_short_key = 0
  336. cmd="xset -display :0.0 r rate 240 20"
  337. print("FOCUS_OUT", cmd)
  338. #os.system(cmd) # DISABLED
  339. root.bind("<FocusIn>", focus_in)
  340. root.bind("<FocusOut>", focus_out)
  341. def _refr_loop():
  342. time.sleep(3)
  343. while 1:
  344. try:
  345. gui._refresh_data()
  346. time.sleep(3)
  347. except Exception as e:
  348. print(" ER5R refr_loop()...",e)
  349. time.sleep(3)
  350. time.sleep(0.1)
  351. def _refr_loop2():
  352. time.sleep(3)
  353. while 1:
  354. try:
  355. global root,title
  356. data = mc.get("MODES")
  357. title2 = title +" "+str(data)
  358. data = json.loads(data)
  359. #print("MODES",data)
  360. modes.modes = data
  361. if root:
  362. root.title(title2)
  363. if "S-KEY" in data:
  364. _global_short_key = 0
  365. if data["S-KEY"]:
  366. _global_short_key = 1
  367. for k in data:
  368. #print("title",k)
  369. for kk in ["RESTART","PRO","EASY","EXIT"]:
  370. if kk in str(k):
  371. print("RESTART !!! EXIT !!")
  372. time.sleep(0.1)
  373. root.quit()
  374. #sys.exit()
  375. fx3_line = {}
  376. for comm,v in MAIN.meta.fx3_grid.items():
  377. #print(":",comm,v.val())
  378. if comm.startswith("ATTR:"):
  379. fx3_line[comm] = 1
  380. except Exception as e:
  381. print(" ER7R mc...",e)
  382. time.sleep(3)
  383. time.sleep(0.1)
  384. thread.start_new_thread(_refr_loop,())
  385. thread.start_new_thread(_refr_loop2,())
  386. thread.start_new_thread(_refresh_fx3,())
  387. root.mainloop()