xref: /openbmc/phosphor-led-manager/scripts/parse_led.py (revision fccfac90b07bc6e4ec25f3a8dc8a1a507c307dbf)
1#!/usr/bin/env python3
2import yaml
3import os
4import argparse
5from inflection import underscore
6
7if __name__ == "__main__":
8    script_dir = os.path.dirname(os.path.realpath(__file__))
9    parser = argparse.ArgumentParser()
10    parser.add_argument(
11        "-f", "--filename", default="led.yaml", help="Input File Name"
12    )
13    parser.add_argument(
14        "-i",
15        "--input-dir",
16        dest="inputdir",
17        default=script_dir,
18        help="Input directory",
19    )
20    parser.add_argument(
21        "-o",
22        "--output-dir",
23        dest="outputdir",
24        default=".",
25        help="Output directory.",
26    )
27
28    args = parser.parse_args()
29
30    # Default to the one that is in the current.
31    yaml_dir = script_dir
32    yaml_file = os.path.join(yaml_dir, "led.yaml")
33
34    if args.inputdir:
35        yaml_dir = args.inputdir
36
37    if args.filename:
38        yaml_file = os.path.join(yaml_dir, args.filename)
39
40    with open(yaml_file, "r") as f:
41        ifile = yaml.safe_load(f)
42
43    # Dictionary having [Name:Priority]
44    priority_dict = {}
45
46    with open(os.path.join(args.outputdir, "led-gen.hpp"), "w") as ofile:
47        ofile.write("/* !!! WARNING: This is a GENERATED Code..")
48        ofile.write("Please do NOT Edit !!! */\n\n")
49
50        ofile.write("static const std::unordered_map<std::string,")
51        ofile.write(" std::set<phosphor::led::Layout::LedAction>>")
52        ofile.write(" systemLedMap = {\n\n")
53        for group in list(ifile.keys()):
54            # This section generates an std::unordered_map of LedGroupNames to
55            # std::set of LEDs containing the name and properties
56            led_dict = ifile[group]
57            ofile.write(
58                '   {"'
59                + "/xyz/openbmc_project/led/groups/"
60                + underscore(group)
61                + '",{\n'
62            )
63
64            # Some LED groups could be empty
65            if not led_dict:
66                ofile.write("   }},\n")
67                continue
68
69            for led_name, list_dict in list(led_dict.items()):
70                value = list_dict.get("Priority")
71                if led_name in priority_dict:
72                    if value != priority_dict[led_name]:
73                        # Priority for a particular LED needs to stay SAME
74                        # across all groups
75                        ofile.close()
76                        os.remove(ofile.name)
77                        raise ValueError(
78                            "Priority for ["
79                            + led_name
80                            + "] is NOT same across all groups"
81                        )
82                else:
83                    priority_dict[led_name] = value
84
85                ofile.write('        {"' + underscore(led_name) + '",')
86                ofile.write(
87                    "phosphor::led::Layout::Action::"
88                    + str(list_dict.get("Action", "Off"))
89                    + ","
90                )
91                ofile.write(str(list_dict.get("DutyOn", 50)) + ",")
92                ofile.write(str(list_dict.get("Period", 0)) + ",")
93                priority = str(list_dict.get("Priority", "Blink"))
94                ofile.write("phosphor::led::Layout::Action::" + priority + ",")
95                ofile.write("},\n")
96            ofile.write("   }},\n")
97        ofile.write("};\n")
98