meshcore 2.1.13__py3-none-any.whl → 2.1.14__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of meshcore might be problematic. Click here for more details.

Binary file
@@ -1,7 +1,8 @@
1
1
  import logging
2
+ import asyncio
2
3
  from typing import Optional
3
4
 
4
- from ..events import Event, EventType
5
+ from ..events import Event, EventDispatcher, EventType
5
6
  from .base import CommandHandlerBase, DestinationType, _validate_destination
6
7
 
7
8
  logger = logging.getLogger("meshcore")
@@ -17,26 +18,65 @@ class ContactCommands(CommandHandlerBase):
17
18
  print("Fetching contacts ", end="", flush=True)
18
19
  # wait first event
19
20
  res = await self.send(data)
20
- while True:
21
- # wait next event
22
- res = await self.wait_for_events(
23
- [EventType.NEXT_CONTACT, EventType.CONTACTS, EventType.ERROR],
24
- timeout=5)
25
- if res is None: # Timeout
26
- if anim:
21
+ timeout = 5
22
+ # Inline wait for events to continue waiting for CONTACTS event
23
+ # while receiving NEXT_CONTACTs (or it might be missed over serial)
24
+ try:
25
+ # Create futures for all expected events
26
+ futures = []
27
+ for event_type in [EventType.ERROR, EventType.NEXT_CONTACT, EventType.CONTACTS] :
28
+ future = asyncio.create_task(
29
+ self.dispatcher.wait_for_event(event_type, {}, timeout)
30
+ )
31
+ futures.append(future)
32
+
33
+ while True:
34
+
35
+ # Wait for the first event to complete or all to timeout
36
+ done, pending = await asyncio.wait(
37
+ futures, timeout=timeout, return_when=asyncio.FIRST_COMPLETED
38
+ )
39
+
40
+ # Check if any future completed successfully
41
+ if len(done) == 0:
27
42
  print(" Timeout")
28
- return res
29
- if res.type == EventType.ERROR:
30
- if anim:
31
- print(" Error")
32
- return res
33
- elif res.type == EventType.CONTACTS:
34
- if anim:
35
- print(" Done")
36
- return res
37
- elif res.type == EventType.NEXT_CONTACT:
38
- if anim:
39
- print(".", end="", flush=True)
43
+ for future in pending: # cancel all futures
44
+ future.cancel()
45
+ return None
46
+
47
+ for future in done:
48
+ event = await future
49
+
50
+ if event:
51
+ if event.type == EventType.NEXT_CONTACT:
52
+ if anim:
53
+ print(".", end="", flush=True)
54
+ else: # Done or Error ... cancel pending and return
55
+ if anim:
56
+ print(" Done" if event.type == EventType.CONTACTS else " Error")
57
+ for future in pending:
58
+ future.cancel()
59
+ return event
60
+
61
+ futures = []
62
+ for future in pending: # put back pending
63
+ futures.append(future)
64
+
65
+ future = asyncio.create_task( # and recreate NEXT_CONTACT
66
+ self.dispatcher.wait_for_event(EventType.NEXT_CONTACT, {}, timeout)
67
+ )
68
+ futures.append(future)
69
+
70
+ except asyncio.TimeoutError:
71
+ logger.debug(f"Timeout receiving contacts")
72
+ if anim:
73
+ print(" Timeout")
74
+ return None
75
+ except Exception as e:
76
+ logger.debug(f"Command error: {e}")
77
+ if anim:
78
+ print(" Error")
79
+ return Event(EventType.ERROR, {"error": str(e)})
40
80
 
41
81
  async def reset_path(self, key: DestinationType) -> Event:
42
82
  key_bytes = _validate_destination(key, prefix_length=32)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcore
3
- Version: 2.1.13
3
+ Version: 2.1.14
4
4
  Summary: Base classes for communicating with meshcore companion radios
5
5
  Project-URL: Homepage, https://github.com/fdlamotte/meshcore_py
6
6
  Project-URL: Issues, https://github.com/fdlamotte/meshcore_py/issues
@@ -9,13 +9,14 @@ meshcore/parsing.py,sha256=48PQkig-sqvsRlkF9zkvWhJoSq6ERCbGb_aRuCND5NI,4044
9
9
  meshcore/reader.py,sha256=mIewSrfsgt-qe-acoxGQncHZhEhRr_3CEZuN1afnr7E,24784
10
10
  meshcore/serial_cx.py,sha256=-kaqnqk7Ydufu2DECFfPDv4Xs-7gHUBuz8v0xf8fvvE,3969
11
11
  meshcore/tcp_cx.py,sha256=05YRVMnjY5aVBTJcHa0uG4VfFKGbV6hQ1pPIsJg4CDI,4227
12
+ meshcore/commands/.contact.py.swp,sha256=ukLHeYjDX9dKOGMyuN3BNJCFrTvgD5y1X0vj1Lp0j5U,24576
12
13
  meshcore/commands/__init__.py,sha256=NNmkTEcL-DLyuwKLUagEzpqe3C6ui2tETbu_mUd4p-I,441
13
14
  meshcore/commands/base.py,sha256=0bDHcNGlKoej03xJqzo_wL5ctoPQU5kcK1Ca5sZh1pk,7097
14
15
  meshcore/commands/binary.py,sha256=MVKXrT4pFSlzFkVFLBX988Eh57tRwunw4XPKBumbQNU,4890
15
- meshcore/commands/contact.py,sha256=D9aciwSmpWsbyY64bsNkI_bx8-utUgjjzbRHVLjv9ZE,4553
16
+ meshcore/commands/contact.py,sha256=fmOW3CrDZFuvDHhqP7WpZT_vps7PK9LUvra2CYm0El8,6273
16
17
  meshcore/commands/device.py,sha256=vstyy1crvhGbDgCAtyCWyjj3X8F2CpMw1LFTOwoHh6M,8273
17
18
  meshcore/commands/messaging.py,sha256=MIVGM5G8J16qimKjCHdrlEiVJ4g_MsBaZKPvRJHJcLU,8306
18
- meshcore-2.1.13.dist-info/METADATA,sha256=-4t1wQS5utb38xkQkJw-n0rOX_wLyY1oaPGUeWBD3ps,25317
19
- meshcore-2.1.13.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
20
- meshcore-2.1.13.dist-info/licenses/LICENSE,sha256=o62-JWT_C-ZqEtzb1Gl_PPtPr0pVT8KDmgji_Y_bejI,1075
21
- meshcore-2.1.13.dist-info/RECORD,,
19
+ meshcore-2.1.14.dist-info/METADATA,sha256=e_MjaWO0VyG1-ZTsL-hj8vWfvm6gIzUIVu42dhPHOAc,25317
20
+ meshcore-2.1.14.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
21
+ meshcore-2.1.14.dist-info/licenses/LICENSE,sha256=o62-JWT_C-ZqEtzb1Gl_PPtPr0pVT8KDmgji_Y_bejI,1075
22
+ meshcore-2.1.14.dist-info/RECORD,,