_LibreLightDesk.py 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388
  1. #! /usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """
  4. (c) 2012 micha@librelight.de
  5. SPDX-License-Identifier: GPL-2.0-only
  6. """
  7. import random
  8. import subprocess
  9. import string
  10. import copy
  11. import traceback
  12. import json
  13. import time
  14. import sys
  15. import os
  16. import _thread as thread
  17. for i in range(30):
  18. print() # boot space
  19. IS_GUI = 0
  20. if __name__ == "__main__":
  21. IS_GUI = 1
  22. import tool.movewin as movewin
  23. import lib.fixlib as fixlib
  24. import lib.libwin as libwin
  25. import lib.libtk as libtk
  26. import lib.libconfig as libconfig
  27. rnd_id = str(random.randint(100,900))
  28. rnd_id += " beta"
  29. rnd_id2 = ""
  30. rnd_id3 = ""
  31. _ENCODER_WINDOW = None
  32. __run_main = 0
  33. if __name__ == "__main__":
  34. __run_main = 1
  35. else:
  36. import __main__
  37. if "unittest" not in dir(__main__):
  38. __run_main = 1
  39. import tool.git as git
  40. rnd_id += git.get_all()
  41. try:
  42. xtitle = __file__
  43. except:
  44. xtitle = "__file__"
  45. if "/" in xtitle:
  46. xtitle = xtitle.split("/")[-1]
  47. sys.stdout.write("\x1b]2;"+str(xtitle)+" "+str(rnd_id)+"\x07") # terminal title
  48. HOME = os.getenv('HOME')
  49. space_font = None
  50. INIT_OK = 0
  51. _global_short_key = 1
  52. path = "/home/user/LibreLight/"
  53. #os.chdir(path)
  54. f = open(path+"init.txt","r")
  55. lines=f.readlines()
  56. f.close()
  57. out = []
  58. for line in lines:
  59. if line != "EASY\n":
  60. out.append(line)
  61. f = open(path+"init.txt","w")
  62. f.writelines(out)
  63. f.close()
  64. if "--easy" in sys.argv:
  65. f = open(path+"init.txt","a")
  66. f.write("EASY\n")
  67. f.close()
  68. if not os.path.isdir(path+"show/EASY"):
  69. cmd = "cp -vrf '/opt/LibreLight/Xdesk/home/LibreLight/show/EASY' '{}/show/EASY' ".format(path)
  70. print(cmd)
  71. #input()
  72. os.system(cmd)
  73. # check if EASY show exist !
  74. from lib.cprint import cprint
  75. cprint("________________________________")
  76. def cb(**args):
  77. cprint("MAIN.cb DUMMY",**args,color="red")
  78. import lib.zchat as chat
  79. import lib.motion as motion
  80. from collections import OrderedDict
  81. _FIX_FADE_ATTR = ["PAN","TILT","DIM","RED","GREEN","BLUE","WHITE","CYAN","YELLOW","MAGENTA","FOCUS","ZOOM","FROST"]
  82. CUES = OrderedDict()
  83. groups = OrderedDict()
  84. class Modes():
  85. def __init__(self):
  86. self.modes = {}
  87. self.__cfg = {}
  88. self.__cb = None
  89. def val(self,mode,value=None): #like jquery
  90. if value is not None:
  91. return self.set(mode,value)
  92. elif mode in self.modes:
  93. return self.modes[mode]
  94. def info(self):
  95. for m in self.modes:
  96. print("modes",m,self.val(m))
  97. def get(self,mode,value=None):
  98. return self.val(mode,value)
  99. def __check(self,mode):
  100. if mode not in self.modes:
  101. self.modes[mode] = 0
  102. self.__cfg[mode] = 0
  103. def cfg(self,mode,data={}):
  104. self.__check(mode)
  105. if type(data) is dict:
  106. for k in data:
  107. v = data[k]
  108. if v not in self.__cfg:
  109. self.__cfg[k] = v
  110. return 1
  111. elif type(data) is str:
  112. if data in self.__cfg:
  113. return self.__cfg[data]
  114. def set(self,mode,value):
  115. protected = ["BLIND","CLEAR","REC-FX"]
  116. self.__check(mode)
  117. if mode == "CLEAR":
  118. return 1
  119. elif mode == "ESC":
  120. for m in self.modes:
  121. cprint("ESC",m)
  122. if m == "COPY":
  123. EXEC.clear_copy()
  124. if m == "MOVE":
  125. EXEC.clear_move()
  126. if m != "BLIND":
  127. self.modes[m] = 0
  128. self.callback(m)
  129. return 1
  130. if value:
  131. for m in self.modes:
  132. if m not in protected and mode not in protected and m != mode:
  133. #cprint("-#-# clear mode",mode,m,value,color="red")
  134. if self.modes[m]:
  135. self.modes[m]= 0
  136. self.callback(m)
  137. if self.modes[mode] and value == 1:
  138. if modes == "MOVE":
  139. EXEC.clear_move()
  140. if modes == "COPY":
  141. EXEC.clear_copy()
  142. self.modes[mode] = 0 # value
  143. else:
  144. self.modes[mode] = value #1 #value
  145. else:
  146. self.modes[mode] = 0 #value
  147. if modes == "COPY":
  148. EXEC.clear_copy()
  149. if modes == "MOVE":
  150. EXEC.clear_move()
  151. self.callback(mode)
  152. return value
  153. def set_cb(self,cb):
  154. if cb:
  155. self.__cb = cb
  156. def callback(self,mode):
  157. if self.__cb is not None and mode in self.modes:
  158. value = self.modes[mode]
  159. self.__cb(mode=mode,value=value)
  160. modes = Modes()
  161. #modes.val("BLIND", 0)
  162. #modes.modes["BLIND"] = 0
  163. modes.modes["ESC"] = 0
  164. modes.modes["REC"] = 0
  165. modes.modes["EDIT"] = 0
  166. modes.modes["MOVE"] = 0
  167. modes.modes["FLASH"] = 0
  168. modes.modes["GO"] = 0
  169. modes.modes["DEL"] = 0
  170. modes.modes["REC-FX"] = 0
  171. modes.modes["SELECT"] = 0
  172. modes.modes["CFG-BTN"] = 0
  173. modes.modes["LABEL"] = 0
  174. POS = ["PAN","TILT","MOTION"]
  175. COLOR = ["RED","GREEN","BLUE","COLOR"]
  176. BEAM = ["GOBO","G-ROT","PRISMA","P-ROT","FOCUS","SPEED"]
  177. INT = ["DIM","SHUTTER","STROBE","FUNC"]
  178. #client = chat.tcp_sender(port=50001)
  179. def set_exec_fader_cfg(nr,val,label="",color=""):
  180. exec_wing = window_manager.get_obj(name="EXEC-WING")
  181. if not exec_wing:
  182. return
  183. try:
  184. if len(exec_wing.fader_elem) > nr:
  185. exec_wing.fader_elem[nr].attr["text"] = label
  186. cfg = get_exec_btn_cfg(nr+80)
  187. exec_wing.fader_elem[nr].attr["bg"] = cfg["bg"]
  188. exec_wing.fader_elem[nr].attr["fg"] = cfg["fg"]
  189. #exec_wing.fader_elem[nr].attr["fx"] = cfg["fx"]
  190. except Exception as e:
  191. cprint(" set_exec_fader_cfg err:",e,color="red")
  192. print(" ",nr,val,label)
  193. raise e
  194. def set_exec_fader(nr,val,label="",color="",info="info",change=0):
  195. exec_wing = window_manager.get_obj(name="EXEC-WING")
  196. if not exec_wing:
  197. return
  198. try:
  199. exec_wing.set_fader(nr,val,color=color,info=info,change=change)
  200. except Exception as e:
  201. cprint(" - set_exec_fader err:",e,color="red")
  202. print(" ",nr,val,label)
  203. raise e
  204. def set_exec_fader_all():
  205. print()
  206. cprint( "set_exec_fader_all()",color="green")
  207. for nr in range(10):
  208. _label = EXEC.label_exec[nr+80] # = label
  209. print(" set_exec_fader_all._label =",_label)
  210. set_exec_fader(nr,0,label=_label)
  211. set_exec_fader_cfg(nr,0,label=_label)
  212. def refresh_exec_fader_cfg():
  213. cprint( "set_exec_fader_all()",color="green")
  214. for nr in range(10):
  215. _label = EXEC.label_exec[nr+80] # = label
  216. #print("_label",_label)
  217. set_exec_fader_cfg(nr,0,label=_label)
  218. # remote input - start (memcached)
  219. def JCB(x,sock=None):
  220. for i in x:
  221. jv = x[i]
  222. try:
  223. jv = json.loads(jv)
  224. jv = jv[0]
  225. #print(jv)
  226. v = jv["iVAL"]
  227. #exec_wing.set_fader(0,v)
  228. set_exec_fader(0,v)
  229. set_exec_fader(1,200-v)
  230. set_exec_fader(2,int(v/2+10))
  231. except Exception as e:
  232. cprint("exception",e)
  233. print(sys.exc_info()[2])
  234. #print("remote in:",round(time.time(),0),"x",i,v)
  235. if __name__ == "__main__":
  236. r1_server = chat.Server(port=30002)
  237. def server1_loop():
  238. while 1:
  239. r1_server.poll(cb=JCB)
  240. time.sleep(1/90)
  241. thread.start_new_thread(server1_loop,()) # SERVER
  242. import lib.jsbc as JSBC
  243. if __name__ == "__main__":
  244. r_server = chat.Server(port=30003,cb=JSBC.JSCB)
  245. def server_loop():
  246. while 1:
  247. r_server.poll(cb=JSBC.JSCB)
  248. thread.start_new_thread(server_loop,()) # SERVER
  249. import lib.fifo as FIFO
  250. if __name__ == "__main__":
  251. f_server = FIFO.read_loop() #chat.Server(port=30003,cb=JSBC.JSCB)
  252. f_server.loop(sleep=1)
  253. def f_server_read_loop():
  254. time.sleep(10)
  255. print("FIFO read_loop() __ ")
  256. while 1:
  257. try:
  258. data = f_server.read()
  259. for jdata in data:
  260. # JSCB [{'event': 'EXEC', 'EXEC': 161, 'VAL': 0, 'NR-KEY': 1}]
  261. print("FIFO:",jdata)
  262. ok=1
  263. for i in ["event","VAL","EXEC"]:
  264. if i not in jdata:
  265. ok=0
  266. if ok:
  267. if jdata["event"] != "EXEC":
  268. continue
  269. if "EXEC" in jdata:
  270. exec_nr = jdata["EXEC"]
  271. if "VAL" in jdata:
  272. val = jdata["VAL"]
  273. master.exec_go(exec_nr-1,xfade=None,val=val)
  274. else:
  275. time.sleep(0.02)
  276. except KeyboardInterrupt as e:
  277. raise e
  278. except Exception as e:
  279. print("FIFO ERR1",e)
  280. thread.start_new_thread(f_server_read_loop,()) # SERVER
  281. # read memcachd
  282. memcache = None
  283. try:
  284. import memcache
  285. except Exception as e:
  286. cprint("Exception IMPORT ERROR",e)
  287. class MC_FIX():
  288. def __init__(self,server="127.0.0.1",port=11211):
  289. cprint("MC.init() ----------" ,server,port,color="red")
  290. try:
  291. self.mc = memcache.Client(['{}:{}'.format(server,port)], debug=0)
  292. except Exception as e:
  293. cprint("-- Exception",e)
  294. def set(self,index="fix",data=[]):
  295. index = self.mc.get("index")
  296. self.mc.set("fix", data)
  297. class MC():
  298. def __init__(self,server="127.0.0.1",port=11211):
  299. cprint("MC.init() ----------" ,server,port,color="red")
  300. try:
  301. #self.mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  302. self.mc = memcache.Client(['{}:{}'.format(server,port)], debug=0)
  303. #self.init()
  304. except Exception as e:
  305. cprint("-- Exception",e)
  306. # def init(self):
  307. data = {}
  308. start = time.time()
  309. delta = start
  310. index = self.mc.get("index")
  311. if index:
  312. for i in index:
  313. print(" key",i)
  314. self.last_fader_val = [-1]*512
  315. self.fader_map = []
  316. for i in range(30+1):
  317. self.fader_map.append({"UNIV":0,"DMX":0})
  318. try:
  319. fname = HOME + "/LibreLight/fader.json"
  320. f = open(fname)
  321. lines = f.readlines()
  322. cprint("FADER MAP",fname)
  323. for i,line in enumerate(lines):
  324. jdata = json.loads(line)
  325. print(" fader_map ->>",i,jdata)
  326. self.fader_map[i] = jdata
  327. except Exception as e:
  328. cprint("-- Except Fader_map",e)
  329. #exit()
  330. def ok(self):
  331. if self.mc:
  332. return 1
  333. return 0
  334. def test(self):
  335. if not self.ok():
  336. return
  337. self.mc.set("some_key", "Some value")
  338. self.value = mc.get("some_key")
  339. self.mc.set("another_key", 3)
  340. self.mc.delete("another_key")
  341. def loop(self):
  342. thread.start_new_thread(self._loop,())
  343. if not self.ok():
  344. return
  345. def _exec_fader_loop(self,x):
  346. for i, line in enumerate(self.fader_map):
  347. try:
  348. #print(i,line)
  349. dmx = int(line["DMX"])
  350. if dmx > 0:
  351. val = x[dmx-1]
  352. #print("mc val",val)
  353. #print("dmx_in change:",[i,val])
  354. change = 0
  355. if i < len(self.last_fader_val):
  356. if self.last_fader_val[i] != val:
  357. self.last_fader_val[i] = val
  358. print("dmx_in change:",[i,val])
  359. change = 1
  360. set_exec_fader(nr=i,val=val,color="#aaa",info="dmx_in",change=change)
  361. except Exception as e:
  362. cprint("MC exc:",e,color="red")
  363. traceback.print_exc()
  364. pass
  365. def _loop(self):
  366. time.sleep(20)
  367. cprint("++++++++++ start.memcachd read loop",self )
  368. ip = libconfig.load_remote_ip()
  369. print("IP:",ip)
  370. input()
  371. while 1:
  372. send = 0
  373. #print("+")
  374. try:
  375. #ip="10.10.10.13:0"
  376. #ip="ltp-out:0"
  377. #print(ip)
  378. x=self.mc.get(ip)
  379. if x:
  380. #print(ip,x)
  381. #val = x[501-1]
  382. #val = x[141-1]
  383. self._exec_fader_loop(x)
  384. time.sleep(1/10)
  385. except Exception as e:
  386. cprint("exc", e)
  387. time.sleep(1)
  388. _mc=MC()
  389. _mc.loop()
  390. def message_buss_loop():
  391. while 1:
  392. try:
  393. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  394. break
  395. except Exception as e:
  396. cprint("--1 message_buss_loop Exc",[e])
  397. time.sleep(2)
  398. while 1:
  399. try:
  400. key="MODES"
  401. cfg = {}
  402. for k,v in modes.modes.items():
  403. if v:
  404. cfg[k] = v
  405. cfg["S-KEY"] = _global_short_key
  406. mc.set(key,json.dumps(cfg))
  407. except Exception as e:
  408. cprint("--2 message_buss_loop Exc:",[e])
  409. time.sleep(2)
  410. time.sleep(0.5)
  411. thread.start_new_thread(message_buss_loop,())
  412. console = chat.Client() #port=50001)
  413. def jclient_send(data):
  414. t_start = time.time()
  415. jtxt = data
  416. jdatas = []
  417. for jdata in data:
  418. if "CMD" in jdata:
  419. try:
  420. jdatas.append(jdata)
  421. except Exception as e:
  422. cprint("jclient_send, Exception DMX ",color="red")
  423. cprint("",jdata,color="red")
  424. cprint("-----",color="red")
  425. elif "DMX" in jdata:
  426. try:
  427. jdata["DMX"] = int(jdata["DMX"])
  428. dmx = jdata["DMX"]
  429. if "ATTR" not in jdata:
  430. # for fx off
  431. jdatas.append(jdata)
  432. else:
  433. fix = "00000"
  434. attr = "00000"
  435. if "FIX" in jdata:
  436. fix = jdata["FIX"]
  437. if "ATTR" in jdata:
  438. attr = jdata["ATTR"]
  439. dmx_fine = fixlib.get_dmx(FIXTURES.fixtures,fix,attr+"-FINE")
  440. if jdata["DMX"] != dmx_fine and dmx > 0 and dmx_fine > 0:
  441. jdata["DMX-FINE"] = dmx_fine
  442. if "DMX-FINE" in jdata:
  443. if jdata["DMX-FINE"] <= 0:
  444. del jdata["DMX-FINE"]
  445. if jdata["ATTR"].startswith("_"):
  446. pass # ignore attr._ACTIVE
  447. else:#
  448. jdata["time"] = t_start
  449. jdatas.append(jdata)
  450. #cprint("-- ",jdata,color="red")
  451. except Exception as e:
  452. cprint("jclient_send, Exception DMX ",color="red")
  453. cprint("",jdata,color="red")
  454. cprint(e,color="red")
  455. cprint("-----",color="red")
  456. jtxt = jdatas
  457. jtxt = json.dumps(jtxt)
  458. jtxt = jtxt.encode()
  459. console.send( jtxt ) #b"\00 ")
  460. cprint("{:0.04} sec.".format(time.time()-t_start),color="yellow")
  461. cprint("{:0.04} tick".format(time.time()),color="yellow")
  462. def _highlight(fix,_attr="DIM"):
  463. " patch test button "
  464. cprint("highlight",fix,"1")
  465. if fix not in FIXTURES.fixtures:
  466. return None
  467. d = FIXTURES.fixtures[fix]
  468. #for k,v in d.items():
  469. # cprint("-",k,v)
  470. DMX = d["DMX"] + d["UNIVERS"]*512
  471. if "ATTRIBUT" in d:
  472. ATTR= d["ATTRIBUT"]
  473. data = {"VALUE":200,"DMX":1}
  474. attr = ""
  475. if _attr in ATTR:
  476. attr = _attr
  477. else:
  478. return #stop
  479. cprint(attr,ATTR[attr])
  480. old_val = ATTR[attr]["VALUE"]
  481. data["DMX"] = DMX + ATTR[attr]["NR"]-1
  482. cprint(attr,ATTR[attr])
  483. cprint(data)
  484. for i in range(3):
  485. cprint("highlight",fix,"0")
  486. data["VALUE"] = 100
  487. jclient_send([data])
  488. time.sleep(0.1)
  489. cprint("highlight",fix,"1")
  490. data["VALUE"] = 234
  491. jclient_send([data])
  492. time.sleep(0.3)
  493. cprint("highlight",fix,"0")
  494. data["VALUE"] = old_val
  495. jclient_send([data])
  496. def highlight2(fix,attr="DIM"):
  497. def x():
  498. highlight(fix,attr=attr)
  499. return x
  500. def highlight(fix):
  501. cprint("highlight",fix)
  502. thread.start_new_thread(_highlight,(fix,"DIM"))
  503. thread.start_new_thread(_highlight,(fix,"RED"))
  504. thread.start_new_thread(_highlight,(fix,"GREEN"))
  505. thread.start_new_thread(_highlight,(fix,"BLUE"))
  506. class ValueBuffer():
  507. def __init__(self,_min=0,_max=255):
  508. self._value = 2
  509. self._on = 1
  510. self._min=_min
  511. self._max=_max
  512. def check(self):
  513. if self._value < self._min:
  514. self._value = self._min
  515. elif self._value > self._max:
  516. self._value = self._max
  517. def inc(self,value=None):
  518. if value is not None:
  519. if type(value) is float:
  520. self._value += round(value,4)
  521. else:
  522. self._value += value
  523. self.check()
  524. return self._value
  525. def val(self,value=None):
  526. if value is not None:
  527. if type(value) is float:
  528. self._value = round(value,4)
  529. else:
  530. self._value = value
  531. self.check()
  532. return self._value
  533. def on(self):
  534. self._on = 1
  535. def off(self):
  536. self._on = 0
  537. def _is(self):
  538. if self._on:
  539. return 1
  540. return 0
  541. FADE = ValueBuffer() #2 #0.1 #1.13
  542. FADE.val(2.0)
  543. FADE_move = ValueBuffer() #2 #0.1 #1.13
  544. FADE_move.val(4.0)
  545. DELAY = ValueBuffer() #2 #0.1 #1.13
  546. DELAY.off()
  547. DELAY.val(0.2)
  548. fx_prm_main = {}
  549. fx_prm_move = {"SIZE":40,"SPEED":8,"OFFSET":100,"BASE":"0","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":0,"WING":2,"WIDTH":100}
  550. fx_color = {"A":"red","B":"blue"}
  551. fx_prm = {"SIZE":255,"SPEED":10,"OFFSET":100,"BASE":"-","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":1,"SHUFFLE":0,"WING":2,"WIDTH":25,"2D-X":1,"2D:MODE":0}
  552. fx_x_modes = ["spiral","left","right","up","down","left_right","up_down"]
  553. fx_modes = ["RED","GREEN","BLUE","MAG","YELLOW","CYAN"]
  554. fx_mo = ["fade","on","rnd","ramp","ramp2","cosinus","sinus","static"]
  555. class FX_handler():
  556. def __init__():
  557. pass
  558. class dummy_event():
  559. def __init__(self):
  560. self.num =0
  561. self.type = 4 #press 5 release
  562. self.set_value=-1
  563. from lib import matrix
  564. import lib.fxlib as fxlib
  565. def process_matrix(xfixtures):
  566. fx_x = fx_prm["2D-X"]
  567. fx_mod = fx_x_modes[fx_prm["2D:MODE"]]
  568. r = _process_matrix(xfixtures,fx_x,fx_mod)
  569. return r
  570. def _process_matrix(xfixtures,fx_x,fx_mod):
  571. fix_count = len(xfixtures)
  572. cprint("----",fx_x,fx_mod)
  573. if fx_x > 1 and fix_count > fx_x:
  574. try:
  575. w=fx_x
  576. h=int(fix_count/fx_x)
  577. if fx_mod == "spiral":
  578. _map = matrix.spiral(w,h)
  579. elif fx_mod == "up_down":
  580. _map = matrix.up_down(w,h)
  581. elif fx_mod == "left_right":
  582. _map = matrix.left_right(w,h)
  583. elif fx_mod == "left":
  584. _map = matrix.left(w,h)
  585. elif fx_mod == "right":
  586. _map = matrix.right(w,h)
  587. elif fx_mod == "up":
  588. _map = matrix.up(w,h)
  589. elif fx_mod == "down":
  590. _map = matrix.down(w,h)
  591. else:
  592. return xfixtures # do nothing
  593. matrix.mprint(xfixtures,w,h)
  594. out = ["0"]*(w*h)
  595. for i,f in enumerate(xfixtures):
  596. if i < w*h:
  597. j = int(_map[i])
  598. cprint(["i:",i,"f:",f,"j:",j])
  599. out[j] = f
  600. matrix.mprint(out,w,h)
  601. xfixtures = out
  602. except Exception as e:
  603. cprint("matrix exception",e)
  604. return xfixtures
  605. def save_show(fpath=None,new=0):
  606. if fpath:
  607. a=EXEC.backup_exec(save_as=fpath,new=new)
  608. b=FIXTURES.backup_patch(save_as=fpath,new=new)
  609. c=libwin.save_window_position(save_as=fpath)
  610. d=movewin.store_all_sdl()
  611. else:
  612. print()
  613. print()
  614. cprint("SAVE SHOW ..",color="yellow")
  615. a=EXEC.backup_exec()
  616. b=FIXTURES.backup_patch()
  617. c=libwin.save_window_position()
  618. d=movewin.store_all_sdl()
  619. if a and b and d: # and c
  620. cprint("SAVE SHOW OK",[fpath,new],[a,b,c,d],color="green")
  621. print()
  622. print()
  623. print()
  624. return 1
  625. cprint("SAVE SHOW FAIL",[fpath,new],[a,b,c,d],color="red")
  626. print()
  627. print()
  628. print()
  629. def save_show_as(fname,new=0):
  630. print()
  631. print()
  632. fpath = showlib.generate_show_path(fname)
  633. info = "SAVE SHOW AS"
  634. if new:
  635. info = "SAVE (NEW) SHOW AS"
  636. cprint(info,fpath,fname,color="green")
  637. if showlib.create_new_show_path(fpath):
  638. return save_show(fpath,new)
  639. import lib.showlib as showlib
  640. class cb():
  641. def __init__(self,win):
  642. self.win = win
  643. def _callback(self,event):
  644. clobj=event.widget
  645. ## undermouse=find_withtag(master.CURRENT)
  646. undermouse=self.win.find_closest(self.win.CURRENT)
  647. cprint( repr(undermouse))
  648. def callback(self,event):
  649. cprint(__file__,self,"callback",event)
  650. cnv = self.win
  651. item = cnv.find_closest(cnv.canvasx(event.x), cnv.canvasy(event.y))[0]
  652. tags = cnv.gettags(item)
  653. #cnv.itemconfigure(self.tag, text=tags[0])
  654. cprint(tags,item)
  655. color = cnv.itemcget(item, "fill")
  656. cnv.itemconfig("all", width=1)#filla="green")
  657. cnv.itemconfig(item, width=3)#filla="green")
  658. cprint(color)
  659. cprint( hex_to_rgb(color[1:]))
  660. import copy
  661. def get_exec_btn_cfg(nr):
  662. k = nr
  663. if 1:
  664. _bg = "grey"
  665. _ba = "grey"
  666. _fg = "lightgrey"
  667. _text = "N/V"
  668. txt = "None/nNone"
  669. txt1 = "None/nNone"
  670. if nr >= 0:
  671. if nr != k:
  672. return #continue
  673. label = ""
  674. if k in EXEC.label_exec:
  675. label = EXEC.label_exec[k]
  676. ifval = 0
  677. fx_only = 0
  678. fx_color = 0
  679. if k in EXEC.val_exec and len(EXEC.val_exec[k]) :
  680. sdata = EXEC.val_exec[k]
  681. have_fx = 0
  682. have_val = 0
  683. fix_count = 0
  684. BTN="go"
  685. if "CFG" in sdata:#["BUTTON"] = "GO"
  686. if "BUTTON" in sdata["CFG"]:
  687. BTN = sdata["CFG"]["BUTTON"]
  688. txt="{} {} {}\n{}".format(k+1,BTN,len(sdata)-1,label)
  689. _text = txt
  690. if len(sdata) > 1:
  691. ifval = 1
  692. val_color = 0
  693. for fix in sdata:
  694. if fix == "CFG":
  695. continue
  696. fix_count += 1
  697. for attr in sdata[fix]:
  698. if attr.startswith("_"):
  699. continue
  700. if "FX2" in sdata[fix][attr]:
  701. if sdata[fix][attr]["FX2"]:
  702. fx_color = 1
  703. have_fx += 1
  704. if "FX" in sdata[fix][attr]:
  705. if sdata[fix][attr]["FX"]:
  706. fx_color = 1
  707. have_fx += 1
  708. if "VALUE" in sdata[fix][attr]:
  709. if sdata[fix][attr]["VALUE"] is not None:
  710. val_color = 1
  711. have_val += 1
  712. #if val_color:
  713. # have_val += 1
  714. #if fx_color:
  715. # have_fx += 1
  716. if val_color:
  717. _bg = "gold"
  718. _ba = "#ffaa55"
  719. if fx_color:
  720. _fg = "blue"
  721. else:
  722. if fx_color:
  723. fx_only = 1
  724. else:
  725. _bg = "grey"
  726. _ba = "#aaa"
  727. sdata["CFG"]["HAVE-FX"] = have_fx
  728. sdata["CFG"]["HAVE-VAL"] = have_val
  729. sdata["CFG"]["FIX-COUNT"] = fix_count
  730. if "\n" in txt:
  731. txt1 = txt.split("\n")[0]
  732. _fg = "black"
  733. if ifval:
  734. if fx_only:
  735. _bg = "cyan"
  736. _ba = "#55d4ff"
  737. if "SEL" in txt1:
  738. _bg = "#77f"
  739. else:
  740. _bg = "grey"
  741. _fg = "darkgrey"
  742. if "SEL" in txt1:
  743. _fg = "blue"
  744. elif "ON" in txt1:
  745. _fg = "#040"
  746. elif "GO" in txt1:
  747. _fg = "#555"
  748. if "FL" in txt1:
  749. _fg = "#00e"
  750. out = {} # default
  751. out["fx"] = ""
  752. out["bg"] = "lightgrey"
  753. out["ba"] = "grey"
  754. out["fg"] = "grey"
  755. out["text"] = "?"
  756. out["fx"] = fx_color
  757. out["bg"] = _bg
  758. out["ba"] = _ba
  759. out["fg"] = _fg
  760. out["text"] = _text
  761. return out
  762. class Elem_Container():
  763. def __init__(self):
  764. self.commands = []
  765. self.val = {}
  766. self.elem = {}
  767. import lib.execlib as execlib
  768. class MASTER():
  769. def __init__(self):
  770. self.base = showlib.Base ()
  771. self.load()
  772. self._XX = 0
  773. self.all_attr =["DIM","PAN","TILT"]
  774. self.elem_attr = {}
  775. self.setup_elem = {} # Elem_Container()
  776. self.setup_cmd = ["SAVE\nSHOW","LOAD\nSHOW","NEW\nSHOW","SAVE\nSHOW AS","SAVE &\nRESTART","DRAW\nGUI","PRO\nMODE"]
  777. self.setup_cmd = ["SAVE\nSHOW","LOAD\nSHOW","NEW\nSHOW","SAVE\nSHOW AS","SAVE &\nRESTART","PRO\nMODE"]
  778. self.fx_main = Elem_Container()
  779. self.fx_main.commands =["REC-FX","FX OFF","\n"]
  780. self.fx_moves = Elem_Container()
  781. self.fx_moves.commands =[
  782. "FX:CIR","FX:PAN","FX:TILT", "WIDTH:\n100","DIR:\n0","INVERT:\n0","\n",
  783. "SHUFFLE:\n0","SIZE:\n","SPEED:\n","START:\n","OFFSET:\n","\n"
  784. ]
  785. #, "FX:SIN","FX:COS","FX:RAMP","FX:RAMP2","FX:FD","FX:ON","BASE:\n-"] #,"FX:RND" ]
  786. self.fx = Elem_Container()
  787. self.fx.commands =[
  788. "FX:DIM"," ", "WIDTH:\n25","WING:\n2","DIR:\n1","INVERT:\n1","\n","SHUFFLE:\n0"
  789. ,"SIZE:\n","SPEED:\n","START:\n","OFFSET:\n","BASE:\n-","2D-X:\n-","2D:MODE"
  790. ]
  791. self.fx_generic = Elem_Container()
  792. self.fx_generic.commands =["FX:SIN","FX:COS","FX:RAMP","FX:RAMP2","FX:FD","FX:ON","FX:STATIC"]
  793. self.fx_color = Elem_Container()
  794. self.fx_color.commands =["FX:RED","FX-C:A","FX-C:B"]
  795. self.commands = Elem_Container()
  796. self.commands.commands =["\n","ESC","CFG-BTN","LABEL","-","DEL","-","\n"
  797. ,"SELECT","FLASH","GO","-","MOVE","S-KEY","\n"
  798. ,"BLIND","CLEAR","REC","EDIT","COPY",".","\n"
  799. ]
  800. self.elem_exec = {}
  801. for i in range(8*8*8):
  802. if i not in EXEC.val_exec:
  803. name = "Preset:"+str(i+1)+":\nXYZ"
  804. #self.exec[i] = [i]
  805. EXEC.val_exec[i] = OrderedDict() # FIX
  806. EXEC.val_exec[i]["CFG"] = OrderedDict() # CONFIG
  807. EXEC.label_exec[i] = "-"
  808. modes.set_cb(self.xcb)
  809. def jclient_send(self,data):
  810. # namespace wraper
  811. if not modes.val("BLIND"):
  812. jclient_send(data)
  813. def button_refresh(self,name,color,color2=None,text="",fg=None):
  814. cprint("button_refresh",name,color)
  815. try:
  816. if color2 is None:
  817. color2 = color
  818. if text:
  819. text = "\n"+str(text)
  820. for elem in [self.commands.elem,self.fx.elem,self.fx_main.elem]:#,self.fx_moves]:
  821. if name in elem:
  822. print(" in xx.elem OK ",[name,color,name,text,color2])
  823. if name in ["BLIND","CLEAR"] and color == "lightgrey":
  824. color = "grey"
  825. color2 = "grey"
  826. elem[name]["bg"] = color
  827. elem[name]["text"] = name+ text
  828. elem[name].config(activebackground=color2)
  829. if fg:
  830. elem[name]["fg"] = fg
  831. # new version
  832. for elems in [self.fx_moves]:
  833. if name in elems.elem:
  834. print(" in fx_moves_elem OK",name)
  835. elem = elems.elem[name]
  836. cprint("elem",elem)
  837. elem.config(bg = color)
  838. elem.config(text = name+text)
  839. elem.config(activebackground=color2)
  840. if fg and "fg" in elem:
  841. elem["fg"] = fg
  842. except Exception as e:cprint("exc",self,e)
  843. def btn_cfg(self,nr,testing=0):
  844. cfg = EXEC._btn_cfg(nr)
  845. button = EXEC.btn_cfg(nr)
  846. label = EXEC.label(nr)
  847. def _cb(data):
  848. if not data:
  849. cprint("err443",self,"_cb",data)
  850. return None
  851. cprint("btn_cfg._cb()",data)
  852. if data:
  853. if "Button" in data and type(data["Button"]) is str:
  854. txt = data["Button"]
  855. EXEC.btn_cfg(nr,txt)
  856. self.elem_exec[nr].configure(text= EXEC.get_btn_txt(nr))
  857. if "Label" in data and type(data["Label"]) is str:
  858. txt = data["Label"]
  859. EXEC.label(nr,txt)
  860. self.elem_exec[nr].configure(text= EXEC.get_btn_txt(nr))
  861. if "Delay" in data and type(data["Delay"]) is str:
  862. txt = data["Delay"]
  863. try:
  864. txt = float(txt)
  865. if "DELAY" in cfg:
  866. cfg["DELAY"] = round(txt,2)
  867. except e as Exception:
  868. print("DELAY Exception",e)
  869. if "in-Fade" in data and type(data["in-Fade"]) is str:
  870. txt = data["in-Fade"]
  871. try:
  872. txt = float(txt)
  873. if "FADE" in cfg:
  874. cfg["FADE"] = round(txt,2)
  875. except e as Exception:
  876. print("in-Fade Exception",e)
  877. if "out-Fade" in data and type(data["out-Fade"]) is str:
  878. txt = data["out-Fade"]
  879. try:
  880. txt = float(txt)
  881. cfg["OUT-FADE"] = round(txt,2)
  882. except e as Exception:
  883. print("out-Fade Exception",e)
  884. modes.val("CFG-BTN",0)
  885. master._refresh_exec(nr=nr)
  886. dialog._cb = _cb
  887. if 1: # testing:
  888. dialog.ask_exec_config(str(nr+1),button=button,label=label,cfg=cfg)
  889. else:
  890. dialog.askstring("CFG-BTN","GO=GO FL=FLASH\nSEL=SELECT EXE:"+str(nr+1),initialvalue=txt)
  891. def label(self,nr):
  892. txt = EXEC.label(nr)
  893. def _cb(data):
  894. if not data:
  895. cprint("err443",self,"_cb",data)
  896. return None
  897. txt = data["Value"]
  898. cprint("label._cb()",nr,txt)
  899. if txt:
  900. EXEC.label(nr,txt)
  901. self.elem_exec[nr].configure(text = EXEC.get_btn_txt(nr))
  902. modes.val("LABEL", 0)
  903. master._refresh_exec(nr=nr)
  904. dialog._cb= _cb #_x(nr)
  905. dialog.askstring("LABEL","EXE:"+str(nr+1),initialvalue=txt)
  906. def xcb(self,mode,value=None):
  907. cprint(" Master.xcb mode:",str(mode).rjust(10," "),value,color="yellow",end="")
  908. if value:
  909. cprint("===== ON ======",color="green")
  910. txt = ""
  911. if mode == "REC-FX":
  912. modes.modes["REC"] = 1 # HACK !
  913. self.button_refresh("REC",color="red",text=txt)#,fg="blue")
  914. self.button_refresh(mode,color="red",text=txt)#,fg="blue")
  915. if value == 2:
  916. if mode in ["MOVE","COPY"]:
  917. txt="to"
  918. self.button_refresh(mode,color="orange",text=txt)#,fg="blue")
  919. else:
  920. if mode in ["MOVE","COPY"]:
  921. txt="from"
  922. self.button_refresh(mode,color="red",text=txt)#,fg="blue",text="from")
  923. else:
  924. cprint("===== OFF ======",color="red")
  925. if mode == "REC":
  926. modes.val("REC-FX",0)
  927. if mode == "REC-FX":
  928. modes.modes["REC"] = 0 # HACK !
  929. self.button_refresh("REC",color="lightgrey")#,fg="black")
  930. self.button_refresh(mode,color="lightgrey")#,fg="black")
  931. #modes.info()
  932. def load(self,fname=""):
  933. pass
  934. def exit(self):
  935. cprint("__del__",self)
  936. def refresh_exec(self):
  937. refresher_exec.reset() # = tkrefresh.Refresher()
  938. def _refresh_exec(self,nr=-1):
  939. s = time.time()
  940. cprint("EXEC.refresh_exec()")
  941. refresher_exec.reset() # = tkrefresh.Refresher()
  942. self._XX +=1
  943. self._nr_ok = 0
  944. ERR=""
  945. for nr in EXEC.val_exec:
  946. cfg = get_exec_btn_cfg(nr)
  947. try:
  948. b = self.elem_exec[nr]
  949. b.configure(fg=cfg["fg"],bg=cfg["bg"],activebackground=cfg["ba"],text=cfg["text"],fx=cfg["fx"])
  950. except Exception as e:
  951. ERR="EXEC WINDOW DOES NOT EXIST !"
  952. #cprint(" ERR MASTER._refresh_exec:",e,color="red")
  953. #if ERR:
  954. # cprint(" ERR MASTER._refresh_exec:",ERR,color="red")
  955. time.sleep(0.01)
  956. def refresh_fix(self):
  957. refresher_fix.reset() # = tkrefresh.Refresher()
  958. def _refresh_fix(self):
  959. cprint("_refresh_fix")
  960. s=time.time(); _XXX=0
  961. menu_buff = {"DIM":0,"DIM-SUB":0,"FIX":0,"FIX-SUB":0}
  962. elem_buffer = []
  963. for fix in FIXTURES.fixtures:
  964. sdata = FIXTURES.fixtures[fix]
  965. elem_attr_fix = None
  966. if fix in self.elem_attr:
  967. elem_attr_fix = self.elem_attr[fix]
  968. if "DIM" in sdata["ATTRIBUT"] and "_ACTIVE" in sdata["ATTRIBUT"] and len(sdata["ATTRIBUT"]) == 2:
  969. KEY = "DIM-SUB"
  970. else:
  971. KEY = "FIX-SUB"
  972. FIX = 0
  973. DIM = 0
  974. for attr in sdata["ATTRIBUT"]:
  975. _buff = {}
  976. row = sdata["ATTRIBUT"][attr]
  977. if attr.endswith("-FINE"):
  978. continue
  979. b_attr = attr
  980. if b_attr == "_ACTIVE":
  981. b_attr = "S"
  982. elem = None
  983. if elem_attr_fix:
  984. if b_attr not in elem_attr_fix:
  985. continue
  986. elem = elem_attr_fix[b_attr]
  987. if not elem:
  988. continue
  989. if "elem" not in _buff:
  990. _buff["elem"] = elem
  991. if not attr.startswith("_"):
  992. v2 = row["VALUE"]
  993. #_text = "{} {}".format(str(attr).rjust(4,"0"),str(v2).rjust(4,"0")) # ~0.2 sec
  994. _text = "{} {}".format(attr,v2)
  995. _buff["text"] = _text
  996. if row["ACTIVE"]:
  997. _buff["bg"] = "yellow"
  998. _buff["abg"] = "yellow"
  999. menu_buff[KEY] += 1
  1000. if b_attr == "S":
  1001. if KEY == "DIM-SUB":
  1002. DIM =1
  1003. else:
  1004. FIX =1
  1005. else:
  1006. _buff["bg"] = "grey"
  1007. _buff["abg"] = "grey"
  1008. if "FX" not in row: # insert FX2 excetption
  1009. row["FX"] = "" #OrderedDict()
  1010. if "FX2" not in row: # insert FX2 excetption
  1011. row["FX2"] = {} #OrderedDict()
  1012. #print("row",fix,row)
  1013. if row["FX"]:
  1014. _buff["fg"] = "blue"
  1015. elif row["FX2"]:
  1016. _buff["fg"] = "red"
  1017. else:
  1018. _buff["fg"] = "black"
  1019. elem_buffer.append(_buff)
  1020. menu_buff["FIX"] += FIX
  1021. menu_buff["DIM"] += DIM
  1022. try:
  1023. for row in elem_buffer:
  1024. elem = row["elem"]
  1025. if not elem:
  1026. continue
  1027. for e in row:
  1028. if e == "elem":
  1029. continue
  1030. v = row[e]
  1031. if e == "abg":
  1032. elem.config(activebackground=v)
  1033. else:
  1034. elem[e] = v
  1035. w = window_manager.get_win("FIXTURES")
  1036. if w:
  1037. w.update_idle_task()
  1038. except Exception as e:
  1039. cprint("exc434",e,color="red")
  1040. cprint("fix:",_XXX,round(time.time()-s,2),color="red");_XXX += 1
  1041. cprint(gui_menu)
  1042. menu_buff["FIX-SUB"] -= menu_buff["FIX"]
  1043. if menu_buff["FIX-SUB"]:
  1044. gui_menu.config("FIXTURES","bg","yellow")
  1045. gui_menu.config("FIXTURES","activebackground","yellow")
  1046. elif menu_buff["FIX"]:
  1047. gui_menu.config("FIXTURES","bg","orange")
  1048. gui_menu.config("FIXTURES","activebackground","orange")
  1049. else:
  1050. gui_menu.config("FIXTURES","bg","")
  1051. gui_menu.config("FIXTURES","activebackground","")
  1052. gui_menu.update("FIXTURES","{} : {}".format(menu_buff["FIX"],menu_buff["FIX-SUB"]))
  1053. menu_buff["DIM-SUB"] -= menu_buff["DIM"]
  1054. if menu_buff["DIM-SUB"]:
  1055. gui_menu.config("DIMMER","bg","yellow")
  1056. gui_menu.config("DIMMER","activebackground","yellow")
  1057. elif menu_buff["DIM"]:
  1058. gui_menu.config("DIMMER","bg","orange")
  1059. gui_menu.config("DIMMER","activebackground","orange")
  1060. else:
  1061. gui_menu.config("DIMMER","bg","")
  1062. gui_menu.config("DIMMER","activebackground","")
  1063. gui_menu.update("DIMMER","{} : {}".format(menu_buff["DIM"],menu_buff["DIM-SUB"]))
  1064. cprint("fix:",_XXX,round(time.time()-s),color="red"); _XXX += 1
  1065. def exec_rec(self,nr):
  1066. cprint("------- STORE EXEC")
  1067. _filter=""
  1068. if modes.val("REC-FX"):
  1069. _filter="ONLY-FX"
  1070. data = fixlib.get_active(FIXTURES.fixtures,_filter=_filter)
  1071. EXEC.rec(nr,data)
  1072. sdata=data
  1073. EXEC.val_exec[nr] = sdata
  1074. modes.val("REC-FX",0)
  1075. modes.val("REC",0)
  1076. cfg = get_exec_btn_cfg(nr)
  1077. #master._refresh_exec()
  1078. return 1
  1079. def exec_select(self,nr):
  1080. cprint("SELECT EXEC")
  1081. sdata = EXEC.val_exec[nr]
  1082. cmd = ""
  1083. for fix in sdata:
  1084. if fix == "CFG":
  1085. continue
  1086. for attr in sdata[fix]:
  1087. #v2 = sdata[fix][attr]["VALUE"]
  1088. #v2_fx = sdata[fix][attr]["FX"]
  1089. #print( self.data.elem_attr)
  1090. #if fix in self.elem_attr:
  1091. # if attr in self.elem_attr[fix]:
  1092. # elem = self.elem_attr[fix][attr]
  1093. FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
  1094. FIXTURES.fixtures[fix]["ATTRIBUT"]["_ACTIVE"]["ACTIVE"] = 1
  1095. #elem["bg"] = "yellow"
  1096. def exec_go(self,nr,val=None,xfade=None,event=None,button="",ptfade=None):
  1097. s=time.time()
  1098. t_start = time.time()
  1099. if xfade is None and FADE._is():
  1100. xfade = FADE.val()
  1101. if ptfade is None and FADE_move._is():
  1102. ptfade = FADE_move.val()
  1103. cprint("GO EXEC FADE",nr,val)
  1104. rdata = EXEC.get_raw_map(nr)
  1105. if not rdata:
  1106. return 0
  1107. cprint("???????")
  1108. cfg = EXEC.get_cfg(nr)
  1109. cprint("''''''''")
  1110. #virtcmd = FIXTURES.get_virtual(rdata)
  1111. if not cfg:
  1112. cprint("NO CFG",cfg,nr)
  1113. return 0
  1114. xFLASH = 0
  1115. value=None
  1116. cprint("exec_go",nr,cfg)
  1117. if modes.val("SELECT") or ( "BUTTON" in cfg and cfg["BUTTON"] == "SEL") and val and not button: #FLASH
  1118. self.exec_select(nr)
  1119. elif modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL") and not button: #FLASH
  1120. xFLASH = 1
  1121. xfade = 0
  1122. if type(val) is not type(None) and val == 0 :
  1123. value = "off"
  1124. xfade=0
  1125. if "OUT-FADE" in cfg:
  1126. xfade=cfg["OUT-FADE"]
  1127. if event:
  1128. if str(event.type) == "ButtonRelease" or event.type == '5' :
  1129. value = "off"
  1130. xfade=0
  1131. if "OUT-FADE" in cfg:
  1132. xfade=cfg["OUT-FADE"]
  1133. cprint("exec_go() FLUSH",value,color="red")
  1134. #print(";",rdata)
  1135. print(";",cfg)
  1136. fcmd = FIXTURES.update_raw(rdata,update=0)
  1137. #print(":",fcmd) # raw dmx
  1138. self._exec_go(rdata,cfg,fcmd,value,xfade=xfade,xFLASH=xFLASH,nr=nr)
  1139. elif not val:
  1140. cprint("exec_go() STOP",value,color="red")
  1141. elif button == "on" or ( modes.val("ON") or ( "BUTTON" in cfg and cfg["BUTTON"] in ["on","ON"])):
  1142. fcmd = FIXTURES.update_raw(rdata)
  1143. self._exec_go(rdata,cfg,fcmd,value,xfade=0,xFLASH=xFLASH)
  1144. elif button == "go" or ( modes.val("GO") or ( "BUTTON" in cfg and cfg["BUTTON"] in ["go","GO"])):
  1145. fcmd = FIXTURES.update_raw(rdata)
  1146. e=time.time()
  1147. print("_GO TIME:","{:0.02f}".format(e-s),int(e*10)/10)
  1148. self._exec_go(rdata,cfg,fcmd,value,xfade=xfade,xFLASH=xFLASH,ptfade=ptfade,nr=nr)
  1149. e=time.time()
  1150. print("GO TIME:","{:0.02f}".format(e-s),int(e*10)/10)
  1151. return
  1152. if not (modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL")): #FLASH
  1153. self.refresh_exec()
  1154. self.refresh_fix()
  1155. #print("IIIIIIIIIIIiiiiiiiiiiiiiiiiiii",nr,val)
  1156. #print(len(self.elem_exec) )
  1157. if len(self.elem_exec) > nr: # RED BUTTON IF PRESSED
  1158. #print("IIIIIIIIIIIiiiiiiiiiiiiiiiiiii",nr,val)
  1159. if val:# or value:
  1160. #self.elem_exec[nr].config(borderwidth=1)
  1161. self.elem_exec[nr].config(bg="red")
  1162. else:
  1163. self._refresh_exec()
  1164. cprint("exec_go",time.time()-t_start)
  1165. def _exec_go(self,rdata,cfg,fcmd,value=None,xfade=None,event=None,xFLASH=0,ptfade=0,nr=None):
  1166. if xfade is None and FADE._is():
  1167. xfade = FADE.val()
  1168. if ptfade is None and FADE_move._is():
  1169. ptfade = FADE_move.val()
  1170. cprint("EXEC._exec_go() len=",len(rdata),cfg)
  1171. if xfade is None:
  1172. xfade = cfg["FADE"]
  1173. if ptfade is None:
  1174. ptfade = cfg["FADE"]
  1175. #vcmd = reshape_exec( rdata ,value,[],xfade=xfade,fx=1)
  1176. #cprint(rdata,color="red")
  1177. vcmd = execlib.reshape_exec( rdata ,value,xfade=xfade,ptfade=ptfade)
  1178. cmd = []
  1179. delay=0
  1180. for i,v in enumerate(fcmd):
  1181. #print("go",i,v)
  1182. if xFLASH:
  1183. vcmd[i]["FLASH"] = 1
  1184. DMX = fcmd[i]["DMX"]
  1185. if "VALUE" in vcmd[i] and type(vcmd[i]["VALUE"]) is type(float):
  1186. vcmd[i]["VALUE"] = round(vcmd[i]["VALUE"],3)
  1187. if value is not None:
  1188. vcmd[i]["VALUE"] = value
  1189. if value == "off":
  1190. if "FX2" in vcmd:
  1191. vcmd[i]["FX2"]["TYPE"] = value
  1192. if "FIX" in fcmd:
  1193. vcmd[i]["FIX"] = fcmd["FIX"]
  1194. if DMX and vcmd[i]:
  1195. vcmd[i]["DMX"] = DMX
  1196. if type(nr) is not type(None):
  1197. vcmd[i]["EXEC"] = str(int(nr)+1)
  1198. cmd.append(vcmd[i])
  1199. if cmd and not modes.val("BLIND"):
  1200. jclient_send(cmd)
  1201. def render(self):
  1202. #Xroot.bind("<Key>",tk_event(fix=0,elem=None,attr="ROOT",data=self,mode="ROOT").cb)
  1203. #self.draw_input()
  1204. pass
  1205. ##draw_sub_dim
  1206. import tkgui.dialog as dialoglib
  1207. dialog = dialoglib.Dialog()
  1208. from tkgui.draw import *
  1209. from tkgui.GUI import *
  1210. class LOAD_SHOW_AND_RESTART():
  1211. def __init__(self,fname=""):
  1212. self.fname=fname
  1213. self.base = showlib.Base()
  1214. def cb(self,event=None,force=0):
  1215. print()
  1216. print()
  1217. print()
  1218. cprint("LOAD_SHOW_AND_RESTART.cb force={} name={}".format(force,self.fname),color="red" )
  1219. if not self.fname and not force:
  1220. return 0
  1221. if self.base.show_name == self.fname and not force:
  1222. cprint("filename is the same",self.fname)
  1223. return 0
  1224. if not force:
  1225. self.base._set(self.fname)
  1226. cprint("LOAD SHOW:",event,self.fname)
  1227. BASE_PATH = "/opt/LibreLight/Xdesk/"
  1228. cmd="_LibreLightDesk.py"
  1229. arg = ""
  1230. print("fork",[BASE_PATH,cmd,arg])
  1231. if "--easy" in sys.argv:
  1232. arg = "--easy"
  1233. movewin.process_kill(BASE_PATH+"tksdl/")
  1234. os.execl("/usr/bin/python3", BASE_PATH, cmd,arg)
  1235. sys.exit()
  1236. lf_nr = 0
  1237. from tkinter import PhotoImage
  1238. _shift_key = 0
  1239. class WindowManager():
  1240. def __init__(self):
  1241. self.windows = {}
  1242. self.obj = {}
  1243. self.nr= 0
  1244. self.first=""
  1245. self.window_init_buffer = {}
  1246. def update(self,w,name="",obj=None):
  1247. name = str(name)
  1248. for k in self.windows:
  1249. if k == name:
  1250. self.windows[str(name)] = w
  1251. self.obj[str(name)] = obj
  1252. def new(self,w,name="",obj=None,wcb=None):
  1253. name = str(name)
  1254. if wcb and name:
  1255. self.window_init_buffer[name] = wcb
  1256. if not self.first:
  1257. if name:
  1258. self.first = name
  1259. else:
  1260. self.first = str(self.nr)
  1261. if w:
  1262. w.tk.state(newstate='normal')
  1263. w.tk.attributes('-topmost',True)
  1264. if name:
  1265. self.windows[str(name)] = w
  1266. self.obj[str(name)] = obj
  1267. else:
  1268. self.windows[str(self.nr)] = w
  1269. self.obj[str(self.nr)] = obj
  1270. self.nr+=1
  1271. def mainloop(self):
  1272. self.windows[self.first].mainloop()
  1273. def get_win(self,name):
  1274. #cprint(".get_win(name) =",name)
  1275. name = str(name)
  1276. if name in self.windows:
  1277. out = self.windows[name]
  1278. #cprint(out)
  1279. return out
  1280. def get(self,name):
  1281. return get_win(name)
  1282. def get_obj(self,name):
  1283. name = str(name)
  1284. if name in self.windows:
  1285. out = self.obj[name]
  1286. return out
  1287. def create(self,name):
  1288. #cprint( "create WindowContainer",name)
  1289. if name in self.window_init_buffer:
  1290. c = self.window_init_buffer[name]
  1291. w,obj,cb_ok = c.create()
  1292. window_manager.update(w,name,obj)
  1293. if cb_ok:
  1294. cb_ok()
  1295. resize = 1
  1296. if "resize" in c.args:
  1297. if not c.args["resize"]:
  1298. resize = 0
  1299. #if resize:
  1300. libwin.get_window_position(_filter=name,win=w)
  1301. if name in ["ENCODER"]:
  1302. global _ENCODER_WINDOW
  1303. _ENCODER_WINDOW = w
  1304. if name in ["DIMMER","FIXTURES"]:
  1305. refresher_fix.reset() # = tkrefresh.Refresher()
  1306. def _check_window_is_open(self,name):
  1307. try:
  1308. win = self.windows[name]
  1309. if "tk" not in dir(win):
  1310. return 0
  1311. return win.tk.winfo_exists()
  1312. except Exception as e:
  1313. cprint("_check_window_is_open err",e,color="red")
  1314. def top(self,name):
  1315. name = str(name)
  1316. if name not in self.windows:
  1317. cprint(name," not in self.windows",self.windows.keys())
  1318. return
  1319. if not self._check_window_is_open(name):
  1320. cprint(" ",name," window is closed ! ")
  1321. self.create(name)
  1322. w = self.windows[name]
  1323. if not str(type(w)).startswith("<class 'function'>"):
  1324. w.tk.attributes('-topmost',True)
  1325. w.tk.attributes('-topmost',False)
  1326. w.tk.update_idletasks()
  1327. else:
  1328. print(" 2.2-",w)
  1329. w()
  1330. class Console():
  1331. def __init__(self):
  1332. pass
  1333. def flash_off(self,fix):
  1334. pass
  1335. def fx_off(self,fix):
  1336. cprint("Console.fx_off()",fix)
  1337. if not fix or fix == "all":
  1338. j = []
  1339. if 0:
  1340. jdata = {'VALUE': None, 'args': [], 'FX': 'alloff::::', 'FADE': 2, 'DMX': '0'}
  1341. j.append(jdata)
  1342. jdata = {'VALUE': None, 'args': [], 'FX': 'alloff::::', 'FADE': 2,'FLASH':1, 'DMX': '0'}
  1343. j.append(jdata)
  1344. else:
  1345. jdata = {'VALUE': None, 'args': [], 'FX2': {"TYPE":"alloff"}, 'FADE': 2,'FLASH':1, 'DMX': '1'}
  1346. j.append(jdata)
  1347. if not modes.val("BLIND"):
  1348. jclient_send(j)
  1349. return 0
  1350. window_manager = WindowManager()
  1351. CONSOLE = Console()
  1352. EXEC = execlib.EXEC()
  1353. def refresh_exec_mc():
  1354. time.sleep(10)
  1355. while 1:
  1356. try:
  1357. pass#
  1358. execlib.exec_set_mc(EXEC.label_exec,EXEC.val_exec)
  1359. except Exception as e:
  1360. print("refresh_exec_mc ERR",e)
  1361. time.sleep(5) # extra time
  1362. time.sleep(3) # refresh time
  1363. thread.start_new_thread(refresh_exec_mc,())
  1364. FIXTURES = fixlib.Fixtures()
  1365. FIXTURES.gui = GUIHandler()
  1366. def LOAD_SHOW():
  1367. EXEC.load_exec()
  1368. FIXTURES.load_patch()
  1369. LOAD_SHOW()
  1370. master = MASTER()
  1371. print("main",__name__)
  1372. import lib.tkrefresh as tkrefresh
  1373. refresher_fix = tkrefresh.Refresher()
  1374. refresher_fix.time_delta = 0.50
  1375. refresher_fix.name = "fix"
  1376. refresher_fix.reset()
  1377. refresher_fix.cb = master._refresh_fix
  1378. refresher_exec = tkrefresh.Refresher()
  1379. refresher_exec.time_delta = 10 #0
  1380. refresher_exec.name = "exec"
  1381. refresher_exec.reset()
  1382. refresher_exec.cb = master._refresh_exec
  1383. refresher_exec = tkrefresh.Refresher()
  1384. refresher_exec.time_delta = 10 #0
  1385. refresher_exec.name = "exec-fader"
  1386. refresher_exec.reset()
  1387. refresher_exec.cb = refresh_exec_fader_cfg
  1388. def loops(**args):
  1389. time.sleep(5) # wait until draw all window's
  1390. cprint("-> run loops")
  1391. thread.start_new_thread(refresher_fix.loop,())
  1392. thread.start_new_thread(refresher_exec.loop,())
  1393. thread.start_new_thread(loops,())
  1394. class window_create_sdl_buffer():
  1395. def __init__(self,args,cls,data,cb_ok=None,scroll=0,gui=None):
  1396. self.args = args.copy()
  1397. self.cls = cls
  1398. self.cb_ok = cb_ok
  1399. self.data = data
  1400. self.scroll = scroll
  1401. self.gui = gui
  1402. def create(self,hidde=0):
  1403. cprint()
  1404. return [self.cls,self.cls,None] #w,obj,cb_ok
  1405. def open_sdl_window():
  1406. cprint("open_sdl_window ... delay 1sec",color="yellow")
  1407. time.sleep(1)
  1408. if "--easy" not in sys.argv:
  1409. movewin.startup_all_sdl()
  1410. thread.start_new_thread(open_sdl_window,())
  1411. mc_fix = MC_FIX()
  1412. def mc_fix_loop():
  1413. global master
  1414. time.sleep(5)
  1415. c=0
  1416. while 1:
  1417. try:
  1418. if c >= 1:
  1419. #master._refresh_exec()
  1420. c=0
  1421. for nr in EXEC.val_exec:
  1422. cfg = get_exec_btn_cfg(nr)
  1423. except Exception as e:
  1424. print("MC_FIX EXCEPTION",e)
  1425. #raise e
  1426. c+=1
  1427. try:
  1428. data = FIXTURES.fixtures
  1429. mc_fix.set(index="fix",data=data)
  1430. except Exception as e:
  1431. print("MC_FIX EXCEPTION",e)
  1432. time.sleep(1/10)
  1433. thread.start_new_thread(mc_fix_loop,())
  1434. if __run_main:
  1435. cprint("main")
  1436. TOP = libtk._POS_TOP + 15
  1437. L0 = libtk._POS_LEFT
  1438. L1 = libtk._POS_LEFT + 95
  1439. L2 = libtk._POS_LEFT + 920
  1440. W1 = 810
  1441. H1 = 550
  1442. HTB = 23 # hight of the titlebar from window manager
  1443. pos_list = libwin.read_window_position()
  1444. #geo = libwin.split_window_position(pos_list,name)
  1445. #args = {"title":name,"master":0,"width":600,"height":113,"left":L1+5,"top":TOP+5+HTB*2+H1}
  1446. #geo = libwin.split_window_position(pos_list,name)
  1447. #if geo:
  1448. # args.update(geo)
  1449. data = []
  1450. #data.append({"text":"COMMAND"})
  1451. #data.append({"text":"CONFIG"})
  1452. data.append({"text":"PATCH"})
  1453. data.append({"text":"DIMMER"})
  1454. data.append({"text":"FIXTURES"})
  1455. data.append({"text":"FIX-LIST"})
  1456. data.append({"text":"EXEC","name":"EXEC-BTN"})
  1457. data.append({"text":"EXEC-WING"})
  1458. data.append({"text":"---"})
  1459. data.append({"text":"SETUP"})
  1460. data.append({"text":"COMMAND"})
  1461. data.append({"text":"LIVE"})
  1462. data.append({"text":"FX"})
  1463. data.append({"text":"ENCODER"})
  1464. data.append({"text":"COLORPICKER","name":"COLOR"})
  1465. data.append({"text":"---"})
  1466. data.append({"text":"FIXTURE-EDITOR","name":"FIX-EDIT"})
  1467. data.append({"text":"CONFIG"})
  1468. data.append({"text":"SDL-MIDI"})
  1469. data.append({"text":"CLOCK"})
  1470. data.append({"text":"RAY-DMX"})
  1471. data.append({"text":"SDL-DMX"})
  1472. data.append({"text":"SDL-VPU"})
  1473. data.append({"text":"SDL-OSZI"})
  1474. data.append({"text":"---"})
  1475. data.append({"text":"---"})
  1476. data.append({"text":"- DEMO -"})
  1477. data.append({"text":"---"})
  1478. data.append({"text":"TK-EXEC"})
  1479. data.append({"text":"SDL-STAGE"})
  1480. data.append({"text":"SDL-Shader"})
  1481. data.append({"text":"TABLE"})
  1482. #data.append({"text":"MASTER-WING"})
  1483. name="MAIN"
  1484. args = {"title":"MAIN","master":1,"width":80,"height":H1,"left":L0,"top":TOP,"resize":1}
  1485. geo = libwin.split_window_position(pos_list,name)
  1486. if geo:
  1487. args.update(geo)
  1488. cls = GUI_menu
  1489. cb_ok = None
  1490. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1491. window_manager.new(None,name,wcb=c)
  1492. window_manager.top(name)
  1493. gui_menu_gui = window_manager.get_win(name)
  1494. gui_menu = window_manager.get_obj(name)
  1495. master._refresh_fix()
  1496. # =======================================================================
  1497. name="EXEC"
  1498. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1499. geo = libwin.split_window_position(pos_list,name)
  1500. if geo:
  1501. args.update(geo)
  1502. data = EXEC
  1503. cls = draw_exec #GUI_ExecWingLayout
  1504. cb_ok = None #set_exec_fader_all
  1505. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1506. window_manager.new(None,name,wcb=c)
  1507. if libwin.split_window_show(pos_list,_filter=name):
  1508. window_manager.top(name)
  1509. #print(dir(cls))
  1510. #print(cls)
  1511. #sys.exit()
  1512. # =======================================================================
  1513. name="SDL-MIDI"
  1514. def sdl_config():
  1515. cmd="nohup /usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/midi.py &"
  1516. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/midi.py " #&"
  1517. print(cmd)
  1518. #os.popen(cmd)
  1519. def xyz123(cmd):
  1520. os.system(cmd)
  1521. thread.start_new_thread(xyz123,(cmd,))
  1522. return [None,None,None]
  1523. #class window_create_sdl_buffer():
  1524. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1525. geo = libwin.split_window_position(pos_list,name)
  1526. if geo:
  1527. args.update(geo)
  1528. data = []
  1529. cls = sdl_config #: None #GUI_CONF
  1530. cb_ok = None
  1531. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1532. window_manager.new(None,name,wcb=c)
  1533. if libwin.split_window_show(pos_list,_filter=name):
  1534. window_manager.top(name)
  1535. # =======================================================================
  1536. name="SDL-VPU"
  1537. def sdl_config():
  1538. cmd="python3 /opt/LibreLight/Xdesk/vpu/watchdog_vpu.py -single"
  1539. print(cmd)
  1540. def xyz123(cmd):
  1541. os.system(cmd)
  1542. thread.start_new_thread(xyz123,(cmd,))
  1543. return [None,None,None]
  1544. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1545. geo = libwin.split_window_position(pos_list,name)
  1546. if geo:
  1547. args.update(geo)
  1548. data = []
  1549. cls = sdl_config #: None #GUI_CONF
  1550. cb_ok = None
  1551. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1552. window_manager.new(None,name,wcb=c)
  1553. if libwin.split_window_show(pos_list,_filter=name):
  1554. window_manager.top(name)
  1555. # =======================================================================
  1556. name="SDL-OSZI"
  1557. def sdl_config():
  1558. cmd="python3 /opt/LibreLight/ASP/monitor/oszi_grid.py"
  1559. print(cmd)
  1560. def xyz123(cmd):
  1561. os.system(cmd)
  1562. thread.start_new_thread(xyz123,(cmd,))
  1563. return [None,None,None]
  1564. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1565. geo = libwin.split_window_position(pos_list,name)
  1566. if geo:
  1567. args.update(geo)
  1568. data = []
  1569. cls = sdl_config #: None #GUI_CONF
  1570. cb_ok = None
  1571. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1572. window_manager.new(None,name,wcb=c)
  1573. if libwin.split_window_show(pos_list,_filter=name):
  1574. window_manager.top(name)
  1575. # =======================================================================
  1576. name="SDL-DMX"
  1577. def sdl_config():
  1578. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/dmx.py " #&"
  1579. print(cmd)
  1580. def xyz123(cmd):
  1581. os.system(cmd)
  1582. thread.start_new_thread(xyz123,(cmd,))
  1583. return [None,None,None]
  1584. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1585. geo = libwin.split_window_position(pos_list,name)
  1586. if geo:
  1587. args.update(geo)
  1588. data = []
  1589. cls = sdl_config #: None #GUI_CONF
  1590. cb_ok = None
  1591. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1592. window_manager.new(None,name,wcb=c)
  1593. if libwin.split_window_show(pos_list,_filter=name):
  1594. window_manager.top(name)
  1595. # =======================================================================
  1596. name="RAY-DMX"
  1597. def sdl_config():
  1598. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tkray/dmx.py " #&"
  1599. print(cmd)
  1600. def xyz123(cmd):
  1601. os.system(cmd)
  1602. thread.start_new_thread(xyz123,(cmd,))
  1603. return [None,None,None]
  1604. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1605. geo = libwin.split_window_position(pos_list,name)
  1606. if geo:
  1607. args.update(geo)
  1608. data = []
  1609. cls = sdl_config #: None #GUI_CONF
  1610. cb_ok = None
  1611. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1612. window_manager.new(None,name,wcb=c)
  1613. if libwin.split_window_show(pos_list,_filter=name):
  1614. window_manager.top(name)
  1615. # =======================================================================
  1616. name="TK-EXEC"
  1617. def sdl_config():
  1618. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tkgui/EXEC.py " #&"
  1619. print(cmd)
  1620. def xyz123(cmd):
  1621. os.system(cmd)
  1622. thread.start_new_thread(xyz123,(cmd,))
  1623. return [None,None,None]
  1624. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1625. geo = libwin.split_window_position(pos_list,name)
  1626. if geo:
  1627. args.update(geo)
  1628. data = []
  1629. cls = sdl_config #: None #GUI_CONF
  1630. cb_ok = None
  1631. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1632. window_manager.new(None,name,wcb=c)
  1633. if libwin.split_window_show(pos_list,_filter=name):
  1634. window_manager.top(name)
  1635. # =======================================================================
  1636. name="SDL-STAGE"
  1637. def sdl_config():
  1638. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk//3d/stage_3d.py " #&"
  1639. print(cmd)
  1640. def xyz123(cmd):
  1641. os.system(cmd)
  1642. thread.start_new_thread(xyz123,(cmd,))
  1643. return [None,None,None]
  1644. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1645. geo = libwin.split_window_position(pos_list,name)
  1646. if geo:
  1647. args.update(geo)
  1648. data = []
  1649. cls = sdl_config #: None #GUI_CONF
  1650. cb_ok = None
  1651. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1652. window_manager.new(None,name,wcb=c)
  1653. if libwin.split_window_show(pos_list,_filter=name):
  1654. window_manager.top(name)
  1655. # =======================================================================
  1656. name="SDL-Shader"
  1657. def sdl_config():
  1658. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk//3d/demo_shaders.py " #&"
  1659. print(cmd)
  1660. #os.popen(cmd)
  1661. def xyz123(cmd):
  1662. os.system(cmd)
  1663. thread.start_new_thread(xyz123,(cmd,))
  1664. return [None,None,None]
  1665. #class window_create_sdl_buffer():
  1666. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1667. geo = libwin.split_window_position(pos_list,name)
  1668. if geo:
  1669. args.update(geo)
  1670. data = []
  1671. cls = sdl_config #: None #GUI_CONF
  1672. cb_ok = None
  1673. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1674. window_manager.new(None,name,wcb=c)
  1675. if libwin.split_window_show(pos_list,_filter=name):
  1676. window_manager.top(name)
  1677. # =======================================================================
  1678. name="FIX-LIST"
  1679. def sdl_config():
  1680. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/fix.py " #&"
  1681. print(cmd)
  1682. #os.popen(cmd)
  1683. def xyz123(cmd):
  1684. os.system(cmd)
  1685. thread.start_new_thread(xyz123,(cmd,))
  1686. return [None,None,None]
  1687. #class window_create_sdl_buffer():
  1688. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1689. geo = libwin.split_window_position(pos_list,name)
  1690. if geo:
  1691. args.update(geo)
  1692. data = []
  1693. cls = sdl_config #: None #GUI_CONF
  1694. cb_ok = None
  1695. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1696. window_manager.new(None,name,wcb=c)
  1697. if libwin.split_window_show(pos_list,_filter=name):
  1698. window_manager.top(name)
  1699. # =======================================================================
  1700. name="CONFIG"
  1701. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1702. geo = libwin.split_window_position(pos_list,name)
  1703. if geo:
  1704. args.update(geo)
  1705. data = []
  1706. cls = GUI_CONF
  1707. cb_ok = None
  1708. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1709. window_manager.new(None,name,wcb=c)
  1710. if libwin.split_window_show(pos_list,_filter=name):
  1711. window_manager.top(name)
  1712. # =======================================================================
  1713. name="DIMMER"
  1714. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1715. geo = libwin.split_window_position(pos_list,name)
  1716. if geo:
  1717. args.update(geo)
  1718. cls = GUI_DIM
  1719. data = FIXTURES
  1720. ok_cb=None
  1721. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1722. window_manager.new(None,name,wcb=c)
  1723. if libwin.split_window_show(pos_list,_filter=name):
  1724. window_manager.top(name)
  1725. # =======================================================================
  1726. name="FIXTURES"
  1727. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1728. geo = libwin.split_window_position(pos_list,name)
  1729. if geo:
  1730. args.update(geo)
  1731. cls = GUI_FIX
  1732. ok_cb=None
  1733. data = FIXTURES
  1734. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1735. window_manager.new(None,name,wcb=c)
  1736. if libwin.split_window_show(pos_list,_filter=name):
  1737. window_manager.top(name)
  1738. # =======================================================================
  1739. name="FIXTURE-EDITOR"
  1740. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1741. geo = libwin.split_window_position(pos_list,name)
  1742. if geo:
  1743. args.update(geo)
  1744. data=[]
  1745. for i in range(12*6):
  1746. data.append({"text"+str(i):"test"})
  1747. import tkgui.fix as guifix
  1748. cls = guifix.GUI_FixtureEditor
  1749. cb_ok = None
  1750. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1751. window_manager.new(None,name,wcb=c)
  1752. # =======================================================================
  1753. name="MASTER-WING"
  1754. args = {"title":name,"master":0,"width":75,"height":405,"left":L0,"top":TOP+H1-220,"resize":0}
  1755. geo = libwin.split_window_position(pos_list,name)
  1756. if geo:
  1757. args.update(geo)
  1758. data=[]
  1759. for i in range(2):
  1760. data.append({"MASTER"+str(i):"MASTER"})
  1761. cls = GUI_MasterWingLayout #(w1,data)
  1762. cb_ok = None
  1763. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1764. window_manager.new(None,name,wcb=c)
  1765. if libwin.split_window_show(pos_list,_filter=name):
  1766. window_manager.top(name)
  1767. # =======================================================================
  1768. name="EXEC-WING"
  1769. args = {"title":name,"master":0,"width":600,"height":415,"left":L1,"top":TOP+H1+HTB*2,"H1":H1,"W1":W1}
  1770. geo = libwin.split_window_position(pos_list,name)
  1771. if geo:
  1772. args.update(geo)
  1773. data=[]
  1774. for i in range(10*3):
  1775. data.append({"EXEC"+str(i):"EXEC"})
  1776. cls = GUI_ExecWingLayout
  1777. cb_ok = set_exec_fader_all
  1778. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1779. window_manager.new(None,name,wcb=c)
  1780. if libwin.split_window_show(pos_list,_filter=name):
  1781. window_manager.top(name)
  1782. # =======================================================================
  1783. name="ENCODER"
  1784. args = {"title":name,"master":0,"width":620,"height":113,"left":L0+710,"top":TOP+H1+15+HTB*2}
  1785. geo = libwin.split_window_position(pos_list,name)
  1786. if geo:
  1787. args.update(geo)
  1788. cls = draw_enc #(master,w.tk)#Xroot)
  1789. cb_ok = None
  1790. data = FIXTURES #master
  1791. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1792. window_manager.new(None,name,wcb=c)
  1793. if libwin.split_window_show(pos_list,_filter=name):
  1794. window_manager.top(name)
  1795. # =======================================================================
  1796. name = "SETUP"
  1797. args = {"title":name +" SHOW:"+master.base.show_name,
  1798. "master":0,"width":445,"height":42,"left":L1+10+W1,"top":TOP,"resize":10}
  1799. args["title"] = "SETUP SHOW:"+master.base.show_name
  1800. geo = libwin.split_window_position(pos_list,name)
  1801. try:
  1802. geo["width"] = args["width"]
  1803. geo["height"] = args["height"]
  1804. except:pass
  1805. if geo:
  1806. args.update(geo)
  1807. cls = draw_setup #(master,w.tk)
  1808. data = []
  1809. cb_ok = None
  1810. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1811. window_manager.new(None,name,wcb=c)
  1812. if libwin.split_window_show(pos_list,_filter=name):
  1813. window_manager.top(name)
  1814. # =======================================================================
  1815. name = "COMMAND"
  1816. args = {"title":name,"master":0,"width":415,"height":130,"left":L1+10+W1,"top":TOP+81,"resize":10}
  1817. geo = libwin.split_window_position(pos_list,name)
  1818. if geo:
  1819. args.update(geo)
  1820. cls = draw_command #(master,w.tk)
  1821. data = []
  1822. cb_ok = None
  1823. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1824. window_manager.new(None,name,wcb=c)
  1825. if libwin.split_window_show(pos_list,_filter=name):
  1826. window_manager.top(name)
  1827. # =======================================================================
  1828. name = "LIVE"
  1829. args = {"title":name,"master":0,"width":415,"height":42,"left":L1+10+W1,"top":TOP+235,"resize":10}
  1830. geo = libwin.split_window_position(pos_list,name)
  1831. if geo:
  1832. args.update(geo)
  1833. cls = draw_live #(master,w.tk)
  1834. data = []
  1835. cb_ok = None
  1836. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1837. window_manager.new(None,name,wcb=c)
  1838. if libwin.split_window_show(pos_list,_filter=name):
  1839. window_manager.top(name)
  1840. # =======================================================================
  1841. name = "CLOCK"
  1842. args = {"title":name,"master":0,"width":335,"height":102,"left":L1+10+W1+80,"top":TOP+H1+HTB+160,"resize":0}
  1843. geo = libwin.split_window_position(pos_list,name)
  1844. if geo:
  1845. args.update(geo)
  1846. cclock = X_CLOCK()
  1847. cls = cclock.draw_clock
  1848. data = []
  1849. cb_ok = None
  1850. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1851. window_manager.new(None,name,wcb=c)
  1852. if libwin.split_window_show(pos_list,_filter=name):
  1853. window_manager.top(name)
  1854. # =======================================================================
  1855. name="FX"
  1856. args = {"title":name,"master":0,"width":415,"height":297+30,"left":L1+10+W1,"top":TOP+302,"resize":1}
  1857. geo = libwin.split_window_position(pos_list,name)
  1858. if geo:
  1859. args.update(geo)
  1860. cls = draw_fx #(master,w.tk)
  1861. data = []
  1862. cb_ok = None
  1863. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1864. window_manager.new(None,name,wcb=c)
  1865. if libwin.split_window_show(pos_list,_filter=name):
  1866. window_manager.top(name)
  1867. # =======================================================================
  1868. name="PATCH"
  1869. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP,"foot":1,"head":1}
  1870. geo = libwin.split_window_position(pos_list,name)
  1871. if geo:
  1872. args.update(geo)
  1873. cls = GUI_PATCH
  1874. data = FIXTURES
  1875. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1876. window_manager.new(None,name,wcb=c) #,obj)
  1877. if libwin.split_window_show(pos_list,_filter=name):
  1878. window_manager.top(name)
  1879. # =======================================================================
  1880. name="COLORPICKER"
  1881. args = {"title":name,"master":0,"width":600,"height":113,"left":L1+5,"top":TOP+5+HTB*2+H1}
  1882. geo = libwin.split_window_position(pos_list,name)
  1883. if geo:
  1884. args.update(geo)
  1885. cls = draw_colorpicker #(master,w.tk,FIXTURES,master)
  1886. data = [FIXTURES,master]
  1887. cb_ok = None #FIXTURES
  1888. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1889. window_manager.new(None,name,wcb=c)
  1890. if libwin.split_window_show(pos_list,_filter=name):
  1891. window_manager.top(name)
  1892. # =======================================================================
  1893. name="TABLE"
  1894. args = {"title":name,"master":0,"width":600,"height":113,"left":L1+5,"top":TOP+5+HTB*2+H1}
  1895. geo = libwin.split_window_position(pos_list,name)
  1896. if geo:
  1897. args.update(geo)
  1898. #cls = draw_colorpicker #(master,w.tk,FIXTURES,master)
  1899. cls = TableFrame #(root=w.tk)#,left=80,top=620)
  1900. data = [FIXTURES,master]
  1901. cb_ok = None #FIXTURES
  1902. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1903. window_manager.new(None,name,wcb=c)
  1904. if libwin.split_window_show(pos_list,_filter=name):
  1905. window_manager.top(name)
  1906. def wm_mainloop():
  1907. try:
  1908. window_manager.mainloop()
  1909. finally:
  1910. print()
  1911. print()
  1912. cprint(" - EXIT -",color="red")
  1913. BASE_PATH = "/opt/LibreLight/Xdesk/"
  1914. movewin.process_kill(BASE_PATH+"tksdl/")
  1915. master.exit()
  1916. sys.exit()
  1917. wm_mainloop() #window_manager.mainloop()
  1918. # thread.start_new_thread(wm_mainloop,()) # break TKINTER !!!
  1919. while 1:
  1920. print("loop..")
  1921. time.sleep(1)