Skip to content

Commit 68656e9

Browse files
committed
feat/ggwave
1 parent 3949271 commit 68656e9

File tree

1 file changed

+31
-17
lines changed

1 file changed

+31
-17
lines changed

hivemind_ggwave/__init__.py

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ class GGWave(Thread):
2323
- slave devices keep emitting message until they get the ack (then connect to received host)
2424
"""
2525

26-
def __init__(self, config=None):
26+
def __init__(self, config=None, callbacks=None, debug=False):
2727
super().__init__(daemon=True)
2828
self.config = config or {}
29+
self.debug = debug
2930
self.rx = self.config.get("ggwave-rx") or \
3031
find_executable("ggwave-rx") or \
3132
expanduser("~/.local/bin/ggwave-rx")
@@ -36,11 +37,8 @@ def __init__(self, config=None):
3637
raise ValueError(f"ggwave-rx not found in {self.rx}, "
3738
f"please install from https://github.com/ggerganov/ggwave")
3839

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+
4442
self.running = False
4543
self.remote = self.config.get("remote", False)
4644
if not isfile(self.tx):
@@ -57,11 +55,16 @@ def run(self):
5755
while self.running:
5856
try:
5957
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)
6061
if txt.startswith(marker):
6162
payload = txt.split(marker)[-1][1:-1]
6263
for opcode, handler in self.OPCODES.items():
6364
if payload.startswith(opcode):
6465
p = payload.split(opcode, 1)[-1]
66+
if self.debug:
67+
LOG.debug(f"OPCODE: {opcode} PAYLOAD: {p}")
6568
handler(p)
6669
break
6770
else:
@@ -143,9 +146,13 @@ def __init__(self, bus=None, pswd=None, host=None, silent_mode=False, config=Non
143146
self.bus = bus or FakeBus()
144147
self.host = host
145148
self.pswd = pswd
146-
self.ggwave = GGWave(config)
149+
150+
callbacks = {
151+
"HMKEY:": self.handle_key
152+
}
153+
154+
self.ggwave = GGWave(config, callbacks)
147155
self.ggwave.handle_key = self.handle_key
148-
self.ggwave.handle_pswd = self.handle_pswd
149156

150157
# if in silent mode the password is assumed to be transmited out of band
151158
# might be a string emited by the user with another ggwave implementation
@@ -175,23 +182,23 @@ def add_client(self, access_key):
175182

176183
def run(self):
177184
self.ggwave.start()
185+
LOG.info("ggwave activated")
178186
self.pswd = self.pswd or os.urandom(8).hex()
179187
self.host = self.host or get_ip()
180188
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}")
181191
while self.ggwave.running:
182-
time.sleep(3)
192+
time.sleep(5)
183193
if not self.silent_mode:
194+
LOG.info("broadcasting password")
184195
self.ggwave.emit(f"HMPSWD:{self.pswd}")
185196
self.bus.emit(Message("hm.ggwave.pswd_emitted"))
186197

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-
192198
def stop(self):
193199
self.ggwave.stop()
194200
self.bus.emit(Message("hm.ggwave.deactivated"))
201+
LOG.info("ggwave deactivated")
195202

196203
def handle_key(self, payload):
197204
if self.ggwave.running:
@@ -210,22 +217,28 @@ def __init__(self, key=None, bus=None, config=None):
210217
self.bus = bus or FakeBus()
211218
self.pswd = None
212219
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)
216225

217226
def start(self):
218227
self.ggwave.start()
219228
self.bus.emit(Message("hm.ggwave.activated"))
229+
LOG.info("ggwave activated")
220230

221231
def stop(self):
222232
self.ggwave.stop()
223233
self.pswd = None
224234
self.key = None
225235
self.bus.emit(Message("hm.ggwave.deactivated"))
236+
LOG.info("ggwave deactivated")
226237

227238
def handle_pswd(self, payload):
239+
LOG.info(f"ggwave password received: {payload}")
228240
if self.ggwave.running:
241+
#LOG.info(f"ggwave password received: {payload}")
229242
self.pswd = payload
230243
self.bus.emit(Message("hm.ggwave.pswd_received"))
231244
self.ggwave.emit(f"HMKEY:{self.key}")
@@ -234,6 +247,7 @@ def handle_pswd(self, payload):
234247
def handle_host(self, payload):
235248
if self.ggwave.running:
236249
host = payload
250+
LOG.info(f"ggwave host received: {payload}")
237251
self.bus.emit(Message("hm.ggwave.host_received"))
238252
if host and self.pswd and self.key:
239253
identity = NodeIdentity()

0 commit comments

Comments
 (0)