EXEC-XWING.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. import sys
  2. import time
  3. import json
  4. _file_path = "/opt/LibreLight/Xdesk/"
  5. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  6. import tkgui.GUI as tkgui
  7. import tool.git as git
  8. #CAPTION += git.get_all()
  9. CAPTION = "EXEC-XWING"
  10. title = CAPTION
  11. title += git.get_all()
  12. INIT_OK = 1
  13. IS_GUI = 0
  14. from lib.cprint import cprint
  15. import lib.libtk as libtk
  16. import lib.libtk2 as libtk2
  17. import lib.zchat as chat
  18. console = chat.Client() #port=50001)
  19. import lib.mytklib as mytklib
  20. import lib.tkevent as tkevent
  21. def set_exec_fader_cfg(nr,val,label="",color=""):
  22. #exec_wing = window_manager.get_obj(name="EXEC-WING")
  23. if not exec_wing:
  24. return
  25. try:
  26. if len(exec_wing.fader_elem) > nr:
  27. exec_wing.fader_elem[nr].attr["text"] = label
  28. cfg = get_exec_btn_cfg(nr+80)
  29. exec_wing.fader_elem[nr].attr["bg"] = cfg["bg"]
  30. exec_wing.fader_elem[nr].attr["fg"] = cfg["fg"]
  31. #exec_wing.fader_elem[nr].attr["fx"] = cfg["fx"]
  32. except Exception as e:
  33. cprint(" set_exec_fader_cfg err:",e,color="red")
  34. print(" ",nr,val,label)
  35. raise e
  36. def set_exec_fader(nr,val,label="",color="",info="info",change=0):
  37. #exec_wing = window_manager.get_obj(name="EXEC-WING")
  38. if not exec_wing:
  39. return
  40. try:
  41. exec_wing.set_fader(nr,val,color=color,info=info,change=change)
  42. except Exception as e:
  43. cprint(" - set_exec_fader err:",e,color="red")
  44. print(" ",nr,val,label)
  45. raise e
  46. def set_exec_fader_all():
  47. print()
  48. cprint( "set_exec_fader_all()",color="green")
  49. for nr in range(10):
  50. _label = EXEC.label_exec[nr+80] # = label
  51. print(" set_exec_fader_all._label =",_label)
  52. set_exec_fader(nr,0,label=_label)
  53. set_exec_fader_cfg(nr,0,label=_label)
  54. def refresh_exec_fader_cfg():
  55. cprint( "set_exec_fader_all()",color="green")
  56. for nr in range(10):
  57. _label = EXEC.label_exec[nr+80] # = label
  58. #print("_label",_label)
  59. set_exec_fader_cfg(nr,0,label=_label)
  60. def jclient_send(data):
  61. t_start = time.time()
  62. jtxt = data
  63. jdatas = []
  64. for jdata in data:
  65. if "CMD" in jdata:
  66. try:
  67. jdatas.append(jdata)
  68. except Exception as e:
  69. cprint("jclient_send, Exception DMX ",color="red")
  70. cprint("",jdata,color="red")
  71. cprint("-----",color="red")
  72. elif "DMX" in jdata:
  73. try:
  74. jdata["DMX"] = int(jdata["DMX"])
  75. dmx = jdata["DMX"]
  76. if "ATTR" not in jdata:
  77. # for fx off
  78. jdatas.append(jdata)
  79. else:
  80. fix = "00000"
  81. attr = "00000"
  82. if "FIX" in jdata:
  83. fix = jdata["FIX"]
  84. if "ATTR" in jdata:
  85. attr = jdata["ATTR"]
  86. dmx_fine = fixlib.get_dmx(FIXTURES.fixtures,fix,attr+"-FINE")
  87. if jdata["DMX"] != dmx_fine and dmx > 0 and dmx_fine > 0:
  88. jdata["DMX-FINE"] = dmx_fine
  89. if "DMX-FINE" in jdata:
  90. if jdata["DMX-FINE"] <= 0:
  91. del jdata["DMX-FINE"]
  92. if jdata["ATTR"].startswith("_"):
  93. pass # ignore attr._ACTIVE
  94. else:#
  95. jdata["time"] = t_start
  96. jdatas.append(jdata)
  97. #cprint("-- ",jdata,color="red")
  98. except Exception as e:
  99. cprint("jclient_send, Exception DMX ",color="red")
  100. cprint("",jdata,color="red")
  101. cprint(e,color="red")
  102. cprint("-----",color="red")
  103. jtxt = jdatas
  104. jtxt = json.dumps(jtxt)
  105. jtxt = jtxt.encode()
  106. console.send( jtxt ) #b"\00 ")
  107. cprint("{:0.04} sec.".format(time.time()-t_start),color="yellow")
  108. cprint("{:0.04} tick".format(time.time()),color="yellow")
  109. class GUI_ExecWingLayout():
  110. def __init__(self,root,frame,data,title="tilte",width=800,start=81):
  111. self.font8 = ("FreeSans",8)
  112. self.dmx=1
  113. self.univ=0
  114. self.start=start-1
  115. r=0
  116. c=0
  117. i=1
  118. self.elem=[]
  119. self.fader_elem = []
  120. self.header=[]
  121. self.data = data
  122. self.frame = tk.Frame(frame,bg="#000",width=width,border=2)
  123. self.frame.pack(fill=tk.BOTH, side=tk.TOP)
  124. r=0
  125. c=0
  126. pb=10
  127. self.pb=pb
  128. for j,row in enumerate(data):
  129. if c % pb == 0 or c==0:
  130. h=hex(j*10)[2:].rjust(2,"0")
  131. frameS = tk.Frame(self.frame,bg="#000",width=width,border=2)
  132. frameS.pack(fill=tk.BOTH, side=tk.TOP)
  133. p=j//pb+1
  134. if j < 10:
  135. txt="x-MASTER:{} {}-{}".format(p,p*pb-pb+1,p*pb)
  136. else:
  137. txt="x-MASTER:{} {}-{}".format(p,p*pb-pb+1,p*pb)
  138. self.b = tk.Label(frameS,bg="lightblue",text=txt,width=25,font=self.font8 )
  139. self.header.append(self.b)
  140. self.b.pack(fill=None, side=tk.LEFT)
  141. self.b = tk.Label(frameS,bg="black",text="" ,width=11,font=self.font8 )
  142. self.b.pack(fill=tk.BOTH, side=tk.LEFT)
  143. try:
  144. frameS = tk.Frame(self.frame,bg="#a000{}".format(h),width=width,border=2)
  145. except:
  146. frameS = tk.Frame(self.frame,bg="#a0aadd",width=width,border=2)
  147. c=0
  148. #print(frameS)
  149. #e= libtk.ELEM_FADER(frameS,nr=j+1,cb=self.event_cb)
  150. e= tkgui.EXEC_FADER(frameS,nr=j+1,fader_cb=self.event_cb)
  151. if j >= 10:
  152. e.pack(from_=400,to=0,init=100)
  153. else:
  154. e.pack(from_=200,to=0,init=100)
  155. self.elem.append(e)
  156. self.fader_elem.append(e)
  157. frameS.pack(fill=tk.X, side=tk.TOP)
  158. c+=1
  159. i+=1
  160. self.frame.pack()
  161. self._event_redraw()
  162. def set_fader(self,nr,val,color="",info="info",change=0):
  163. mute = 1
  164. if nr == 2:
  165. mute = 1
  166. if info != "dmx_in":
  167. mute=1
  168. if not mute:print("set_fader",nr,val,info)
  169. if nr < len(self.elem):
  170. try:
  171. ee = self.elem[nr].elem[0]
  172. ee.set(val)
  173. if color:
  174. ee["bg"] = color
  175. except Exception as e:
  176. if change:
  177. self.event_cb(a1=val,nr=nr)
  178. #cprint("set_fader",e,color="red")
  179. #raise e
  180. #self.frame.update_idle_task()
  181. if not mute:print("set_fader",nr,val,info)
  182. return # STOP
  183. def event_cb(self,a1="",a2="",nr=None,**args):
  184. #print(" ExecWing.event_cb:",nr,a1,a2,args)
  185. nr += 1
  186. jdata= {"CMD":"X-MASTER","NR":nr,"VALUE":int(a1)}
  187. if nr >= 1 and nr <= 10:
  188. jdata["CMD"] = "EXEC-SIZE-MASTER"
  189. jdata["NR"] = nr +self.start
  190. if nr >= 11 and nr <= 20:
  191. jdata["CMD"] = "EXEC-SPEED-MASTER"
  192. jdata["NR"] = nr-10 +self.start
  193. if nr >= 21 and nr <= 30:
  194. jdata["CMD"] = "EXEC-OFFSET-MASTER"
  195. jdata["NR"] = nr-20 +self.start
  196. #print(" ExecWing.event_cb",jdata)
  197. j = [jdata]
  198. jclient_send(j)
  199. def set_name(self,_event=None):
  200. txt = self.name["text"]
  201. def _cb(data):
  202. if not data:
  203. print("err443",self,"_cb",data)
  204. return None
  205. txt = data["Value"]
  206. print(self,"._cb()",txt)
  207. self.name["text"] = "{}".format(txt)
  208. print("change_dmx",[_event,self])
  209. dialog._cb = _cb
  210. dialog.askstring("FIXTURE NAME:","NAME:",initialvalue=txt)
  211. def event_value(self,_event=None):
  212. nr=self.dmx
  213. txt= self.entry_dmx["text"]
  214. def _event_redraw(self,_event=None):
  215. nr = 0
  216. print("change_dmx",[_event,self])
  217. for i,btn in enumerate(self.elem):
  218. btn.set_label("{} D:{}".format(i+1,nr))
  219. btn.nr = nr+i
  220. pb=self.pb
  221. for j,e in enumerate(self.header):
  222. p=j+1
  223. #p=nr/pb
  224. if p == 1:
  225. txt="SIZE-MASTER:{} {}-{}".format(p,1+self.start,10+self.start)#p*pb-pb+1,p*pb)
  226. elif p == 2:
  227. txt="SPEED-MASTER:{} {}-{}".format(p,1+self.start,10+self.start)#p*pb-pb+1,p*pb)
  228. elif p == 3:
  229. txt="OFFSET-MASTER:{} {}-{}".format(p,1+self.start,10+self.start)#p*pb-pb+1,p*pb)
  230. else:
  231. txt="X-MASTER:{} {}-{}".format(p,p*pb-pb+1,p*pb)
  232. #txt="BANK:{} {}-{}".format(p,p*pb-pb+nr,p*pb+nr)
  233. print("---",j,txt,e)
  234. e["text"] = txt
  235. class Command():
  236. def __init__(self):
  237. self.elem = {}
  238. _global_key_lock = 0
  239. class MANAGER(): # DUMMY
  240. def __init__(self,*arg,**args):
  241. print(self,"__init__",arg,args)
  242. #self.refresh_fix = Refresher()
  243. self.commands = Command()
  244. def refresh_fix(self,*arg,**args):# = Refresher()
  245. print(self,"refresh_fix",arg,args)
  246. def exec_go(self,nr,*arg,**args): #val=None,xfade=None,event=None,button="",ptfade=None):
  247. if _global_key_lock:
  248. return
  249. #def exec_go(nr,xfade=None,val=0):
  250. print(self,"MASTER",nr,arg,args)
  251. btn_nr = nr
  252. v = args["val"]
  253. msg=json.dumps([{"event":"EXEC","EXEC":btn_nr+1,"VAL":v,"NR-KEY":btn_nr}]).encode("utf-8")
  254. cprint("SEND MASTER.EXEC_GO:",msg,color="green")
  255. cmd_client.send(msg)
  256. class Modes(): # DUMMY
  257. def __init__(self,*arg,**args):
  258. print("Modes.__init__",arg,args)
  259. self.modes = {}
  260. def val(self,*arg,**args):
  261. #print("Modes.val",arg,args)
  262. pass
  263. #manager = MASTER() #{}
  264. master = MASTER() #{}
  265. modes = Modes()
  266. import tool.movewin as movewin
  267. #movewin.check_is_started(CAPTION,_file_path)
  268. movewin.check_is_started("EXEC-XWING","/opt/LibreLight/Xdesk/tkgui/EXEC-XWING.py")
  269. _global_short_key = 1
  270. root = None
  271. cmd_client = chat.Client(port=30003)
  272. try:
  273. import memcache
  274. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  275. except:
  276. mc = None
  277. import lib.libwin as libwin
  278. name="EXEC"
  279. geo_list = libwin.read_window_geo()
  280. geo = libwin.filter_window_geo(geo_list,name)
  281. args = {"title":name,"master":0,"width":600,"height":113,"left":30+5,"top":30+5+400*2+10}
  282. if geo:
  283. args.update(geo)
  284. import tkinter as tk
  285. root = tk.Tk()
  286. root.bind("<Button>",libtk2.tk_event)#
  287. root.bind("<Key>",libtk2.tk_event)#,self.callback)
  288. root.bind("<KeyRelease>",libtk2.tk_event)#,self.callback)
  289. win_title="EXEC-XWING"
  290. store = movewin.load_all_sdl(win_title)
  291. print(store)
  292. W=850
  293. H=460
  294. POS=[10,10]
  295. if store:
  296. W = store[-4]
  297. H = store[-3]
  298. POS=[store[-2],store[-1]]
  299. root.geometry('%dx%d+%d+%d' % (W, H, POS[0],POS[1]))
  300. root.tk_setPalette(background='#bbb', foreground='black', activeBackground='#aaa', activeForeground="black")
  301. defaultFont = tk.font.nametofont("TkDefaultFont")
  302. defaultFont.configure(family="FreeSans",
  303. size=10,
  304. weight="bold")
  305. # MAIN MENUE
  306. try:
  307. ico_path = "/opt/LibreLight/Xdesk/icon/"
  308. root.iconphoto(False, tk.PhotoImage(file=ico_path+"exec.png"))
  309. except Exception as e:
  310. print(" Exception GUIWindowContainer.__init__",e)
  311. xframe = libtk.ScrollFrame(root,width=820,height=400,bd=1,bg="black",head=None,foot=None)
  312. #draw_exec(gui,xframe,EXEC)
  313. root.title(title) #"TK-EXEC")
  314. #args = {"title":name,"master":0,"width":600,"height":415,"left":L1,"top":TOP+H1+HTB*2,"H1":H1,"W1":W1}
  315. geo = libwin.filter_window_geo(geo_list,name)
  316. if geo:
  317. args.update(geo)
  318. data=[]
  319. for i in range(10*3):
  320. data.append({"EXEC"+str(i):"EXEC"})
  321. exec_wing = GUI_ExecWingLayout(root,xframe,data)
  322. #def __init__(self,root,frame,data,title="tilte",width=800,start=81):
  323. root.mainloop()