_LibreLightDesk.py 70 KB

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