1010`roborock/map/proto/b01_scmap.proto`.
1111"""
1212
13- from __future__ import annotations
14-
1513import base64
1614import binascii
1715import hashlib
1816import io
1917import zlib
2018from dataclasses import dataclass , field
21- from typing import Protocol , cast
2219
2320from Crypto .Cipher import AES
2421from Crypto .Util .Padding import pad , unpad
2926
3027from roborock .exceptions import RoborockException
3128from roborock .map .proto import b01_scmap_pb2
29+ from roborock .map .proto .b01_scmap_pb2 import (
30+ DevicePointInfo ,
31+ MapBoundaryInfo ,
32+ MapExtInfo ,
33+ MapHeadInfo ,
34+ RobotMap ,
35+ RoomDataInfo ,
36+ )
3237
3338from .map_parser import ParsedMapData
3439
3540_B64_CHARS = set (b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" )
3641_MAP_FILE_FORMAT = "PNG"
3742
3843
39- class _ProtoMessage (Protocol ):
40- def HasField (self , field_name : str ) -> bool : ...
41-
42-
43- class _ScPointMessage (_ProtoMessage , Protocol ):
44- x : float
45- y : float
46-
47-
48- class _ScMapBoundaryInfoMessage (_ProtoMessage , Protocol ):
49- mapMd5 : str
50- vMinX : int
51- vMaxX : int
52- vMinY : int
53- vMaxY : int
54-
55-
56- class _ScMapExtInfoMessage (_ProtoMessage , Protocol ):
57- taskBeginDate : int
58- mapUploadDate : int
59- mapValid : int
60- radian : int
61- force : int
62- cleanPath : int
63- boudaryInfo : _ScMapBoundaryInfoMessage
64- mapVersion : int
65- mapValueType : int
66-
67-
68- class _ScMapHeadMessage (_ProtoMessage , Protocol ):
69- mapHeadId : int
70- sizeX : int
71- sizeY : int
72- minX : float
73- minY : float
74- maxX : float
75- maxY : float
76- resolution : float
77-
78-
79- class _ScRoomDataMessage (_ProtoMessage , Protocol ):
80- roomId : int
81- roomName : str
82- roomTypeId : int
83- meterialId : int
84- cleanState : int
85- roomClean : int
86- roomCleanIndex : int
87- roomNamePost : _ScPointMessage
88- colorId : int
89- floor_direction : int
90- global_seq : int
91-
92-
93- class _ScMapDataContainerMessage (_ProtoMessage , Protocol ):
94- mapData : bytes
95-
96-
97- class _ScMapMessage (_ProtoMessage , Protocol ):
98- mapType : int
99- mapExtInfo : _ScMapExtInfoMessage
100- mapHead : _ScMapHeadMessage
101- mapData : _ScMapDataContainerMessage
102- roomDataInfo : list [_ScRoomDataMessage ]
103-
104-
10544@dataclass (frozen = True )
10645class _ScPoint :
10746 x : float | None = None
@@ -265,14 +204,14 @@ def _decode_map_data_bytes(value: bytes) -> bytes:
265204 return value
266205
267206
268- def _parse_sc_point (parsed : _ScPointMessage ) -> _ScPoint :
207+ def _parse_sc_point (parsed : DevicePointInfo ) -> _ScPoint :
269208 return _ScPoint (
270209 x = parsed .x if parsed .HasField ("x" ) else None ,
271210 y = parsed .y if parsed .HasField ("y" ) else None ,
272211 )
273212
274213
275- def _parse_sc_map_boundary_info (parsed : _ScMapBoundaryInfoMessage ) -> _ScMapBoundaryInfo :
214+ def _parse_sc_map_boundary_info (parsed : MapBoundaryInfo ) -> _ScMapBoundaryInfo :
276215 return _ScMapBoundaryInfo (
277216 map_md5 = parsed .mapMd5 if parsed .HasField ("mapMd5" ) else None ,
278217 v_min_x = parsed .vMinX if parsed .HasField ("vMinX" ) else None ,
@@ -282,7 +221,7 @@ def _parse_sc_map_boundary_info(parsed: _ScMapBoundaryInfoMessage) -> _ScMapBoun
282221 )
283222
284223
285- def _parse_sc_map_ext_info (parsed : _ScMapExtInfoMessage ) -> _ScMapExtInfo :
224+ def _parse_sc_map_ext_info (parsed : MapExtInfo ) -> _ScMapExtInfo :
286225 return _ScMapExtInfo (
287226 task_begin_date = parsed .taskBeginDate if parsed .HasField ("taskBeginDate" ) else None ,
288227 map_upload_date = parsed .mapUploadDate if parsed .HasField ("mapUploadDate" ) else None ,
@@ -296,7 +235,7 @@ def _parse_sc_map_ext_info(parsed: _ScMapExtInfoMessage) -> _ScMapExtInfo:
296235 )
297236
298237
299- def _parse_sc_map_head (parsed : _ScMapHeadMessage ) -> _ScMapHead :
238+ def _parse_sc_map_head (parsed : MapHeadInfo ) -> _ScMapHead :
300239 return _ScMapHead (
301240 map_head_id = parsed .mapHeadId if parsed .HasField ("mapHeadId" ) else None ,
302241 size_x = parsed .sizeX if parsed .HasField ("sizeX" ) else None ,
@@ -309,7 +248,7 @@ def _parse_sc_map_head(parsed: _ScMapHeadMessage) -> _ScMapHead:
309248 )
310249
311250
312- def _parse_sc_room_data (parsed : _ScRoomDataMessage ) -> _ScRoomData :
251+ def _parse_sc_room_data (parsed : RoomDataInfo ) -> _ScRoomData :
313252 return _ScRoomData (
314253 room_id = parsed .roomId if parsed .HasField ("roomId" ) else None ,
315254 room_name = parsed .roomName if parsed .HasField ("roomName" ) else None ,
@@ -327,8 +266,8 @@ def _parse_sc_room_data(parsed: _ScRoomDataMessage) -> _ScRoomData:
327266
328267def _parse_scmap_payload (payload : bytes ) -> _ScMapPayload :
329268 """Parse inflated SCMap bytes into typed map metadata."""
330- parsed = cast ( _ScMapMessage , getattr ( b01_scmap_pb2 , " RobotMap" )() )
331- _parse_proto (payload , cast ( Message , parsed ) , context = "B01 SCMap" )
269+ parsed = RobotMap ( )
270+ _parse_proto (payload , parsed , context = "B01 SCMap" )
332271
333272 map_data = None
334273 if parsed .HasField ("mapData" ):
0 commit comments