Move signal matches to triggers section

Create a triggers section that will support different types of triggers
for an event. Currently the only supported trigger is signal based where
code is generated to subscribe to the given matches for each member of
all groups in the event.

Tested:
    Generated code remains unchanged

Change-Id: I452cb35b12c13c77f3c653866095b09e33fd8692
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 a5e4809..511e910 100755
--- a/control/gen-fan-zone-defs.py
+++ b/control/gen-fan-zone-defs.py
@@ -168,7 +168,7 @@
     e += "},\n"
 
     e += "std::vector<Signal>{\n"
-    for s in event['signals']:
+    for s in event['triggers']['signals']:
         e += "Signal{\n"
         e += "match::" + s['match'] + "(\n"
         for i, mp in enumerate(s['mparams']):
@@ -257,6 +257,91 @@
     return groups
 
 
+def getSignal(eGrps, eTrig, events):
+    """
+    Extracts and constructs for each group member a signal
+    subscription of each match listed in the trigger.
+    """
+    signals = []
+    for group in eGrps:
+        for member in group['members']:
+            for eMatches in eTrig['matches']:
+                signal = {}
+                eMatch = next(m for m in events['matches']
+                              if m['name'] == eMatches['name'])
+                # If service not given, subscribe to signal match
+                if ('service' not in member):
+                    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
+
+                if ('parameters' in eMatch['signal']) and \
+                   (eMatch['signal']['parameters'] is not None):
+                    eSignal = eMatch['signal']
+                else:
+                    eSignal = next(s for s in events['signals']
+                                   if s['name'] == eMatch['signal'])
+                signal['signal'] = eSignal['name']
+                sparams = {}
+                if ('parameters' in eSignal) and \
+                   (eSignal['parameters'] is not None):
+                    splist = []
+                    for p in eSignal['parameters']:
+                        sp = str(p)
+                        if (sp != 'type'):
+                            splist.append(sp)
+                            if (sp != 'group'):
+                                sparams[sp] = "\"" + member[sp] + "\""
+                            else:
+                                sparams[sp] = "Group{\n"
+                                for m in group['members']:
+                                    sparams[sp] += (
+                                        "{\n" +
+                                        "\"" + str(m['object']) + "\",\n" +
+                                        "{\"" + str(m['interface']) + "\"," +
+                                        "\"" + str(m['property']) + "\"}\n" +
+                                        "},\n")
+                                sparams[sp] += "}"
+                        else:
+                            sparams[sp] = member[sp]
+                    sparams['params'] = splist
+                signal['sparams'] = sparams
+                # Add signal handler
+                eHandler = next(h for h in events['handlers']
+                                if h['name'] == eSignal['handler'])
+                signal['handler'] = eHandler['name']
+                hparams = {}
+                if ('parameters' in eHandler) and \
+                   (eHandler['parameters'] is not None):
+                    hplist = []
+                    for p in eHandler['parameters']:
+                        hp = str(p)
+                        if (hp != 'type'):
+                            hplist.append(hp)
+                            if (hp != 'group'):
+                                hparams[hp] = "\"" + member[hp] + "\""
+                            else:
+                                hparams[hp] = "Group{\n"
+                                for m in group['members']:
+                                    hparams[hp] += (
+                                        "{\n" +
+                                        "\"" + str(m['object']) + "\",\n" +
+                                        "{\"" + str(m['interface']) + "\"," +
+                                        "\"" + str(m['property']) + "\"}\n" +
+                                        "},\n")
+                                hparams[hp] += "}"
+                        else:
+                            hparams[hp] = member[hp]
+                    hparams['params'] = hplist
+                signal['hparams'] = hparams
+                signals.append(signal)
+    return signals
+
+
 def getActions(zNum, zCond, edata, actions, events):
     """
     Extracts and constructs the make_action function call for
@@ -370,85 +455,15 @@
                                      e,
                                      events_data)
 
-    # Add signal handlers
-    signals = []
-    for group in event['groups']:
-        for member in group['members']:
-            for eMatches in e['matches']:
-                signal = {}
-                eMatch = next(m for m in events_data['matches']
-                              if m['name'] == eMatches['name'])
-                # If service not given, subscribe to signal match
-                if ('service' not in member):
-                    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
-
-                if ('parameters' in eMatch['signal']) and \
-                   (eMatch['signal']['parameters'] is not None):
-                    eSignal = eMatch['signal']
-                else:
-                    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):
-                    splist = []
-                    for p in eSignal['parameters']:
-                        sp = str(p)
-                        if (sp != 'type'):
-                            splist.append(sp)
-                            if (sp != 'group'):
-                                sparams[sp] = "\"" + member[sp] + "\""
-                            else:
-                                sparams[sp] = "Group{\n"
-                                for m in group['members']:
-                                    sparams[sp] += (
-                                        "{\n" +
-                                        "\"" + str(m['object']) + "\",\n" +
-                                        "{\"" + str(m['interface']) + "\"," +
-                                        "\"" + str(m['property']) + "\"}\n" +
-                                        "},\n")
-                                sparams[sp] += "}"
-                        else:
-                            sparams[sp] = member[sp]
-                    sparams['params'] = splist
-                signal['sparams'] = sparams
-                # Add signal handler
-                eHandler = next(h for h in events_data['handlers']
-                                if h['name'] == eSignal['handler'])
-                signal['handler'] = eHandler['name']
-                hparams = {}
-                if ('parameters' in eHandler) and \
-                   (eHandler['parameters'] is not None):
-                    hplist = []
-                    for p in eHandler['parameters']:
-                        hp = str(p)
-                        if (hp != 'type'):
-                            hplist.append(hp)
-                            if (hp != 'group'):
-                                hparams[hp] = "\"" + member[hp] + "\""
-                            else:
-                                hparams[hp] = "Group{\n"
-                                for m in group['members']:
-                                    hparams[hp] += (
-                                        "{\n" +
-                                        "\"" + str(m['object']) + "\",\n" +
-                                        "{\"" + str(m['interface']) + "\"," +
-                                        "\"" + str(m['property']) + "\"}\n" +
-                                        "},\n")
-                                hparams[hp] += "}"
-                        else:
-                            hparams[hp] = member[hp]
-                    hparams['params'] = hplist
-                signal['hparams'] = hparams
-                signals.append(signal)
-    event['signals'] = signals
+    # Add event triggers
+    event['triggers'] = {}
+    for trig in e['triggers']:
+        triggers = []
+        if (trig['name'] == "signal"):
+            if ('signals' not in event['triggers']):
+                event['triggers']['signals'] = []
+            triggers = getSignal(event['groups'], trig, events_data)
+            event['triggers']['signals'].extend(triggers)
 
     # Add optional action call timer
     timer = {}
diff --git a/control/templates/defs.mako b/control/templates/defs.mako
index bcc0c5b..30045f6d 100644
--- a/control/templates/defs.mako
+++ b/control/templates/defs.mako
@@ -63,7 +63,7 @@
     ${event['timer']['type']}
 },
 std::vector<Signal>{
-%for s in event['signals']:
+%for s in event['triggers']['signals']:
     Signal{
         %if ('match' in s) and \
             (s['match'] is not None):