pymammotion 0.2.29__py3-none-any.whl → 0.2.31__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.
Files changed (49) hide show
  1. pymammotion/__init__.py +11 -8
  2. pymammotion/aliyun/cloud_gateway.py +26 -24
  3. pymammotion/aliyun/cloud_service.py +3 -3
  4. pymammotion/aliyun/dataclass/dev_by_account_response.py +1 -1
  5. pymammotion/bluetooth/ble.py +5 -5
  6. pymammotion/bluetooth/ble_message.py +30 -16
  7. pymammotion/bluetooth/data/convert.py +1 -1
  8. pymammotion/bluetooth/data/framectrldata.py +1 -1
  9. pymammotion/bluetooth/data/notifydata.py +6 -6
  10. pymammotion/const.py +1 -0
  11. pymammotion/data/model/__init__.py +2 -0
  12. pymammotion/data/model/device.py +22 -20
  13. pymammotion/data/model/device_config.py +1 -1
  14. pymammotion/data/model/enums.py +4 -4
  15. pymammotion/data/model/excute_boarder_params.py +5 -5
  16. pymammotion/data/model/execute_boarder.py +4 -4
  17. pymammotion/data/model/hash_list.py +1 -1
  18. pymammotion/data/model/location.py +2 -2
  19. pymammotion/data/model/plan.py +4 -4
  20. pymammotion/data/model/region_data.py +4 -4
  21. pymammotion/data/model/report_info.py +1 -1
  22. pymammotion/data/mqtt/event.py +1 -1
  23. pymammotion/data/state_manager.py +9 -9
  24. pymammotion/event/event.py +14 -14
  25. pymammotion/http/http.py +29 -51
  26. pymammotion/http/model/http.py +75 -0
  27. pymammotion/mammotion/commands/messages/driver.py +20 -23
  28. pymammotion/mammotion/commands/messages/navigation.py +47 -48
  29. pymammotion/mammotion/commands/messages/network.py +17 -35
  30. pymammotion/mammotion/commands/messages/system.py +6 -7
  31. pymammotion/mammotion/control/joystick.py +10 -10
  32. pymammotion/mammotion/devices/__init__.py +2 -2
  33. pymammotion/mammotion/devices/base.py +248 -0
  34. pymammotion/mammotion/devices/mammotion.py +23 -1005
  35. pymammotion/mammotion/devices/mammotion_bluetooth.py +447 -0
  36. pymammotion/mammotion/devices/mammotion_cloud.py +246 -0
  37. pymammotion/mqtt/mammotion_future.py +2 -2
  38. pymammotion/mqtt/mammotion_mqtt.py +17 -14
  39. pymammotion/proto/__init__.py +6 -0
  40. pymammotion/utility/constant/__init__.py +3 -1
  41. pymammotion/utility/datatype_converter.py +9 -9
  42. pymammotion/utility/device_type.py +13 -13
  43. pymammotion/utility/map.py +2 -2
  44. pymammotion/utility/periodic.py +5 -5
  45. pymammotion/utility/rocker_util.py +1 -1
  46. {pymammotion-0.2.29.dist-info → pymammotion-0.2.31.dist-info}/METADATA +3 -1
  47. {pymammotion-0.2.29.dist-info → pymammotion-0.2.31.dist-info}/RECORD +49 -45
  48. {pymammotion-0.2.29.dist-info → pymammotion-0.2.31.dist-info}/LICENSE +0 -0
  49. {pymammotion-0.2.29.dist-info → pymammotion-0.2.31.dist-info}/WHEEL +0 -0
@@ -1,5 +1,4 @@
1
1
  from asyncio import Future
2
- from typing import Any
3
2
 
4
3
  import async_timeout
5
4
 
@@ -7,7 +6,8 @@ import async_timeout
7
6
  class MammotionFuture:
8
7
  """Create futures for each MQTT Message."""
9
8
 
10
- def __init__(self):
9
+ def __init__(self, iot_id) -> None:
10
+ self.iot_id = iot_id
11
11
  self.fut: Future = Future()
12
12
  self.loop = self.fut.get_loop()
13
13
 
@@ -1,13 +1,15 @@
1
1
  """MammotionMQTT."""
2
2
 
3
3
  import asyncio
4
+ import base64
4
5
  import hashlib
5
6
  import hmac
6
7
  import json
7
8
  import logging
8
9
  from logging import getLogger
9
- from typing import Callable, Optional, cast, Awaitable
10
+ from typing import Awaitable, Callable, Optional
10
11
 
12
+ import betterproto
11
13
  from linkkit.linkkit import LinkKit
12
14
  from paho.mqtt.client import MQTTMessage
13
15
 
@@ -15,7 +17,7 @@ from pymammotion.aliyun.cloud_gateway import CloudIOTGateway
15
17
  from pymammotion.data.mqtt.event import ThingEventMessage
16
18
  from pymammotion.data.mqtt.properties import ThingPropertiesMessage
17
19
  from pymammotion.data.mqtt.status import ThingStatusMessage
18
- from pymammotion.proto import luba_msg_pb2
20
+ from pymammotion.proto.luba_msg import LubaMsg
19
21
 
20
22
  logger = getLogger(__name__)
21
23
 
@@ -30,11 +32,12 @@ class MammotionMQTT:
30
32
  device_name: str,
31
33
  device_secret: str,
32
34
  iot_token: str,
35
+ cloud_client: CloudIOTGateway,
33
36
  client_id: Optional[str] = None,
34
- ):
37
+ ) -> None:
35
38
  """Create instance of MammotionMQTT."""
36
39
  super().__init__()
37
- self._cloud_client = None
40
+ self._cloud_client = cloud_client
38
41
  self.is_connected = False
39
42
  self.is_ready = False
40
43
  self.on_connected: Optional[Callable[[], Awaitable[None]]] = None
@@ -78,19 +81,19 @@ class MammotionMQTT:
78
81
  self._linkkit_client.on_topic_message = self._thing_on_topic_message
79
82
  self._mqtt_host = f"{self._product_key}.iot-as-mqtt.{region_id}.aliyuncs.com"
80
83
 
81
- def connect_async(self):
84
+ def connect_async(self) -> None:
82
85
  """Connect async to MQTT Server."""
83
86
  logger.info("Connecting...")
84
87
  if self._linkkit_client.check_state() is LinkKit.LinkKitState.INITIALIZED:
85
88
  self._linkkit_client.thing_setup()
86
89
  self._linkkit_client.connect_async()
87
90
 
88
- def disconnect(self):
91
+ def disconnect(self) -> None:
89
92
  """Disconnect from MQTT Server."""
90
93
  logger.info("Disconnecting...")
91
94
  self._linkkit_client.disconnect()
92
95
 
93
- def _thing_on_thing_enable(self, user_data):
96
+ def _thing_on_thing_enable(self, user_data) -> None:
94
97
  """Is called when Thing is enabled."""
95
98
  logger.debug("on_thing_enable")
96
99
  self.is_connected = True
@@ -129,7 +132,7 @@ class MammotionMQTT:
129
132
  # command = MammotionCommand(device_name="Luba")
130
133
  # self._cloud_client.send_cloud_command(command.get_report_cfg())
131
134
 
132
- def _thing_on_topic_message(self, topic, payload, qos, user_data):
135
+ def _thing_on_topic_message(self, topic, payload, qos, user_data) -> None:
133
136
  """Is called when thing topic comes in."""
134
137
  logger.debug(
135
138
  "on_topic_message, receive message, topic:%s, payload:%s, qos:%d",
@@ -143,7 +146,7 @@ class MammotionMQTT:
143
146
  future = asyncio.run_coroutine_threadsafe(self.on_message(topic, payload, iot_id), self.loop)
144
147
  asyncio.wrap_future(future, loop=self.loop)
145
148
 
146
- def _thing_on_connect(self, session_flag, rc, user_data):
149
+ def _thing_on_connect(self, session_flag, rc, user_data) -> None:
147
150
  """Is called on thing connect."""
148
151
  self.is_connected = True
149
152
  if self.on_connected is not None:
@@ -154,7 +157,7 @@ class MammotionMQTT:
154
157
 
155
158
  # self._linkkit_client.subscribe_topic(f"/sys/{self._product_key}/{self._device_name}/#")
156
159
 
157
- def _on_disconnect(self, _client, _userdata):
160
+ def _on_disconnect(self, _client, _userdata) -> None:
158
161
  """Is called on disconnect."""
159
162
  logger.info("Disconnected")
160
163
  self.is_connected = False
@@ -163,7 +166,7 @@ class MammotionMQTT:
163
166
  future = asyncio.run_coroutine_threadsafe(self.on_disconnected(), self.loop)
164
167
  asyncio.wrap_future(future, loop=self.loop)
165
168
 
166
- def _on_message(self, _client, _userdata, message: MQTTMessage):
169
+ def _on_message(self, _client, _userdata, message: MQTTMessage) -> None:
167
170
  """Is called when message is received."""
168
171
  logger.info("Message on topic %s", message.topic)
169
172
 
@@ -172,9 +175,9 @@ class MammotionMQTT:
172
175
  event = ThingEventMessage(**payload)
173
176
  params = event.params
174
177
  if params.identifier == "device_protobuf_msg_event":
175
- content = cast(luba_msg_pb2, params.value.content)
178
+ content = LubaMsg().parse(base64.b64decode(params.value.content.proto))
176
179
 
177
- logger.info("Unhandled protobuf event: %s", content.WhichOneof("subMsg"))
180
+ logger.info("Unhandled protobuf event: %s", betterproto.which_one_of(content, "LubaSubMsg"))
178
181
  elif params.identifier == "device_warning_event":
179
182
  logger.debug("identifier event: %s", params.identifier)
180
183
  else:
@@ -189,6 +192,6 @@ class MammotionMQTT:
189
192
  logger.debug("Unhandled topic: %s", message.topic)
190
193
  logger.debug(payload)
191
194
 
192
- def get_cloud_client(self) -> Optional[CloudIOTGateway]:
195
+ def get_cloud_client(self) -> CloudIOTGateway:
193
196
  """Return internal cloud client."""
194
197
  return self._cloud_client
@@ -0,0 +1,6 @@
1
+ import betterproto
2
+
3
+
4
+ def has_field(message: betterproto.Message) -> bool:
5
+ """Check if the message has any fields serialized on wire."""
6
+ return betterproto.serialized_on_wire(message)
@@ -1 +1,3 @@
1
- from .device_constant import WorkMode
1
+ from .device_constant import PosType, WorkMode, device_mode
2
+
3
+ __all__ = ["WorkMode", "device_mode", "PosType"]
@@ -20,13 +20,13 @@ class DatatypeConverter:
20
20
  """
21
21
 
22
22
  if DatatypeConverter.encode_map is None:
23
- cArr = [0] * 64
24
- for i in range(26):
25
- cArr[i] = chr(i + 65)
26
- for i in range(26, 52):
27
- cArr[i] = chr(i - 26 + 97)
28
- for i in range(52, 62):
29
- cArr[i] = chr(i - 52 + 48)
23
+ cArr: list[str | int] = [0] * 64
24
+ for num in range(26):
25
+ cArr[num] = chr(num + 65)
26
+ for num_2 in range(26, 52):
27
+ cArr[num_2] = chr(num_2 - 26 + 97)
28
+ for num_3 in range(52, 62):
29
+ cArr[num_3] = chr(num_3 - 52 + 48)
30
30
  cArr[62] = "+"
31
31
  cArr[63] = "/"
32
32
  DatatypeConverter.encode_map = cArr
@@ -45,7 +45,7 @@ class DatatypeConverter:
45
45
  return DatatypeConverter.encode_map[i & 63]
46
46
 
47
47
  @staticmethod
48
- def _printBase64Binary(bArr, i=0, i2=None):
48
+ def _printBase64Binary(bArr: bytes, i: int = 0, i2=None):
49
49
  """Print the Base64 binary representation of a byte array.
50
50
 
51
51
  This function takes a byte array and optional start and end indices to
@@ -68,7 +68,7 @@ class DatatypeConverter:
68
68
  return "".join(cArr)
69
69
 
70
70
  @staticmethod
71
- def _printBase64Binary_core(bArr, i, i2, cArr, i3):
71
+ def _printBase64Binary_core(bArr: bytes, i, i2, cArr, i3):
72
72
  """Encode binary data into Base64 format.
73
73
 
74
74
  This function encodes binary data into Base64 format following the
@@ -11,12 +11,12 @@ class DeviceType(Enum):
11
11
  YUKA_MINI2 = (5, "Yuka-YM", "Yuka Mini 2")
12
12
  LUBA_VP = (6, "Luba-VP", "Luba VP")
13
13
 
14
- def __init__(self, value: int, name: str, model: str):
14
+ def __init__(self, value: int, name: str, model: str) -> None:
15
15
  self._value = value
16
16
  self._name = name
17
17
  self._model = model
18
18
 
19
- def get_name(self):
19
+ def get_name(self) -> str:
20
20
  return self._name
21
21
 
22
22
  def get_model(self):
@@ -28,7 +28,7 @@ class DeviceType(Enum):
28
28
  def get_value_str(self):
29
29
  return str(self._value)
30
30
 
31
- def set_value(self, value):
31
+ def set_value(self, value) -> None:
32
32
  self._value = value
33
33
 
34
34
  @staticmethod
@@ -62,7 +62,7 @@ class DeviceType(Enum):
62
62
  return DeviceType.UNKNOWN
63
63
 
64
64
  @staticmethod
65
- def value_of_str(device_name: str, product_key=""):
65
+ def value_of_str(device_name: str, product_key: str = ""):
66
66
  """Determine the type of device based on the provided device name and
67
67
  product key.
68
68
 
@@ -101,7 +101,7 @@ class DeviceType(Enum):
101
101
  return DeviceType.UNKNOWN
102
102
 
103
103
  @staticmethod
104
- def has_4g(device_name, product_key=""):
104
+ def has_4g(device_name: str, product_key: str = ""):
105
105
  """Check if the device has 4G capability based on the device name and
106
106
  optional product key.
107
107
 
@@ -126,7 +126,7 @@ class DeviceType(Enum):
126
126
  return device_type.get_value() >= DeviceType.LUBA_2.get_value()
127
127
 
128
128
  @staticmethod
129
- def is_luba1(device_name, product_key=""):
129
+ def is_luba1(device_name: str, product_key: str = ""):
130
130
  """Check if the given device is of type LUBA.
131
131
 
132
132
  This function determines if the device specified by 'device_name' is of
@@ -150,7 +150,7 @@ class DeviceType(Enum):
150
150
  return device_type.get_value() == DeviceType.LUBA.get_value()
151
151
 
152
152
  @staticmethod
153
- def is_luba_2(device_name, product_key=""):
153
+ def is_luba_2(device_name: str, product_key: str = ""):
154
154
  """Check if the device type is LUBA 2 or higher based on the device name
155
155
  and optional product key.
156
156
 
@@ -171,7 +171,7 @@ class DeviceType(Enum):
171
171
  return device_type.get_value() >= DeviceType.LUBA_2.get_value()
172
172
 
173
173
  @staticmethod
174
- def is_yuka(device_name):
174
+ def is_yuka(device_name: str):
175
175
  """Check if the given device name corresponds to a LUBA_YUKA device type.
176
176
 
177
177
  Args:
@@ -189,7 +189,7 @@ class DeviceType(Enum):
189
189
  )
190
190
 
191
191
  @staticmethod
192
- def is_rtk(device_name, product_key=""):
192
+ def is_rtk(device_name: str, product_key: str = ""):
193
193
  """Check if the device type is within the range of RTK devices.
194
194
 
195
195
  This function determines if the device type corresponding to the given
@@ -213,7 +213,7 @@ class DeviceType(Enum):
213
213
  return DeviceType.RTK.get_value() <= device_type.get_value() < DeviceType.LUBA.get_value()
214
214
 
215
215
  @staticmethod
216
- def contain_rtk_product_key(product_key):
216
+ def contain_rtk_product_key(product_key) -> bool:
217
217
  """Check if the given product key is in a predefined list of RTK product
218
218
  keys.
219
219
 
@@ -230,7 +230,7 @@ class DeviceType(Enum):
230
230
  return product_key in ["a1qXkZ5P39W", "a1Nc68bGZzX"]
231
231
 
232
232
  @staticmethod
233
- def contain_luba_product_key(product_key):
233
+ def contain_luba_product_key(product_key) -> bool:
234
234
  """Check if the given product key is in the list of valid product keys.
235
235
 
236
236
  Args:
@@ -258,7 +258,7 @@ class DeviceType(Enum):
258
258
  ]
259
259
 
260
260
  @staticmethod
261
- def contain_luba_2_product_key(product_key):
261
+ def contain_luba_2_product_key(product_key) -> bool:
262
262
  """Check if the given product key is present in a predefined list.
263
263
 
264
264
  Args:
@@ -274,7 +274,7 @@ class DeviceType(Enum):
274
274
  return product_key in ["a1iMygIwxFC", "a1LLmy1zc0j", "a1LLmy1zc0j"]
275
275
 
276
276
  @staticmethod
277
- def contain_yuka_product_key(product_key):
277
+ def contain_yuka_product_key(product_key) -> bool:
278
278
  """Check if the given product key is present in a predefined list.
279
279
 
280
280
  Args:
@@ -6,7 +6,7 @@ from pymammotion.data.model.location import Point
6
6
 
7
7
 
8
8
  class CoordinateConverter:
9
- def __init__(self, latitude_rad: float, longitude_rad: float):
9
+ def __init__(self, latitude_rad: float, longitude_rad: float) -> None:
10
10
  # Initialize constants
11
11
  self.WGS84A = 6378137.0
12
12
  self.f_ = 3.3528106647474805e-21
@@ -26,7 +26,7 @@ class CoordinateConverter:
26
26
  # Call set_init_lla with provided lat/lon
27
27
  self.set_init_lla(latitude_rad, longitude_rad)
28
28
 
29
- def set_init_lla(self, lat_rad, lon_rad):
29
+ def set_init_lla(self, lat_rad, lon_rad) -> None:
30
30
  sin_lat = math.sin(lat_rad)
31
31
  cos_lat = math.cos(lat_rad)
32
32
  sin_lon = math.sin(lon_rad)
@@ -3,13 +3,13 @@ from contextlib import suppress
3
3
 
4
4
 
5
5
  class Periodic:
6
- def __init__(self, func, time):
6
+ def __init__(self, func, time) -> None:
7
7
  self.func = func
8
8
  self.time = time
9
9
  self.is_started = False
10
10
  self._task = None
11
11
 
12
- def start(self):
12
+ def start(self) -> None:
13
13
  """Start the task if it is not already started.
14
14
 
15
15
  If the task is not already started, it sets the 'is_started' flag to
@@ -21,7 +21,7 @@ class Periodic:
21
21
  # Start task to call func periodically:
22
22
  self._task = asyncio.ensure_future(self._run())
23
23
 
24
- async def stop(self):
24
+ async def stop(self) -> None:
25
25
  """Stop the task if it is currently running.
26
26
 
27
27
  If the task is currently running, it will be cancelled and awaited until
@@ -35,7 +35,7 @@ class Periodic:
35
35
  with suppress(asyncio.CancelledError):
36
36
  await self._task
37
37
 
38
- async def _run(self):
38
+ async def _run(self) -> None:
39
39
  """Run the specified function at regular intervals using asyncio.
40
40
 
41
41
  This method runs the specified function at regular intervals based on
@@ -84,7 +84,7 @@ def periodic(period):
84
84
 
85
85
  """
86
86
 
87
- async def wrapper(*args, **kwargs):
87
+ async def wrapper(*args, **kwargs) -> None:
88
88
  """Execute the given function periodically using asyncio tasks.
89
89
 
90
90
  This function continuously creates an asyncio task to execute the
@@ -11,7 +11,7 @@ class RockerControlUtil:
11
11
  thresholdValue_2 = 7
12
12
  thresholdValue_3 = 15
13
13
 
14
- def __init__(self):
14
+ def __init__(self) -> None:
15
15
  """Generated source for method __init__"""
16
16
 
17
17
  @classmethod
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pymammotion
3
- Version: 0.2.29
3
+ Version: 0.2.31
4
4
  Summary:
5
5
  License: GNU-3.0
6
6
  Author: Michael Arthur
@@ -18,11 +18,13 @@ Requires-Dist: alicloud-gateway-iot (>=1.0.0,<2.0.0)
18
18
  Requires-Dist: aliyun-iot-linkkit (>=1.2.12,<2.0.0)
19
19
  Requires-Dist: aliyun-python-sdk-iot (>=8.57.0,<9.0.0)
20
20
  Requires-Dist: async-timeout (>=4.0.3,<5.0.0)
21
+ Requires-Dist: autotyping (>=24.3.0,<25.0.0)
21
22
  Requires-Dist: betterproto (>=1.2.5,<2.0.0)
22
23
  Requires-Dist: bleak (>=0.21.0)
23
24
  Requires-Dist: bleak-retry-connector (>=3.5.0,<4.0.0)
24
25
  Requires-Dist: jsonic (>=1.0.0,<2.0.0)
25
26
  Requires-Dist: mashumaro (>=3.13,<4.0)
27
+ Requires-Dist: mypy (>=1.11.2,<2.0.0)
26
28
  Requires-Dist: nest-asyncio (>=1.6.0,<2.0.0)
27
29
  Requires-Dist: numpy (>=1.26.0,<2.0.0)
28
30
  Requires-Dist: orjson (>=3.9.15,<4.0.0)
@@ -1,68 +1,72 @@
1
- pymammotion/__init__.py,sha256=IDqM_7hZPTOYRMqmNAHl0Z5qkdoByNR9gjbguJ4Hpgs,1526
1
+ pymammotion/__init__.py,sha256=jHCQrpJaG1jAoID9T4RT3g4JsZc0JpJqIcqjnA7cXd0,1605
2
2
  pymammotion/aliyun/__init__.py,sha256=T1lkX7TRYiL4nqYanG4l4MImV-SlavSbuooC-W-uUGw,29
3
- pymammotion/aliyun/cloud_gateway.py,sha256=NkxSeGXJQ16tWKAncsDfdwG1OJEOCdmSJ212VX2H0CE,22726
4
- pymammotion/aliyun/cloud_service.py,sha256=YWcKuKK6iRWy5mTnBYgHxcCusiRGGzQt3spSf7dGDss,2183
3
+ pymammotion/aliyun/cloud_gateway.py,sha256=d2A4F-bCZD4Oz4wdBdyFBKBvFf1GZxCKvFRcDDpczRs,22686
4
+ pymammotion/aliyun/cloud_service.py,sha256=px7dUKow5Z7VyebjYzuKkzkm77XbUXYiFiYO_2e-UQ0,2207
5
5
  pymammotion/aliyun/dataclass/aep_response.py,sha256=8f6GIP58ve8gd6AL3HBoXxsy0n2q4ygWvjELGnoOnVc,452
6
6
  pymammotion/aliyun/dataclass/connect_response.py,sha256=Yz-fEbDzgGPTo5Of2oAjmFkSv08T7ze80pQU4k-gKIU,824
7
- pymammotion/aliyun/dataclass/dev_by_account_response.py,sha256=o9X8hNc1y3XXhFa9Nbw7TLUG3F9rIpTj79tEg2uEmUI,1032
7
+ pymammotion/aliyun/dataclass/dev_by_account_response.py,sha256=gskum11h9HPf4lKjLJKVrsxRl5BHaHJP2TPrI09SUYs,1032
8
8
  pymammotion/aliyun/dataclass/login_by_oauth_response.py,sha256=IXSLZ6XnOliOnyXo5Bh0ErqFjA11puACh_9NH0sSJGQ,1262
9
9
  pymammotion/aliyun/dataclass/regions_response.py,sha256=CVPpdFhDD6_emWHyLRzOdp2j3HLPtP8tlNyzGnr8AcI,690
10
10
  pymammotion/aliyun/dataclass/session_by_authcode_response.py,sha256=1K8Uu_V6flSBU8kLCh1Qj59tD9aZQSn7X3hLKeouE_g,407
11
11
  pymammotion/aliyun/tmp_constant.py,sha256=M4Hq_lrGB3LZdX6R2XohRPFoK1NDnNV-pTJwJcJ9838,6650
12
12
  pymammotion/bluetooth/__init__.py,sha256=LAl8jqZ1fPh-3mLmViNQsP3s814C1vsocYUa6oSaXt0,36
13
- pymammotion/bluetooth/ble.py,sha256=AIRxXw-ZTY3gTFLclYAasdJ8Djs1s4dRl6KY9hUDUcw,2409
14
- pymammotion/bluetooth/ble_message.py,sha256=byibcxZ5b_hE3UzHAImyTcxdBOcya9rdswdtuLV8_hY,15663
13
+ pymammotion/bluetooth/ble.py,sha256=YfkfEK3TLJ8BaidjAXfUVFv8reLCu6U_lYa3Bo0pddw,2449
14
+ pymammotion/bluetooth/ble_message.py,sha256=m-RyxHncCWrYFoeNg_G9Co5afNADZuCm32jQaqaIFc8,16211
15
15
  pymammotion/bluetooth/const.py,sha256=CCqyHsYbB0BAYjwdhXt_n6eWWxmhlUrAFjvVv57mbvE,1749
16
16
  pymammotion/bluetooth/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- pymammotion/bluetooth/data/convert.py,sha256=tlctvRODoYypy4FpMD_UBwB1bIn5hG0QdQQdNI0e1R8,792
18
- pymammotion/bluetooth/data/framectrldata.py,sha256=-qRmbHBXDLDEPOp-N9e44C9l3SUcJX7vyEvACx5DpDA,987
19
- pymammotion/bluetooth/data/notifydata.py,sha256=N1bphpueWUWbsWUcpZmMGt2CyCgLcKAFAIHG4RCnqBU,1947
20
- pymammotion/const.py,sha256=EEmZ1v4MqN2nPiNpS_mJQqaCkSNEa1EXUmtwZBUhXIg,329
17
+ pymammotion/bluetooth/data/convert.py,sha256=6DMwvzVr9FWCoQFIKSI2poFXjISc_m6X59g8FlVO0-o,800
18
+ pymammotion/bluetooth/data/framectrldata.py,sha256=qxhGQsTGsfPx-CarEMLkgBn_RJ6I2-exmr9AX2U4pFg,995
19
+ pymammotion/bluetooth/data/notifydata.py,sha256=jeROpoFmaZfNTidkLLm5VYeFbeIgDSi8waJ0nVLRUTA,1995
20
+ pymammotion/const.py,sha256=lWRxvTVdXnNHuxqvRkjO5ziK0Ic-fZMM6J2dbe5M6Nc,385
21
21
  pymammotion/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- pymammotion/data/model/__init__.py,sha256=d8FlIgCcWqoH3jJSpnm-IY-25RM-l2nbRwLtWjSHo74,222
22
+ pymammotion/data/model/__init__.py,sha256=aSyroxYQQS-WMRi6WmWm2js4wLa9nmsi160gx9tts4o,323
23
23
  pymammotion/data/model/account.py,sha256=vJM-KTf2q6eBfVC-UlNHBSmJvqHiCawZ40vnuhXhaz8,140
24
- pymammotion/data/model/device.py,sha256=65wBLvnbsx4ngARDW6rI3wyL_G19xhgngtogvvGXolc,10968
25
- pymammotion/data/model/device_config.py,sha256=KnrBytR7ADxcXXwPKMaH17-BVhJy6ph9PD_Hd_7jf-0,2567
26
- pymammotion/data/model/enums.py,sha256=tD_vYsxstOV_lUkYF9uWkrjVOgAJPNnGevy_xmiu3WE,1558
27
- pymammotion/data/model/excute_boarder_params.py,sha256=kadSth4y-VXlXIZ6R-Ng-kDvBbM-3YRr8bmR86qR0U0,1355
28
- pymammotion/data/model/execute_boarder.py,sha256=oDb2h5tFtOQIa8OCNYaDugqCgCZBLjQRzQTNVcJVAGQ,1072
24
+ pymammotion/data/model/device.py,sha256=ejIMloTHlJcBi-qNFewTDt1K0pPJYpgjtJqqqhUqR1g,11182
25
+ pymammotion/data/model/device_config.py,sha256=fsUSfYsICD7oTZm9dIaNTNSwo54A94n9VAWJcJvEz2Y,2574
26
+ pymammotion/data/model/enums.py,sha256=EpKmO8yVUZyEnTY4yH0DMMVKYNQM42zpW1maUu0i3IE,1582
27
+ pymammotion/data/model/excute_boarder_params.py,sha256=9CpUqrygcle1C_1hDW-riLmm4map4ZbE842NXjcomEI,1394
28
+ pymammotion/data/model/execute_boarder.py,sha256=9rd_h4fbcsXxgnLOd2rO2hWyD1abnTGc47QTEpp8DD0,1103
29
29
  pymammotion/data/model/generate_route_information.py,sha256=MkUBoqGtCAKmiVQ4Q1pEoDVHZs5uLIo7vhfWT4nGbtY,801
30
- pymammotion/data/model/hash_list.py,sha256=LnCU6Bdr4uy4OF8VGCs5t-JM1Ah6fyaBC3Z_Qwlaa4Y,2682
31
- pymammotion/data/model/location.py,sha256=sLWObWvfRoR_hmpX5r32iaPOEyk1gJ1vbTRKNVSrdLU,753
30
+ pymammotion/data/model/hash_list.py,sha256=-2z_g9bhr3A7EK_J-oYrOpg6MjUnhliO__76HLUdDSo,2690
31
+ pymammotion/data/model/location.py,sha256=H1h4Rhr0z_mDplNf1CP_ZCA3zM4_FJ_nMqzkbaoh7To,787
32
32
  pymammotion/data/model/mowing_modes.py,sha256=UxQrRAHQNC_lJTOA0ms2wuLAAi5UEVTkvvSZjnFpUjE,826
33
- pymammotion/data/model/plan.py,sha256=7JvqAo0a9Yg1Vtifd4J3Dx3StEppxrMOfmq2-877kYg,2891
33
+ pymammotion/data/model/plan.py,sha256=mcadkSL7fQXy0iJ0q786I3GEQY4i6kmQXfW6Ri69lcQ,2906
34
34
  pymammotion/data/model/rapid_state.py,sha256=BdJFD_DlhrVneg-PqEruqCoMty-CR7q_9Qna-hk1yd8,1171
35
- pymammotion/data/model/region_data.py,sha256=75xOTM1qeRbSROp53eIczw3yCmYM9DgMjMh8qE9xkKo,2880
36
- pymammotion/data/model/report_info.py,sha256=1Rj_yRZ9apWX296QHae5prdObDbs32bsQf9rzMz2KEQ,4458
35
+ pymammotion/data/model/region_data.py,sha256=FLuL6kA7lbbh_idRh1eT9EosDqh4SpAqzpqHuQRDM88,2888
36
+ pymammotion/data/model/report_info.py,sha256=gBSOmylSUdsYyIDsRms0L0nhQBx4V4LO-4tERvFpqXU,4475
37
37
  pymammotion/data/mqtt/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
38
- pymammotion/data/mqtt/event.py,sha256=ih6_Evd09GsdfeHZ_5a_L93dhFhFd0s_4zFC1EBck98,4528
38
+ pymammotion/data/mqtt/event.py,sha256=omGNFYLjPKV_IY0remhEc8vcx2LkI_spZNysosPIvUM,4536
39
39
  pymammotion/data/mqtt/properties.py,sha256=HkBPghr26L9_b4QaOi1DtPgb0UoPIOGSe9wb3kgnM6Y,2815
40
40
  pymammotion/data/mqtt/status.py,sha256=zqnlo-MzejEQZszl0i0Wucoc3E76x6UtI9JLxoBnu54,1067
41
- pymammotion/data/state_manager.py,sha256=5zP7DdnYXWUhbFYBWiv25L64q8OOzQNzUXzbWEWzYVc,3099
41
+ pymammotion/data/state_manager.py,sha256=OQlfLeCYFglgJZdHeqG8djaCwVDC-SqDqDeqz7Q7LR4,3171
42
42
  pymammotion/event/__init__.py,sha256=mgATR6vPHACNQ-0zH5fi7NdzeTCDV1CZyaWPmtUusi8,115
43
- pymammotion/event/event.py,sha256=Fy5-I1p92AO_D67VW4eHQqA4pOt7MZsrP--tVfIVUz8,1820
43
+ pymammotion/event/event.py,sha256=LFUhjUhlFRL2mEo1WKpn_jUJq_8K_Sw1EBWCYenWF0I,1932
44
44
  pymammotion/http/_init_.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- pymammotion/http/http.py,sha256=wE05Yo8K592d1anNaZF-GJHr9D3kYWsd7Axpc1Yei_k,2834
45
+ pymammotion/http/http.py,sha256=OZHjQY9ZLdlsKK6MDqqV79JIH9WYWJe3-ey-WWbe2z4,2642
46
+ pymammotion/http/model/http.py,sha256=_aVrtZZyR4EdR6GcuqMP9vH8qBLN7nKu0U2OeraCcG0,1607
46
47
  pymammotion/mammotion/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
48
  pymammotion/mammotion/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
49
  pymammotion/mammotion/commands/abstract_message.py,sha256=nw6r7694yzl7iJKqRqhLmAPRjd_TL_Xo_-JXq2_a_ug,222
49
50
  pymammotion/mammotion/commands/mammotion_command.py,sha256=84XxnatnBm_5WQ_KOa2N0ltydQOhSvCme3fFqkuyEhg,1056
50
51
  pymammotion/mammotion/commands/messages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
- pymammotion/mammotion/commands/messages/driver.py,sha256=IFtmp9gJ3p3U2xtTgWVpKBMbnVnUht6Ioih17po6Hr4,3783
52
+ pymammotion/mammotion/commands/messages/driver.py,sha256=ANIOEtjF23k7W_R_Yfgzxmc7p1KSBCF-l-tijUtw0Yg,3709
52
53
  pymammotion/mammotion/commands/messages/media.py,sha256=ps0l06CXy5Ej--gTNCsyKttwo7yHLVrJUpn-wNJYecs,1150
53
- pymammotion/mammotion/commands/messages/navigation.py,sha256=-qit4SrtMpnPr0qsub_HD0pzKMlYsyzspW5uf1Ym008,23217
54
- pymammotion/mammotion/commands/messages/network.py,sha256=Hv5u7omEdffpTsOKw-uIlfhRkd_X1GyvKJT-nswHJ2w,8490
54
+ pymammotion/mammotion/commands/messages/navigation.py,sha256=igP_SJfZPc7g9AaqP0qqN3tgnuZiaD9nqYdJG33_JQ0,23589
55
+ pymammotion/mammotion/commands/messages/network.py,sha256=gD7NKVKg8U2KNbPvgOxvTJXbznWdpdPQo9jBsQSx4OI,8027
55
56
  pymammotion/mammotion/commands/messages/ota.py,sha256=XkeuWBZtpYMMBze6r8UN7dJXbe2FxUNGNnjwBpXJKM0,1240
56
- pymammotion/mammotion/commands/messages/system.py,sha256=m4Cc1zUcLgMFCu6zp5rMupwjDnMD-1PM6hqXpXuXRtw,10984
57
+ pymammotion/mammotion/commands/messages/system.py,sha256=xm9Nj3wva9leVV1tyzfS_Hf53t-j7Nk8RBlFd00CQFM,10972
57
58
  pymammotion/mammotion/commands/messages/video.py,sha256=_8lJsU4sLm2CGnc7RDkueA0A51Ysui6x7SqFnhX8O2g,1007
58
59
  pymammotion/mammotion/control/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
- pymammotion/mammotion/control/joystick.py,sha256=xHOp_YmEA-MLaZh3n9VhVOh7oHCti7aKARyfyvUJSjc,5558
60
- pymammotion/mammotion/devices/__init__.py,sha256=T72jt0ejtMjo1rPmn_FeMF3pmp0LLeRRpc9WcDKEYYY,126
61
- pymammotion/mammotion/devices/mammotion.py,sha256=nAPbc1cG5VoKAIf8g_sJMUx0gduoVKUOz8FxncwT-Kk,49380
60
+ pymammotion/mammotion/control/joystick.py,sha256=QfBVxM_gxpWsZAGO90whtgxCI2tIZ3TTad9wHIPsU9s,5640
61
+ pymammotion/mammotion/devices/__init__.py,sha256=f2qQFPgLGmV85W2hSlMUh5BYuht9o_Ar_JEAAMD4fsE,102
62
+ pymammotion/mammotion/devices/base.py,sha256=p_YUOolzcEvJGtyPPileAvc5jwYmTtEh0TsIG1LpvQ8,10692
63
+ pymammotion/mammotion/devices/mammotion.py,sha256=am2Rpsi1SdOaABrKC3ONBkQh17gfFcWTKAmV5mZsKK8,9301
64
+ pymammotion/mammotion/devices/mammotion_bluetooth.py,sha256=3XUjhE2sb_2aZnJlevmwxd99zR_4qZOfaK86h6hKV5E,17303
65
+ pymammotion/mammotion/devices/mammotion_cloud.py,sha256=09r1DfTPbE1JaH9xz46BzMrt5gn5dZa7HaYaiuN64SU,9856
62
66
  pymammotion/mqtt/__init__.py,sha256=Ocs5e-HLJvTuDpVXyECEsWIvwsUaxzj7lZ9mSYutNDY,105
63
- pymammotion/mqtt/mammotion_future.py,sha256=sQsEpy957YsfejsiVul1vHE62yDk66KID0kRNjMPxH0,688
64
- pymammotion/mqtt/mammotion_mqtt.py,sha256=VrvO7jfBeKCHwryIa5Elm6D_xrbLX1Hk-0M65h5-C2c,8129
65
- pymammotion/proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
+ pymammotion/mqtt/mammotion_future.py,sha256=_OWqKOlUGl2yT1xOsXFQYpGd-1zQ63OxqXgy7KRQgYc,710
68
+ pymammotion/mqtt/mammotion_mqtt.py,sha256=pugfSXAEwrA-jPzUgBH5QvoON_B1iE6_Ouib8pLi_so,8301
69
+ pymammotion/proto/__init__.py,sha256=v3_P1LOsYRBN9qCAhaWrWMX7GWHrox9XD3hdZQxcPZM,190
66
70
  pymammotion/proto/basestation.proto,sha256=_x5gAz3FkZXS1jtq4GgZgaDCuRU-UV-7HTFdsfQ3zbo,1034
67
71
  pymammotion/proto/basestation.py,sha256=js64_N2xQYRxWPRdVNEapO0qe7vBlfYnjW5sE8hi7hw,2026
68
72
  pymammotion/proto/basestation_pb2.py,sha256=PTVlHcDLQeRV6qv7ZPjGke9MF68mpqoUeJA0Sw_AoT0,2776
@@ -104,16 +108,16 @@ pymammotion/proto/mctrl_sys.py,sha256=GVciaKPcp4h1qrIILHX_Pd76tKSBFlaEvFPF7FZsj8
104
108
  pymammotion/proto/mctrl_sys_pb2.py,sha256=DYemb514mlC7c27t-k1YqqBif0xxhLmnIWk8rXtSj1c,21497
105
109
  pymammotion/proto/mctrl_sys_pb2.pyi,sha256=Dj_1UM86kZ5MfcVyNC76Z0gKrfl5YFsVWP2b-bKoZvk,38912
106
110
  pymammotion/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
- pymammotion/utility/constant/__init__.py,sha256=tZz7szqIhrzNjfcLU3ysfINfg5VEBUAisd9AhP4mvT0,38
111
+ pymammotion/utility/constant/__init__.py,sha256=tcY0LDeD-qDDHx2LKt55KOyv9ZI0UfCNM6fknLCmm8s,110
108
112
  pymammotion/utility/constant/device_constant.py,sha256=rAEK60F52VyJL31uLnq0Y60D-0VK5gVm59yi9kBfndM,7123
109
113
  pymammotion/utility/conversions.py,sha256=v3YICy0zZwwBBzrUZgabI7GRfiDBnkiAX2qdtk3NxOY,89
110
- pymammotion/utility/datatype_converter.py,sha256=v6zym2Zu0upxQjR-xDqXwi3516zpntSlg7LP8tQF5K8,4216
111
- pymammotion/utility/device_type.py,sha256=2B0RPqBo1mveGfFInPQmiON3-TcFMQGZpt7oMSFevL4,9363
112
- pymammotion/utility/map.py,sha256=aoi-Luzuph02hKynTofMoq3mnPstanx75MDAVv49CuY,2211
114
+ pymammotion/utility/datatype_converter.py,sha256=SPM_HuaaD_XOawlqEnA8qlRRZXGba3WjA8kGOZgeBlQ,4284
115
+ pymammotion/utility/device_type.py,sha256=6Mmv8oJoJ0DQrfGhRGt3rg20f_GLwIRw4NtpAdF6wcE,9478
116
+ pymammotion/utility/map.py,sha256=GYscVMg2cX3IPlNpCBNHDW0S55yS1WGRf1iHnNZ7TfQ,2227
113
117
  pymammotion/utility/movement.py,sha256=N75oAoAgFydqoaOedYIxGUHmuTCtPzAOtb-d_29tpfI,615
114
- pymammotion/utility/periodic.py,sha256=9wJMfwXPlx6Mbp3Fws7LLTI34ZDKphH1bva_Ggyk32g,3281
115
- pymammotion/utility/rocker_util.py,sha256=syPL0QN4zMzHiTIkUKS7RXBBptjdbkfNlPddwUD5V3A,7171
116
- pymammotion-0.2.29.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
117
- pymammotion-0.2.29.dist-info/METADATA,sha256=kP1T_XwrwQcFmcNL5Vu0WhYWzQgtH92pv5H2JN86AvM,3969
118
- pymammotion-0.2.29.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
119
- pymammotion-0.2.29.dist-info/RECORD,,
118
+ pymammotion/utility/periodic.py,sha256=MbeSb9cfhxzYmdT_RiE0dZe3H9IfbQW_zSqhmSX2RUc,3321
119
+ pymammotion/utility/rocker_util.py,sha256=6tX7sS87qoQC_tsxbx3NLL-HgS08wtzXiZkhDiz7uo0,7179
120
+ pymammotion-0.2.31.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
121
+ pymammotion-0.2.31.dist-info/METADATA,sha256=0SSRrtVWHluLV_1KNTCVu3LIfBqjsFxlprMpvDV6eKI,4052
122
+ pymammotion-0.2.31.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
123
+ pymammotion-0.2.31.dist-info/RECORD,,