ソースを参照

refactor: FX3 ... fix: console FX2:START

micha 1 日 前
コミット
240f13a144
5 ファイル変更148 行追加34 行削除
  1. 5 2
      _console.py
  2. 20 4
      lib/fxlib.py
  3. 1 1
      lib/meta.py
  4. 1 1
      tkgui/EXEC-BTN.py
  5. 121 26
      tkgui/FX3.py

+ 5 - 2
_console.py

@@ -406,7 +406,7 @@ class FX():
         offset2 *= exec_offset_master.val(self._exec_id) 
 
         t += offset2 / 100 
-        t += self.__start  / 1024 #255
+        t += self.__start  / 200 # 1024 #255
 
         tw = t%1
         count = t//1
@@ -469,7 +469,8 @@ class FX():
                 v = (t%1-0.5)
         elif self.__xtype == "on":
             #base = 0
-            if self.__angel > 90 and self.__angel <=270:
+            #if self.__angel > 90 and self.__angel <=270:
+            if self.__angel > 0 and self.__angel <=360:
                 v=1
             else:
                 v=0
@@ -1070,6 +1071,8 @@ def _parse_fx2(x,fx2,clock):
         invert = fx2["INVERT"]
     if "WIDTH" in fx2:
         width = fx2["WIDTH"]
+    if "START" in fx2:
+        start = fx2["START"]
     
     if "off" == x["VALUE"]: #fix fx flash off
         xtype= "off"

+ 20 - 4
lib/fxlib.py

@@ -3,7 +3,8 @@
 import random
 
 import sys
-sys.path.insert(0,"/opt/LibreLight/Xdesk/")
+if "/opt/LibreLight/Xdesk/" not in sys.path:
+    sys.path.insert(0,"/opt/LibreLight/Xdesk/")
 import lib.fixlib as fixlib
 import lib.meta as meta
 
@@ -42,11 +43,26 @@ def process_wings(xfixtures,fx_prm):
 
     if prm["SHUFFLE"]:
         _wing_buffer = []
+        max_nr = 0
         for wing in wing_buffer:
+            if max_nr < len(wing):
+                max_nr = len(wing)
+        random.seed(9300) # sync random
+        shuf = list(range(max_nr))
+        random.shuffle(shuf)
+        for i,wing in enumerate(wing_buffer):
             wing = wing[:]
-            random.seed(9300) # sync random
-            random.shuffle(wing)
-            _wing_buffer.append(wing)
+            wing2=[]
+            shuf2=shuf[:]
+            if i % 2 == 0: # invert even wing
+                wing = wing[::-1]
+            for a,s in enumerate(shuf2):
+                if s >= len(wing):
+                    continue
+                wing2.append(wing[s])
+            if i % 2 == 0: # re inver even wing
+                wing2 = wing2[::-1]
+            _wing_buffer.append(wing2)
         wing_buffer = _wing_buffer
     return wing_buffer
 

+ 1 - 1
lib/meta.py

@@ -400,7 +400,7 @@ def change_grp(name,val):
 
 fx3.labels.extend([" ","\n"])
 fx3.labels.extend(["\n"])
-fx3.labels.extend([" ","START","STOP","OFF"," "," "," ","\n"])
+fx3.labels.extend([" ","START","OFF"," ","STOP"," "," ","\n"])
 fx3.labels.extend(["DIM","CIRCLE","PAN","TILT","FLAY","STREET"," ","\n"])
 fx3.labels.extend([" ","RED","GREEN","BLUE","MAGENTA","CYAN","YELLOW","\n"])
 fx3.labels.extend(["SIZE:","MINI","SMALL","NORMAL","BIG"," "," ","\n"])

+ 1 - 1
tkgui/EXEC-BTN.py

@@ -293,7 +293,7 @@ class Gui(): # DUMMY
             self._refresh_exec_single(nr,b,METAS)
             #time.sleep(0.001)
 
-        print( "refres_exec:",time.time()-start )
+        print( "refres_exec:",round(time.time()-start,2) )
 
     def _refresh_exec_single(self,nr,b,METAS=None):
         start = time.time()

+ 121 - 26
tkgui/FX3.py

@@ -138,6 +138,10 @@ def get_fx3_grid():
 
 def reshape_grid_to_jdata(grid_data1):
     grid_data2 = {}
+    if not grid_data1:
+        print("reshape_grid_to_jdata() no grid_data2 !")
+        return grid_data2
+
     for i in grid_data1: 
         attr = i["ATTR"].strip()
         if attr:
@@ -192,27 +196,50 @@ def correct_base(grid_data3):
         else:
             v["FX2"]["BASE"] = "0"
 
-def calculate_offset(grid_data3):
-    fix = extract_fixture_list(grid_data3)
-    offset = {}
-    offset_len = len(fix)-1
+def calculate_offset(grid_data3,wing=None):
+    if wing is None:
+        fix = extract_fixture_list(grid_data3)
+    else:
+        fix = wing
 
     #print()
-    for i,f in enumerate(fix):
+    print("---"*10)
+    offset = {}
+    if not wing:
+        cprint("calculate_offset not wing !")
+        return
+    if len(wing) <= 0:
+        cprint("calculate_offset not wing !")
+        return
+
+    offset_len = len(wing[0])-1
+    if offset_len <= 0:
+        offset_len = 1
+
+    #offset = grid_data3[0]["FX2"]["OFFSET"]/offset_len
+
+    for k,v in enumerate(grid_data3):
+        _offset = v["FX2"]["OFFSET"]
+        attr = v["ATTR"]
+        if attr not in offset:
+            offset[attr] = 0
+            offset[attr] +=  _offset/offset_len
+
+    for i,wing in enumerate(fix):
+        for j,f in enumerate(wing):
+            print(i,j)
 
-        for k,v in enumerate(grid_data3):
-            if f != v["FIX"]:
-                continue
 
-            _offset = v["FX2"]["OFFSET"]
-            attr = v["ATTR"]
-            if attr not in offset:
-                offset[attr] = 0
-                offset[attr] +=  _offset/offset_len
+            for k,v in enumerate(grid_data3):
+                if f != v["FIX"]:
+                    continue
 
-            nof = round( offset[attr]*i,2 ) # ID
-            v["FX2"]["OFFSET"] = nof
-            #print("x_offset: ",k,v["FIX"],v["ATTR"],offset,nof)
+                attr = v["ATTR"]
+                
+                nof = round( offset[attr]*j,2 ) # ID
+                v["FX2"]["OFFSET"] = nof
+                v["FX2"]["WING"] = i
+                print(" ",f,attr,v["FX2"],nof)
 
 def merge_grid_and_programmer(programmer,grid_data2):
     out=[]
@@ -241,6 +268,44 @@ def log(x,name="log",color="yellow"):
         for k,v in enumerate(x):
             cprint(name,[k,v],color=color)
 
+import lib.fxlib as fxlib
+
+def calculate_wing_shuffle(grid_data3):
+    fixtures = []
+    for i,f in enumerate(grid_data3):
+        print("WING",i,f)
+        fix = f["FIX"]
+        if fix not in fixtures:
+            fixtures.append(fix)
+    fx_prm={}
+    fx_prm["SHUFFLE"] = 1
+    fx_prm["WING"] = 2 
+    if len(grid_data3) <= 0:
+        cprint("calculate_wing_shuffle no grid_data3 !")
+        return
+    print()
+    print(grid_data3[0])
+    fx_prm["WING"] = int(grid_data3[0]["FX2"]["WING"])
+    fx_prm["SHUFFLE"] = int(grid_data3[0]["FX2"]["SHUFFLE"])
+
+    a=fxlib.process_wings(fixtures,fx_prm)
+    print(a)
+    return a
+
+
+def grid_stop(grid_data1):
+    if not grid_data1:
+        return
+    for v in grid_data1:
+        v["SPEED"] = 0
+        print("grid_stop",v)
+def grid_off(grid_data1):
+    if not grid_data1:
+        return
+    for v in grid_data1:
+        v["SIZE"] = 0
+        print("grid_off",v)
+
 class tk_event_fx():
     """ global input event Handeler for short cut's ... etc
     """
@@ -257,13 +322,20 @@ class tk_event_fx():
         ct  = ""
         #print(" --", self.attr)
         fx3_grid = MAIN.meta.fx3_grid # OptionBuffer()
-        if self.attr == "START":
+        if self.attr in ["START","STOP","OFF"]:
             grid_data1 = get_fx3_grid()
+            #if self.attr in ["STOP"]:
+            #    grid_stop(grid_data1)
+            if self.attr in ["OFF"]:
+                grid_off(grid_data1)
+
+
             grid_data2 = reshape_grid_to_jdata(grid_data1)
             programmer = mc_api.get_programmer()
             grid_data3 = merge_grid_and_programmer(programmer,grid_data2)
 
-            calculate_offset(grid_data3)
+            wing = calculate_wing_shuffle(grid_data3)
+            calculate_offset(grid_data3,wing)
             correct_base(grid_data3)
             update_dmx_adresses(grid_data3)
 
@@ -416,6 +488,11 @@ def motion(code="circle"):
     k = "BASE:2" 
     MAIN.meta.fx3_grid[k].val(0)
 
+
+    for i in range(1,5+1):
+        k = "START:"+str(i) 
+        MAIN.meta.fx3_grid[k].val(0)
+
     if code == "circle":
 
         k = "SIZE:1" 
@@ -446,8 +523,13 @@ def motion(code="circle"):
         k = "SIZE:3" 
         MAIN.meta.fx3_grid[k].val(100)
 
-        k = "TYPE:3" 
+        k = "START:2" 
+        MAIN.meta.fx3_grid[k].val(20)
+
+        k = "TYPE:2" 
         MAIN.meta.fx3_grid[k].val("ramp")
+        k = "TYPE:3" 
+        MAIN.meta.fx3_grid[k].val("on")
 
         k = "GRP:3"
         MAIN.meta.fx3_grid[k].val("BEAM")
@@ -456,7 +538,9 @@ def motion(code="circle"):
         MAIN.meta.fx3_grid[k].val("DIM")
 
         k = "WIDTH:3" 
-        MAIN.meta.fx3_grid[k].val(50)
+        MAIN.meta.fx3_grid[k].val(85)
+        k = "BASE:3" 
+        MAIN.meta.fx3_grid[k].val(-1)
 
     if code == "street":
         k = "SIZE:1" 
@@ -466,8 +550,13 @@ def motion(code="circle"):
         k = "SIZE:3" 
         MAIN.meta.fx3_grid[k].val(100)
 
-        k = "TYPE:3" 
+        k = "START:1" 
+        MAIN.meta.fx3_grid[k].val(20)
+
+        k = "TYPE:1" 
         MAIN.meta.fx3_grid[k].val("ramp")
+        k = "TYPE:3" 
+        MAIN.meta.fx3_grid[k].val("on")
 
         k = "GRP:3"
         MAIN.meta.fx3_grid[k].val("BEAM")
@@ -476,7 +565,9 @@ def motion(code="circle"):
         MAIN.meta.fx3_grid[k].val("DIM")
 
         k = "WIDTH:3" 
-        MAIN.meta.fx3_grid[k].val(50)
+        MAIN.meta.fx3_grid[k].val(85)
+        k = "BASE:3" 
+        MAIN.meta.fx3_grid[k].val(-1)
 
 
 def size(val=255):
@@ -485,7 +576,9 @@ def size(val=255):
         kt = "TYPE:{}".format(i+1)
         print("  ",k,val)
         if MAIN.meta.fx3_grid[kt].val() not in ["STATIC","-"]:
-            MAIN.meta.fx3_grid[k].val(val)
+            v =  MAIN.meta.fx3_grid[k].val()
+            if v not in [0,0.0]:
+                MAIN.meta.fx3_grid[k].val(val)
     refresh_fx3_elem(_filter="SIZE")
 
 def speed(val=255):
@@ -732,7 +825,8 @@ def _draw_fx3(frame,c,r,gui,mode="FX"):
             b["text"] = comm
             b["bg"] = "#ffbf00"
 
-        if comm in ["SHUFFLE:","WING:","BASE:","INVERT:","DIR:","START:","STOP","OFF"]:  # not implemented !
+        #if comm in ["SHUFFLE:","WING:","BASE:","INVERT:","DIR:","START:","STOP","OFF"]:  # not implemented !
+        if comm in ["INVERT:","STOP","DIR:","WING:"]:  # not implemented !
             b["fg"] = "#aaa"
             b.config(activebackground="#aaa")
             #b.config(activebackground="#bbb")
@@ -989,12 +1083,13 @@ if "--test" in sys.argv:
         time.sleep(1)
 
         for i in range(1,10):
-            for attr in ["RED","BLUE","GREEN","PAN","TILT","DIM"]:
+            for attr in ["RED","BLUE","GREEN"]: #,"PAN","TILT","DIM"]:
                 msg = [{'event': 'FIXTURES', 'TYPE': 'ENCODERS', 'FIX': str(3000+i), 'VAL': 'click', 'ATTR': attr}]
                 msg=json.dumps(msg).encode("utf-8")
+                print(msg)
                 cmd_client.send(msg)
 
-
+        #exit()
         mode = "FX-MAIN"
         attr="FX OFF"
         cb0 =  tk_event_fx(fix=0,elem=None,attr=attr,data=gui,mode=mode).cb