motion.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. #! /usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """
  4. This file is part of librelight.
  5. librelight is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, version 2 of the License.
  8. librelight is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with librelight. If not, see <http://www.gnu.org/licenses/>.
  14. (c) 2012 micha@librelight.de
  15. """
  16. import math, random
  17. import time,json
  18. class Sequence(object):
  19. def __init__(self):
  20. pass
  21. def go(self,ID,RANGE,ATTRIBUT):
  22. pass
  23. class Stack(object):
  24. "List of Presets"
  25. def __init__(self):
  26. self.__stacks = show.load_stacks(self.__show["NAME"],self.__stacks)
  27. def save(self):
  28. show.save_stacks(self.__show["NAME"],self.__stacks)
  29. def __str__(self):
  30. pass
  31. def go(self,ID):
  32. pass
  33. def pause(self,ID):
  34. pass
  35. def set(self,optinon,value):
  36. pass
  37. def next(self,FIX,ATTR):
  38. pass
  39. class Effect(object):
  40. """Effect sinus, cosinus, linear"""
  41. def __init__(self,TYPE="sinus",size=10,speed=100,offset=0,egroup=None,DIR=1):
  42. self.__type=TYPE
  43. self.__msize=255
  44. self.__mspeed=255
  45. self.__moffset=1
  46. self.__dir=DIR
  47. self.__mdir=1
  48. self.__size=size
  49. self.__speed=speed
  50. self.__base = None
  51. self.__offset = offset
  52. self.__vmax = -1000000
  53. self.__vmaxt = 0
  54. self.__vmin = 1000000
  55. self.__vmint = 0
  56. if self.__offset:
  57. self.__step = float(self.__offset*self.__moffset)
  58. else:
  59. self.__step = 0
  60. #self.__step = 0
  61. self.__old_step = 0#self.__step
  62. self.__old_rand = 0
  63. self.__egroup = egroup
  64. print(self)
  65. def __str__(self):
  66. return self.__repr__()
  67. def __repr__(self):
  68. return '<%(klass)s type:%(TYPE)s size:%(size)s base:%(base)s speed:%(speed)s offset:%(offset)s egroup:%(egroup)s msize:%(msize)s mspeed:%(mspeed)s moffset:%(moffset)s mdir:%(mdir)s _dir:%(_dir)s>' % dict(
  69. klass = self.__class__.__name__,
  70. TYPE = self.__type,
  71. size = self.__size,
  72. base = self.__base,
  73. speed = self.__speed,
  74. offset = self.__offset,
  75. egroup = self.__egroup,
  76. msize = self.__msize,
  77. mspeed = self.__mspeed,
  78. moffset = self.__moffset,
  79. mdir = self.__mdir,
  80. _dir = self.__dir
  81. )
  82. def __sinus(self,current_value):
  83. out = current_value + math.sin(self.__step/1000.)*self.__size*self.__msize/255 #+ self.__offset*self.__moffset/10
  84. if self.__mdir:
  85. if self.__dir:
  86. DIR = 0
  87. else:
  88. DIR = 1
  89. else:
  90. if self.__dir:
  91. DIR = 1
  92. else:
  93. DIR = 0
  94. #print(DIR)
  95. if DIR:
  96. self.__step += (self.__speed/100)*self.__mspeed/255 #+ self.__offset*self.__moffset/10
  97. else:
  98. #out = current_value + math.cos(self.__step/1000.)*self.__size*self.__msize/255 #+ self.__offset*self.__moffset/10
  99. self.__step -= (self.__speed/100)*self.__mspeed/255 #+ self.__offset*self.__moffset/10
  100. if int(out) > self.__vmax:
  101. self.__vmaxt = time.time()
  102. self.__vmax = int(out)
  103. #print("max schrittbreite ",self.__vmaxt - self.__vmint,"sec \t",self)
  104. if int(out) < self.__vmin:
  105. self.__vmint = time.time()
  106. self.__vmin = int(out)
  107. #print("min schrittbreite ",self.__vmaxt - self.__vmint,"sec \t",self)
  108. if out > 255:
  109. out = 255
  110. elif out < 0:
  111. out = 0
  112. #print(self)
  113. return out
  114. def __cosinus(self,current_value):
  115. out = current_value + math.cos(self.__step/1000.)*self.__size*self.__msize/255 #+ self.__offset*self.__moffset/10
  116. if self.__mdir:
  117. if self.__dir:
  118. DIR = 0
  119. else:
  120. DIR = 1
  121. else:
  122. if self.__dir:
  123. DIR = 1
  124. else:
  125. DIR = 0
  126. #if self.__mdir + self.__dir == 1:
  127. if DIR:
  128. #out = current_value + math.cos(self.__step/1000.)*self.__size*self.__msize/255 #+ self.__offset*self.__moffset/10
  129. self.__step += (self.__speed/100)*self.__mspeed/255 #+ self.__offset*self.__moffset/10
  130. else:
  131. #out = current_value + math.sin(self.__step/1000.)*self.__size*self.__msize/255 #+ self.__offset*self.__moffset/10
  132. self.__step -= (self.__speed/100)*self.__mspeed/255 #+ self.__offset*self.__moffset/10
  133. if out > 255:
  134. out = 255
  135. elif out < 0:
  136. out = 0
  137. return out
  138. def __linear(self,current_value):
  139. pass
  140. def __rand(self,current_value):
  141. #self.__step += int(self.__speed/10000)
  142. #print(self.__old_step-int(self.__speed/1000.) , time.time())
  143. if self.__old_step < time.time():
  144. self.__old_rand = random.randint(0,int(self.__size*self.__msize/255) )
  145. self.__old_step = time.time() + ( 10- ( ( self.__speed/100. ) *self.__mspeed/255 ) / 30000. )
  146. print("NEW SPEED :" ,self.__old_step, time.time() - self.__old_step)
  147. print("NEW RAND :" ,self.__old_rand)
  148. return self.__old_rand
  149. def get_egroup(self):
  150. return self.__egroup
  151. def set_mdir(self, mdir):
  152. if type(mdir) is int:
  153. if mdir != 0:
  154. mdir = 1
  155. self.__mdir=mdir
  156. else:
  157. print(self, "mdir not an int")
  158. #print(self.__mdir * self.__dir)
  159. def set_msize(self,msize):
  160. if type(msize) is int:
  161. self.__msize=msize
  162. else:
  163. print(self, "msize not an int")
  164. def set_mspeed(self,mspeed):
  165. if type(mspeed) is int:
  166. self.__mspeed=mspeed
  167. else:
  168. print(self, "mspeed not an int")
  169. def set_moffset(self,moffset):
  170. # set Master Offset
  171. if type(moffset) is int:
  172. if moffset != self.__moffset:
  173. val = self.__offset*self.__moffset
  174. self.__step -= float(val)
  175. #print("old offset ",val)
  176. self.__moffset = moffset
  177. val = self.__offset*self.__moffset
  178. self.__step += float(val)
  179. #print("new offset ",val)
  180. #self.__offset = float(val) self.__moffset=moffset
  181. #print("set moffset",moffset, self.__offset*self.__moffset/10)
  182. else:
  183. print(self, "moffset not an int")
  184. def set_size(self,val):
  185. self.__size = val
  186. def set_speed(self,val):
  187. self.__speed = val
  188. def set_type(self,val):
  189. self.__type = val
  190. def set_offset(self,val):
  191. self.__step -= float(self.__offset)
  192. self.__step += float(val)
  193. self.__offset = float(val)
  194. def next(self,current_value):
  195. self.__base = current_value
  196. if self.__type == "sinus":
  197. return self.__sinus(current_value)
  198. elif self.__type == "cosinus":
  199. return self.__cosinus(current_value)
  200. elif self.__type == "linear":
  201. return 0
  202. pass
  203. elif self.__type == "rand":
  204. return self.__rand(current_value)
  205. else:
  206. print("effect type \""+str(self.__type) +"\" unknown")
  207. return 0
  208. class FadeFast(object):
  209. """Fade 16bit mode as FLOAT
  210. Berechnet Schritte in "on the fly"
  211. """
  212. def __init__(self,start,target,fadetime=None,start_time=None):
  213. self.INIT = 0
  214. if target > 255.999:
  215. target = 255.999
  216. elif target < 0:
  217. target = 0
  218. if start_time:
  219. self.__start_time = start_time
  220. else:
  221. self.__start_time = time.time()
  222. self.fakt = 1. #1000.
  223. #feine aufloesung
  224. start = int(start*self.fakt)
  225. target = int(target*self.fakt)
  226. if not fadetime:
  227. start = target
  228. self.__start = start
  229. self.value = start
  230. self.old_ret = start
  231. self.__current = start
  232. self.__target = target
  233. self.__fadetime = fadetime
  234. self.__dist = target - start
  235. self.fine = 0
  236. #print(self.__class__.__name__,"(", self.__start/self.fakt, self.__target/self.fakt, self.__dist/self.fakt, self.__fadetime , ") NEW FADE OBJ")
  237. if self.__dist != 0:
  238. self.__step_time = fadetime / (self.__dist * 1.0)
  239. else:
  240. self.__step_time = 0
  241. if self.__step_time < 0:
  242. self.__step_time = self.__step_time *-1
  243. #print(self.__step_time)
  244. #print(self)
  245. def __dict__(self):
  246. return None
  247. def __str__(self):
  248. return self.__repr__()
  249. def __repr__(self):
  250. #return {"non":None}
  251. return '<%(klass)s start:%(start)s target:%(target)s fadetime:%(fadetime)ssec start_time:%(start_time)ssec>' % dict(
  252. klass = self.__class__.__name__,
  253. start = self.__start/self.fakt,
  254. target = self.__target/self.fakt,
  255. fadetime = self.__fadetime,
  256. start_time = self.__start_time
  257. )
  258. def next(self):
  259. jetzt = time.time()
  260. if self.fine:
  261. return 0
  262. if jetzt >= self.__fadetime + self.__start_time or not self.__step_time :
  263. if not self.INIT:
  264. #print(self.__fadetime,jetzt - self.__start_time)
  265. #print("end")
  266. self.INIT = 1
  267. self.value = self.__target/self.fakt
  268. self.fine = 1
  269. return 1
  270. elif jetzt < self.__start_time:
  271. self.value = self.__start
  272. return 0
  273. #return self.__start
  274. if self.__step_time :
  275. step = (jetzt - self.__start_time) / self.__step_time
  276. else:
  277. step = 0
  278. #print(self.__class__.__name__,"fade",self.__fadetime,"jetzt",jetzt,"start_t", self.__start_time,"start",self.__start,"step", step,"step_t",self.__step_time)
  279. if self.__start < self.__target:
  280. ret = int(self.__start + step)/self.fakt
  281. else:
  282. ret = int(self.__start - step)/self.fakt
  283. self.value = ret
  284. if self.old_ret != ret:
  285. self.old_ret = ret
  286. return 1
  287. #return ret
  288. return 0
  289. class Fade(object):
  290. """altes fade objekt
  291. Speicher fresser und initialisierung dauert
  292. alle einzelschritte werden bei der initialisierung erzeugt
  293. """
  294. def __init__(self,start,target,fadetime=None,start_time=None):
  295. self.INIT = 0
  296. if target > 255:
  297. target = 255
  298. if start_time:
  299. self.__time = start_time
  300. else:
  301. self.__time = time.time()
  302. #feine aufloesung
  303. start = int(start*100.)
  304. target = int(target*100.)
  305. if not fadetime:
  306. start = target
  307. self.__start = start
  308. self.__current = start
  309. self.__target = target
  310. self.__fadetime = fadetime
  311. self.__dist = target - start
  312. print(self.__class__.__name__,"(", self.__start/100., self.__target/100., self.__dist/100, self.__fadetime , ") NEW FADE OBJ")
  313. if self.__dist != 0:
  314. self.__step_time = fadetime / (self.__dist * 1.0)
  315. else:
  316. self.__step_time = 0
  317. self.__steps = []
  318. if self.__dist < 0:
  319. for i in range(self.__dist*-1):
  320. self.__steps.append([self.__start,0])
  321. elif self.__dist > 0:
  322. for i in range(self.__dist):
  323. self.__steps.append([self.__start,0])
  324. else:
  325. self.__steps.append([self.__target,time.time()])
  326. #print("DIST == 0")
  327. if self.__step_time < 0:
  328. self.__step_time = self.__step_time *-1
  329. i = 0
  330. #print(self#.__dist, self.__start ,self.__step_time)
  331. #erstelle alle schritte mit absolutem zeitstempel
  332. while self.__dist != 0:
  333. if self.__dist > 0:
  334. self.__current += 1
  335. self.__dist -= 1
  336. else:
  337. self.__current -= 1
  338. self.__dist += 1
  339. self.__time += self.__step_time
  340. self.__steps[i][0] = self.__current
  341. self.__steps[i][1] = self.__time
  342. i += 1
  343. #print(i,self.__steps, self.__dist, self.__start )
  344. def __str__(self):
  345. return self.__repr__()
  346. def __repr__(self):
  347. return '<%(klass)s start:%(start)s target:%(target)s fadetime:%(fadetime)s sec>' % dict(
  348. klass = self.__class__.__name__,
  349. start = self.__start/100.,
  350. target = self.__target/100.,
  351. fadetime = self.__fadetime,
  352. )
  353. def next(self):
  354. out = self.__start
  355. jetzt = time.time()
  356. #print(self.__start,self.__steps[-1])
  357. if jetzt < self.__steps[-1][1]:
  358. for i in self.__steps:
  359. if jetzt >= i[1]:
  360. out = i[0]
  361. #print(i, jetzt ,jetzt >= i[1])
  362. return out /100.
  363. else:
  364. return self.__steps[-1][0]/100.