|
10 | 10 | from vacuum_map_parser_base.config.size import Size, Sizes |
11 | 11 | from vacuum_map_parser_base.image_generator import ImageGenerator |
12 | 12 | from vacuum_map_parser_base.map_data import MapData |
| 13 | +from vacuum_map_parser_roborock.image_parser import RoborockImageParser |
13 | 14 | from vacuum_map_parser_roborock.map_data_parser import RoborockMapDataParser |
14 | 15 |
|
15 | 16 | from roborock.exceptions import RoborockException |
16 | 17 |
|
| 18 | +from .room_colors import adjacency_aware_room_colors |
| 19 | + |
17 | 20 | _LOGGER = logging.getLogger(__name__) |
18 | 21 |
|
19 | 22 | DEFAULT_DRAWABLES = { |
@@ -99,16 +102,50 @@ def parse(self, map_bytes: bytes) -> ParsedMapData | None: |
99 | 102 | return ParsedMapData(image_content=img_byte_arr.getvalue(), map_data=parsed_map) |
100 | 103 |
|
101 | 104 |
|
| 105 | +class _AdjacencyAwareRoborockImageParser(RoborockImageParser): |
| 106 | + """Apply the shared adjacency color policy to V1 room cells.""" |
| 107 | + |
| 108 | + def __init__(self, palette: ColorsPalette, image_config: ImageConfig) -> None: |
| 109 | + super().__init__(palette, image_config) |
| 110 | + self._room_palette = palette |
| 111 | + self._base_room_colors = palette.cached_room_colors.copy() |
| 112 | + |
| 113 | + def parse( |
| 114 | + self, |
| 115 | + raw_data: bytes, |
| 116 | + width: int, |
| 117 | + height: int, |
| 118 | + carpet_map: set[int] | None, |
| 119 | + removed_map: set[int] | None = None, |
| 120 | + ): |
| 121 | + """Assign non-conflicting room colors before the V1 image pass.""" |
| 122 | + self._room_palette.cached_room_colors.clear() |
| 123 | + self._room_palette.cached_room_colors.update(self._base_room_colors) |
| 124 | + |
| 125 | + def room_id(value: int) -> int | None: |
| 126 | + if value in (self.MAP_OUTSIDE, self.MAP_WALL, self.MAP_INSIDE, self.MAP_SCAN): |
| 127 | + return None |
| 128 | + return self._get_room_number(value) if value & 0x07 == 0x07 else None |
| 129 | + |
| 130 | + room_colors = adjacency_aware_room_colors(raw_data, width, self._room_palette, room_id) |
| 131 | + for number, color in room_colors.items(): |
| 132 | + self._room_palette.cached_room_colors[number] = color |
| 133 | + self._room_palette.cached_room_colors[str(number)] = color |
| 134 | + return super().parse(raw_data, width, height, carpet_map, removed_map) |
| 135 | + |
| 136 | + |
102 | 137 | def _create_map_data_parser(config: MapParserConfig) -> RoborockMapDataParser: |
103 | 138 | """Create a RoborockMapDataParser based on the config entry.""" |
104 | 139 | palette, sizes, image_config = _create_rendering_components(config) |
105 | | - return RoborockMapDataParser( |
| 140 | + parser = RoborockMapDataParser( |
106 | 141 | palette, |
107 | 142 | sizes, |
108 | 143 | config.drawables, |
109 | 144 | image_config, |
110 | 145 | [], |
111 | 146 | ) |
| 147 | + parser._image_parser = _AdjacencyAwareRoborockImageParser(palette, image_config) |
| 148 | + return parser |
112 | 149 |
|
113 | 150 |
|
114 | 151 | def create_image_generator( |
|
0 commit comments