/
lvsrv.py
executable file
·182 lines (145 loc) · 6.7 KB
/
lvsrv.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#!/usr/bin/env python
from lv import LV, STYPES
from player import Player
import os
import signal
import time
class LVService():
def __init__(self):
self.lv=LV()
self.lv.adminResetToNull()
# define for how many seconds ir trigger should do nothing
self.ir_enabled = True
self.ir_playback_timer = time.time()
self.ir_playback_timer_threshold = 120 # in seconds
# list of all mpg321 processes, used for killing stale processes
self.player_processes = []
#player in use flag
self.playing = False
# schedule fetch retry scheme settings
retry_counter = 0
retry_number = 5
retry_every_s = 10 # in seconds
# try to get the schedule
self.refresh_schedule()
# try to fetch the schedule N-times
while not self.schedule and (retry_counter < retry_number):
retry_counter += 1
print ("No schedule for me - #{} Retrying in {}s "
).format(retry_counter, retry_every_s)
time.sleep(retry_every_s)
self.refresh_schedule()
# configure the player if there is a schedule
if self.schedule:
# setup the player using custom callback functions
self.player=Player(vibration_callback=self.vibration_callback,
nfc_callback=self.nfc_callback,
ir_callback=self.ir_callback,
magnetic_callback=self.magnetic_callback,
pushtocross_callback=self.pushtocross_callback,
internal_callback=self.internal_callback,
broadcast_callback=self.broadcast_callback,
emergency_callback=self.emergency_callback)
self.player.setup()
def refresh_schedule(self):
"""
Gets the current schedule, then
"""
self.schedule=self.lv.getSchedule()
if self.schedule:
print "Got a schedule containing: %d item(s)" % len(self.schedule['schedule'])
print self.schedule['schedule']
self.urls=self.lv.getDlUrls(self.schedule)
#print "List of audio URLs to download \n %s \n" % u
if self.lv.dlAllFiles(self.urls):
self.lv.confirmScheduleRetrieval()
self.audio_vibration = self.lv.get_adverts(self.schedule, u'1')
self.audio_nfc = self.lv.get_adverts(self.schedule, u'2')
self.audio_ir = self.lv.get_adverts(self.schedule, u'3')
self.audio_magnetic = self.lv.get_adverts(self.schedule, u'4')
self.audio_pushtocross = self.lv.get_adverts(self.schedule, u'5')
self.audio_internal = self.lv.get_adverts(self.schedule, u'6')
self.audio_broadcast = self.lv.get_adverts(self.schedule, u'7')
self.audio_emergency = self.lv.get_adverts(self.schedule, u'8')
def vibration_callback(self, channel):
self.regular_playback(channel, self.audio_vibration)
def nfc_callback(self, channel):
self.regular_playback(channel, self.audio_nfc)
def ir_callback(self, channel):
"""
Custom callback method passed to the Player.
Should be executed when IR event is detected
"""
if self.player.input(channel):
print "IR switch callback"
if self.audio_ir:
diff = time.time() - self.ir_playback_timer
print "Time diff={}".format(diff)
if (diff > self.ir_playback_timer_threshold):
print "Re-enabling playback on IR trigger"
self.ir_enabled = True
if not self.playing and self.ir_enabled:
if self.ir_enabled or (diff > self.ir_playback_timer_threshold):
self.playing = True
audio = os.path.basename(self.audio_ir[0]['filename'])
vol = self.audio_ir[0]['avolume']
self.player.toggleRedLed()
self.player_processes.append(self.player.playMp3(audio, vol))
self.ir_playback_timer = time.time()
print "Disabling playback on IR trigger for: {}s".format(self.ir_playback_timer_threshold)
self.ir_enabled = False
self.playing = False
else:
wait = (self.ir_playback_timer_threshold - diff)
print "IR: sensor was triggered to quickly. Wait: {}s".format(wait)
else:
print "No ad to play for IR sensor"
def magnetic_callback(self, channel):
self.regular_playback(channel, self.audio_magnetic)
def pushtocross_callback(self, channel):
print "Push to cross callback"
self.regular_playback(channel, self.audio_pushtocross)
#if self.player.input(channel):
#self.player.toggleGreenLed()
#if self.player_processes:
#print "Stopping playback"
#self.stop_playback()
#print "refreshing schedule"
#self.refresh_schedule()
def internal_callback(self, channel):
self.regular_playback(channel, self.audio_internal)
def broadcast_callback(self, channel):
self.regular_playback(channel, self.audio_broadcast)
def emergency_callback(self, channel):
self.regular_playback(channel, self.audio_emergency)
def regular_playback(self, channel, ad):
"""
Custom callback method passed to the Player.
Should be executed when tilt event is detected
"""
if self.player.input(channel):
stype = STYPES[int(ad[0]['stype'])]
print "{} switch callback".format(stype)
if ad:
if not self.playing:
self.playing = True
audio = os.path.basename(ad[0]['filename'])
vol = ad[0]['avolume']
self.player.toggleRedLed()
self.player_processes.append(self.player.playMp3(audio, vol))
self.playing = False
else:
print "Other ad is already playing"
else:
print "No ad to play for {} switch/sensor".format(stype)
def stop_playback(self):
"""
kill the server subprocess group
"""
if self.player_processes:
for pid in self.player_processes:
print "\nKilling the player process: {}".format(pid)
os.killpg(pid.pid, signal.SIGTERM)
self.player_processes = []
if __name__ == "__main__":
srvs=LVService()