30
30
import sys
31
31
import typing
32
32
from builtins import *
33
-
33
+ import decimal
34
34
import canmatrix
35
35
36
36
@@ -104,6 +104,20 @@ def dump(db, f, **options):
104
104
symbolic_frame ["attributes" ] = frame_attributes
105
105
export_dict ['messages' ].append (symbolic_frame )
106
106
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
+
107
121
for frame in db .frames :
108
122
frame_attributes = {attribute : frame .attribute (attribute , db = db ) for attribute in db .frame_defines }
109
123
symbolic_signals = []
@@ -132,10 +146,13 @@ def dump(db, f, **options):
132
146
"is_signed" : signal .is_signed ,
133
147
"is_float" : signal .is_float ,
134
148
"comment" : signal .comment ,
149
+ "comments" : signal .comments ,
135
150
"attributes" : attributes ,
151
+ "initial_value" : number_converter (signal .initial_value ),
136
152
"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 ,
139
156
}
140
157
if signal .multiplex is not None :
141
158
symbolic_signal ["multiplex" ] = signal .multiplex
@@ -156,7 +173,14 @@ def dump(db, f, **options):
156
173
"signals" : symbolic_signals ,
157
174
"attributes" : frame_attributes ,
158
175
"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 })
160
184
if sys .version_info > (3 , 0 ):
161
185
import io
162
186
temp = io .TextIOWrapper (f , encoding = 'UTF-8' )
@@ -192,16 +216,36 @@ def load(f, **_options):
192
216
key = int (key )
193
217
db .value_tables .setdefault (val_tab_name , {})[key ] = val
194
218
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 )
195
223
if "messages" in json_data :
196
224
for frame in json_data ["messages" ]:
197
225
# new_frame = Frame(frame["id"],frame["name"],8,None)
198
226
arb_id = canmatrix .canmatrix .ArbitrationId (id = frame ["id" ], extended = frame .get ("is_extended_frame" , "False" ))
199
227
new_frame = canmatrix .Frame (frame ["name" ], arbitration_id = arb_id , size = 8 )
200
228
if "length" in frame :
201
229
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 ]
202
245
203
246
new_frame .arbitration_id .extended = frame .get ("is_extended_frame" , False )
204
-
247
+ if "transmitters" in frame :
248
+ new_frame .transmitters = frame ["transmitters" ]
205
249
for signal in frame ["signals" ]:
206
250
is_little_endian = not signal .get ("is_big_endian" , False )
207
251
is_float = signal .get ("is_float" , False )
@@ -233,10 +277,48 @@ def load(f, **_options):
233
277
if signal .get ("values" , False ):
234
278
for key in signal ["values" ]:
235
279
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 )
236
293
if new_signal .is_little_endian is False :
237
294
new_signal .set_startbit (
238
295
new_signal .start_bit , bitNumbering = 1 , startLittle = True )
239
296
new_frame .add_signal (new_signal )
240
297
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
+
241
322
f .close ()
323
+ db .update_ecu_list ()
242
324
return db
0 commit comments