summaryrefslogtreecommitdiffstats
path: root/recipes-connectivity/kuksa-val/kuksa-dbc-feeder
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-connectivity/kuksa-val/kuksa-dbc-feeder')
-rw-r--r--recipes-connectivity/kuksa-val/kuksa-dbc-feeder/0003-dbc2val-add-duplicate-filtering-option.patch61
-rw-r--r--recipes-connectivity/kuksa-val/kuksa-dbc-feeder/mapping.yml123
2 files changed, 151 insertions, 33 deletions
diff --git a/recipes-connectivity/kuksa-val/kuksa-dbc-feeder/0003-dbc2val-add-duplicate-filtering-option.patch b/recipes-connectivity/kuksa-val/kuksa-dbc-feeder/0003-dbc2val-add-duplicate-filtering-option.patch
new file mode 100644
index 000000000..1709ac1e4
--- /dev/null
+++ b/recipes-connectivity/kuksa-val/kuksa-dbc-feeder/0003-dbc2val-add-duplicate-filtering-option.patch
@@ -0,0 +1,61 @@
+From a22d972bc497ab46d99c1d118bd40b9471fef3a7 Mon Sep 17 00:00:00 2001
+From: Scott Murray <scott.murray@konsulko.com>
+Date: Mon, 13 Jun 2022 12:54:54 -0400
+Subject: [PATCH] dbc2val: add duplicate filtering option
+
+To avoid generating a lot of duplicated signal events from the
+CAN messages generated by LIN polling, add a per-target
+"filter-duplicates" option that can be used for signals where
+only changes should be pushed toi the VIS server. This is
+required with the current performance of the DBC feeder to avoid
+ending up with an increasing backlog of signal commands to the
+server. This will be investigated with upstream.
+
+Upstream-Status: pending
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+---
+ kuksa_feeders/dbc2val/dbc2vssmapper.py | 27 +++++++++++++++++++-------
+ 1 file changed, 20 insertions(+), 7 deletions(-)
+
+diff --git a/kuksa_feeders/dbc2val/dbc2vssmapper.py b/kuksa_feeders/dbc2val/dbc2vssmapper.py
+index 1718154..2feb572 100644
+--- a/kuksa_feeders/dbc2val/dbc2vssmapper.py
++++ b/kuksa_feeders/dbc2val/dbc2vssmapper.py
+@@ -48,14 +48,27 @@ class mapper:
+ # Check whether there are transforms defined to map DBC signal "signal" to
+ # VSS path "target". Returns the (potentially) transformed values
+ def transform(self,signal, target, value):
+- if "transform" not in self.mapping[signal]["targets"][target].keys(): #no transform defined, return as is
+- return value
+- for transform in self.mapping[signal]["targets"][target]["transform"]:
+- if transform in self.transforms.keys(): #found a known transform and apply
+- value=self.transforms[transform].transform(self.mapping[signal]["targets"][target]["transform"][transform],value)
++ result = value
++ if "transform" in self.mapping[signal]["targets"][target].keys():
++ for transform in self.mapping[signal]["targets"][target]["transform"]:
++ if transform in self.transforms.keys(): #found a known transform and apply
++ result = self.transforms[transform].transform(self.mapping[signal]["targets"][target]["transform"][transform],value)
++ else:
++ print(f"Warning: Unknown transform {transform} for {signal}->{target}")
++ # else no transform defined, return as is
++
++ if (("filter-duplicates" in self.mapping[signal]["targets"][target]) and
++ self.mapping[signal]["targets"][target]["filter-duplicates"] == "true"):
++ if "last" in self.mapping[signal]["targets"][target]:
++ if self.mapping[signal]["targets"][target]["last"] == result:
++ # ignore duplicate value
++ result = None
++ else:
++ self.mapping[signal]["targets"][target]["last"] = result
+ else:
+- print(f"Warning: Unknown transform {transform} for {signal}->{target}")
+- return value
++ self.mapping[signal]["targets"][target]["last"] = result
++
++ return result
+
+ def __contains__(self,key):
+ return key in self.mapping.keys()
+--
+2.35.1
+
diff --git a/recipes-connectivity/kuksa-val/kuksa-dbc-feeder/mapping.yml b/recipes-connectivity/kuksa-val/kuksa-dbc-feeder/mapping.yml
index f8a561d27..ee970a32d 100644
--- a/recipes-connectivity/kuksa-val/kuksa-dbc-feeder/mapping.yml
+++ b/recipes-connectivity/kuksa-val/kuksa-dbc-feeder/mapping.yml
@@ -11,85 +11,142 @@ PT_EngineSpeed:
transform:
math: "floor(x+0.5)"
+#
+# NOTE:
+#
+# The following mappings depend on the AGL-specific VSS overlay
+# that adds the extra Vehicle.Cabin.SteeringWheel.Switches sensors.
+# Since the CAN events are coming from LIN polling, applications
+# need to filter/debounce themselves. The minupdatedelay of 0 is
+# intentional to avoid missing events.
+#
+
SW_Next:
- minupdatedelay: 500
+ minupdatedelay: 0
targets:
- Vehicle.Cabin.Infotainment.Media.Action:
+ Vehicle.Cabin.SteeringWheel.Switches.Next:
+ filter-duplicates: "true"
transform:
fullmapping:
- 1: "SkipForward"
+ 0: "false"
+ 1: "true"
SW_Previous:
- minupdatedelay: 500
+ minupdatedelay: 0
targets:
- Vehicle.Cabin.Infotainment.Media.Action:
+ Vehicle.Cabin.SteeringWheel.Switches.Previous:
+ filter-duplicates: "true"
transform:
fullmapping:
- 1: "SkipBackward"
+ 0: "false"
+ 1: "true"
-# NOTE: Dependent on AGL-specific VSS overlay adding the extra action
SW_Mode:
- minupdatedelay: 500
+ minupdatedelay: 0
targets:
- Vehicle.Cabin.Infotainment.Media.Action:
+ Vehicle.Cabin.SteeringWheel.Switches.Mode:
+ filter-duplicates: "true"
transform:
fullmapping:
- 1: "NextSource"
+ 0: "false"
+ 1: "true"
-# NOTE: Dependent on AGL-specific VSS overlay adding the signal
SW_Info:
- minupdatedelay: 500
+ minupdatedelay: 0
targets:
- Vehicle.Cabin.Infotainment.Cluster.Mode:
+ Vehicle.Cabin.SteeringWheel.Switches.Info:
+ filter-duplicates: "true"
transform:
fullmapping:
+ 0: "false"
1: "true"
-#
-# The following is a little hackish, due to relying on the
-# application to treat IsActive and IsSet = "true" as toggles, and
-# being dependent on the AGL-specific VSS overlay to add IsSet.
-# A standalone LIN feeder with some state knowledge would maybe
-# be cleaner. Another possible option would be the addition of
-# another type of transform that has state to the DBC feeder.
-#
-
SW_CruiseEnable:
- minupdatedelay: 500
+ minupdatedelay: 0
targets:
- Vehicle.ADAS.CruiseControl.IsActive:
+ Vehicle.Cabin.SteeringWheel.Switches.CruiseEnable:
+ filter-duplicates: "true"
transform:
fullmapping:
+ 0: "false"
1: "true"
SW_CruiseSet:
- minupdatedelay: 500
+ minupdatedelay: 0
targets:
- Vehicle.ADAS.CruiseControl.IsSet:
+ Vehicle.Cabin.SteeringWheel.Switches.CruiseSet:
+ filter-duplicates: "true"
transform:
fullmapping:
+ 0: "false"
1: "true"
SW_CruiseResume:
- minupdatedelay: 500
+ minupdatedelay: 0
targets:
- Vehicle.ADAS.CruiseControl.IsSet:
+ Vehicle.Cabin.SteeringWheel.Switches.CruiseResume:
+ filter-duplicates: "true"
transform:
fullmapping:
+ 0: "false"
1: "true"
SW_CruiseCancel:
- minupdatedelay: 500
+ minupdatedelay: 0
+ targets:
+ Vehicle.Cabin.SteeringWheel.Switches.CruiseCancel:
+ filter-duplicates: "true"
+ transform:
+ fullmapping:
+ 0: "false"
+ 1: "true"
+
+SW_VolumeUp:
+ minupdatedelay: 0
targets:
- Vehicle.ADAS.CruiseControl.IsSet:
+ Vehicle.Cabin.SteeringWheel.Switches.VolumeUp:
+ filter-duplicates: "true"
transform:
fullmapping:
- 1: "false"
+ 0: "false"
+ 1: "true"
+
+SW_VolumeDown:
+ minupdatedelay: 0
+ targets:
+ Vehicle.Cabin.SteeringWheel.Switches.VolumeDown:
+ filter-duplicates: "true"
+ transform:
+ fullmapping:
+ 0: "false"
+ 1: "true"
+
+SW_VolumeMute:
+ minupdatedelay: 0
+ targets:
+ Vehicle.Cabin.SteeringWheel.Switches.VolumeMute:
+ filter-duplicates: "true"
+ transform:
+ fullmapping:
+ 0: "false"
+ 1: "true"
+
+SW_Horn:
+ minupdatedelay: 0
+ targets:
+ Vehicle.Cabin.SteeringWheel.Switches.Horn:
+ filter-duplicates: "true"
+ transform:
+ fullmapping:
+ 0: "false"
+ 1: "true"
SW_LaneDepartureWarning:
- minupdatedelay: 500
+ minupdatedelay: 0
targets:
- Vehicle.ADAS.LaneDepartureDetection.IsActive:
+ Vehicle.Cabin.SteeringWheel.Switches.LaneDepartureWarning:
+ filter-duplicates: "true"
transform:
fullmapping:
+ 0: "false"
1: "true"