@@ -12,22 +12,25 @@ from .common cimport dbc_lookup, DBC, Msg
12
12
13
13
import numbers
14
14
from collections import defaultdict
15
+ from collections.abc import Mapping
15
16
16
17
17
- class ValueDict (dict ):
18
- def __init__ (self , address , func ):
19
- super ().__init__()
20
- self .address = address
21
- self .func = func
18
+ class ValueDict (Mapping ):
19
+ def __init__ (self , signal_names , get_value_func ):
20
+ self .signal_names = signal_names
21
+ self .get_value_func = get_value_func
22
22
23
23
def __getitem__ (self , key ):
24
- return self .func( self .address, key)
24
+ return self .get_value_func( key)
25
25
26
- def values (self ):
27
- return [ self [key] for key in self ]
26
+ def __iter__ (self ):
27
+ return iter ( self .signal_names)
28
28
29
- def items (self ):
30
- return [(key, self [key]) for key in self ]
29
+ def __len__ (self ):
30
+ return len (self .signal_names)
31
+
32
+ def __repr__ (self ):
33
+ return repr (dict (self .items()))
31
34
32
35
33
36
cdef class CANParser:
@@ -68,21 +71,20 @@ cdef class CANParser:
68
71
raise RuntimeError (f" could not find message {repr(c[0])} in DBC {self.dbc_name}" )
69
72
message_v.push_back((address, c[1 ]))
70
73
74
+ self .can = new cpp_CANParser(bus, dbc_name, message_v)
75
+
76
+ for address, v in message_v:
71
77
msg = address_to_msg[address]
72
78
name = msg.name.decode(" utf8" )
73
- self .vl[address] = ValueDict(address, lambda addr , name : self .can.getValue(addr, name).value)
79
+ names = [sig.name.decode(" utf8" ) for sig in msg.sigs]
80
+
81
+ self .vl[address] = ValueDict(names, lambda name , addr = address: self .can.getValue(addr, name).value)
82
+ self .vl_all[address] = ValueDict(names, lambda name , addr = address: self .can.getValue(addr, name).all_values)
83
+ self .ts_nanos[address] = ValueDict(names, lambda name , addr = address: self .can.getValue(addr, name).ts_nanos)
84
+
74
85
self .vl[name] = self .vl[address]
75
- self .vl_all[address] = ValueDict(address, lambda addr , name : self .can.getValue(addr, name).all_values)
76
86
self .vl_all[name] = self .vl_all[address]
77
- self .ts_nanos[address] = ValueDict(address, lambda addr , name : self .can.getValue(addr, name).ts_nanos)
78
87
self .ts_nanos[name] = self .ts_nanos[address]
79
- for sig in msg.sigs:
80
- name = sig.name.decode(" utf8" )
81
- self .vl[address][name] = 0
82
- self .vl_all[address][name] = []
83
- self .ts_nanos[address][name] = 0
84
-
85
- self .can = new cpp_CANParser(bus, dbc_name, message_v)
86
88
87
89
def __dealloc__ (self ):
88
90
if self .can:
0 commit comments