_LibreLightDesk.py 114 KB

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