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