| 
					
				 | 
			
			
				@@ -120,6 +120,92 @@ def basic(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         MAIN.meta.fx3_grid[k].data["min"] = -1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 basic() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def get_fx3_grid(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fx3_grid = MAIN.meta.fx3_grid # OptionBuffer() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    out = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for k,v in fx3_grid.items(): # re-order fx3_grid to command 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        vv = v.val() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        kk,ii = k.split(":") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ii = int(ii)-1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if len(out) <= ii: #extand list 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            out.append({})  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        out[ii][kk] = vv  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return out 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def reshape_grid_to_jdata(grid_data1): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grid_data2 = {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for i in grid_data1:  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        attr = i["ATTR"].strip() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if attr: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            grid_data2[attr] = {"event":"FX3","MODE":"FX","DMX":-11,"DMX-FINE":-99,"FIX":"","ATTR":"","VALUE":None,"FX2":i}  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return grid_data2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def patch_order_by_fix(patch): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    out={} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for p in patch: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ID = p["FIX"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        out[ID] = p 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        #print("patch_order",[ID,p]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return out 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def update_dmx_adresses(grid_data2):  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    patch = get_patch()  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    patch = patch_order_by_fix(patch) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    out=[] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    offset = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for i in grid_data2: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ID = i["FIX"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        attr = i["ATTR"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        #print("address",[ID,attr,i,ID in patch]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if ID in patch: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            v = patch[ID] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if attr in v["ATTR"]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                dmx = v["ATTR"][attr] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                i["DMX"]=dmx 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            attr += "-FINE" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if attr in v["ATTR"]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                dmx = v["ATTR"][attr] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                i["DMX-FINE"]=dmx 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        #cprint("333-- FX3:",i,color="yellow") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return grid_data2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def calculate_offset(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    pass 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def merge_grid_and_programmer(programmer,grid_data2): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    out=[] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    offset = {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    offset_len = len(programmer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for k,v in enumerate(programmer): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        attr = v["ATTR"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ID = v["ID"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if attr not in offset: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            offset[attr] = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print("v",v) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        _offset = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if attr in grid_data2: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tmp = copy.deepcopy(grid_data2[attr]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print(" ",tmp,_offset,offset_len) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            _offset = tmp["FX2"]["OFFSET"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tmp["ATTR"] = attr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tmp["FIX"] = ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tmp["FX2"]["OFFSET"] = round( offset[attr],2 ) # ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            out.append(tmp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            offset[attr] +=  _offset/offset_len 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return out 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def log(x,name="log",color="yellow"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    print() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if type(x) in [dict]: #,OrderedDict]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for k,v in x.items(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            cprint(name,[k,v],color=color) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for k,v in enumerate(x): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            cprint(name,[k,v],color=color) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class tk_event_fx(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     """ global input event Handeler for short cut's ... etc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     """ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -138,56 +224,27 @@ class tk_event_fx(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         fx3_grid = MAIN.meta.fx3_grid # OptionBuffer() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if self.attr == "START": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            _fx3_jdata = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for k,v in fx3_grid.items(): # re-order fx3_grid to command 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                vv = v.val() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                kk,ii = k.split(":") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                ii = int(ii)-1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if len(_fx3_jdata) <= ii: #extand list 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    _fx3_jdata.append({})  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                _fx3_jdata[ii][kk] = vv  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            grid_data1 = get_fx3_grid() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             out = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             FIX=3001 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            z=0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            xxxyyy = {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for i in _fx3_jdata: #info 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                #i["event"] = "FX3" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                attr = i["ATTR"].strip() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if attr: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    #out.append(  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    xxxyyy[attr] = {"event":"FX3","MODE":"FX","DMX":176+z,"DMX-FINE":-199,"FIX":"","ATTR":"","VALUE":None,"FX2":i}  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                #print(i) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                z+=1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            patch = get_patch() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            grid_data2 = reshape_grid_to_jdata(grid_data1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log(grid_data2,name="0:") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             programmer=get_programmer() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            out=[] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            z=106 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for k,v in enumerate(programmer): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                attr = v["ATTR"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if attr in xxxyyy: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    tmp = copy.deepcopy(xxxyyy[attr]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    tmp["ATTR"] = attr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    ID = v["ID"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    tmp["FIX"] = ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    tmp["DMX"] = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    for p in patch: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        print(p) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if ID == p["FIX"]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            if attr in p["ATTR"]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                tmp["DMX"]=p["ATTR"][attr]-1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    out.append(tmp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    cprint("432 FX3:",xxxyyy[attr],color="yellow") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    z+=1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log(programmer,name="A:") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            grid_data3 = merge_grid_and_programmer(programmer,grid_data2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log(grid_data3,name="B:") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            out = update_dmx_adresses(grid_data3) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log(out,name="C:") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             msg=json.dumps(out).encode("utf-8") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             cprint("SEND FX3:",color="green") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for i in out: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 cprint(" ", i,color="green") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                #msg=json.dumps([i]).encode("utf-8") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                #jsend(msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             #cmd_client.send(msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             jsend(msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -859,7 +916,7 @@ def get_programmer(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 #print(":",k,v,kk,vv) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 #print(k,v,v["NAME"],kk,vv) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 tmp={"ID":k,"NAME":v["NAME"],"ATTR":kk,"NR":vv["NR"]} #,"FX3":vv["FX2"]} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                print("tmp",tmp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                print("get_programmer:",tmp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 out.append(tmp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ok=1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if ok: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -892,10 +949,10 @@ def get_patch(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if a.startswith("_"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             nr = nr + d + u*512 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            attr[a] = nr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            attr[a] = nr-1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tmp = {"FIX":v,"UNI":u,"DMX":d,"NR":nr,"ATTR":attr} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         out.append(tmp ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        print(tmp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        #print("get_patch",tmp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return out 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |