1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
From d6f1aaa7f26aa52f4b219f60e704d5ab2954f082 Mon Sep 17 00:00:00 2001
From: Scott Murray <scott.murray@konsulko.com>
Date: Wed, 3 Apr 2024 02:09:11 +0900
Subject: [PATCH] Enable val2dbc for sensor values
Rework to allow val2dbc mode to write out sensor values in
addition to actuator target values.
Upstream-Status: pending
Signed-off-by: Scott Murray <scott.murray@konsulko.com>
---
dbc2val/dbcfeeder.py | 8 ++++++--
.../dbcfeederlib/databrokerclientwrapper.py | 18 ++++++++++++------
dbc2val/dbcfeederlib/dbc2vssmapper.py | 14 +++++++++-----
dbc2val/dbcfeederlib/serverclientwrapper.py | 2 +-
4 files changed, 28 insertions(+), 14 deletions(-)
diff --git a/dbc2val/dbcfeeder.py b/dbc2val/dbcfeeder.py
index e7fd319..5e0df2f 100755
--- a/dbc2val/dbcfeeder.py
+++ b/dbc2val/dbcfeeder.py
@@ -322,15 +322,19 @@ class Feeder:
log.debug("vss-Update callback!")
dbc_ids = set()
for update in updates:
+ value = None
if update.entry.value is not None:
- # This shall currently never happen as we do not subscribe to this
log.warning(f"Current value for {update.entry.path} is now: "
f"{update.entry.value.value} of type {type(update.entry.value.value)}")
+ value = update.entry.value.value
if update.entry.actuator_target is not None:
log.debug(f"Target value for {update.entry.path} is now: {update.entry.actuator_target} "
f"of type {type(update.entry.actuator_target.value)}")
- new_dbc_ids = self._mapper.handle_update(update.entry.path, update.entry.actuator_target.value)
+ value = update.entry.actuator_target.value
+
+ if value != None:
+ new_dbc_ids = self._mapper.handle_update(update.entry.path, value)
dbc_ids.update(new_dbc_ids)
can_ids = set()
diff --git a/dbc2val/dbcfeederlib/databrokerclientwrapper.py b/dbc2val/dbcfeederlib/databrokerclientwrapper.py
index 35836e9..46ae330 100644
--- a/dbc2val/dbcfeederlib/databrokerclientwrapper.py
+++ b/dbc2val/dbcfeederlib/databrokerclientwrapper.py
@@ -200,14 +200,20 @@ class DatabrokerClientWrapper(clientwrapper.ClientWrapper):
def supports_subscription(self) -> bool:
return True
- async def subscribe(self, vss_names: List[str], callback):
+ async def subscribe(self, vss_entries: dict[str, str], callback):
"""Creates a subscription and calls the callback when data received"""
entries = []
- for name in vss_names:
- # Always subscribe to target
- subscribe_entry = SubscribeEntry(name, View.FIELDS, [Field.ACTUATOR_TARGET])
- log.info(f"Subscribe entry: {subscribe_entry}")
- entries.append(subscribe_entry)
+ for name, signal_type in vss_entries.items():
+ if signal_type == "actuator":
+ subscribe_entry = SubscribeEntry(name, View.FIELDS, [Field.ACTUATOR_TARGET])
+ log.info(f"Subscribe entry: {subscribe_entry}")
+ entries.append(subscribe_entry)
+ if signal_type == "sensor":
+ subscribe_entry = SubscribeEntry(name, View.FIELDS, [Field.VALUE])
+ log.info(f"Subscribe entry: {subscribe_entry}")
+ entries.append(subscribe_entry)
+ if not entries:
+ return
# If there is a path VSSClient will request a secure connection
if self._tls and self._root_ca_path:
diff --git a/dbc2val/dbcfeederlib/dbc2vssmapper.py b/dbc2val/dbcfeederlib/dbc2vssmapper.py
index 5142a5e..8f04cdd 100644
--- a/dbc2val/dbcfeederlib/dbc2vssmapper.py
+++ b/dbc2val/dbcfeederlib/dbc2vssmapper.py
@@ -61,12 +61,13 @@ class VSSMapping:
parser: Parser = Parser()
def __init__(self, vss_name: str, dbc_name: str, transform: dict, interval_ms: int,
- on_change: bool, datatype: str, description: str):
+ on_change: bool, signal_type: str, datatype: str, description: str):
self.vss_name = vss_name
self.dbc_name = dbc_name
self.transform = transform
self.interval_ms = interval_ms
self.on_change = on_change
+ self.signal_type = signal_type
self.datatype = datatype
self.description = description
# For time comparison (interval_ms) we store last value used for comparison. Unit seconds.
@@ -282,7 +283,7 @@ class Mapper:
log.info(f"Using default interval 1000 ms for {expanded_name}")
interval = 1000
mapping_entry = VSSMapping(expanded_name, dbc_name, transform, interval, on_change,
- node["datatype"], node["description"])
+ node["type"], node["datatype"], node["description"])
if dbc_name not in self.dbc2val_mapping:
self.dbc2val_mapping[dbc_name] = []
self.dbc2val_mapping[dbc_name].append(mapping_entry)
@@ -306,7 +307,7 @@ class Mapper:
log.warning(f"interval_ms attribute ignored for {expanded_name}")
mapping_entry = VSSMapping(expanded_name, dbc_name, transform, interval, on_change,
- node["datatype"], node["description"])
+ node["type"], node["datatype"], node["description"])
if dbc_name not in self.val2dbc_mapping:
self.val2dbc_mapping[expanded_name] = []
self.val2dbc_mapping[expanded_name].append(mapping_entry)
@@ -380,9 +381,12 @@ class Mapper:
"""Return a set of all dbc names used for reception"""
return self.dbc2val_mapping.keys()
- def get_val2dbc_entries(self) -> KeysView:
+ def get_val2dbc_entries(self) -> Dict[str, str]:
"""Return a set of all vss names used for reception"""
- return self.val2dbc_mapping.keys()
+ entries: Dict[str, str] = {}
+ for name, mappings in self.val2dbc_mapping.items():
+ entries[name] = mappings[0].signal_type
+ return entries
def get_vss_names(self) -> Set[str]:
"""Get all VSS names used in mappings, both vss2dbc and dbc2vss"""
diff --git a/dbc2val/dbcfeederlib/serverclientwrapper.py b/dbc2val/dbcfeederlib/serverclientwrapper.py
index 63bc12e..ca11daf 100644
--- a/dbc2val/dbcfeederlib/serverclientwrapper.py
+++ b/dbc2val/dbcfeederlib/serverclientwrapper.py
@@ -125,6 +125,6 @@ class ServerClientWrapper(clientwrapper.ClientWrapper):
log.info("Feature not implemented")
return False
- async def subscribe(self, vss_names: List[str], callback):
+ async def subscribe(self, vss_entries: dict[str, str], callback):
log.error("Feature not implemented")
return
--
2.34.1
|