diff --git a/deebot_client/messages/xml/__init__.py b/deebot_client/messages/xml/__init__.py
index 02406ca95..49e4664d0 100644
--- a/deebot_client/messages/xml/__init__.py
+++ b/deebot_client/messages/xml/__init__.py
@@ -6,6 +6,7 @@
from deebot_client.messages.xml.battery import BatteryInfo
from deebot_client.messages.xml.charge_state import ChargeState
+from deebot_client.messages.xml.map import MapP, Trace
from deebot_client.messages.xml.pos import Pos
if TYPE_CHECKING:
@@ -13,7 +14,7 @@
from deebot_client.message import Message
-__all__: Sequence[str] = ["BatteryInfo", "ChargeState", "Pos"]
+__all__: Sequence[str] = ["BatteryInfo", "ChargeState", "MapP", "Pos", "Trace"]
# fmt: off
# ordered by file asc
_MESSAGES: list[type[Message]] = [
@@ -21,6 +22,9 @@
ChargeState,
+ MapP,
+ Trace,
+
Pos
]
# fmt: on
diff --git a/deebot_client/messages/xml/map.py b/deebot_client/messages/xml/map.py
new file mode 100644
index 000000000..8137ef184
--- /dev/null
+++ b/deebot_client/messages/xml/map.py
@@ -0,0 +1,63 @@
+"""Map messages."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+from deebot_client.events.map import MapTraceEvent, MinorMapEvent
+from deebot_client.message import HandlingResult
+from deebot_client.messages.xml.common import XmlMessage
+
+if TYPE_CHECKING:
+ from xml.etree.ElementTree import Element
+
+ from deebot_client.event_bus import EventBus
+
+
+class MapP(XmlMessage):
+ """MapP message."""
+
+ NAME = "MapP"
+
+ @classmethod
+ def _handle_xml(cls, event_bus: EventBus, xml: Element) -> HandlingResult:
+ """Handle xml message and notify the correct event subscribers.
+
+ Sample message:
+ b""
+ :return: A message response
+ """
+ if (
+ (pid := xml.attrib.get("pid"))
+ and (piece := xml.attrib.get("p"))
+ and pid.isdecimal()
+ ):
+ event_bus.notify(MinorMapEvent(index=int(pid), value=piece))
+ return HandlingResult.success()
+
+ return HandlingResult.analyse()
+
+
+class Trace(XmlMessage):
+ """Trace message."""
+
+ NAME = "trace"
+
+ @classmethod
+ def _handle_xml(cls, event_bus: EventBus, xml: Element) -> HandlingResult:
+ """Handle xml message and notify the correct event subscribers.
+
+ Sample message:
+
+ :return: A message response
+ """
+ if (
+ (tf := xml.attrib.get("tf"))
+ and tf.isdecimal()
+ and (tt := xml.attrib.get("tt"))
+ and tt.isdecimal()
+ and (tr := xml.attrib.get("tr"))
+ ):
+ event_bus.notify(MapTraceEvent(start=int(tf), total=int(tt), data=tr))
+ return HandlingResult.success()
+ return HandlingResult.analyse()
diff --git a/tests/messages/xml/test_map.py b/tests/messages/xml/test_map.py
new file mode 100644
index 000000000..a5b6a01bf
--- /dev/null
+++ b/tests/messages/xml/test_map.py
@@ -0,0 +1,56 @@
+from __future__ import annotations
+
+import pytest
+
+from deebot_client.events import MapTraceEvent, MinorMapEvent
+from deebot_client.message import HandlingState
+from deebot_client.messages.xml import MapP, Trace
+from tests.messages import assert_message, assert_message_failure
+
+
+@pytest.mark.parametrize(("pid", "data"), [(42, "base64data")])
+def test_MapP(pid: int, data: str) -> None:
+ xml_message = f""
+ assert_message(
+ MapP,
+ xml_message,
+ MinorMapEvent(index=pid, value=data),
+ )
+
+
+@pytest.mark.parametrize(
+ "xml_message",
+ {
+ "",
+ "",
+ "",
+ "",
+ },
+)
+def test_MapP_error(xml_message: str) -> None:
+ assert_message_failure(MapP, xml_message, HandlingState.ANALYSE_LOGGED)
+
+
+@pytest.mark.parametrize(("tf", "tt", "tr"), [(13, 42, "base64data")])
+def test_Trace(tf: int, tt: int, tr: str) -> None:
+ xml_message = f""
+ assert_message(
+ Trace,
+ xml_message,
+ MapTraceEvent(start=tf, total=tt, data=tr),
+ )
+
+
+@pytest.mark.parametrize(
+ "xml_message",
+ {
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ },
+)
+def test_Trace_error(xml_message: str) -> None:
+ assert_message_failure(Trace, xml_message, HandlingState.ANALYSE_LOGGED)