_LibreLightDesk.py 71 KB

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