ExamplesΒΆ
Below is a simple example that logs all messages to and from a specified ECU.
import time
import logging
import neovi.neodevice as neodevice
import neovi.neovi as neovi
from neovi.structures import format_array, get_status_bits_set
TARGET_ECU = 0x456
def log_messages(result, msgs, errors):
# result is -1 on success, the value returned by icsneoGetLastAPIError otherwise.
# (See http://www.intrepidcs.com/support/ICSDocumentation/neoVIDLL/apiErrorMessages.htm)
# msgs is an array of icsSpyMessage.
# (See structures.py)
# errors is an array of c_int.
# (See link as per meaning of "result")
for msg in msgs:
if msg.ArbIDOrHeader in [TARGET_ECU, TARGET_ECU + 8]:
logging.debug('ArbIDOrHeader = %X, number data bytes = %X' % (msg.ArbIDOrHeader, msg.NumberBytesData))
logging.debug('Data = %s' % format_array(msg.Data))
logging.debug('Ack = %s' % format_array(msg.AckBytes))
logging.debug('Value = %f, misc data = %X' % (msg.Value, msg.MiscData))
stat, stat2 = get_status_bits_set(msg)
stat = stat + stat2
for i in range(0, len(stat), 3):
stats = stat[i:i+3]
logging.debug('%s' % ', '.join(stats))
logging.debug('')
# The below assumes the first device is the one you want, which will be true
# if there's only one attached.
neodevice.init_api()
dev = neodevice.find_devices(neovi.NEODEVICE_FIRE)[0]
dev.open()
dev.subscribe_to_all(log_messages)
# Quick hack to wait until the user hits Ctrl+C
try:
while 1:
time.sleep(1)
except KeyboardInterrupt:
pass
dev.close()
Below is an example of a simple network specification. Only the medium speed CAN bus is defined and only a single ECU is associated with that network. The ECU provides four identifiers, each made up of a single signal.
from neovi.spec import *
from neovi.neovi import NETID_MSCAN, BitRate
import json
networks = {NETID_MSCAN: {'bitrate': BitRate.BR_125000}}
hvac_ecu = ECU(NETID_MSCAN, 0x456, 'HVAC')
hvac_identifiers = [
Identifier('Blower Speed Output', 0x9601, [Signal(units='%', m=100./255.)], IOType.ReadWrite),
Identifier('External Ambient Temperature', 0x9628, [Signal(units='Deg C', m=0.25)], IOType.ReadWrite),
Identifier('Left Solar Radiation Sensor', 0x9734, [Signal(units='W', m=10, max_val=1250)]),
Identifier('Cabin Temperature', 0x97A5, [Signal(units='Deg C', length=16, m=0.01, b=-100, min_val=-50, max_val=100)]),
]
ECUs = {
'HVAC': {'ecu': hvac_ecu, 'identifiers': hvac_identifiers}
}
output_file = open('vehicle.spec', 'wt')
json.dump({'networks': networks, 'ECUs': ECUs}, output_file, cls=PyNeoViJSONEncoder)
output_file.close()
Below is an example of reading values from an ECU. Note that it requires a network spec such as the one created above.
import neovi.neodevice as neodevice
import neovi.ecu as ecu
import neovi.spec as spec
import neovi.neovi as neovi
import json
neodevice.init_api()
dev = neodevice.find_devices(neovi.NEODEVICE_FIRE)[0]
dev.open()
input_file = open('vehicle.spec', 'rt')
data = json.load(input_file, object_hook=spec.from_json)
hvac = ecu.ECU(data['ECUs']['HVAC'], dev)
wanted_values = ['Blower Speed Output', 'External Ambient Temperature', 'Left Solar Radiation Sensor', 'Cabin Temperature']
for value_name in wanted_values:
result = hvac.read_data_by_id(value_name)['value']
print("%s = %.1f %s" % (value_name, result[0], result[1]))
dev.close()