Skip to content

Commit

Permalink
Dump factor, offset, min, max as float. Load as numeric (#380)
Browse files Browse the repository at this point in the history
* Dump factor, offset, min, max as float. Load as numeric

* fixed tests

* fixed tests

* added --jsonNativeTypes as cli option

* review remarks
  • Loading branch information
chrisoro authored and ebroecker committed Aug 12, 2019
1 parent b2515cb commit 7fbd7b1
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 6 deletions.
3 changes: 3 additions & 0 deletions src/canmatrix/cli/convert.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,9 @@ def main(): # type: () -> int
parser.add_option("", "--jsonMotorolaBitFormat",
dest="jsonMotorolaBitFormat", default="lsb",
help="Json format: startbit of motorola signals\nValid values: msb, lsb, msbreverse\n default lsb")
parser.add_option("", "--jsonNativeTypes",
dest="jsonNativeTypes", action="store_true", default=False,
help="Uses native json representation for decimals instead of string.")

parser.add_option("", "--additionalFrameAttributes",
dest="additionalFrameAttributes", default="",
Expand Down
14 changes: 8 additions & 6 deletions src/canmatrix/formats/cmjson.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ def dump(db, f, **options):
export_canard = options.get('jsonCanard', False)
motorola_bit_format = options.get('jsonMotorolaBitFormat', "lsb")
export_all = options.get('jsonAll', False)
native_types = options.get('jsonNativeTypes', False)
number_converter = float if native_types else str
additional_frame_columns = [x for x in options.get("additionalFrameAttributes", "").split(",") if x]


Expand Down Expand Up @@ -81,8 +83,8 @@ def dump(db, f, **options):
"name": signal.name,
"start_bit": start_bit,
"bit_length": signal.size,
"factor": str(signal.factor),
"offset": str(signal.offset),
"factor": number_converter(signal.factor),
"offset": number_converter(signal.offset),
"is_big_endian": signal.is_little_endian is False,
"is_signed": signal.is_signed,
"is_float": signal.is_float
Expand Down Expand Up @@ -120,10 +122,10 @@ def dump(db, f, **options):
"name": signal.name,
"start_bit": start_bit,
"bit_length": signal.size,
"factor": str(signal.factor),
"offset": str(signal.offset),
"min": str(signal.min),
"max": str(signal.max),
"factor": number_converter(signal.factor),
"offset": number_converter(signal.offset),
"min": number_converter(signal.min),
"max": number_converter(signal.max),
"is_big_endian": signal.is_little_endian is False,
"is_signed": signal.is_signed,
"is_float": signal.is_float,
Expand Down
65 changes: 65 additions & 0 deletions src/canmatrix/tests/test_cmjson.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,68 @@ def test_import_min_max():
matrix = canmatrix.formats.loads_flat(json_input, "cmjson", jsonAll=True)
assert matrix.frames[0].signals[0].min == -5
assert matrix.frames[0].signals[0].max == 42

def test_import_native():
json_input = """{
"messages": [
{
"attributes": {},
"comment": "",
"id": 10,
"is_extended_frame": false,
"length": 6,
"name": "test_frame",
"signals": [
{
"attributes": {},
"bit_length": 40,
"comment": null,
"factor": 0.123,
"is_big_endian": false,
"is_float": false,
"is_signed": true,
"max": 42,
"min": -4.2,
"name": "someSigName",
"offset": 1,
"start_bit": 0,
"values": {}
}
]
}
]
}"""
matrix = canmatrix.formats.loads_flat(json_input, "cmjson", jsonAll=True)
assert matrix.frames[0].signals[0].min == -4.2
assert matrix.frames[0].signals[0].max == 42
assert matrix.frames[0].signals[0].factor == 0.123
assert matrix.frames[0].signals[0].offset == 1

def test_export_native():
matrix = canmatrix.canmatrix.CanMatrix()
frame = canmatrix.canmatrix.Frame(name="test_frame", size=6, arbitration_id=10)
signal = canmatrix.Signal(name="test_sig", size=40, is_float=True, min="-4.2", max=42, factor="0.123", offset=1)
frame.add_signal(signal)
matrix.add_frame(frame)
out_file = io.BytesIO()
canmatrix.formats.dump(matrix, out_file, "cmjson", jsonNativeTypes=True)
data = json.loads(out_file.getvalue().decode("utf-8"))
assert (data['messages'][0]['signals'][0]['factor'] == 0.123)
assert (data['messages'][0]['signals'][0]['offset'] == 1)

def test_export_all_native():
matrix = canmatrix.canmatrix.CanMatrix()
frame = canmatrix.canmatrix.Frame(name="test_frame", size=6, arbitration_id=10)
signal = canmatrix.Signal(name="test_sig", size=40, is_float=True, min="-4.2", max=42, factor="0.123", offset=1)
frame.add_signal(signal)
matrix.add_frame(frame)
out_file = io.BytesIO()
canmatrix.formats.dump(matrix, out_file, "cmjson", jsonAll=True, jsonNativeTypes=True)
data = json.loads(out_file.getvalue().decode("utf-8"))
assert (data['messages'][0]['signals'][0]['min'] == -4.2)
assert (data['messages'][0]['signals'][0]['max'] == 42)
assert (data['messages'][0]['signals'][0]['factor'] == 0.123)
assert (data['messages'][0]['signals'][0]['offset'] == 1)



0 comments on commit 7fbd7b1

Please sign in to comment.