emdbg.debug.px4.buffer

 1# Copyright (c) 2023, Auterion AG
 2# SPDX-License-Identifier: BSD-3-Clause
 3
 4from __future__ import annotations
 5from .base import Base
 6from .utils import gdb_len
 7
 8
 9class UartBuffer(Base):
10    """
11    Pretty Printing UART buffers
12    """
13
14    def __init__(self, gdb, buf_ptr: "gdb.Value"):
15        super().__init__(gdb)
16        self._buf = buf_ptr
17
18    def children(self) -> Iterator[tuple[str, Any]]:
19        size, head, tail = self._buf['size'], self._buf['head'], self._buf['tail']
20        used = head - tail if (tail <= head) else size - tail + head
21        free = size - used
22        yield ("sem", self._buf['sem'])
23        yield ("size", size)
24        yield ("buffer", self._buf['buffer'])
25        yield ("tail -> head", f"{tail} -> {head}: {used} used, {free} free")
26        if used:
27            ptr = int(self._buf['buffer'].address)
28            if (tail < head):
29                # [tail, head]
30                memories = [self.read_memory(ptr + tail, used)]
31            else:
32                # head], [tail
33                memories = [self.read_memory(ptr + tail, size - tail),
34                            self.read_memory(ptr, head)]
35            # Convert to Prints else \hh hex values
36            content = "".join(chr(v) if chr(v).isprintable() else f"\\{v:02x}"
37                              for memory in memories
38                              for v in memory.tobytes())
39            yield ("content", content)
40
41
42class ConsoleBuffer(Base):
43    """
44    Pretty Printing Console buffers
45    """
46    def __init__(self, gdb, buf_ptr: "gdb.Value"):
47        super().__init__(gdb)
48        self._buf = buf_ptr
49
50    def to_string(self) -> str:
51        ptr = int(self._buf['_buffer'].address)
52        size = gdb_len(self._buf['_buffer'])
53        head, tail = self._buf['_tail'], self._buf['_head']
54        used = head - tail if (tail <= head) else size - tail + head
55        header = f"ConsoleBuffer({used}B/{size}B: "
56        if tail <= head: header += f"[{tail} -> {head}]) =\n"
57        else: header += f"{head}] <- [{tail}) =\n"
58        if used:
59            if (tail <= head):
60                # [tail, head]
61                memories = [self.read_memory(ptr + tail, used)]
62            else:
63                # head], [tail
64                memories = [self.read_memory(ptr + tail, size - tail),
65                            self.read_memory(ptr, head)]
66            header += "".join(chr(v)
67                              for memory in memories
68                              for v in memory.tobytes())
69        return header
class UartBuffer(emdbg.debug.px4.base.Base):
10class UartBuffer(Base):
11    """
12    Pretty Printing UART buffers
13    """
14
15    def __init__(self, gdb, buf_ptr: "gdb.Value"):
16        super().__init__(gdb)
17        self._buf = buf_ptr
18
19    def children(self) -> Iterator[tuple[str, Any]]:
20        size, head, tail = self._buf['size'], self._buf['head'], self._buf['tail']
21        used = head - tail if (tail <= head) else size - tail + head
22        free = size - used
23        yield ("sem", self._buf['sem'])
24        yield ("size", size)
25        yield ("buffer", self._buf['buffer'])
26        yield ("tail -> head", f"{tail} -> {head}: {used} used, {free} free")
27        if used:
28            ptr = int(self._buf['buffer'].address)
29            if (tail < head):
30                # [tail, head]
31                memories = [self.read_memory(ptr + tail, used)]
32            else:
33                # head], [tail
34                memories = [self.read_memory(ptr + tail, size - tail),
35                            self.read_memory(ptr, head)]
36            # Convert to Prints else \hh hex values
37            content = "".join(chr(v) if chr(v).isprintable() else f"\\{v:02x}"
38                              for memory in memories
39                              for v in memory.tobytes())
40            yield ("content", content)

Pretty Printing UART buffers

UartBuffer(gdb, buf_ptr: "'gdb.Value'")
15    def __init__(self, gdb, buf_ptr: "gdb.Value"):
16        super().__init__(gdb)
17        self._buf = buf_ptr
def children(self) -> 'Iterator[tuple[str, Any]]':
19    def children(self) -> Iterator[tuple[str, Any]]:
20        size, head, tail = self._buf['size'], self._buf['head'], self._buf['tail']
21        used = head - tail if (tail <= head) else size - tail + head
22        free = size - used
23        yield ("sem", self._buf['sem'])
24        yield ("size", size)
25        yield ("buffer", self._buf['buffer'])
26        yield ("tail -> head", f"{tail} -> {head}: {used} used, {free} free")
27        if used:
28            ptr = int(self._buf['buffer'].address)
29            if (tail < head):
30                # [tail, head]
31                memories = [self.read_memory(ptr + tail, used)]
32            else:
33                # head], [tail
34                memories = [self.read_memory(ptr + tail, size - tail),
35                            self.read_memory(ptr, head)]
36            # Convert to Prints else \hh hex values
37            content = "".join(chr(v) if chr(v).isprintable() else f"\\{v:02x}"
38                              for memory in memories
39                              for v in memory.tobytes())
40            yield ("content", content)
class ConsoleBuffer(emdbg.debug.px4.base.Base):
43class ConsoleBuffer(Base):
44    """
45    Pretty Printing Console buffers
46    """
47    def __init__(self, gdb, buf_ptr: "gdb.Value"):
48        super().__init__(gdb)
49        self._buf = buf_ptr
50
51    def to_string(self) -> str:
52        ptr = int(self._buf['_buffer'].address)
53        size = gdb_len(self._buf['_buffer'])
54        head, tail = self._buf['_tail'], self._buf['_head']
55        used = head - tail if (tail <= head) else size - tail + head
56        header = f"ConsoleBuffer({used}B/{size}B: "
57        if tail <= head: header += f"[{tail} -> {head}]) =\n"
58        else: header += f"{head}] <- [{tail}) =\n"
59        if used:
60            if (tail <= head):
61                # [tail, head]
62                memories = [self.read_memory(ptr + tail, used)]
63            else:
64                # head], [tail
65                memories = [self.read_memory(ptr + tail, size - tail),
66                            self.read_memory(ptr, head)]
67            header += "".join(chr(v)
68                              for memory in memories
69                              for v in memory.tobytes())
70        return header

Pretty Printing Console buffers

ConsoleBuffer(gdb, buf_ptr: "'gdb.Value'")
47    def __init__(self, gdb, buf_ptr: "gdb.Value"):
48        super().__init__(gdb)
49        self._buf = buf_ptr
def to_string(self) -> str:
51    def to_string(self) -> str:
52        ptr = int(self._buf['_buffer'].address)
53        size = gdb_len(self._buf['_buffer'])
54        head, tail = self._buf['_tail'], self._buf['_head']
55        used = head - tail if (tail <= head) else size - tail + head
56        header = f"ConsoleBuffer({used}B/{size}B: "
57        if tail <= head: header += f"[{tail} -> {head}]) =\n"
58        else: header += f"{head}] <- [{tail}) =\n"
59        if used:
60            if (tail <= head):
61                # [tail, head]
62                memories = [self.read_memory(ptr + tail, used)]
63            else:
64                # head], [tail
65                memories = [self.read_memory(ptr + tail, size - tail),
66                            self.read_memory(ptr, head)]
67            header += "".join(chr(v)
68                              for memory in memories
69                              for v in memory.tobytes())
70        return header