# Monitor a Channel

    """monitor.py -- Print all data received on a CAN channel

    This script uses canlib.canlib to listen on a channel and print all data
    received.

    It requires a CANlib channel with a connected device capable of receiving CAN
    messages and some source of CAN messages.

    The source of the messages may be e.g. the pinger.py example script.

    Also see the dbmonitor.py example script for how to look up the messages
    received in a database.

    """
    import shutil
    import argparse

    from canlib import canlib

    bitrates = {
        '1M': canlib.canBITRATE_1M,
        '500K': canlib.canBITRATE_500K,
        '250K': canlib.canBITRATE_250K,
        '125K': canlib.canBITRATE_125K,
        '100K': canlib.canBITRATE_100K,
        '62K': canlib.canBITRATE_62K,
        '50K': canlib.canBITRATE_50K,
        '83K': canlib.canBITRATE_83K,
        '10K': canlib.canBITRATE_10K,
    }

    def printframe(frame, width):
        form = '═^' + str(width - 1)
        print(format(" Frame received ", form))
        print("id:", frame.id)
        print("data:", bytes(frame.data))
        print("dlc:", frame.dlc)
        print("flags:", frame.flags)
        print("timestamp:", frame.timestamp)

    def monitor_channel(channel_number, bitrate, ticktime):
        ch = canlib.openChannel(channel_number, canlib.canOPEN_ACCEPT_VIRTUAL, bitrate=bitrate)
        ch.setBusOutputControl(canlib.canDRIVER_NORMAL)
        ch.busOn()

        width, height = shutil.get_terminal_size((80, 20))

        timeout = 0.5
        tick_countup = 0
        if ticktime <= 0:
            ticktime = None
        elif ticktime < timeout:
            timeout = ticktime

        print("Listening...")
        while True:
            try:
                frame = ch.read(timeout=int(timeout * 1000))
                printframe(frame, width)
            except canlib.CanNoMsg:
                if ticktime is not None:
                    tick_countup += timeout
                    while tick_countup > ticktime:
                        print("tick")
                        tick_countup -= ticktime
            except KeyboardInterrupt:
                print("Stop.")
                break

    if __name__ == '__main__':
        parser = argparse.ArgumentParser(
            description="Listen on a CAN channel and print all frames received.")
        parser.add_argument('channel', type=int, default=1, nargs='?')
        parser.add_argument('--bitrate', '-b', default='500k', help=(
            "Bitrate, one of " + ', '.join(bitrates.keys())))
        parser.add_argument('--ticktime', '-t', type=float, default=0, help=(
            "If greater than zero, display 'tick' every this many seconds"))
        parser.add_argument
        args = parser.parse_args()

        monitor_channel(args.channel, bitrates[args.bitrate.upper()], args.ticktime)

## Description

Any CAN frames received on the specified channel will be printed. Note that the signals contained in the frame is not be extracted, only the raw data is printed. To extract the signals, see Monitor a Channel Using a Database.

## Sample Output

    Listening...
    ════════════════════════════════════ Frame received ═════════════════════════════════════
    id: 1020
    data: b'\x00'
    flags: MessageFlag.STD
    timestamp: 939214
    ════════════════════════════════════ Frame received ═════════════════════════════════════
    id: 100
    data: b'\xd1\x06\x00\x19\x00\x00\x18\x15'
    flags: MessageFlag.STD
    timestamp: 939215
    ════════════════════════════════════ Frame received ═════════════════════════════════════
    id: 1020
    data: b'\x01'
    flags: MessageFlag.STD
    timestamp: 939417
    ════════════════════════════════════ Frame received ═════════════════════════════════════
    id: 100
    data: b'\x00\x00\x00\x19\x00\x00\xc82'
    flags: MessageFlag.STD
    timestamp: 939418
    ════════════════════════════════════ Frame received ═════════════════════════════════════
    id: 1020
    data: b'\x00'
    flags: MessageFlag.STD
    timestamp: 939620
    ════════════════════════════════════ Frame received ═════════════════════════════════════
    id: 100
    data: b'\x00\x00\x00\x00\x00\x00\x903'
    flags: MessageFlag.STD
    timestamp: 939621
    ════════════════════════════════════ Frame received ═════════════════════════════════════
    id: 1020
    data: b'@'
    flags: MessageFlag.STD
    timestamp: 939823
    ════════════════════════════════════ Frame received ═════════════════════════════════════
    id: 100
    data: b')\x03\x17\xf5\x00\x00\x00\x00'
    flags: MessageFlag.STD
    timestamp: 939824
    ════════════════════════════════════ Frame received ═════════════════════════════════════
    id: 1020
    data: b'\x02'
    flags: MessageFlag.STD
    timestamp: 940026
    ════════════════════════════════════ Frame received ═════════════════════════════════════
    id: 100
    data: b'\x1b\x0eC\x00\x00\x00\x00\x00'
    flags: MessageFlag.STD
    timestamp: 940027