-
Notifications
You must be signed in to change notification settings - Fork 0
/
json2dbc.pl
136 lines (111 loc) · 2.98 KB
/
json2dbc.pl
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
#!/usr/bin/perl
#
# TM3 JSON to DBC convertor.
# usage: json2dbc.pl file.json > out.dbc
#
# © Korn 2020
use Data::Dumper;
use JSON::XS;
use File::Slurp;
my $jsontxt = read_file($ARGV[0]);
my $in = decode_json($jsontxt);
#print Dumper($in->{messages}->{VCRIGHT_hvacRequest});
#
my $values = '';
#Prefix
print 'VERSION ""
NS_ :
NS_DESC_
CM_
BA_DEF_
BA_
VAL_
CAT_DEF_
CAT_
FILTER
BA_DEF_DEF_
EV_DATA_
ENVVAR_DATA_
SGTYPE_
SGTYPE_VAL_
BA_DEF_SGTYPE_
BA_SGTYPE_
SIG_TYPE_REF_
VAL_TABLE_
SIG_GROUP_
SIG_VALTYPE_
SIGTYPE_VALTYPE_
BO_TX_BU_
BA_DEF_REL_
BA_REL_
BA_DEF_DEF_REL_
BU_SG_REL_
BU_EV_REL_
BU_BO_REL_
SG_MUL_VAL_
BS_:
BU_: Receiver ChassisBus VehicleBus PartyBus
';
my $i = 0;
for my $msgname (sort keys %{$in->{messages}}) {
$i++;
#ignore broken ones
next if $msgname =~ /^(GTW_hrl|EPAS3S_sysStatus|OD.N_IsoTpPipeVCS.C|.*_udsResponse|DAS_telem.tryRadar|EPAS3P_sysStatus|ESP_info|GTW_adc.*|GTW_status|GTW_updateStatus|SCCM_info|UDS_.*Request|UI_IsoTpUDPPipeVCS.C)$/;
my $d = $in->{messages}->{$msgname};
#print "Found message $msgname\n";
#print Dumper($d);
my $mid = $d->{message_id};
my $mid_hex = sprintf("%X", $mid);
my $name_hex = "ID".$mid_hex.$msgname;
my $msglen = $d->{length_bytes};
print "BO_ $mid $name_hex: $msglen VehicleBus\n";
#Find muxer, if any.
my $muxname = '';
for my $signame ( keys %{$d->{signals}}) {
if (defined $d->{signals}->{$signame}->{is_muxer}) {
$muxname = $signame ;
#print STDERR "$msgname $signame is mux\n";
};
}
#Signals
for my $signame ( sort {
#$d->{signals}->{$a}->{start_position} <=> $d->{signals}->{$b}->{start_position}
# Bring mux on top
return -1 if $a eq $muxname;
return 1 if $b eq $muxname;
$a cmp $b;
} keys %{$d->{signals}}) {
my $s = $d->{signals}->{$signame};
#print Dumper($s);
# Some weird signals starting at 7 with width=64.
$s->{start_position} = 0 if $s->{width} == 64;
#Message is muxed, signal is not
if (($s->{mux_id} eq '') && ($muxname ne '') && ($muxname ne $signame)) {
print STDERR "-- ! $msgname $signame mux is null\n";
next;
}
my $endianess = ($s->{endianess} eq 'LITTLE') ? 0 : 1;
my $sign = ($s->{signedness} eq 'UNSIGNED') ? '+' : '-';
my $mux_id = '';
if ($muxname ne '') {
$mux_id = ($signame eq $muxname) ? 'M ' : "m".$s->{mux_id}." ";
}
print " SG_ $signame ".$mux_id.": ".
$s->{start_position}."|". $s->{width}."@".$endianess.$sign.
" (". $s->{scale}.",". $s->{offset}.")".
" [". $s->{min}."|". $s->{max}."]".
' "'.$s->{units}.'"'.
" Receiver\n";
#Populate value map.
if (defined $s->{value_description}) {
my $vd = $s->{value_description};
$values .= "VAL_ $mid $signame ";
for my $vn (sort keys %$vd) {
$values .= $vd->{$vn}.' "'.$vn.'" ';
}
$values .= ";\n";
}
}
print "\n";
}
print $values;