Example #1
0
    def create(self):
        # Write controller labels
        self.nlsData.append('# controller labels')
        self.nlsData.append('')
        self.nlsData.append(
            self.NODE_NAME.format(
                'controller',
                self.config['controller']['name'] + ' Controller'))
        self.nlsData.append(
            self.NODE_ICON.format(
                'controller',
                self.config['controller'].get('icon', 'GenericCtl')))
        self.nlsData.append('')
        self.nlsData.append(
            self.COMMAND_NAME.format('ctl-DISCOVER', 'Re-Discover'))
        self.nlsData.append(
            self.STATUS_NAME.format(
                'ctl', 'ST', self.config['controller']['name'] + ' Online'))
        self.nlsData.append('')

        # Write controller node
        nodeDef = ET.SubElement(self.nodeTree,
                                'nodeDef',
                                id='controller',
                                nls='ctl')
        sts = ET.SubElement(nodeDef, 'sts')
        ET.SubElement(sts, 'st', id='ST', editor='bool')
        cmds = ET.SubElement(nodeDef, 'cmds')
        ET.SubElement(cmds, 'sends')
        accepts = ET.SubElement(cmds, 'accepts')
        ET.SubElement(accepts, 'cmd', id='DISCOVER')

        # Write primary devices
        for driverName, driverData in self.config['drivers'].items():
            polyCommandsData = self.config['poly']['drivers'].get(
                driverName, {}).get('commands', {})
            paramParser = ParamParser(driverData, True)
            nodeDesc = driverData.get('description',
                                      utils.name_to_desc(driverName))
            nlsName = utils.name_to_nls(driverName)
            nlsData = [
                self.STATUS_NAME.format(nlsName, 'ST', nodeDesc + ' Online')
            ]
            states = self.write_node_info(polyCommandsData, paramParser,
                                          driverName, nodeDesc, nlsName,
                                          driverData, nlsData)
            ET.SubElement(states, 'st', id='ST', editor='bool')
            # Write sub devices
            for groupName, groupData in driverData.get('commandGroups',
                                                       {}).items():
                polyGroupData = self.config['poly']['commandGroups'].get(
                    groupName)
                if polyGroupData:
                    self.write_node_info(
                        polyCommandsData, paramParser,
                        driverName + '_' + groupName,
                        nodeDesc + ' ' + utils.name_to_desc(groupName),
                        utils.name_to_nls(driverName +
                                          polyGroupData.get('nls', groupName)),
                        groupData)
Example #2
0
    def write_node_info(self,
                        polyCommandsData,
                        paramParser,
                        nodeName,
                        nodeDesc,
                        nlsName,
                        nodeData,
                        nlsData=[]):
        assert len(nlsName) <= 16, 'Node NLS name is too long: {}'.format(
            nlsName)

        self.nlsData.append('# ' + nodeName + ' labels\n')
        self.nlsData.append(self.NODE_NAME.format(nodeName, nodeDesc))
        self.nlsData.append(
            self.NODE_ICON.format(nodeName, nodeData.get('icon',
                                                         'GenericCtl')))
        self.nlsData.extend(nlsData)
        nodeDef = ET.SubElement(self.nodeTree,
                                'nodeDef',
                                id=nodeName,
                                nls=nlsName)
        states = ET.SubElement(nodeDef, 'sts')
        cmds = ET.SubElement(nodeDef, 'cmds')
        ET.SubElement(cmds, 'sends')
        accepts = ET.SubElement(cmds, 'accepts')
        for commandName, commandData in nodeData['commands'].items():
            if not commandData.get('result'):
                commandKey = nodeName + '_' + commandName
                self.nlsData.append(
                    self.COMMAND_NAME.format(
                        nlsName + '-' + commandName,
                        commandData.get('description',
                                        utils.name_to_desc(commandName))))
                cmd = ET.SubElement(accepts, 'cmd', id=commandName)
                param = None
                nlsCommand = utils.name_to_nls(commandKey)
                polyData = polyCommandsData.get(commandName, {})
                if commandData.get('acceptsNumber'):
                    param = ET.SubElement(cmd, 'p', id='', editor=nlsCommand)
                    editor = ET.SubElement(self.editorTree,
                                           'editor',
                                           id=nlsCommand)
                    range = ET.SubElement(editor, 'range')
                    for rangeKey, rangeValue in polyData['param'].items():
                        range.set(rangeKey, str(rangeValue))
                elif 'value_set' in commandData:
                    names = paramParser.value_sets[commandData['value_set'] +
                                                   '_names']
                    param = ET.SubElement(cmd, 'p', id='', editor=nlsCommand)
                    editor = ET.SubElement(self.editorTree,
                                           'editor',
                                           id=nlsCommand)
                    ET.SubElement(editor,
                                  'range',
                                  uom='25',
                                  subset='0-' + str(len(names) - 1),
                                  nls=nlsCommand + '_I')
                    for key, value in names.items():
                        self.nlsData.append(nlsCommand + '_I-' + str(key) +
                                            ' = ' + value)

                if 'driver' in polyData:
                    polyDriverName = polyData['driver']['name']
                    param.set('init', polyDriverName)
                    ET.SubElement(states,
                                  'st',
                                  id=polyDriverName,
                                  editor=nlsCommand)
                    self.nlsData.append(
                        self.STATUS_NAME.format(
                            nlsName, polyDriverName, polyData['driver'].get(
                                'description',
                                utils.name_to_desc(commandName))))

        self.nlsData.append('')
        return states
Example #3
0
    def write_node_info(self,
                        polyCommandsData,
                        paramParser,
                        nodeName,
                        nodeDesc,
                        nlsName,
                        nodeData,
                        nlsData=[]):
        assert len(nlsName) <= 16, 'Node NLS name is too long: {}'.format(
            nlsName)

        self.nlsData.append('# ' + nodeName + ' labels\n')
        self.nlsData.append(self.NODE_NAME.format(nodeName, nodeDesc))
        self.nlsData.append(
            self.NODE_ICON.format(nodeName, nodeData.get('icon',
                                                         'GenericCtl')))
        self.nlsData.extend(nlsData)
        nodeDef = ET.SubElement(self.nodeTree,
                                'nodeDef',
                                id=nodeName,
                                nls=nlsName)
        states = ET.SubElement(nodeDef, 'sts')
        cmds = ET.SubElement(nodeDef, 'cmds')
        ET.SubElement(cmds, 'sends')
        accepts = ET.SubElement(cmds, 'accepts')
        cmd_list = []
        for commandName, commandData in nodeData['commands'].items():
            commandKey = nodeName + '_' + commandName
            nlsCommand = utils.name_to_nls(commandKey)
            polyData = polyCommandsData.get(commandName, {})
            polyDriverName = polyData.get('driver', {}).get('name')
            if not commandData.get('result'):
                self.nlsData.append(
                    self.COMMAND_NAME.format(
                        nlsName + '-' + commandName,
                        commandData.get('description',
                                        utils.name_to_desc(commandName))))
                cmd = ET.SubElement(accepts, 'cmd', id=commandName)
                param = None
                if (commandData.get('acceptsNumber')
                        or commandData.get('acceptsHex')
                        or commandData.get('acceptsPct')
                        or commandData.get('acceptsFloat')):
                    param = ET.SubElement(cmd, 'p', id='', editor=nlsCommand)
                    editor = ET.SubElement(self.editorTree,
                                           'editor',
                                           id=nlsCommand)
                    range = ET.SubElement(editor, 'range')
                    for rangeKey, rangeValue in polyData['param'].items():
                        range.set(rangeKey, str(rangeValue))
                elif 'value_set' in commandData:
                    param = ET.SubElement(cmd, 'p', id='', editor=nlsCommand)
                    self.add_driver_desc(
                        nlsCommand,
                        paramParser.value_sets[commandData['value_set'] +
                                               '_names'])
                else:
                    cmd_list.append(commandName)

                if polyDriverName:
                    if param is None:
                        raise RuntimeError(
                            'Driver configured but command is not configured for parameters: '
                            + commandName)
                    param.set('init', polyDriverName)

            elif commandData.get('readOnly',
                                 False) and 'value_set' in commandData:
                self.add_driver_desc(
                    nlsCommand, paramParser.value_sets[
                        commandData['value_set'].replace('_reverse', '') +
                        '_names'])

            if polyDriverName:
                ET.SubElement(states,
                              'st',
                              id=polyDriverName,
                              editor=nlsCommand)

                self.nlsData.append(
                    self.STATUS_NAME.format(
                        nlsName, polyDriverName, polyData['driver'].get(
                            'description', utils.name_to_desc(commandName))))

        if len(cmd_list) > self.COMMAND_LIST_THRESHOLD:
            nlsCommand = nlsName + '_C'
            for cmd_index, commandName in enumerate(cmd_list):
                self.nlsData.append(
                    nlsCommand + '-' + str(cmd_index) + ' = ' +
                    commandData.get('description',
                                    utils.name_to_desc(commandName)))
            self.nlsData.append(
                self.COMMAND_NAME.format(nlsName + '-execute', 'Send Command'))
            cmd = ET.SubElement(accepts, 'cmd', id='execute')
            param = ET.SubElement(cmd, 'p', id='', editor=nlsCommand)
            editor = ET.SubElement(self.editorTree, 'editor', id=nlsCommand)
            range = ET.SubElement(editor, 'range')
            range.set('nls', nlsCommand)
            range.set('uom', '25')
            range.set('subset', '0-' + str(len(cmd_list) - 1))

        self.nlsData.append('')
        return states