1212from pandas import DataFrame , Series
1313from pandas ._typing import Axes
1414
15- from harp .io import MessageType , read
15+ from harp .io import MessageType , parse , read
1616from harp .model import BitMask , GroupMask , Model , PayloadMember , Register
1717from harp .schema import read_schema
18+ from harp .typing import BufferLike
1819
1920
2021@dataclass
@@ -33,17 +34,29 @@ def __call__(
3334 ) -> DataFrame : ...
3435
3536
37+ class _ParseRegister (Protocol ):
38+ def __call__ (
39+ self ,
40+ buffer : BufferLike ,
41+ epoch : Optional [datetime ] = None ,
42+ keep_type : bool = False ,
43+ ) -> DataFrame : ...
44+
45+
3646class RegisterReader :
3747 register : Register
3848 read : _ReadRegister
49+ parse : _ParseRegister
3950
4051 def __init__ (
4152 self ,
4253 register : Register ,
4354 read : _ReadRegister ,
55+ parse : _ParseRegister ,
4456 ) -> None :
4557 self .register = register
4658 self .read = read
59+ self .parse = parse
4760
4861
4962class RegisterMap (UserDict [str , RegisterReader ]):
@@ -81,12 +94,12 @@ def _compose_parser(
8194 params : _ReaderParams ,
8295) -> Callable [..., DataFrame ]:
8396 def parser (
84- file : Optional [ Union [ str , bytes , PathLike [ Any ], BinaryIO ]] = None ,
97+ data ,
8598 columns : Optional [Axes ] = None ,
8699 epoch : Optional [datetime ] = params .epoch ,
87100 keep_type : bool = params .keep_type ,
88101 ):
89- df = g (file , columns , epoch , keep_type )
102+ df = g (data , columns , epoch , keep_type )
90103 result = f (df )
91104 type_col = df .get (MessageType .__name__ )
92105 if type_col is not None :
@@ -189,38 +202,63 @@ def reader(
189202 return reader
190203
191204
192- def _create_register_parser (device : Model , name : str , params : _ReaderParams ):
205+ def _create_register_parser (register : Register , params : _ReaderParams ):
206+ def parser (
207+ buffer : BufferLike ,
208+ columns : Optional [Axes ] = None ,
209+ epoch : Optional [datetime ] = params .epoch ,
210+ keep_type : bool = params .keep_type ,
211+ ):
212+ return parse (
213+ buffer ,
214+ address = register .address ,
215+ dtype = dtype (register .type ),
216+ length = register .length ,
217+ columns = columns ,
218+ epoch = epoch ,
219+ keep_type = keep_type ,
220+ )
221+
222+ return parser
223+
224+
225+ def _create_register_handler (device : Model , name : str , params : _ReaderParams ):
193226 register = device .registers [name ]
194227 reader = _create_register_reader (register , params )
228+ parser = _create_register_parser (register , params )
195229
196230 if register .maskType is not None :
197231 key = register .maskType .root
198232 bitMask = None if device .bitMasks is None else device .bitMasks .get (key )
199233 if bitMask is not None :
200- parser = _create_bitmask_parser (bitMask )
201- reader = _compose_parser (parser , reader , params )
202- return RegisterReader (register , reader )
234+ bitmask_parser = _create_bitmask_parser (bitMask )
235+ reader = _compose_parser (bitmask_parser , reader , params )
236+ parser = _compose_parser (bitmask_parser , parser , params )
237+ return RegisterReader (register , reader , parser )
203238
204239 groupMask = None if device .groupMasks is None else device .groupMasks .get (key )
205240 if groupMask is not None :
206- parser = _create_groupmask_parser (name , groupMask )
207- reader = _compose_parser (parser , reader , params )
208- return RegisterReader (register , reader )
241+ groupmask_parser = _create_groupmask_parser (name , groupMask )
242+ reader = _compose_parser (groupmask_parser , reader , params )
243+ parser = _compose_parser (groupmask_parser , parser , params )
244+ return RegisterReader (register , reader , parser )
209245
210246 if register .payloadSpec is not None :
211- payload_parsers = [
247+ member_parsers = [
212248 (key , _create_payloadmember_parser (device , member ))
213249 for key , member in register .payloadSpec .items ()
214250 ]
215251
216- def parser (df : DataFrame ):
217- return DataFrame ({n : f (df ) for n , f in payload_parsers }, index = df .index )
252+ def payload_parser (df : DataFrame ):
253+ return DataFrame ({n : f (df ) for n , f in member_parsers }, index = df .index )
218254
219- reader = _compose_parser (parser , reader , params )
220- return RegisterReader (register , reader )
255+ reader = _compose_parser (payload_parser , reader , params )
256+ parser = _compose_parser (payload_parser , parser , params )
257+ return RegisterReader (register , reader , parser )
221258
222259 reader = partial (reader , columns = [name ])
223- return RegisterReader (register , reader )
260+ parser = partial (parser , columns = [name ])
261+ return RegisterReader (register , reader , parser )
224262
225263
226264def create_reader (
@@ -265,7 +303,7 @@ def create_reader(
265303 base_path = path / device .device if is_dir else path .parent / device .device
266304
267305 reg_readers = {
268- name : _create_register_parser (device , name , _ReaderParams (base_path , epoch , keep_type ))
306+ name : _create_register_handler (device , name , _ReaderParams (base_path , epoch , keep_type ))
269307 for name in device .registers .keys ()
270308 }
271309 return DeviceReader (device , reg_readers )
0 commit comments