Ver Fonte

FX3 first working state,...with DMX maping via memcache

micha há 2 dias atrás
pai
commit
92bc841846
5 ficheiros alterados com 175 adições e 21 exclusões
  1. 37 1
      _LibreLightDesk.py
  2. 1 1
      lib/fxlib.py
  3. 2 1
      lib/jsbc.py
  4. 1 0
      lib/meta.py
  5. 134 18
      tkgui/FX3.py

+ 37 - 1
_LibreLightDesk.py

@@ -379,6 +379,33 @@ class MC_FIX():
         index = self.mc.get("index")
         self.mc.set("fix", data)
 
+class MC_PATCH():
+    def __init__(self,server="127.0.0.1",port=11211):
+        cprint("MC.init() ----------" ,server,port,color="red")
+        try:
+            self.mc = memcache.Client(['{}:{}'.format(server,port)], debug=0)
+        except Exception as e:
+            cprint("-- Exception",e)
+    def loop(self):
+        time.sleep(10)
+        print("start loop MC_PATCH ...")
+        while 1:
+            try:
+                
+                index_patch = []
+                for fix,val in FIXTURES.fixtures.items():
+                    print("FIX",fix,val)
+                    val = json.dumps(val).encode() 
+                    self.mc.set("PATCH-"+str(fix),val)
+                    index_patch.append(fix)
+                val = json.dumps(index_patch).encode() 
+                self.mc.set("PATCH-INDEX",val)
+            except Exception as e:
+                print(e)
+            time.sleep(5)
+
+mc_patch = MC_PATCH()
+thread.start_new_thread(mc_patch.loop,())
 
 class MC():
     def __init__(self,server="127.0.0.1",port=11211):
@@ -524,6 +551,10 @@ def jclient_send(data):
     jtxt = data
     jdatas = []
     for jdata in data:
+        if type(jdata) not in [dict,OrderedDict]:
+            cprint("jclient_send, error jdata not dict like ",[jdata],color="red")
+            continue
+
         if "CMD" in jdata:
             try:
                 jdatas.append(jdata)
@@ -535,6 +566,7 @@ def jclient_send(data):
         elif "DMX" in jdata:
 
             try:
+                print(jdata)
                 jdata["DMX"] = int(jdata["DMX"])
                 dmx = jdata["DMX"]
 
@@ -568,9 +600,13 @@ def jclient_send(data):
                 #cprint("-- ",jdata,color="red")
 
             except Exception as e:
-                cprint("jclient_send, Exception DMX ",color="red")
+                cprint("jclient_send, Exception 4 DMX ",color="red")
                 cprint("",jdata,color="red")
                 cprint(e,color="red")
+                #pt Exception as e:
+                exc_type, exc_obj, exc_tb = sys.exc_info()
+                fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
+                print(exc_type, fname, exc_tb.tb_lineno)
                 cprint("-----",color="red")
             
     jtxt = jdatas

+ 1 - 1
lib/fxlib.py

@@ -275,7 +275,7 @@ def process_effect(wing_buffer,fx_prm,fx_prm_move,modes,jclient_send,master,FIXT
                     jdata["FX2"]    = fjdata
                     data["ATTRIBUT"][attr]["FX2"] = fjdata
                     jdatas.append(jdata)
-                    #print("GOO FX:",jdata)
+                    print("GOO FX:",jdata)
 
             
             if fx_prm_move["OFFSET"] > 0.5: # and 

+ 2 - 1
lib/jsbc.py

@@ -58,8 +58,9 @@ def JSCB(x,sock=None):
                     fixlib.encoder(MAIN.FIXTURES.fixtures,str(fix_nr),attr,xval=val,xfade=0,xdelay=0)#,blind=0)
                     OK = 1
                 elif "FX3" == msg["event"]:
-                    msg["VALUE"] = "DOOM"
+                    msg["VALUEx"] = "DOOM"
                     cprint("FX3 OK",color="yellow")
+                    MAIN.jclient_send([msg]) #ajdata)
                     OK = 1
                 elif "CLEAR" == msg["event"]:
                     fixlib.clear(MAIN.FIXTURES.fixtures)

+ 1 - 0
lib/meta.py

@@ -294,6 +294,7 @@ def Optionbuffer_create_ATTR_GRP(val=""):
     return OptionBuffer(val,options)
 
 FX_FUNC = ["SIN","COS","RAMP","RAMP2","FD","ON","STATIC","-","255"]
+FX_FUNC = ["sinus","cosinus","ramp","ramp2","fade","on","static","-","255"]
 def Optionbuffer_create_FX_FUNC(val=""):
     options = FX_FUNC
     return OptionBuffer(val,options)

+ 134 - 18
tkgui/FX3.py

@@ -3,6 +3,7 @@
 import json
 import time
 import sys
+import copy
 import os
 import tkinter as tk
 import traceback
@@ -37,6 +38,14 @@ import tool.movewin as movewin
 movewin.check_is_started("FX3","/opt/LibreLight/Xdesk/tkgui/FX3.py")
 
 
+console = chat.Client() #port=50001)
+def jsend(jdatas):
+    jtxt = jdatas
+    #jtxt = json.dumps(jtxt)
+    #jtxt = jtxt.encode()
+    console.send( jtxt ) #b"\00 ")
+
+
 def _add_space(frame,r,c):
     b = tk.Canvas(frame,bg="black", height=2,bd=0,width=6,highlightthickness=0) #,bd="black")
     b.grid(row=r, column=c, sticky=tk.W+tk.E)
@@ -140,17 +149,47 @@ class tk_event_fx():
             out = []
             FIX=3001
             z=0
+
+            xxxyyy = {}
             for i in _fx3_jdata: #info
                 #i["event"] = "FX3"
-                if i["ATTR"].strip():
-                    out.append( {"event":"FX3","DMX":"123","VALUE":"","FIX":str(FIX+z),"FX3":i} )
-                print(i)
-                z+=1
+                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()
+            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
 
             msg=json.dumps(out).encode("utf-8")
-            cprint("SEND FX3:",msg,color="green")
-            cmd_client.send(msg)
+            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)
 
         if self.attr not in fx3_grid:
             fx_data = {}
@@ -253,9 +292,9 @@ def motion(code="circle"):
 
     if code == "circle":
         k = "TYPE:1" 
-        MAIN.meta.fx3_grid[k].val("SIN")
+        MAIN.meta.fx3_grid[k].val("sinus")
         k = "TYPE:2" 
-        MAIN.meta.fx3_grid[k].val("COS")
+        MAIN.meta.fx3_grid[k].val("cosinus")
 
         k = "SIZE:1" 
         MAIN.meta.fx3_grid[k].val(100)
@@ -267,11 +306,16 @@ def motion(code="circle"):
         k = "BASE:2" 
         MAIN.meta.fx3_grid[k].val(0)
 
+        k = "WIDTH:1" 
+        MAIN.meta.fx3_grid[k].val(255)
+        k = "WIDTH:2" 
+        MAIN.meta.fx3_grid[k].val(255)
+
     if code == "pan":
         k = "TYPE:1" 
-        MAIN.meta.fx3_grid[k].val("SIN")
+        MAIN.meta.fx3_grid[k].val("sinus")
         k = "TYPE:2" 
-        MAIN.meta.fx3_grid[k].val("COS")
+        MAIN.meta.fx3_grid[k].val("cosinus")
         k = "TYPE:3" 
         MAIN.meta.fx3_grid[k].val("-")
         k = "TYPE:4" 
@@ -286,11 +330,16 @@ def motion(code="circle"):
         MAIN.meta.fx3_grid[k].val(0)
         k = "BASE:2" 
         MAIN.meta.fx3_grid[k].val(0)
+
+        k = "WIDTH:1" 
+        MAIN.meta.fx3_grid[k].val(255)
+        k = "WIDTH:2" 
+        MAIN.meta.fx3_grid[k].val(255)
     if code == "tilt":
         k = "TYPE:1" 
-        MAIN.meta.fx3_grid[k].val("SIN")
+        MAIN.meta.fx3_grid[k].val("sinus")
         k = "TYPE:2" 
-        MAIN.meta.fx3_grid[k].val("COS")
+        MAIN.meta.fx3_grid[k].val("cosinus")
         k = "TYPE:3" 
         MAIN.meta.fx3_grid[k].val("-")
         k = "TYPE:4" 
@@ -306,6 +355,10 @@ def motion(code="circle"):
         k = "BASE:2" 
         MAIN.meta.fx3_grid[k].val(0)
 
+        k = "WIDTH:1" 
+        MAIN.meta.fx3_grid[k].val(255)
+        k = "WIDTH:2" 
+        MAIN.meta.fx3_grid[k].val(255)
 
 def size(val=255):
     for i in range(4):
@@ -362,19 +415,19 @@ def rgb(code="red"):
 
     if code == "red":
         k = "TYPE:1" 
-        MAIN.meta.fx3_grid[k].val("FD")
+        MAIN.meta.fx3_grid[k].val("fade")
     if code == "green":
         k = "TYPE:2" 
-        MAIN.meta.fx3_grid[k].val("FD")
+        MAIN.meta.fx3_grid[k].val("fade")
     if code == "blue":
         k = "TYPE:3" 
-        MAIN.meta.fx3_grid[k].val("FD")
+        MAIN.meta.fx3_grid[k].val("fade")
     if code == "blue":
         k = "TYPE:3" 
-        MAIN.meta.fx3_grid[k].val("FD")
+        MAIN.meta.fx3_grid[k].val("fade")
     if code == "blue":
         k = "TYPE:3" 
-        MAIN.meta.fx3_grid[k].val("FD")
+        MAIN.meta.fx3_grid[k].val("fade")
 
     __refresh_fx3()
 
@@ -710,7 +763,7 @@ class Gui(): # DUMMY
                 data = json.loads(data)
                 self.METAS[nr] = data #.append(data)
                 #print(time.time())
-                print("     _REFRESH_EXEC_SINGLE",nr,b,data["LABEL"])
+                print("     _REFRESH_EXEC_sinusGLE",nr,b,data["LABEL"])
             except Exception as e:
                 print("  ER1R mc...",e)
 
@@ -784,6 +837,69 @@ def focus_out(event=None):
 root.bind("<FocusIn>", focus_in)
 root.bind("<FocusOut>", focus_out)
 
+import memcache
+try:
+    mc = memcache.Client(['127.0.0.1:11211'], debug=0)
+except:
+    mc = None
+
+def get_programmer():
+    if mc is None:
+        return
+
+    DATA=mc.get("fix")#cmd)
+    out=[]
+    for k,v in DATA.items():
+        ok=0
+        for kk,vv in v["ATTRIBUT"].items():
+            if kk.startswith("_"):
+                #print(":",k,v,kk,vv)
+                continue
+            if vv["ACTIVE"]:
+                #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)
+                out.append(tmp)
+                ok=1
+        if ok:
+            print()
+    return out
+
+#import memcache
+#import json
+#mc = memcache.Client(['127.0.0.1:11211'], debug=0)
+def get_patch():
+    if mc is None:
+        return
+    index=mc.get("PATCH-INDEX") #index")#cmd)
+    index=json.loads(index)
+    out = []
+    for v in index:
+        #print()
+        patch=mc.get("PATCH-"+str(v)) #index")#cmd)
+        patch=json.loads(patch)
+        u =  patch["UNIVERS"] #* 512
+        d =  patch["DMX"]
+        attr = {}
+        for a in patch["ATTRIBUT"]:
+            nr =patch["ATTRIBUT"][a]["NR"] 
+            if nr <= 0:
+                continue
+            #print(v,u,d,nr,a)
+            if a == "END":
+                continue
+            if a.startswith("_"):
+                continue
+            nr = nr + d + u*512
+            attr[a] = nr
+        tmp = {"FIX":v,"UNI":u,"DMX":d,"NR":nr,"ATTR":attr}
+        out.append(tmp )
+        print(tmp)
+    
+    return out
+
+
 
 def _refr_loop():
     time.sleep(3)