#!/usr/bin/env python3

HOME_PATH = "./"
CACHE_PATH = "/var/cache/obmc/"
FLASH_DOWNLOAD_PATH = "/tmp"
GPIO_BASE = 320
SYSTEM_NAME = "Palmetto"


# System states
# state can change to next state in 2 ways:
# - a process emits a GotoSystemState signal with state name to goto
# - objects specified in EXIT_STATE_DEPEND have started
SYSTEM_STATES = [
    "BASE_APPS",
    "BMC_STARTING",
    "BMC_READY",
    "HOST_POWERING_ON",
    "HOST_POWERED_ON",
    "HOST_BOOTING",
    "HOST_BOOTED",
    "HOST_POWERED_OFF",
]

EXIT_STATE_DEPEND = {
    "BASE_APPS": {
        "/org/openbmc/sensors": 0,
    },
    "BMC_STARTING": {
        "/org/openbmc/control/chassis0": 0,
        "/org/openbmc/control/power0": 0,
        "/org/openbmc/control/led/identify": 0,
        "/org/openbmc/control/host0": 0,
        "/org/openbmc/control/flash/bios": 0,
    },
}

# method will be called when state is entered
ENTER_STATE_CALLBACK = {
    "HOST_POWERED_ON": {
        "boot": {
            "bus_name": "org.openbmc.control.Host",
            "obj_name": "/org/openbmc/control/host0",
            "interface_name": "org.openbmc.control.Host",
        }
    },
    "BMC_READY": {
        "setOn": {
            "bus_name": "org.openbmc.control.led",
            "obj_name": "/org/openbmc/control/led/identify",
            "interface_name": "org.openbmc.Led",
        },
        "init": {
            "bus_name": "org.openbmc.control.Flash",
            "obj_name": "/org/openbmc/control/flash/bios",
            "interface_name": "org.openbmc.Flash",
        },
    },
}

APPS = {
    "startup_hacks": {
        "system_state": "BASE_APPS",
        "start_process": True,
        "monitor_process": False,
        "process_name": "startup_hacks.sh",
    },
    "inventory": {
        "system_state": "BMC_STARTING",
        "start_process": True,
        "monitor_process": True,
        "process_name": "inventory_items.py",
        "args": [SYSTEM_NAME],
    },
    "pcie_present": {
        "system_state": "HOST_POWERED_ON",
        "start_process": False,
        "monitor_process": False,
        "process_name": "pcie_slot_present.exe",
    },
    "virtual_sensors": {
        "system_state": "BMC_STARTING",
        "start_process": True,
        "monitor_process": True,
        "process_name": "hwmon.py",
        "args": [SYSTEM_NAME],
    },
    "sensor_manager": {
        "system_state": "BASE_APPS",
        "start_process": True,
        "monitor_process": True,
        "process_name": "sensor_manager2.py",
        "args": [SYSTEM_NAME],
    },
    "host_watchdog": {
        "system_state": "BMC_STARTING",
        "start_process": True,
        "monitor_process": True,
        "process_name": "host_watchdog.exe",
    },
    "power_control": {
        "system_state": "BMC_STARTING",
        "start_process": True,
        "monitor_process": True,
        "process_name": "power_control.exe",
        "args": ["3000", "10"],
    },
    "power_button": {
        "system_state": "BMC_STARTING",
        "start_process": False,
        "monitor_process": False,
        "process_name": "button_power.exe",
    },
    "led_control": {
        "system_state": "BMC_STARTING",
        "start_process": True,
        "monitor_process": True,
        "process_name": "led_controller.exe",
    },
    "flash_control": {
        "system_state": "BMC_STARTING",
        "start_process": True,
        "monitor_process": True,
        "process_name": "flash_bios.exe",
    },
    "bmc_flash_control": {
        "system_state": "BMC_STARTING",
        "start_process": True,
        "monitor_process": True,
        "process_name": "bmc_update.py",
    },
    "download_manager": {
        "system_state": "BMC_STARTING",
        "start_process": True,
        "monitor_process": True,
        "process_name": "download_manager.py",
        "args": [SYSTEM_NAME],
    },
    "host_control": {
        "system_state": "BMC_STARTING",
        "start_process": True,
        "monitor_process": True,
        "process_name": "control_host.exe",
    },
    "chassis_control": {
        "system_state": "BMC_STARTING",
        "start_process": True,
        "monitor_process": True,
        "process_name": "chassis_control.py",
    },
    "bmc_control": {
        "system_state": "BMC_STARTING",
        "start_process": True,
        "monitor_process": True,
        "process_name": "control_bmc.exe",
    },
}

CACHED_INTERFACES = {
    "org.openbmc.InventoryItem": True,
    "org.openbmc.control.Chassis": True,
}
INVENTORY_ROOT = "/org/openbmc/inventory"

FRU_INSTANCES = {
    "<inventory_root>/system": {
        "fru_type": "SYSTEM",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis": {
        "fru_type": "SYSTEM",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis/motherboard": {
        "fru_type": "MAIN_PLANAR",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis/fan0": {
        "fru_type": "FAN",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis/fan1": {
        "fru_type": "FAN",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis/fan2": {
        "fru_type": "FAN",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis/fan3": {
        "fru_type": "FAN",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis/fan4": {
        "fru_type": "FAN",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis/motherboard/bmc": {
        "fru_type": "BMC",
        "is_fru": False,
        "manufacturer": "ASPEED",
    },
    "<inventory_root>/system/chassis/motherboard/cpu": {
        "fru_type": "CPU",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis/motherboard/cpu/core0": {
        "fru_type": "CORE",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/cpu/core1": {
        "fru_type": "CORE",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/cpu/core2": {
        "fru_type": "CORE",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/cpu/core3": {
        "fru_type": "CORE",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/cpu/core4": {
        "fru_type": "CORE",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/cpu/core5": {
        "fru_type": "CORE",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/cpu/core6": {
        "fru_type": "CORE",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/cpu/core7": {
        "fru_type": "CORE",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/cpu/core8": {
        "fru_type": "CORE",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/cpu/core9": {
        "fru_type": "CORE",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/cpu/core10": {
        "fru_type": "CORE",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/cpu/core11": {
        "fru_type": "CORE",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/membuf": {
        "fru_type": "MEMORY_BUFFER",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/dimm0": {
        "fru_type": "DIMM",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis/motherboard/dimm1": {
        "fru_type": "DIMM",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis/motherboard/dimm2": {
        "fru_type": "DIMM",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis/motherboard/dimm3": {
        "fru_type": "DIMM",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis/io_board/pcie_slot0": {
        "fru_type": "PCIE_CARD",
        "is_fru": True,
    },
    "<inventory_root>/system/chassis/io_board/pcie_slot1": {
        "fru_type": "PCIE_CARD",
        "is_fru": True,
    },
    "<inventory_root>/system/systemevent": {
        "fru_type": "SYSTEM_EVENT",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/refclock": {
        "fru_type": "MAIN_PLANAR",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/pcieclock": {
        "fru_type": "MAIN_PLANAR",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/todclock": {
        "fru_type": "MAIN_PLANAR",
        "is_fru": False,
    },
    "<inventory_root>/system/chassis/motherboard/apss": {
        "fru_type": "MAIN_PLANAR",
        "is_fru": False,
    },
}

ID_LOOKUP = {
    "FRU": {
        0x0D: "<inventory_root>/system/chassis",
        0x34: "<inventory_root>/system/chassis/motherboard",
        0x01: "<inventory_root>/system/chassis/motherboard/cpu",
        0x02: "<inventory_root>/system/chassis/motherboard/membuf",
        0x03: "<inventory_root>/system/chassis/motherboard/dimm0",
        0x04: "<inventory_root>/system/chassis/motherboard/dimm1",
        0x05: "<inventory_root>/system/chassis/motherboard/dimm2",
        0x06: "<inventory_root>/system/chassis/motherboard/dimm3",
        0x35: "<inventory_root>/system",
    },
    "FRU_STR": {
        "PRODUCT_15": "<inventory_root>/system",
        "CHASSIS_2": "<inventory_root>/system/chassis",
        "BOARD_1": "<inventory_root>/system/chassis/motherboard/cpu",
        "BOARD_2": "<inventory_root>/system/chassis/motherboard/membuf",
        "BOARD_14": "<inventory_root>/system/chassis/motherboard",
        "PRODUCT_3": "<inventory_root>/system/chassis/motherboard/dimm0",
        "PRODUCT_4": "<inventory_root>/system/chassis/motherboard/dimm1",
        "PRODUCT_5": "<inventory_root>/system/chassis/motherboard/dimm2",
        "PRODUCT_6": "<inventory_root>/system/chassis/motherboard/dimm3",
    },
    "SENSOR": {
        0x34: "<inventory_root>/system/chassis/motherboard",
        0x37: "<inventory_root>/system/chassis/motherboard/refclock",
        0x38: "<inventory_root>/system/chassis/motherboard/pcieclock",
        0x39: "<inventory_root>/system/chassis/motherboard/todclock",
        0x3A: "<inventory_root>/system/chassis/apss",
        0x2F: "<inventory_root>/system/chassis/motherboard/cpu",
        0x22: "<inventory_root>/system/chassis/motherboard/cpu/core1",
        0x23: "<inventory_root>/system/chassis/motherboard/cpu/core2",
        0x24: "<inventory_root>/system/chassis/motherboard/cpu/core3",
        0x25: "<inventory_root>/system/chassis/motherboard/cpu/core4",
        0x26: "<inventory_root>/system/chassis/motherboard/cpu/core5",
        0x27: "<inventory_root>/system/chassis/motherboard/cpu/core6",
        0x28: "<inventory_root>/system/chassis/motherboard/cpu/core9",
        0x29: "<inventory_root>/system/chassis/motherboard/cpu/core10",
        0x2A: "<inventory_root>/system/chassis/motherboard/cpu/core11",
        0x2B: "<inventory_root>/system/chassis/motherboard/cpu/core12",
        0x2C: "<inventory_root>/system/chassis/motherboard/cpu/core13",
        0x2D: "<inventory_root>/system/chassis/motherboard/cpu/core14",
        0x2E: "<inventory_root>/system/chassis/motherboard/membuf",
        0x1E: "<inventory_root>/system/chassis/motherboard/dimm0",
        0x1F: "<inventory_root>/system/chassis/motherboard/dimm1",
        0x20: "<inventory_root>/system/chassis/motherboard/dimm2",
        0x21: "<inventory_root>/system/chassis/motherboard/dimm3",
        0x09: "/org/openbmc/sensors/host/BootCount",
        0x05: "/org/openbmc/sensors/host/BootProgress",
        0x08: "/org/openbmc/sensors/host/cpu0/OccStatus",
        0x32: "/org/openbmc/sensors/host/OperatingSystemStatus",
        0x33: "/org/openbmc/sensors/host/PowerCap",
    },
    "GPIO_PRESENT": {
        "SLOT0_PRESENT": "<inventory_root>/system/chassis/io_board/pcie_slot0",
        "SLOT1_PRESENT": "<inventory_root>/system/chassis/io_board/pcie_slot1",
    },
}

GPIO_CONFIG = {}
GPIO_CONFIG["FSI_CLK"] = {"gpio_pin": "A4", "direction": "out"}
GPIO_CONFIG["FSI_DATA"] = {"gpio_pin": "A5", "direction": "out"}
GPIO_CONFIG["FSI_ENABLE"] = {"gpio_pin": "D0", "direction": "out"}
GPIO_CONFIG["POWER_PIN"] = {"gpio_pin": "E1", "direction": "out"}
GPIO_CONFIG["CRONUS_SEL"] = {"gpio_pin": "A6", "direction": "out"}
GPIO_CONFIG["PGOOD"] = {"gpio_pin": "C7", "direction": "in"}
GPIO_CONFIG["BMC_THROTTLE"] = {"gpio_pin": "J3", "direction": "out"}
GPIO_CONFIG["IDBTN"] = {"gpio_pin": "Q7", "direction": "out"}
GPIO_CONFIG["POWER_BUTTON"] = {"gpio_pin": "E0", "direction": "both"}
GPIO_CONFIG["PCIE_RESET"] = {"gpio_pin": "B5", "direction": "out"}
GPIO_CONFIG["USB_RESET"] = {"gpio_pin": "B6", "direction": "out"}
GPIO_CONFIG["SLOT0_RISER_PRESENT"] = {"gpio_pin": "N0", "direction": "in"}
GPIO_CONFIG["SLOT1_RISER_PRESENT"] = {"gpio_pin": "N1", "direction": "in"}
GPIO_CONFIG["SLOT2_RISER_PRESENT"] = {"gpio_pin": "N2", "direction": "in"}
GPIO_CONFIG["SLOT0_PRESENT"] = {"gpio_pin": "N3", "direction": "in"}
GPIO_CONFIG["SLOT1_PRESENT"] = {"gpio_pin": "N4", "direction": "in"}
GPIO_CONFIG["SLOT2_PRESENT"] = {"gpio_pin": "N5", "direction": "in"}
GPIO_CONFIG["MEZZ0_PRESENT"] = {"gpio_pin": "O0", "direction": "in"}
GPIO_CONFIG["MEZZ1_PRESENT"] = {"gpio_pin": "O1", "direction": "in"}


def convertGpio(name):
    name = name.upper()
    c = name[0:1]
    offset = int(name[1:])
    a = ord(c) - 65
    base = a * 8 + GPIO_BASE
    return base + offset


HWMON_CONFIG = {
    "2-004c": {
        "names": {
            "temp1_input": {
                "object_path": "temperature/ambient",
                "poll_interval": 5000,
                "scale": 1000,
                "units": "C",
            },
        }
    },
    "3-0050": {
        "names": {
            "caps_curr_powercap": {
                "object_path": "powercap/curr_cap",
                "poll_interval": 10000,
                "scale": 1,
                "units": "W",
            },
            "caps_curr_powerreading": {
                "object_path": "powercap/system_power",
                "poll_interval": 10000,
                "scale": 1,
                "units": "W",
            },
            "caps_max_powercap": {
                "object_path": "powercap/max_cap",
                "poll_interval": 10000,
                "scale": 1,
                "units": "W",
            },
            "caps_min_powercap": {
                "object_path": "powercap/min_cap",
                "poll_interval": 10000,
                "scale": 1,
                "units": "W",
            },
            "caps_norm_powercap": {
                "object_path": "powercap/n_cap",
                "poll_interval": 10000,
                "scale": 1,
                "units": "W",
            },
            "caps_user_powerlimit": {
                "object_path": "powercap/user_cap",
                "poll_interval": 10000,
                "scale": 1,
                "units": "W",
            },
        }
    },
}

# Miscellaneous non-poll sensor with system specific properties.
# The sensor id is the same as those defined in ID_LOOKUP['SENSOR'].
MISC_SENSORS = {
    0x09: {"class": "BootCountSensor"},
    0x05: {"class": "BootProgressSensor"},
    0x08: {
        "class": "OccStatusSensor",
        "os_path": "/sys/class/i2c-adapter/i2c-3/3-0050/online",
    },
    0x32: {"class": "OperatingSystemStatusSensor"},
    0x33: {
        "class": "PowerCap",
        "os_path": "/sys/class/hwmon/hwmon1/user_powercap",
    },
}