Generate selected match strings and signals

The available matches and their associated signals are now listed
within the events yaml and can be added to the list of matches to
register for per event.

Change-Id: I65f657038afe7c68a421adb4820ea09e275be06d
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/control/gen-fan-zone-defs.py b/control/gen-fan-zone-defs.py
index d11ff35..6d04bbd 100755
--- a/control/gen-fan-zone-defs.py
+++ b/control/gen-fan-zone-defs.py
@@ -20,7 +20,7 @@
 Group{
 %for member in event['group']:
 {
-    "${member['name']}",
+    "${member['object']}",
     {"${member['interface']}",
      "${member['property']}"}
 },
@@ -46,30 +46,32 @@
 Timer{
     ${event['timer']['interval']}
 },
-std::vector<PropertyChange>{
-%for s in event['signal']:
-    PropertyChange{
-        interfacesAdded("${s['obj_path']}"),
-        make_handler(objectSignal<${s['type']}>(
-            "${s['path']}",
-            "${s['interface']}",
-            "${s['property']}",
+std::vector<Signal>{
+%for s in event['signals']:
+    Signal{
+        ${s['match']}(
+        %for i, mp in enumerate(s['mparams']):
+        %if (i+1) != len(s['mparams']):
+        "${mp}",
+        %else:
+        "${mp}"
+        %endif
+        %endfor
+        ),
+        make_handler(
+            %if ('type' in s['sparams']) and \
+                (s['sparams']['type'] is not None):
+            ${s['signal']}<${s['sparams']['type']}>(
+            %else:
+            ${s['signal']}(
+            %endif
+            %for spk, spv in s['sparams'].iteritems():
+            %if spk != 'type':
+            "${spv}",
+            %endif
+            %endfor
             handler::setProperty<${s['type']}>(
-                "${s['path']}",
-                "${s['interface']}",
-                "${s['property']}"
-            )
-        ))
-    },
-    PropertyChange{
-        propertiesChanged(
-            "${s['path']}",
-            "${s['interface']}"),
-        make_handler(propertySignal<${s['type']}>(
-            "${s['interface']}",
-            "${s['property']}",
-            handler::setProperty<${s['type']}>(
-                "${s['path']}",
+                "${s['object']}",
                 "${s['interface']}",
                 "${s['property']}"
             )
@@ -140,7 +142,7 @@
                         Group{
                         %for member in event['pc']['pcgrp']:
                         {
-                            "${member['name']}",
+                            "${member['object']}",
                             {"${member['interface']}",
                              "${member['property']}"}
                         },
@@ -195,30 +197,32 @@
                         Timer{
                             ${event['pc']['pctime']['interval']}
                         },
-                        std::vector<PropertyChange>{
-                        %for s in event['pc']['pcsig']:
-                            PropertyChange{
-                                interfacesAdded("${s['obj_path']}"),
-                                make_handler(objectSignal<${s['type']}>(
-                                    "${s['path']}",
-                                    "${s['interface']}",
-                                    "${s['property']}",
+                        std::vector<Signal>{
+                        %for s in event['pc']['pcsigs']:
+                            Signal{
+                                ${s['match']}(
+                                %for i, mp in enumerate(s['mparams']):
+                                %if (i+1) != len(s['mparams']):
+                                "${mp}",
+                                %else:
+                                "${mp}"
+                                %endif
+                                %endfor
+                                ),
+                                make_handler(
+                                    %if ('type' in s['sparams']) and \
+                                        (s['sparams']['type'] is not None):
+                                    ${s['signal']}<${s['sparams']['type']}>(
+                                    %else:
+                                    ${s['signal']}(
+                                    %endif
+                                    %for spk, spv in s['sparams'].iteritems():
+                                    %if spk != 'type':
+                                    "${spv}",
+                                    %endif
+                                    %endfor
                                     handler::setProperty<${s['type']}>(
-                                        "${s['path']}",
-                                        "${s['interface']}",
-                                        "${s['property']}"
-                                    )
-                                ))
-                            },
-                            PropertyChange{
-                                propertiesChanged(
-                                    "${s['path']}",
-                                    "${s['interface']}"),
-                                make_handler(propertySignal<${s['type']}>(
-                                    "${s['interface']}",
-                                    "${s['property']}",
-                                    handler::setProperty<${s['type']}>(
-                                        "${s['path']}",
+                                        "${s['object']}",
                                         "${s['interface']}",
                                         "${s['property']}"
                                     )
@@ -276,11 +280,11 @@
                   if g['name'] == e['group'])
     for member in groups['members']:
         members = {}
-        members['obj_path'] = groups['type']
-        members['name'] = (groups['type'] +
-                           member)
+        members['object'] = (groups['type'] +
+                             member)
         members['interface'] = e['interface']
         members['property'] = e['property']['name']
+        members['type'] = e['property']['type']
         group.append(members)
     event['group'] = group
 
@@ -319,17 +323,36 @@
         action.append(actions)
     event['action'] = action
 
-    # Add property change signal handler
-    signal = []
-    for path in group:
-        signals = {}
-        signals['obj_path'] = path['obj_path']
-        signals['path'] = path['name']
-        signals['interface'] = e['interface']
-        signals['property'] = e['property']['name']
-        signals['type'] = e['property']['type']
-        signal.append(signals)
-    event['signal'] = signal
+    # Add signal handlers
+    signals = []
+    for member in group:
+        for eMatches in e['matches']:
+            signal = {}
+            eMatch = next(m for m in events_data['matches']
+                          if m['name'] == eMatches['name'])
+            signal['match'] = eMatch['name']
+            params = []
+            if ('parameters' in eMatch) and \
+               (eMatch['parameters'] is not None):
+                for p in eMatch['parameters']:
+                    params.append(member[str(p)])
+            signal['mparams'] = params
+            eSignal = next(s for s in events_data['signals']
+                           if s['name'] == eMatch['signal'])
+            signal['signal'] = eSignal['name']
+            sparams = {}
+            if ('parameters' in eSignal) and \
+               (eSignal['parameters'] is not None):
+                for p in eSignal['parameters']:
+                    sparams[str(p)] = member[str(p)]
+            signal['sparams'] = sparams
+            # Add member attributes
+            signal['object'] = member['object']
+            signal['interface'] = member['interface']
+            signal['property'] = member['property']
+            signal['type'] = member['type']
+            signals.append(signal)
+    event['signals'] = signals
 
     # Add optional action call timer
     timer = {}
@@ -361,9 +384,8 @@
                       if g['name'] == grp['name'])
         for member in groups['members']:
             members = {}
-            members['obj_path'] = groups['type']
-            members['name'] = (groups['type'] +
-                               member)
+            members['object'] = (groups['type'] +
+                                 member)
             members['interface'] = grp['interface']
             members['property'] = grp['property']['name']
             members['type'] = grp['property']['type']
@@ -389,7 +411,7 @@
                 value = {}
                 value['value'] = (
                     "PrecondGroup{\"" +
-                    str(pcgrp['name']) + "\",\"" +
+                    str(pcgrp['object']) + "\",\"" +
                     str(pcgrp['interface']) + "\",\"" +
                     str(pcgrp['property']) + "\"," +
                     "static_cast<" +
@@ -410,17 +432,36 @@
         pcevents.append(pcevent)
     precond['pcevts'] = pcevents
 
-    # Add precondition property change signal handler
-    signal = []
+    # Add precondition signal handlers
+    signals = []
     for member in group:
-        signals = {}
-        signals['obj_path'] = member['obj_path']
-        signals['path'] = member['name']
-        signals['interface'] = member['interface']
-        signals['property'] = member['property']
-        signals['type'] = member['type']
-        signal.append(signals)
-    precond['pcsig'] = signal
+        for eMatches in event['precondition']['matches']:
+            signal = {}
+            eMatch = next(m for m in events_data['matches']
+                          if m['name'] == eMatches['name'])
+            signal['match'] = eMatch['name']
+            params = []
+            if ('parameters' in eMatch) and \
+               (eMatch['parameters'] is not None):
+                for p in eMatch['parameters']:
+                    params.append(member[str(p)])
+            signal['mparams'] = params
+            eSignal = next(s for s in events_data['signals']
+                           if s['name'] == eMatch['signal'])
+            signal['signal'] = eSignal['name']
+            sparams = {}
+            if ('parameters' in eSignal) and \
+               (eSignal['parameters'] is not None):
+                for p in eSignal['parameters']:
+                    sparams[str(p)] = member[str(p)]
+            signal['sparams'] = sparams
+            # Add member attributes
+            signal['object'] = member['object']
+            signal['interface'] = member['interface']
+            signal['property'] = member['property']
+            signal['type'] = member['type']
+            signals.append(signal)
+    precond['pcsigs'] = signals
 
     # Add optional action call timer
     timer = {}