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
3633_MAP_FILE_FORMAT = "PNG"
3734
3835
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-
10536@dataclass (frozen = True )
10637class _ScPoint :
10738 x : float | None = None
@@ -265,14 +196,14 @@ def _decode_map_data_bytes(value: bytes) -> bytes:
265196 return value
266197
267198
268- def _parse_sc_point (parsed : _ScPointMessage ) -> _ScPoint :
199+ def _parse_sc_point (parsed : b01_scmap_pb2 . DevicePointInfo ) -> _ScPoint :
269200 return _ScPoint (
270201 x = parsed .x if parsed .HasField ("x" ) else None ,
271202 y = parsed .y if parsed .HasField ("y" ) else None ,
272203 )
273204
274205
275- def _parse_sc_map_boundary_info (parsed : _ScMapBoundaryInfoMessage ) -> _ScMapBoundaryInfo :
206+ def _parse_sc_map_boundary_info (parsed : b01_scmap_pb2 . MapBoundaryInfo ) -> _ScMapBoundaryInfo :
276207 return _ScMapBoundaryInfo (
277208 map_md5 = parsed .mapMd5 if parsed .HasField ("mapMd5" ) else None ,
278209 v_min_x = parsed .vMinX if parsed .HasField ("vMinX" ) else None ,
@@ -282,7 +213,7 @@ def _parse_sc_map_boundary_info(parsed: _ScMapBoundaryInfoMessage) -> _ScMapBoun
282213 )
283214
284215
285- def _parse_sc_map_ext_info (parsed : _ScMapExtInfoMessage ) -> _ScMapExtInfo :
216+ def _parse_sc_map_ext_info (parsed : b01_scmap_pb2 . MapExtInfo ) -> _ScMapExtInfo :
286217 return _ScMapExtInfo (
287218 task_begin_date = parsed .taskBeginDate if parsed .HasField ("taskBeginDate" ) else None ,
288219 map_upload_date = parsed .mapUploadDate if parsed .HasField ("mapUploadDate" ) else None ,
@@ -296,7 +227,7 @@ def _parse_sc_map_ext_info(parsed: _ScMapExtInfoMessage) -> _ScMapExtInfo:
296227 )
297228
298229
299- def _parse_sc_map_head (parsed : _ScMapHeadMessage ) -> _ScMapHead :
230+ def _parse_sc_map_head (parsed : b01_scmap_pb2 . MapHeadInfo ) -> _ScMapHead :
300231 return _ScMapHead (
301232 map_head_id = parsed .mapHeadId if parsed .HasField ("mapHeadId" ) else None ,
302233 size_x = parsed .sizeX if parsed .HasField ("sizeX" ) else None ,
@@ -309,7 +240,7 @@ def _parse_sc_map_head(parsed: _ScMapHeadMessage) -> _ScMapHead:
309240 )
310241
311242
312- def _parse_sc_room_data (parsed : _ScRoomDataMessage ) -> _ScRoomData :
243+ def _parse_sc_room_data (parsed : b01_scmap_pb2 . RoomDataInfo ) -> _ScRoomData :
313244 return _ScRoomData (
314245 room_id = parsed .roomId if parsed .HasField ("roomId" ) else None ,
315246 room_name = parsed .roomName if parsed .HasField ("roomName" ) else None ,
@@ -327,8 +258,8 @@ def _parse_sc_room_data(parsed: _ScRoomDataMessage) -> _ScRoomData:
327258
328259def _parse_scmap_payload (payload : bytes ) -> _ScMapPayload :
329260 """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" )
261+ parsed = b01_scmap_pb2 . RobotMap ( )
262+ _parse_proto (payload , parsed , context = "B01 SCMap" )
332263
333264 map_data = None
334265 if parsed .HasField ("mapData" ):
0 commit comments