Skip to content

Commit cf64482

Browse files
committed
inheriting from abc.Mapping
1 parent 27fce80 commit cf64482

File tree

1 file changed

+22
-20
lines changed

1 file changed

+22
-20
lines changed

can/parser_pyx.pyx

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,25 @@ from .common cimport dbc_lookup, DBC, Msg
1212

1313
import numbers
1414
from collections import defaultdict
15+
from collections.abc import Mapping
1516

1617

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
2222

2323
def __getitem__(self, key):
24-
return self.func(self.address, key)
24+
return self.get_value_func(key)
2525

26-
def values(self):
27-
return [self[key] for key in self]
26+
def __iter__(self):
27+
return iter(self.signal_names)
2828

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()))
3134

3235

3336
cdef class CANParser:
@@ -68,21 +71,20 @@ cdef class CANParser:
6871
raise RuntimeError(f"could not find message {repr(c[0])} in DBC {self.dbc_name}")
6972
message_v.push_back((address, c[1]))
7073

74+
self.can = new cpp_CANParser(bus, dbc_name, message_v)
75+
76+
for address, v in message_v:
7177
msg = address_to_msg[address]
7278
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+
7485
self.vl[name] = self.vl[address]
75-
self.vl_all[address] = ValueDict(address, lambda addr, name: self.can.getValue(addr, name).all_values)
7686
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)
7887
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)
8688

8789
def __dealloc__(self):
8890
if self.can:

0 commit comments

Comments
 (0)