motion.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  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 = 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.__current = start
  231. self.__target = target
  232. self.__fadetime = fadetime
  233. self.__dist = target - start
  234. #print(self.__class__.__name__,"(", self.__start/self.fakt, self.__target/self.fakt, self.__dist/self.fakt, self.__fadetime , ") NEW FADE OBJ")
  235. if self.__dist != 0:
  236. self.__step_time = fadetime / (self.__dist * 1.0)
  237. else:
  238. self.__step_time = 0
  239. if self.__step_time < 0:
  240. self.__step_time = self.__step_time *-1
  241. #print(self.__step_time)
  242. #print(self)
  243. def __dict__(self):
  244. return None
  245. def __str__(self):
  246. return self.__repr__()
  247. def __repr__(self):
  248. #return {"non":None}
  249. return '<%(klass)s start:%(start)s target:%(target)s fadetime:%(fadetime)ssec start_time:%(start_time)ssec>' % dict(
  250. klass = self.__class__.__name__,
  251. start = self.__start/self.fakt,
  252. target = self.__target/self.fakt,
  253. fadetime = self.__fadetime,
  254. start_time = self.__start_time
  255. )
  256. def next(self):
  257. jetzt = time.time()
  258. if jetzt >= self.__fadetime + self.__start_time or not self.__step_time :
  259. if not self.INIT:
  260. #print(self.__fadetime,jetzt - self.__start_time)
  261. #print("end")
  262. self.INIT = 1
  263. return self.__target/self.fakt
  264. elif jetzt < self.__start_time:
  265. return self.__start
  266. if self.__step_time :
  267. step = (jetzt - self.__start_time) / self.__step_time
  268. else:
  269. step = 0
  270. #print(self.__class__.__name__,"fade",self.__fadetime,"jetzt",jetzt,"start_t", self.__start_time,"start",self.__start,"step", step,"step_t",self.__step_time)
  271. if self.__start < self.__target:
  272. return int(self.__start + step)/self.fakt
  273. else:
  274. return int(self.__start - step)/self.fakt
  275. class Fade(object):
  276. """altes fade objekt
  277. Speicher fresser und initialisierung dauert
  278. alle einzelschritte werden bei der initialisierung erzeugt
  279. """
  280. def __init__(self,start,target,fadetime=None,start_time=None):
  281. self.INIT = 0
  282. if target > 255:
  283. target = 255
  284. if start_time:
  285. self.__time = start_time
  286. else:
  287. self.__time = time.time()
  288. #feine aufloesung
  289. start = int(start*100.)
  290. target = int(target*100.)
  291. if not fadetime:
  292. start = target
  293. self.__start = start
  294. self.__current = start
  295. self.__target = target
  296. self.__fadetime = fadetime
  297. self.__dist = target - start
  298. print(self.__class__.__name__,"(", self.__start/100., self.__target/100., self.__dist/100, self.__fadetime , ") NEW FADE OBJ")
  299. if self.__dist != 0:
  300. self.__step_time = fadetime / (self.__dist * 1.0)
  301. else:
  302. self.__step_time = 0
  303. self.__steps = []
  304. if self.__dist < 0:
  305. for i in range(self.__dist*-1):
  306. self.__steps.append([self.__start,0])
  307. elif self.__dist > 0:
  308. for i in range(self.__dist):
  309. self.__steps.append([self.__start,0])
  310. else:
  311. self.__steps.append([self.__target,time.time()])
  312. #print("DIST == 0")
  313. if self.__step_time < 0:
  314. self.__step_time = self.__step_time *-1
  315. i = 0
  316. #print(self#.__dist, self.__start ,self.__step_time)
  317. #erstelle alle schritte mit absolutem zeitstempel
  318. while self.__dist != 0:
  319. if self.__dist > 0:
  320. self.__current += 1
  321. self.__dist -= 1
  322. else:
  323. self.__current -= 1
  324. self.__dist += 1
  325. self.__time += self.__step_time
  326. self.__steps[i][0] = self.__current
  327. self.__steps[i][1] = self.__time
  328. i += 1
  329. #print(i,self.__steps, self.__dist, self.__start )
  330. def __str__(self):
  331. return self.__repr__()
  332. def __repr__(self):
  333. return '<%(klass)s start:%(start)s target:%(target)s fadetime:%(fadetime)s sec>' % dict(
  334. klass = self.__class__.__name__,
  335. start = self.__start/100.,
  336. target = self.__target/100.,
  337. fadetime = self.__fadetime,
  338. )
  339. def next(self):
  340. out = self.__start
  341. jetzt = time.time()
  342. #print(self.__start,self.__steps[-1])
  343. if jetzt < self.__steps[-1][1]:
  344. for i in self.__steps:
  345. if jetzt >= i[1]:
  346. out = i[0]
  347. #print(i, jetzt ,jetzt >= i[1])
  348. return out /100.
  349. else:
  350. return self.__steps[-1][0]/100.