pymammotion 0.2.38__py3-none-any.whl → 0.2.40__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.
@@ -1,7 +1,6 @@
1
1
  from dataclasses import dataclass
2
2
  from typing import Optional, TypeVar
3
3
 
4
- from mashumaro import DataClassDictMixin
5
4
  from mashumaro.config import BaseConfig
6
5
  from mashumaro.mixins.orjson import DataClassORJSONMixin
7
6
 
@@ -20,7 +19,7 @@ class RegionResponseData(DataClassORJSONMixin):
20
19
 
21
20
 
22
21
  @dataclass
23
- class RegionResponse(DataClassDictMixin):
22
+ class RegionResponse(DataClassORJSONMixin):
24
23
  data: RegionResponseData
25
24
  code: int
26
25
  id: Optional[str] = None
@@ -1,8 +1,10 @@
1
1
  """MowingDevice class to wrap around the betterproto dataclasses."""
2
2
 
3
- from dataclasses import dataclass
3
+ from dataclasses import dataclass, field
4
+ from typing import Optional
4
5
 
5
6
  import betterproto
7
+ from mashumaro.mixins.orjson import DataClassORJSONMixin
6
8
 
7
9
  from pymammotion.data.model import HashList, RapidState
8
10
  from pymammotion.data.model.device_config import DeviceLimits
@@ -28,23 +30,17 @@ from pymammotion.utility.map import CoordinateConverter
28
30
 
29
31
 
30
32
  @dataclass
31
- class MowingDevice:
33
+ class MowingDevice(DataClassORJSONMixin):
32
34
  """Wraps the betterproto dataclasses, so we can bypass the groups for keeping all data."""
33
35
 
34
- device: LubaMsg
35
- map: HashList
36
- location: Location
37
- mowing_state: RapidState
38
-
39
- def __init__(self) -> None:
40
- self.device = LubaMsg()
41
- self.map = HashList(area={}, path={}, obstacle={}, hashlist=[])
42
- self.location = Location()
43
- self.report_data = ReportData()
44
- self.err_code_list = []
45
- self.err_code_list_time = []
46
- self.limits = DeviceLimits(30, 70, 0.2, 0.6)
47
- self.mowing_state = RapidState()
36
+ map: HashList = field(default_factory=HashList)
37
+ location: Location = field(default_factory=Location)
38
+ mowing_state: RapidState = field(default_factory=RapidState)
39
+ report_data: ReportData = field(default_factory=ReportData)
40
+ err_code_list: list = field(default_factory=list)
41
+ err_code_list_time: Optional[list] = field(default_factory=list)
42
+ limits: DeviceLimits = field(default_factory=DeviceLimits)
43
+ device: Optional[LubaMsg] = field(default_factory=LubaMsg)
48
44
 
49
45
  @classmethod
50
46
  def from_raw(cls, raw: dict) -> "MowingDevice":
@@ -161,7 +157,7 @@ class MowingDevice:
161
157
 
162
158
 
163
159
  @dataclass
164
- class DevNetData:
160
+ class DevNetData(DataClassORJSONMixin):
165
161
  """Wrapping class around LubaMsg to return a dataclass from the raw dict."""
166
162
 
167
163
  net: dict
@@ -184,7 +180,7 @@ class DevNetData:
184
180
 
185
181
 
186
182
  @dataclass
187
- class SysData:
183
+ class SysData(DataClassORJSONMixin):
188
184
  """Wrapping class around LubaMsg to return a dataclass from the raw dict."""
189
185
 
190
186
  sys: dict
@@ -207,7 +203,7 @@ class SysData:
207
203
 
208
204
 
209
205
  @dataclass
210
- class NavData:
206
+ class NavData(DataClassORJSONMixin):
211
207
  """Wrapping class around LubaMsg to return a dataclass from the raw dict."""
212
208
 
213
209
  nav: dict
@@ -230,7 +226,7 @@ class NavData:
230
226
 
231
227
 
232
228
  @dataclass
233
- class DriverData:
229
+ class DriverData(DataClassORJSONMixin):
234
230
  """Wrapping class around LubaMsg to return a dataclass from the raw dict."""
235
231
 
236
232
  driver: dict
@@ -253,7 +249,7 @@ class DriverData:
253
249
 
254
250
 
255
251
  @dataclass
256
- class MulData:
252
+ class MulData(DataClassORJSONMixin):
257
253
  """Wrapping class around LubaMsg to return a dataclass from the raw dict."""
258
254
 
259
255
  mul: dict
@@ -276,7 +272,7 @@ class MulData:
276
272
 
277
273
 
278
274
  @dataclass
279
- class OtaData:
275
+ class OtaData(DataClassORJSONMixin):
280
276
  """Wrapping class around LubaMsg to return a dataclass from the raw dict."""
281
277
 
282
278
  ota: dict
@@ -299,7 +295,7 @@ class OtaData:
299
295
 
300
296
 
301
297
  @dataclass
302
- class PeptData:
298
+ class PeptData(DataClassORJSONMixin):
303
299
  """Wrapping class around LubaMsg to return a dataclass from the raw dict."""
304
300
 
305
301
  pept: dict
@@ -1,18 +1,22 @@
1
1
  from dataclasses import dataclass, field
2
2
 
3
+ from mashumaro.mixins.orjson import DataClassORJSONMixin
4
+
3
5
  from pymammotion.utility.device_type import DeviceType
4
6
 
5
7
 
6
8
  @dataclass
7
- class DeviceLimits:
8
- blade_height_min: int
9
- blade_height_max: int
10
- working_speed_min: float
11
- working_speed_max: float
9
+ class DeviceLimits(DataClassORJSONMixin):
10
+ blade_height_min: int = 30
11
+ blade_height_max: int = 70
12
+ working_speed_min: float = 0.2
13
+ working_speed_max: float = 1.2
14
+ working_path_min: int = 15
15
+ working_path_max: int = 35
12
16
 
13
17
 
14
18
  @dataclass
15
- class OperationSettings:
19
+ class OperationSettings(DataClassORJSONMixin):
16
20
  """Operation settings for a device."""
17
21
 
18
22
  is_mow: bool = True
@@ -1,6 +1,8 @@
1
1
  from dataclasses import dataclass, field
2
2
  from enum import IntEnum
3
3
 
4
+ from mashumaro.mixins.orjson import DataClassORJSONMixin
5
+
4
6
  from pymammotion.proto.mctrl_nav import AreaHashName, NavGetCommDataAck
5
7
 
6
8
 
@@ -13,23 +15,31 @@ class PathType(IntEnum):
13
15
 
14
16
 
15
17
  @dataclass
16
- class FrameList:
18
+ class FrameList(DataClassORJSONMixin):
17
19
  total_frame: int
18
20
  data: list[NavGetCommDataAck]
19
21
 
20
22
 
21
23
  @dataclass
22
- class HashList:
24
+ class AreaHashNameList(DataClassORJSONMixin):
25
+ """Wrapper so we can serialize to and from dict."""
26
+
27
+ name: str
28
+ hash: int
29
+
30
+
31
+ @dataclass
32
+ class HashList(DataClassORJSONMixin):
23
33
  """stores our map data.
24
34
  [hashID, FrameList].
25
35
  hashlist for all our hashIDs for verification
26
36
  """
27
37
 
28
- area: dict # type 0
29
- path: dict # type 2
30
- obstacle: dict # type 1
31
- hashlist: list[int]
32
- area_name: list[AreaHashName] = field(default_factory=list)
38
+ area: dict = field(default_factory=dict) # type 0
39
+ path: dict = field(default_factory=dict) # type 2
40
+ obstacle: dict = field(default_factory=dict) # type 1
41
+ hashlist: list[int] = field(default_factory=list)
42
+ area_name: list[AreaHashNameList] = field(default_factory=list)
33
43
 
34
44
  def set_hashlist(self, hashlist: list[int]) -> None:
35
45
  self.hashlist = hashlist
@@ -1,10 +1,12 @@
1
1
  """Contains RTK models for robot location and RTK positions."""
2
2
 
3
- from dataclasses import dataclass
3
+ from dataclasses import dataclass, field
4
+
5
+ from mashumaro.mixins.orjson import DataClassORJSONMixin
4
6
 
5
7
 
6
8
  @dataclass
7
- class Point:
9
+ class Point(DataClassORJSONMixin):
8
10
  """Returns a lat long."""
9
11
 
10
12
  latitude: float = 0.0
@@ -23,17 +25,12 @@ class Dock(Point):
23
25
 
24
26
 
25
27
  @dataclass
26
- class Location:
28
+ class Location(DataClassORJSONMixin):
27
29
  """Stores/retrieves RTK GPS data."""
28
30
 
29
- device: Point
30
- RTK: Point
31
- dock: Dock
31
+ device: Point = field(default_factory=Point)
32
+ RTK: Point = field(default_factory=Point)
33
+ dock: Dock = field(default_factory=Dock)
32
34
  position_type: int = 0
33
35
  orientation: int = 0 # 360 degree rotation +-
34
36
  work_zone: int = 0
35
-
36
- def __init__(self) -> None:
37
- self.device = Point()
38
- self.RTK = Point()
39
- self.dock = Dock()
@@ -1,7 +1,11 @@
1
- from typing import List, Optional
1
+ from dataclasses import dataclass
2
+ from typing import Optional
2
3
 
4
+ from mashumaro.mixins.orjson import DataClassORJSONMixin
3
5
 
4
- class RegionData:
6
+
7
+ @dataclass
8
+ class RegionData(DataClassORJSONMixin):
5
9
  def __init__(self) -> None:
6
10
  self.hash: Optional[int] = None
7
11
  self.action: int = 0
@@ -1,23 +1,17 @@
1
1
  from dataclasses import asdict, dataclass, field
2
2
 
3
+ from mashumaro.mixins.orjson import DataClassORJSONMixin
4
+
3
5
 
4
6
  @dataclass
5
- class ConnectData:
7
+ class ConnectData(DataClassORJSONMixin):
6
8
  connect_type: int = 0
7
9
  ble_rssi: int = 0
8
10
  wifi_rssi: int = 0
9
11
 
10
- @classmethod
11
- def from_dict(cls, data: dict) -> "ConnectData":
12
- return cls(
13
- connect_type=data.get("connect_type", 0),
14
- ble_rssi=data.get("ble_rssi", 0),
15
- wifi_rssi=data.get("wifi_rssi", 0),
16
- )
17
-
18
12
 
19
13
  @dataclass
20
- class DeviceData:
14
+ class DeviceData(DataClassORJSONMixin):
21
15
  sys_status: int = 0
22
16
  charge_state: int = 0
23
17
  battery_val: int = 0
@@ -25,58 +19,27 @@ class DeviceData:
25
19
  last_status: int = 0
26
20
  sys_time_stamp: str = ""
27
21
 
28
- @classmethod
29
- def from_dict(cls, data: dict):
30
- return cls(
31
- sys_status=data.get("sys_status", 0),
32
- charge_state=data.get("charge_state", 0),
33
- battery_val=data.get("battery_val", 0),
34
- sensor_status=data.get("sensor_status", 0),
35
- last_status=data.get("last_status", 0),
36
- sys_time_stamp=data.get("sys_time_stamp", ""),
37
- )
38
-
39
22
 
40
23
  @dataclass
41
- class RTKData:
24
+ class RTKData(DataClassORJSONMixin):
42
25
  status: int = 0
43
26
  pos_level: int = 0
44
27
  gps_stars: int = 0
45
28
  dis_status: str = ""
46
29
  co_view_stars: int = 0
47
30
 
48
- @classmethod
49
- def from_dict(cls, data: dict):
50
- return cls(
51
- status=data.get("status", 0),
52
- pos_level=data.get("pos_level", 0),
53
- gps_stars=data.get("gps_stars", 0),
54
- dis_status=data.get("dis_status", ""),
55
- co_view_stars=data.get("co_view_stars", 0),
56
- )
57
-
58
31
 
59
32
  @dataclass
60
- class LocationData:
33
+ class LocationData(DataClassORJSONMixin):
61
34
  real_pos_x: int = 0
62
35
  real_pos_y: int = 0
63
36
  real_toward: int = 0
64
37
  pos_type: int = 0
65
38
  bol_hash: str = ""
66
39
 
67
- @classmethod
68
- def from_dict(cls, data: dict):
69
- return cls(
70
- real_pos_x=data.get("real_pos_x", 0),
71
- real_pos_y=data.get("real_pos_y", 0),
72
- real_toward=data.get("real_toward", 0),
73
- pos_type=data.get("pos_type", 0),
74
- bol_hash=data.get("bol_hash", ""),
75
- )
76
-
77
40
 
78
41
  @dataclass
79
- class WorkData:
42
+ class WorkData(DataClassORJSONMixin):
80
43
  path: int = 0
81
44
  path_hash: str = ""
82
45
  progress: int = 0
@@ -98,31 +61,6 @@ class WorkData:
98
61
  nav_edit_status: int = 0
99
62
  knife_height: int = 0
100
63
 
101
- @classmethod
102
- def from_dict(cls, data: dict):
103
- return cls(
104
- path=data.get("path", 0),
105
- path_hash=data.get("path_hash", ""),
106
- progress=data.get("progress", 0),
107
- area=data.get("area", 0),
108
- bp_info=data.get("bp_info", 0),
109
- bp_hash=data.get("bp_hash", ""),
110
- bp_pos_x=data.get("bp_pos_x", 0),
111
- bp_pos_y=data.get("bp_pos_y", 0),
112
- real_path_num=data.get("real_path_num", ""),
113
- path_pos_x=data.get("path_pos_x", 0),
114
- path_pos_y=data.get("path_pos_y", 0),
115
- ub_zone_hash=data.get("ub_zone_hash", ""),
116
- ub_path_hash=data.get("ub_path_hash", ""),
117
- init_cfg_hash=data.get("init_cfg_hash", ""),
118
- ub_ecode_hash=data.get("ub_ecode_hash", ""),
119
- nav_run_mode=data.get("nav_run_mode", 0),
120
- test_mode_status=data.get("test_mode_status", 0),
121
- man_run_speed=data.get("man_run_speed", 0),
122
- nav_edit_status=data.get("nav_edit_status", 0),
123
- knife_height=data.get("knife_height", 0),
124
- )
125
-
126
64
 
127
65
  @dataclass
128
66
  class ReportData:
@@ -154,7 +154,7 @@ class ThingEventMessage(DataClassORJSONMixin):
154
154
  params_obj = DeviceWarningEventParams.from_dict(params_dict)
155
155
  elif identifier == "device_config_req_event":
156
156
  params_obj = payload.get("params", {})
157
- elif identifier == "device_notification_event":
157
+ elif identifier == "device_notification_event" or identifier == "device_warning_code_event":
158
158
  params_obj = DeviceNotificationEventParams.from_dict(params_dict)
159
159
  else:
160
160
  raise ValueError(f"Unknown identifier: {identifier} {params_dict}")
@@ -5,6 +5,7 @@ from typing import Any, Awaitable, Callable, Optional
5
5
  import betterproto
6
6
 
7
7
  from pymammotion.data.model.device import MowingDevice
8
+ from pymammotion.data.model.hash_list import AreaHashNameList
8
9
  from pymammotion.proto.luba_msg import LubaMsg
9
10
  from pymammotion.proto.mctrl_nav import AppGetAllAreaHashName, NavGetCommDataAck, NavGetHashListAck
10
11
 
@@ -65,7 +66,8 @@ class StateManager:
65
66
  await self.get_commondata_ack_callback(common_data)
66
67
  case "toapp_all_hash_name":
67
68
  hash_names: AppGetAllAreaHashName = nav_msg[1]
68
- self._device.map.area_name = hash_names.hashnames
69
+ converted_list = [AreaHashNameList(name=item.name, hash=item.hash) for item in hash_names.hashnames]
70
+ self._device.map.area_name = converted_list
69
71
 
70
72
  async def _update_sys_data(self, message) -> None:
71
73
  """Update system."""
@@ -75,8 +77,6 @@ class StateManager:
75
77
  self._device.buffer(sys_msg[1])
76
78
  case "toapp_report_data":
77
79
  self._device.update_report_data(sys_msg[1])
78
- if self.queue_command_callback:
79
- await self.queue_command_callback("get_report_cfg", stop=True)
80
80
  case "mow_to_app_info":
81
81
  self._device.mow_info(sys_msg[1])
82
82
  case "system_tard_state_tunnel":
@@ -227,7 +227,7 @@ class MessageSystem(AbstractMessage, ABC):
227
227
  return self.send_order_msg_sys(build)
228
228
 
229
229
  def get_report_cfg(
230
- self, timeout: int = 10000, period: int = 1000, no_change_period: int = 1000, stop: bool = False
230
+ self, timeout: int = 10000, period: int = 1000, no_change_period: int = 2000, stop: bool = False
231
231
  ):
232
232
  mctlsys = MctlSys(
233
233
  todev_report_cfg=ReportInfoCfg(
@@ -239,15 +239,16 @@ class MessageSystem(AbstractMessage, ABC):
239
239
  )
240
240
  )
241
241
 
242
- mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_CONNECT.value)
243
- mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_RTK.value)
244
- mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_DEV_LOCAL.value)
245
- mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_WORK.value)
246
- mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_DEV_STA.value)
247
- mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_MAINTAIN.value)
248
- mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_VISION_POINT.value)
249
- mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_VIO.value)
250
- mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_VISION_STATISTIC.value)
242
+ mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_CONNECT)
243
+ mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_RTK)
244
+ mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_DEV_LOCAL)
245
+ mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_WORK)
246
+ mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_DEV_STA)
247
+ mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_MAINTAIN)
248
+ mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_VISION_POINT)
249
+ mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_VIO)
250
+ mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_VISION_STATISTIC)
251
+ mctlsys.todev_report_cfg.sub.append(RptInfoType.RIT_BASESTATION_INFO)
251
252
 
252
253
  lubaMsg = LubaMsg()
253
254
  lubaMsg.msgtype = MsgCmdType.MSG_CMD_TYPE_EMBED_SYS
@@ -205,10 +205,6 @@ class MammotionBaseDevice:
205
205
 
206
206
  if self._cloud_device:
207
207
  await self.queue_command("get_area_name_list", device_id=self._cloud_device.iotId)
208
- elif has_field(self._mower.net.toapp_wifi_iot_status):
209
- await self.queue_command(
210
- "get_area_name_list", device_id=self._mower.net.toapp_wifi_iot_status.devicename
211
- )
212
208
  except Exception:
213
209
  """Do nothing for now."""
214
210
 
@@ -177,7 +177,7 @@ class Mammotion:
177
177
  return
178
178
 
179
179
  self.cloud_client = cloud_client
180
- self.mqtt_list[account] = MammotionCloud(
180
+ mammotion_cloud = MammotionCloud(
181
181
  MammotionMQTT(
182
182
  region_id=cloud_client.region_response.data.regionId,
183
183
  product_key=cloud_client.aep_response.data.productKey,
@@ -189,7 +189,9 @@ class Mammotion:
189
189
  ),
190
190
  cloud_client,
191
191
  )
192
- self.add_cloud_devices(self.mqtt_list.get(account))
192
+ self.mqtt_list[account] = mammotion_cloud
193
+ self.add_cloud_devices(mammotion_cloud)
194
+
193
195
  loop = asyncio.get_running_loop()
194
196
  await loop.run_in_executor(None, self.mqtt_list[account].connect_async)
195
197
 
@@ -141,7 +141,7 @@ message NavGetCommData {
141
141
  int32 subCmd = 2;
142
142
  int32 action = 3;
143
143
  int32 type = 4;
144
- int64 Hash = 5;
144
+ fixed64 Hash = 5;
145
145
  int64 paternalHashA = 6;
146
146
  int64 paternalHashB = 7;
147
147
  int32 totalFrame = 8;
@@ -434,7 +434,7 @@ message NavTaskCtrlAck {
434
434
 
435
435
  message NavMapNameMsg {
436
436
  int32 rw = 1; // Represents RW field
437
- int64 hash = 2; // Represents HASH field
437
+ fixed64 hash = 2; // Represents HASH field
438
438
  string name = 3; // Represents NAME field
439
439
  int32 result = 4; // Represents RESULT field
440
440
  string device_id = 5; // Represents DEVICEID field
@@ -469,10 +469,8 @@ message SvgMessageAckT {
469
469
  }
470
470
 
471
471
  message AreaHashName {
472
- // Define fields for AreaHashName message here
473
- // For example:
474
- string name = 1; // Replace with actual field definitions
475
- int64 hash = 2; // Replace with actual field definitions
472
+ string name = 2;
473
+ fixed64 hash = 1;
476
474
  }
477
475
 
478
476
  message AppGetAllAreaHashName {
@@ -525,9 +525,8 @@ class SvgMessageAckT(betterproto.Message):
525
525
 
526
526
  @dataclass
527
527
  class AreaHashName(betterproto.Message):
528
- # Define fields for AreaHashName message here For example:
529
- name: str = betterproto.string_field(1)
530
- hash: int = betterproto.int64_field(2)
528
+ name: str = betterproto.string_field(2)
529
+ hash: int = betterproto.fixed64_field(1)
531
530
 
532
531
 
533
532
  @dataclass
@@ -478,6 +478,7 @@ enum rpt_info_type {
478
478
  RIT_VISION_POINT = 7;
479
479
  RIT_VIO = 8;
480
480
  RIT_VISION_STATISTIC = 9;
481
+ RIT_BASESTATION_INFO = 10;
481
482
  }
482
483
 
483
484
  enum rpt_act {
@@ -78,6 +78,7 @@ class RptInfoType(betterproto.Enum):
78
78
  RIT_VISION_POINT = 7
79
79
  RIT_VIO = 8
80
80
  RIT_VISION_STATISTIC = 9
81
+ RIT_BASESTATION_INFO = 10
81
82
 
82
83
 
83
84
  class RptAct(betterproto.Enum):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pymammotion
3
- Version: 0.2.38
3
+ Version: 0.2.40
4
4
  Summary:
5
5
  License: GNU-3.0
6
6
  Author: Michael Arthur
@@ -6,7 +6,7 @@ pymammotion/aliyun/dataclass/aep_response.py,sha256=8f6GIP58ve8gd6AL3HBoXxsy0n2q
6
6
  pymammotion/aliyun/dataclass/connect_response.py,sha256=Yz-fEbDzgGPTo5Of2oAjmFkSv08T7ze80pQU4k-gKIU,824
7
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
- pymammotion/aliyun/dataclass/regions_response.py,sha256=CVPpdFhDD6_emWHyLRzOdp2j3HLPtP8tlNyzGnr8AcI,690
9
+ pymammotion/aliyun/dataclass/regions_response.py,sha256=TBBWKF9j5iWjX4YbvMBHNDOnr0cEhbdfgApgCyJZhVg,651
10
10
  pymammotion/aliyun/dataclass/session_by_authcode_response.py,sha256=qW0pnnRXfyEuMbb9ORc013sYqZwO8z4i_h_SfSaA_bw,419
11
11
  pymammotion/aliyun/tmp_constant.py,sha256=M4Hq_lrGB3LZdX6R2XohRPFoK1NDnNV-pTJwJcJ9838,6650
12
12
  pymammotion/bluetooth/__init__.py,sha256=LAl8jqZ1fPh-3mLmViNQsP3s814C1vsocYUa6oSaXt0,36
@@ -21,24 +21,24 @@ pymammotion/const.py,sha256=lWRxvTVdXnNHuxqvRkjO5ziK0Ic-fZMM6J2dbe5M6Nc,385
21
21
  pymammotion/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
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=ejIMloTHlJcBi-qNFewTDt1K0pPJYpgjtJqqqhUqR1g,11182
25
- pymammotion/data/model/device_config.py,sha256=Ez55DiYV7QTxgSk6R6XjUSZ7XdTGf8w38VaFsAOBNv8,2637
24
+ pymammotion/data/model/device.py,sha256=OGOVm3h-jTfL-hpCE07o2tLRk34i0rRO-hFjY8AHQRw,11472
25
+ pymammotion/data/model/device_config.py,sha256=_DlpxqrybTfkPFxV-gPjNzIte0AKA_Oa_JRmDcVmLdk,2823
26
26
  pymammotion/data/model/enums.py,sha256=EpKmO8yVUZyEnTY4yH0DMMVKYNQM42zpW1maUu0i3IE,1582
27
27
  pymammotion/data/model/excute_boarder_params.py,sha256=9CpUqrygcle1C_1hDW-riLmm4map4ZbE842NXjcomEI,1394
28
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=fszjpbt0e7DNqibQnPaYCTiuK39gwtNVjBF0hUyMeeE,3025
31
- pymammotion/data/model/location.py,sha256=H1h4Rhr0z_mDplNf1CP_ZCA3zM4_FJ_nMqzkbaoh7To,787
30
+ pymammotion/data/model/hash_list.py,sha256=efUSelsj39IArxV_GEN7niM2fsVa1OL8ZjToxStHSQ4,3395
31
+ pymammotion/data/model/location.py,sha256=PwmITejfI4pm7PI4rzqSuuHetwle6IJr_CV95435s2M,871
32
32
  pymammotion/data/model/mowing_modes.py,sha256=5TrHSijUyPtIDWpNtgzx_vFQukRJWRz4gIrUaXggKPw,827
33
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=FLuL6kA7lbbh_idRh1eT9EosDqh4SpAqzpqHuQRDM88,2888
36
- pymammotion/data/model/report_info.py,sha256=gBSOmylSUdsYyIDsRms0L0nhQBx4V4LO-4tERvFpqXU,4475
35
+ pymammotion/data/model/region_data.py,sha256=OTV15vRyn9JORXsQPjWMNF1ZujuNhsOKl25KeqwMObA,3007
36
+ pymammotion/data/model/report_info.py,sha256=IRVpsuEHg8zTrFIqrKUFMTz_y0u5GuWIRqf1V8mb0Fk,2226
37
37
  pymammotion/data/mqtt/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
38
- pymammotion/data/mqtt/event.py,sha256=GKh4NdcaeeaG5pPktzy-eguFKK74Mfxpl0eIAkKU1Vc,4567
38
+ pymammotion/data/mqtt/event.py,sha256=plt53w3kHulB_MfbkxK9j7AfdQ5ahVU2s4kiQMoLio4,4612
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=ZIOB1Th7yDAgCJk17rd-kXjwD50GIqQMsNgf1iFldUs,3615
41
+ pymammotion/data/state_manager.py,sha256=c-O9TRmQ1ZkDjgBZqY72DeKJsaiyK8K3pl8Adg1cR7w,3657
42
42
  pymammotion/event/__init__.py,sha256=mgATR6vPHACNQ-0zH5fi7NdzeTCDV1CZyaWPmtUusi8,115
43
43
  pymammotion/event/event.py,sha256=UzYnxV5DfvMDK3E06UvSzvzuBbaXOOUwO6xYt_zn9To,2034
44
44
  pymammotion/http/_init_.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -54,13 +54,13 @@ pymammotion/mammotion/commands/messages/media.py,sha256=ps0l06CXy5Ej--gTNCsyKttw
54
54
  pymammotion/mammotion/commands/messages/navigation.py,sha256=4rXBL-mViWc38K6x1w5O-GjwV8UWS5xZXkf4aHYjs8A,23684
55
55
  pymammotion/mammotion/commands/messages/network.py,sha256=gD7NKVKg8U2KNbPvgOxvTJXbznWdpdPQo9jBsQSx4OI,8027
56
56
  pymammotion/mammotion/commands/messages/ota.py,sha256=XkeuWBZtpYMMBze6r8UN7dJXbe2FxUNGNnjwBpXJKM0,1240
57
- pymammotion/mammotion/commands/messages/system.py,sha256=4ijnn0VPHOIizgjqDGpeD3jVetEscnSDt2E4tIBwkoQ,10888
57
+ pymammotion/mammotion/commands/messages/system.py,sha256=a1XSqWdDTWLBspvjN8otT46ovz3GQ8zv3TT-1FayFbo,10912
58
58
  pymammotion/mammotion/commands/messages/video.py,sha256=_8lJsU4sLm2CGnc7RDkueA0A51Ysui6x7SqFnhX8O2g,1007
59
59
  pymammotion/mammotion/control/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  pymammotion/mammotion/control/joystick.py,sha256=QfBVxM_gxpWsZAGO90whtgxCI2tIZ3TTad9wHIPsU9s,5640
61
61
  pymammotion/mammotion/devices/__init__.py,sha256=f2qQFPgLGmV85W2hSlMUh5BYuht9o_Ar_JEAAMD4fsE,102
62
- pymammotion/mammotion/devices/base.py,sha256=gG7qWuNdUIlS87T_opaynd9BrhClQSxDD6MAsmoTZbE,11230
63
- pymammotion/mammotion/devices/mammotion.py,sha256=vMM9xqzxuvambPQC1mg7HLIaJksvZK7GLdG4oRAWt5Q,11670
62
+ pymammotion/mammotion/devices/base.py,sha256=jUSmwUJ-Vy9jazy8A7J3ByN6NXMV9HoMWJBekJ19Ed4,11002
63
+ pymammotion/mammotion/devices/mammotion.py,sha256=JnT5q5z9AxPI71WBu4kwdJwpYoWCJ_WkU315Cy1bPQM,11701
64
64
  pymammotion/mammotion/devices/mammotion_bluetooth.py,sha256=sgGeyQeAeA3lQodcalRYS4nDNAzjfFs9SddIB1kadvw,17355
65
65
  pymammotion/mammotion/devices/mammotion_cloud.py,sha256=dk49VY9yHO3d-Nb17y-D4YIURs2FTLMzWHUYrxBYhtw,10116
66
66
  pymammotion/mqtt/__init__.py,sha256=Ocs5e-HLJvTuDpVXyECEsWIvwsUaxzj7lZ9mSYutNDY,105
@@ -91,8 +91,8 @@ pymammotion/proto/mctrl_driver.proto,sha256=I0BncdAa3laeqT17Sn95r_1HuBD3dSc9IVu9
91
91
  pymammotion/proto/mctrl_driver.py,sha256=sseY2MxUtaQZvg7fvbA_gNvtqx9MVDW_rvUcfA2CWVs,2971
92
92
  pymammotion/proto/mctrl_driver_pb2.py,sha256=bfLwZb5Hehb6OIkgFrZMkQ0oTBXoOBxpruszKz-UM1U,3785
93
93
  pymammotion/proto/mctrl_driver_pb2.pyi,sha256=9_rcQELsSeOfeIQMTEFIpeXICpDe3arQeA4kAYWNSWw,5860
94
- pymammotion/proto/mctrl_nav.proto,sha256=3OQ8DDP5yaZpKBcqeflGLQ5v5YE5AdBOftkKLRne2Tg,12530
95
- pymammotion/proto/mctrl_nav.py,sha256=J1DxdKO0JbYzVbE4ZEAd8MYMeCPYrdjSRw9NBX6oMsA,24945
94
+ pymammotion/proto/mctrl_nav.proto,sha256=TAJHfzgMRmT2IW0ciVJYAQDkfinRXoFEJGkk0VobSjU,12380
95
+ pymammotion/proto/mctrl_nav.py,sha256=xTsPmwhV_AwfoFWTGqpz2W4rVR7tHTHwNU4rS8QBLdc,24884
96
96
  pymammotion/proto/mctrl_nav_pb2.py,sha256=LAHfEmGfNVZCN6vuLSZF6s2wd1Qk-siaWe4mdPWPdxc,24213
97
97
  pymammotion/proto/mctrl_nav_pb2.pyi,sha256=qmGYfKh2o63e5ppl9QIWnwDbmGVUVOf7EqhC9ApE5fg,51336
98
98
  pymammotion/proto/mctrl_ota.proto,sha256=4iHr-v1R0QiNndCnv3b6mhXiERLukB67ZzhTgt1iMc0,629
@@ -103,8 +103,8 @@ pymammotion/proto/mctrl_pept.proto,sha256=HBTRiP1XJB5w9hT1V38aePPREpePBk5jkjupu_
103
103
  pymammotion/proto/mctrl_pept.py,sha256=utMtbXsCwGS14YggTqUdVIbTZsR0w49B6gKU8jHzbJg,1332
104
104
  pymammotion/proto/mctrl_pept_pb2.py,sha256=QqQ1BXo_EBs7cLmQGtRbnNy0rRxvaqtrGfKxXS8R5A8,2134
105
105
  pymammotion/proto/mctrl_pept_pb2.pyi,sha256=gr0lxUPqhyEnDdni9vpIQnAIhqAGtHlv1rFeb5EJnMY,2840
106
- pymammotion/proto/mctrl_sys.proto,sha256=OHQ86tlBxzvWOaUeDt2OafVhgxvRA0a0naBPVYMLLfA,10193
107
- pymammotion/proto/mctrl_sys.py,sha256=GVciaKPcp4h1qrIILHX_Pd76tKSBFlaEvFPF7FZsj8I,19108
106
+ pymammotion/proto/mctrl_sys.proto,sha256=_E9XeZyW1vhY8S0HxPcEjMKmuhULTonm8Q3Y0X3Qxaw,10222
107
+ pymammotion/proto/mctrl_sys.py,sha256=UJMQVXMjXVksp4O_eD_bUNPFM4ijvdSuma-sOIUsNUw,19138
108
108
  pymammotion/proto/mctrl_sys_pb2.py,sha256=DYemb514mlC7c27t-k1YqqBif0xxhLmnIWk8rXtSj1c,21497
109
109
  pymammotion/proto/mctrl_sys_pb2.pyi,sha256=Dj_1UM86kZ5MfcVyNC76Z0gKrfl5YFsVWP2b-bKoZvk,38912
110
110
  pymammotion/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -117,7 +117,7 @@ pymammotion/utility/map.py,sha256=GYscVMg2cX3IPlNpCBNHDW0S55yS1WGRf1iHnNZ7TfQ,22
117
117
  pymammotion/utility/movement.py,sha256=N75oAoAgFydqoaOedYIxGUHmuTCtPzAOtb-d_29tpfI,615
118
118
  pymammotion/utility/periodic.py,sha256=MbeSb9cfhxzYmdT_RiE0dZe3H9IfbQW_zSqhmSX2RUc,3321
119
119
  pymammotion/utility/rocker_util.py,sha256=6tX7sS87qoQC_tsxbx3NLL-HgS08wtzXiZkhDiz7uo0,7179
120
- pymammotion-0.2.38.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
121
- pymammotion-0.2.38.dist-info/METADATA,sha256=KCTjSd0ig3-zmsFVNbeFk3lueozZoutxjAtBbaxOzQM,4052
122
- pymammotion-0.2.38.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
123
- pymammotion-0.2.38.dist-info/RECORD,,
120
+ pymammotion-0.2.40.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
121
+ pymammotion-0.2.40.dist-info/METADATA,sha256=lG5KLR1KDcyAp0jwXabkMXO-tcCHM-2U1Rj1DGSA6pg,4052
122
+ pymammotion-0.2.40.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
123
+ pymammotion-0.2.40.dist-info/RECORD,,