-
Notifications
You must be signed in to change notification settings - Fork 0
/
breathing.py
85 lines (76 loc) · 3.02 KB
/
breathing.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
"""
by Denexapp
"""
import denexapp_config as dconfig
import threading
import time
import math
from my_servo import Servo
class breathing():
servo = Servo(dconfig.breathing_pin)
stop = True
range = dconfig.breathing_max - dconfig.breathing_min
counter = (dconfig.breathing_min - dconfig.breathing_max)/range*math.pi
direction = math.copysign(1,dconfig.breathing_max - dconfig.breathing_min)
position = dconfig.breathing_min
delta = 2*math.pi/dconfig.breathing_time*30
def __init__(self):
#turn to default position
self.servo.start(0)
print "Init breath started"
def start_move(self):
if self.stop == True:
thread = threading.Thread(target=self.__start_move_action)
thread.daemon = True
thread.start()
def stop_move(self):
thread = threading.Thread(target=self.__stop_move_action)
thread.daemon = True
thread.start()
def __start_move_action(self):
self.stop=False
print "Start breathing action started"
paused = False
first_pause = True
pause_time = time.time()
while True:
if paused:
if pause_time + dconfig.breathing_delay/1000 < time.time():
paused = False
else:
self.position = (math.cos(self.counter)*0.5+0.5)*self.range+dconfig.breathing_min
self.servo.start(self.position)
self.counter += self.delta*self.direction
if self.direction == -1:
if self.counter + self.delta*self.direction < -math.pi:
self.direction = 1
if first_pause is False:
paused = True
pause_time = time.time()
self.position = dconfig.breathing_min
self.servo.start(0)
else:
first_pause = False
elif self.direction == 1:
if self.counter + self.delta*self.direction > 0:
self.direction = -1
time.sleep(0.03)
if self.stop:
print "Start breathing action stopped"
break
def __stop_move_action(self):
self.stop = True
print "Stop breathing action started"
self.direction = -1
if self.position != dconfig.breathing_min:
while (math.cos(self.counter+self.delta*self.direction)*0.5+0.5)*self.range+dconfig.breathing_min > dconfig.breathing_min:
self.counter+=self.delta*self.direction
self.position = (math.cos(self.counter)*0.5+0.5)*self.range+dconfig.breathing_min
self.servo.start(self.position)
time.sleep(0.03)
if self.stop == False:
break
if self.stop == True:
self.position = dconfig.breathing_min
self.servo.start(0)
print "Stop breathing action stoped"