_LibreLightDesk.py 69 KB

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