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