xref: /openbmc/phosphor-mrw-tools/gen_led_groups.pl (revision 65ca8e19c4b89b908efa79d138204e07436a28fc)
1d0039437SVishwanatha Subbanna#!/usr/bin/env perl
2*65ca8e19SAndrew Geissler
33706646aSVishwanatha Subbannause strict;
43706646aSVishwanatha Subbannause warnings;
53706646aSVishwanatha Subbanna
63706646aSVishwanatha Subbannause mrw::Targets; # Set of APIs allowing access to parsed ServerWiz2 XML output
73706646aSVishwanatha Subbannause mrw::Inventory; # To get list of Inventory targets
83706646aSVishwanatha Subbannause Getopt::Long; # For parsing command line arguments
93706646aSVishwanatha Subbannause Data::Dumper qw(Dumper); # Dumping blob
10d0039437SVishwanatha Subbannause List::Util qw(first);
113706646aSVishwanatha Subbanna
123706646aSVishwanatha Subbanna# Globals
133706646aSVishwanatha Subbannamy $force           = 0;
143706646aSVishwanatha Subbannamy $serverwizFile  = "";
153706646aSVishwanatha Subbannamy $debug           = 0;
163706646aSVishwanatha Subbannamy $outputFile     = "";
173706646aSVishwanatha Subbannamy $verbose         = 0;
183706646aSVishwanatha Subbanna
193706646aSVishwanatha Subbanna# Command line argument parsing
203706646aSVishwanatha SubbannaGetOptions(
213706646aSVishwanatha Subbanna"f"   => \$force,             # numeric
223706646aSVishwanatha Subbanna"i=s" => \$serverwizFile,    # string
233706646aSVishwanatha Subbanna"o=s" => \$outputFile,       # string
243706646aSVishwanatha Subbanna"d"   => \$debug,
253706646aSVishwanatha Subbanna"v"   => \$verbose,
263706646aSVishwanatha Subbanna)
273706646aSVishwanatha Subbannaor printUsage();
283706646aSVishwanatha Subbanna
293706646aSVishwanatha Subbannaif (($serverwizFile eq "") or ($outputFile eq ""))
303706646aSVishwanatha Subbanna{
313706646aSVishwanatha Subbanna    printUsage();
323706646aSVishwanatha Subbanna}
333706646aSVishwanatha Subbanna
343706646aSVishwanatha Subbanna# Hashmap of all the LED groups with the properties
353706646aSVishwanatha Subbannamy %hashGroup;
363706646aSVishwanatha Subbanna
373706646aSVishwanatha Subbanna# hash of targets to Names that have the FRU Inventory instances
383706646aSVishwanatha Subbannamy %invHash;
393706646aSVishwanatha Subbanna
40e36476e2SVishwanatha Subbanna# Hash of Enclosure Fault LED names and their properties
41e36476e2SVishwanatha Subbanna# These are generally front-fault-led and rear-fault-led
42e36476e2SVishwanatha Subbannamy %encFaults;
433706646aSVishwanatha Subbanna
44d0039437SVishwanatha Subbanna# These groups are a must in all the systems.
45d0039437SVishwanatha Subbanna# Its fine if they don't map to any physical LED
46d0039437SVishwanatha Subbannamy @defaultGroup = ("BmcBooted", "PowerOn");
47d0039437SVishwanatha Subbanna
48c5e127d6SVishwanatha Subbanna# This group contains all the LEDs with the action Blink
49c5e127d6SVishwanatha Subbannamy $lampTest = "LampTest";
50c5e127d6SVishwanatha Subbanna
513706646aSVishwanatha Subbanna# API used to access parsed XML data
523706646aSVishwanatha Subbannamy $targetObj = Targets->new;
533706646aSVishwanatha Subbannaif($verbose == 1)
543706646aSVishwanatha Subbanna{
553706646aSVishwanatha Subbanna    $targetObj->{debug} = 1;
563706646aSVishwanatha Subbanna}
573706646aSVishwanatha Subbanna
583706646aSVishwanatha Subbannaif($force == 1)
593706646aSVishwanatha Subbanna{
603706646aSVishwanatha Subbanna    $targetObj->{force} = 1;
613706646aSVishwanatha Subbanna}
623706646aSVishwanatha Subbanna
633706646aSVishwanatha Subbanna$targetObj->loadXML($serverwizFile);
643706646aSVishwanatha Subbannaprint "Loaded MRW XML: $serverwizFile \n";
653706646aSVishwanatha Subbanna
663706646aSVishwanatha Subbanna# Iterate over Inventory and get all the Inventory targets.
673706646aSVishwanatha Subbannamy @inventory = Inventory::getInventory($targetObj);
683706646aSVishwanatha Subbannafor my $item (@inventory)
693706646aSVishwanatha Subbanna{
703706646aSVishwanatha Subbanna    # Target to Obmc_Name hash.
713706646aSVishwanatha Subbanna    $invHash{$item->{TARGET}} = $item->{OBMC_NAME};
723706646aSVishwanatha Subbanna}
733706646aSVishwanatha Subbanna
743706646aSVishwanatha Subbanna# For debugging purpose.
753706646aSVishwanatha SubbannaprintDebug("\nList of Inventory targets\n");
763706646aSVishwanatha Subbannaforeach my $key (sort keys %invHash)
773706646aSVishwanatha Subbanna{
783706646aSVishwanatha Subbanna    printDebug("$invHash{$key}\n");
793706646aSVishwanatha Subbanna}
803706646aSVishwanatha Subbanna
813706646aSVishwanatha Subbanna# Process all the targets in the XML. If the target is associated with a FRU,
823706646aSVishwanatha Subbanna# then remember it so that when we do the FRU inventory lookup, we know if
833706646aSVishwanatha Subbanna# that Inventory has a LED associated with it or not.
843706646aSVishwanatha Subbannaforeach my $target (sort keys %{$targetObj->getAllTargets()})
853706646aSVishwanatha Subbanna{
863706646aSVishwanatha Subbanna    # Some the target instances may *not* have this MRW_TYPE attribute.
873706646aSVishwanatha Subbanna    if($targetObj->isBadAttribute($target, "MRW_TYPE"))
883706646aSVishwanatha Subbanna    {
893706646aSVishwanatha Subbanna        next;
903706646aSVishwanatha Subbanna    }
913706646aSVishwanatha Subbanna
923706646aSVishwanatha Subbanna    # Return true if not populated -or- not present
933706646aSVishwanatha Subbanna    if("LED" eq $targetObj->getMrwType($target))
943706646aSVishwanatha Subbanna    {
953706646aSVishwanatha Subbanna        # Just for clarity.
963706646aSVishwanatha Subbanna        my $ledTarget = $target;
973706646aSVishwanatha Subbanna
983706646aSVishwanatha Subbanna        # OBMC_NAME field of the FRU
993706646aSVishwanatha Subbanna        # fruPath ex /system/chassis/motherboard/dimm1
1003706646aSVishwanatha Subbanna        # device "dimm1"
1013706646aSVishwanatha Subbanna        my $fruPath = '';
1023706646aSVishwanatha Subbanna        my $device = '';
1033706646aSVishwanatha Subbanna
1043706646aSVishwanatha Subbanna        # Find if this LED is associated with a FRU.
1053706646aSVishwanatha Subbanna        # Example, FAN will have LED on that assembly.
1063706646aSVishwanatha Subbanna        my $conns = $targetObj->findConnections($ledTarget, "LOGICAL_ASSOCIATION");
1073706646aSVishwanatha Subbanna        if ($conns ne "")
1083706646aSVishwanatha Subbanna        {
1093706646aSVishwanatha Subbanna            # This LED is associated with a FRU
1103706646aSVishwanatha Subbanna            for my $conn (@{$conns->{CONN}})
1113706646aSVishwanatha Subbanna            {
1123706646aSVishwanatha Subbanna                my $destTarget = $conn->{DEST_PARENT};
1133706646aSVishwanatha Subbanna                # If we have found this, then that means, we do not need to
1143706646aSVishwanatha Subbanna                # hand cook a group name. delete this value from the inventory
1153706646aSVishwanatha Subbanna                # array
1163706646aSVishwanatha Subbanna                if(exists($invHash{$destTarget}))
1173706646aSVishwanatha Subbanna                {
1183706646aSVishwanatha Subbanna                    # This will remove a particular {key, value} pair
1193706646aSVishwanatha Subbanna                    $fruPath = $invHash{$destTarget};
1203706646aSVishwanatha Subbanna                    printDebug("$destTarget : $fruPath is having associated LED\n");
1213706646aSVishwanatha Subbanna                    delete ($invHash{$destTarget});
1223706646aSVishwanatha Subbanna                }
1233706646aSVishwanatha Subbanna            }
1243706646aSVishwanatha Subbanna            # fetch FruName from the device path
1253706646aSVishwanatha Subbanna            $device = getFruName($fruPath);
1263706646aSVishwanatha Subbanna            printDebug("$target; $device has device\n");
1273706646aSVishwanatha Subbanna        }
1283706646aSVishwanatha Subbanna
1293706646aSVishwanatha Subbanna        if($targetObj->isBadAttribute($ledTarget, "CONTROL_GROUPS"))
1303706646aSVishwanatha Subbanna        {
1313706646aSVishwanatha Subbanna            next;
1323706646aSVishwanatha Subbanna        }
1333706646aSVishwanatha Subbanna
134a9660424SVishwanatha Subbanna        # By default, Blink takes higher priority
135a9660424SVishwanatha Subbanna        my $priority = "'Blink'";
136a9660424SVishwanatha Subbanna
137a9660424SVishwanatha Subbanna        # Get the priority. Since rest everything is populated,
138a9660424SVishwanatha Subbanna        # default to Blink  than err'ing out. Not checking for
139a9660424SVishwanatha Subbanna        # validity of this since it must be present.
140a9660424SVishwanatha Subbanna        if($targetObj->getAttribute($ledTarget, "LED_PRIORITY") eq "ON")
141a9660424SVishwanatha Subbanna        {
142a9660424SVishwanatha Subbanna            $priority = "'On'";
143a9660424SVishwanatha Subbanna        }
144a9660424SVishwanatha Subbanna
145312fa6baSMatt Spinler        #The MRW instance name must match the LED name in the device tree
146312fa6baSMatt Spinler        my $name = $targetObj->getInstanceName($ledTarget);
147e36476e2SVishwanatha Subbanna
148e36476e2SVishwanatha Subbanna        # Get if this LED is a ENC-FAULT type.
149e36476e2SVishwanatha Subbanna        if(!$targetObj->isBadAttribute($target, "LED_TYPE"))
150e36476e2SVishwanatha Subbanna        {
151e36476e2SVishwanatha Subbanna            if("ENC-FAULT" eq $targetObj->getAttribute($ledTarget, "LED_TYPE"))
152e36476e2SVishwanatha Subbanna            {
153e36476e2SVishwanatha Subbanna                $encFaults{$name} = $priority;
154e36476e2SVishwanatha Subbanna            }
155e36476e2SVishwanatha Subbanna        }
156e36476e2SVishwanatha Subbanna
157e36476e2SVishwanatha Subbanna        # Defines the LEDs and the Groups that they belong to
1583706646aSVishwanatha Subbanna        my $controlGroup = $targetObj->getAttribute($ledTarget, "CONTROL_GROUPS");
1593706646aSVishwanatha Subbanna
1603706646aSVishwanatha Subbanna        #remove spaces, because serverwiz isn't good at removing them itself
1613706646aSVishwanatha Subbanna        $controlGroup =~ s/\s//g;
1623706646aSVishwanatha Subbanna        my @groups= split(',', $controlGroup);  #just a long 16x3 = 48 element list
1633706646aSVishwanatha Subbanna
1643706646aSVishwanatha Subbanna        for (my $i = 0; $i < scalar @groups; $i += 3)
1653706646aSVishwanatha Subbanna        {
1663706646aSVishwanatha Subbanna            if (($groups[$i] ne "NA") && ($groups[$i] ne ""))
1673706646aSVishwanatha Subbanna            {
1683706646aSVishwanatha Subbanna                my $groupName = $groups[$i];
1693706646aSVishwanatha Subbanna                printDebug("$groupName\n");
1703706646aSVishwanatha Subbanna
1713706646aSVishwanatha Subbanna                my $blinkFreq = $groups[$i+1];
1723706646aSVishwanatha Subbanna                my $action = "'On'";
1733706646aSVishwanatha Subbanna                my $period = 0;
1743706646aSVishwanatha Subbanna
1753706646aSVishwanatha Subbanna                # Period in milli seconds
1763706646aSVishwanatha Subbanna                my $dutyCycle = $groups[$i+2];
1773706646aSVishwanatha Subbanna                if($blinkFreq > 0)
1783706646aSVishwanatha Subbanna                {
1793706646aSVishwanatha Subbanna                    $action = "'Blink'";
1803706646aSVishwanatha Subbanna                    $period = (1 / $blinkFreq) * 1000;
1813706646aSVishwanatha Subbanna                }
1823706646aSVishwanatha Subbanna
1833706646aSVishwanatha Subbanna                # Insert into hash map;
184e36476e2SVishwanatha Subbanna                $hashGroup{$groupName}{$name}{"Action"} = $action;
185e36476e2SVishwanatha Subbanna                $hashGroup{$groupName}{$name}{"Period"} = $period;
186e36476e2SVishwanatha Subbanna                $hashGroup{$groupName}{$name}{"DutyOn"} = $dutyCycle;
187e36476e2SVishwanatha Subbanna                $hashGroup{$groupName}{$name}{"Priority"} = $priority;
188c5e127d6SVishwanatha Subbanna
189c5e127d6SVishwanatha Subbanna                # Need to update the LampTest group.
190e36476e2SVishwanatha Subbanna                $hashGroup{$lampTest}{$name}{"Action"} = "'Blink'";
191e36476e2SVishwanatha Subbanna                $hashGroup{$lampTest}{$name}{"Period"} = 1000;
192e36476e2SVishwanatha Subbanna                $hashGroup{$lampTest}{$name}{"DutyOn"} = 50;
193e36476e2SVishwanatha Subbanna
194e36476e2SVishwanatha Subbanna                # Priority of a particular LED needs to stay SAME across
195e36476e2SVishwanatha Subbanna                # all groups
196e36476e2SVishwanatha Subbanna                $hashGroup{$lampTest}{$name}{"Priority"} = $priority;
1973706646aSVishwanatha Subbanna            }
1983706646aSVishwanatha Subbanna        } # Walk CONTROL_GROUP
1993706646aSVishwanatha Subbanna    } # Has LED target
2003706646aSVishwanatha Subbanna} # All the targets
2013706646aSVishwanatha Subbanna
2023706646aSVishwanatha Subbanna
2033706646aSVishwanatha Subbanna# These are the FRUs that do not have associated LEDs. All of these need to be
2043706646aSVishwanatha Subbanna# mapped to some group, which will be named after this target name and the
2053706646aSVishwanatha Subbanna# elements of the group are EnclosureFaults Front and Back
2063706646aSVishwanatha SubbannaprintDebug("\n======================================================================\n");
2073706646aSVishwanatha SubbannaprintDebug("\nFRUs that do not have associated LEDs\n");
2083706646aSVishwanatha Subbannaforeach my $key (sort keys %invHash)
2093706646aSVishwanatha Subbanna{
2103706646aSVishwanatha Subbanna    my $device = getFruName($invHash{$key});
2113706646aSVishwanatha Subbanna
2123706646aSVishwanatha Subbanna    # For each of these device, the Group record would be this :
2133706646aSVishwanatha Subbanna    my $groupName = $device . "Fault";
2143706646aSVishwanatha Subbanna    printDebug("$device :: $groupName\n");
2153706646aSVishwanatha Subbanna
2163706646aSVishwanatha Subbanna    # Setup roll-up LEDs to the ones that are of type ENC-FAULT
217e36476e2SVishwanatha Subbanna    foreach my $led (sort keys %encFaults)
2183706646aSVishwanatha Subbanna    {
219e36476e2SVishwanatha Subbanna        $hashGroup{$groupName}{$led}{"Action"} = "'On'";
220e36476e2SVishwanatha Subbanna        $hashGroup{$groupName}{$led}{"Period"} = 0;
221e36476e2SVishwanatha Subbanna        $hashGroup{$groupName}{$led}{"DutyOn"} = 50;
222e36476e2SVishwanatha Subbanna
223e36476e2SVishwanatha Subbanna        # Priority of a particular LED needs to stay SAME across
224e36476e2SVishwanatha Subbanna        # all groups
225e36476e2SVishwanatha Subbanna        $hashGroup{$groupName}{$led}{"Priority"} = $encFaults{$led};
2263706646aSVishwanatha Subbanna    }
2273706646aSVishwanatha Subbanna}
2283706646aSVishwanatha SubbannaprintDebug("\n======================================================================\n");
2293706646aSVishwanatha Subbanna
23078ae582bSGeorge Liumy $index = rindex($outputFile, ".");
23178ae582bSGeorge Liumy $suffix = substr($outputFile, $index + 1);
23278ae582bSGeorge Liuif (lc($suffix) eq "json")
23378ae582bSGeorge Liu{
23478ae582bSGeorge Liu    # Generate the JSON file
23578ae582bSGeorge Liu    generateJSONFile();
23678ae582bSGeorge Liu}
23778ae582bSGeorge Liuelse
23878ae582bSGeorge Liu{
2393706646aSVishwanatha Subbanna    # Generate the yaml file
2403706646aSVishwanatha Subbanna    generateYamlFile();
24178ae582bSGeorge Liu}
24278ae582bSGeorge Liu
2433706646aSVishwanatha Subbanna#------------------------------------END OF MAIN-----------------------
2443706646aSVishwanatha Subbanna
2453706646aSVishwanatha Subbanna# Gven a '/' separated string, returns the leaf.
2463706646aSVishwanatha Subbanna# Ex: /a/b/c/d returns device=d
2473706646aSVishwanatha Subbannasub getFruName
2483706646aSVishwanatha Subbanna{
2493706646aSVishwanatha Subbanna    my $path = shift;
2503706646aSVishwanatha Subbanna    my $device = '';
2513706646aSVishwanatha Subbanna    my $lastSlash=rindex($path, '/');
2523706646aSVishwanatha Subbanna    $device=substr($path, $lastSlash+1);
2533706646aSVishwanatha Subbanna}
2543706646aSVishwanatha Subbanna
2553706646aSVishwanatha Subbannasub generateYamlFile
2563706646aSVishwanatha Subbanna{
2573706646aSVishwanatha Subbanna    my $fileName = $outputFile;
2583706646aSVishwanatha Subbanna    my $groupCopy = '';
2593706646aSVishwanatha Subbanna    my $ledCopy = '';
2603706646aSVishwanatha Subbanna    open(my $fh, '>', $fileName) or die "Could not open file '$fileName' $!";
2613706646aSVishwanatha Subbanna
2623706646aSVishwanatha Subbanna    foreach my $group (sort keys %hashGroup)
2633706646aSVishwanatha Subbanna    {
2643706646aSVishwanatha Subbanna        if($group ne $groupCopy)
2653706646aSVishwanatha Subbanna        {
266d0039437SVishwanatha Subbanna            # If one of these is a default group, then delete it from the array
267d0039437SVishwanatha Subbanna            # that is being maintained to create one by hand if all default ones
268d0039437SVishwanatha Subbanna            # are not defined
269d0039437SVishwanatha Subbanna            my $index = first {$defaultGroup[$_] eq $group} 0..$#defaultGroup;
270d0039437SVishwanatha Subbanna            if (defined $index)
271d0039437SVishwanatha Subbanna            {
272d0039437SVishwanatha Subbanna                splice @defaultGroup, $index, 1;
273d0039437SVishwanatha Subbanna            }
274d0039437SVishwanatha Subbanna
2753706646aSVishwanatha Subbanna            $groupCopy = '';
2763706646aSVishwanatha Subbanna            $ledCopy = '';
2773706646aSVishwanatha Subbanna        }
2783706646aSVishwanatha Subbanna
279c5e127d6SVishwanatha Subbanna        foreach my $led (sort keys %{ $hashGroup{$group} })
2803706646aSVishwanatha Subbanna        {
281c5e127d6SVishwanatha Subbanna            foreach my $property (sort keys %{ $hashGroup{$group}{$led}})
2823706646aSVishwanatha Subbanna            {
2833706646aSVishwanatha Subbanna                if($group ne $groupCopy)
2843706646aSVishwanatha Subbanna                {
2853706646aSVishwanatha Subbanna                    $groupCopy = $group;
2863706646aSVishwanatha Subbanna                    print $fh "$group:\n";
2873706646aSVishwanatha Subbanna                }
2883706646aSVishwanatha Subbanna                print $fh "    ";
2893706646aSVishwanatha Subbanna                if($led ne $ledCopy)
2903706646aSVishwanatha Subbanna                {
2913706646aSVishwanatha Subbanna                    $ledCopy = $led;
2923706646aSVishwanatha Subbanna                    print $fh "$led:\n";
2933706646aSVishwanatha Subbanna                    print $fh "    ";
2943706646aSVishwanatha Subbanna                }
2953706646aSVishwanatha Subbanna                print $fh "    ";
2963706646aSVishwanatha Subbanna                print $fh "$property:";
2973706646aSVishwanatha Subbanna                print $fh " $hashGroup{$group}{$led}{$property}\n";
2983706646aSVishwanatha Subbanna            }
2993706646aSVishwanatha Subbanna        }
3003706646aSVishwanatha Subbanna    }
301d0039437SVishwanatha Subbanna    # If we need to hand create some of the groups, do so now.
302d0039437SVishwanatha Subbanna    foreach my $name (@defaultGroup)
303d0039437SVishwanatha Subbanna    {
304d0039437SVishwanatha Subbanna        print $fh "$name:\n";
305d0039437SVishwanatha Subbanna    }
3063706646aSVishwanatha Subbanna    close $fh;
3073706646aSVishwanatha Subbanna}
3083706646aSVishwanatha Subbanna
30978ae582bSGeorge Liusub generateJSONFile
31078ae582bSGeorge Liu{
31178ae582bSGeorge Liu    package LEDGroups;
31278ae582bSGeorge Liu    use JSON;
31378ae582bSGeorge Liu    my $JSON = JSON->new->utf8->pretty(1);
31478ae582bSGeorge Liu    $JSON->convert_blessed(1);
31578ae582bSGeorge Liu
31678ae582bSGeorge Liu    sub led
31778ae582bSGeorge Liu    {
31878ae582bSGeorge Liu        my $class = shift;
31978ae582bSGeorge Liu        my $self = {
32078ae582bSGeorge Liu            group => shift,
32178ae582bSGeorge Liu            members => shift,
32278ae582bSGeorge Liu        };
32378ae582bSGeorge Liu        bless $self, $class;
32478ae582bSGeorge Liu        return $self;
32578ae582bSGeorge Liu    }
32678ae582bSGeorge Liu
32778ae582bSGeorge Liu    sub member
32878ae582bSGeorge Liu    {
32978ae582bSGeorge Liu        my $class = shift;
33078ae582bSGeorge Liu        my $self = {
3311b1aa6e5SGeorge Liu            Name => shift,
33278ae582bSGeorge Liu            Action => shift,
33378ae582bSGeorge Liu            DutyOn => shift,
33478ae582bSGeorge Liu            Period => shift,
33578ae582bSGeorge Liu            Priority => shift,
33678ae582bSGeorge Liu        };
33778ae582bSGeorge Liu        bless $self, $class;
33878ae582bSGeorge Liu        return $self;
33978ae582bSGeorge Liu    }
34078ae582bSGeorge Liu
34178ae582bSGeorge Liu    sub TO_JSON {
34278ae582bSGeorge Liu        return { %{ shift() } };
34378ae582bSGeorge Liu    }
34478ae582bSGeorge Liu
34578ae582bSGeorge Liu    my $fileName = $outputFile;
34678ae582bSGeorge Liu    open(my $fh, '>', $fileName) or die "Could not open file '$fileName' $!";
34778ae582bSGeorge Liu
34878ae582bSGeorge Liu    my @leds = ();
34978ae582bSGeorge Liu    foreach my $group (sort keys %hashGroup)
35078ae582bSGeorge Liu    {
35178ae582bSGeorge Liu        my @members = ();
35278ae582bSGeorge Liu        foreach my $led (sort keys %{ $hashGroup{$group} })
35378ae582bSGeorge Liu        {
35478ae582bSGeorge Liu            my $action;
35578ae582bSGeorge Liu            my $dutyOn;
35678ae582bSGeorge Liu            my $period;
35778ae582bSGeorge Liu            my $priority;
35878ae582bSGeorge Liu
35978ae582bSGeorge Liu            if (exists $hashGroup{$group}{$led}{Action})
36078ae582bSGeorge Liu            {
36178ae582bSGeorge Liu                $action = $hashGroup{$group}{$led}{Action};
36278ae582bSGeorge Liu                $action = substr($action, 1, length($action) - 2);
36378ae582bSGeorge Liu            }
36478ae582bSGeorge Liu
36578ae582bSGeorge Liu            if (exists $hashGroup{$group}{$led}{DutyOn})
36678ae582bSGeorge Liu            {
36778ae582bSGeorge Liu                $dutyOn = $hashGroup{$group}{$led}{DutyOn};
36878ae582bSGeorge Liu            }
36978ae582bSGeorge Liu
37078ae582bSGeorge Liu            if (exists $hashGroup{$group}{$led}{Period})
37178ae582bSGeorge Liu            {
37278ae582bSGeorge Liu                $period = $hashGroup{$group}{$led}{Period};
37378ae582bSGeorge Liu            }
37478ae582bSGeorge Liu
37578ae582bSGeorge Liu            if (exists $hashGroup{$group}{$led}{Priority})
37678ae582bSGeorge Liu            {
37778ae582bSGeorge Liu                $priority = $hashGroup{$group}{$led}{Priority};
37878ae582bSGeorge Liu                $priority = substr($priority, 1, length($priority) - 2);
37978ae582bSGeorge Liu            }
38078ae582bSGeorge Liu
38178ae582bSGeorge Liu            my $m = member LEDGroups($led, $action, $dutyOn, $period, $priority);
38278ae582bSGeorge Liu            push @members, $m;
38378ae582bSGeorge Liu        }
38478ae582bSGeorge Liu        my $l = led LEDGroups($group, \@members);
38578ae582bSGeorge Liu        push @leds, $l;
38678ae582bSGeorge Liu    }
38778ae582bSGeorge Liu    my %ledJson = ('leds' => \@leds);
38878ae582bSGeorge Liu    my $json = $JSON->canonical(1)->encode(\%ledJson);
38978ae582bSGeorge Liu    print $fh $json;
39078ae582bSGeorge Liu    close $fh;
39178ae582bSGeorge Liu}
39278ae582bSGeorge Liu
3933706646aSVishwanatha Subbanna# Helper function to put debug statements.
3943706646aSVishwanatha Subbannasub printDebug
3953706646aSVishwanatha Subbanna{
3963706646aSVishwanatha Subbanna    my $str = shift;
3973706646aSVishwanatha Subbanna    print "DEBUG: ", $str, "\n" if $debug;
3983706646aSVishwanatha Subbanna}
3993706646aSVishwanatha Subbanna
4003706646aSVishwanatha Subbanna# Usage
4013706646aSVishwanatha Subbannasub printUsage
4023706646aSVishwanatha Subbanna{
4033706646aSVishwanatha Subbanna    print "
4043706646aSVishwanatha Subbanna    $0 -i [XML filename] -o [Output filename] [OPTIONS]
4053706646aSVishwanatha SubbannaOptions:
4063706646aSVishwanatha Subbanna    -f = force output file creation even when errors
4073706646aSVishwanatha Subbanna    -d = debug mode
4083706646aSVishwanatha Subbanna    -v = verbose mode - for verbose o/p from Targets.pm
4093706646aSVishwanatha Subbanna
4103706646aSVishwanatha SubbannaPS: mrw::Targets can be found in https://github.com/open-power/serverwiz/
4113706646aSVishwanatha Subbanna    mrw::Inventory can be found in https://github.com/openbmc/phosphor-mrw-tools/
4123706646aSVishwanatha Subbanna    \n";
4133706646aSVishwanatha Subbanna    exit(1);
4143706646aSVishwanatha Subbanna}
4153706646aSVishwanatha Subbanna#------------------------------------END OF SUB-----------------------
416