motion.py 13 KB

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