Skip to content

Commit 32fb493

Browse files
authored
add basic ecu info to json format (#683)
* add basic ecu info to json format * add more details to json
1 parent a003485 commit 32fb493

File tree

1 file changed

+87
-5
lines changed

1 file changed

+87
-5
lines changed

src/canmatrix/formats/json.py

+87-5
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import sys
3131
import typing
3232
from builtins import *
33-
33+
import decimal
3434
import canmatrix
3535

3636

@@ -104,6 +104,20 @@ def dump(db, f, **options):
104104
symbolic_frame["attributes"] = frame_attributes
105105
export_dict['messages'].append(symbolic_frame)
106106
else: # export_all
107+
_define_mapping = {"signal_defines": db.signal_defines, "frame_defines": db.frame_defines,
108+
"global_defines": db.global_defines, "env_defines": db.env_defines, "ecu_defines": db.ecu_defines}
109+
for define_type in _define_mapping:
110+
export_dict[define_type] = [{"name": a,
111+
"define": _define_mapping[define_type][a].definition,
112+
"default": _define_mapping[define_type][a].defaultValue,
113+
"type": _define_mapping[define_type][a].type} for a in _define_mapping[define_type]]
114+
export_dict['ecus'] = {ecu.name: ecu.comment for ecu in db.ecus}
115+
export_dict['attributes'] = db.attributes
116+
export_dict['value_tables'] = db.value_tables
117+
export_dict['env_vars'] = db.env_vars
118+
export_dict['baudrate'] = db.baudrate
119+
export_dict['fd_baudrate'] = db.fd_baudrate
120+
107121
for frame in db.frames:
108122
frame_attributes = {attribute: frame.attribute(attribute, db=db) for attribute in db.frame_defines}
109123
symbolic_signals = []
@@ -132,10 +146,13 @@ def dump(db, f, **options):
132146
"is_signed": signal.is_signed,
133147
"is_float": signal.is_float,
134148
"comment": signal.comment,
149+
"comments": signal.comments,
135150
"attributes": attributes,
151+
"initial_value": number_converter(signal.initial_value),
136152
"values": values,
137-
"is_multiplexer" : signal.is_multiplexer,
138-
"mux_value" : signal.mux_val
153+
"is_multiplexer": signal.is_multiplexer,
154+
"mux_value": signal.mux_val,
155+
"receivers": signal.receivers,
139156
}
140157
if signal.multiplex is not None:
141158
symbolic_signal["multiplex"] = signal.multiplex
@@ -156,7 +173,14 @@ def dump(db, f, **options):
156173
"signals": symbolic_signals,
157174
"attributes": frame_attributes,
158175
"comment": frame.comment,
159-
"length": frame.size})
176+
"length": frame.size,
177+
"is_complex_multiplexed": frame.is_complex_multiplexed,
178+
"mux_names": frame.mux_names,
179+
"cycle_time": frame.cycle_time,
180+
"is_j1939": frame.is_j1939,
181+
"header_id": frame.header_id,
182+
"pdu_name": frame.pdu_name,
183+
"transmitters": frame.transmitters})
160184
if sys.version_info > (3, 0):
161185
import io
162186
temp = io.TextIOWrapper(f, encoding='UTF-8')
@@ -192,16 +216,36 @@ def load(f, **_options):
192216
key = int(key)
193217
db.value_tables.setdefault(val_tab_name, {})[key] = val
194218

219+
if "ecus" in json_data:
220+
for ecu in json_data["ecus"]:
221+
new_ecu = canmatrix.Ecu(name=ecu, comment=json_data["ecus"][ecu])
222+
db.add_ecu(new_ecu)
195223
if "messages" in json_data:
196224
for frame in json_data["messages"]:
197225
# new_frame = Frame(frame["id"],frame["name"],8,None)
198226
arb_id = canmatrix.canmatrix.ArbitrationId(id=frame["id"], extended=frame.get("is_extended_frame", "False"))
199227
new_frame = canmatrix.Frame(frame["name"], arbitration_id=arb_id, size=8)
200228
if "length" in frame:
201229
new_frame.size = frame["length"]
230+
simple_mapping = ["is_complex_multiplexed", "mux_names", "cycle_time", "is_j1939", "header_id", "pdu_name"]
231+
for key in simple_mapping:
232+
if key in frame:
233+
if key == "is_complex_multiplexed":
234+
new_frame.is_complex_multiplexed = frame[key]
235+
elif key == "mux_names":
236+
new_frame.mux_names = frame[key]
237+
elif key == "cycle_time":
238+
new_frame.cycle_time = frame[key]
239+
elif key == "is_j1939":
240+
new_frame.is_j1939 = frame[key]
241+
elif key == "header_id":
242+
new_frame.header_id = frame[key]
243+
elif key == "pdu_name":
244+
new_frame.pdu_name = frame[key]
202245

203246
new_frame.arbitration_id.extended = frame.get("is_extended_frame", False)
204-
247+
if "transmitters" in frame:
248+
new_frame.transmitters = frame["transmitters"]
205249
for signal in frame["signals"]:
206250
is_little_endian = not signal.get("is_big_endian", False)
207251
is_float = signal.get("is_float", False)
@@ -233,10 +277,48 @@ def load(f, **_options):
233277
if signal.get("values", False):
234278
for key in signal["values"]:
235279
new_signal.add_values(key, signal["values"][key])
280+
281+
if "comment" in signal:
282+
new_signal.comment = signal["comment"]
283+
284+
if "comments" in signal:
285+
new_signal.comments = signal["comments"]
286+
287+
if "initial_value" in signal:
288+
new_signal.initial_value = decimal.Decimal(signal["initial_value"])
289+
290+
if signal.get("receivers", False):
291+
for ecu in signal["receivers"]:
292+
new_signal.add_receiver(ecu)
236293
if new_signal.is_little_endian is False:
237294
new_signal.set_startbit(
238295
new_signal.start_bit, bitNumbering=1, startLittle=True)
239296
new_frame.add_signal(new_signal)
240297
db.add_frame(new_frame)
298+
299+
_define_list = {"signal_defines": db.add_signal_defines, "frame_defines": db.add_frame_defines,
300+
"global_defines": db.add_global_defines, "env_defines": db.add_env_defines,
301+
"ecu_defines": db.add_ecu_defines}
302+
for define_type, fptr in _define_list.items():
303+
if define_type in json_data:
304+
for define in json_data[define_type]:
305+
fptr(define['name'], define['define'])
306+
307+
cm_import_list_dict = {'attributes': db.attributes, 'value_tables': db.value_tables, 'env_vars': db.env_vars}
308+
309+
cm_import_list_val = ['baudrate', 'fd_baudrate']
310+
311+
for key in cm_import_list_dict:
312+
if key in json_data:
313+
cm_import_list_dict[key].update(json_data[key])
314+
315+
for key in cm_import_list_val:
316+
if key in json_data:
317+
if key == 'baudrate':
318+
db.baudrate = json_data[key]
319+
elif key == 'fd_baudrate':
320+
db.fd_baudrate = json_data[key]
321+
241322
f.close()
323+
db.update_ecu_list()
242324
return db

0 commit comments

Comments
 (0)