@@ -23,9 +23,10 @@ class GGWave(Thread):
23
23
- slave devices keep emitting message until they get the ack (then connect to received host)
24
24
"""
25
25
26
- def __init__ (self , config = None ):
26
+ def __init__ (self , config = None , callbacks = None , debug = False ):
27
27
super ().__init__ (daemon = True )
28
28
self .config = config or {}
29
+ self .debug = debug
29
30
self .rx = self .config .get ("ggwave-rx" ) or \
30
31
find_executable ("ggwave-rx" ) or \
31
32
expanduser ("~/.local/bin/ggwave-rx" )
@@ -36,11 +37,8 @@ def __init__(self, config=None):
36
37
raise ValueError (f"ggwave-rx not found in { self .rx } , "
37
38
f"please install from https://github.com/ggerganov/ggwave" )
38
39
39
- self .OPCODES = {
40
- "HMPSWD:" : self .handle_pswd ,
41
- "HMKEY:" : self .handle_key ,
42
- "HMHOST:" : self .handle_host
43
- }
40
+ self .OPCODES = callbacks or {}
41
+
44
42
self .running = False
45
43
self .remote = self .config .get ("remote" , False )
46
44
if not isfile (self .tx ):
@@ -57,11 +55,16 @@ def run(self):
57
55
while self .running :
58
56
try :
59
57
txt = child .readline ().decode ("utf-8" ).strip ()
58
+ if self .debug and txt in ["Receiving sound data ..." ,
59
+ "Analyzing captured data .." ]:
60
+ LOG .debug (txt )
60
61
if txt .startswith (marker ):
61
62
payload = txt .split (marker )[- 1 ][1 :- 1 ]
62
63
for opcode , handler in self .OPCODES .items ():
63
64
if payload .startswith (opcode ):
64
65
p = payload .split (opcode , 1 )[- 1 ]
66
+ if self .debug :
67
+ LOG .debug (f"OPCODE: { opcode } PAYLOAD: { p } " )
65
68
handler (p )
66
69
break
67
70
else :
@@ -143,9 +146,13 @@ def __init__(self, bus=None, pswd=None, host=None, silent_mode=False, config=Non
143
146
self .bus = bus or FakeBus ()
144
147
self .host = host
145
148
self .pswd = pswd
146
- self .ggwave = GGWave (config )
149
+
150
+ callbacks = {
151
+ "HMKEY:" : self .handle_key
152
+ }
153
+
154
+ self .ggwave = GGWave (config , callbacks )
147
155
self .ggwave .handle_key = self .handle_key
148
- self .ggwave .handle_pswd = self .handle_pswd
149
156
150
157
# if in silent mode the password is assumed to be transmited out of band
151
158
# might be a string emited by the user with another ggwave implementation
@@ -175,23 +182,23 @@ def add_client(self, access_key):
175
182
176
183
def run (self ):
177
184
self .ggwave .start ()
185
+ LOG .info ("ggwave activated" )
178
186
self .pswd = self .pswd or os .urandom (8 ).hex ()
179
187
self .host = self .host or get_ip ()
180
188
self .bus .emit (Message ("hm.ggwave.activated" ))
189
+ if self .silent_mode :
190
+ LOG .info (f"to enrol a new device using ggwave emit the code HMPSWD:{ self .pswd } " )
181
191
while self .ggwave .running :
182
- time .sleep (3 )
192
+ time .sleep (5 )
183
193
if not self .silent_mode :
194
+ LOG .info ("broadcasting password" )
184
195
self .ggwave .emit (f"HMPSWD:{ self .pswd } " )
185
196
self .bus .emit (Message ("hm.ggwave.pswd_emitted" ))
186
197
187
- def handle_pswd (self , payload ):
188
- # password shared out of band, silent_mode trigger
189
- if not self .ggwave .running and payload == self .pswd :
190
- self .start ()
191
-
192
198
def stop (self ):
193
199
self .ggwave .stop ()
194
200
self .bus .emit (Message ("hm.ggwave.deactivated" ))
201
+ LOG .info ("ggwave deactivated" )
195
202
196
203
def handle_key (self , payload ):
197
204
if self .ggwave .running :
@@ -210,22 +217,28 @@ def __init__(self, key=None, bus=None, config=None):
210
217
self .bus = bus or FakeBus ()
211
218
self .pswd = None
212
219
self .key = key or os .urandom (8 ).hex ()
213
- self .ggwave = GGWave (config )
214
- self .ggwave .handle_pswd = self .handle_pswd
215
- self .ggwave .handle_host = self .handle_host
220
+ callbacks = {
221
+ "HMPSWD:" : self .handle_pswd ,
222
+ "HMHOST:" : self .handle_host
223
+ }
224
+ self .ggwave = GGWave (config , callbacks )
216
225
217
226
def start (self ):
218
227
self .ggwave .start ()
219
228
self .bus .emit (Message ("hm.ggwave.activated" ))
229
+ LOG .info ("ggwave activated" )
220
230
221
231
def stop (self ):
222
232
self .ggwave .stop ()
223
233
self .pswd = None
224
234
self .key = None
225
235
self .bus .emit (Message ("hm.ggwave.deactivated" ))
236
+ LOG .info ("ggwave deactivated" )
226
237
227
238
def handle_pswd (self , payload ):
239
+ LOG .info (f"ggwave password received: { payload } " )
228
240
if self .ggwave .running :
241
+ #LOG.info(f"ggwave password received: {payload}")
229
242
self .pswd = payload
230
243
self .bus .emit (Message ("hm.ggwave.pswd_received" ))
231
244
self .ggwave .emit (f"HMKEY:{ self .key } " )
@@ -234,6 +247,7 @@ def handle_pswd(self, payload):
234
247
def handle_host (self , payload ):
235
248
if self .ggwave .running :
236
249
host = payload
250
+ LOG .info (f"ggwave host received: { payload } " )
237
251
self .bus .emit (Message ("hm.ggwave.host_received" ))
238
252
if host and self .pswd and self .key :
239
253
identity = NodeIdentity ()
0 commit comments