_LibreLightDesk.py 67 KB

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