_LibreLightDesk.py 82 KB

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