Python Examples for RAD-Epsilon Devices

Working with PHY Settings

import sys
import icsneopy


class PhyStaticInfo:

    def __init__(self, index, type, switch_port):
        self.index = index
        self.type = type
        self.switch_port = switch_port

    def __repr__(self):
        return f"{self.switch_port}: Type {self.type} / Index {self.index}"


# Switch Port name to PHY index and PHY type
RAD_EPSILON_PHY_INFO = {
    "1": PhyStaticInfo(0, "88Q2112", "1"),
    "2": PhyStaticInfo(1, "88Q2112", "2"),
    "3": PhyStaticInfo(2, "88Q2112", "3"),
    "4": PhyStaticInfo(3, "88Q2112", "4"),
    "5": PhyStaticInfo(4, "88Q2112", "5"),
    "6": PhyStaticInfo(5, "88Q2112", "6"),
    "9": PhyStaticInfo(6, "88Q2112", "9"),
    "10": PhyStaticInfo(7, "88Q2112", "10")
}

RAD_EPSILON_XL_PHY_INFO = {
    "A1": PhyStaticInfo(0, "88Q222x", "A1"),
    "A2": PhyStaticInfo(1, "88Q222x", "A2"),
    "A3": PhyStaticInfo(2, "88Q222x", "A3"),
    "A4": PhyStaticInfo(3, "88Q222x", "A4"),
    "A5": PhyStaticInfo(4, "88Q222x", "A5"),
    "A6": PhyStaticInfo(5, "88Q222x", "A6"),
    "A11": PhyStaticInfo(6, "88Q222x", "A11"),
    "A8": PhyStaticInfo(7, "88Q222x", "A8"),
    "B1": PhyStaticInfo(8, "88Q222x", "B1"),
    "B2": PhyStaticInfo(9, "88Q222x", "B2"),
    "B3": PhyStaticInfo(10, "88Q222x", "B3"),
    "B4": PhyStaticInfo(11, "88Q222x", "B4"),
    "B5": PhyStaticInfo(12, "88Q222x", "B5"),
    "B6": PhyStaticInfo(13, "88Q222x", "B6"),
    "B7": PhyStaticInfo(14, "88Q222x", "B7"),
    "B8": PhyStaticInfo(15, "88Q222x", "B8"),
    "A9": PhyStaticInfo(16, "88X3310", "A9"),
    "B9": PhyStaticInfo(17, "88X3310", "B9"),
}


def find_specific_device(type: icsneopy.DeviceType.Enum, serial: str | None = None) -> icsneopy.Device | None:
    devices = icsneopy.find_all_devices()
    for device in devices:
        device_type = device.get_type().get_device_type()
        if serial: # always find by serial if specified
            if device.get_serial() == serial:
                return device
        elif device_type == type:
            return device
    return None


def find_rad_epsilonxl(serial: str | None = None) -> icsneopy.Device | None:
    return find_specific_device(icsneopy.DeviceType.Enum.RADEpsilonXL, serial)


def find_rad_epsilon(serial: str | None = None) -> icsneopy.Device | None:
    return find_specific_device(icsneopy.DeviceType.Enum.RADEpsilon, serial)


def report_phy_settings(device: icsneopy.Device, phy: PhyStaticInfo) -> bool:
    phy_enable = device.settings.get_phy_enable(phy.index)
    phy_mode = device.settings.get_phy_mode(phy.index)
    phy_speed = device.settings.get_phy_speed(phy.index)
    if phy_enable is None or phy_mode is None or phy_speed is None:
        print(f"failed to get settings for PHY{phy.index} on port {phy.switch_port}")
    print(f"PHY {phy.index} ({phy.type})")
    print(f"\tPort: {phy.switch_port}")
    print(f"\tEnabled: {'TRUE' if phy_enable else 'FALSE'}")
    print(f"\tMode: {phy_mode}")
    print(f"\tSpeed: {phy_speed}")
    return True

def configure_phy(device: icsneopy.Device, phy: PhyStaticInfo, enable: bool, mode: int, speed: int) -> bool:
    if not device.settings.set_phy_enable(phy.index, enable):
        print(f"failed to set enable for PHY{phy.index} at port {phy.switch_port}")
        return False
    if not device.settings.set_phy_mode(phy.index, mode):
        print(f"failed to set mode for PHY{phy.index} at port {phy.switch_port}")
        return False
    if not device.settings.set_phy_speed(phy.index, speed):
        print(f"failed to set speed for PHY{phy.index} at port {phy.switch_port}")
        return False
    if not device.settings.apply(True):
        print(f"failed to apply settings")
        print(icsneopy.get_last_error())
        return False
    print(f"Successfully set settings for PHY{phy.index} at port {phy.switch_port}")
    return True


# find the first RAD-EpsilonXL
device = find_rad_epsilonxl()
if not device:
    print("failed to find a RAD-EpsilonXL to open")
    sys.exit(-1)
if not device.open():
    print(f"Failed to open {device.describe()}")
    print(icsneopy.get_last_error())
    sys.exit(-1)
print(f"Opened {device.describe()}")
print("Applying default settings")
if not device.settings.apply_defaults():
    print(icsneopy.get_last_error())
    sys.exit(-1)
print("Reporting PHY settings")
for phy in RAD_EPSILON_XL_PHY_INFO.values():
    report_phy_settings(device, phy)
# Setting Port A1 to Master mode, enabled, 1G speed
phy = RAD_EPSILON_XL_PHY_INFO["A1"]
if configure_phy(device, phy, True, icsneopy.Settings.EthernetLinkMode.Master, icsneopy.Settings.EthernetLinkSpeed.Speed1G) and device.settings.refresh(True):
    report_phy_settings(device, phy) # report them back
else:
    print(icsneopy.get_last_error())
    sys.exit(-1)
device.close()