tools/cansim/cansim.py (61 lines of code) (raw):
#!/usr/bin/env python3
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
import argparse
import datetime
import time
import canigen
parser = argparse.ArgumentParser(
description="Generates SocketCAN messages for AWS IoT FleetWise demo"
)
parser.add_argument("-i", "--interface", default="vcan0", help="CAN interface, e.g. vcan0")
parser.add_argument("-o", "--only-obd", action="store_true", help="Only generate OBD messages")
args = parser.parse_args()
can_sim = canigen.Canigen(
interface=args.interface,
database_filename=None if args.only_obd else "hscan.dbc",
obd_config_filename="obd_config.json",
)
NETWORK_TYPE = "NetworkType"
BRAKE_PRESSURE_SIGNAL = "DemoBrakePedalPressure"
ENGINE_TORQUE_SIGNAL = "DemoEngineTorque"
SPEED_SIGNAL = "DemoSpeed"
VOLTAGE_SIGNAL = "DemoVoltage"
def set_with_print(func, name, val):
print(str(datetime.datetime.now()), f"Set {name} to {val}")
func(name, val)
def set_multiple_arguments_with_print(func, name, val1, val2):
print(str(datetime.datetime.now()), f"Set {name} to {val1}: {val2}")
func(name, val1, val2)
try:
while True:
set_with_print(can_sim.set_sig, BRAKE_PRESSURE_SIGNAL, 0)
for i in range(1, 11):
set_with_print(can_sim.set_pid, "ENGINE_SPEED", 1000 + i * 100)
set_with_print(can_sim.set_pid, "VEHICLE_SPEED", i * 10)
set_with_print(can_sim.set_pid, "FUEL_TANK_LEVEL", 100 - i)
set_with_print(can_sim.set_pid, "AMBIENT_AIR_TEMPERATURE", 20 + i)
set_with_print(can_sim.set_pid, "ENGINE_COOLANT_TEMPERATURE", 80 + i)
set_with_print(can_sim.set_pid, "THROTTLE_POSITION", (i % 4) * 100)
set_with_print(can_sim.set_dtc, "ECM_DTC1", i / 5 >= 1)
set_with_print(can_sim.set_dtc, "ECM_DTC3", 0xAF)
set_multiple_arguments_with_print(
can_sim.set_dtc_snapshot, "ECM_DTC3", 1, ["0x01", "0xAA", "0xBB", hex(i)]
)
set_multiple_arguments_with_print(
can_sim.set_dtc_ext_data, "ECM_DTC3", 1, ["0x01", "0xCC", "0xDD", hex(i * 2)]
)
time.sleep(5)
if i < 6 or i > 9:
# trigger is > 7000 so trigger
set_with_print(can_sim.set_sig, BRAKE_PRESSURE_SIGNAL, 8000)
set_with_print(can_sim.set_sig, ENGINE_TORQUE_SIGNAL, i * 100)
set_with_print(can_sim.set_sig, SPEED_SIGNAL, (i * 10) + (1 / i))
set_with_print(can_sim.set_sig, VOLTAGE_SIGNAL, (i * 7) + (2 / i))
time.sleep(0.5)
set_with_print(can_sim.set_sig, BRAKE_PRESSURE_SIGNAL, i * 200)
if i % 4 < 2: # change network type every 10 seconds
set_with_print(can_sim.set_sig, NETWORK_TYPE, 0)
else:
set_with_print(can_sim.set_sig, NETWORK_TYPE, 1)
except KeyboardInterrupt:
print("Stopping...")
can_sim.stop()
except Exception:
raise