# Time Domain

## Resetting device clocks

When a group of channels are added to a Time Domain, their clocks can be reset through a call to `reset_time`. This function does not require MagiSync support.

Resetting device clocks:

    from canlib import canlib, Frame

    ch_tx = canlib.openChannel(0)
    ch_rx1 = canlib.openChannel(1)
    ch_rx2 = canlib.openChannel(2)

    domain = canlib.TimeDomain()
    domain.add_channel(ch_rx1)
    domain.add_channel(ch_rx2)

    ch_tx.busOn()
    ch_rx1.busOn()
    ch_rx2.busOn()

    ch_tx.write(Frame(id_=11, data=b''))
    frame1 = ch_rx1.read(timeout=100)
    frame2 = ch_rx2.read(timeout=100)

    print(f"Timestamps, no reset:   {frame1.timestamp=}, {frame2.timestamp=}")

    domain.add_channel(ch_rx1)
    domain.add_channel(ch_rx2)
    domain.reset_time()

    ch_tx.write(Frame(id_=11, data=b''))
    frame1 = ch_rx1.read(timeout=100)
    frame2 = ch_rx2.read(timeout=100)

    print(f"Timestamps, with reset: {frame1.timestamp=}, {frame2.timestamp=}")

Output:

    Timestamps, no reset:   frame1.timestamp=75254, frame2.timestamp=72253
    Timestamps, with reset: frame1.timestamp=0, frame2.timestamp=0

## Checking MagiSync info

Some devices have MagiSync support and channels may end up in MagiSync groups depending on how their USBs are connected. For grouped channels, the clocks will run at the same speed. To check grouping and support, `canlib.canlib.TimeDomain.get_data` can be used. It will return an object of `canlib.canlib.TimeDomainData`.

Printing time domain data:

    from canlib import canlib, Frame

    ch0 = canlib.openChannel(0) # Leaf Light v2
    ch1 = canlib.openChannel(1) # UsbCan pro 2xHS v2
    ch2 = canlib.openChannel(2) # UsbCan pro 2xHS v2

    domain = canlib.TimeDomain()
    domain.add_channel(ch0)
    domain.add_channel(ch1)
    domain.add_channel(ch2)

    data = domain.get_data()
    print(data)

Output:

    sync_groups: 1, synced_members: 2, non_sync_cards: 1, non_synced_members: 1

In this case, `ch1` and `ch2` were from a device with MagiSync support, listed under `synced_members`. However, `ch0` did not have MagiSync support and was therefore listed under `non_synced_members`. The synced members were connected to the same USB-hub and ended up in the same MagiSync group. The non-synced member was from a device with only 1 channel.