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+
2029def 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