pymammotion 0.2.31__py3-none-any.whl → 0.2.32__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.
- pymammotion/aliyun/cloud_gateway.py +2 -1
- pymammotion/data/model/device_config.py +3 -2
- pymammotion/data/model/hash_list.py +6 -3
- pymammotion/data/model/mowing_modes.py +1 -1
- pymammotion/data/mqtt/event.py +10 -7
- pymammotion/data/state_manager.py +5 -1
- pymammotion/event/event.py +6 -2
- pymammotion/mammotion/commands/messages/navigation.py +19 -18
- pymammotion/mammotion/devices/base.py +22 -8
- pymammotion/mammotion/devices/mammotion.py +7 -0
- pymammotion/mammotion/devices/mammotion_cloud.py +11 -10
- pymammotion/mqtt/mammotion_mqtt.py +1 -1
- pymammotion/proto/mctrl_nav.py +24 -24
- {pymammotion-0.2.31.dist-info → pymammotion-0.2.32.dist-info}/METADATA +1 -1
- {pymammotion-0.2.31.dist-info → pymammotion-0.2.32.dist-info}/RECORD +17 -17
- {pymammotion-0.2.31.dist-info → pymammotion-0.2.32.dist-info}/LICENSE +0 -0
- {pymammotion-0.2.31.dist-info → pymammotion-0.2.32.dist-info}/WHEEL +0 -0
@@ -593,6 +593,7 @@ class CloudIOTGateway:
|
|
593
593
|
logger.debug(response.headers)
|
594
594
|
logger.debug(response.status_code)
|
595
595
|
logger.debug(response.body)
|
596
|
+
logger.debug(iot_id)
|
596
597
|
|
597
598
|
response_body_str = response.body.decode("utf-8")
|
598
599
|
response_body_dict = json.loads(response_body_str)
|
@@ -635,5 +636,5 @@ class CloudIOTGateway:
|
|
635
636
|
return self._client_id
|
636
637
|
|
637
638
|
@property
|
638
|
-
def
|
639
|
+
def login_by_oauth_response(self):
|
639
640
|
return self._login_by_oauth_response
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from dataclasses import dataclass
|
1
|
+
from dataclasses import dataclass, field
|
2
2
|
|
3
3
|
from pymammotion.utility.device_type import DeviceType
|
4
4
|
|
@@ -35,6 +35,7 @@ class OperationSettings:
|
|
35
35
|
border_mode: int = 1 # border laps
|
36
36
|
obstacle_laps: int = 1
|
37
37
|
start_progress: int = 0
|
38
|
+
areas: list[int] = field(default_factory=list)
|
38
39
|
|
39
40
|
|
40
41
|
def create_path_order(operation_mode: OperationSettings, device_name: str) -> str:
|
@@ -59,7 +60,7 @@ def create_path_order(operation_mode: OperationSettings, device_name: str) -> st
|
|
59
60
|
bArr[6] = b
|
60
61
|
if DeviceType.is_luba1(device_name):
|
61
62
|
bArr[4] = operation_mode.toward_mode
|
62
|
-
return
|
63
|
+
return bArr.decode()
|
63
64
|
|
64
65
|
|
65
66
|
def calculate_yuka_mode(operation_mode: OperationSettings) -> int:
|
@@ -1,7 +1,7 @@
|
|
1
|
-
from dataclasses import dataclass
|
1
|
+
from dataclasses import dataclass, field
|
2
2
|
from enum import IntEnum
|
3
3
|
|
4
|
-
from pymammotion.proto.mctrl_nav import NavGetCommDataAck
|
4
|
+
from pymammotion.proto.mctrl_nav import NavGetCommDataAck, AreaHashName
|
5
5
|
|
6
6
|
|
7
7
|
class PathType(IntEnum):
|
@@ -24,11 +24,11 @@ class HashList:
|
|
24
24
|
[hashID, FrameList].
|
25
25
|
hashlist for all our hashIDs for verification
|
26
26
|
"""
|
27
|
-
|
28
27
|
area: dict # type 0
|
29
28
|
path: dict # type 2
|
30
29
|
obstacle: dict # type 1
|
31
30
|
hashlist: list[int]
|
31
|
+
area_name: list[AreaHashName] = field(default_factory=list)
|
32
32
|
|
33
33
|
def set_hashlist(self, hashlist: list[int]) -> None:
|
34
34
|
self.hashlist = hashlist
|
@@ -49,6 +49,9 @@ class HashList:
|
|
49
49
|
def update(self, hash_data: NavGetCommDataAck) -> bool:
|
50
50
|
"""Update the map data."""
|
51
51
|
if hash_data.type == PathType.AREA:
|
52
|
+
existing_name = next((area for area in self.area_name if area.hash == hash_data.hash), None)
|
53
|
+
if not existing_name:
|
54
|
+
self.area_name.append(AreaHashName(name=f"area {len(self.area_name)+1}", hash=hash_data.hash))
|
52
55
|
return self._add_hash_data(self.area, hash_data)
|
53
56
|
|
54
57
|
if hash_data.type == PathType.OBSTACLE:
|
pymammotion/data/mqtt/event.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
+
import base64
|
1
2
|
from base64 import b64decode
|
2
3
|
from dataclasses import dataclass
|
3
|
-
from typing import Any, Literal, Optional, Union
|
4
|
+
from typing import Any, Literal, Optional, Union, Mapping
|
4
5
|
|
5
6
|
from google.protobuf import json_format
|
6
7
|
from mashumaro.mixins.orjson import DataClassORJSONMixin
|
@@ -36,7 +37,9 @@ class Base64EncodedProtobuf(SerializableType):
|
|
36
37
|
|
37
38
|
@dataclass
|
38
39
|
class DeviceProtobufMsgEventValue(DataClassORJSONMixin):
|
39
|
-
content:
|
40
|
+
content: str
|
41
|
+
|
42
|
+
|
40
43
|
|
41
44
|
|
42
45
|
@dataclass
|
@@ -61,7 +64,7 @@ class DeviceNotificationEventCode(DataClassORJSONMixin):
|
|
61
64
|
|
62
65
|
@dataclass
|
63
66
|
class DeviceNotificationEventValue(DataClassORJSONMixin):
|
64
|
-
data: DeviceNotificationEventCode
|
67
|
+
data: str # parsed to DeviceNotificationEventCode
|
65
68
|
|
66
69
|
|
67
70
|
@dataclass
|
@@ -147,15 +150,15 @@ class ThingEventMessage(DataClassORJSONMixin):
|
|
147
150
|
identifier = params_dict.get("identifier")
|
148
151
|
if identifier is None:
|
149
152
|
"""Request configuration event."""
|
150
|
-
params_obj = DeviceConfigurationRequestEvent(
|
153
|
+
params_obj = DeviceConfigurationRequestEvent.from_dict(params_dict)
|
151
154
|
elif identifier == "device_protobuf_msg_event":
|
152
|
-
params_obj = DeviceProtobufMsgEventParams(
|
155
|
+
params_obj = DeviceProtobufMsgEventParams.from_dict(params_dict)
|
153
156
|
elif identifier == "device_warning_event":
|
154
|
-
params_obj = DeviceWarningEventParams(
|
157
|
+
params_obj = DeviceWarningEventParams.from_dict(params_dict)
|
155
158
|
elif identifier == "device_config_req_event":
|
156
159
|
params_obj = payload.get("params", {})
|
157
160
|
elif identifier == "device_notification_event":
|
158
|
-
params_obj = DeviceNotificationEventParams(
|
161
|
+
params_obj = DeviceNotificationEventParams.from_dict(params_dict)
|
159
162
|
else:
|
160
163
|
raise ValueError(f"Unknown identifier: {identifier} {params_dict}")
|
161
164
|
|
@@ -6,7 +6,7 @@ import betterproto
|
|
6
6
|
|
7
7
|
from pymammotion.data.model.device import MowingDevice
|
8
8
|
from pymammotion.proto.luba_msg import LubaMsg
|
9
|
-
from pymammotion.proto.mctrl_nav import NavGetCommDataAck, NavGetHashListAck
|
9
|
+
from pymammotion.proto.mctrl_nav import NavGetCommDataAck, NavGetHashListAck, AppGetAllAreaHashName
|
10
10
|
|
11
11
|
|
12
12
|
class StateManager:
|
@@ -62,6 +62,10 @@ class StateManager:
|
|
62
62
|
updated = self._device.map.update(common_data)
|
63
63
|
if updated:
|
64
64
|
await self.get_commondata_ack_callback(common_data)
|
65
|
+
case "toapp_all_hash_name":
|
66
|
+
hash_names: AppGetAllAreaHashName = nav_msg[1]
|
67
|
+
self._device.map.area_name = hash_names.hashnames
|
68
|
+
|
65
69
|
|
66
70
|
def _update_sys_data(self, message) -> None:
|
67
71
|
"""Update system."""
|
pymammotion/event/event.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import asyncio
|
2
|
+
from typing import Any
|
2
3
|
|
3
4
|
|
4
5
|
class Event:
|
@@ -54,9 +55,12 @@ class DataEvent:
|
|
54
55
|
def __init__(self) -> None:
|
55
56
|
self.on_data_event = Event()
|
56
57
|
|
57
|
-
async def data_event(self, data) -> None:
|
58
|
+
async def data_event(self, data: Any) -> None:
|
58
59
|
# This function will be executed when data is received.
|
59
|
-
|
60
|
+
if data:
|
61
|
+
await self.on_data_event(data)
|
62
|
+
else:
|
63
|
+
await self.on_data_event(None)
|
60
64
|
|
61
65
|
def add_subscribers(self, obj_method) -> None:
|
62
66
|
self.on_data_event += obj_method
|
@@ -375,20 +375,21 @@ class MessageNavigation(AbstractMessage, ABC):
|
|
375
375
|
|
376
376
|
def generate_route_information(self, generate_route_information: GenerateRouteInformation) -> bytes:
|
377
377
|
logger.debug(f"Generate route data source:{generate_route_information}")
|
378
|
+
|
378
379
|
build = NavReqCoverPath(
|
379
380
|
pver=1,
|
380
381
|
sub_cmd=0,
|
381
382
|
zone_hashs=generate_route_information.one_hashs,
|
382
|
-
job_mode=generate_route_information.job_mode,
|
383
|
-
edge_mode=generate_route_information.edge_mode,
|
384
|
-
knife_height=generate_route_information.blade_height,
|
385
|
-
speed=generate_route_information.speed,
|
386
|
-
ultra_wave=generate_route_information.ultra_wave,
|
387
|
-
channel_width=generate_route_information.channel_width,
|
388
|
-
channel_mode=generate_route_information.channel_mode,
|
389
|
-
toward=generate_route_information.toward,
|
390
|
-
toward_included_angle=generate_route_information.toward_included_angle, # luba 2 yuka only
|
391
|
-
toward_mode=generate_route_information.toward_mode, # luba 2 yuka only
|
383
|
+
job_mode=int(generate_route_information.job_mode),
|
384
|
+
edge_mode=int(generate_route_information.edge_mode),
|
385
|
+
knife_height=int(generate_route_information.blade_height),
|
386
|
+
speed=float(generate_route_information.speed),
|
387
|
+
ultra_wave=int(generate_route_information.ultra_wave),
|
388
|
+
channel_width=int(generate_route_information.channel_width),
|
389
|
+
channel_mode=int(generate_route_information.channel_mode),
|
390
|
+
toward=int(generate_route_information.toward),
|
391
|
+
toward_included_angle=int(generate_route_information.toward_included_angle), # luba 2 yuka only
|
392
|
+
toward_mode=int(generate_route_information.toward_mode), # luba 2 yuka only
|
392
393
|
reserved=generate_route_information.path_order,
|
393
394
|
)
|
394
395
|
logger.debug(f"{self.get_device_name()}Generate route====={build}")
|
@@ -402,14 +403,14 @@ class MessageNavigation(AbstractMessage, ABC):
|
|
402
403
|
pver=1,
|
403
404
|
sub_cmd=3,
|
404
405
|
zone_hashs=generate_route_information.one_hashs,
|
405
|
-
job_mode=generate_route_information.job_mode,
|
406
|
-
edge_mode=generate_route_information.edge_mode,
|
407
|
-
knife_height=generate_route_information.blade_height,
|
408
|
-
speed=generate_route_information.speed,
|
409
|
-
ultra_wave=generate_route_information.ultra_wave,
|
410
|
-
channel_width=generate_route_information.channel_width,
|
411
|
-
channel_mode=generate_route_information.channel_mode,
|
412
|
-
toward=generate_route_information.toward,
|
406
|
+
job_mode=int(generate_route_information.job_mode),
|
407
|
+
edge_mode=int(generate_route_information.edge_mode),
|
408
|
+
knife_height=int(generate_route_information.blade_height),
|
409
|
+
speed=float(generate_route_information.speed),
|
410
|
+
ultra_wave=int(generate_route_information.ultra_wave),
|
411
|
+
channel_width=int(generate_route_information.channel_width),
|
412
|
+
channel_mode=int(generate_route_information.channel_mode),
|
413
|
+
toward=int(generate_route_information.toward),
|
413
414
|
reserved=generate_route_information.path_order,
|
414
415
|
)
|
415
416
|
logger.debug(f"{self.get_device_name()} Generate route ===== {build}")
|
@@ -5,13 +5,14 @@ from typing import Any, Awaitable, Callable
|
|
5
5
|
|
6
6
|
import betterproto
|
7
7
|
|
8
|
-
from pymammotion.aliyun.dataclass.
|
8
|
+
from pymammotion.aliyun.dataclass.dev_by_account_response import Device
|
9
9
|
from pymammotion.data.model import RegionData
|
10
10
|
from pymammotion.data.model.device import MowingDevice
|
11
11
|
from pymammotion.data.state_manager import StateManager
|
12
12
|
from pymammotion.proto import has_field
|
13
13
|
from pymammotion.proto.luba_msg import LubaMsg
|
14
14
|
from pymammotion.proto.mctrl_nav import NavGetCommDataAck, NavGetHashListAck
|
15
|
+
from pymammotion.utility.device_type import DeviceType
|
15
16
|
from pymammotion.utility.movement import get_percent, transform_both_speeds
|
16
17
|
|
17
18
|
_LOGGER = logging.getLogger(__name__)
|
@@ -197,17 +198,30 @@ class MammotionBaseDevice:
|
|
197
198
|
|
198
199
|
async def start_map_sync(self) -> None:
|
199
200
|
"""Start sync of map data."""
|
201
|
+
try:
|
202
|
+
# work out why this crashes sometimes for better proto
|
203
|
+
|
204
|
+
if self._cloud_device:
|
205
|
+
if not DeviceType.is_luba1(self._cloud_device.deviceName, self._cloud_device.productKey):
|
206
|
+
await self.queue_command("get_area_name_list", device_id=self._cloud_device.deviceName)
|
207
|
+
if has_field(self._mower.net.toapp_wifi_iot_status):
|
208
|
+
if not DeviceType.is_luba1(self._mower.net.toapp_wifi_iot_status.devicename):
|
209
|
+
await self.queue_command("get_area_name_list",
|
210
|
+
device_id=self._mower.net.toapp_wifi_iot_status.devicename)
|
211
|
+
except Exception:
|
212
|
+
"""Do nothing for now."""
|
213
|
+
|
200
214
|
await self.queue_command("read_plan", sub_cmd=2, plan_index=0)
|
201
215
|
|
202
|
-
|
216
|
+
if not has_field(self.mower.nav.toapp_gethash_ack):
|
217
|
+
await self.queue_command("get_all_boundary_hash_list", sub_cmd=0)
|
218
|
+
await self.queue_command("get_hash_response", total_frame=1, current_frame=1)
|
219
|
+
else:
|
220
|
+
for data_hash in self.mower.nav.toapp_gethash_ack.data_couple:
|
221
|
+
await self.queue_command("synchronize_hash_data", hash_num=data_hash)
|
222
|
+
|
203
223
|
|
204
|
-
await self.queue_command("get_hash_response", total_frame=1, current_frame=1)
|
205
224
|
|
206
|
-
# work out why this crashes sometimes for better proto
|
207
|
-
if self._cloud_device:
|
208
|
-
await self.queue_command("get_area_name_list", device_id=self._cloud_device.deviceName)
|
209
|
-
if has_field(self._mower.net.toapp_wifi_iot_status):
|
210
|
-
await self.queue_command("get_area_name_list", device_id=self._mower.net.toapp_wifi_iot_status.devicename)
|
211
225
|
|
212
226
|
# sub_cmd 3 is job hashes??
|
213
227
|
# sub_cmd 4 is dump location (yuka)
|
@@ -75,6 +75,9 @@ class MammotionMixedDeviceManager:
|
|
75
75
|
def replace_ble(self, ble_device: MammotionBaseBLEDevice) -> None:
|
76
76
|
self._ble_device = ble_device
|
77
77
|
|
78
|
+
def replace_mqtt(self, mqtt: MammotionCloud) -> None:
|
79
|
+
self._cloud_device._mqtt = mqtt
|
80
|
+
|
78
81
|
def has_cloud(self) -> bool:
|
79
82
|
return self._cloud_device is not None
|
80
83
|
|
@@ -159,6 +162,10 @@ class Mammotion:
|
|
159
162
|
self.devices.add_device(
|
160
163
|
MammotionMixedDeviceManager(name=device.deviceName, cloud_device=device, mqtt=self.mqtt)
|
161
164
|
)
|
165
|
+
elif device.deviceName.startswith(("Luba-", "Yuka-")) and self.devices.get_device(device.deviceName):
|
166
|
+
device = self.devices.get_device(device.deviceName)
|
167
|
+
device.replace_mqtt(self.mqtt)
|
168
|
+
|
162
169
|
|
163
170
|
def set_disconnect_strategy(self, disconnect: bool) -> None:
|
164
171
|
for device_name, device in self.devices.devices:
|
@@ -42,8 +42,10 @@ class MammotionCloud:
|
|
42
42
|
# temporary for testing only
|
43
43
|
# self._start_sync_task = self.loop.call_later(30, lambda: asyncio.ensure_future(self.start_sync(0)))
|
44
44
|
|
45
|
-
def on_ready(self) -> None:
|
46
|
-
|
45
|
+
async def on_ready(self) -> None:
|
46
|
+
loop = asyncio.get_event_loop()
|
47
|
+
loop.create_task(self.process_queue())
|
48
|
+
await self.on_ready_event.data_event(None)
|
47
49
|
|
48
50
|
def is_connected(self) -> bool:
|
49
51
|
return self._mqtt_client.is_connected
|
@@ -63,7 +65,7 @@ class MammotionCloud:
|
|
63
65
|
async def on_disconnected(self) -> None:
|
64
66
|
"""Callback for when MQTT disconnects."""
|
65
67
|
|
66
|
-
async def
|
68
|
+
async def process_queue(self) -> None:
|
67
69
|
while True:
|
68
70
|
# Get the next item from the queue
|
69
71
|
iot_id, key, command, future = await self.command_queue.get()
|
@@ -113,7 +115,8 @@ class MammotionCloud:
|
|
113
115
|
_LOGGER.debug("Thing event received")
|
114
116
|
event = ThingEventMessage.from_dicts(payload)
|
115
117
|
params = event.params
|
116
|
-
if params
|
118
|
+
if isinstance(params, dict) or params.identifier is None:
|
119
|
+
_LOGGER.debug("Received dict params: %s", params)
|
117
120
|
return
|
118
121
|
if params.identifier == "device_protobuf_msg_event" and event.method == "thing.events":
|
119
122
|
_LOGGER.debug("Protobuf event")
|
@@ -158,11 +161,8 @@ class MammotionBaseCloudDevice(MammotionBaseDevice):
|
|
158
161
|
|
159
162
|
async def on_ready(self) -> None:
|
160
163
|
"""Callback for when MQTT is subscribed to events."""
|
161
|
-
loop = asyncio.get_event_loop()
|
162
|
-
|
163
164
|
await self._ble_sync()
|
164
165
|
await self.run_periodic_sync_task()
|
165
|
-
loop.create_task(self._process_queue())
|
166
166
|
if self.on_ready_callback:
|
167
167
|
await self.on_ready_callback()
|
168
168
|
|
@@ -186,6 +186,7 @@ class MammotionBaseCloudDevice(MammotionBaseDevice):
|
|
186
186
|
160, lambda: asyncio.ensure_future(self.run_periodic_sync_task())
|
187
187
|
)
|
188
188
|
|
189
|
+
|
189
190
|
async def queue_command(self, key: str, **kwargs: Any) -> bytes:
|
190
191
|
# Create a future to hold the result
|
191
192
|
_LOGGER.debug("Queueing command: %s", key)
|
@@ -221,9 +222,9 @@ class MammotionBaseCloudDevice(MammotionBaseDevice):
|
|
221
222
|
params = event.params
|
222
223
|
if event.params.iotId != self.iot_id:
|
223
224
|
return
|
224
|
-
binary_data = base64.b64decode(params.value.content
|
225
|
-
self._update_raw_data(
|
226
|
-
new_msg = LubaMsg().parse(
|
225
|
+
binary_data = base64.b64decode(params.value.content)
|
226
|
+
self._update_raw_data(binary_data)
|
227
|
+
new_msg = LubaMsg().parse(binary_data)
|
227
228
|
|
228
229
|
if (
|
229
230
|
self._commands.get_device_product_key() == ""
|
@@ -175,7 +175,7 @@ class MammotionMQTT:
|
|
175
175
|
event = ThingEventMessage(**payload)
|
176
176
|
params = event.params
|
177
177
|
if params.identifier == "device_protobuf_msg_event":
|
178
|
-
content = LubaMsg().parse(base64.b64decode(params.value.content
|
178
|
+
content = LubaMsg().parse(base64.b64decode(params.value.content))
|
179
179
|
|
180
180
|
logger.info("Unhandled protobuf event: %s", betterproto.which_one_of(content, "LubaSubMsg"))
|
181
181
|
elif params.identifier == "device_warning_event":
|
pymammotion/proto/mctrl_nav.py
CHANGED
@@ -142,7 +142,7 @@ class NavGetHashList(betterproto.Message):
|
|
142
142
|
sub_cmd: int = betterproto.int32_field(2)
|
143
143
|
total_frame: int = betterproto.int32_field(3)
|
144
144
|
current_frame: int = betterproto.int32_field(4)
|
145
|
-
data_hash:
|
145
|
+
data_hash: int = betterproto.fixed64_field(5)
|
146
146
|
reserved: str = betterproto.string_field(6)
|
147
147
|
|
148
148
|
|
@@ -152,7 +152,7 @@ class NavGetHashListAck(betterproto.Message):
|
|
152
152
|
sub_cmd: int = betterproto.int32_field(2)
|
153
153
|
total_frame: int = betterproto.int32_field(3)
|
154
154
|
current_frame: int = betterproto.int32_field(4)
|
155
|
-
data_hash:
|
155
|
+
data_hash: int = betterproto.fixed64_field(5)
|
156
156
|
hash_len: int = betterproto.int32_field(6)
|
157
157
|
reserved: str = betterproto.string_field(7)
|
158
158
|
result: int = betterproto.int32_field(8)
|
@@ -170,7 +170,7 @@ class NavGetCommData(betterproto.Message):
|
|
170
170
|
paternal_hash_b: int = betterproto.int64_field(7)
|
171
171
|
total_frame: int = betterproto.int32_field(8)
|
172
172
|
current_frame: int = betterproto.int32_field(9)
|
173
|
-
data_hash:
|
173
|
+
data_hash: int = betterproto.fixed64_field(10)
|
174
174
|
reserved: str = betterproto.string_field(11)
|
175
175
|
|
176
176
|
|
@@ -181,12 +181,12 @@ class NavGetCommDataAck(betterproto.Message):
|
|
181
181
|
result: int = betterproto.int32_field(3)
|
182
182
|
action: int = betterproto.int32_field(4)
|
183
183
|
type: int = betterproto.int32_field(5)
|
184
|
-
hash:
|
185
|
-
paternal_hash_a:
|
186
|
-
paternal_hash_b:
|
184
|
+
hash: int = betterproto.fixed64_field(6)
|
185
|
+
paternal_hash_a: int = betterproto.fixed64_field(7)
|
186
|
+
paternal_hash_b: int = betterproto.fixed64_field(8)
|
187
187
|
total_frame: int = betterproto.int32_field(9)
|
188
188
|
current_frame: int = betterproto.int32_field(10)
|
189
|
-
data_hash:
|
189
|
+
data_hash: int = betterproto.fixed64_field(11)
|
190
190
|
data_len: int = betterproto.int32_field(12)
|
191
191
|
data_couple: list["CommDataCouple"] = betterproto.message_field(13)
|
192
192
|
reserved: str = betterproto.string_field(14)
|
@@ -206,8 +206,8 @@ class NavReqCoverPath(betterproto.Message):
|
|
206
206
|
channel_mode: int = betterproto.int32_field(10)
|
207
207
|
toward: int = betterproto.int32_field(11)
|
208
208
|
speed: float = betterproto.float_field(12)
|
209
|
-
zone_hashs: list[
|
210
|
-
path_hash:
|
209
|
+
zone_hashs: list[int] = betterproto.fixed64_field(13)
|
210
|
+
path_hash: int = betterproto.fixed64_field(14)
|
211
211
|
reserved: str = betterproto.string_field(15)
|
212
212
|
result: int = betterproto.int32_field(16)
|
213
213
|
toward_mode: int = betterproto.int32_field(17)
|
@@ -226,12 +226,12 @@ class NavUploadZigZagResult(betterproto.Message):
|
|
226
226
|
current_zone_path_num: int = betterproto.int32_field(8)
|
227
227
|
current_zone_path_id: int = betterproto.int32_field(9)
|
228
228
|
current_zone: int = betterproto.int32_field(10)
|
229
|
-
current_hash:
|
229
|
+
current_hash: int = betterproto.fixed64_field(11)
|
230
230
|
total_frame: int = betterproto.int32_field(12)
|
231
231
|
current_frame: int = betterproto.int32_field(13)
|
232
232
|
channel_mode: int = betterproto.int32_field(14)
|
233
233
|
channel_mode_id: int = betterproto.int32_field(15)
|
234
|
-
data_hash:
|
234
|
+
data_hash: int = betterproto.fixed64_field(16)
|
235
235
|
data_len: int = betterproto.int32_field(17)
|
236
236
|
reserved: str = betterproto.string_field(18)
|
237
237
|
data_couple: list["CommDataCouple"] = betterproto.message_field(19)
|
@@ -242,10 +242,10 @@ class NavUploadZigZagResult(betterproto.Message):
|
|
242
242
|
class NavUploadZigZagResultAck(betterproto.Message):
|
243
243
|
pver: int = betterproto.int32_field(1)
|
244
244
|
current_zone: int = betterproto.int32_field(2)
|
245
|
-
current_hash:
|
245
|
+
current_hash: int = betterproto.fixed64_field(3)
|
246
246
|
total_frame: int = betterproto.int32_field(4)
|
247
247
|
current_frame: int = betterproto.int32_field(5)
|
248
|
-
data_hash:
|
248
|
+
data_hash: int = betterproto.fixed64_field(6)
|
249
249
|
reserved: str = betterproto.string_field(7)
|
250
250
|
sub_cmd: int = betterproto.int32_field(8)
|
251
251
|
|
@@ -270,8 +270,8 @@ class NavTaskIdRw(betterproto.Message):
|
|
270
270
|
|
271
271
|
@dataclass
|
272
272
|
class NavSysHashOverview(betterproto.Message):
|
273
|
-
commonhash_overview:
|
274
|
-
path_hash_overview:
|
273
|
+
commonhash_overview: int = betterproto.fixed64_field(1)
|
274
|
+
path_hash_overview: int = betterproto.fixed64_field(2)
|
275
275
|
|
276
276
|
|
277
277
|
@dataclass
|
@@ -281,7 +281,7 @@ class NavTaskBreakPoint(betterproto.Message):
|
|
281
281
|
toward: int = betterproto.int32_field(3)
|
282
282
|
flag: int = betterproto.int32_field(4)
|
283
283
|
action: int = betterproto.int32_field(5)
|
284
|
-
zone_hash:
|
284
|
+
zone_hash: int = betterproto.fixed64_field(6)
|
285
285
|
|
286
286
|
|
287
287
|
@dataclass
|
@@ -314,13 +314,13 @@ class NavPlanJobSet(betterproto.Message):
|
|
314
314
|
speed: float = betterproto.float_field(26)
|
315
315
|
task_name: str = betterproto.string_field(27)
|
316
316
|
job_name: str = betterproto.string_field(28)
|
317
|
-
zone_hashs: list[
|
317
|
+
zone_hashs: list[int] = betterproto.fixed64_field(29)
|
318
318
|
reserved: str = betterproto.string_field(30)
|
319
319
|
start_date: str = betterproto.string_field(31)
|
320
320
|
end_date: str = betterproto.string_field(32)
|
321
321
|
trigger_type: int = betterproto.int32_field(33)
|
322
322
|
day: int = betterproto.int32_field(34)
|
323
|
-
weeks: list[
|
323
|
+
weeks: list[int] = betterproto.fixed32_field(35)
|
324
324
|
remained_seconds: int = betterproto.int64_field(36)
|
325
325
|
toward_mode: int = betterproto.int32_field(37)
|
326
326
|
toward_included_angle: int = betterproto.int32_field(38)
|
@@ -388,19 +388,19 @@ class AppRequestCoverPathsT(betterproto.Message):
|
|
388
388
|
sub_cmd: int = betterproto.int32_field(2)
|
389
389
|
total_frame: int = betterproto.int32_field(3)
|
390
390
|
current_frame: int = betterproto.int32_field(4)
|
391
|
-
data_hash:
|
391
|
+
data_hash: int = betterproto.fixed64_field(5)
|
392
392
|
transaction_id: int = betterproto.int64_field(6)
|
393
393
|
reserved: list[int] = betterproto.int64_field(7)
|
394
|
-
hash_list: list[
|
394
|
+
hash_list: list[int] = betterproto.fixed64_field(8)
|
395
395
|
|
396
396
|
|
397
397
|
@dataclass
|
398
398
|
class CoverPathPacketT(betterproto.Message):
|
399
|
-
path_hash:
|
399
|
+
path_hash: int = betterproto.fixed64_field(1)
|
400
400
|
path_type: int = betterproto.int32_field(2)
|
401
401
|
path_total: int = betterproto.int32_field(3)
|
402
402
|
path_cur: int = betterproto.int32_field(4)
|
403
|
-
zone_hash:
|
403
|
+
zone_hash: int = betterproto.fixed64_field(5)
|
404
404
|
data_couple: list["CommDataCouple"] = betterproto.message_field(6)
|
405
405
|
|
406
406
|
|
@@ -415,7 +415,7 @@ class CoverPathUploadT(betterproto.Message):
|
|
415
415
|
current_frame: int = betterproto.int32_field(7)
|
416
416
|
total_path_num: int = betterproto.int32_field(8)
|
417
417
|
vaild_path_num: int = betterproto.int32_field(9)
|
418
|
-
data_hash:
|
418
|
+
data_hash: int = betterproto.fixed64_field(10)
|
419
419
|
transaction_id: int = betterproto.int64_field(11)
|
420
420
|
reserved: list[int] = betterproto.int64_field(12)
|
421
421
|
data_len: int = betterproto.int32_field(13)
|
@@ -424,7 +424,7 @@ class CoverPathUploadT(betterproto.Message):
|
|
424
424
|
|
425
425
|
@dataclass
|
426
426
|
class ZoneStartPrecentT(betterproto.Message):
|
427
|
-
data_hash:
|
427
|
+
data_hash: int = betterproto.fixed64_field(1)
|
428
428
|
x: float = betterproto.float_field(2)
|
429
429
|
y: float = betterproto.float_field(3)
|
430
430
|
index: int = betterproto.int32_field(4)
|
@@ -1,6 +1,6 @@
|
|
1
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=
|
3
|
+
pymammotion/aliyun/cloud_gateway.py,sha256=Fktzd7ej9b02hr0Dl82_EgUkDCCzWqcp92_wd8D2vaw,22716
|
4
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
|
@@ -22,25 +22,25 @@ pymammotion/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
|
|
22
22
|
pymammotion/data/model/__init__.py,sha256=aSyroxYQQS-WMRi6WmWm2js4wLa9nmsi160gx9tts4o,323
|
23
23
|
pymammotion/data/model/account.py,sha256=vJM-KTf2q6eBfVC-UlNHBSmJvqHiCawZ40vnuhXhaz8,140
|
24
24
|
pymammotion/data/model/device.py,sha256=ejIMloTHlJcBi-qNFewTDt1K0pPJYpgjtJqqqhUqR1g,11182
|
25
|
-
pymammotion/data/model/device_config.py,sha256=
|
25
|
+
pymammotion/data/model/device_config.py,sha256=Y3J2zIrmbk_9GLpscAVxRiIIVm9-Qq7OZ49tOh4Ffqo,2627
|
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
|
30
|
+
pymammotion/data/model/hash_list.py,sha256=4nZv5zE-jMJvKYmdr3aaO80qYNJYNDgiHjn-thbGUvs,3024
|
31
31
|
pymammotion/data/model/location.py,sha256=H1h4Rhr0z_mDplNf1CP_ZCA3zM4_FJ_nMqzkbaoh7To,787
|
32
|
-
pymammotion/data/model/mowing_modes.py,sha256=
|
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
35
|
pymammotion/data/model/region_data.py,sha256=FLuL6kA7lbbh_idRh1eT9EosDqh4SpAqzpqHuQRDM88,2888
|
36
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=
|
38
|
+
pymammotion/data/mqtt/event.py,sha256=wzh92MsvivgsJaOgqSJ6zQOssRdO3c0sFTHhXFa4HdU,4591
|
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=
|
41
|
+
pymammotion/data/state_manager.py,sha256=fhV5icW9q4rCsHdD8lh4wvaDSzq6NP2116Wgdc7mR_U,3364
|
42
42
|
pymammotion/event/__init__.py,sha256=mgATR6vPHACNQ-0zH5fi7NdzeTCDV1CZyaWPmtUusi8,115
|
43
|
-
pymammotion/event/event.py,sha256=
|
43
|
+
pymammotion/event/event.py,sha256=P1JuP_Jy-pti8sN-zRDzUQSchx9ynoHmDEohL4gwhGA,2038
|
44
44
|
pymammotion/http/_init_.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
45
45
|
pymammotion/http/http.py,sha256=OZHjQY9ZLdlsKK6MDqqV79JIH9WYWJe3-ey-WWbe2z4,2642
|
46
46
|
pymammotion/http/model/http.py,sha256=_aVrtZZyR4EdR6GcuqMP9vH8qBLN7nKu0U2OeraCcG0,1607
|
@@ -51,7 +51,7 @@ pymammotion/mammotion/commands/mammotion_command.py,sha256=84XxnatnBm_5WQ_KOa2N0
|
|
51
51
|
pymammotion/mammotion/commands/messages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
52
52
|
pymammotion/mammotion/commands/messages/driver.py,sha256=ANIOEtjF23k7W_R_Yfgzxmc7p1KSBCF-l-tijUtw0Yg,3709
|
53
53
|
pymammotion/mammotion/commands/messages/media.py,sha256=ps0l06CXy5Ej--gTNCsyKttwo7yHLVrJUpn-wNJYecs,1150
|
54
|
-
pymammotion/mammotion/commands/messages/navigation.py,sha256=
|
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
57
|
pymammotion/mammotion/commands/messages/system.py,sha256=xm9Nj3wva9leVV1tyzfS_Hf53t-j7Nk8RBlFd00CQFM,10972
|
@@ -59,13 +59,13 @@ pymammotion/mammotion/commands/messages/video.py,sha256=_8lJsU4sLm2CGnc7RDkueA0A
|
|
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=
|
63
|
-
pymammotion/mammotion/devices/mammotion.py,sha256=
|
62
|
+
pymammotion/mammotion/devices/base.py,sha256=s3xnEHzPIbo9LU0WB7I-y04JiX0CjR5g35Q_-kpWE70,11346
|
63
|
+
pymammotion/mammotion/devices/mammotion.py,sha256=CVyhm3cSrX4ZLgMLHmFoWjyhBsPrwZbSKI5AuJC6jOs,9630
|
64
64
|
pymammotion/mammotion/devices/mammotion_bluetooth.py,sha256=3XUjhE2sb_2aZnJlevmwxd99zR_4qZOfaK86h6hKV5E,17303
|
65
|
-
pymammotion/mammotion/devices/mammotion_cloud.py,sha256=
|
65
|
+
pymammotion/mammotion/devices/mammotion_cloud.py,sha256=mCzj-SOSke6mU010NQcO-r9qtHyPXCCY0OlYiO-MA9A,9915
|
66
66
|
pymammotion/mqtt/__init__.py,sha256=Ocs5e-HLJvTuDpVXyECEsWIvwsUaxzj7lZ9mSYutNDY,105
|
67
67
|
pymammotion/mqtt/mammotion_future.py,sha256=_OWqKOlUGl2yT1xOsXFQYpGd-1zQ63OxqXgy7KRQgYc,710
|
68
|
-
pymammotion/mqtt/mammotion_mqtt.py,sha256=
|
68
|
+
pymammotion/mqtt/mammotion_mqtt.py,sha256=QZuqp2G5nywCFSwGNSayPI5JVL789yOxyr0UM0G7wzg,8295
|
69
69
|
pymammotion/proto/__init__.py,sha256=v3_P1LOsYRBN9qCAhaWrWMX7GWHrox9XD3hdZQxcPZM,190
|
70
70
|
pymammotion/proto/basestation.proto,sha256=_x5gAz3FkZXS1jtq4GgZgaDCuRU-UV-7HTFdsfQ3zbo,1034
|
71
71
|
pymammotion/proto/basestation.py,sha256=js64_N2xQYRxWPRdVNEapO0qe7vBlfYnjW5sE8hi7hw,2026
|
@@ -92,7 +92,7 @@ pymammotion/proto/mctrl_driver.py,sha256=sseY2MxUtaQZvg7fvbA_gNvtqx9MVDW_rvUcfA2
|
|
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
94
|
pymammotion/proto/mctrl_nav.proto,sha256=3OQ8DDP5yaZpKBcqeflGLQ5v5YE5AdBOftkKLRne2Tg,12530
|
95
|
-
pymammotion/proto/mctrl_nav.py,sha256=
|
95
|
+
pymammotion/proto/mctrl_nav.py,sha256=J1DxdKO0JbYzVbE4ZEAd8MYMeCPYrdjSRw9NBX6oMsA,24945
|
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
|
@@ -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.
|
121
|
-
pymammotion-0.2.
|
122
|
-
pymammotion-0.2.
|
123
|
-
pymammotion-0.2.
|
120
|
+
pymammotion-0.2.32.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
121
|
+
pymammotion-0.2.32.dist-info/METADATA,sha256=4T0TPLB0YtQxWV71xVzvnd_Iw7RVuxf_EzCQVPTs30U,4052
|
122
|
+
pymammotion-0.2.32.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
123
|
+
pymammotion-0.2.32.dist-info/RECORD,,
|
File without changes
|
File without changes
|