Skip to content
This repository was archived by the owner on Dec 18, 2024. It is now read-only.

Commit e8eb214

Browse files
Merge pull request #214 from boschresearch/feature/dbcfeedertransforms
Transfromations and better error logging for DBC feeder
2 parents d81ff3d + 4a59d92 commit e8eb214

File tree

7 files changed

+116
-12
lines changed

7 files changed

+116
-12
lines changed

kuksa_feeders/dbc2val/dbc2vssmapper.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,23 @@
1111
########################################################################
1212

1313
import yaml
14+
import transforms.mapping
15+
import transforms.math
16+
1417

1518
class mapper:
1619

1720
def __init__(self,input):
1821
with open(input,'r') as file:
1922
self.mapping = yaml.full_load(file)
23+
24+
self.transforms={}
25+
self.transforms['fullmapping']=transforms.mapping.mapping(discard_non_matching_items=True)
26+
self.transforms['partialmapping']=transforms.mapping.mapping(discard_non_matching_items=False)
27+
self.transforms['math']=transforms.math.math()
28+
29+
30+
2031
for key in self.mapping.keys():
2132
self.mapping[key]['lastupdate']=0.0
2233
if 'minupdatedelay' not in self.mapping[key]:
@@ -33,7 +44,18 @@ def minUpdateTimeElapsed(self,key, time):
3344
self.mapping[key]['lastupdate']=time
3445
return True
3546
return False
36-
#
47+
48+
# Check whether there are transforms defined to map DBC signal "signal" to
49+
# VSS path "target". Returns the (potentially) transformed values
50+
def transform(self,signal, target, value):
51+
if "transform" not in self.mapping[signal]["targets"][target].keys(): #no transform defined, return as is
52+
return value
53+
for transform in self.mapping[signal]["targets"][target]["transform"]:
54+
if transform in self.transforms.keys(): #found a known transform and apply
55+
value=self.transforms[transform].transform(self.mapping[signal]["targets"][target]["transform"][transform],value)
56+
else:
57+
print(f"Warning: Unknown transform {transform} for {signal}->{target}")
58+
return value
3759

3860
def __contains__(self,key):
3961
return key in self.mapping.keys()

kuksa_feeders/dbc2val/dbcfeeder.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import os, sys, signal
1515
import configparser
1616
import queue
17+
import json
1718

1819
import dbc2vssmapper
1920
import dbcreader
@@ -85,9 +86,17 @@ def terminationSignalreceived(signalNumber, frame):
8586
while running:
8687
try:
8788
signal, value=canQueue.get(timeout=1)
88-
print("Update signal {} to {}".format(signal, value))
8989
for target in mapping[signal]['targets']:
90-
kuksa.setValue(target, value)
90+
tv=mapping.transform(signal,target,value)
91+
if tv is not None: #none indicates the transform decided to not set the value
92+
print("Update VSS path {} to {} based on signal {}".format(target, tv, signal))
93+
resp=json.loads(kuksa.setValue(target, tv))
94+
if "error" in resp:
95+
if "message" in resp["error"]:
96+
print("Error setting {}: {}".format(target, resp["error"]["message"]))
97+
else:
98+
print("Unknown error setting {}: {}".format(target, resp))
99+
pass
91100
except queue.Empty:
92101
pass
93102

kuksa_feeders/dbc2val/mapping.yml

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,36 @@
1-
# Map OBD values to tree
2-
1+
# Mapping Speed
32
UIspeed_signed257:
43
minupdatedelay: 100
54
targets:
6-
- Vehicle.OBD.Speed
5+
Vehicle.Speed: {}
6+
Vehicle.OBD.Speed: {}
77

88

9-
#RearPower266:
10-
# minupdatedelay: 100
11-
# targets:
12-
# - Vehicle.OBD.EngineLoad
9+
#this is kW, do some magic to get in 0-100 int range
10+
RearPower266:
11+
minupdatedelay: 100
12+
targets:
13+
Vehicle.OBD.EngineLoad:
14+
transform:
15+
math: "floor(abs(x/5))"
1316

14-
#Change this to type string in VSS file to work with M3 DBC
17+
#Mapping to numeriv VSS gears, and extract parking state
1518
DIgear118:
1619
minupdatedelay: 100
1720
targets:
18-
- Vehicle.Drivetrain.Transmission.Gear
21+
Vehicle.Powertrain.Transmission.Gear:
22+
transform:
23+
fullmapping:
24+
Neutral: 0
25+
Idle: 0
26+
Park: 0
27+
Reverse: -1
28+
Drive: 1
29+
Vehicle.Chassis.ParkingBrake.IsEngaged:
30+
transform:
31+
fullmapping:
32+
Neutral: "false"
33+
Idle: "false"
34+
Park: "true"
35+
Reverse: "false"
36+
Drive: "false"

kuksa_feeders/dbc2val/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ cantools
33
python-can
44
pyyaml
55
j1939
6+
py_expression_eval
67
kuksa-viss-client

kuksa_feeders/dbc2val/transforms/__init__.py

Whitespace-only changes.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/usr/bin/python3
2+
3+
########################################################################
4+
# Copyright (c) 2021 Robert Bosch GmbH
5+
#
6+
# This program and the accompanying materials are made
7+
# available under the terms of the Eclipse Public License 2.0
8+
# which is available at https://www.eclipse.org/legal/epl-2.0/
9+
#
10+
# SPDX-License-Identifier: EPL-2.0
11+
########################################################################
12+
13+
14+
class mapping:
15+
16+
# setting discard_non_matching_items to true will return "None" if a value
17+
# is not found in the mapping table. This can be used to only add
18+
# a subset of possible values to VSS
19+
# setting discard_non_matching_items to false will return values for
20+
# which no match exists unmodified
21+
def __init__(self, discard_non_matching_items):
22+
self.discard_non_matching_items=discard_non_matching_items
23+
24+
def transform(self, spec, value):
25+
for k,v in spec.items():
26+
if value==k:
27+
return v
28+
#no match
29+
if self.discard_non_matching_items:
30+
return None
31+
else:
32+
return value
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/python3
2+
3+
########################################################################
4+
# Copyright (c) 2021 Robert Bosch GmbH
5+
#
6+
# This program and the accompanying materials are made
7+
# available under the terms of the Eclipse Public License 2.0
8+
# which is available at https://www.eclipse.org/legal/epl-2.0/
9+
#
10+
# SPDX-License-Identifier: EPL-2.0
11+
########################################################################
12+
13+
from py_expression_eval import Parser
14+
15+
class math:
16+
17+
def __init__(self):
18+
self.parser=Parser()
19+
20+
def transform(self, spec, value):
21+
return self.parser.parse(spec).evaluate({'x': value})
22+

0 commit comments

Comments
 (0)