Skip to content

Commit ebd12ce

Browse files
authored
Allow indexing of registers by register number (#22)
1 parent a47b921 commit ebd12ce

1 file changed

Lines changed: 21 additions & 4 deletions

File tree

harp/reader.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
from dataclasses import dataclass
88
from numpy import dtype
99
from pandas import DataFrame, Series
10-
from typing import Any, BinaryIO, Callable, Iterable, Optional, Protocol, Union
10+
from typing import Any, BinaryIO, Callable, Iterable, Mapping, Optional, Protocol, Union
11+
from collections import UserDict
1112
from pandas._typing import Axes
1213
from harp.model import BitMask, GroupMask, Model, PayloadMember, Register
1314
from harp.io import MessageType, read
@@ -44,13 +45,29 @@ def __init__(
4445
self.read = read
4546

4647

48+
class RegisterMap(UserDict[str, RegisterReader]):
49+
_address_map: Mapping[int, RegisterReader]
50+
51+
def __init__(self, registers: Mapping[str, RegisterReader]) -> None:
52+
super().__init__(registers)
53+
self._address_map = {
54+
value.register.address: value for value in registers.values()
55+
}
56+
57+
def __getitem__(self, __key: Union[str, int]) -> RegisterReader:
58+
if isinstance(__key, int):
59+
return self._address_map[__key]
60+
else:
61+
return super().__getitem__(__key)
62+
63+
4764
class DeviceReader:
4865
device: Model
49-
registers: dict[str, RegisterReader]
66+
registers: RegisterMap
5067

51-
def __init__(self, device: Model, registers: dict[str, RegisterReader]) -> None:
68+
def __init__(self, device: Model, registers: Mapping[str, RegisterReader]) -> None:
5269
self.device = device
53-
self.registers = registers
70+
self.registers = RegisterMap(registers)
5471

5572
def __dir__(self) -> Iterable[str]:
5673
return self.registers.keys()

0 commit comments

Comments
 (0)