152 lines
4.3 KiB
Python
152 lines
4.3 KiB
Python
import icsneopy
|
|
|
|
GPTP_PORT_MAP = {
|
|
icsneopy.Network.NetID.AE_01: (1, "AE 01"),
|
|
icsneopy.Network.NetID.AE_02: (2, "AE 02"),
|
|
icsneopy.Network.NetID.AE_03: (3, "AE 03"),
|
|
icsneopy.Network.NetID.AE_04: (4, "AE 04"),
|
|
icsneopy.Network.NetID.AE_05: (5, "AE 05"),
|
|
icsneopy.Network.NetID.AE_06: (6, "AE 06"),
|
|
icsneopy.Network.NetID.AE_07: (7, "AE 07"),
|
|
icsneopy.Network.NetID.AE_08: (8, "AE 08"),
|
|
icsneopy.Network.NetID.AE_09: (9, "AE 09"),
|
|
icsneopy.Network.NetID.AE_10: (10, "AE 10"),
|
|
icsneopy.Network.NetID.AE_11: (11, "AE 11"),
|
|
icsneopy.Network.NetID.AE_12: (12, "AE 12"),
|
|
icsneopy.Network.NetID.ETHERNET_01: (13, "Ethernet 01"),
|
|
icsneopy.Network.NetID.ETHERNET_02: (14, "Ethernet 02"),
|
|
icsneopy.Network.NetID.ETHERNET_03: (15, "Ethernet 03"),
|
|
icsneopy.Network.NetID.AE_13: (16, "AE 13"),
|
|
icsneopy.Network.NetID.AE_14: (17, "AE 14"),
|
|
icsneopy.Network.NetID.AE_15: (18, "AE 15"),
|
|
icsneopy.Network.NetID.AE_16: (19, "AE 16"),
|
|
}
|
|
|
|
PROFILE_NAMES = {
|
|
icsneopy.Settings.GTPPProfile.Standard: "Standard",
|
|
icsneopy.Settings.GTPPProfile.Automotive: "Automotive",
|
|
}
|
|
|
|
ROLE_NAMES = {
|
|
icsneopy.Settings.GTPPRole.Disabled: "Disabled",
|
|
icsneopy.Settings.GTPPRole.Passive: "Passive",
|
|
icsneopy.Settings.GTPPRole.Master: "Master",
|
|
icsneopy.Settings.GTPPRole.Slave: "Slave",
|
|
}
|
|
|
|
|
|
def prompt_int(prompt, default, lo, hi):
|
|
try:
|
|
raw = input(f"{prompt} [{default}]: ").strip()
|
|
if not raw:
|
|
return default
|
|
val = int(raw)
|
|
if lo <= val <= hi:
|
|
return val
|
|
except (ValueError, EOFError):
|
|
pass
|
|
print(f"Invalid input, using {default}.")
|
|
return default
|
|
|
|
|
|
def gptp_ports(device):
|
|
ports = []
|
|
for net in device.get_supported_tx_networks():
|
|
entry = GPTP_PORT_MAP.get(net.get_net_id())
|
|
if entry:
|
|
ports.append(entry)
|
|
return sorted(ports)
|
|
|
|
|
|
def print_settings(device):
|
|
s = device.settings
|
|
profile = s.get_gptp_profile()
|
|
role = s.get_gptp_role()
|
|
port = s.get_gptp_enabled_port()
|
|
synton = s.is_gptp_clock_syntonization_enabled()
|
|
|
|
print("\nCurrent gPTP settings:")
|
|
if profile is not None:
|
|
print(f" Profile: {PROFILE_NAMES.get(profile, profile)}")
|
|
if role is not None:
|
|
print(f" Role: {ROLE_NAMES.get(role, role)}")
|
|
if port is not None:
|
|
suffix = " (disabled)" if port == 0 else ""
|
|
print(f" Enabled port: {port}{suffix}")
|
|
if synton is not None:
|
|
print(f" Clock syntonization: {'enabled' if synton else 'disabled'}")
|
|
|
|
|
|
def configure(device):
|
|
if not device.settings.refresh():
|
|
print("error: failed to refresh settings")
|
|
return False
|
|
|
|
print_settings(device)
|
|
|
|
ports = gptp_ports(device)
|
|
print("\nAvailable gPTP ports (0 = disabled):")
|
|
print(" [0] Disabled")
|
|
for idx, name in ports:
|
|
print(f" [{idx}] {name}")
|
|
|
|
print("\nConfigure gPTP:")
|
|
profile = prompt_int(" Profile (0=Standard, 1=Automotive)", 1, 0, 1)
|
|
role = prompt_int(" Role (0=Disabled, 1=Passive, 2=Master, 3=Slave)", 3, 0, 3)
|
|
port = prompt_int(" Enabled port index", 0, 0, 19)
|
|
synton = prompt_int(" Clock syntonization (0=disabled, 1=enabled)", 0, 0, 1)
|
|
permanent = prompt_int("\nSave to EEPROM? (0=temporary, 1=permanent)", 0, 0, 1)
|
|
|
|
s = device.settings
|
|
profile_enum = list(PROFILE_NAMES.keys())[profile]
|
|
role_enum = list(ROLE_NAMES.keys())[role]
|
|
|
|
s.set_gptp_profile(profile_enum)
|
|
s.set_gptp_role(role_enum)
|
|
s.set_gptp_enabled_port(port)
|
|
s.set_gptp_clock_syntonization_enabled(bool(synton))
|
|
|
|
if not s.apply(not permanent):
|
|
print("error: failed to apply settings")
|
|
return False
|
|
|
|
print_settings(device)
|
|
return True
|
|
|
|
|
|
def main():
|
|
devices = icsneopy.find_all_devices()
|
|
if not devices:
|
|
print("error: no devices found")
|
|
return 1
|
|
|
|
gptp_devices = [d for d in devices if d.settings.get_gptp_profile() is not None]
|
|
if not gptp_devices:
|
|
print("error: no gPTP-capable devices found")
|
|
return 1
|
|
|
|
print("Available gPTP-capable devices:")
|
|
for i, d in enumerate(gptp_devices, 1):
|
|
print(f" [{i}] {d}")
|
|
|
|
choice = prompt_int("Select device", 1, 1, len(gptp_devices))
|
|
device = gptp_devices[choice - 1]
|
|
|
|
print(f"\nOpening {device}... ", end="", flush=True)
|
|
if not device.open():
|
|
print("failed")
|
|
return 1
|
|
print("OK")
|
|
|
|
try:
|
|
ok = configure(device)
|
|
finally:
|
|
print(f"\nClosing {device}")
|
|
device.close()
|
|
|
|
return 0 if ok else 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|