_LibreLightDesk.py 115 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670
  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. IS_GUI = 0
  18. if __name__ == "__main__":
  19. IS_GUI = 1
  20. import tool.movewin as movewin
  21. import lib.fixlib as fixlib
  22. import lib.libwin as libwin
  23. rnd_id = str(random.randint(100,900))
  24. rnd_id += " beta"
  25. rnd_id2 = ""
  26. rnd_id3 = ""
  27. _ENCODER_WINDOW = None
  28. import tool.git as git
  29. rnd_id += git.get_all()
  30. try:
  31. xtitle = __file__
  32. except:
  33. xtitle = "__file__"
  34. if "/" in xtitle:
  35. xtitle = xtitle.split("/")[-1]
  36. sys.stdout.write("\x1b]2;"+str(xtitle)+" "+str(rnd_id)+"\x07") # terminal title
  37. HOME = os.getenv('HOME')
  38. space_font = None
  39. if IS_GUI:
  40. import tkinter
  41. import tkinter as tk
  42. from tkinter import font
  43. import tkinter.simpledialog
  44. from idlelib.tooltip import Hovertip
  45. INIT_OK = 0
  46. _global_short_key = 1
  47. path = "/home/user/LibreLight/"
  48. #os.chdir(path)
  49. f = open(path+"init.txt","r")
  50. lines=f.readlines()
  51. f.close()
  52. out = []
  53. for line in lines:
  54. if line != "EASY\n":
  55. out.append(line)
  56. f = open(path+"init.txt","w")
  57. f.writelines(out)
  58. f.close()
  59. if "--easy" in sys.argv:
  60. f = open(path+"init.txt","a")
  61. f.write("EASY\n")
  62. f.close()
  63. if not os.path.isdir(path+"show/EASY"):
  64. cmd = "cp -vrf '/opt/LibreLight/Xdesk/home/LibreLight/show/EASY' '{}/show/EASY' ".format(path)
  65. print(cmd)
  66. #input()
  67. os.system(cmd)
  68. # check if EASY show exist !
  69. from lib.cprint import *
  70. cprint("________________________________")
  71. import lib.zchat as chat
  72. import lib.motion as motion
  73. from collections import OrderedDict
  74. _FIX_FADE_ATTR = ["PAN","TILT","DIM","RED","GREEN","BLUE","WHITE","CYAN","YELLOW","MAGENTA","FOCUS","ZOOM","FROST"]
  75. _POS_LEFT = 0
  76. _POS_TOP = 15
  77. _config = []
  78. try:
  79. h = os.environ["HOME"]
  80. lines = [{}]
  81. try:
  82. f = open(h +"/LibreLight/config.json")
  83. lines = f.readlines()
  84. except FileNotFoundError as e: #Exception as e:
  85. f = open(h +"/LibreLight/config.json","w")
  86. f.write('{"POS_TOP":0}\n{"POS_LEFT":0}')
  87. f.close()
  88. cprint("Exception:",e)
  89. cprint("config read")
  90. for line in lines:
  91. line=line.strip()
  92. print(" config:",line)
  93. row = json.loads(line)
  94. _config.append(row)
  95. except Exception as e:
  96. cprint("Exception:",e)
  97. try:
  98. for row in _config:
  99. #print(" config:",row)
  100. if "POS_LEFT" in row:
  101. _POS_LEFT = int(row["POS_LEFT"])
  102. if "POS_TOP" in row:
  103. _POS_TOP = int(row["POS_TOP"])
  104. except Exception as e:
  105. cprint("Exception:",e)
  106. CUES = OrderedDict()
  107. groups = OrderedDict()
  108. class Modes():
  109. def __init__(self):
  110. self.modes = {}
  111. self.__cfg = {}
  112. self.__cb = None
  113. def val(self,mode,value=None): #like jquery
  114. if value is not None:
  115. return self.set(mode,value)
  116. elif mode in self.modes:
  117. return self.modes[mode]
  118. def get(self,mode,value=None):
  119. return self.val(mode,value)
  120. def __check(self,mode):
  121. if mode not in self.modes:
  122. self.modes[mode] = 0
  123. self.__cfg[mode] = 0
  124. def cfg(self,mode,data={}):
  125. self.__check(mode)
  126. if type(data) is dict:
  127. for k in data:
  128. v = data[k]
  129. if v not in self.__cfg:
  130. self.__cfg[k] = v
  131. return 1
  132. elif type(data) is str:
  133. if data in self.__cfg:
  134. return self.__cfg[data]
  135. def set(self,mode,value):
  136. protected = ["BLIND","CLEAR","REC-FX"]
  137. self.__check(mode)
  138. if mode == "CLEAR":
  139. return 1
  140. elif mode == "ESC":
  141. for m in self.modes:
  142. cprint("ESC",m)
  143. if m == "COPY":
  144. PRESETS.clear_copy()
  145. if m == "MOVE":
  146. PRESETS.clear_move()
  147. if m != "BLIND":
  148. self.modes[m] = 0
  149. self.callback(m)
  150. return 1
  151. if value:
  152. for m in self.modes:
  153. if m not in protected and mode not in protected and m != mode:
  154. #cprint("-#-# clear mode",mode,m,value,color="red")
  155. if self.modes[m]:
  156. self.modes[m]= 0
  157. self.callback(m)
  158. if self.modes[mode] and value == 1:
  159. if modes == "MOVE":
  160. PRESETS.clear_move()
  161. if modes == "COPY":
  162. PRESETS.clear_copy()
  163. self.modes[mode] = 0 # value
  164. else:
  165. self.modes[mode] = value #1 #value
  166. else:
  167. self.modes[mode] = 0 #value
  168. if modes == "COPY":
  169. PRESETS.clear_copy()
  170. if modes == "MOVE":
  171. PRESETS.clear_move()
  172. self.callback(mode)
  173. return value
  174. def set_cb(self,cb):
  175. if cb:
  176. self.__cb = cb
  177. def callback(self,mode):
  178. if self.__cb is not None and mode in self.modes:
  179. value = self.modes[mode]
  180. self.__cb(mode=mode,value=value)
  181. modes = Modes()
  182. #modes.val("BLIND", 0)
  183. #modes.modes["BLIND"] = 0
  184. modes.modes["ESC"] = 0
  185. modes.modes["REC"] = 0
  186. modes.modes["EDIT"] = 0
  187. modes.modes["MOVE"] = 0
  188. modes.modes["FLASH"] = 0
  189. modes.modes["GO"] = 0
  190. modes.modes["DEL"] = 0
  191. modes.modes["REC-FX"] = 0
  192. modes.modes["SELECT"] = 0
  193. modes.modes["CFG-BTN"] = 0
  194. modes.modes["LABEL"] = 0
  195. def xcb(mode,value=None):
  196. cprint("xcb","MODE CALLBACK",mode,value)
  197. if mode == "REC-FX":
  198. cprint("xcb",modes.val("REC-FX"))
  199. #modes.set_cb(xcb)
  200. POS = ["PAN","TILT","MOTION"]
  201. COLOR = ["RED","GREEN","BLUE","COLOR"]
  202. BEAM = ["GOBO","G-ROT","PRISMA","P-ROT","FOCUS","SPEED"]
  203. INT = ["DIM","SHUTTER","STROBE","FUNC"]
  204. #client = chat.tcp_sender(port=50001)
  205. def set_exec_fader_cfg(nr,val,label="",color=""):
  206. exec_wing = window_manager.get_obj(name="EXEC-WING")
  207. if not exec_wing:
  208. return
  209. try:
  210. if len(exec_wing.fader_elem) > nr:
  211. exec_wing.fader_elem[nr].attr["text"] = label
  212. cfg = get_exec_btn_cfg(nr+80)
  213. if cfg:
  214. exec_wing.fader_elem[nr].attr["bg"] = cfg["bg"]
  215. exec_wing.fader_elem[nr].attr["fg"] = cfg["fg"]
  216. exec_wing.fader_elem[nr].attr["fx"] = cfg["fx"]
  217. except Exception as e:
  218. cprint("- exception:",e)
  219. print(nr,val,label)
  220. def set_exec_fader(nr,val,label="",color="",info="info",change=0):
  221. exec_wing = window_manager.get_obj(name="EXEC-WING")
  222. if not exec_wing:
  223. return
  224. try:
  225. exec_wing.set_fader(nr,val,color=color,info=info,change=change)
  226. except Exception as e:
  227. pass
  228. cprint("- exception:",e)
  229. print(nr,val,label)
  230. raise e
  231. def set_exec_fader_all():
  232. print()
  233. cprint( "set_exec_fader_all()",color="green")
  234. for nr in range(10):
  235. _label = PRESETS.label_presets[nr+80] # = label
  236. print(" _label",_label)
  237. set_exec_fader(nr,0,label=_label)
  238. set_exec_fader_cfg(nr,0,label=_label)
  239. def refresh_exec_fader_cfg():
  240. cprint( "set_exec_fader_all()",color="green")
  241. for nr in range(10):
  242. _label = PRESETS.label_presets[nr+80] # = label
  243. #print("_label",_label)
  244. set_exec_fader_cfg(nr,0,label=_label)
  245. # remote input - start (memcached)
  246. def JCB(x,sock=None):
  247. for i in x:
  248. jv = x[i]
  249. try:
  250. jv = json.loads(jv)
  251. jv = jv[0]
  252. #print(jv)
  253. v = jv["iVAL"]
  254. #exec_wing.set_fader(0,v)
  255. set_exec_fader(0,v)
  256. set_exec_fader(1,200-v)
  257. set_exec_fader(2,int(v/2+10))
  258. except Exception as e:
  259. cprint("exception",e)
  260. print(sys.exc_info()[2])
  261. #print("remote in:",round(time.time(),0),"x",i,v)
  262. if __name__ == "__main__":
  263. r1_server = chat.Server(port=30002)
  264. def server1_loop():
  265. while 1:
  266. r1_server.poll(cb=JCB)
  267. time.sleep(1/90)
  268. thread.start_new_thread(server1_loop,()) # SERVER
  269. # remote input - end
  270. #chat.dbg=1
  271. class DEVENT():
  272. def __init__(self):
  273. #if "keysym" in dir(event):
  274. #if "Escape" ==
  275. #event.keysym:
  276. #event.num == 1:
  277. self.keysym = ""
  278. self.num = 1
  279. self.type = ""
  280. import lib.jsbc as JSBC
  281. if __name__ == "__main__":
  282. # external GUI
  283. r_server = chat.Server(port=30003,cb=JSBC.JSCB)
  284. def server_loop():
  285. while 1:
  286. r_server.poll(cb=JSBC.JSCB)
  287. #time.sleep(1/90)
  288. thread.start_new_thread(server_loop,()) # SERVER
  289. import lib.fifo as FIFO
  290. if __name__ == "__main__":
  291. # external GUI
  292. f_server = FIFO.read_loop() #chat.Server(port=30003,cb=JSBC.JSCB)
  293. f_server.loop(sleep=1)
  294. def f_server_read_loop():
  295. time.sleep(10)
  296. print("FIFO read_loop() __ ")
  297. while 1:
  298. try:
  299. data = f_server.read()
  300. for jdata in data:
  301. # JSCB [{'event': 'EXEC', 'EXEC': 161, 'VAL': 0, 'NR-KEY': 1}]
  302. print("FIFO:",jdata)
  303. ok=1
  304. for i in ["event","VAL","EXEC"]:
  305. if i not in jdata:
  306. ok=0
  307. if ok:
  308. if jdata["event"] != "EXEC":
  309. continue
  310. if "EXEC" in jdata:
  311. exec_nr = jdata["EXEC"]
  312. if "VAL" in jdata:
  313. val = jdata["VAL"]
  314. master.preset_go(exec_nr-1,xfade=None,val=val)
  315. else:
  316. time.sleep(0.02)
  317. except KeyboardInterrupt as e:
  318. raise e
  319. except Exception as e:
  320. print("FIFO ERR1",e)
  321. thread.start_new_thread(f_server_read_loop,()) # SERVER
  322. # read memcachd
  323. memcache = None
  324. try:
  325. import memcache
  326. except Exception as e:
  327. cprint("Exception IMPORT ERROR",e)
  328. class MC_FIX():
  329. def __init__(self,server="127.0.0.1",port=11211):
  330. cprint("MC.init() ----------" ,server,port,color="red")
  331. try:
  332. #self.mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  333. self.mc = memcache.Client(['{}:{}'.format(server,port)], debug=0)
  334. #self.init()
  335. except Exception as e:
  336. cprint("-- Exception",e)
  337. def set(self,index="fix",data=[]):
  338. #time.sleep(5)
  339. if 1: #while 1:
  340. #print("MC.send",index) #,data)
  341. index = self.mc.get("index")
  342. #if index:
  343. # for i in index:
  344. # print(" key",i)
  345. self.mc.set("fix", data)
  346. #examles
  347. #self.mc.set("some_key", "Some value")
  348. #self.value = mc.get("some_key")
  349. #self.mc.set("another_key", 3)
  350. #self.mc.delete("another_key")
  351. class MC():
  352. def __init__(self,server="127.0.0.1",port=11211):
  353. cprint("MC.init() ----------" ,server,port,color="red")
  354. try:
  355. #self.mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  356. self.mc = memcache.Client(['{}:{}'.format(server,port)], debug=0)
  357. #self.init()
  358. except Exception as e:
  359. cprint("-- Exception",e)
  360. # def init(self):
  361. data = {}
  362. start = time.time()
  363. delta = start
  364. index = self.mc.get("index")
  365. if index:
  366. for i in index:
  367. print(" key",i)
  368. self.last_fader_val = [-1]*512
  369. self.fader_map = []
  370. for i in range(30+1):
  371. self.fader_map.append({"UNIV":0,"DMX":0})
  372. try:
  373. fname = HOME + "/LibreLight/fader.json"
  374. f = open(fname)
  375. lines = f.readlines()
  376. cprint("FADER MAP",fname)
  377. for i,line in enumerate(lines):
  378. jdata = json.loads(line)
  379. print(" fader_map ->>",i,jdata)
  380. self.fader_map[i] = jdata
  381. except Exception as e:
  382. cprint("-- Except Fader_map",e)
  383. #exit()
  384. def ok(self):
  385. if self.mc:
  386. return 1
  387. return 0
  388. def test(self):
  389. if not self.ok():
  390. return
  391. self.mc.set("some_key", "Some value")
  392. self.value = mc.get("some_key")
  393. self.mc.set("another_key", 3)
  394. self.mc.delete("another_key")
  395. def loop(self):
  396. thread.start_new_thread(self._loop,())
  397. if not self.ok():
  398. return
  399. def _loop(self):
  400. cprint("++++++++++ start.memcachd read loop",self )
  401. while 1:
  402. send = 0
  403. #print("+")
  404. try:
  405. ip="10.10.10.13:0"
  406. #ip="ltp-out:0"
  407. #print(ip)
  408. x=self.mc.get(ip)
  409. if x:
  410. #print(ip,x)
  411. #val = x[501-1]
  412. #val = x[141-1]
  413. for i, line in enumerate(self.fader_map):
  414. try:
  415. #print(i,line)
  416. dmx = int(line["DMX"])
  417. if dmx > 0:
  418. val = x[dmx-1]
  419. #print("mc val",val)
  420. #print("dmx_in change:",[i,val])
  421. change = 0
  422. if i < len(self.last_fader_val):
  423. if self.last_fader_val[i] != val:
  424. self.last_fader_val[i] = val
  425. print("dmx_in change:",[i,val])
  426. change = 1
  427. set_exec_fader(nr=i,val=val,color="#aaa",info="dmx_in",change=change)
  428. except Exception as e:
  429. cprint("MC exc:",e,color="red")
  430. traceback.print_exc()
  431. pass
  432. time.sleep(1/10)
  433. except Exception as e:
  434. cprint("exc", e)
  435. time.sleep(1)
  436. _mc=MC()
  437. _mc.loop()
  438. console = chat.Client() #port=50001)
  439. def jclient_send(data):
  440. t_start = time.time()
  441. jtxt = data
  442. jdatas = []
  443. for jdata in data:
  444. if "CMD" in jdata:
  445. try:
  446. jdatas.append(jdata)
  447. except Exception as e:
  448. cprint("jclient_send, Exception DMX ",color="red")
  449. cprint("",jdata,color="red")
  450. cprint("-----",color="red")
  451. elif "DMX" in jdata:
  452. try:
  453. jdata["DMX"] = int(jdata["DMX"])
  454. dmx = jdata["DMX"]
  455. if "ATTR" not in jdata:
  456. # for fx off
  457. jdatas.append(jdata)
  458. else:
  459. fix = "00000"
  460. attr = "00000"
  461. if "FIX" in jdata:
  462. fix = jdata["FIX"]
  463. if "ATTR" in jdata:
  464. attr = jdata["ATTR"]
  465. dmx_fine = FIXTURES.get_dmx(fix,attr+"-FINE")
  466. if jdata["DMX"] != dmx_fine and dmx > 0 and dmx_fine > 0:
  467. jdata["DMX-FINE"] = dmx_fine
  468. if "DMX-FINE" in jdata:
  469. if jdata["DMX-FINE"] <= 0:
  470. del jdata["DMX-FINE"]
  471. if jdata["ATTR"].startswith("_"):
  472. pass # ignore attr._ACTIVE
  473. else:#
  474. jdata["time"] = t_start
  475. jdatas.append(jdata)
  476. #cprint("-- ",jdata,color="red")
  477. except Exception as e:
  478. cprint("jclient_send, Exception DMX ",color="red")
  479. cprint("",jdata,color="red")
  480. cprint(e,color="red")
  481. cprint("-----",color="red")
  482. jtxt = jdatas
  483. jtxt = json.dumps(jtxt)
  484. jtxt = jtxt.encode()
  485. console.send( jtxt ) #b"\00 ")
  486. cprint("{:0.04} sec.".format(time.time()-t_start),color="yellow")
  487. cprint("{:0.04} tick".format(time.time()),color="yellow")
  488. def _highlight(fix,_attr="DIM"):
  489. " patch test button "
  490. cprint("highlight",fix,"1")
  491. if fix not in FIXTURES.fixtures:
  492. return None
  493. d = FIXTURES.fixtures[fix]
  494. #for k,v in d.items():
  495. # cprint("-",k,v)
  496. DMX = d["DMX"] + d["UNIVERS"]*512
  497. if "ATTRIBUT" in d:
  498. ATTR= d["ATTRIBUT"]
  499. data = {"VALUE":200,"DMX":1}
  500. attr = ""
  501. if _attr in ATTR:
  502. attr = _attr
  503. else:
  504. return #stop
  505. cprint(attr,ATTR[attr])
  506. old_val = ATTR[attr]["VALUE"]
  507. data["DMX"] = DMX + ATTR[attr]["NR"]-1
  508. cprint(attr,ATTR[attr])
  509. cprint(data)
  510. for i in range(3):
  511. cprint("highlight",fix,"0")
  512. data["VALUE"] = 100
  513. jclient_send([data])
  514. time.sleep(0.1)
  515. cprint("highlight",fix,"1")
  516. data["VALUE"] = 234
  517. jclient_send([data])
  518. time.sleep(0.3)
  519. cprint("highlight",fix,"0")
  520. data["VALUE"] = old_val
  521. jclient_send([data])
  522. def highlight2(fix,attr="DIM"):
  523. def x():
  524. highlight(fix,attr=attr)
  525. return x
  526. def highlight(fix):
  527. cprint("highlight",fix)
  528. thread.start_new_thread(_highlight,(fix,"DIM"))
  529. thread.start_new_thread(_highlight,(fix,"RED"))
  530. thread.start_new_thread(_highlight,(fix,"GREEN"))
  531. thread.start_new_thread(_highlight,(fix,"BLUE"))
  532. class ValueBuffer():
  533. def __init__(self,_min=0,_max=255):
  534. self._value = 2
  535. self._on = 1
  536. self._min=_min
  537. self._max=_max
  538. def check(self):
  539. if self._value < self._min:
  540. self._value = self._min
  541. elif self._value > self._max:
  542. self._value = self._max
  543. def inc(self,value=None):
  544. if value is not None:
  545. if type(value) is float:
  546. self._value += round(value,4)
  547. else:
  548. self._value += value
  549. self.check()
  550. return self._value
  551. def val(self,value=None):
  552. if value is not None:
  553. if type(value) is float:
  554. self._value = round(value,4)
  555. else:
  556. self._value = value
  557. self.check()
  558. return self._value
  559. def on(self):
  560. self._on = 1
  561. def off(self):
  562. self._on = 0
  563. def _is(self):
  564. if self._on:
  565. return 1
  566. return 0
  567. FADE = ValueBuffer() #2 #0.1 #1.13
  568. FADE.val(2.0)
  569. FADE_move = ValueBuffer() #2 #0.1 #1.13
  570. FADE_move.val(4.0)
  571. DELAY = ValueBuffer() #2 #0.1 #1.13
  572. DELAY.off()
  573. DELAY.val(0.2)
  574. fx_prm_main = {}
  575. 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}
  576. fx_color = {"A":"red","B":"blue"}
  577. 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}
  578. fx_x_modes = ["spiral","left","right","up","down","left_right","up_down"]
  579. fx_modes = ["RED","GREEN","BLUE","MAG","YELLOW","CYAN"]
  580. fx_mo = ["fade","on","rnd","ramp","ramp2","cosinus","sinus","static"]
  581. class FX_handler():
  582. def __init__():
  583. pass
  584. class dummy_event():
  585. def __init__(self):
  586. self.num =0
  587. self.type = 4 #press 5 release
  588. self.set_value=-1
  589. from lib import matrix
  590. import lib.fxlib as fxlib
  591. def process_matrix(xfixtures):
  592. fx_x = fx_prm["2D-X"]
  593. fx_mod = fx_x_modes[fx_prm["2D:MODE"]]
  594. r = _process_matrix(xfixtures,fx_x,fx_mod)
  595. return r
  596. def _process_matrix(xfixtures,fx_x,fx_mod):
  597. fix_count = len(xfixtures)
  598. cprint("----",fx_x,fx_mod)
  599. if fx_x > 1 and fix_count > fx_x:
  600. try:
  601. w=fx_x
  602. h=int(fix_count/fx_x)
  603. if fx_mod == "spiral":
  604. _map = matrix.spiral(w,h)
  605. elif fx_mod == "up_down":
  606. _map = matrix.up_down(w,h)
  607. elif fx_mod == "left_right":
  608. _map = matrix.left_right(w,h)
  609. elif fx_mod == "left":
  610. _map = matrix.left(w,h)
  611. elif fx_mod == "right":
  612. _map = matrix.right(w,h)
  613. elif fx_mod == "up":
  614. _map = matrix.up(w,h)
  615. elif fx_mod == "down":
  616. _map = matrix.down(w,h)
  617. else:
  618. return xfixtures # do nothing
  619. matrix.mprint(xfixtures,w,h)
  620. out = ["0"]*(w*h)
  621. for i,f in enumerate(xfixtures):
  622. if i < w*h:
  623. j = int(_map[i])
  624. cprint(["i:",i,"f:",f,"j:",j])
  625. out[j] = f
  626. matrix.mprint(out,w,h)
  627. xfixtures = out
  628. except Exception as e:
  629. cprint("matrix exception",e)
  630. return xfixtures
  631. class Xevent_fx():
  632. """ global input event Handeler for short cut's ... etc
  633. """
  634. def __init__(self,fix,elem,attr=None,data=None,mode=None):
  635. self.fix = fix
  636. self.data = data
  637. self.attr = attr
  638. self.elem = elem
  639. self.mode = mode
  640. def fx(self,event):
  641. cprint("Xevent.fx",self.attr,self.fix,event)
  642. fx2 = {}
  643. if self.attr == "FX:RED":
  644. if event.num == 4:
  645. cprint("FX:COLOR CHANGE",fx_prm,color="red")
  646. txt = "FX:RED"
  647. fx_prm["MODE"] += 1
  648. if fx_prm["MODE"] >= len(fx_modes):
  649. fx_prm["MODE"]=0
  650. txt = "FX:\n"+fx_modes[fx_prm["MODE"]]
  651. master.fx_color.elem["FX:RED"]["text"] = txt
  652. elif event.num == 5:
  653. cprint("FX:COLOR CHANGE",fx_prm,color="red")
  654. txt = "FX:RED"
  655. fx_prm["MODE"] -= 1
  656. if fx_prm["MODE"] < 0:
  657. fx_prm["MODE"]= len(fx_modes)-1
  658. txt = "FX:\n"+fx_modes[fx_prm["MODE"]]
  659. master.fx_color.elem["FX:RED"]["text"] = txt
  660. if self.attr.startswith("2D"):
  661. if event.num == 4:
  662. cprint("2D-X: CHANGE",fx_prm,color="red")
  663. txt = "2D-X:"
  664. fx_prm["2D:MODE"] += 1
  665. if fx_prm["2D:MODE"] >= len(fx_x_modes):
  666. fx_prm["2D:MODE"]=0
  667. txt = "2D:MODE\n"+fx_x_modes[fx_prm["2D:MODE"]]
  668. master.fx.elem["2D:MODE"]["text"] = txt
  669. elif event.num == 5:
  670. cprint("2D-X: CHANGE",fx_prm,color="red")
  671. txt = "2D-X:"
  672. fx_prm["2D:MODE"] -= 1
  673. if fx_prm["2D:MODE"] < 0:
  674. fx_prm["2D:MODE"]= len(fx_x_modes)-1
  675. txt = "2D:MODE\n"+fx_x_modes[fx_prm["2D:MODE"]]
  676. master.fx.elem["2D:MODE"]["text"] = txt
  677. elif event.num == 1:
  678. xfixtures = []
  679. fix_active =FIXTURES.get_active()
  680. for fix in fix_active:
  681. if fix == "CFG":
  682. continue
  683. xfixtures.append(fix)
  684. if not xfixtures:
  685. cprint("470 fx() ... init no fixture selected",color="red")
  686. return 0
  687. xfixtures = process_matrix(xfixtures)
  688. wing_buffer = fxlib.process_wings(xfixtures,fx_prm)
  689. fxlib.process_effect(wing_buffer,fx_prm,fx_prm_move,modes,jclient_send,master,FIXTURES,fx_name=self.attr)
  690. def command(self,event,mode=""):
  691. cprint("fx_command",self.mode)
  692. if self.mode == "FX":
  693. prm = fx_prm
  694. ct = self.data.fx
  695. if self.mode == "FX-MOVE":
  696. prm = fx_prm_move
  697. ct = self.data.fx_moves
  698. if 1:
  699. if self.attr.startswith("SIZE:"):#SIN":
  700. #global fx_prm
  701. k = "SIZE"
  702. if event.num == 1:
  703. _stats = [0,30,100,255]
  704. if prm[k] in _stats:
  705. idx = _stats.index(prm[k])+1
  706. if idx > len(_stats)-1: #rotate
  707. idx = 0
  708. prm[k] = _stats[idx]
  709. else:
  710. prm[k] = _stats[1]
  711. elif event.num == 3:
  712. prm[k] =100
  713. elif event.num == 4:
  714. if prm[k] <= 0:
  715. prm[k] = 1
  716. prm[k] +=5
  717. elif event.num == 5:
  718. prm[k] -=5
  719. #prm[k] =int(prm[k])
  720. if prm[k] > 4000:
  721. prm[k] = 4000
  722. if prm[k] < 0:
  723. prm[k] =0
  724. if prm[k] == 6: #bug
  725. prm[k] =5
  726. ct.elem[self.attr]["text"] = "SIZE:\n{:0.0f}".format(prm[k])
  727. cprint(prm)
  728. elif self.attr.startswith("SPEED:"):#SIN":
  729. #global prm
  730. k = "SPEED"
  731. if event.num == 1:
  732. _stats = [0,5,25,30,100,255]
  733. if prm[k] in _stats:
  734. idx = _stats.index(prm[k])+1
  735. if idx > len(_stats)-1: #rotate
  736. idx = 0
  737. prm[k] = _stats[idx]
  738. else:
  739. prm[k] = 0
  740. elif event.num == 3:
  741. prm[k] = 10
  742. elif event.num == 4:
  743. if prm[k] <= 0:
  744. prm[k] = 0.06
  745. elif prm[k] < 5:
  746. prm[k] *=1.2
  747. else:
  748. prm[k] +=5 #1.1
  749. elif event.num == 5:
  750. if prm[k] <= 5:
  751. prm[k] *=0.8
  752. else:
  753. prm[k] -= 5 #1.1
  754. #prm[k] =int(prm[k])
  755. if prm[k] > 4000:
  756. prm[k] = 4000
  757. if prm[k] < 0.05:
  758. prm[k] =0
  759. if prm[k] > 5 and prm[k] < 10: #bug
  760. prm[k] =5
  761. if prm[k] < 0:
  762. ct.elem[self.attr]["text"] = "SPEED:\noff".format(prm[k])
  763. else:
  764. ct.elem[self.attr]["text"] = "SPEED:\n{:0.02f}".format(prm[k])
  765. cprint(prm)
  766. elif self.attr.startswith("START:"):#SIN":
  767. #global prm
  768. k = "START"
  769. if event.num == 1:
  770. pass
  771. elif event.num == 2:
  772. pass
  773. elif event.num == 4:
  774. if prm[k] <= 0:
  775. prm[k] = 1
  776. prm[k] += 5 #1.1
  777. elif event.num == 5:
  778. prm[k] -= 5 #1.1
  779. #prm[k] =int(prm[k])
  780. if prm[k] > 4000:
  781. prm[k] = 4000
  782. if prm[k] < 5:
  783. prm[k] =0
  784. if prm[k] == 6: #bug
  785. prm[k] =5
  786. ct.elem[self.attr]["text"] = "START:\n{:0.0f}".format(prm[k])
  787. cprint(prm)
  788. elif self.attr.startswith("WIDTH:"):#SIN":
  789. #global prm
  790. k = "WIDTH"
  791. if event.num == 1:
  792. _stats = [0,25,50,75,10]
  793. if prm[k] in _stats:
  794. idx = _stats.index(prm[k])+1
  795. if idx > len(_stats)-1: #rotate
  796. idx = 0
  797. prm[k] = _stats[idx]
  798. else:
  799. prm[k] = 25
  800. elif event.num == 2:
  801. prm[k] = 50
  802. elif event.num == 3:
  803. prm[k] = 100
  804. elif event.num == 4:
  805. if prm[k] <= 0:
  806. prm[k] = 1
  807. elif prm[k] == 50:
  808. prm[k] = 100
  809. elif prm[k] == 5:
  810. prm[k] = 25
  811. elif prm[k] == 25:
  812. prm[k] = 50
  813. else:
  814. prm[k] += 5 #*=1.1
  815. elif event.num == 5:
  816. if prm[k] == 10:
  817. prm[k] = 5
  818. elif prm[k] == 25:
  819. prm[k] = 10
  820. elif prm[k] == 50:
  821. prm[k] = 25
  822. elif prm[k] == 100:
  823. prm[k] = 50
  824. #else:
  825. # prm[k] -=5 #/=1.1
  826. #prm[k] =int(prm[k])
  827. if prm[k] < 0:
  828. prm[k] = 0
  829. if prm[k] > 100:
  830. prm[k] = 100
  831. if prm[k] == 6: #bug
  832. prm[k] =5
  833. if prm[k] > 25 and prm[k] < 50: #bug
  834. prm[k] =50
  835. if prm[k] > 50 and prm[k] < 75: #bug
  836. prm[k] =75
  837. if prm[k] > 75 and prm[k] < 100: #bug
  838. prm[k] =100
  839. ct.elem[self.attr]["text"] = "WIDTH:\n{:0.0f}".format(prm[k])
  840. cprint(prm)
  841. elif self.attr.startswith("DIR:"):#SIN":
  842. #global prm
  843. k = "DIR"
  844. if event.num == 1:
  845. prm[k] = 1
  846. elif event.num == 3:
  847. prm[k] = -1
  848. elif event.num == 4:
  849. prm[k] = 1
  850. elif event.num == 5:
  851. prm[k] =-1
  852. txt = prm[k]
  853. ct.elem[self.attr]["text"] = "DIR:\n{}".format(prm[k])
  854. cprint(prm)
  855. elif self.attr.startswith("SHUFFLE:"):#SIN":
  856. #global prm
  857. k = "SHUFFLE"
  858. if event.num == 1:
  859. prm[k] = 0
  860. elif event.num == 3:
  861. prm[k] = 1
  862. elif event.num == 4:
  863. prm[k] = 1
  864. elif event.num == 5:
  865. prm[k] =0
  866. if prm[k] == 6: #bug ?
  867. prm[k] =5
  868. ct.elem[self.attr]["text"] = k+":\n{}".format(prm[k])
  869. cprint(prm)
  870. elif self.attr.startswith("INVERT:"):#SIN":
  871. #global prm
  872. k = "INVERT"
  873. if event.num == 1:
  874. prm[k] = 0
  875. elif event.num == 3:
  876. prm[k] = 1
  877. elif event.num == 4:
  878. prm[k] = 1
  879. elif event.num == 5:
  880. prm[k] =0
  881. if prm[k] == 6: #bug ?
  882. prm[k] =5
  883. ct.elem[self.attr]["text"] = k+":\n{}".format(prm[k])
  884. cprint(prm)
  885. elif self.attr.startswith("2D-X:"):#SIN":
  886. #global prm
  887. k = "2D-X"
  888. if event.num == 1:
  889. prm[k] = 1
  890. elif event.num == 3:
  891. prm[k] = 2
  892. elif event.num == 4:
  893. prm[k] += 1
  894. elif event.num == 5:
  895. prm[k] -=1
  896. if prm[k] > 100:
  897. prm[k] = 100
  898. if prm[k] < 1:
  899. prm[k] =1
  900. txt = prm[k]
  901. ct.elem[self.attr]["text"] = "2D-X:\n{}".format(prm[k])
  902. cprint(prm)
  903. elif self.attr.startswith("WING:"):#SIN":
  904. #global prm
  905. k = "WING"
  906. if event.num == 1:
  907. prm[k] = 1
  908. elif event.num == 3:
  909. prm[k] = 2
  910. elif event.num == 4:
  911. prm[k] += 1
  912. elif event.num == 5:
  913. prm[k] -=1
  914. if prm[k] > 100:
  915. prm[k] = 100
  916. if prm[k] < 1:
  917. prm[k] =1
  918. txt = prm[k]
  919. ct.elem[self.attr]["text"] = "WING:\n{}".format(prm[k])
  920. cprint(prm)
  921. elif self.attr.startswith("OFFSET:"):#SIN":
  922. #global prm
  923. k = "OFFSET"
  924. if event.num == 1:
  925. prm[k] = 50
  926. elif event.num == 2:
  927. prm[k] *= 2
  928. elif event.num == 3:
  929. prm[k] = 100
  930. elif event.num == 4:
  931. if prm[k] <= 0:
  932. prm[k] = 1
  933. prm[k] +=5 #*=1.1
  934. elif event.num == 5:
  935. prm[k] -=5 #/=1.1
  936. #prm[k] =int(prm[k])
  937. #if prm[k] > 512:
  938. # prm[k] = 512
  939. if prm[k] < 5:
  940. prm[k] =0
  941. if prm[k] == 6: #bug
  942. prm[k] =5
  943. ct.elem[self.attr]["text"] = "OFFSET:\n{:0.0f}".format(prm[k])
  944. cprint(prm)
  945. elif self.attr.startswith("BASE:"):
  946. k = "BASE"
  947. if event.num == 1:
  948. prm[k] = "-"
  949. elif event.num == 3:
  950. prm[k] = "0"
  951. elif event.num == 4:
  952. prm[k] = "+"
  953. elif event.num == 5:
  954. prm[k] = "0"
  955. ct.elem[self.attr]["text"] = "BASE:\n{}".format(prm[k])
  956. elif self.attr.startswith("2D:"):#SIN":
  957. self.fx(event)
  958. elif self.attr.startswith("FX:"):#SIN":
  959. self.fx(event)
  960. elif self.attr == "FX OFF":
  961. if event.num == 1:
  962. FIXTURES.fx_off("all")
  963. CONSOLE.fx_off("all")
  964. CONSOLE.flash_off("all")
  965. master._refresh_fix()
  966. return 0
  967. #if event.num == 1:
  968. elif self.attr == "REC-FX":
  969. cprint("ELSE",self.attr)
  970. modes.val(self.attr,1)
  971. return 0
  972. def cb(self,event):
  973. cprint("EVENT_fx cb",self.attr,self.mode,event,color='yellow')
  974. cprint(["type",event.type,"num",event.num])
  975. try:
  976. change = 0
  977. if self.mode.startswith("FX"):
  978. self.command(event)
  979. return 0
  980. except Exception as e:
  981. cprint("== cb EXCEPT",e,color="red")
  982. cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
  983. cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
  984. return 1
  985. class BLINKI():
  986. def __init__(self,e):
  987. self.e = e
  988. def blink(self):
  989. e = self.e
  990. e.config(bg='green')
  991. duration = 150
  992. for i in range(8):
  993. d = i * duration
  994. if i % 2 == 0:
  995. e.after(d, lambda: e.config(bg='white')) # after 1000ms
  996. e.after(d, lambda: e.config(activebackground='white')) # after 1000ms
  997. else:
  998. e.after(d, lambda: e.config(bg='orange')) # after 1000ms
  999. e.after(d, lambda: e.config(activebackground='orange')) # after 1000ms
  1000. i+=1
  1001. duration = 150
  1002. e.after(d, lambda: e.config(bg='white')) # after 1000ms
  1003. e.after(d, lambda: e.config(activebackground='white')) # after 1000ms
  1004. class Xevent():
  1005. """ global input event Handeler for short cut's ... etc
  1006. """
  1007. def __init__(self,fix,elem,attr=None,data=None,mode=None):
  1008. self.fix = fix
  1009. self.data=data
  1010. self.attr = attr
  1011. self.elem = elem
  1012. self.mode = mode
  1013. def _save_show(self):
  1014. self.elem["bg"] = "orange"
  1015. self.elem["text"] = "SAVING..."
  1016. self.elem["bg"] = "red"
  1017. self.elem.config(activebackground="orange")
  1018. modes.val(self.attr,1)
  1019. PRESETS.backup_presets()
  1020. FIXTURES.backup_patch()
  1021. libwin.save_window_position()
  1022. movewin.store_all_sdl()
  1023. self.elem["bg"] = "lightgrey"
  1024. self.elem.config(activebackground="lightgrey")
  1025. b = BLINKI(self.elem)
  1026. b.blink()
  1027. self.elem["text"] = "SAVE\nSHOW"
  1028. def setup(self,event):
  1029. cprint("xevent.SETUP",[self.mode,self.attr],color="red")
  1030. if self.mode != "SETUP":
  1031. return 0
  1032. if self.attr == "SAVE\nSHOW":
  1033. self._save_show()
  1034. elif self.attr == "LOAD\nSHOW":
  1035. name = "LOAD-SHOW"
  1036. base = baselib.Base()
  1037. line1 = "PATH: "+base.show_path1 +base.show_name
  1038. line2 = "DATE: "+ time.strftime("%Y-%m-%d %X", time.localtime(time.time()))
  1039. class cb():
  1040. def __init__(self,name=""):
  1041. self.name=name
  1042. cprint(" LOAD-SHOW.init",name)
  1043. def cb(self,event=None,**args):
  1044. cprint(" LOAD-SHOW.cdb",self.name,event,args)
  1045. if self.name != "<exit>":
  1046. cprint("-----------------------:")
  1047. LOAD_SHOW_AND_RESTART(self.name).cb()
  1048. pw = libtk.PopupList(name,cb=cb)
  1049. print(line1,line2)
  1050. frame = pw.sframe(line1=line1,line2=line2)
  1051. r = frame_of_show_list(frame,cb=cb)
  1052. elif self.attr == "NEW\nSHOW":
  1053. base = baselib.Base()
  1054. #def _cb(fname):
  1055. def _cb(data):
  1056. if not data:
  1057. cprint("err443",self,"_cb",data)
  1058. return None
  1059. fname = data["Value"]
  1060. cprint(self,"save_show._cb()",fname)
  1061. fpath,fname = base.build_path(fname)
  1062. cprint("SAVE NEW SHOW",fpath,fname)
  1063. if base._create_path(fpath):
  1064. a=PRESETS.backup_presets(save_as=fpath,new=1)
  1065. b=FIXTURES.backup_patch(save_as=fpath,new=1)
  1066. #base._set(fname)
  1067. libwin.save_window_position(save_as=fpath)
  1068. LOAD_SHOW_AND_RESTART(fname).cb()
  1069. dialog._cb = _cb
  1070. dialog.askstring("CREATE NEW SHOW","CREATE NEW SHOW:")
  1071. elif self.attr == "SAVE\nSHOW AS":
  1072. base = baselib.Base()
  1073. #def _cb(fname):
  1074. def _cb(data):
  1075. if not data:
  1076. cprint("err443",self,"_cb",data)
  1077. return None
  1078. fname = data["Value"]
  1079. cprint(self,"save_show._cb()",fname)
  1080. fpath,fname = base.build_path(fname)
  1081. cprint("SAVE AS",fpath,fname)
  1082. if base._create_path(fpath):
  1083. a=PRESETS.backup_presets(save_as=fpath)
  1084. b=FIXTURES.backup_patch(save_as=fpath)
  1085. #base._set(fname)
  1086. libwin.save_window_position(save_as=fpath)
  1087. LOAD_SHOW_AND_RESTART(fname).cb()
  1088. dialog._cb = _cb
  1089. dialog.askstring("SAVE SHOW AS","SAVE SHOW AS:")
  1090. elif self.attr == "SAVE &\nRESTART":
  1091. self.elem["bg"] = "orange"
  1092. self.elem["text"] = "SAVING..."
  1093. self.elem["bg"] = "red"
  1094. self.elem.config(activebackground="orange")
  1095. modes.val(self.attr,1)
  1096. PRESETS.backup_presets()
  1097. FIXTURES.backup_patch()
  1098. movewin.store_all_sdl()
  1099. libwin.save_window_position()
  1100. self.elem["text"] = "RESTARTING..."
  1101. self.elem["bg"] = "lightgrey"
  1102. self.elem.config(activebackground="lightgrey")
  1103. LOAD_SHOW_AND_RESTART("").cb(force=1)
  1104. elif self.attr == "DRAW\nGUI":
  1105. old_text = self.elem["text"]
  1106. window_manager.top("PATCH")
  1107. gui_patch.draw(FIXTURES)
  1108. gui_fix.draw(FIXTURES)
  1109. window_manager.top("FIXTURES")
  1110. master._refresh_exec()
  1111. self.elem["text"] = old_text
  1112. elif self.attr == "PRO\nMODE":
  1113. self._save_show()
  1114. import lib.restart as restart
  1115. restart.pro()
  1116. elif self.attr == "EASY\nMODE":
  1117. self._save_show()
  1118. import lib.restart as restart
  1119. restart.easy()
  1120. else:
  1121. if IS_GUI:
  1122. r=tkinter.messagebox.showwarning(message="{}\nnot implemented".format(self.attr.replace("\n"," ")),parent=None)
  1123. return 1
  1124. def live(self,event):
  1125. if self.mode != "LIVE":
  1126. return 0
  1127. if "FADE" in self.attr or "DELAY" in self.attr:
  1128. if self.attr == "FADE":
  1129. ct = FADE
  1130. if self.attr == "DELAY":
  1131. ct = DELAY
  1132. if "PAN/TILT\nFADE" in self.attr:
  1133. ct = FADE_move
  1134. value = ct.val()
  1135. #print("EVENT CHANGE ",[self.attr])
  1136. cprint("EVENT CHANGE:",self.mode,value,self.attr)
  1137. if value < 0:
  1138. value = 1
  1139. if event.num == 4:
  1140. value += 0.1
  1141. elif event.num == 5:
  1142. value -= 0.1
  1143. elif event.num == 1:
  1144. if ct._is():
  1145. ct.off()# = 0
  1146. self.data.commands.elem[self.attr]["bg"] = "grey"
  1147. self.elem.config(activebackground="grey")
  1148. else:
  1149. ct.on()# = 1
  1150. self.data.commands.elem[self.attr]["bg"] = "green"
  1151. self.elem.config(activebackground="lightgreen")
  1152. elif event.num == 2:
  1153. value += 1
  1154. if value > 10:
  1155. value = 1
  1156. value = round(value,1)
  1157. value = ct.val(value)
  1158. if self.attr == "FADE":
  1159. self.data.commands.elem[self.attr]["text"] = "FADE:\n{:0.2f}".format(value)
  1160. if self.attr == "DELAY":
  1161. self.data.commands.elem[self.attr]["text"] = "DELAY:\n{:0.3f}".format(value)
  1162. if "PAN/TILT\nFADE" in self.attr:
  1163. self.data.commands.elem[self.attr]["text"] = "PAN/TILT\nFADE:{:0.2f}".format(value)
  1164. def command(self,event):
  1165. if self.mode != "COMMAND":
  1166. return 0
  1167. if self.attr == "CLEAR":
  1168. if event.num == 1:
  1169. ok = FIXTURES.clear()
  1170. if ok:
  1171. master._refresh_fix()
  1172. modes.val(self.attr,0)
  1173. elif self.attr == "SAVE":
  1174. modes.val(self.attr,1)
  1175. PRESETS.backup_presets()
  1176. FIXTURES.backup_patch()
  1177. #time.sleep(1)
  1178. modes.val(self.attr,0)
  1179. elif self.attr == "S-KEY":
  1180. global _global_short_key
  1181. if _global_short_key:
  1182. _global_short_key = 0
  1183. master.commands.elem["S-KEY"]["bg"] = "red"
  1184. master.commands.elem["S-KEY"]["activebackground"] = "red"
  1185. else:
  1186. _global_short_key = 1
  1187. master.commands.elem["S-KEY"]["bg"] = "green"
  1188. master.commands.elem["S-KEY"]["activebackground"] = "green"
  1189. cprint("s-key",_global_short_key)
  1190. else:
  1191. if event.num == 1:
  1192. cprint("ELSE",self.attr)
  1193. modes.val(self.attr,1)
  1194. return 0
  1195. def encoder(self,event):
  1196. global _shift_key
  1197. cprint("Xevent","ENC",self.fix,self.attr,self.mode)
  1198. cprint("SHIFT_KEY",_shift_key,"??????????")
  1199. if self.mode == "ENCODER":
  1200. if self._encoder(event):
  1201. master.refresh_fix() # delayed
  1202. refresher_fix.reset() # = Refresher()
  1203. if self.mode == "ENCODER2":
  1204. if self._encoder(event):
  1205. master.refresh_fix() # delayed
  1206. refresher_fix.reset() # = Refresher()
  1207. if self.mode == "INVERT":
  1208. cprint("INVERT",event)
  1209. if self._encoder(event):
  1210. master.refresh_fix() # delayed
  1211. refresher_fix.reset() # = Refresher()
  1212. def _encoder(self,event):
  1213. global _shift_key
  1214. cprint("-- Xevent","_ENC",self.fix,self.attr,self.mode)
  1215. cprint("-- SHIFT_KEY",_shift_key,"??????????")
  1216. #cprint(self.data)
  1217. val=""
  1218. if event.num == 1:
  1219. val ="click"
  1220. elif event.num == 4:
  1221. val ="++"
  1222. if _shift_key:
  1223. val = "+"
  1224. elif event.num == 5:
  1225. val ="--"
  1226. if _shift_key:
  1227. val = "-"
  1228. #print("SHIFT",val,_shift_key)
  1229. if val:
  1230. FIXTURES.encoder(fix=self.fix,attr=self.attr,xval=val)
  1231. return 1
  1232. def cb(self,event):
  1233. cprint("EVENT cb",self.attr,self.mode,event,color='yellow')
  1234. cprint(["type",event.type,"num",event.num])
  1235. global INIT_OK
  1236. INIT_OK = 1
  1237. try:
  1238. change = 0
  1239. if "keysym" in dir(event):
  1240. if "Escape" == event.keysym:
  1241. ok = FIXTURES.clear()
  1242. master._refresh_fix()
  1243. cprint()
  1244. return 0
  1245. if self.mode == "SETUP":
  1246. self.setup(event)
  1247. elif self.mode == "COMMAND":
  1248. self.command(event)
  1249. elif self.mode == "LIVE":
  1250. self.live(event)
  1251. elif self.mode == "ENCODER":
  1252. self.encoder(event)
  1253. master.refresh_fix()
  1254. elif self.mode == "ENCODER2":
  1255. self.encoder(event)
  1256. elif self.mode == "INVERT":
  1257. self.encoder(event)
  1258. elif self.mode == "FX":
  1259. cprint("Xevent CALLING FX WRONG EVENT OBJECT !!",color="red")
  1260. elif self.mode == "ROOT":
  1261. if event.keysym=="Escape":
  1262. pass
  1263. elif self.mode == "INPUT":
  1264. cprint("INP",self.data.entry.get())
  1265. if event.keycode == 36:
  1266. x=self.data.entry.get()
  1267. #client.send(x)
  1268. elif self.mode == "INPUT2":
  1269. cprint("INP2",self.data.entry2.get())
  1270. if event.keycode == 36:
  1271. x=self.data.entry2.get()
  1272. #client.send(x)
  1273. elif self.mode == "INPUT3":
  1274. cprint("INP3",self.data.entry3.get())
  1275. if event.keycode == 36:
  1276. x=self.data.entry3.get()
  1277. #client.send(x)
  1278. elif self.mode == "PRESET":
  1279. nr = self.attr #int(self.attr.split(":")[1])-1
  1280. if event.num == 3: # right click for testing
  1281. if str(event.type) == '4': #4 ButtonPress
  1282. if modes.val("CFG-BTN"):
  1283. master.btn_cfg(nr,testing=1)
  1284. if event.num == 1:
  1285. if str(event.type) == '4': #4 ButtonPress
  1286. if modes.val("REC"):
  1287. self.data.preset_rec(nr)
  1288. modes.val("REC",0)
  1289. time.sleep(0.05)
  1290. master._refresh_exec(nr=nr)
  1291. elif modes.val("DEL"):
  1292. ok=PRESETS.delete(nr)
  1293. if ok:
  1294. modes.val("DEL",0)
  1295. #master.refresh_exec()
  1296. master._refresh_exec(nr=nr)
  1297. elif modes.val("COPY"):
  1298. ok=PRESETS.copy(nr)
  1299. if ok:
  1300. modes.val("COPY",0)
  1301. master._refresh_exec(nr=nr)
  1302. elif modes.val("MOVE"):
  1303. ok,cnr,bnr=PRESETS.move(nr)
  1304. if ok:
  1305. #modes.val("MOVE",0) # keep MOVE on
  1306. master._refresh_exec(nr=nr)
  1307. master._refresh_exec(nr=bnr)
  1308. elif modes.val("CFG-BTN"):
  1309. master.btn_cfg(nr)
  1310. #master._refresh_exec(nr=nr)
  1311. elif modes.val("LABEL"):#else:
  1312. master.label(nr)
  1313. #master._refresh_exec(nr=nr)
  1314. elif modes.val("EDIT"):
  1315. FIXTURES.clear()
  1316. self.data.preset_select(nr)
  1317. self.data.preset_go(nr,xfade=0,event=event,val=255,button="go")
  1318. modes.val("EDIT", 0)
  1319. master.refresh_fix()
  1320. refresher_fix.reset() # = Refresher()
  1321. elif modes.val("SELECT"):
  1322. self.data.preset_select(nr)
  1323. else:
  1324. self.data.preset_go(nr,event=event,val=255)
  1325. else:
  1326. self.data.preset_go(nr,xfade=0,event=event,val=0)
  1327. cprint(" == "*10)
  1328. master.refresh_fix()
  1329. refresher_fix.reset() # = Refresher()
  1330. if event.num == 3:
  1331. if not modes.val("REC"):
  1332. if str(event.type) == '4': #4 ButtonPress
  1333. self.data.preset_go(nr,xfade=0,ptfade=0,event=event,val=255)
  1334. else:
  1335. self.data.preset_go(nr,xfade=0,ptfade=0,event=event,val=0)
  1336. cprint()
  1337. return 0
  1338. elif self.mode == "INPUT":
  1339. cprint()
  1340. return 0
  1341. except Exception as e:
  1342. cprint("== cb EXCEPT",e,color="red")
  1343. cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
  1344. cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
  1345. cprint()
  1346. return 1
  1347. def wheel(event,d=None):
  1348. cprint("wheel",event,d)
  1349. class Element():
  1350. def __init__(self):
  1351. self.__data = {}
  1352. def set(self,key,val):
  1353. self.__data[key] = val
  1354. #import lib.base as _base
  1355. import lib.baselib as baselib
  1356. def hex_to_rgb(hex):
  1357. return tuple(int(hex[i:i+2], 16) for i in (0, 2, 4))
  1358. class cb():
  1359. def __init__(self,win):
  1360. self.win = win
  1361. def _callback(self,event):
  1362. clobj=event.widget
  1363. ## undermouse=find_withtag(master.CURRENT)
  1364. undermouse=self.win.find_closest(self.win.CURRENT)
  1365. cprint( repr(undermouse))
  1366. def callback(self,event):
  1367. cprint(__file__,self,"callback",event)
  1368. cnv = self.win
  1369. item = cnv.find_closest(cnv.canvasx(event.x), cnv.canvasy(event.y))[0]
  1370. tags = cnv.gettags(item)
  1371. #cnv.itemconfigure(self.tag, text=tags[0])
  1372. cprint(tags,item)
  1373. color = cnv.itemcget(item, "fill")
  1374. cnv.itemconfig("all", width=1)#filla="green")
  1375. cnv.itemconfig(item, width=3)#filla="green")
  1376. cprint(color)
  1377. cprint( hex_to_rgb(color[1:]))
  1378. def get_exec_btn_cfg(nr):
  1379. #b.configure(fg=_fg,bg=_bg,activebackground=_ba,text=_text)
  1380. #for k in PRESETS.val_presets:
  1381. k = nr
  1382. if 1:
  1383. _bg = "grey"
  1384. _ba = "grey"
  1385. _fg = "lightgrey"
  1386. _text = "N/V"
  1387. if nr >= 0:
  1388. #if self._nr_ok:
  1389. # return #pass#abreak
  1390. if nr != k:
  1391. return #continue
  1392. #else:
  1393. # self._nr_ok = 1
  1394. label = ""
  1395. #if k not in self.elem_presets:
  1396. # cprint("ERROR",k ,"not in elem_presets continue")
  1397. # return #continue
  1398. if k in PRESETS.label_presets:
  1399. label = PRESETS.label_presets[k]
  1400. #print([label])
  1401. #b = self.elem_presets[k]
  1402. ifval = 0
  1403. fx_only = 0
  1404. fx_color = 0
  1405. if k in PRESETS.val_presets and len(PRESETS.val_presets[k]) :
  1406. sdata = PRESETS.val_presets[k]
  1407. #print("sdata7654",sdata)
  1408. BTN="go"
  1409. if "CFG" in sdata:#["BUTTON"] = "GO"
  1410. if "BUTTON" in sdata["CFG"]:
  1411. BTN = sdata["CFG"]["BUTTON"]
  1412. #txt=str(k+1)+" "+str(BTN)+" "+str(len(sdata)-1)+"\n"+label
  1413. txt="{} {} {}\n{}".format(k+1,BTN,len(sdata)-1,label)
  1414. _text = txt
  1415. #if b.text != txt: # TODO
  1416. # #txt+=str(self._XX)
  1417. # #b.configure(text= txt)
  1418. # _text = txt
  1419. # _bg="yellow"
  1420. # _ba="yellow"
  1421. if len(sdata) > 1:
  1422. ifval = 1
  1423. val_color = 0
  1424. for fix in sdata:
  1425. if fix == "CFG":
  1426. continue
  1427. #print( "$$$$",fix,sdata[fix])
  1428. for attr in sdata[fix]:
  1429. if "FX2" in sdata[fix][attr]:
  1430. if sdata[fix][attr]["FX2"]:
  1431. fx_color = 1
  1432. if "FX" in sdata[fix][attr]:
  1433. if sdata[fix][attr]["FX"]:
  1434. fx_color = 1
  1435. if "VALUE" in sdata[fix][attr]:
  1436. if sdata[fix][attr]["VALUE"] is not None:
  1437. val_color = 1
  1438. #try:b.configure(fg= "black")
  1439. #except:pass
  1440. if val_color:
  1441. _bg = "gold"
  1442. _ba = "#ffaa55"
  1443. if fx_color:
  1444. _fg = "blue"
  1445. else:
  1446. if fx_color:
  1447. fx_only = 1
  1448. else:
  1449. _bg = "grey"
  1450. _ba = "#aaa"
  1451. if "\n" in txt:
  1452. txt1 = txt.split("\n")[0]
  1453. _fg = "black"
  1454. if ifval:
  1455. if fx_only:
  1456. _bg = "cyan"
  1457. _ba = "#55d4ff"
  1458. if "SEL" in txt1:
  1459. #b.configure(bg="#77f")
  1460. _bg = "#77f"
  1461. else:
  1462. _bg = "grey"
  1463. _fg = "darkgrey"
  1464. if "SEL" in txt1:
  1465. _fg = "blue"
  1466. elif "ON" in txt1:
  1467. _fg = "#040"
  1468. elif "GO" in txt1:
  1469. _fg = "#555"
  1470. if "FL" in txt1:
  1471. _fg = "#00e"
  1472. out = {}
  1473. out["fx"] = fx_color
  1474. out["bg"] = _bg
  1475. out["ba"] = _ba
  1476. out["fg"] = _fg
  1477. #if fx_color:
  1478. # out["fg"] = "red"
  1479. out["text"] = _text
  1480. return out
  1481. #b.configure(fg=_fg,bg=_bg,activebackground=_ba,text=_text)
  1482. class Elem_Container():
  1483. def __init__(self):
  1484. self.commands = []
  1485. self.val = {}
  1486. self.elem = {}
  1487. import lib.execlib as execlib
  1488. class MASTER():
  1489. def __init__(self):
  1490. #super().__init__()
  1491. self.base = baselib.Base ()
  1492. self.load()
  1493. self._XX = 0
  1494. self.all_attr =["DIM","PAN","TILT"]
  1495. self.elem_attr = {}
  1496. self.setup_elem = {} # Elem_Container()
  1497. self.setup_cmd = ["SAVE\nSHOW","LOAD\nSHOW","NEW\nSHOW","SAVE\nSHOW AS","SAVE &\nRESTART","DRAW\nGUI","PRO\nMODE"]
  1498. self.setup_cmd = ["SAVE\nSHOW","LOAD\nSHOW","NEW\nSHOW","SAVE\nSHOW AS","SAVE &\nRESTART","PRO\nMODE"]
  1499. self.fx_main = Elem_Container()
  1500. self.fx_main.commands =["REC-FX","FX OFF","\n"]
  1501. self.fx_moves = Elem_Container()
  1502. self.fx_moves.commands =[
  1503. "FX:CIR","FX:PAN","FX:TILT", "WIDTH:\n100","DIR:\n0","INVERT:\n0","\n",
  1504. "SHUFFLE:\n0","SIZE:\n","SPEED:\n","START:\n","OFFSET:\n","\n"
  1505. ]
  1506. #, "FX:SIN","FX:COS","FX:RAMP","FX:RAMP2","FX:FD","FX:ON","BASE:\n-"] #,"FX:RND" ]
  1507. self.fx = Elem_Container()
  1508. self.fx.commands =[
  1509. "FX:DIM"," ", "WIDTH:\n25","WING:\n2","DIR:\n1","INVERT:\n1","\n","SHUFFLE:\n0"
  1510. ,"SIZE:\n","SPEED:\n","START:\n","OFFSET:\n","BASE:\n-","2D-X:\n-","2D:MODE"
  1511. ]
  1512. self.fx_generic = Elem_Container()
  1513. self.fx_generic.commands =["FX:SIN","FX:COS","FX:RAMP","FX:RAMP2","FX:FD","FX:ON","FX:STATIC"]
  1514. self.fx_color = Elem_Container()
  1515. self.fx_color.commands =["FX:RED","FX-C:A","FX-C:B"]
  1516. self.commands = Elem_Container()
  1517. self.commands.commands =["\n","ESC","CFG-BTN","LABEL","-","DEL","-","\n"
  1518. ,"SELECT","FLASH","GO","-","MOVE","S-KEY","\n"
  1519. ,"BLIND","CLEAR","REC","EDIT","COPY",".","\n"
  1520. ]
  1521. self.elem_presets = {}
  1522. for i in range(8*8*8):
  1523. if i not in PRESETS.val_presets:
  1524. name = "Preset:"+str(i+1)+":\nXYZ"
  1525. #self.presets[i] = [i]
  1526. PRESETS.val_presets[i] = OrderedDict() # FIX
  1527. PRESETS.val_presets[i]["CFG"] = OrderedDict() # CONFIG
  1528. PRESETS.label_presets[i] = "-"
  1529. modes.set_cb(self.xcb)
  1530. def jclient_send(self,data):
  1531. # namespace wraper
  1532. if not modes.val("BLIND"):
  1533. jclient_send(data)
  1534. def button_refresh(self,name,color,color2=None,text="",fg=None):
  1535. cprint("button_refresh",name,color)
  1536. #if color == "gold":
  1537. # color2 = "yellow"
  1538. try:
  1539. if color2 is None:
  1540. color2 = color
  1541. if text:
  1542. text = "\n"+str(text)
  1543. if name in self.commands.elem:
  1544. self.commands.elem[name]["bg"] = color
  1545. self.commands.elem[name]["text"] = name+ text
  1546. self.commands.elem[name].config(activebackground=color2)
  1547. if fg:
  1548. self.commands.elem[name]["fg"] = fg
  1549. elif name in self.fx.elem:
  1550. #todo
  1551. self.fx.elem[name]["bg"] = color
  1552. self.fx.elem[name].config(activebackground=color2)
  1553. if fg:
  1554. self.fx.elem[name]["fg"] = fg
  1555. # new version
  1556. for elems in [self.fx_moves]:
  1557. if name in elems.elem:
  1558. elem = elems.elem[name]
  1559. cprint("elem",elem)
  1560. elem.config(bg = color)
  1561. elem.config(text = name+text)
  1562. elem.config(activebackground=color2)
  1563. if fg and "fg" in elem:
  1564. elem["fg"] = fg
  1565. except Exception as e:cprint("exc",self,e)
  1566. def btn_cfg(self,nr,testing=0):
  1567. cfg = PRESETS._btn_cfg(nr)
  1568. button = PRESETS.btn_cfg(nr)
  1569. label = PRESETS.label(nr)
  1570. def _cb(data):
  1571. if not data:
  1572. cprint("err443",self,"_cb",data)
  1573. return None
  1574. cprint(self,"btn_cfg._cb()",data)
  1575. if data:
  1576. if "Button" in data and type(data["Button"]) is str:
  1577. txt = data["Button"]
  1578. PRESETS.btn_cfg(nr,txt)
  1579. self.elem_presets[nr].configure(text= PRESETS.get_btn_txt(nr))
  1580. if "Label" in data and type(data["Label"]) is str:
  1581. txt = data["Label"]
  1582. PRESETS.label(nr,txt)
  1583. self.elem_presets[nr].configure(text= PRESETS.get_btn_txt(nr))
  1584. if "Delay" in data and type(data["Delay"]) is str:
  1585. txt = data["Delay"]
  1586. try:
  1587. txt = float(txt)
  1588. if "DELAY" in cfg:
  1589. cfg["DELAY"] = round(txt,2)
  1590. except e as Exception:
  1591. print("DELAY Exception",e)
  1592. if "in-Fade" in data and type(data["in-Fade"]) is str:
  1593. txt = data["in-Fade"]
  1594. try:
  1595. txt = float(txt)
  1596. if "FADE" in cfg:
  1597. cfg["FADE"] = round(txt,2)
  1598. except e as Exception:
  1599. print("in-Fade Exception",e)
  1600. if "out-Fade" in data and type(data["out-Fade"]) is str:
  1601. txt = data["out-Fade"]
  1602. try:
  1603. txt = float(txt)
  1604. #if "OUT-FADE" in cfg:
  1605. cfg["OUT-FADE"] = round(txt,2)
  1606. except e as Exception:
  1607. print("out-Fade Exception",e)
  1608. modes.val("CFG-BTN",0)
  1609. master._refresh_exec(nr=nr)
  1610. dialog._cb = _cb
  1611. if 1: # testing:
  1612. dialog.ask_exec_config(str(nr+1),button=button,label=label,cfg=cfg)
  1613. else:
  1614. dialog.askstring("CFG-BTN","GO=GO FL=FLASH\nSEL=SELECT EXE:"+str(nr+1),initialvalue=txt)
  1615. def label(self,nr):
  1616. txt = PRESETS.label(nr)
  1617. def _cb(data):
  1618. if not data:
  1619. cprint("err443",self,"_cb",data)
  1620. return None
  1621. txt = data["Value"]
  1622. cprint(self,"label._cb()",nr,txt)
  1623. if txt:
  1624. PRESETS.label(nr,txt)
  1625. self.elem_presets[nr].configure(text = PRESETS.get_btn_txt(nr))
  1626. modes.val("LABEL", 0)
  1627. master._refresh_exec(nr=nr)
  1628. dialog._cb= _cb #_x(nr)
  1629. dialog.askstring("LABEL","EXE:"+str(nr+1),initialvalue=txt)
  1630. def xcb(self,mode,value=None):
  1631. cprint("MODE CALLBACK",mode,value,color="green",end="")
  1632. #cprint(self,"xcb","MODE CALLBACK",mode,value,color="green")
  1633. if value:
  1634. cprint("===== ON ======",color="red")
  1635. txt = ""
  1636. if mode == "REC-FX":
  1637. modes.val("REC",0)
  1638. modes.val("REC",1)
  1639. if value == 2:
  1640. if mode in ["MOVE","COPY"]:
  1641. txt="to"
  1642. self.button_refresh(mode,color="orange",text=txt)#,fg="blue")
  1643. else:
  1644. if mode in ["MOVE","COPY"]:
  1645. txt="from"
  1646. self.button_refresh(mode,color="red",text=txt)#,fg="blue",text="from")
  1647. else:
  1648. cprint("===== OFF ======",color="red")
  1649. if mode == "REC-FX":
  1650. modes.val("REC",0)
  1651. self.button_refresh(mode,color="lightgrey")#,fg="black")
  1652. def load(self,fname=""):
  1653. pass
  1654. def exit(self):
  1655. cprint("__del__",self)
  1656. PRESETS.backup_presets()
  1657. #print("********************************************************")
  1658. FIXTURES.backup_patch()
  1659. #print("*********del",self,"***********************************************")
  1660. def refresh_exec(self):
  1661. refresher_exec.reset() # = Refresher()
  1662. def _refresh_exec(self,nr=-1):
  1663. s = time.time()
  1664. cprint("PRESET.refresh_exec()")
  1665. refresher_exec.reset() # = Refresher()
  1666. self._XX +=1
  1667. self._nr_ok = 0
  1668. for nr in PRESETS.val_presets:
  1669. cfg = get_exec_btn_cfg(nr)
  1670. if not cfg:
  1671. out = {}
  1672. out["bg"] = "lightgrey"
  1673. out["ba"] = "grey"
  1674. out["fg"] = "grey"
  1675. out["text"] = "?"
  1676. cfg = out
  1677. b = self.elem_presets[nr]
  1678. b.configure(fg=cfg["fg"],bg=cfg["bg"],activebackground=cfg["ba"],text=cfg["text"],fx=cfg["fx"])
  1679. time.sleep(0.01)
  1680. def refresh_fix(self):
  1681. refresher_fix.reset() # = Refresher()
  1682. def _refresh_fix(self):
  1683. cprint(self,"_refresh_fix")
  1684. s=time.time(); _XXX=0
  1685. menu_buff = {"DIM":0,"DIM-SUB":0,"FIX":0,"FIX-SUB":0}
  1686. elem_buffer = []
  1687. for fix in FIXTURES.fixtures:
  1688. sdata = FIXTURES.fixtures[fix]
  1689. elem_attr_fix = None
  1690. if fix in self.elem_attr:
  1691. elem_attr_fix = self.elem_attr[fix]
  1692. if "DIM" in sdata["ATTRIBUT"] and "_ACTIVE" in sdata["ATTRIBUT"] and len(sdata["ATTRIBUT"]) == 2:
  1693. KEY = "DIM-SUB"
  1694. else:
  1695. KEY = "FIX-SUB"
  1696. FIX = 0
  1697. DIM = 0
  1698. for attr in sdata["ATTRIBUT"]:
  1699. _buff = {}
  1700. row = sdata["ATTRIBUT"][attr]
  1701. if attr.endswith("-FINE"):
  1702. continue
  1703. b_attr = attr
  1704. if b_attr == "_ACTIVE":
  1705. b_attr = "S"
  1706. elem = None
  1707. if elem_attr_fix:
  1708. if b_attr not in elem_attr_fix:
  1709. continue
  1710. elem = elem_attr_fix[b_attr]
  1711. if not elem:
  1712. continue
  1713. if "elem" not in _buff:
  1714. _buff["elem"] = elem
  1715. if not attr.startswith("_"):
  1716. v2 = row["VALUE"]
  1717. #_text = "{} {}".format(str(attr).rjust(4,"0"),str(v2).rjust(4,"0")) # ~0.2 sec
  1718. _text = "{} {}".format(attr,v2)
  1719. _buff["text"] = _text
  1720. if row["ACTIVE"]:
  1721. _buff["bg"] = "yellow"
  1722. _buff["abg"] = "yellow"
  1723. menu_buff[KEY] += 1
  1724. if b_attr == "S":
  1725. if KEY == "DIM-SUB":
  1726. DIM =1
  1727. else:
  1728. FIX =1
  1729. else:
  1730. _buff["bg"] = "grey"
  1731. _buff["abg"] = "grey"
  1732. if "FX" not in row: # insert FX2 excetption
  1733. row["FX"] = "" #OrderedDict()
  1734. if "FX2" not in row: # insert FX2 excetption
  1735. row["FX2"] = {} #OrderedDict()
  1736. #print("row",fix,row)
  1737. if row["FX"]:
  1738. _buff["fg"] = "blue"
  1739. elif row["FX2"]:
  1740. _buff["fg"] = "red"
  1741. else:
  1742. _buff["fg"] = "black"
  1743. elem_buffer.append(_buff)
  1744. menu_buff["FIX"] += FIX
  1745. menu_buff["DIM"] += DIM
  1746. cprint(" =+= "*10,"refresh_fix")
  1747. try:
  1748. for row in elem_buffer:
  1749. elem = row["elem"]
  1750. if not elem:
  1751. continue
  1752. #print("<elem>",elem)
  1753. for e in row:
  1754. if e == "elem":
  1755. continue
  1756. v = row[e]
  1757. #print("confg:",["key:",e,"val:",v])
  1758. if e == "abg":
  1759. elem.config(activebackground=v)
  1760. else:
  1761. elem[e] = v
  1762. w = window_manager.get_win("FIXTURES")
  1763. #print(dir(w))
  1764. w.update_idle_task()
  1765. #tkinter.Tk.update_idletasks(w)
  1766. except Exception as e:
  1767. cprint("exc434",e)
  1768. cprint("fix:",_XXX,round(time.time()-s,2),color="red");_XXX += 1
  1769. cprint(gui_menu)
  1770. menu_buff["FIX-SUB"] -= menu_buff["FIX"]
  1771. if menu_buff["FIX-SUB"]:
  1772. gui_menu.config("FIXTURES","bg","yellow")
  1773. gui_menu.config("FIXTURES","activebackground","yellow")
  1774. elif menu_buff["FIX"]:
  1775. gui_menu.config("FIXTURES","bg","orange")
  1776. gui_menu.config("FIXTURES","activebackground","orange")
  1777. else:
  1778. gui_menu.config("FIXTURES","bg","")
  1779. gui_menu.config("FIXTURES","activebackground","")
  1780. gui_menu.update("FIXTURES","{} : {}".format(menu_buff["FIX"],menu_buff["FIX-SUB"]))
  1781. menu_buff["DIM-SUB"] -= menu_buff["DIM"]
  1782. if menu_buff["DIM-SUB"]:
  1783. gui_menu.config("DIMMER","bg","yellow")
  1784. gui_menu.config("DIMMER","activebackground","yellow")
  1785. elif menu_buff["DIM"]:
  1786. gui_menu.config("DIMMER","bg","orange")
  1787. gui_menu.config("DIMMER","activebackground","orange")
  1788. else:
  1789. gui_menu.config("DIMMER","bg","")
  1790. gui_menu.config("DIMMER","activebackground","")
  1791. gui_menu.update("DIMMER","{} : {}".format(menu_buff["DIM"],menu_buff["DIM-SUB"]))
  1792. cprint("fix:",_XXX,round(time.time()-s),color="red"); _XXX += 1
  1793. def preset_rec(self,nr):
  1794. cprint("------- STORE PRESET")
  1795. data = FIXTURES.get_active()
  1796. if modes.val("REC-FX"):
  1797. PRESETS.rec(nr,data,"REC-FX")
  1798. modes.val("REC-FX",0)
  1799. else:
  1800. PRESETS.rec(nr,data)
  1801. sdata=data
  1802. PRESETS.val_presets[nr] = sdata
  1803. master._refresh_exec()
  1804. return 1
  1805. def preset_select(self,nr):
  1806. cprint("SELECT PRESET")
  1807. sdata = PRESETS.val_presets[nr]
  1808. cmd = ""
  1809. for fix in sdata:
  1810. if fix == "CFG":
  1811. continue
  1812. for attr in sdata[fix]:
  1813. #v2 = sdata[fix][attr]["VALUE"]
  1814. #v2_fx = sdata[fix][attr]["FX"]
  1815. #print( self.data.elem_attr)
  1816. #if fix in self.elem_attr:
  1817. # if attr in self.elem_attr[fix]:
  1818. # elem = self.elem_attr[fix][attr]
  1819. FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
  1820. FIXTURES.fixtures[fix]["ATTRIBUT"]["_ACTIVE"]["ACTIVE"] = 1
  1821. #elem["bg"] = "yellow"
  1822. def preset_go(self,nr,val=None,xfade=None,event=None,button="",ptfade=None):
  1823. s=time.time()
  1824. t_start = time.time()
  1825. if xfade is None and FADE._is():
  1826. xfade = FADE.val()
  1827. if ptfade is None and FADE_move._is():
  1828. ptfade = FADE_move.val()
  1829. cprint("GO PRESET FADE",nr,val)
  1830. rdata = PRESETS.get_raw_map(nr)
  1831. if not rdata:
  1832. return 0
  1833. cprint("???????")
  1834. cfg = PRESETS.get_cfg(nr)
  1835. cprint("''''''''")
  1836. #virtcmd = FIXTURES.get_virtual(rdata)
  1837. if not cfg:
  1838. cprint("NO CFG",cfg,nr)
  1839. return 0
  1840. xFLASH = 0
  1841. value=None
  1842. cprint("preset_go",nr,cfg)
  1843. if modes.val("SELECT") or ( "BUTTON" in cfg and cfg["BUTTON"] == "SEL") and val and not button: #FLASH
  1844. self.preset_select(nr)
  1845. elif modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL") and not button: #FLASH
  1846. xFLASH = 1
  1847. xfade = 0
  1848. if type(val) is not type(None) and val == 0 :
  1849. value = "off"
  1850. xfade=0
  1851. if "OUT-FADE" in cfg:
  1852. xfade=cfg["OUT-FADE"]
  1853. if event:
  1854. if str(event.type) == "ButtonRelease" or event.type == '5' :
  1855. value = "off"
  1856. xfade=0
  1857. if "OUT-FADE" in cfg:
  1858. xfade=cfg["OUT-FADE"]
  1859. cprint("preset_go() FLUSH",value,color="red")
  1860. #print(";",rdata)
  1861. print(";",cfg)
  1862. fcmd = FIXTURES.update_raw(rdata,update=0)
  1863. #print(":",fcmd) # raw dmx
  1864. self._preset_go(rdata,cfg,fcmd,value,xfade=xfade,xFLASH=xFLASH,nr=nr)
  1865. elif not val:
  1866. cprint("preset_go() STOP",value,color="red")
  1867. elif button == "on" or ( modes.val("ON") or ( "BUTTON" in cfg and cfg["BUTTON"] in ["on","ON"])):
  1868. fcmd = FIXTURES.update_raw(rdata)
  1869. self._preset_go(rdata,cfg,fcmd,value,xfade=0,xFLASH=xFLASH)
  1870. elif button == "go" or ( modes.val("GO") or ( "BUTTON" in cfg and cfg["BUTTON"] in ["go","GO"])):
  1871. fcmd = FIXTURES.update_raw(rdata)
  1872. e=time.time()
  1873. print("_GO TIME:","{:0.02f}".format(e-s),int(e*10)/10)
  1874. self._preset_go(rdata,cfg,fcmd,value,xfade=xfade,xFLASH=xFLASH,ptfade=ptfade,nr=nr)
  1875. e=time.time()
  1876. print("GO TIME:","{:0.02f}".format(e-s),int(e*10)/10)
  1877. return
  1878. if not (modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL")): #FLASH
  1879. self.refresh_exec()
  1880. self.refresh_fix()
  1881. #print("IIIIIIIIIIIiiiiiiiiiiiiiiiiiii",nr,val)
  1882. #print(len(self.elem_presets) )
  1883. if len(self.elem_presets) > nr: # RED BUTTON IF PRESSED
  1884. #print("IIIIIIIIIIIiiiiiiiiiiiiiiiiiii",nr,val)
  1885. if val:# or value:
  1886. #self.elem_presets[nr].config(borderwidth=1)
  1887. self.elem_presets[nr].config(bg="red")
  1888. else:
  1889. self._refresh_exec()
  1890. cprint("preset_go",time.time()-t_start)
  1891. def _preset_go(self,rdata,cfg,fcmd,value=None,xfade=None,event=None,xFLASH=0,ptfade=0,nr=None):
  1892. if xfade is None and FADE._is():
  1893. xfade = FADE.val()
  1894. if ptfade is None and FADE_move._is():
  1895. ptfade = FADE_move.val()
  1896. cprint("PRESETS._preset_go() len=",len(rdata),cfg)
  1897. if xfade is None:
  1898. xfade = cfg["FADE"]
  1899. if ptfade is None:
  1900. ptfade = cfg["FADE"]
  1901. #vcmd = reshape_preset( rdata ,value,[],xfade=xfade,fx=1)
  1902. #cprint(rdata,color="red")
  1903. vcmd = execlib.reshape_preset( rdata ,value,xfade=xfade,ptfade=ptfade)
  1904. cmd = []
  1905. delay=0
  1906. for i,v in enumerate(fcmd):
  1907. #print("go",i,v)
  1908. if xFLASH:
  1909. vcmd[i]["FLASH"] = 1
  1910. DMX = fcmd[i]["DMX"]
  1911. if "VALUE" in vcmd[i] and type(vcmd[i]["VALUE"]) is type(float):
  1912. vcmd[i]["VALUE"] = round(vcmd[i]["VALUE"],3)
  1913. if value is not None:
  1914. vcmd[i]["VALUE"] = value
  1915. if value == "off":
  1916. if "FX2" in vcmd:
  1917. vcmd[i]["FX2"]["TYPE"] = value
  1918. if "FIX" in fcmd:
  1919. vcmd[i]["FIX"] = fcmd["FIX"]
  1920. if DMX and vcmd[i]:
  1921. vcmd[i]["DMX"] = DMX
  1922. if type(nr) is not type(None):
  1923. vcmd[i]["EXEC"] = str(int(nr)+1)
  1924. cmd.append(vcmd[i])
  1925. if cmd and not modes.val("BLIND"):
  1926. jclient_send(cmd)
  1927. def render(self):
  1928. #Xroot.bind("<Key>",Xevent(fix=0,elem=None,attr="ROOT",data=self,mode="ROOT").cb)
  1929. #self.draw_input()
  1930. pass
  1931. ##draw_sub_dim
  1932. import tkgui.dialog as dialoglib
  1933. dialog = dialoglib.Dialog()
  1934. from tkgui.draw import *
  1935. from tkgui.GUI import *
  1936. class LOAD_SHOW_AND_RESTART():
  1937. def __init__(self,fname=""):
  1938. self.fname=fname
  1939. self.base = baselib.Base()
  1940. def cb(self,event=None,force=0):
  1941. cprint("LOAD_SHOW_AND_RESTART.cb force={} name={}".format(force,self.fname) )
  1942. if not self.fname and not force:
  1943. return 0
  1944. if self.base.show_name == self.fname and not force:
  1945. cprint("filename is the same",self.fname)
  1946. return 0
  1947. if not force:
  1948. self.base._set(self.fname)
  1949. cprint("LOAD SHOW:",event,self.fname)
  1950. BASE_PATH = "/opt/LibreLight/Xdesk/"
  1951. cmd="_LibreLightDesk.py"
  1952. arg = ""
  1953. print("fork",[BASE_PATH,cmd,arg])
  1954. if "--easy" in sys.argv:
  1955. arg = "--easy"
  1956. movewin.process_kill(BASE_PATH+"tksdl/")
  1957. os.execl("/usr/bin/python3", BASE_PATH, cmd,arg)
  1958. sys.exit()
  1959. class BaseCallback():
  1960. def __init__(self,cb=None,args={}):
  1961. self._cb=cb
  1962. self.args = args
  1963. def cb(self,**args):
  1964. print("BaseCallback.cb()")
  1965. print(" ",self.args)
  1966. print(" ",self._cb)
  1967. if self._cb:
  1968. if self.args:
  1969. self._cb(args=self.args)
  1970. else:
  1971. self._cb()
  1972. def frame_of_show_list(frame,cb=None):
  1973. c=0
  1974. r=0
  1975. base = baselib.Base()
  1976. for i in ["name","stamp"]: #,"create"]:
  1977. b = tk.Label(frame,bg="grey",text=i)
  1978. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1979. c+=1
  1980. r+=1
  1981. blist = base._list()
  1982. for i in range(10):
  1983. blist.append(["",""])
  1984. if cb is None:
  1985. cb = DummyCallback #("load_show_list.cb")
  1986. for i in blist:
  1987. #print(i)
  1988. c=0
  1989. for j in i:
  1990. bg="lightgrey"
  1991. dbg="lightgrey"
  1992. if i[1] > time.strftime("%Y-%m-%d %X", time.localtime(time.time()-3600*4)):
  1993. dbg = "lightgreen"
  1994. elif i[1] > time.strftime("%Y-%m-%d %X", time.localtime(time.time()-3600*24*7)):
  1995. dbg = "green"
  1996. if c > 0:
  1997. b = tk.Button(frame,text=j,anchor="w",bg=dbg,relief="sunken")
  1998. b.config(activebackground=dbg)
  1999. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2000. else:
  2001. if base.show_name == i[0]:
  2002. bg="green"
  2003. _cb = cb(j)
  2004. b = tk.Button(frame,text=j,anchor="w",height=1,bg=bg,command=_cb.cb)
  2005. if base.show_name == i[0]:
  2006. b.config(activebackground=bg)
  2007. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2008. c+=1
  2009. r+=1
  2010. def PRESET_CFG_CHECKER(sdata):
  2011. "repair CFG "
  2012. ok = 0
  2013. if "CFG" not in sdata:
  2014. sdata["CFG"] = OrderedDict()
  2015. ok += 1
  2016. if "FADE" not in sdata["CFG"]:
  2017. sdata["CFG"]["FADE"] = 4
  2018. ok += 1
  2019. if "DELAY" not in sdata["CFG"]:
  2020. sdata["CFG"]["DELAY"] = 0
  2021. ok += 1
  2022. if "BUTTON" not in sdata["CFG"]:
  2023. sdata["CFG"]["BUTTON"] = "GO"
  2024. ok += 1
  2025. if "HTP-MASTER" not in sdata["CFG"]:
  2026. sdata["CFG"]["HTP-MASTER"] = 100 #%
  2027. ok += 1
  2028. if "SIZE-MASTER" not in sdata["CFG"]:
  2029. sdata["CFG"]["SIZE-MASTER"] = 100 #%
  2030. ok += 1
  2031. if "SPEED-MASTER" not in sdata["CFG"]:
  2032. sdata["CFG"]["SPEED-MASTER"] = 100 #%
  2033. ok += 1
  2034. if "OFFSET-MASTER" not in sdata["CFG"]:
  2035. sdata["CFG"]["OFFSET-MASTER"] = 100 #%
  2036. ok += 1
  2037. #try:del sdata["CFG"]["SPEED-MASTER"] #= 100 #%
  2038. #except:pass
  2039. return ok
  2040. class Presets():
  2041. def __init__(self):
  2042. #super().__init__()
  2043. self.base = baselib.Base()
  2044. #self.load()
  2045. self._last_copy = None
  2046. self._last_move = None
  2047. self.fx_buffer = {}
  2048. def load_presets(self):
  2049. #self._load()
  2050. filename="presets"
  2051. #self.base._init()
  2052. d,l = self.base._load(filename)
  2053. for i in d:
  2054. sdata = d[i]
  2055. ok = PRESET_CFG_CHECKER(sdata)
  2056. self.val_presets = d
  2057. self.label_presets = l
  2058. def check_cfg(self,nr=None):
  2059. cprint("PRESETS.check_cfg()",nr)#,color="red")
  2060. ok = 0
  2061. if nr is not None:
  2062. if nr in self.val_presets:
  2063. sdata = self.val_presets[nr]
  2064. ok += self._check_cfg(sdata)
  2065. else:
  2066. cprint("nr not in data ",nr,color="red")
  2067. else:
  2068. for nr in self.val_presets:
  2069. sdata = self.val_presets[nr]
  2070. ok += self._check_cfg(sdata)
  2071. return ok
  2072. def _check_cfg(self,sdata):
  2073. cprint("PRESETS._check_cfg()")#,color="red")
  2074. ok = PRESET_CFG_CHECKER(sdata)
  2075. if ok:
  2076. cprint("REPAIR CFG's",ok,sdata["CFG"],color="red")
  2077. return ok
  2078. def backup_presets(self,save_as="",new=0):
  2079. filename = "presets"
  2080. data = self.val_presets
  2081. labels = self.label_presets
  2082. if new:
  2083. #a = []
  2084. #for i in range(512):
  2085. # e = PRESET_CFG_CHECKER({})
  2086. # e["NAME"] = str(i)
  2087. # a.append(e)
  2088. #data = a
  2089. data = []#*512
  2090. labls = [""]*512
  2091. #self.base._init()
  2092. self.base._backup(filename,data,labels,save_as)
  2093. def get_cfg(self,nr):
  2094. cprint("PRESETS.get_cfg()",nr)
  2095. self.check_cfg(nr)
  2096. if nr not in self.val_presets:
  2097. cprint("get_cfg",self,"error get_cfg no nr:",nr,color="red")
  2098. return {}
  2099. if "CFG" in self.val_presets[nr]:
  2100. return self.val_presets[nr]["CFG"]
  2101. def clean(self,nr):
  2102. if nr not in self.val_presets:
  2103. self.val_presets[nr] = OrderedDict()
  2104. #self.val_presets[nr]["VALUE"] = 0
  2105. #self.val_presets[nr]["FX"] = ""
  2106. sdata = self.val_presets[nr]
  2107. for fix in sdata:
  2108. #print("exec.clear()",nr,fix,sdata[fix])
  2109. for attr in sdata[fix]:
  2110. row = sdata[fix][attr]
  2111. if fix == "CFG":
  2112. continue
  2113. if "VALUE" not in row:
  2114. row["VALUE"] = None
  2115. if "FX" not in row:
  2116. row["FX"] = ""
  2117. if "FX2" not in row:
  2118. row["FX2"] = OrderedDict()
  2119. elif row["FX2"]:
  2120. for k in ["SIZE","SPEED","START","OFFSET"]:
  2121. row["FX2"][k] = int( row["FX2"][k] )
  2122. row["FX"] = ""
  2123. if "FX" in row and row["FX"] and not row["FX2"]: # rebuild old FX to Dict-FX2
  2124. #"off:0:0:0:16909:-:"
  2125. x = row["FX"].split(":")
  2126. cprint("-fx",x,len(x))
  2127. #'FX2': {'TYPE': 'sinus', 'SIZE': 200, 'SPEED': 30, 'START': 0, 'OFFSET': 2805, 'BASE': '-'}}
  2128. if len(x) >= 6:
  2129. row["FX2"]["TYPE"] = x[0]
  2130. row["FX2"]["SIZE"] = int(x[1])
  2131. row["FX2"]["SPEED"] = int(x[2])
  2132. row["FX2"]["START"] = int(x[3])
  2133. row["FX2"]["OFFSET"] = int(x[4])
  2134. row["FX2"]["BASE"] = x[5]
  2135. row["FXOLD"] = row["FX"]
  2136. row["FX"] = ""
  2137. #cprint("exec.clear()",nr,fix,row)
  2138. def get_raw_map(self,nr):
  2139. self.clean(nr)
  2140. cprint("get_raw_map",nr)
  2141. sdata = self.val_presets[nr]
  2142. cmd = ""
  2143. out = []
  2144. dmx=-1
  2145. for fix in sdata:
  2146. if fix == "CFG":
  2147. #print("CFG",nr,sdata[fix])
  2148. continue
  2149. for attr in sdata[fix]:
  2150. x = {}
  2151. #print("RAW",attr)
  2152. x["FIX"] = fix
  2153. x["ATTR"] = attr
  2154. x["VALUE"] = sdata[fix][attr]["VALUE"]
  2155. x["FX"] = sdata[fix][attr]["FX"]
  2156. x["FX2"] = sdata[fix][attr]["FX2"]
  2157. #x["DMX"] = sdata[fix][attr]["NR"]
  2158. out.append(x)
  2159. return out
  2160. def get_btn_txt(self,nr):
  2161. sdata=self.val_presets[nr]
  2162. BTN="go"
  2163. if "CFG" in sdata:
  2164. if "BUTTON" in sdata["CFG"]:
  2165. BTN = sdata["CFG"]["BUTTON"]
  2166. _label = self.label_presets[nr] # = label
  2167. #txt=str(nr+1)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+_label
  2168. #txt=str(nr+1)+" "+str(BTN)+" "+str(len(sdata)-1)+"\n"+_label
  2169. txt="{} {} {}\n{}".format(nr+1,BTN,len(sdata)-1,_label)
  2170. cprint("get_btn_txt",nr,[txt])
  2171. return txt
  2172. def _btn_cfg(self,nr,txt=None):
  2173. if nr not in self.val_presets:
  2174. return ""
  2175. if "CFG" not in self.val_presets[nr]:
  2176. self.val_presets[nr]["CFG"] = OrderedDict()
  2177. return self.val_presets[nr]["CFG"]
  2178. def btn_cfg(self,nr,txt=None):
  2179. if nr not in self.val_presets:
  2180. return ""
  2181. if "CFG" not in self.val_presets[nr]:
  2182. self.val_presets[nr]["CFG"] = OrderedDict()
  2183. if "BUTTON" not in self.val_presets[nr]["CFG"]:
  2184. self.val_presets[nr]["CFG"]["BUTTON"] = ""
  2185. if type(txt) is str:
  2186. self.val_presets[nr]["CFG"]["BUTTON"] = txt
  2187. if self.val_presets[nr]["CFG"]["BUTTON"] is None:
  2188. self.val_presets[nr]["CFG"]["BUTTON"] = ""
  2189. master._refresh_exec(nr=nr)
  2190. cprint("EEE", self.val_presets[nr]["CFG"]["BUTTON"] )
  2191. return self.val_presets[nr]["CFG"]["BUTTON"]
  2192. def label(self,nr,txt=None):
  2193. if nr not in self.label_presets:
  2194. return ""
  2195. if type(txt) is str:
  2196. self.label_presets[nr] = txt
  2197. cprint("set label",nr,[txt])
  2198. cprint("??? ?? set label",nr,[txt])
  2199. return self.label_presets[nr]
  2200. def clear_move(self):
  2201. cprint("PRESETS.clear_move()",end=" ")
  2202. self.clear_copy()
  2203. def clear_copy(self):
  2204. cprint("PRESETS.clear_copy()",end=" ")
  2205. if self._last_copy is not None:
  2206. cprint("=OK=",color="red")
  2207. self._last_copy = None
  2208. else:
  2209. cprint("=NONE=",color="green")
  2210. def copy(self,nr,overwrite=1):
  2211. cprint("PRESETS._copy",nr,"last",self._last_copy)
  2212. if nr >= 0:
  2213. if self._last_copy is not None:
  2214. if modes.val("COPY"):
  2215. modes.val("COPY",3)
  2216. ok = self._copy(self._last_copy,nr,overwrite=overwrite)
  2217. return ok #ok
  2218. else:
  2219. if modes.val("COPY"):
  2220. modes.val("COPY",2)
  2221. self._last_copy = nr
  2222. cprint("PRESETS.copy START ",color="red")
  2223. return 0
  2224. return 1 # on error reset move
  2225. def _copy(self,nr_from,nr_to,overwrite=1):
  2226. cprint("PRESETS._copy",nr_from,"to",nr_to)
  2227. self.check_cfg(nr_from)
  2228. if type(self._last_copy) is None:
  2229. cprint("PRESETS._copy last nr is None",color="red")
  2230. return 0
  2231. cprint("------ PRESETS._copy", nr_from in self.val_presets , nr_to in self.val_presets)
  2232. if nr_from in self.val_presets and nr_to in self.val_presets:
  2233. fdata = self.val_presets[nr_from]
  2234. tdata = self.val_presets[nr_to]
  2235. #cprint(fdata)
  2236. flabel = self.label_presets[nr_from]
  2237. tlabel = self.label_presets[nr_to]
  2238. self.val_presets[nr_to] = copy.deepcopy(fdata)
  2239. self.label_presets[nr_to] = flabel
  2240. if not overwrite: #default
  2241. cprint("overwrite",overwrite)
  2242. self.val_presets[nr_from] = copy.deepcopy(tdata)
  2243. self.label_presets[nr_from] = tlabel
  2244. #self.label_presets[nr_from] = "MOVE"
  2245. self.clear_copy()
  2246. cprint("PRESETS.copy OK",color="green")
  2247. return 1
  2248. def move(self,nr):
  2249. cprint("PRESETS.move",self._last_copy,"to",nr)
  2250. if nr >= 0:
  2251. last = self._last_copy
  2252. if modes.val("MOVE"):
  2253. modes.val("MOVE",2)
  2254. ok= self.copy(nr,overwrite=0)
  2255. if ok and last >= 0:
  2256. if modes.val("MOVE"):
  2257. modes.val("MOVE",3)
  2258. cprint("PRESETS.move OK",color="red")
  2259. #self.delete(last)
  2260. return ok,nr,last #ok
  2261. return 0,nr,last # on error reset move
  2262. def delete(self,nr):
  2263. cprint("PRESETS.delete",nr)
  2264. ok=0
  2265. if nr in self.val_presets:
  2266. self.val_presets[nr] = OrderedDict()
  2267. self.label_presets[nr] = "-"
  2268. ok = 1
  2269. self.check_cfg(nr)
  2270. return ok
  2271. def rec(self,nr,data,arg=""):
  2272. cprint("rec",self,"rec()",len(data),arg)
  2273. self.check_cfg(nr)
  2274. self._check_cfg(data) #by ref
  2275. odata=self.val_presets[nr]
  2276. #print("odata",odata)
  2277. if "CFG" in odata:
  2278. if "BUTTON" in odata["CFG"]:
  2279. data["CFG"]["BUTTON"] = odata["CFG"]["BUTTON"]
  2280. self.val_presets[nr] = data
  2281. return 1
  2282. class FixtureEditor():
  2283. def __init__(self,dmx=1):
  2284. pass
  2285. self.elem=[]
  2286. self.dmx=dmx
  2287. cprint("init FixtureEditor",dmx)
  2288. def event(self,a1="",a2=""):
  2289. cprint([self.dmx,a1,a2])
  2290. j=[]
  2291. jdata = {'VALUE': int(a1), 'args': [] , 'FADE': 0,'DMX': str(self.dmx)}
  2292. j.append(jdata)
  2293. jclient_send(j)
  2294. class MasterWingX():
  2295. def __init__(self,dmx=1):
  2296. pass
  2297. self.elem=[]
  2298. self.dmx=dmx
  2299. cprint("init MasterWing",dmx)
  2300. def event(self,a1="",a2=""):
  2301. cprint([self.dmx,a1,a2])
  2302. jdata = {'CMD': "MASTER", 'NAME': str(a1),'VALUE':str(a2) }
  2303. j=[]
  2304. j.append(jdata)
  2305. jclient_send(j)
  2306. class BufferVar():
  2307. def __init__(self,elem):
  2308. self.elem = elem
  2309. def change_dmx(self,event=""):
  2310. nr=1
  2311. txt=""
  2312. def cb(data):
  2313. txt = data["Value"]
  2314. dialog._cb = _cb
  2315. dialog.askstring("FADER-DMX-START",""+str(nr+1),initialvalue=txt)
  2316. cprint("change_dmx",[event,self])
  2317. lf_nr = 0
  2318. from tkinter import PhotoImage
  2319. _shift_key = 0
  2320. class WindowManager():
  2321. def __init__(self):
  2322. self.windows = {}
  2323. self.obj = {}
  2324. self.nr= 0
  2325. self.first=""
  2326. self.window_init_buffer = {}
  2327. def update(self,w,name="",obj=None):
  2328. name = str(name)
  2329. for k in self.windows:
  2330. if k == name:
  2331. self.windows[str(name)] = w
  2332. self.obj[str(name)] = obj
  2333. def new(self,w,name="",obj=None,wcb=None):
  2334. name = str(name)
  2335. if wcb and name:
  2336. self.window_init_buffer[name] = wcb
  2337. if not self.first:
  2338. if name:
  2339. self.first = name
  2340. else:
  2341. self.first = str(self.nr)
  2342. if w:
  2343. w.tk.state(newstate='normal')
  2344. w.tk.attributes('-topmost',True)
  2345. if name:
  2346. self.windows[str(name)] = w
  2347. self.obj[str(name)] = obj
  2348. else:
  2349. self.windows[str(self.nr)] = w
  2350. self.obj[str(self.nr)] = obj
  2351. self.nr+=1
  2352. def mainloop(self):
  2353. self.windows[self.first].mainloop()
  2354. def get_win(self,name):
  2355. cprint(self,".get_win(name) =",name)
  2356. name = str(name)
  2357. if name in self.windows:
  2358. out = self.windows[name]
  2359. cprint(out)
  2360. return out
  2361. def get(self,name):
  2362. return get_win(name)
  2363. def get_obj(self,name):
  2364. name = str(name)
  2365. if name in self.windows:
  2366. out = self.obj[name]
  2367. return out
  2368. def create(self,name):
  2369. cprint( "create Window",name)
  2370. if name in self.window_init_buffer:
  2371. c = self.window_init_buffer[name]
  2372. #print("",c)
  2373. #print(dir(c))
  2374. w,obj,cb_ok = c.create()
  2375. window_manager.update(w,name,obj)
  2376. if cb_ok:
  2377. cb_ok()
  2378. resize = 1
  2379. if "resize" in c.args:
  2380. if not c.args["resize"]:
  2381. resize = 0
  2382. #if resize:
  2383. libwin.get_window_position(_filter=name,win=w)
  2384. if name in ["ENCODER"]:
  2385. global _ENCODER_WINDOW
  2386. _ENCODER_WINDOW = w
  2387. if name in ["DIMMER","FIXTURES"]:
  2388. refresher_fix.reset() # = Refresher()
  2389. def _check(self,name):
  2390. try:
  2391. self.windows[name].tk.state(newstate='normal')
  2392. return 1
  2393. except Exception as e:
  2394. cprint("exception",e,color="red")
  2395. cprint("info",name,self.windows[name],color="red")
  2396. def top(self,name):
  2397. name = str(name)
  2398. if name not in self.windows:
  2399. cprint(name,"not in self.windows",self.windows.keys())
  2400. return
  2401. if not self._check(name):
  2402. self.create(name)
  2403. w = self.windows[name]
  2404. #def get_lineno():
  2405. print(" 2.1- ln",movewin.get_lineno(),w,str(type(w)))
  2406. #if type(w) is type(window_create_buffer):
  2407. if not str(type(w)).startswith("<class 'function'>"):
  2408. w.tk.attributes('-topmost',True)
  2409. w.tk.attributes('-topmost',False)
  2410. w.tk.update_idletasks()
  2411. else:
  2412. print(" 2.2-",w)
  2413. w()
  2414. class Console():
  2415. def __init__(self):
  2416. pass
  2417. def flash_off(self,fix):
  2418. pass#client.send("df0:alloff:::,")
  2419. def fx_off(self,fix):
  2420. cprint("Console.fx_off()",fix)
  2421. if not fix or fix == "all":
  2422. #client.send("fx0:alloff:,fxf:alloff:,")
  2423. #client.send("df0:alloff:::,")
  2424. j = []
  2425. if 0:
  2426. jdata = {'VALUE': None, 'args': [], 'FX': 'alloff::::', 'FADE': 2, 'DMX': '0'}
  2427. j.append(jdata)
  2428. jdata = {'VALUE': None, 'args': [], 'FX': 'alloff::::', 'FADE': 2,'FLASH':1, 'DMX': '0'}
  2429. j.append(jdata)
  2430. else:
  2431. jdata = {'VALUE': None, 'args': [], 'FX2': {"TYPE":"alloff"}, 'FADE': 2,'FLASH':1, 'DMX': '1'}
  2432. j.append(jdata)
  2433. if not modes.val("BLIND"):
  2434. jclient_send(j)
  2435. return 0
  2436. def test_1():
  2437. #LibreLight --no-gui --show=unitest --dmx-out=on --exec="sel fix 1-10; go preset 2; encoder DIM sel; encoder DIM ++"
  2438. pass
  2439. window_manager = WindowManager()
  2440. CONSOLE = Console()
  2441. PRESETS = Presets()
  2442. FIXTURES = fixlib.Fixtures()
  2443. FIXTURES.gui = GUIHandler()
  2444. def LOAD_SHOW():
  2445. PRESETS.load_presets()
  2446. FIXTURES.load_patch()
  2447. #master._refresh_fix()
  2448. #master._refresh_exec()
  2449. LOAD_SHOW()
  2450. master = MASTER()
  2451. class Refresher():
  2452. def __init__(self):
  2453. self.time = time.time()
  2454. self.time_max = time.time()
  2455. self.time_delta = 15
  2456. self.update = 1
  2457. self.name = "name" # exec
  2458. self.cb = None #self.dummy_cb
  2459. def dummy_cb(self):
  2460. cprint(self,"dummy_cd()",time.time()-self.time)
  2461. def reset(self):
  2462. self.time = time.time()
  2463. self.update = 1
  2464. def refresh(self):
  2465. if self.update:
  2466. if self.time+self.time_delta < time.time():
  2467. self._refresh()
  2468. else:
  2469. self.time = time.time()
  2470. def _refresh(self):
  2471. cprint("_refresh()",self.name,self)
  2472. if not INIT_OK:
  2473. return
  2474. self.time_max = time.time()
  2475. self.time = time.time()
  2476. self.update = 0
  2477. try:
  2478. if self.cb:
  2479. self.cb()
  2480. else:
  2481. self.dummy_cb()
  2482. except Exception as e:
  2483. cprint("_refresh except:",e,"cb:",self.cb)
  2484. traceback.print_exc()
  2485. cprint()
  2486. cprint("t=",self.time_max- time.time())
  2487. def loop(self,args={}):
  2488. while 1:
  2489. try:
  2490. if INIT_OK:
  2491. self.refresh()
  2492. #tkinter.Tk.update_idletasks(gui_menu_gui.tk)
  2493. except Exception as e:
  2494. cprint("loop exc",e)
  2495. traceback.print_exc()
  2496. cprint("== cb EXCEPT",e,color="red")
  2497. cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
  2498. cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
  2499. time.sleep(0.2)
  2500. print("main",__name__)
  2501. __run_main = 0
  2502. if __name__ == "__main__":
  2503. __run_main = 1
  2504. else:
  2505. import __main__
  2506. if "unittest" not in dir(__main__):
  2507. __run_main = 1
  2508. refresher_fix = Refresher()
  2509. refresher_fix.time_delta = 0.50
  2510. refresher_fix.name = "fix"
  2511. refresher_fix.reset()
  2512. refresher_fix.cb = master._refresh_fix
  2513. refresher_exec = Refresher()
  2514. refresher_exec.time_delta = 10 #0
  2515. refresher_exec.name = "exec"
  2516. refresher_exec.reset()
  2517. refresher_exec.cb = master._refresh_exec
  2518. refresher_exec = Refresher()
  2519. refresher_exec.time_delta = 10 #0
  2520. refresher_exec.name = "exec-fader"
  2521. refresher_exec.reset()
  2522. refresher_exec.cb = refresh_exec_fader_cfg
  2523. def loops(**args):
  2524. time.sleep(5) # wait until draw all window's
  2525. cprint("-> run loops")
  2526. thread.start_new_thread(refresher_fix.loop,())
  2527. thread.start_new_thread(refresher_exec.loop,())
  2528. class window_create_sdl_buffer():
  2529. def __init__(self,args,cls,data,cb_ok=None,scroll=0,gui=None):
  2530. self.args = args.copy()
  2531. self.cls = cls
  2532. self.cb_ok = cb_ok
  2533. self.data = data
  2534. self.scroll = scroll
  2535. self.gui = gui
  2536. def create(self,hidde=0):
  2537. cprint()
  2538. return [self.cls,self.cls,None] #w,obj,cb_ok
  2539. class window_create_buffer():
  2540. def __init__(self,args,cls,data,cb_ok=None,scroll=0,gui=None):
  2541. self.args = args.copy()
  2542. self.cls = cls
  2543. self.cb_ok = cb_ok
  2544. self.data = data
  2545. self.scroll = scroll
  2546. self.gui = gui
  2547. def create(self,hidde=0):
  2548. cprint()
  2549. cprint()
  2550. cprint("window_create_buffer.create()",id(self),self.args["title"],color="green")
  2551. obj = None
  2552. w = libtk.Window(self.args)
  2553. out = []
  2554. f = None
  2555. h = None
  2556. if self.scroll:
  2557. head = None
  2558. foot = None
  2559. if "head" in self.args:
  2560. head = self.args["head"]
  2561. if "foot" in self.args:
  2562. foot = self.args["foot"]
  2563. w1 = ScrollFrame(w.tk,width=self.args["width"],height=self.args["height"],foot=foot,head=head)
  2564. if type(w1) is list:
  2565. try:
  2566. h = w1[0]
  2567. f = w1[2]
  2568. except:pass
  2569. w1 = w1[1]
  2570. else:
  2571. w1 = tk.Frame(w.tk,width=self.args["width"],height=self.args["height"])
  2572. w1.pack()
  2573. try:
  2574. obj=self.cls(self.gui,w1,self.data,foot=f,head=h)
  2575. except:
  2576. obj=self.cls(self.gui,w1,self.data)
  2577. return w,obj,self.cb_ok
  2578. def open_sdl_window():
  2579. cprint("open_sdl_window ... delay 1sec",color="yellow")
  2580. time.sleep(1)
  2581. movewin.startup_all_sdl()
  2582. if __run_main:
  2583. cprint("main")
  2584. #thread.start_new_thread(refresher_fix.loop,())
  2585. #thread.start_new_thread(refresher_exec.loop,())
  2586. TOP = _POS_TOP + 15
  2587. L0 = _POS_LEFT
  2588. L1 = _POS_LEFT + 95
  2589. L2 = _POS_LEFT + 920
  2590. W1 = 810
  2591. H1 = 550
  2592. HTB = 23 # hight of the titlebar from window manager
  2593. pos_list = libwin.read_window_position()
  2594. data = []
  2595. #data.append({"text":"COMMAND"})
  2596. #data.append({"text":"CONFIG"})
  2597. data.append({"text":"PATCH"})
  2598. data.append({"text":"DIMMER"})
  2599. data.append({"text":"FIXTURES"})
  2600. data.append({"text":"FIX-LIST"})
  2601. data.append({"text":"EXEC","name":"EXEC-BTN"})
  2602. data.append({"text":"EXEC-WING"})
  2603. data.append({"text":"---"})
  2604. data.append({"text":"SETUP"})
  2605. data.append({"text":"COMMAND"})
  2606. data.append({"text":"LIVE"})
  2607. data.append({"text":"FX"})
  2608. data.append({"text":"ENCODER"})
  2609. data.append({"text":"COLORPICKER","name":"COLOR"})
  2610. data.append({"text":"---"})
  2611. data.append({"text":"FIXTURE-EDITOR","name":"FIX-EDIT"})
  2612. data.append({"text":"CONFIG"})
  2613. data.append({"text":"SDL-MIDI"})
  2614. data.append({"text":"CLOCK"})
  2615. data.append({"text":"RAY-DMX"})
  2616. data.append({"text":"SDL-DMX"})
  2617. data.append({"text":"SDL-VPU"})
  2618. data.append({"text":"SDL-OSZI"})
  2619. data.append({"text":"---"})
  2620. data.append({"text":"---"})
  2621. data.append({"text":"- DEMO -"})
  2622. data.append({"text":"---"})
  2623. data.append({"text":"SDL-STAGE"})
  2624. data.append({"text":"SDL-Shader"})
  2625. #data.append({"text":"MASTER-WING"})
  2626. name="MAIN"
  2627. args = {"title":"MAIN","master":1,"width":80,"height":H1,"left":L0,"top":TOP,"resize":1}
  2628. geo = libwin.split_window_position(pos_list,name)
  2629. if geo:
  2630. args.update(geo)
  2631. cls = GUI_menu
  2632. cb_ok = None
  2633. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  2634. window_manager.new(None,name,wcb=c)
  2635. window_manager.top(name)
  2636. gui_menu_gui = window_manager.get_win(name)
  2637. gui_menu = window_manager.get_obj(name)
  2638. master._refresh_fix()
  2639. # =======================================================================
  2640. name="EXEC"
  2641. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  2642. geo = libwin.split_window_position(pos_list,name)
  2643. if geo:
  2644. args.update(geo)
  2645. data = PRESETS
  2646. cls = draw_exec #GUI_ExecWingLayout
  2647. cb_ok = None #set_exec_fader_all
  2648. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2649. window_manager.new(None,name,wcb=c)
  2650. if libwin.split_window_show(pos_list,_filter=name):
  2651. window_manager.top(name)
  2652. #print(dir(cls))
  2653. #print(cls)
  2654. #sys.exit()
  2655. # =======================================================================
  2656. name="SDL-MIDI"
  2657. def sdl_config():
  2658. cmd="nohup /usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/midi.py &"
  2659. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/midi.py " #&"
  2660. print(cmd)
  2661. #os.popen(cmd)
  2662. def xyz123(cmd):
  2663. os.system(cmd)
  2664. thread.start_new_thread(xyz123,(cmd,))
  2665. return [None,None,None]
  2666. #class window_create_sdl_buffer():
  2667. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  2668. geo = libwin.split_window_position(pos_list,name)
  2669. if geo:
  2670. args.update(geo)
  2671. data = []
  2672. cls = sdl_config #: None #GUI_CONF
  2673. cb_ok = None
  2674. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2675. window_manager.new(None,name,wcb=c)
  2676. if libwin.split_window_show(pos_list,_filter=name):
  2677. window_manager.top(name)
  2678. # =======================================================================
  2679. name="SDL-VPU"
  2680. def sdl_config():
  2681. cmd="nohup /usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/config.py &"
  2682. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/dmx.py " #&"
  2683. cmd="python3 /opt/LibreLight/Xdesk/vpu/watchdog_vpu.py -single"
  2684. print(cmd)
  2685. #os.popen(cmd)
  2686. def xyz123(cmd):
  2687. os.system(cmd)
  2688. thread.start_new_thread(xyz123,(cmd,))
  2689. return [None,None,None]
  2690. #class window_create_sdl_buffer():
  2691. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  2692. geo = libwin.split_window_position(pos_list,name)
  2693. if geo:
  2694. args.update(geo)
  2695. data = []
  2696. cls = sdl_config #: None #GUI_CONF
  2697. cb_ok = None
  2698. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2699. window_manager.new(None,name,wcb=c)
  2700. if libwin.split_window_show(pos_list,_filter=name):
  2701. window_manager.top(name)
  2702. # =======================================================================
  2703. #python3 /opt/LibreLight/Xdesk/vpu/watchdog_vpu.py -single
  2704. name="SDL-OSZI"
  2705. def sdl_config():
  2706. cmd="python3 /opt/LibreLight/ASP/monitor/oszi_grid.py"
  2707. print(cmd)
  2708. def xyz123(cmd):
  2709. os.system(cmd)
  2710. thread.start_new_thread(xyz123,(cmd,))
  2711. return [None,None,None]
  2712. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  2713. geo = libwin.split_window_position(pos_list,name)
  2714. if geo:
  2715. args.update(geo)
  2716. data = []
  2717. cls = sdl_config #: None #GUI_CONF
  2718. cb_ok = None
  2719. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2720. window_manager.new(None,name,wcb=c)
  2721. if libwin.split_window_show(pos_list,_filter=name):
  2722. window_manager.top(name)
  2723. # =======================================================================
  2724. #python3 /opt/LibreLight/Xdesk/vpu/watchdog_vpu.py -single
  2725. name="SDL-DMX"
  2726. def sdl_config():
  2727. cmd="nohup /usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/config.py &"
  2728. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/dmx.py " #&"
  2729. print(cmd)
  2730. #os.popen(cmd)
  2731. def xyz123(cmd):
  2732. os.system(cmd)
  2733. thread.start_new_thread(xyz123,(cmd,))
  2734. return [None,None,None]
  2735. #class window_create_sdl_buffer():
  2736. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  2737. geo = libwin.split_window_position(pos_list,name)
  2738. if geo:
  2739. args.update(geo)
  2740. data = []
  2741. cls = sdl_config #: None #GUI_CONF
  2742. cb_ok = None
  2743. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2744. window_manager.new(None,name,wcb=c)
  2745. if libwin.split_window_show(pos_list,_filter=name):
  2746. window_manager.top(name)
  2747. # =======================================================================
  2748. #python3 /opt/LibreLight/Xdesk/vpu/watchdog_vpu.py -single
  2749. name="RAY-DMX"
  2750. def sdl_config():
  2751. cmd="nohup /usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/config.py &"
  2752. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tkray/dmx.py " #&"
  2753. print(cmd)
  2754. #os.popen(cmd)
  2755. def xyz123(cmd):
  2756. os.system(cmd)
  2757. thread.start_new_thread(xyz123,(cmd,))
  2758. return [None,None,None]
  2759. #class window_create_sdl_buffer():
  2760. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  2761. geo = libwin.split_window_position(pos_list,name)
  2762. if geo:
  2763. args.update(geo)
  2764. data = []
  2765. cls = sdl_config #: None #GUI_CONF
  2766. cb_ok = None
  2767. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2768. window_manager.new(None,name,wcb=c)
  2769. if libwin.split_window_show(pos_list,_filter=name):
  2770. window_manager.top(name)
  2771. # =======================================================================
  2772. name="SDL-STAGE"
  2773. def sdl_config():
  2774. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk//3d/stage_3d.py " #&"
  2775. print(cmd)
  2776. #os.popen(cmd)
  2777. def xyz123(cmd):
  2778. os.system(cmd)
  2779. thread.start_new_thread(xyz123,(cmd,))
  2780. return [None,None,None]
  2781. #class window_create_sdl_buffer():
  2782. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  2783. geo = libwin.split_window_position(pos_list,name)
  2784. if geo:
  2785. args.update(geo)
  2786. data = []
  2787. cls = sdl_config #: None #GUI_CONF
  2788. cb_ok = None
  2789. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2790. window_manager.new(None,name,wcb=c)
  2791. if libwin.split_window_show(pos_list,_filter=name):
  2792. window_manager.top(name)
  2793. # =======================================================================
  2794. name="SDL-Shader"
  2795. def sdl_config():
  2796. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk//3d/demo_shaders.py " #&"
  2797. print(cmd)
  2798. #os.popen(cmd)
  2799. def xyz123(cmd):
  2800. os.system(cmd)
  2801. thread.start_new_thread(xyz123,(cmd,))
  2802. return [None,None,None]
  2803. #class window_create_sdl_buffer():
  2804. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  2805. geo = libwin.split_window_position(pos_list,name)
  2806. if geo:
  2807. args.update(geo)
  2808. data = []
  2809. cls = sdl_config #: None #GUI_CONF
  2810. cb_ok = None
  2811. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2812. window_manager.new(None,name,wcb=c)
  2813. if libwin.split_window_show(pos_list,_filter=name):
  2814. window_manager.top(name)
  2815. # =======================================================================
  2816. name="FIX-LIST"
  2817. def sdl_config():
  2818. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/fix.py " #&"
  2819. print(cmd)
  2820. #os.popen(cmd)
  2821. def xyz123(cmd):
  2822. os.system(cmd)
  2823. thread.start_new_thread(xyz123,(cmd,))
  2824. return [None,None,None]
  2825. #class window_create_sdl_buffer():
  2826. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  2827. geo = libwin.split_window_position(pos_list,name)
  2828. if geo:
  2829. args.update(geo)
  2830. data = []
  2831. cls = sdl_config #: None #GUI_CONF
  2832. cb_ok = None
  2833. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2834. window_manager.new(None,name,wcb=c)
  2835. if libwin.split_window_show(pos_list,_filter=name):
  2836. window_manager.top(name)
  2837. # =======================================================================
  2838. name="CONFIG"
  2839. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  2840. geo = libwin.split_window_position(pos_list,name)
  2841. if geo:
  2842. args.update(geo)
  2843. data = []
  2844. cls = GUI_CONF
  2845. cb_ok = None
  2846. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2847. window_manager.new(None,name,wcb=c)
  2848. if libwin.split_window_show(pos_list,_filter=name):
  2849. window_manager.top(name)
  2850. # =======================================================================
  2851. name="DIMMER"
  2852. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  2853. geo = libwin.split_window_position(pos_list,name)
  2854. if geo:
  2855. args.update(geo)
  2856. cls = GUI_DIM
  2857. data = FIXTURES
  2858. ok_cb=None
  2859. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2860. window_manager.new(None,name,wcb=c)
  2861. if libwin.split_window_show(pos_list,_filter=name):
  2862. window_manager.top(name)
  2863. # =======================================================================
  2864. name="FIXTURES"
  2865. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  2866. geo = libwin.split_window_position(pos_list,name)
  2867. if geo:
  2868. args.update(geo)
  2869. cls = GUI_FIX
  2870. ok_cb=None
  2871. data = FIXTURES
  2872. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2873. window_manager.new(None,name,wcb=c)
  2874. if libwin.split_window_show(pos_list,_filter=name):
  2875. window_manager.top(name)
  2876. # =======================================================================
  2877. name="FIXTURE-EDITOR"
  2878. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  2879. geo = libwin.split_window_position(pos_list,name)
  2880. if geo:
  2881. args.update(geo)
  2882. data=[]
  2883. for i in range(12*6):
  2884. data.append({"text"+str(i):"test"})
  2885. cls = GUI_FixtureEditor
  2886. #cls = GUI_FaderLayout
  2887. cb_ok = None
  2888. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  2889. window_manager.new(None,name,wcb=c)
  2890. #window_manager.top(name)
  2891. # =======================================================================
  2892. name="MASTER-WING"
  2893. args = {"title":name,"master":0,"width":75,"height":405,"left":L0,"top":TOP+H1-220,"resize":0}
  2894. geo = libwin.split_window_position(pos_list,name)
  2895. if geo:
  2896. args.update(geo)
  2897. data=[]
  2898. for i in range(2):
  2899. data.append({"MASTER"+str(i):"MASTER"})
  2900. cls = GUI_MasterWingLayout #(w1,data)
  2901. cb_ok = None
  2902. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  2903. window_manager.new(None,name,wcb=c)
  2904. if libwin.split_window_show(pos_list,_filter=name):
  2905. window_manager.top(name)
  2906. # =======================================================================
  2907. name="EXEC-WING"
  2908. args = {"title":name,"master":0,"width":600,"height":415,"left":L1,"top":TOP+H1+HTB*2,"H1":H1,"W1":W1}
  2909. geo = libwin.split_window_position(pos_list,name)
  2910. if geo:
  2911. args.update(geo)
  2912. data=[]
  2913. for i in range(10*3):
  2914. data.append({"EXEC"+str(i):"EXEC"})
  2915. cls = GUI_ExecWingLayout
  2916. cb_ok = set_exec_fader_all
  2917. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2918. window_manager.new(None,name,wcb=c)
  2919. if libwin.split_window_show(pos_list,_filter=name):
  2920. window_manager.top(name)
  2921. # =======================================================================
  2922. name="ENCODER"
  2923. args = {"title":name,"master":0,"width":620,"height":113,"left":L0+710,"top":TOP+H1+15+HTB*2}
  2924. geo = libwin.split_window_position(pos_list,name)
  2925. if geo:
  2926. args.update(geo)
  2927. cls = draw_enc #(master,w.tk)#Xroot)
  2928. cb_ok = None
  2929. data = FIXTURES #master
  2930. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  2931. window_manager.new(None,name,wcb=c)
  2932. if libwin.split_window_show(pos_list,_filter=name):
  2933. window_manager.top(name)
  2934. # =======================================================================
  2935. name = "SETUP"
  2936. args = {"title":name +" SHOW:"+master.base.show_name,
  2937. "master":0,"width":445,"height":42,"left":L1+10+W1,"top":TOP,"resize":10}
  2938. args["title"] = "SETUP SHOW:"+master.base.show_name
  2939. geo = libwin.split_window_position(pos_list,name)
  2940. try:
  2941. geo["width"] = args["width"]
  2942. geo["height"] = args["height"]
  2943. except:pass
  2944. if geo:
  2945. args.update(geo)
  2946. cls = draw_setup #(master,w.tk)
  2947. data = []
  2948. cb_ok = None
  2949. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  2950. window_manager.new(None,name,wcb=c)
  2951. if libwin.split_window_show(pos_list,_filter=name):
  2952. window_manager.top(name)
  2953. # =======================================================================
  2954. name = "COMMAND"
  2955. args = {"title":name,"master":0,"width":415,"height":130,"left":L1+10+W1,"top":TOP+81,"resize":10}
  2956. geo = libwin.split_window_position(pos_list,name)
  2957. if geo:
  2958. args.update(geo)
  2959. cls = draw_command #(master,w.tk)
  2960. data = []
  2961. cb_ok = None
  2962. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  2963. window_manager.new(None,name,wcb=c)
  2964. if libwin.split_window_show(pos_list,_filter=name):
  2965. window_manager.top(name)
  2966. # =======================================================================
  2967. name = "LIVE"
  2968. args = {"title":name,"master":0,"width":415,"height":42,"left":L1+10+W1,"top":TOP+235,"resize":10}
  2969. geo = libwin.split_window_position(pos_list,name)
  2970. if geo:
  2971. args.update(geo)
  2972. cls = draw_live #(master,w.tk)
  2973. data = []
  2974. cb_ok = None
  2975. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  2976. window_manager.new(None,name,wcb=c)
  2977. if libwin.split_window_show(pos_list,_filter=name):
  2978. window_manager.top(name)
  2979. # =======================================================================
  2980. name = "CLOCK"
  2981. args = {"title":name,"master":0,"width":335,"height":102,"left":L1+10+W1+80,"top":TOP+H1+HTB+160,"resize":0}
  2982. geo = libwin.split_window_position(pos_list,name)
  2983. if geo:
  2984. args.update(geo)
  2985. cclock = X_CLOCK()
  2986. cls = cclock.draw_clock
  2987. data = []
  2988. cb_ok = None
  2989. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  2990. window_manager.new(None,name,wcb=c)
  2991. if libwin.split_window_show(pos_list,_filter=name):
  2992. window_manager.top(name)
  2993. # =======================================================================
  2994. name="FX"
  2995. args = {"title":name,"master":0,"width":415,"height":297+30,"left":L1+10+W1,"top":TOP+302,"resize":1}
  2996. geo = libwin.split_window_position(pos_list,name)
  2997. if geo:
  2998. args.update(geo)
  2999. cls = draw_fx #(master,w.tk)
  3000. data = []
  3001. cb_ok = None
  3002. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  3003. window_manager.new(None,name,wcb=c)
  3004. if libwin.split_window_show(pos_list,_filter=name):
  3005. window_manager.top(name)
  3006. # =======================================================================
  3007. name="PATCH"
  3008. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP,"foot":1,"head":1}
  3009. geo = libwin.split_window_position(pos_list,name)
  3010. if geo:
  3011. args.update(geo)
  3012. cls = GUI_PATCH
  3013. data = FIXTURES
  3014. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  3015. window_manager.new(None,name,wcb=c) #,obj)
  3016. if libwin.split_window_show(pos_list,_filter=name):
  3017. window_manager.top(name)
  3018. # =======================================================================
  3019. name="COLORPICKER"
  3020. args = {"title":name,"master":0,"width":600,"height":113,"left":L1+5,"top":TOP+5+HTB*2+H1}
  3021. geo = libwin.split_window_position(pos_list,name)
  3022. if geo:
  3023. args.update(geo)
  3024. #w = libtk.Window(args)
  3025. #draw_colorpicker(master,w.tk,FIXTURES,master)
  3026. cls = draw_colorpicker #(master,w.tk,FIXTURES,master)
  3027. data = [FIXTURES,master]
  3028. cb_ok = None #FIXTURES
  3029. c = window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  3030. window_manager.new(None,name,wcb=c)
  3031. if libwin.split_window_show(pos_list,_filter=name):
  3032. window_manager.top(name)
  3033. # =======================================================================
  3034. name="TableA"
  3035. #w = libtk.Window(name,master=0,width=W1,height=H1,left=L1,top=TOP)
  3036. #space_font = tk.font.Font(family="FreeSans", size=1 ) #, weight="bold")
  3037. #x=TableFrame(root=w.tk)#,left=80,top=620)
  3038. #w.show()
  3039. #data =[]
  3040. #for a in range(40):
  3041. # data.append(["E","E{}".format(a+1)])
  3042. #x.draw(data=data,head=["E","C"],config=[12,5,5])
  3043. #w=x.bframe
  3044. #window_manager.new(w,name)
  3045. master.render()
  3046. window_manager.top("Table")
  3047. #w = frame_fix #Window("OLD",master=0,width=W1,height=500,left=130,top=TOP)
  3048. #window_manager.new(w,name)
  3049. #if "--easy" in sys.argv:
  3050. #load_window_position()
  3051. thread.start_new_thread(loops,())
  3052. mc_fix = MC_FIX()
  3053. def mc_fix_loop():
  3054. time.sleep(5)
  3055. while 1:
  3056. try:
  3057. #print(1)
  3058. data = FIXTURES.fixtures
  3059. mc_fix.set(index="fix",data=data)
  3060. except Exception as e:
  3061. print("MC_FIX EXCEPTION",e)
  3062. time.sleep(1/10)
  3063. thread.start_new_thread(mc_fix_loop,())
  3064. thread.start_new_thread(open_sdl_window,())
  3065. try:
  3066. window_manager.mainloop()
  3067. finally:
  3068. BASE_PATH = "/opt/LibreLight/Xdesk/"
  3069. movewin.process_kill(BASE_PATH+"tksdl/")
  3070. master.exit()