From 9af190cd94e68b378da4e25accb5c03258a2fb31 Mon Sep 17 00:00:00 2001 From: Matthew Barth Date: Tue, 8 Aug 2017 14:20:43 -0500 Subject: Update parser to support optional preconditions Set speed events are now allowed to have preconditions defined within the event where those preconditions must be met before the set speed event is enabled and active. The supported precondition added is against a list of groups and their properties matching a given value. The parser generates a precondition with the same layout as a set speed event where the event is nested as the last parameter to the precondition function. Having the set speed event as the last input parameter to precondition functions is required. Resolves openbmc/openbmc#1835 Change-Id: I7a247e7eb2d6b31ba9a60da1bc321a35edda9b24 Signed-off-by: Matthew Barth --- control/gen-fan-zone-defs.py | 139 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 137 insertions(+), 2 deletions(-) (limited to 'control/gen-fan-zone-defs.py') 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 Manager::_zoneLayouts }, std::vector{ %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 Manager::_zoneLayouts }, %endfor } + %if ('pc' in event) and (event['pc'] is not None): + } + )), + std::vector{ + %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" + 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'] -- cgit v1.2.1