Skip to content

Commit 3ece4c1

Browse files
committed
Add support for creating full device reader
1 parent 6daba19 commit 3ece4c1

1 file changed

Lines changed: 22 additions & 6 deletions

File tree

harp/reader.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
_camel_to_snake_regex = re.compile(r"(?<!^)(?=[A-Z])")
99

1010

11-
class Reader:
11+
class RegisterReader:
1212
register: Register
1313
read: Callable[[str], DataFrame]
1414

@@ -17,6 +17,15 @@ def __init__(self, register: Register, read: Callable[[str], DataFrame]) -> None
1717
self.read = read
1818

1919

20+
class DeviceReader:
21+
model: Model
22+
registers: dict[str, RegisterReader]
23+
24+
def __init__(self, model: Model, registers: dict[str, RegisterReader]) -> None:
25+
self.model = model
26+
self.registers = registers
27+
28+
2029
def compose(f, g):
2130
return lambda *a, **kw: f(g(*a, **kw))
2231

@@ -33,7 +42,14 @@ def create_bitreader(mask):
3342
return lambda xs: ((xs & mask) != 0)
3443

3544

36-
def create_reader(device: Model, name: str):
45+
def create_reader(device: Model):
46+
reg_readers = {
47+
create_register_reader(device, name) for name in device.registers.keys()
48+
}
49+
return DeviceReader(device, reg_readers)
50+
51+
52+
def create_register_reader(device: Model, name: str):
3753
register = device.registers[name]
3854
reader = read
3955

@@ -50,22 +66,22 @@ def unpack(df):
5066
return DataFrame({n: f(df[0]) for n, f in lookup}, index=df.index)
5167

5268
reader = compose(unpack, reader)
53-
return Reader(register, reader)
69+
return RegisterReader(register, reader)
5470

5571
groupMask = device.groupMasks.get(key)
5672
if groupMask is not None:
5773
name = id_camel_to_snake(name)
5874
lookup = {value.root: name for name, value in groupMask.values.items()}
5975
reader = partial(reader, columns=[name])
6076
reader = compose(lambda df: df.map(lambda x: lookup[x]), reader)
61-
return Reader(register, reader)
77+
return RegisterReader(register, reader)
6278

6379
if register.payloadSpec is not None:
6480
columns = register.payloadSpec.keys()
6581
columns = keys_camel_to_snake(columns)
6682
reader = partial(reader, columns=columns)
67-
return Reader(register, reader)
83+
return RegisterReader(register, reader)
6884

6985
columns = [id_camel_to_snake(name)]
7086
reader = partial(reader, columns=columns)
71-
return Reader(register, reader)
87+
return RegisterReader(register, reader)

0 commit comments

Comments
 (0)