summaryrefslogtreecommitdiffstats
path: root/control/gen-fan-zone-defs.py
diff options
context:
space:
mode:
Diffstat (limited to 'control/gen-fan-zone-defs.py')
-rwxr-xr-xcontrol/gen-fan-zone-defs.py139
1 files changed, 137 insertions, 2 deletions
diff --git a/control/gen-fan-zone-defs.py b/control/gen-fan-zone-defs.py
index 177bfe0..ea05a0f 100755
--- a/control/gen-fan-zone-defs.py
+++ b/control/gen-fan-zone-defs.py
@@ -17,6 +17,7 @@ tmpl = '''/* This is a generated file. */
#include "functor.hpp"
#include "actions.hpp"
#include "handlers.hpp"
+#include "preconditions.hpp"
using namespace phosphor::fan::control;
using namespace sdbusplus::bus::match::rules;
@@ -66,6 +67,32 @@ const std::vector<ZoneGroup> Manager::_zoneLayouts
},
std::vector<SetSpeedEvent>{
%for event in zone['events']:
+ %if ('pc' in event) and \
+ (event['pc'] is not None):
+ SetSpeedEvent{
+ Group{
+ %for member in event['pc']['pcgrp']:
+ {
+ "${member['name']}",
+ {"${member['interface']}",
+ "${member['property']}"}
+ },
+ %endfor
+ },
+ make_action(
+ precondition::${event['pc']['pcact']['name']}(
+ %for i, p in enumerate(event['pc']['pcact']['params']):
+ ${p['type']}${p['open']}
+ %for j, v in enumerate(p['values']):
+ %if (j+1) != len(p['values']):
+ ${v['value']},
+ %else:
+ ${v['value']}
+ %endif
+ %endfor
+ ${p['close']},
+ %endfor
+ %endif
SetSpeedEvent{
Group{
%for member in event['group']:
@@ -105,6 +132,43 @@ const std::vector<ZoneGroup> Manager::_zoneLayouts
},
%endfor
}
+ %if ('pc' in event) and (event['pc'] is not None):
+ }
+ )),
+ 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']}",
+ handler::setProperty<${s['type']}>(
+ "${s['path']}",
+ "${s['interface']}",
+ "${s['property']}"
+ )
+ ))
+ },
+ PropertyChange{
+ interface("org.freedesktop.DBus.Properties") +
+ member("PropertiesChanged") +
+ type::signal() +
+ path("${s['path']}") +
+ arg0namespace("${s['interface']}"),
+ make_handler(propertySignal<${s['type']}>(
+ "${s['interface']}",
+ "${s['property']}",
+ handler::setProperty<${s['type']}>(
+ "${s['path']}",
+ "${s['interface']}",
+ "${s['property']}"
+ )
+ ))
+ },
+ %endfor
+ }
+ %endif
},
%endfor
}
@@ -127,6 +191,73 @@ def convertToMap(listOfDict):
return listOfDict
+def addPrecondition(event, events_data):
+ """
+ Parses the precondition section of an event and populates the necessary
+ structures to generate a precondition for a set speed event.
+ """
+ precond = {}
+ # Add set speed event precondition group
+ group = []
+ for grp in event['precondition']['groups']:
+ groups = next(g for g in events_data['groups']
+ if g['name'] == grp['name'])
+ for member in groups['members']:
+ members = {}
+ members['obj_path'] = groups['type']
+ members['name'] = (groups['type'] +
+ member)
+ members['interface'] = grp['interface']
+ members['property'] = grp['property']['name']
+ members['type'] = grp['property']['type']
+ members['value'] = grp['property']['value']
+ group.append(members)
+ precond['pcgrp'] = group
+
+ # Add set speed event precondition action
+ pc = {}
+ pc['name'] = event['precondition']['name']
+ pcs = next(p for p in events_data['preconditions']
+ if p['name'] == event['precondition']['name'])
+ params = []
+ for p in pcs['parameters']:
+ param = {}
+ if p == 'groups':
+ param['type'] = "std::vector<PrecondGroup>"
+ param['open'] = "{"
+ param['close'] = "}"
+ values = []
+ for pcgrp in group:
+ value = {}
+ value['value'] = (
+ "PrecondGroup{\"" +
+ str(pcgrp['name']) + "\",\"" +
+ str(pcgrp['interface']) + "\",\"" +
+ str(pcgrp['property']) + "\"," +
+ "static_cast<" +
+ str(pcgrp['type']).lower() + ">" +
+ "(" + str(pcgrp['value']).lower() + ")}")
+ values.append(value)
+ param['values'] = values
+ params.append(param)
+ pc['params'] = params
+ precond['pcact'] = pc
+
+ # Add precondition property change signal handler
+ signal = []
+ 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
+
+ return precond
+
+
def getEventsInZone(zone_num, zone_conditions, events_data):
"""
Constructs the event entries defined for each zone using the events yaml
@@ -151,6 +282,11 @@ def getEventsInZone(zone_num, zone_conditions, events_data):
continue
event = {}
+ # Add precondition if given
+ if ('precondition' in e) and \
+ (e['precondition'] is not None):
+ event['pc'] = addPrecondition(e, events_data)
+
# Add set speed event group
group = []
groups = next(g for g in events_data['groups']
@@ -158,8 +294,7 @@ def getEventsInZone(zone_num, zone_conditions, events_data):
for member in groups['members']:
members = {}
members['type'] = groups['type']
- members['name'] = ("/xyz/openbmc_project/" +
- groups['type'] +
+ members['name'] = (groups['type'] +
member)
members['interface'] = e['interface']
members['property'] = e['property']['name']
OpenPOWER on IntegriCloud