motorcortex-python 1.0.0rc2__tar.gz → 1.0.2__tar.gz

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.
Files changed (36) hide show
  1. {motorcortex_python-1.0.0rc2/motorcortex_python.egg-info → motorcortex_python-1.0.2}/PKG-INFO +1 -1
  2. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/__init__.py +58 -20
  3. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/_request_builders.py +1 -1
  4. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/_request_utils.py +2 -2
  5. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/message_types.py +45 -38
  6. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/motorcortex_pb2.py +8 -8
  7. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/motorcortex_pb2.pyi +39 -3
  8. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/request.py +1 -1
  9. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/session.py +1 -1
  10. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/subscribe.py +2 -2
  11. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/subscription.py +2 -2
  12. motorcortex_python-1.0.2/motorcortex/version.py +1 -0
  13. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2/motorcortex_python.egg-info}/PKG-INFO +1 -1
  14. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/pyproject.toml +1 -1
  15. motorcortex_python-1.0.0rc2/motorcortex/version.py +0 -1
  16. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/LICENSE +0 -0
  17. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/MANIFEST.in +0 -0
  18. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/README.md +0 -0
  19. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/_connection_state.py +0 -0
  20. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/_subscribe_dispatch.py +0 -0
  21. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/exceptions.py +0 -0
  22. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/init_threads.py +0 -0
  23. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/motorcortex_hash.json +0 -0
  24. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/nng_url.py +0 -0
  25. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/parameter_tree.py +0 -0
  26. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/py.typed +0 -0
  27. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/reply.py +0 -0
  28. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/setup_logger.py +0 -0
  29. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/state_callback_handler.py +0 -0
  30. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex/timespec.py +0 -0
  31. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex_python.egg-info/SOURCES.txt +0 -0
  32. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex_python.egg-info/dependency_links.txt +0 -0
  33. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex_python.egg-info/requires.txt +0 -0
  34. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/motorcortex_python.egg-info/top_level.txt +0 -0
  35. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/setup.cfg +0 -0
  36. {motorcortex_python-1.0.0rc2 → motorcortex_python-1.0.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: motorcortex-python
3
- Version: 1.0.0rc2
3
+ Version: 1.0.2
4
4
  Summary: Python bindings for Motorcortex Engine
5
5
  Home-page: https://www.motorcortex.io
6
6
  Author: Alexey Zakharov
@@ -181,6 +181,56 @@ def makeUrl(address: str, port: int | None) -> str:
181
181
  return address
182
182
 
183
183
 
184
+ def _reconnect_state_update(
185
+ req: Any, sub: Any, state: "ConnectionState", *,
186
+ motorcortex_types: "MessageTypes",
187
+ login: Any,
188
+ password: Any,
189
+ token_interval_sec: float,
190
+ initial_connect_done: list,
191
+ ) -> None:
192
+ """Default ``state_update`` body for :func:`connect` in reconnect mode.
193
+
194
+ Fires on every state transition from the ``StateCallbackHandler``
195
+ worker thread. Only acts on the ``CONNECTION_OK`` edge *after* the
196
+ initial connect has completed — i.e. on a successful **reconnect**:
197
+
198
+ 1. Try to restore the previous session via ``restoreSession(token)``.
199
+ Silent 5-second timeout + generic exception swallow — on any
200
+ failure we fall through to step 2 so a torn-down session never
201
+ leaves the reconnect half-authenticated.
202
+ 2. Otherwise re-login with the originally supplied credentials.
203
+ 3. Kick the token-refresh timer and resubscribe all existing groups
204
+ on the Subscribe side.
205
+
206
+ Extracted from a closure inside :func:`connect` so it can be
207
+ unit-tested without spinning up a real server. ``initial_connect_done``
208
+ is passed as a 1-element list so the caller (``connect``) can flip
209
+ the flag after the first successful connect without rebinding.
210
+ """
211
+ if state != ConnectionState.CONNECTION_OK or not initial_connect_done[0]:
212
+ return
213
+
214
+ restored = False
215
+ if req.token:
216
+ try:
217
+ restore_reply = req.restoreSession(req.token)
218
+ restore_msg = restore_reply.get(timeout_ms=5000)
219
+ motorcortex_msg = motorcortex_types.motorcortex()
220
+ if restore_msg and restore_msg.status == motorcortex_msg.OK:
221
+ restored = True
222
+ logger.debug("[SESSION] Session restored using token")
223
+ except Exception as e:
224
+ logger.debug(f"[SESSION] Token restore failed: {e}")
225
+
226
+ if not restored:
227
+ logger.debug("[SESSION] Falling back to login")
228
+ req.login(login, password).get()
229
+
230
+ req._startTokenRefresh(token_interval_sec)
231
+ sub.resubscribe()
232
+
233
+
184
234
  def connect(
185
235
  url: str,
186
236
  motorcortex_types: "MessageTypes",
@@ -233,26 +283,14 @@ def connect(
233
283
  if reconnect and not kwargs.get("state_update"):
234
284
 
235
285
  def stateUpdate(req, sub, state):
236
- if state == ConnectionState.CONNECTION_OK and initial_connect_done[0]:
237
- # Try to restore session using token, fall back to login
238
- restored = False
239
- if req.token:
240
- try:
241
- restore_reply = req.restoreSession(req.token)
242
- restore_msg = restore_reply.get(timeout_ms=5000)
243
- motorcortex_msg = motorcortex_types.motorcortex()
244
- if restore_msg and restore_msg.status == motorcortex_msg.OK:
245
- restored = True
246
- logger.debug("[SESSION] Session restored using token")
247
- except Exception as e:
248
- logger.debug(f"[SESSION] Token restore failed: {e}")
249
-
250
- if not restored:
251
- logger.debug("[SESSION] Falling back to login")
252
- req.login(kwargs.get("login"), kwargs.get("password")).get()
253
-
254
- req._startTokenRefresh(token_interval_sec)
255
- sub.resubscribe()
286
+ _reconnect_state_update(
287
+ req, sub, state,
288
+ motorcortex_types=motorcortex_types,
289
+ login=kwargs.get("login"),
290
+ password=kwargs.get("password"),
291
+ token_interval_sec=token_interval_sec,
292
+ initial_connect_done=initial_connect_done,
293
+ )
256
294
 
257
295
  kwargs.update(state_update=stateUpdate)
258
296
 
@@ -21,7 +21,7 @@ from typing import Any, Optional, TYPE_CHECKING
21
21
 
22
22
  from motorcortex.setup_logger import logger
23
23
 
24
- if TYPE_CHECKING:
24
+ if TYPE_CHECKING: # pragma: no cover
25
25
  from motorcortex.message_types import MessageTypes
26
26
  from motorcortex.parameter_tree import ParameterTree
27
27
 
@@ -242,7 +242,7 @@ def _purge_stale_cache_files(path: str) -> None:
242
242
  try:
243
243
  os.unlink(match)
244
244
  logger.debug("[REQUEST] Evicted stale cache file: %s", entry)
245
- except OSError:
245
+ except OSError: # pragma: no cover
246
246
  pass
247
247
 
248
248
 
@@ -276,7 +276,7 @@ def save_parameter_tree_file(path: str, parameter_tree: Any) -> Any:
276
276
  with os.fdopen(fd, "w") as outfile:
277
277
  outfile.write(json.dumps(envelope))
278
278
  os.replace(tmp_path, path)
279
- except Exception:
279
+ except Exception: # pragma: no cover
280
280
  # Clean up the temp file if the rename never ran.
281
281
  if os.path.exists(tmp_path):
282
282
  try:
@@ -5,38 +5,23 @@
5
5
  # All rights reserved. Copyright (c) 2016 VECTIONEER.
6
6
  #
7
7
 
8
- from __future__ import unicode_literals
9
8
  import motorcortex.motorcortex_pb2
10
9
  import logging
11
- import sys
12
10
  import os
11
+ from importlib.machinery import SourceFileLoader
12
+ from types import ModuleType
13
13
 
14
- if sys.version_info[0] >= 3:
15
- from importlib.machinery import SourceFileLoader
16
14
 
17
- if sys.version_info[1] < 4:
18
- def importLibrary(name, path):
19
- return SourceFileLoader(name, path).load_module()
20
- else:
21
- from types import ModuleType
15
+ def importLibrary(name, path):
16
+ loader = SourceFileLoader(name, path)
17
+ mod = ModuleType(loader.name)
18
+ loader.exec_module(mod)
19
+ return mod
22
20
 
23
21
 
24
- def importLibrary(name, path):
25
- loader = SourceFileLoader(name, path)
26
- mod = ModuleType(loader.name)
27
- loader.exec_module(mod)
28
- return mod
29
- else:
30
- from builtins import bytes
31
- from imp import load_source
32
-
33
-
34
- def importLibrary(name, path):
35
- return load_source(name, path)
36
-
37
22
  from json import load
38
23
  from inspect import ismodule
39
- from typing import Dict
24
+ from typing import Any, Dict
40
25
 
41
26
  from collections import namedtuple
42
27
  import struct
@@ -270,7 +255,7 @@ class MessageTypes(object):
270
255
  self._hashes_by_name[name] = hash
271
256
  self._types_by_hash[hash] = PrimitiveTypes(name)
272
257
  logging.debug(f"Loaded types from {name}")
273
- except Exception:
258
+ except Exception: # pragma: no cover
274
259
  # Best-effort — not every namespace declares the enum we're
275
260
  # probing for. Swallowed by design, but scoped to Exception
276
261
  # so KeyboardInterrupt / SystemExit still propagate.
@@ -282,7 +267,7 @@ class MessageTypes(object):
282
267
  for key in enum.DESCRIPTOR.values:
283
268
  setattr(module, key.name, key.number)
284
269
  logging.debug(f"Loaded enumerator {enum_name}")
285
- except Exception:
270
+ except Exception: # pragma: no cover
286
271
  # Same best-effort pattern as _loadPrimitives.
287
272
  pass
288
273
 
@@ -348,6 +333,27 @@ class MessageTypes(object):
348
333
 
349
334
  return None
350
335
 
336
+ def _safe_decode_value(self, info: Any, value_bytes: bytes) -> Any:
337
+ """Decode a parameter's value bytes, returning None on failure.
338
+
339
+ Failure modes we tolerate:
340
+ - Empty value bytes (server didn't provide value; e.g. some error paths).
341
+ - Unknown data_type hash (param info malformed or a type the SDK
342
+ doesn't have a decoder for).
343
+ - Decoder raises (corrupt bytes, length mismatch, etc.).
344
+
345
+ The caller checks status to decide whether to trust the returned value.
346
+ """
347
+ if not value_bytes:
348
+ return None
349
+ value_type = self._types_by_hash.get(info.data_type)
350
+ if value_type is None:
351
+ return None
352
+ try:
353
+ return value_type.decode(value_bytes, info.number_of_elements)
354
+ except Exception:
355
+ return None
356
+
351
357
  def decode(self, wire_data):
352
358
  """Decodes data received from the server"""
353
359
 
@@ -358,22 +364,23 @@ class MessageTypes(object):
358
364
  msg.ParseFromString(buf)
359
365
 
360
366
  if type_inst.decode_value == motorcortex_parameter_msg:
361
- if msg.status == motorcortex.OK:
362
- value_type = self._types_by_hash[msg.info.data_type]
363
- return ParameterMsg(msg.header, msg.info, value_type.decode(msg.value, msg.info.number_of_elements),
364
- motorcortex.OK)
365
- else:
366
- return ParameterMsg(msg.header, msg.info, None, msg.status)
367
+ # Always attempt to decode the value bytes. On non-OK status (e.g.
368
+ # TIMEOUT_WAITING_FOR_UPDATE) the server still provides the stale
369
+ # buffer contents for forensic use; preserve them and let the caller
370
+ # decide whether to use the value based on status + timestamp age.
371
+ return ParameterMsg(msg.header, msg.info,
372
+ self._safe_decode_value(msg.info, msg.value),
373
+ msg.status)
367
374
  elif type_inst.decode_value == motorcortex_parameter_list_msg:
368
375
  params = []
369
376
  for param in msg.params:
370
- if msg.status == motorcortex.OK:
371
- value_type = self._types_by_hash[param.info.data_type]
372
- params.append(ParameterMsg(param.header, param.info,
373
- value_type.decode(param.value, param.info.number_of_elements),
374
- motorcortex.OK))
375
- else:
376
- params.append(ParameterMsg(param.header, param.info, None, msg.status))
377
+ # Use the per-element status, not the outer ParameterListMsg status —
378
+ # individual elements can have their own status (e.g. one element
379
+ # times out while others succeed) and that distinction is the whole
380
+ # point of the typed status code.
381
+ params.append(ParameterMsg(param.header, param.info,
382
+ self._safe_decode_value(param.info, param.value),
383
+ param.status))
377
384
  return ParameterListMsg(msg.header, params)
378
385
 
379
386
  return msg
@@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default()
13
13
 
14
14
 
15
15
 
16
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11motorcortex.proto\x12\x0bmotorcortex\"i\n\x0fParameterOffset\x12\x36\n\x04type\x18\x01 \x02(\x0e\x32\x17.motorcortex.OffsetType:\x0fOFFSET_ELEMENTS\x12\x0e\n\x06offset\x18\x02 \x02(\r\x12\x0e\n\x06length\x18\x03 \x02(\r\"f\n\x05\x45rror\x12\x11\n\ttimestamp\x18\x01 \x02(\x06\x12\x14\n\x0c\x65rror_number\x18\x02 \x02(\x07\x12\x13\n\x0b\x65rror_level\x18\x03 \x02(\x07\x12\x11\n\tsubsystem\x18\x04 \x02(\x07\x12\x0c\n\x04info\x18\x05 \x02(\x07\"a\n\tErrorList\x12\"\n\x06\x65rrors\x18\x01 \x03(\x0b\x32\x12.motorcortex.Error\x12\x18\n\x10number_of_errors\x18\x02 \x02(\x07\x12\x16\n\x0eupdate_counter\x18\x03 \x02(\x07\"\x8a\x02\n\rParameterInfo\x12\n\n\x02id\x18\x01 \x02(\r\x12\x11\n\tdata_type\x18\x02 \x02(\r\x12\x11\n\tdata_size\x18\x03 \x02(\r\x12\x1a\n\x12number_of_elements\x18\x04 \x02(\r\x12\r\n\x05\x66lags\x18\x05 \x02(\r\x12\x13\n\x0bpermissions\x18\x06 \x02(\r\x12.\n\nparam_type\x18\x07 \x02(\x0e\x32\x1a.motorcortex.ParameterType\x12(\n\x08group_id\x18\x08 \x02(\x0e\x32\x16.motorcortex.UserGroup\x12\x1f\n\x04unit\x18\t \x02(\x0e\x32\x11.motorcortex.Unit\x12\x0c\n\x04path\x18\n \x02(\t\"\x94\x01\n\x12GroupParameterInfo\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0e\n\x06offset\x18\x02 \x02(\r\x12\x0c\n\x04size\x18\x03 \x02(\r\x12(\n\x04info\x18\x04 \x02(\x0b\x32\x1a.motorcortex.ParameterInfo\x12\'\n\x06status\x18\x05 \x02(\x0e\x32\x17.motorcortex.StatusCode\"1\n\x06Header\x12\x14\n\x0c\x66rameCounter\x18\x01 \x02(\x07\x12\x11\n\ttimestamp\x18\x02 \x02(\x06\"Z\n\x08GroupMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12)\n\x06params\x18\x02 \x03(\x0b\x32\x19.motorcortex.ParameterMsg\"Y\n\tStatusMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\'\n\x06status\x18\x02 \x02(\x0e\x32\x17.motorcortex.StatusCode\"P\n\x08LoginMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\r\n\x05login\x18\x02 \x02(\t\x12\x10\n\x08password\x18\x03 \x02(\t\"9\n\x12GetSessionTokenMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\"n\n\x0fSessionTokenMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\r\n\x05token\x18\x02 \x02(\t\x12\'\n\x06status\x18\x03 \x02(\x0e\x32\x17.motorcortex.StatusCode\"G\n\x11RestoreSessionMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\r\n\x05token\x18\x02 \x02(\t\"0\n\tLogoutMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\":\n\x13GetParameterTreeMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\"\x9a\x01\n\x10ParameterTreeMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12*\n\x06params\x18\x02 \x03(\x0b\x32\x1a.motorcortex.ParameterInfo\x12\x0c\n\x04hash\x18\x03 \x02(\r\x12\'\n\x06status\x18\x04 \x02(\x0e\x32\x17.motorcortex.StatusCode\">\n\x17GetParameterTreeHashMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\"r\n\x14ParameterTreeHashMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\x0c\n\x04hash\x18\x02 \x02(\r\x12\'\n\x06status\x18\x03 \x02(\x0e\x32\x17.motorcortex.StatusCode\"h\n\x0e\x43reateGroupMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\x13\n\x0b\x66rq_divider\x18\x02 \x02(\r\x12\r\n\x05\x61lias\x18\x03 \x02(\t\x12\r\n\x05paths\x18\x04 \x03(\t\"\xaa\x01\n\x0eGroupStatusMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\n\n\x02id\x18\x02 \x02(\r\x12\r\n\x05\x61lias\x18\x03 \x02(\t\x12/\n\x06params\x18\x04 \x03(\x0b\x32\x1f.motorcortex.GroupParameterInfo\x12\'\n\x06status\x18\x05 \x02(\x0e\x32\x17.motorcortex.StatusCode\"D\n\x0eRemoveGroupMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\r\n\x05\x61lias\x18\x02 \x02(\t\"D\n\x0fGetParameterMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\x0c\n\x04path\x18\x02 \x02(\t\"\x95\x01\n\x0cParameterMsg\x12\r\n\x05value\x18\x01 \x02(\x0c\x12#\n\x06header\x18\x02 \x01(\x0b\x32\x13.motorcortex.Header\x12(\n\x04info\x18\x03 \x01(\x0b\x32\x1a.motorcortex.ParameterInfo\x12\'\n\x06status\x18\x04 \x02(\x0e\x32\x17.motorcortex.StatusCode\"h\n\x13GetParameterListMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12,\n\x06params\x18\x02 \x03(\x0b\x32\x1c.motorcortex.GetParameterMsg\"\x8b\x01\n\x10ParameterListMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12)\n\x06params\x18\x02 \x03(\x0b\x32\x19.motorcortex.ParameterMsg\x12\'\n\x06status\x18\x03 \x02(\x0e\x32\x17.motorcortex.StatusCode\"\x81\x01\n\x0fSetParameterMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12,\n\x06offset\x18\x02 \x01(\x0b\x32\x1c.motorcortex.ParameterOffset\x12\x0c\n\x04path\x18\x03 \x02(\t\x12\r\n\x05value\x18\x04 \x02(\x0c\"h\n\x13SetParameterListMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12,\n\x06params\x18\x02 \x03(\x0b\x32\x1c.motorcortex.SetParameterMsg\"\x99\x01\n\x15OverwriteParameterMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12,\n\x06offset\x18\x02 \x01(\x0b\x32\x1c.motorcortex.ParameterOffset\x12\x10\n\x08\x61\x63tivate\x18\x03 \x02(\x08\x12\x0c\n\x04path\x18\x04 \x02(\t\x12\r\n\x05value\x18\x05 \x02(\x0c\"H\n\x13ReleaseParameterMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\x0c\n\x04path\x18\x02 \x02(\t\"O\n\x07SaveMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\x0c\n\x04path\x18\x02 \x02(\t\x12\x11\n\tfile_name\x18\x03 \x02(\t\"O\n\x07LoadMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\x0c\n\x04path\x18\x02 \x02(\t\x12\x11\n\tfile_name\x18\x03 \x02(\t\"C\n\rConsoleCmdMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\r\n\x05value\x18\x02 \x02(\t\"b\n\x11\x43onsoleCmdListMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12(\n\x04\x63mds\x18\x02 \x03(\x0b\x32\x1a.motorcortex.ConsoleCmdMsg*\xab\x02\n\x04Unit\x12\x12\n\x0eunit_undefined\x10\x00\x12\n\n\x06Length\x10\x0f\x12\x06\n\x02mm\x10\x01\x12\x05\n\x01m\x10\x02\x12\n\n\x05\x41ngle\x10\xf1\x01\x12\x07\n\x03rad\x10\x31\x12\x07\n\x03\x64\x65g\x10\x41\x12\t\n\x04Time\x10\xf2\x01\x12\x0b\n\x07nanosec\x10\x12\x12\x0c\n\x08microsec\x10\"\x12\x0c\n\x08millisec\x10\x32\x12\x07\n\x03sec\x10\x42\x12\x0b\n\x06Weight\x10\xf3\x01\x12\x08\n\x04gram\x10\x13\x12\x06\n\x02kg\x10#\x12\r\n\x08Velocity\x10\xf4\x01\x12\t\n\x05m_sec\x10\x14\x12\x0b\n\x07rad_sec\x10$\x12\x11\n\x0c\x41\x63\x63\x65leration\x10\xf5\x01\x12\n\n\x06m_sec2\x10\x15\x12\x0c\n\x08rad_sec2\x10%\x12\n\n\x05\x46orce\x10\xf6\x01\x12\x05\n\x01N\x10\x16\x12\x06\n\x02Nm\x10&\x12\x0b\n\x07percent\x10\x17*_\n\tUserGroup\x12\x18\n\x14user_group_undefined\x10\x00\x12\n\n\x06SYSTEM\x10\x01\x12\x11\n\rADMINISTRATOR\x10\x03\x12\x0c\n\x08OPERATOR\x10\x07\x12\x0b\n\x07MONITOR\x10\x0f*\xc4\x01\n\nPermission\x12\x18\n\x14permission_undefined\x10\x00\x12\x0e\n\tUSER_READ\x10\x80\x02\x12\x0f\n\nUSER_WRITE\x10\x80\x01\x12\x10\n\x0cUSER_EXECUTE\x10@\x12\x0e\n\nGROUP_READ\x10 \x12\x0f\n\x0bGROUP_WRITE\x10\x10\x12\x11\n\rGROUP_EXECUTE\x10\x08\x12\x0f\n\x0bOTHERS_READ\x10\x04\x12\x10\n\x0cOTHERS_WRITE\x10\x02\x12\x12\n\x0eOTHERS_EXECUTE\x10\x01*\xd4\x01\n\x08\x44\x61taType\x12\x17\n\x13\x64\x61ta_type_undefined\x10\x00\x12\x08\n\x04INT8\x10\x01\x12\t\n\x05UINT8\x10\x02\x12\t\n\x05INT16\x10\x03\x12\n\n\x06UINT16\x10\x04\x12\t\n\x05INT32\x10\x05\x12\n\n\x06UINT32\x10\x06\x12\t\n\x05INT64\x10\x07\x12\n\n\x06UINT64\x10\x08\x12\x08\n\x04\x42OOL\x10\t\x12\n\n\x05\x46LOAT\x10\x81\x02\x12\x0b\n\x06\x44OUBLE\x10\x82\x02\x12\t\n\x04\x43HAR\x10\x81\x04\x12\x0b\n\x06STRING\x10\x82\x04\x12\n\n\x05\x42YTES\x10\x99\t\x12\x0e\n\tUSER_TYPE\x10\x80\n*\x84\x01\n\rParameterType\x12\x18\n\x14param_type_undefined\x10\x00\x12\t\n\x05INPUT\x10\x01\x12\n\n\x06OUTPUT\x10\x10\x12\x0e\n\tPARAMETER\x10\x80\x02\x12\x17\n\x12PARAMETER_VOLATILE\x10\x81\x02\x12\x19\n\x14PARAMETER_PERSISTENT\x10\x82\x02*\x9a\x02\n\nStatusCode\x12\x06\n\x02OK\x10\x00\x12\x12\n\x0eREAD_ONLY_MODE\x10\x01\x12\x0c\n\x06\x46\x41ILED\x10\x80\xfe\x03\x12\x15\n\x10\x46\x41ILED_TO_DECODE\x10\x80 \x12\x15\n\x10SUB_LIST_IS_FULL\x10\x80\"\x12\x19\n\x14WRONG_PARAMETER_PATH\x10\x80$\x12 \n\x1b\x46\x41ILED_TO_SET_REQUESTED_FRQ\x10\x80&\x12\x18\n\x13\x46\x41ILED_TO_OPEN_FILE\x10\x80(\x12\x17\n\x12GROUP_LIST_IS_FULL\x10\x80*\x12\x13\n\x0eWRONG_PASSWORD\x10\x80\x42\x12\x17\n\x12USER_NOT_LOGGED_IN\x10\x80\x44\x12\x16\n\x11PERMISSION_DENIED\x10\x80\x46*v\n\nErrorLevel\x12\x19\n\x15\x65rror_level_undefined\x10\x00\x12\x08\n\x04INFO\x10\x01\x12\x0b\n\x07WARNING\x10\x02\x12\x14\n\x10\x46ORCED_DISENGAGE\x10\x03\x12\x0c\n\x08SHUTDOWN\x10\x04\x12\x12\n\x0e\x45MERGENCY_STOP\x10\x05*_\n\nOffsetType\x12\x19\n\x15offset_type_undefined\x10\x00\x12\x13\n\x0fOFFSET_ELEMENTS\x10\x01\x12\x10\n\x0cOFFSET_BYTES\x10\x02\x12\x0f\n\x0bOFFSET_BITS\x10\x03*<\n\rParameterFlag\x12\x12\n\x0eLINK_IS_ACTIVE\x10\x01\x12\x17\n\x13OVERWRITE_IS_ACTIVE\x10\x02')
16
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11motorcortex.proto\x12\x0bmotorcortex\"i\n\x0fParameterOffset\x12\x36\n\x04type\x18\x01 \x02(\x0e\x32\x17.motorcortex.OffsetType:\x0fOFFSET_ELEMENTS\x12\x0e\n\x06offset\x18\x02 \x02(\r\x12\x0e\n\x06length\x18\x03 \x02(\r\"f\n\x05\x45rror\x12\x11\n\ttimestamp\x18\x01 \x02(\x06\x12\x14\n\x0c\x65rror_number\x18\x02 \x02(\x07\x12\x13\n\x0b\x65rror_level\x18\x03 \x02(\x07\x12\x11\n\tsubsystem\x18\x04 \x02(\x07\x12\x0c\n\x04info\x18\x05 \x02(\x07\"a\n\tErrorList\x12\"\n\x06\x65rrors\x18\x01 \x03(\x0b\x32\x12.motorcortex.Error\x12\x18\n\x10number_of_errors\x18\x02 \x02(\x07\x12\x16\n\x0eupdate_counter\x18\x03 \x02(\x07\"\x8a\x02\n\rParameterInfo\x12\n\n\x02id\x18\x01 \x02(\r\x12\x11\n\tdata_type\x18\x02 \x02(\r\x12\x11\n\tdata_size\x18\x03 \x02(\r\x12\x1a\n\x12number_of_elements\x18\x04 \x02(\r\x12\r\n\x05\x66lags\x18\x05 \x02(\r\x12\x13\n\x0bpermissions\x18\x06 \x02(\r\x12.\n\nparam_type\x18\x07 \x02(\x0e\x32\x1a.motorcortex.ParameterType\x12(\n\x08group_id\x18\x08 \x02(\x0e\x32\x16.motorcortex.UserGroup\x12\x1f\n\x04unit\x18\t \x02(\x0e\x32\x11.motorcortex.Unit\x12\x0c\n\x04path\x18\n \x02(\t\"\x94\x01\n\x12GroupParameterInfo\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0e\n\x06offset\x18\x02 \x02(\r\x12\x0c\n\x04size\x18\x03 \x02(\r\x12(\n\x04info\x18\x04 \x02(\x0b\x32\x1a.motorcortex.ParameterInfo\x12\'\n\x06status\x18\x05 \x02(\x0e\x32\x17.motorcortex.StatusCode\"1\n\x06Header\x12\x14\n\x0c\x66rameCounter\x18\x01 \x02(\x07\x12\x11\n\ttimestamp\x18\x02 \x02(\x06\"Z\n\x08GroupMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12)\n\x06params\x18\x02 \x03(\x0b\x32\x19.motorcortex.ParameterMsg\"Y\n\tStatusMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\'\n\x06status\x18\x02 \x02(\x0e\x32\x17.motorcortex.StatusCode\"P\n\x08LoginMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\r\n\x05login\x18\x02 \x02(\t\x12\x10\n\x08password\x18\x03 \x02(\t\"9\n\x12GetSessionTokenMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\"n\n\x0fSessionTokenMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\r\n\x05token\x18\x02 \x02(\t\x12\'\n\x06status\x18\x03 \x02(\x0e\x32\x17.motorcortex.StatusCode\"G\n\x11RestoreSessionMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\r\n\x05token\x18\x02 \x02(\t\"0\n\tLogoutMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\":\n\x13GetParameterTreeMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\"\x9a\x01\n\x10ParameterTreeMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12*\n\x06params\x18\x02 \x03(\x0b\x32\x1a.motorcortex.ParameterInfo\x12\x0c\n\x04hash\x18\x03 \x02(\r\x12\'\n\x06status\x18\x04 \x02(\x0e\x32\x17.motorcortex.StatusCode\">\n\x17GetParameterTreeHashMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\"r\n\x14ParameterTreeHashMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\x0c\n\x04hash\x18\x02 \x02(\r\x12\'\n\x06status\x18\x03 \x02(\x0e\x32\x17.motorcortex.StatusCode\"h\n\x0e\x43reateGroupMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\x13\n\x0b\x66rq_divider\x18\x02 \x02(\r\x12\r\n\x05\x61lias\x18\x03 \x02(\t\x12\r\n\x05paths\x18\x04 \x03(\t\"\xaa\x01\n\x0eGroupStatusMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\n\n\x02id\x18\x02 \x02(\r\x12\r\n\x05\x61lias\x18\x03 \x02(\t\x12/\n\x06params\x18\x04 \x03(\x0b\x32\x1f.motorcortex.GroupParameterInfo\x12\'\n\x06status\x18\x05 \x02(\x0e\x32\x17.motorcortex.StatusCode\"D\n\x0eRemoveGroupMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\r\n\x05\x61lias\x18\x02 \x02(\t\"D\n\x0fGetParameterMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\x0c\n\x04path\x18\x02 \x02(\t\"\x95\x01\n\x0cParameterMsg\x12\r\n\x05value\x18\x01 \x02(\x0c\x12#\n\x06header\x18\x02 \x01(\x0b\x32\x13.motorcortex.Header\x12(\n\x04info\x18\x03 \x01(\x0b\x32\x1a.motorcortex.ParameterInfo\x12\'\n\x06status\x18\x04 \x02(\x0e\x32\x17.motorcortex.StatusCode\"h\n\x13GetParameterListMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12,\n\x06params\x18\x02 \x03(\x0b\x32\x1c.motorcortex.GetParameterMsg\"\x8b\x01\n\x10ParameterListMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12)\n\x06params\x18\x02 \x03(\x0b\x32\x19.motorcortex.ParameterMsg\x12\'\n\x06status\x18\x03 \x02(\x0e\x32\x17.motorcortex.StatusCode\"\x81\x01\n\x0fSetParameterMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12,\n\x06offset\x18\x02 \x01(\x0b\x32\x1c.motorcortex.ParameterOffset\x12\x0c\n\x04path\x18\x03 \x02(\t\x12\r\n\x05value\x18\x04 \x02(\x0c\"h\n\x13SetParameterListMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12,\n\x06params\x18\x02 \x03(\x0b\x32\x1c.motorcortex.SetParameterMsg\"\x99\x01\n\x15OverwriteParameterMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12,\n\x06offset\x18\x02 \x01(\x0b\x32\x1c.motorcortex.ParameterOffset\x12\x10\n\x08\x61\x63tivate\x18\x03 \x02(\x08\x12\x0c\n\x04path\x18\x04 \x02(\t\x12\r\n\x05value\x18\x05 \x02(\x0c\"H\n\x13ReleaseParameterMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\x0c\n\x04path\x18\x02 \x02(\t\"O\n\x07SaveMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\x0c\n\x04path\x18\x02 \x02(\t\x12\x11\n\tfile_name\x18\x03 \x02(\t\"O\n\x07LoadMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\x0c\n\x04path\x18\x02 \x02(\t\x12\x11\n\tfile_name\x18\x03 \x02(\t\"C\n\rConsoleCmdMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12\r\n\x05value\x18\x02 \x02(\t\"b\n\x11\x43onsoleCmdListMsg\x12#\n\x06header\x18\x01 \x01(\x0b\x32\x13.motorcortex.Header\x12(\n\x04\x63mds\x18\x02 \x03(\x0b\x32\x1a.motorcortex.ConsoleCmdMsg*\xab\x02\n\x04Unit\x12\x12\n\x0eunit_undefined\x10\x00\x12\n\n\x06Length\x10\x0f\x12\x06\n\x02mm\x10\x01\x12\x05\n\x01m\x10\x02\x12\n\n\x05\x41ngle\x10\xf1\x01\x12\x07\n\x03rad\x10\x31\x12\x07\n\x03\x64\x65g\x10\x41\x12\t\n\x04Time\x10\xf2\x01\x12\x0b\n\x07nanosec\x10\x12\x12\x0c\n\x08microsec\x10\"\x12\x0c\n\x08millisec\x10\x32\x12\x07\n\x03sec\x10\x42\x12\x0b\n\x06Weight\x10\xf3\x01\x12\x08\n\x04gram\x10\x13\x12\x06\n\x02kg\x10#\x12\r\n\x08Velocity\x10\xf4\x01\x12\t\n\x05m_sec\x10\x14\x12\x0b\n\x07rad_sec\x10$\x12\x11\n\x0c\x41\x63\x63\x65leration\x10\xf5\x01\x12\n\n\x06m_sec2\x10\x15\x12\x0c\n\x08rad_sec2\x10%\x12\n\n\x05\x46orce\x10\xf6\x01\x12\x05\n\x01N\x10\x16\x12\x06\n\x02Nm\x10&\x12\x0b\n\x07percent\x10\x17*_\n\tUserGroup\x12\x18\n\x14user_group_undefined\x10\x00\x12\n\n\x06SYSTEM\x10\x01\x12\x11\n\rADMINISTRATOR\x10\x03\x12\x0c\n\x08OPERATOR\x10\x07\x12\x0b\n\x07MONITOR\x10\x0f*\xc4\x01\n\nPermission\x12\x18\n\x14permission_undefined\x10\x00\x12\x0e\n\tUSER_READ\x10\x80\x02\x12\x0f\n\nUSER_WRITE\x10\x80\x01\x12\x10\n\x0cUSER_EXECUTE\x10@\x12\x0e\n\nGROUP_READ\x10 \x12\x0f\n\x0bGROUP_WRITE\x10\x10\x12\x11\n\rGROUP_EXECUTE\x10\x08\x12\x0f\n\x0bOTHERS_READ\x10\x04\x12\x10\n\x0cOTHERS_WRITE\x10\x02\x12\x12\n\x0eOTHERS_EXECUTE\x10\x01*\xd4\x01\n\x08\x44\x61taType\x12\x17\n\x13\x64\x61ta_type_undefined\x10\x00\x12\x08\n\x04INT8\x10\x01\x12\t\n\x05UINT8\x10\x02\x12\t\n\x05INT16\x10\x03\x12\n\n\x06UINT16\x10\x04\x12\t\n\x05INT32\x10\x05\x12\n\n\x06UINT32\x10\x06\x12\t\n\x05INT64\x10\x07\x12\n\n\x06UINT64\x10\x08\x12\x08\n\x04\x42OOL\x10\t\x12\n\n\x05\x46LOAT\x10\x81\x02\x12\x0b\n\x06\x44OUBLE\x10\x82\x02\x12\t\n\x04\x43HAR\x10\x81\x04\x12\x0b\n\x06STRING\x10\x82\x04\x12\n\n\x05\x42YTES\x10\x99\t\x12\x0e\n\tUSER_TYPE\x10\x80\n*\x84\x01\n\rParameterType\x12\x18\n\x14param_type_undefined\x10\x00\x12\t\n\x05INPUT\x10\x01\x12\n\n\x06OUTPUT\x10\x10\x12\x0e\n\tPARAMETER\x10\x80\x02\x12\x17\n\x12PARAMETER_VOLATILE\x10\x81\x02\x12\x19\n\x14PARAMETER_PERSISTENT\x10\x82\x02*\xbb\x02\n\nStatusCode\x12\x06\n\x02OK\x10\x00\x12\x12\n\x0eREAD_ONLY_MODE\x10\x01\x12\x0c\n\x06\x46\x41ILED\x10\x80\xfe\x03\x12\x15\n\x10\x46\x41ILED_TO_DECODE\x10\x80 \x12\x15\n\x10SUB_LIST_IS_FULL\x10\x80\"\x12\x19\n\x14WRONG_PARAMETER_PATH\x10\x80$\x12 \n\x1b\x46\x41ILED_TO_SET_REQUESTED_FRQ\x10\x80&\x12\x18\n\x13\x46\x41ILED_TO_OPEN_FILE\x10\x80(\x12\x17\n\x12GROUP_LIST_IS_FULL\x10\x80*\x12\x1f\n\x1aTIMEOUT_WAITING_FOR_UPDATE\x10\x80,\x12\x13\n\x0eWRONG_PASSWORD\x10\x80\x42\x12\x17\n\x12USER_NOT_LOGGED_IN\x10\x80\x44\x12\x16\n\x11PERMISSION_DENIED\x10\x80\x46*v\n\nErrorLevel\x12\x19\n\x15\x65rror_level_undefined\x10\x00\x12\x08\n\x04INFO\x10\x01\x12\x0b\n\x07WARNING\x10\x02\x12\x14\n\x10\x46ORCED_DISENGAGE\x10\x03\x12\x0c\n\x08SHUTDOWN\x10\x04\x12\x12\n\x0e\x45MERGENCY_STOP\x10\x05*_\n\nOffsetType\x12\x19\n\x15offset_type_undefined\x10\x00\x12\x13\n\x0fOFFSET_ELEMENTS\x10\x01\x12\x10\n\x0cOFFSET_BYTES\x10\x02\x12\x0f\n\x0bOFFSET_BITS\x10\x03*<\n\rParameterFlag\x12\x12\n\x0eLINK_IS_ACTIVE\x10\x01\x12\x17\n\x13OVERWRITE_IS_ACTIVE\x10\x02')
17
17
 
18
18
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
19
19
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'motorcortex_pb2', globals())
@@ -31,13 +31,13 @@ if _descriptor._USE_C_DESCRIPTORS == False:
31
31
  _PARAMETERTYPE._serialized_start=4203
32
32
  _PARAMETERTYPE._serialized_end=4335
33
33
  _STATUSCODE._serialized_start=4338
34
- _STATUSCODE._serialized_end=4620
35
- _ERRORLEVEL._serialized_start=4622
36
- _ERRORLEVEL._serialized_end=4740
37
- _OFFSETTYPE._serialized_start=4742
38
- _OFFSETTYPE._serialized_end=4837
39
- _PARAMETERFLAG._serialized_start=4839
40
- _PARAMETERFLAG._serialized_end=4899
34
+ _STATUSCODE._serialized_end=4653
35
+ _ERRORLEVEL._serialized_start=4655
36
+ _ERRORLEVEL._serialized_end=4773
37
+ _OFFSETTYPE._serialized_start=4775
38
+ _OFFSETTYPE._serialized_end=4870
39
+ _PARAMETERFLAG._serialized_start=4872
40
+ _PARAMETERFLAG._serialized_end=4932
41
41
  _PARAMETEROFFSET._serialized_start=34
42
42
  _PARAMETEROFFSET._serialized_end=139
43
43
  _ERROR._serialized_start=141
@@ -19,10 +19,10 @@ import builtins as _builtins
19
19
  import sys
20
20
  import typing as _typing
21
21
 
22
- if sys.version_info >= (3, 10):
23
- from typing import TypeAlias as _TypeAlias
22
+ if sys.version_info >= (3, 11):
23
+ from typing import TypeAlias as _TypeAlias, Never as _Never
24
24
  else:
25
- from typing_extensions import TypeAlias as _TypeAlias
25
+ from typing_extensions import TypeAlias as _TypeAlias, Never as _Never
26
26
 
27
27
  DESCRIPTOR: _descriptor.FileDescriptor
28
28
 
@@ -399,6 +399,8 @@ class _StatusCodeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_StatusCode
399
399
  """Failed to open/save/load a file."""
400
400
  GROUP_LIST_IS_FULL: _StatusCode.ValueType # 5376
401
401
  """Failed to create new group, because the group list is full. Release at least one group."""
402
+ TIMEOUT_WAITING_FOR_UPDATE: _StatusCode.ValueType # 5632
403
+ """GetParameter wait deadline expired before a fresh value was produced for the requested parameter."""
402
404
  WRONG_PASSWORD: _StatusCode.ValueType # 8448
403
405
  """Login failed, wrong login or password."""
404
406
  USER_NOT_LOGGED_IN: _StatusCode.ValueType # 8704
@@ -433,6 +435,8 @@ FAILED_TO_OPEN_FILE: StatusCode.ValueType # 5120
433
435
  """Failed to open/save/load a file."""
434
436
  GROUP_LIST_IS_FULL: StatusCode.ValueType # 5376
435
437
  """Failed to create new group, because the group list is full. Release at least one group."""
438
+ TIMEOUT_WAITING_FOR_UPDATE: StatusCode.ValueType # 5632
439
+ """GetParameter wait deadline expired before a fresh value was produced for the requested parameter."""
436
440
  WRONG_PASSWORD: StatusCode.ValueType # 8448
437
441
  """Login failed, wrong login or password."""
438
442
  USER_NOT_LOGGED_IN: StatusCode.ValueType # 8704
@@ -568,6 +572,7 @@ class ParameterOffset(_message.Message):
568
572
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
569
573
  _ClearFieldArgType: _TypeAlias = _typing.Literal["length", b"length", "offset", b"offset", "type", b"type"] # noqa: Y015
570
574
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
575
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
571
576
 
572
577
  Global___ParameterOffset: _TypeAlias = ParameterOffset # noqa: Y015
573
578
 
@@ -610,6 +615,7 @@ class Error(_message.Message):
610
615
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
611
616
  _ClearFieldArgType: _TypeAlias = _typing.Literal["error_level", b"error_level", "error_number", b"error_number", "info", b"info", "subsystem", b"subsystem", "timestamp", b"timestamp"] # noqa: Y015
612
617
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
618
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
613
619
 
614
620
  Global___Error: _TypeAlias = Error # noqa: Y015
615
621
 
@@ -647,6 +653,7 @@ class ErrorList(_message.Message):
647
653
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
648
654
  _ClearFieldArgType: _TypeAlias = _typing.Literal["errors", b"errors", "number_of_errors", b"number_of_errors", "update_counter", b"update_counter"] # noqa: Y015
649
655
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
656
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
650
657
 
651
658
  Global___ErrorList: _TypeAlias = ErrorList # noqa: Y015
652
659
 
@@ -709,6 +716,7 @@ class ParameterInfo(_message.Message):
709
716
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
710
717
  _ClearFieldArgType: _TypeAlias = _typing.Literal["data_size", b"data_size", "data_type", b"data_type", "flags", b"flags", "group_id", b"group_id", "id", b"id", "number_of_elements", b"number_of_elements", "param_type", b"param_type", "path", b"path", "permissions", b"permissions", "unit", b"unit"] # noqa: Y015
711
718
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
719
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
712
720
 
713
721
  Global___ParameterInfo: _TypeAlias = ParameterInfo # noqa: Y015
714
722
 
@@ -753,6 +761,7 @@ class GroupParameterInfo(_message.Message):
753
761
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
754
762
  _ClearFieldArgType: _TypeAlias = _typing.Literal["index", b"index", "info", b"info", "offset", b"offset", "size", b"size", "status", b"status"] # noqa: Y015
755
763
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
764
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
756
765
 
757
766
  Global___GroupParameterInfo: _TypeAlias = GroupParameterInfo # noqa: Y015
758
767
 
@@ -781,6 +790,7 @@ class Header(_message.Message):
781
790
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
782
791
  _ClearFieldArgType: _TypeAlias = _typing.Literal["frameCounter", b"frameCounter", "timestamp", b"timestamp"] # noqa: Y015
783
792
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
793
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
784
794
 
785
795
  Global___Header: _TypeAlias = Header # noqa: Y015
786
796
 
@@ -813,6 +823,7 @@ class GroupMsg(_message.Message):
813
823
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
814
824
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header", "params", b"params"] # noqa: Y015
815
825
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
826
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
816
827
 
817
828
  Global___GroupMsg: _TypeAlias = GroupMsg # noqa: Y015
818
829
 
@@ -847,6 +858,7 @@ class StatusMsg(_message.Message):
847
858
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
848
859
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header", "status", b"status"] # noqa: Y015
849
860
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
861
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
850
862
 
851
863
  Global___StatusMsg: _TypeAlias = StatusMsg # noqa: Y015
852
864
 
@@ -893,6 +905,7 @@ class LoginMsg(_message.Message):
893
905
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
894
906
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header", "login", b"login", "password", b"password"] # noqa: Y015
895
907
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
908
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
896
909
 
897
910
  Global___LoginMsg: _TypeAlias = LoginMsg # noqa: Y015
898
911
 
@@ -923,6 +936,7 @@ class GetSessionTokenMsg(_message.Message):
923
936
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
924
937
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header"] # noqa: Y015
925
938
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
939
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
926
940
 
927
941
  Global___GetSessionTokenMsg: _TypeAlias = GetSessionTokenMsg # noqa: Y015
928
942
 
@@ -971,6 +985,7 @@ class SessionTokenMsg(_message.Message):
971
985
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
972
986
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header", "status", b"status", "token", b"token"] # noqa: Y015
973
987
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
988
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
974
989
 
975
990
  Global___SessionTokenMsg: _TypeAlias = SessionTokenMsg # noqa: Y015
976
991
 
@@ -1015,6 +1030,7 @@ class RestoreSessionMsg(_message.Message):
1015
1030
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1016
1031
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header", "token", b"token"] # noqa: Y015
1017
1032
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1033
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1018
1034
 
1019
1035
  Global___RestoreSessionMsg: _TypeAlias = RestoreSessionMsg # noqa: Y015
1020
1036
 
@@ -1051,6 +1067,7 @@ class LogoutMsg(_message.Message):
1051
1067
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1052
1068
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header"] # noqa: Y015
1053
1069
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1070
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1054
1071
 
1055
1072
  Global___LogoutMsg: _TypeAlias = LogoutMsg # noqa: Y015
1056
1073
 
@@ -1085,6 +1102,7 @@ class GetParameterTreeMsg(_message.Message):
1085
1102
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1086
1103
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header"] # noqa: Y015
1087
1104
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1105
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1088
1106
 
1089
1107
  Global___GetParameterTreeMsg: _TypeAlias = GetParameterTreeMsg # noqa: Y015
1090
1108
 
@@ -1132,6 +1150,7 @@ class ParameterTreeMsg(_message.Message):
1132
1150
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1133
1151
  _ClearFieldArgType: _TypeAlias = _typing.Literal["hash", b"hash", "header", b"header", "params", b"params", "status", b"status"] # noqa: Y015
1134
1152
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1153
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1135
1154
 
1136
1155
  Global___ParameterTreeMsg: _TypeAlias = ParameterTreeMsg # noqa: Y015
1137
1156
 
@@ -1171,6 +1190,7 @@ class GetParameterTreeHashMsg(_message.Message):
1171
1190
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1172
1191
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header"] # noqa: Y015
1173
1192
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1193
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1174
1194
 
1175
1195
  Global___GetParameterTreeHashMsg: _TypeAlias = GetParameterTreeHashMsg # noqa: Y015
1176
1196
 
@@ -1215,6 +1235,7 @@ class ParameterTreeHashMsg(_message.Message):
1215
1235
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1216
1236
  _ClearFieldArgType: _TypeAlias = _typing.Literal["hash", b"hash", "header", b"header", "status", b"status"] # noqa: Y015
1217
1237
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1238
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1218
1239
 
1219
1240
  Global___ParameterTreeHashMsg: _TypeAlias = ParameterTreeHashMsg # noqa: Y015
1220
1241
 
@@ -1279,6 +1300,7 @@ class CreateGroupMsg(_message.Message):
1279
1300
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1280
1301
  _ClearFieldArgType: _TypeAlias = _typing.Literal["alias", b"alias", "frq_divider", b"frq_divider", "header", b"header", "paths", b"paths"] # noqa: Y015
1281
1302
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1303
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1282
1304
 
1283
1305
  Global___CreateGroupMsg: _TypeAlias = CreateGroupMsg # noqa: Y015
1284
1306
 
@@ -1337,6 +1359,7 @@ class GroupStatusMsg(_message.Message):
1337
1359
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1338
1360
  _ClearFieldArgType: _TypeAlias = _typing.Literal["alias", b"alias", "header", b"header", "id", b"id", "params", b"params", "status", b"status"] # noqa: Y015
1339
1361
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1362
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1340
1363
 
1341
1364
  Global___GroupStatusMsg: _TypeAlias = GroupStatusMsg # noqa: Y015
1342
1365
 
@@ -1379,6 +1402,7 @@ class RemoveGroupMsg(_message.Message):
1379
1402
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1380
1403
  _ClearFieldArgType: _TypeAlias = _typing.Literal["alias", b"alias", "header", b"header"] # noqa: Y015
1381
1404
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1405
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1382
1406
 
1383
1407
  Global___RemoveGroupMsg: _TypeAlias = RemoveGroupMsg # noqa: Y015
1384
1408
 
@@ -1419,6 +1443,7 @@ class GetParameterMsg(_message.Message):
1419
1443
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1420
1444
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header", "path", b"path"] # noqa: Y015
1421
1445
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1446
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1422
1447
 
1423
1448
  Global___GetParameterMsg: _TypeAlias = GetParameterMsg # noqa: Y015
1424
1449
 
@@ -1471,6 +1496,7 @@ class ParameterMsg(_message.Message):
1471
1496
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1472
1497
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header", "info", b"info", "status", b"status", "value", b"value"] # noqa: Y015
1473
1498
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1499
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1474
1500
 
1475
1501
  Global___ParameterMsg: _TypeAlias = ParameterMsg # noqa: Y015
1476
1502
 
@@ -1513,6 +1539,7 @@ class GetParameterListMsg(_message.Message):
1513
1539
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1514
1540
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header", "params", b"params"] # noqa: Y015
1515
1541
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1542
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1516
1543
 
1517
1544
  Global___GetParameterListMsg: _TypeAlias = GetParameterListMsg # noqa: Y015
1518
1545
 
@@ -1561,6 +1588,7 @@ class ParameterListMsg(_message.Message):
1561
1588
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1562
1589
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header", "params", b"params", "status", b"status"] # noqa: Y015
1563
1590
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1591
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1564
1592
 
1565
1593
  Global___ParameterListMsg: _TypeAlias = ParameterListMsg # noqa: Y015
1566
1594
 
@@ -1617,6 +1645,7 @@ class SetParameterMsg(_message.Message):
1617
1645
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1618
1646
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header", "offset", b"offset", "path", b"path", "value", b"value"] # noqa: Y015
1619
1647
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1648
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1620
1649
 
1621
1650
  Global___SetParameterMsg: _TypeAlias = SetParameterMsg # noqa: Y015
1622
1651
 
@@ -1665,6 +1694,7 @@ class SetParameterListMsg(_message.Message):
1665
1694
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1666
1695
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header", "params", b"params"] # noqa: Y015
1667
1696
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1697
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1668
1698
 
1669
1699
  Global___SetParameterListMsg: _TypeAlias = SetParameterListMsg # noqa: Y015
1670
1700
 
@@ -1729,6 +1759,7 @@ class OverwriteParameterMsg(_message.Message):
1729
1759
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1730
1760
  _ClearFieldArgType: _TypeAlias = _typing.Literal["activate", b"activate", "header", b"header", "offset", b"offset", "path", b"path", "value", b"value"] # noqa: Y015
1731
1761
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1762
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1732
1763
 
1733
1764
  Global___OverwriteParameterMsg: _TypeAlias = OverwriteParameterMsg # noqa: Y015
1734
1765
 
@@ -1775,6 +1806,7 @@ class ReleaseParameterMsg(_message.Message):
1775
1806
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1776
1807
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header", "path", b"path"] # noqa: Y015
1777
1808
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1809
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1778
1810
 
1779
1811
  Global___ReleaseParameterMsg: _TypeAlias = ReleaseParameterMsg # noqa: Y015
1780
1812
 
@@ -1825,6 +1857,7 @@ class SaveMsg(_message.Message):
1825
1857
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1826
1858
  _ClearFieldArgType: _TypeAlias = _typing.Literal["file_name", b"file_name", "header", b"header", "path", b"path"] # noqa: Y015
1827
1859
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1860
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1828
1861
 
1829
1862
  Global___SaveMsg: _TypeAlias = SaveMsg # noqa: Y015
1830
1863
 
@@ -1875,6 +1908,7 @@ class LoadMsg(_message.Message):
1875
1908
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1876
1909
  _ClearFieldArgType: _TypeAlias = _typing.Literal["file_name", b"file_name", "header", b"header", "path", b"path"] # noqa: Y015
1877
1910
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1911
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1878
1912
 
1879
1913
  Global___LoadMsg: _TypeAlias = LoadMsg # noqa: Y015
1880
1914
 
@@ -1915,6 +1949,7 @@ class ConsoleCmdMsg(_message.Message):
1915
1949
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1916
1950
  _ClearFieldArgType: _TypeAlias = _typing.Literal["header", b"header", "value", b"value"] # noqa: Y015
1917
1951
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1952
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1918
1953
 
1919
1954
  Global___ConsoleCmdMsg: _TypeAlias = ConsoleCmdMsg # noqa: Y015
1920
1955
 
@@ -1957,5 +1992,6 @@ class ConsoleCmdListMsg(_message.Message):
1957
1992
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
1958
1993
  _ClearFieldArgType: _TypeAlias = _typing.Literal["cmds", b"cmds", "header", b"header"] # noqa: Y015
1959
1994
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
1995
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
1960
1996
 
1961
1997
  Global___ConsoleCmdListMsg: _TypeAlias = ConsoleCmdListMsg # noqa: Y015
@@ -59,7 +59,7 @@ def _register_shutdown(inst: "Request") -> None:
59
59
  try:
60
60
  import threading
61
61
  threading._register_atexit(_close_at_exit, inst) # type: ignore[attr-defined]
62
- except (AttributeError, ImportError):
62
+ except (AttributeError, ImportError): # pragma: no cover
63
63
  atexit.register(_close_at_exit, inst)
64
64
 
65
65
 
@@ -41,7 +41,7 @@ from typing import Any, Optional, Type, TYPE_CHECKING
41
41
 
42
42
  from motorcortex.exceptions import McxConnectionError
43
43
 
44
- if TYPE_CHECKING:
44
+ if TYPE_CHECKING: # pragma: no cover
45
45
  from motorcortex.request import Request, ConnectionState
46
46
  from motorcortex.subscribe import Subscribe
47
47
  from motorcortex.message_types import MessageTypes
@@ -20,7 +20,7 @@ from motorcortex.setup_logger import logger
20
20
  from motorcortex.nng_url import NngUrl
21
21
  from motorcortex import _connection_state, _request_utils, _subscribe_dispatch
22
22
 
23
- if TYPE_CHECKING:
23
+ if TYPE_CHECKING: # pragma: no cover
24
24
  from motorcortex.message_types import MessageTypes
25
25
 
26
26
 
@@ -64,7 +64,7 @@ def _register_shutdown(inst: "Subscribe") -> None:
64
64
  try:
65
65
  import threading
66
66
  threading._register_atexit(_close_at_exit, inst) # type: ignore[attr-defined]
67
- except (AttributeError, ImportError):
67
+ except (AttributeError, ImportError): # pragma: no cover
68
68
  atexit.register(_close_at_exit, inst)
69
69
 
70
70
 
@@ -272,8 +272,8 @@ class Subscription(object):
272
272
 
273
273
  Examples:
274
274
  >>> def update(parameters):
275
- >>> print(parameters) #list of Parameter tuples
276
- >>> ...
275
+ >>> # parameters is a list of Parameter tuples
276
+ >>> print(parameters)
277
277
  >>> data_sub.notify(update)
278
278
 
279
279
  """
@@ -0,0 +1 @@
1
+ __version__ = '1.0.2'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: motorcortex-python
3
- Version: 1.0.0rc2
3
+ Version: 1.0.2
4
4
  Summary: Python bindings for Motorcortex Engine
5
5
  Home-page: https://www.motorcortex.io
6
6
  Author: Alexey Zakharov
@@ -27,7 +27,7 @@ omit = [
27
27
  [tool.coverage.report]
28
28
  show_missing = true
29
29
  skip_covered = false
30
- fail_under = 60
30
+ fail_under = 90
31
31
  exclude_lines = [
32
32
  "pragma: no cover",
33
33
  "raise NotImplementedError",
@@ -1 +0,0 @@
1
- __version__ = '1.0.0rc2'