Have timers be a trigger type in microseconds

Extract and generate timers in microseconds for all event triggers and
actions that take a timer as a parameter.

Tested:
    Timers are created on events with timer triggers defined
    Inspect that generated timers are created in microseconds
    No timer is created for events without a timer trigger

Change-Id: I345f247782779ef142fe0d569632be2b6c11f0c3
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 03346bc..5f1de45 100755
--- a/control/gen-fan-zone-defs.py
+++ b/control/gen-fan-zone-defs.py
@@ -163,8 +163,10 @@
     e += "},\n"
 
     e += "TimerConf{\n"
-    e += "\t" + event['timer']['interval'] + ",\n"
-    e += "\t" + event['timer']['type'] + "\n"
+    if ('timer' in event['triggers']) and \
+       (event['triggers']['timer'] is not None):
+       e += "\t" + event['triggers']['timer']['interval'] + ",\n"
+       e += "\t" + event['triggers']['timer']['type'] + "\n"
     e += "},\n"
 
     e += "std::vector<Signal>{\n"
@@ -342,6 +344,19 @@
     return signals
 
 
+def getTimer(eTrig):
+    """
+    Extracts and constructs the required parameters for an
+    event timer.
+    """
+    timer = {}
+    timer['interval'] = (
+        "static_cast<std::chrono::microseconds>" +
+        "(" + str(eTrig['interval']) + ")")
+    timer['type'] = "TimerType::" + str(eTrig['type'])
+    return timer
+
+
 def getActions(zNum, zCond, edata, actions, events):
     """
     Extracts and constructs the make_action function call for
@@ -407,11 +422,10 @@
                         param += ("size_t>(" + str(eActions[p]).lower() + ")")
                 else:
                     if p == 'timer':
+                        t = getTimer(eActions[p])
                         param = (
-                            "TimerConf{static_cast<std::chrono::seconds>(" +
-                            str(eActions[p]['delay']) + "), " +
-                            "TimerType::" +
-                            str(eActions[p]['type']) + "}")
+                            "TimerConf{" + t['interval'] + "," +
+                            t['type'] + "}")
                     else:
                         param += (str(eActions[p]['type']).lower() + ">(")
                         if p != 'map':
@@ -459,27 +473,14 @@
     event['triggers'] = {}
     for trig in e['triggers']:
         triggers = []
-        if (trig['name'] == "signal"):
+        if (trig['name'] == "timer"):
+            event['triggers']['timer'] = getTimer(trig)
+        elif (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 = {}
-    interval = "static_cast<std::chrono::seconds>"
-    if ('timer' in e) and \
-       (e['timer'] is not None):
-        timer['interval'] = (interval +
-                             "(" +
-                             str(e['timer']['interval']) +
-                             ")")
-    else:
-        timer['interval'] = (interval +
-                             "(" + str(0) + ")")
-    timer['type'] = "TimerType::repeating"
-    event['timer'] = timer
-
     return event
 
 
@@ -544,27 +545,14 @@
     precond['triggers'] = {}
     for trig in event['precondition']['triggers']:
         triggers = []
-        if (trig['name'] == "signal"):
+        if (trig['name'] == "timer"):
+            precond['triggers']['pctime'] = getTimer(trig)
+        elif (trig['name'] == "signal"):
             if ('pcsigs' not in precond['triggers']):
                 precond['triggers']['pcsigs'] = []
             triggers = getSignal(precond['pcgrps'], trig, events_data)
             precond['triggers']['pcsigs'].extend(triggers)
 
-    # Add optional action call timer
-    timer = {}
-    interval = "static_cast<std::chrono::seconds>"
-    if ('timer' in event['precondition']) and \
-       (event['precondition']['timer'] is not None):
-        timer['interval'] = (interval +
-                             "(" +
-                             str(event['precondition']['timer']['interval']) +
-                             ")")
-    else:
-        timer['interval'] = (interval +
-                             "(" + str(0) + ")")
-    timer['type'] = "TimerType::repeating"
-    precond['pctime'] = timer
-
     return precond
 
 
diff --git a/control/templates/defs.mako b/control/templates/defs.mako
index 30045f6d..fd8d97d 100644
--- a/control/templates/defs.mako
+++ b/control/templates/defs.mako
@@ -59,8 +59,11 @@
 %endfor
 },
 TimerConf{
-    ${event['timer']['interval']},
-    ${event['timer']['type']}
+    %if ('timer' in event['triggers']) and \
+        (event['triggers']['timer'] is not None):
+    ${event['triggers']['timer']['interval']},
+    ${event['triggers']['timer']['type']}
+    %endif
 },
 std::vector<Signal>{
 %for s in event['triggers']['signals']:
diff --git a/control/templates/fan_zone_defs.mako.cpp b/control/templates/fan_zone_defs.mako.cpp
index a4ba615..ad37579 100644
--- a/control/templates/fan_zone_defs.mako.cpp
+++ b/control/templates/fan_zone_defs.mako.cpp
@@ -156,8 +156,11 @@
                         %endif
                         },
                         TimerConf{
-                            ${event['pc']['pctime']['interval']},
-                            ${event['pc']['pctime']['type']}
+                            %if ('timer' in event['pc']['triggers']) and \
+                                (event['pc']['triggers']['timer'] is not None):
+                            ${event['pc']['triggers']['pctime']['interval']},
+                            ${event['pc']['triggers']['pctime']['type']}
+                            %endif
                         },
                         std::vector<Signal>{
                         %for s in event['pc']['triggers']['pcsigs']:
diff --git a/control/types.hpp b/control/types.hpp
index dcc1b8c..d58231a 100644
--- a/control/types.hpp
+++ b/control/types.hpp
@@ -71,7 +71,7 @@
     oneshot,
     repeating,
 };
-using TimerConf = std::tuple<std::chrono::seconds,
+using TimerConf = std::tuple<std::chrono::microseconds,
                              TimerType>;
 
 constexpr auto sigMatchPos = 0;
diff --git a/control/zone.cpp b/control/zone.cpp
index fddca53..3960533 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -376,7 +376,7 @@
     }
     // Attach a timer to run the action of an event
     auto timerConf = std::get<timerConfPos>(event);
-    if (std::get<intervalPos>(timerConf) != seconds(0))
+    if (std::get<intervalPos>(timerConf) != microseconds(0))
     {
         addTimer(std::get<groupPos>(event),
                  std::get<actionsPos>(event),