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),