Преглед изворни кода

add: exec_master and EXEC-WING

micha пре 2 година
родитељ
комит
6f09f972d9
2 измењених фајлова са 193 додато и 18 уклоњено
  1. 135 9
      _LibreLightDesk.py
  2. 58 9
      _console.py

+ 135 - 9
_LibreLightDesk.py

@@ -2100,7 +2100,7 @@ class GUI():
                     if DMX and vcmd[i]:
                         vcmd[i]["DMX"] = DMX
             if type(nr) is not None:
-                vcmd[i]["EXEC"] = str(nr)
+                vcmd[i]["EXEC"] = str(nr+1)
             #cprint(vcmd[i],color="red")
             cmd.append(vcmd[i])
 
@@ -4052,7 +4052,7 @@ class ELEM_FADER():
         self.elem.append(self.b)
 
 
-class GUI_MasterWingLayout():
+class GUI_ExecWingLayout():
     def __init__(self,root,data,title="tilte",width=800):
         #xfont = tk.font.Font(family="FreeSans", size=5, weight="bold")
         font8 = ("FreeSans",8)
@@ -4118,11 +4118,14 @@ class GUI_MasterWingLayout():
     def event_cb(self,a1="",a2="",nr=None,**args):
         print("event_cb:",nr,a1,a2,args)
         nr += 1
-        jdata= {"CMD":"SPEED-MASTER","NR":nr,"VALUE":int(a1)}
-        if nr <= 12:
-            jdata["CMD"] = "SIZE-MASTER"
+        jdata= {"CMD":"X-MASTER","NR":nr,"VALUE":int(a1)}
+
+        if nr >= 1 and nr <= 12:
+            jdata["CMD"] = "EXEC-SIZE-MASTER"
             jdata["NR"] = nr
-        else:
+
+        if nr >= 13 and nr <= 24:
+            jdata["CMD"] = "EXEC-SPEED-MASTER"
             jdata["NR"] = nr-12
 
         print("event_cb",jdata)
@@ -4158,6 +4161,114 @@ class GUI_MasterWingLayout():
             print("---",j,txt,e)
             e["text"] = txt
             
+class GUI_MasterWingLayout():
+    def __init__(self,root,data,title="tilte",width=800):
+        #xfont = tk.font.Font(family="FreeSans", size=5, weight="bold")
+        font8 = ("FreeSans",8)
+        self.dmx=1
+        self.univ=0
+        r=0
+        c=0
+        i=1
+        self.elem=[]
+        self.header=[]
+        self.data = data
+        #self.frame = tk.Frame(root,bg="black",width=width)
+        #self.frame.pack(fill=tk.BOTH, side=tk.TOP)
+
+        #self.b = tk.Label(self.frame,bg="#fff",text="Master Wing") #,font=font8 )
+        #self.b.pack(fill=None, side=tk.LEFT)
+        #self.frame = tk.Frame(root,bg="black",width=width)
+        #self.frame.pack(fill=tk.BOTH, side=tk.TOP)
+
+        #self.b = tk.Label(self.frame,bg="black",text="") # spacer
+        #self.b.pack(fill=tk.Y, side=tk.LEFT)
+
+        self.frame = tk.Frame(root,bg="magenta",width=width,border=2) # fader frame
+        self.frame.pack(fill=tk.BOTH, side=tk.TOP)
+        r=0
+        c=0
+        pb=1
+        self.pb=pb
+        for j,row in enumerate(data):
+            if c % pb == 0 or c==0:
+                h=hex(j*10)[2:].rjust(2,"0")
+                frameS = tk.Frame(self.frame,bg="#000",width=width,border=2)
+                frameS.pack(fill=tk.BOTH, side=tk.TOP)
+                p=j//pb+1
+                if j < 1:
+                    txt="x-MASTER:{} {}-{}".format(p,p*pb-pb+1,p*pb) 
+                else:
+                    txt="x-MASTER:{} {}-{}".format(p,p*pb-pb+1,p*pb) 
+                self.b = tk.Label(frameS,bg="lightblue",text=txt,width=25,font=font8 )
+                self.header.append(self.b)
+
+                self.b.pack(fill=None, side=tk.LEFT)
+                self.b = tk.Label(frameS,bg="black",text="" ,width=11,font=font8 )
+                self.b.pack(fill=tk.BOTH, side=tk.LEFT)
+                try:
+                    frameS = tk.Frame(self.frame,bg="#a000{}".format(h),width=width,border=2)
+                except:
+                    frameS = tk.Frame(self.frame,bg="#a0aadd",width=width,border=2)
+                c=0
+            #print(frameS)
+            e= ELEM_FADER(frameS,nr=j+1,cb=self.event_cb)
+            if j >= 2:
+                e.pack(from_=400,to=0,init=100)
+            else:
+                e.pack(from_=200,to=0,init=100)
+            self.elem.append(e)
+            frameS.pack(fill=tk.X, side=tk.TOP)
+            c+=1
+            i+=1
+        self.frame.pack()
+        self._event_redraw()
+
+    def event_cb(self,a1="",a2="",nr=None,**args):
+        print("event_cb:",nr,a1,a2,args)
+        nr += 1
+        jdata= {"CMD":"X-MASTER","NR":nr,"VALUE":int(a1)}
+        if nr == 1:
+            jdata["CMD"] = "SIZE-MASTER"
+            jdata["NR"] = 1 #nr
+        if nr == 2:
+            jdata["CMD"] = "SPEED-MASTER"
+            jdata["NR"] = 1 #nr 
+
+
+        print("event_cb",jdata)
+        j = [jdata]
+        jclient_send(j)
+
+    def set_name(self,_event=None):
+        txt = self.name["text"]
+        txt = tkinter.simpledialog.askstring("FIXTURE NAME:","NAME:",initialvalue=txt)
+        self.name["text"] = "{}".format(txt)
+        print("change_dmx",[_event,self])
+
+    def event_value(self,_event=None):
+        nr=self.dmx
+        txt= self.entry_dmx["text"]
+        
+    def _event_redraw(self,_event=None):
+        nr = 0
+        print("change_dmx",[_event,self])
+        for i,btn in enumerate(self.elem):
+            btn.set_label("{} D:{}".format(i+1,nr))
+            btn.nr = nr+i
+
+        pb=self.pb
+        for j,e in enumerate(self.header):
+            p=j+1
+            #p=nr/pb
+            if p == 1:
+                txt="SIZE-MASTER-GLOBAL:{} {}-{}".format(p,p*pb-pb+1,p*pb) 
+            else:
+                txt="SPEED-MASTER-GLOBAL:{} {}-{}".format(p,p*pb-pb+1,p*pb) 
+            #txt="BANK:{} {}-{}".format(p,p*pb-pb+nr,p*pb+nr) 
+            print("---",j,txt,e)
+            e["text"] = txt
+            
 class GUI_FaderLayout():
     def __init__(self,root,data,title="tilte",width=800):
         #xfont = tk.font.Font(family="FreeSans", size=5, weight="bold")
@@ -4784,14 +4895,29 @@ if __run_main:
 
     name="MASTER-WING"
     #w = GUIWindow(name,master=0,width=730,height=205,left=L1-80,top=TOP+H1-200)
-    w = GUIWindow(name,master=0,width=90,height=405,left=L0,top=TOP+H1-220)
-    w1 = ScrollFrame(w.tk,width=W1,height=H1)
+    w = GUIWindow(name,master=0,width=75,height=405,left=L0,top=TOP+H1-220)
+    #w1 = ScrollFrame(w.tk,width=W1,height=H1)
+    w1 = tk.Frame(w.tk,width=W1,height=H1)
+    w1.pack()
     data=[]
-    for i in range(12*2):
+    for i in range(2):
         data.append({"MASTER"+str(i):"MASTER"})
     GUI_MasterWingLayout(w1,data)
     window_manager.new(w,name)
 
+    name="EXEC-WING"
+    #w = GUIWindow(name,master=0,width=730,height=205,left=L1-80,top=TOP+H1-200)
+    w = GUIWindow(name,master=0,width=700,height=415,left=L1,top=TOP+H1+HTB*2)
+    #w1 = ScrollFrame(w.tk,width=W1,height=H1)
+    w1 = tk.Frame(w.tk,width=W1,height=H1)
+    w1.pack()
+    data=[]
+    for i in range(12*2):
+        data.append({"EXEC"+str(i):"EXEC"})
+    GUI_ExecWingLayout(w1,data)
+    window_manager.new(w,name)
+
+
     name="ENCODER"
     w = GUIWindow(name,master=0,width=560,height=113,left=L0+770,top=TOP+H1+HTB*2)
     _ENCODER_WINDOW = w

+ 58 - 9
_console.py

@@ -167,7 +167,7 @@ class Fade():
     def __str__(self):
         return self.__repr__()
     def __repr__(self):
-        return "<Fade Next:{:0.2f} Start:{:0.2f} Target:{:0.2f} T{:0.2f} Clock:{:0.2f} run:{} delay:{:0.2f}>".format( 
+        return "<FADE Next:{:0.2f} from:{:0.2f} to:{:0.2f} ft:{:0.2f} Clock:{:0.2f} run:{} delay:{:0.2f}>".format( 
                     self.__last, self.__start,self.__target,self.__ftime,self.__clock_curr,self.run,self.__delay )
     def next(self,clock=None):
         if self.__ftime <= 0 and self.__delay <= 0:
@@ -215,7 +215,7 @@ class _MASTER():
         _value = self.__data[name] 
         if value is not None:
             if _value != value:
-                print(self.name,"CHANGE MASTER",name,_value)
+                print(self.name,"CHANGE MASTER:",name,"from:",_value,"to:",value)
             self.__data[name] = value
 
         _value = self.__data[name] 
@@ -223,6 +223,9 @@ class _MASTER():
         return _value /100.
         
 
+exec_size_master  = _MASTER("EXEC-SIZE")
+exec_speed_master = _MASTER("EXEC-SPEED")
+
 size_master  = _MASTER("SIZE")
 speed_master = _MASTER("SPEED")
 
@@ -341,8 +344,16 @@ class FX():
         if self.__xtype == "rnd":
             self.__offset = self.__master.get(self,-2)
             self.__offset = self.__master.next(self)#,count)
+        
+        self._exec_id = None
+
         self.next()
         #print("init FX",self)
+    def exec_id(self,_id=None):
+        if type(_id) is not type(None):
+            self._exec_id = str(_id)
+        return self._exec_id
+
     def _get_info(self):
         print(self.__offset)
         return {"offset":self.__offset,"xtype":self.__xtype}
@@ -350,13 +361,30 @@ class FX():
     def __str__(self):
         return self.__repr__()
     def __repr__(self):
-        return "<FX Next:{:0.2f} xtype:{} Size:{:0.2f} Speed:{:0.2f} ang:{:0.2f} base:{} Clock:{:0.2f} run:{}>".format( 
-                    self.next(),self.__xtype, self.__size,self.__speed,self.__angel, self.__base,self.__clock_curr,self.run )
+        return "<FX Next:{:0.2f} xtype:{} Size:{:0.2f} Speed:{:0.2f} ang:{:0.2f} base:{} Clock:{:0.2f} run:{} EXEC:{}>".format( 
+                    self.next(),self.__xtype, self.__size,self.__speed,self.__angel, self.__base,self.__clock_curr,self.run,self._exec_id )
     def next(self,clock=None):
         if type(clock) is float or type(clock) is int:#not None:
             self.__clock_curr = clock
         
-        self.__clock_delta += (self.__clock_curr - self.__clock_old) * ( speed_master.val(self.__master_id)-1)
+        d  = (self.__clock_curr - self.__clock_old) 
+
+        #print()
+        #print("A",d)
+        
+        m1 = ( speed_master.val(self.__master_id)) # global speed-master
+        #print("B {:0.4}".format(m1))
+
+        m2 = ( exec_speed_master.val(self._exec_id)) # exec start by 0
+        #print("C {:0.4}".format(m2))
+
+        shift  = 0
+        m = (m1 * m2)  -1
+        shift += d * m
+        #print("D",shift)
+
+        self.__clock_delta += shift
+
         #print(self.__clock_delta )
         self.__clock_old = self.__clock_curr
 
@@ -499,8 +527,11 @@ class FX():
         out = v *size +base 
         self.out = out
         self.count = count
-        return out * size_master.val(self.__master_id)  #* (self.__fade_in_master /255.)
-        #= master_id
+
+        out = out * size_master.val(self.__master_id)  # master 
+        out = out * exec_size_master.val(self._exec_id)  # master 
+        #* (self.__fade_in_master /255.)
+        return out 
 
 class DMXCH(object):
     def __init__(self,dmx=-1):
@@ -515,6 +546,7 @@ class DMXCH(object):
         self._flash_fx = None
         self._flash_fx_value = 0
         self._last_val = None
+        self._exec_id = None
         #self.next(clock)
         #print("init",self)
     
@@ -543,6 +575,8 @@ class DMXCH(object):
                 self._fx_value = 0 
         else:
             self._fx[1] = FX(xtype=xtype,size=size,speed=speed,invert=invert,width=width,start=start,offset=offset,base=base,clock=clock,master=master,master_id=1) 
+            self._fx[1].exec_id(self._exec_id)
+
         self.next(clock)
         print("init",self)
 
@@ -565,6 +599,7 @@ class DMXCH(object):
             self._flash_fx_value = 0 
         else:
             self._flash_fx = FX(xtype=xtype,size=size,speed=speed,invert=invert,width=width,start=start,offset=offset,base=base,clock=clock,master=master,master_id=0)
+            self._flash_fx.exec_id(self._exec_id)
         self.next(clock)
         print("init",self)
 
@@ -573,9 +608,13 @@ class DMXCH(object):
     
     def __str__(self):
         return self.__repr__()
-    
+    def exec_id(self,_id=None):
+        if type(id) is not type(None):
+            self._exec_id = _id
+        return self._exec_id
+
     def __repr__(self):
-        return "<DMXCH {} {:0.2f} > [{}] {}".format(self._dmx, self._last_val,self._fx,self._fade)
+        return "<BUFFER {} v:{:0.2f} EXEC:{}> fx:[{}] fd:{}".format(self._dmx, self._last_val,self._exec_id,self._fx,self._fade)
     
     def fade_ctl(self,cmd=""): #start,stop,backw,fwd,bounce
         pass
@@ -826,6 +865,11 @@ def JCB(data): #json client input
                 #cprint("json", x,type(x),color="yellow")#,cmds[x])
                 if "CMD" in x:
                     print("CMD:",x)
+                    if "EXEC-SPEED-MASTER" == x["CMD"]:
+                        exec_speed_master.val(x["NR"],x["VALUE"])
+                    if "EXEC-SIZE-MASTER" == x["CMD"]:
+                        exec_size_master.val(x["NR"],x["VALUE"])
+
                     if "SPEED-MASTER" == x["CMD"]:
                         speed_master.val(x["NR"],x["VALUE"])
                         if x["NR"] == 2:
@@ -844,6 +888,10 @@ def JCB(data): #json client input
                     if DMX > 0:
                         DMX -=1
                     else:continue
+                    
+                    exec_id = None
+                    if "EXEC" in x:
+                        exec_id = x["EXEC"]
 
                     if "VALUE" in x:# and x["VALUE"] is not None:
                         v = x["VALUE"]
@@ -864,6 +912,7 @@ def JCB(data): #json client input
                     if len(Bdmx) < DMX:
                         continue
                     
+                    Bdmx[DMX].exec_id(exec_id)
                     if v is not None:
                         if "FLASH" in x:
                             #print("FLASH")