.. _receiving-can-frame: Receiving CAN frame ======================= In this tutorial we will learn how to receive a CAN frame using neoVI hardware. We are going to assume the script is connected to a HW that receiving CAN frames. 1. Initialize |project| ----------------------- First step we need to initialize a new instance of the :py:class:`vspyx.Core.Application`. .. code:: python import vspyx if 'app' not in globals(): global app app = vspyx.Core.Application.New() app.Initialize(loadAllModules=True) 2. Setup the Hardware --------------------- To use the hardware, first we need to activate it, create a controller and connect the desired hardware channel to the controller. :py:class:`vspyx.VehicleSpy.Module.AddSource()` .. code:: python device = app.VehicleSpy.AddSource("hardware sn") # Activates HW channel = app.Resolver[f'{device.Source.Identifier} {"Channel Name"} Discovery Channel'] Now we need to create a controller and connect it to a channel: :py:class:`vspyx.Communication.Channel.NewAttachedController()` .. code:: python [controller, connector] = channel.NewAttachedController('controller name', listenOnly=False) # creates controller and connects it to HW channel 3. Create a Report ------------------- Next we need to create a function that accesses and logs the incoming CAN traffic :py:class:`vspyx.Communication.DataLinkPDUPoint` .. code:: python def report(point: vspyx.Runtime.Point): if not isinstance(point, vspyx.Communication.DataLinkPDUPoint): return print(f"{point.GetAttribute('ShortName')} {point.GetAttribute('ArbID')}\ {point.GetAttribute('Length')} {point.GetAttribute('Payload')}\ {point.GetAttribute('ChannelName')} {point.GetAttribute('WireType')}\ {point.GetAttribute('DLC')} {point.GetAttribute('Timestamp')}") 4. Go Online with Hardware ----------------------------- We're going to use :py:class:`report` function made in step3 to log and monitor the incoming data. .. code:: python observer = app.VehicleSpy.PrepareForStart(analysisMode=False) observer.OnPoint.Add(report) app.VehicleSpy.Start() app.VehicleSpy.Scheduler.Wait(vspyx.Core.Event()) Complete Example: ----------------- .. code:: python import vspyx hardware_sn = 'icsneo **1' # wildcard to connect to first device channel_name = 'HSCAN' def setup_hw(): device = app.VehicleSpy.AddSource(hardware_sn) #activate hw channel = app.Resolver[f'{device.Source.Identifier} {channel_name} Discovery Channel'] return channel def report(point: vspyx.Runtime.Point): if not isinstance(point, vspyx.Communication.DataLinkPDUPoint): return print(f"{point.GetAttribute('ShortName')} {point.GetAttribute('ArbID')}\ {point.GetAttribute('Length')} {point.GetAttribute('Payload')}\ {point.GetAttribute('ChannelName')} {point.GetAttribute('WireType')}\ {point.GetAttribute('DLC')} {point.GetAttribute('Timestamp')}") def connect_to_controller(channel): [controller, connector] = channel.NewAttachedController('my_setup', listenOnly=False) return controller def go_online(): observer = app.VehicleSpy.PrepareForStart(analysisMode=False) observer.OnPoint.Add(report) app.VehicleSpy.Start() app.VehicleSpy.Scheduler.Wait(vspyx.Core.Event()) def main(): if 'app' not in globals(): global app app = vspyx.Core.Application.New() app.Initialize(loadAllModules=True) print(f'Version: {app.Version}') channel = setup_hw() controller = connect_to_controller(channel) go_online() if __name__ == '__main__': main()