diff options
-rwxr-xr-x | control/gen-fan-zone-defs.py | 417 |
1 files changed, 219 insertions, 198 deletions
diff --git a/control/gen-fan-zone-defs.py b/control/gen-fan-zone-defs.py index 3ccab36..40bec2c 100755 --- a/control/gen-fan-zone-defs.py +++ b/control/gen-fan-zone-defs.py @@ -43,13 +43,15 @@ handler::${sig['handler']}( </%def>\ <%def name="genSSE(event)" buffered="True"> Group{ -%for member in event['group']: +%for group in event['groups']: +%for member in group['members']: { "${member['object']}", {"${member['interface']}", "${member['property']}"} }, %endfor +%endfor }, std::vector<Action>{ %for a in event['action']: @@ -151,13 +153,15 @@ const std::vector<ZoneGroup> Manager::_zoneLayouts (event['pc'] is not None): SetSpeedEvent{ Group{ - %for member in event['pc']['pcgrp']: + %for group in event['pc']['pcgrps']: + %for member in group['members']: { "${member['object']}", {"${member['interface']}", "${member['property']}"} }, %endfor + %endfor }, std::vector<Action>{ %for i, a in enumerate(event['pc']['pcact']): @@ -251,6 +255,56 @@ def convertToMap(listOfDict): return listOfDict +def getGroups(zNum, zCond, edata, events): + """ + Extract and construct the groups for the given event. + """ + groups = [] + for eGroups in edata['groups']: + if ('zone_conditions' in eGroups) and \ + (eGroups['zone_conditions'] is not None): + # Zone conditions are optional in the events yaml but skip + # if this event's condition is not in this zone's conditions + if all('name' in z and z['name'] is not None and + not any(c['name'] == z['name'] for c in zCond) + for z in eGroups['zone_conditions']): + continue + + # Zone numbers are optional in the events yaml but skip if this + # zone's zone number is not in the event's zone numbers + if all('zones' in z and z['zones'] is not None and + zNum not in z['zones'] + for z in eGroups['zone_conditions']): + continue + + eGroup = next(g for g in events['groups'] + if g['name'] == eGroups['name']) + + group = {} + members = [] + group['name'] = eGroup['name'] + for m in eGroup['members']: + member = {} + member['path'] = eGroup['type'] + member['object'] = (eGroup['type'] + m) + member['interface'] = eGroups['interface'] + member['property'] = eGroups['property']['name'] + member['type'] = eGroups['property']['type'] + # Add expected group member's property value if given + if ('value' in eGroups['property']) and \ + (eGroups['property']['value'] is not None): + if isinstance(eGroups['property']['value'], str) or \ + "string" in str(member['type']).lower(): + member['value'] = ( + "\"" + eGroups['property']['value'] + "\"") + else: + member['value'] = eGroups['property']['value'] + members.append(member) + group['members'] = members + groups.append(group) + return groups + + def getActions(edata, actions, events): """ Extracts and constructs the make_action function call for @@ -288,14 +342,14 @@ def getActions(edata, actions, events): param += "}" elif p == 'property': if isinstance(eActions[p], str) or \ - "string" in str(edata['property']['type']).lower(): + "string" in str(eActions[p]['type']).lower(): param += ( - str(edata['property']['type']).lower() + + str(eActions[p]['type']).lower() + ">(\"" + str(eActions[p]) + "\")") else: param += ( - str(edata['property']['type']).lower() + - ">(" + str(eActions[p]).lower() + ")") + str(eActions[p]['type']).lower() + + ">(" + str(eActions[p]['value']).lower() + ")") else: # Default type to 'size_t' when not given param += ("size_t>(" + str(eActions[p]).lower() + ")") @@ -332,108 +386,87 @@ def getEvent(zone_num, zone_conditions, e, events_data): that construct an event within the generated source. """ event = {} - # Zone numbers are optional in the events yaml but skip if this - # zone's zone number is not in the event's zone numbers - if all('zones' in z and - z['zones'] is not None and - zone_num not in z['zones'] - for z in e['zone_conditions']): - return - # Zone conditions are optional in the events yaml but skip - # if this event's condition is not in this zone's conditions - if all('name' in z and z['name'] is not None and - not any(c['name'] == z['name'] for c in zone_conditions) - for z in e['zone_conditions']): + # Add set speed event groups + grps = getGroups(zone_num, zone_conditions, e, events_data) + if not grps: return - - # Add set speed event group - group = [] - groups = next(g for g in events_data['groups'] - if g['name'] == e['group']) - for member in groups['members']: - members = {} - members['object'] = (groups['type'] + - member) - members['interface'] = e['interface'] - members['property'] = e['property']['name'] - members['type'] = e['property']['type'] - group.append(members) - event['group'] = group + event['groups'] = grps # Add set speed actions and function parameters event['action'] = getActions(e, e, events_data) # Add signal handlers signals = [] - for member in group: - for eMatches in e['matches']: - signal = {} - eMatch = next(m for m in events_data['matches'] - if m['name'] == eMatches['name']) - 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 - 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] + "\"" + 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']) + 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 + 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] = "Group{\n" - for m in group: - 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] + "\"" + 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] = "Group{\n" - for m in group: - 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) + hparams[hp] = member[hp] + hparams['params'] = hplist + signal['hparams'] = hparams + signals.append(signal) event['signals'] = signals # Add optional action call timer @@ -461,24 +494,10 @@ def addPrecondition(zNum, zCond, event, events_data): """ 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['object'] = (groups['type'] + - member) - members['interface'] = grp['interface'] - members['property'] = grp['property']['name'] - members['type'] = grp['property']['type'] - if isinstance(grp['property']['value'], str) or \ - "string" in str(members['type']).lower(): - members['value'] = "\"" + grp['property']['value'] + "\"" - else: - members['value'] = grp['property']['value'] - group.append(members) - precond['pcgrp'] = group + grps = getGroups(zNum, zCond, event['precondition'], events_data) + if not grps: + return + precond['pcgrps'] = grps # Add set speed event precondition actions pc = [] @@ -494,22 +513,23 @@ def addPrecondition(zNum, zCond, event, events_data): param['open'] = "{" param['close'] = "}" values = [] - for pcgrp in group: - value = {} - value['value'] = ( - "PrecondGroup{\"" + - str(pcgrp['object']) + "\",\"" + - str(pcgrp['interface']) + "\",\"" + - str(pcgrp['property']) + "\"," + - "static_cast<" + - str(pcgrp['type']).lower() + ">") - if isinstance(pcgrp['value'], str) or \ - "string" in str(pcgrp['type']).lower(): - value['value'] += ("(" + str(pcgrp['value']) + ")}") - else: - value['value'] += \ - ("(" + str(pcgrp['value']).lower() + ")}") - values.append(value) + for group in precond['pcgrps']: + for pcgrp in group['members']: + value = {} + value['value'] = ( + "PrecondGroup{\"" + + str(pcgrp['object']) + "\",\"" + + str(pcgrp['interface']) + "\",\"" + + str(pcgrp['property']) + "\"," + + "static_cast<" + + str(pcgrp['type']).lower() + ">") + if isinstance(pcgrp['value'], str) or \ + "string" in str(pcgrp['type']).lower(): + value['value'] += ("(" + str(pcgrp['value']) + ")}") + else: + value['value'] += \ + ("(" + str(pcgrp['value']).lower() + ")}") + values.append(value) param['values'] = values params.append(param) pcs['params'] = params @@ -526,74 +546,75 @@ def addPrecondition(zNum, zCond, event, events_data): # Add precondition signal handlers signals = [] - for member in group: - for eMatches in event['precondition']['matches']: - signal = {} - eMatch = next(m for m in events_data['matches'] - if m['name'] == eMatches['name']) - 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 - 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] + "\"" + for group in precond['pcgrps']: + for member in group['members']: + for eMatches in event['precondition']['matches']: + signal = {} + eMatch = next(m for m in events_data['matches'] + if m['name'] == eMatches['name']) + 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 + 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: + sparams[sp] += ( + "{\n" + + "\"" + str(m['object']) + "\",\n" + + "{\"" + str(m['interface']) + "\"," + + "\"" + str(m['property']) + "\"}\n" + + "},\n") + sparams[sp] += "}" else: - sparams[sp] = "Group{\n" - for m in group: - 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] + "\"" + 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: + hparams[hp] += ( + "{\n" + + "\"" + str(m['object']) + "\",\n" + + "{\"" + str(m['interface']) + "\"," + + "\"" + str(m['property']) + "\"}\n" + + "},\n") + hparams[hp] += "}" else: - hparams[hp] = "Group{\n" - for m in group: - 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) + hparams[hp] = member[hp] + hparams['params'] = hplist + signal['hparams'] = hparams + signals.append(signal) precond['pcsigs'] = signals # Add optional action call timer |