예제 #1
0
    def generateInterfaceMethods(self, proxyStr, projectName):
        proxyStr.append('void Interfaces::connectProxies(int argc, char* argv[]) {\n')
        proxyStr.append('\tConfig::Properties props = Config::load(argc, argv);\n')
        proxyStr.append('\tjdrc = new Comm::Communicator(props);\n\n')
        for cfg in self.config.getInterfaces():
            proxyStr.append('\t' + cfg['name'] + ' = Comm::get' + cfg['interface'] + 'Client(jdrc, "'+projectName+'.' + cfg['name'] + '");\n')
            proxyStr.append('\tif (' + cfg['name'] + ' == NULL) {\n')
            proxyStr.append('\t\tthrow "invalid proxy ' + cfg['name'] + '";\n')
            proxyStr.append('\t}\n')
            proxyStr.append('\tstd::cout << "' + cfg['name'] + ' is connected" << std::endl;\n\n')

        # set inital values of variables
        for state in self.getAllStates():
            types, varNames, initialValues = CPPParser.parseVariables(state.getVariables())
            for i in range(len(types)):
                if initialValues[i] is not None:
                    proxyStr.append('\t' + varNames[i] + ' = ' + initialValues[i] + ';\n')

        proxyStr.append('}\n\n')

        proxyStr.append('void Interfaces::destroyProxies() {\n')
        proxyStr.append('\tif (jdrc != 0) {\n')
        proxyStr.append('\t}\n}\n\n')

        for state in self.getAllStates():
            returnTypes, funcNames, codes = CPPParser.parseFunctions(state.getFunctions())
            for i in range(len(returnTypes)):
                proxyStr.append(returnTypes[i] + ' Interfaces::' + funcNames[i] + '\n')
                proxyStr.append(codes[i])
                proxyStr.append('\n\n')
예제 #2
0
 def generateInterfaceClass(self, classStr):
     classStr.append('class Interfaces {\n')
     classStr.append('public:\n')
     classStr.append('\tComm::Communicator* jdrc;\n')
     for cfg in self.config.getInterfaces():
         classStr.append('\tComm::' + cfg['interface'] + 'Client* ' + cfg['name'] + ';\n')
     classStr.append('\n')
     classStr.append('\tvirtual void connectProxies(int argc, char* argv[]);\n')
     classStr.append('\tvirtual void destroyProxies();\n')
     for state in self.getAllStates():
         # define variables
         types, varNames, initialValues = CPPParser.parseVariables(state.getVariables())
         for i in range(len(types)):
             classStr.append('\t' + types[i] + ' ' + varNames[i] + ';\n')
         classStr.append('\n')
         returnTypes, funcNames, codes = CPPParser.parseFunctions(state.getFunctions())
         for i in range(len(returnTypes)):
             classStr.append('\t' + returnTypes[i] + ' ' + funcNames[i] + ';\n')
     classStr.append('};\n\n')
예제 #3
0
    def generateInterfaceClass(self, classStr, functions, variables):
        classStr.append('class Interfaces {\n')
        classStr.append('public:\n')
        classStr.append('\tComm::Communicator* jdrc;\n')
        for cfg in self.config.getInterfaces():
            classStr.append('\tComm::' + cfg['interface'] + 'Client* ' +
                            cfg['name'] + ';\n')
        classStr.append('\n')
        classStr.append(
            '\tvirtual void connectProxies(int argc, char* argv[]);\n')
        classStr.append('\tvirtual void destroyProxies();\n')
        # define variables
        types, varNames, initialValues = CPPParser.parseVariables(variables)
        for i in range(len(types)):
            classStr.append('\t' + types[i] + ' ' + varNames[i] + ';\n')
        classStr.append('\n')
        returnTypes, funcNames, codes = CPPParser.parseFunctions(functions)
        for i in range(len(returnTypes)):
            classStr.append('\t' + returnTypes[i] + ' ' + funcNames[i] + ';\n')

        classStr.append('};\n\n')
예제 #4
0
    def generateInterfaceMethods(self, proxyStr, projectName):
        proxyStr.append(
            'void Interfaces::connectProxies(int argc, char* argv[]) {\n')
        proxyStr.append(
            '\tConfig::Properties props = Config::load(argc, argv);\n')
        proxyStr.append('\tjdrc = new Comm::Communicator(props);\n\n')
        for cfg in self.config.getInterfaces():
            proxyStr.append('\t' + cfg['name'] + ' = Comm::get' +
                            cfg['interface'] + 'Client(jdrc, "' + projectName +
                            '.' + cfg['name'] + '");\n')
            proxyStr.append('\tif (' + cfg['name'] + ' == NULL) {\n')
            proxyStr.append('\t\tthrow "invalid proxy ' + cfg['name'] + '";\n')
            proxyStr.append('\t}\n')
            proxyStr.append('\tstd::cout << "' + cfg['name'] +
                            ' is connected" << std::endl;\n\n')

        # set inital values of variables
        for state in self.getAllStates():
            types, varNames, initialValues = CPPParser.parseVariables(
                state.getVariables())
            for i in range(len(types)):
                if initialValues[i] is not None:
                    proxyStr.append('\t' + varNames[i] + ' = ' +
                                    initialValues[i] + ';\n')

        proxyStr.append('}\n\n')

        proxyStr.append('void Interfaces::destroyProxies() {\n')
        proxyStr.append('\tif (jdrc != 0) {\n')
        proxyStr.append('\t}\n}\n\n')

        for state in self.getAllStates():
            returnTypes, funcNames, codes = CPPParser.parseFunctions(
                state.getFunctions())
            for i in range(len(returnTypes)):
                proxyStr.append(returnTypes[i] + ' Interfaces::' +
                                funcNames[i] + '\n')
                proxyStr.append(codes[i])
                proxyStr.append('\n\n')
예제 #5
0
    def generateRosMethods(self, rosStr, config):
        rosStr.append('RosNode::RosNode(int nodeRate):rate(nodeRate) {\n')
        for topic in config.getTopics():
            varName = topic['name'].replace('/', '_')
            if varName[0] == '_':
                varName = varName[1:]

            type = topic['type']
            types = type.split('/')
            if topic['opType'] == 'Publish':
                if len(types) == 2:
                    rosStr.append('\t' + varName + 'Pub = nh.advertise<' +
                                  types[0] + '::' + types[1] + '>("' +
                                  topic['name'] + '", 10);\n')
                else:
                    rosStr.append('\t' + varName + 'Pub = nh.advertise<' +
                                  type + '>("' + topic['name'] + '", 10);\n')
            elif topic['opType'] == 'Subscribe':
                rosStr.append('\t' + varName + 'Sub = nh.subscribe("' +
                              topic['name'] + '", 10, &RosNode::' + varName +
                              'Callback, this);\n')

        # set inital values of variables
        for state in self.getAllStates():
            types, varNames, initialValues = CPPParser.parseVariables(
                state.getVariables())
            for i in range(len(types)):
                if initialValues[i] is not None:
                    rosStr.append('\t' + varNames[i] + ' = ' +
                                  initialValues[i] + ';\n')

        rosStr.append('}\n\n')

        rosStr.append('void* RosNode::threadRunner(void* owner) {\n')
        rosStr.append('\t((RosNode*)owner)->run();\n')
        rosStr.append('}\n\n')

        rosStr.append('void RosNode::startThread() {\n')
        rosStr.append(
            '\tpthread_create(&thread, NULL, &RosNode::threadRunner, this);\n')
        rosStr.append('}\n\n')

        rosStr.append('void RosNode::run() {\n')
        rosStr.append('\twhile(nh.ok()) {\n')
        rosStr.append('\t\tros::spinOnce();\n')
        rosStr.append('\t\trate.sleep();\n')
        rosStr.append('\t}\n')
        rosStr.append('}\n\n')

        rosStr.append('void RosNode::join() {\n')
        rosStr.append('\tpthread_join(thread, NULL);\n')
        rosStr.append('}\n\n')

        for topic in config.getTopics():
            varName = topic['name'].replace('/', '_')
            if varName[0] == '_':
                varName = varName[1:]

            if topic['opType'] == 'Subscribe':
                type = topic['type']
                types = type.split('/')
                if len(types) == 2:
                    rosStr.append('void RosNode::' + varName +
                                  'Callback(const ' + types[0] + '::' +
                                  types[1] + '& ' + varName + ') {\n')
                else:
                    rosStr.append('void RosNode::' + varName +
                                  'Callback(const ' + type + '& ' + varName +
                                  ') {\n')
                rosStr.append('\tlast' + varName + ' = ' + varName + ';\n')
                rosStr.append('}\n\n')

                if len(types) == 2:
                    rosStr.append(types[0] + '::' + types[1] +
                                  '& RosNode::get' + varName + '() {\n')
                else:
                    rosStr.append(type + '& RosNode::get' + varName + '() {\n')
                rosStr.append('\treturn last' + varName + ';\n')
                rosStr.append('}\n\n')

            elif topic['opType'] == 'Publish':
                type = topic['type']
                types = type.split('/')
                if len(types) == 2:
                    rosStr.append('void RosNode::publish' + varName + '(' +
                                  types[0] + '::' + types[1] + '& ' + varName +
                                  ') {\n')
                else:
                    rosStr.append('void RosNode::publish' + varName + '(' +
                                  type + '& ' + varName + ') {\n')
                rosStr.append('\t' + varName + 'Pub.publish(' + varName +
                              ');\n')
                rosStr.append('}\n\n')

        for state in self.getAllStates():
            returnTypes, funcNames, codes = CPPParser.parseFunctions(
                state.getFunctions())
            for i in range(len(returnTypes)):
                rosStr.append(returnTypes[i] + ' RosNode::' + funcNames[i] +
                              '\n')
                rosStr.append(codes[i])
                rosStr.append('\n\n')
예제 #6
0
    def generateRosNodeClass(self, classStr, config):
        classStr.append('class RosNode {\n')
        classStr.append('private:\n')
        classStr.append('\tros::NodeHandle nh;\n')
        classStr.append('\tros::Rate rate;\n')
        classStr.append('\tpthread_t thread;\n\n')

        for topic in config.getTopics():
            varName = topic['name'].replace('/', '_')
            if varName[0] == '_':
                varName = varName[1:]

            if topic['opType'] == 'Publish':
                classStr.append('\tros::Publisher ' + varName + 'Pub;\n')
            elif topic['opType'] == 'Subscribe':
                classStr.append('\tros::Subscriber ' + varName + 'Sub;\n')
                type = topic['type']
                types = type.split('/')
                if len(types) == 2:
                    classStr.append('\t' + types[0] + '::' + types[1] +
                                    ' last' + varName + ';\n')
                    classStr.append('\t void ' + varName + 'Callback(const ' +
                                    types[0] + '::' + types[1] + '& ' +
                                    varName + ');\n')
                else:
                    classStr.append('\t' + type + ' last' + varName + ';\n')
                    classStr.append('\t void ' + varName + 'Callback(const ' +
                                    type + '& ' + varName + ');\n')
        classStr.append('\n\n')
        classStr.append('public:\n')
        classStr.append('\tRosNode(int nodeRate);\n')
        classStr.append('\tvoid startThread();\n')
        classStr.append('\tstatic void* threadRunner(void*);\n')
        classStr.append('\tvoid run();\n')
        classStr.append('\tvoid join();\n\n')

        for topic in config.getTopics():
            varName = topic['name'].replace('/', '_')
            if varName[0] == '_':
                varName = varName[1:]

            if topic['opType'] == 'Subscribe':
                type = topic['type']
                types = type.split('/')
                if len(types) == 2:
                    classStr.append('\t' + types[0] + '::' + types[1] +
                                    '& get' + varName + '();\n')
                else:
                    classStr.append('\t' + type + ' get' + varName + '();\n')
            elif topic['opType'] == 'Publish':
                type = topic['type']
                types = type.split('/')
                if len(types) == 2:
                    classStr.append('\tvoid publish' + varName + '(' +
                                    types[0] + '::' + types[1] + '& ' +
                                    varName + ');\n')
                else:
                    classStr.append('\tvoid publish' + varName + '(' + type +
                                    '& ' + varName + ');\n')
        classStr.append('\n')

        for state in self.getAllStates():
            # define variables
            types, varNames, initialValues = CPPParser.parseVariables(
                state.getVariables())
            for i in range(len(types)):
                classStr.append('\t' + types[i] + ' ' + varNames[i] + ';\n')
            classStr.append('\n')
            returnTypes, funcNames, codes = CPPParser.parseFunctions(
                state.getFunctions())
            for i in range(len(returnTypes)):
                classStr.append('\t' + returnTypes[i] + ' ' + funcNames[i] +
                                ';\n')

        classStr.append('};\n\n')
예제 #7
0
    def generateRosMethods(self, rosStr, config):
        rosStr.append('RosNode::RosNode(int nodeRate):rate(nodeRate) {\n')
        for topic in config.getTopics():
            varName = topic['name'].replace('/', '_')
            if varName[0] == '_':
                varName = varName[1:]

            type = topic['type']
            types = type.split('/')
            if topic['opType'] == 'Publish':
                if len(types) == 2:
                    rosStr.append('\t' + varName + 'Pub = nh.advertise<' + types[0] + '::' + types[1] + '>("' + topic['name'] + '", 10);\n')
                else:
                    rosStr.append('\t' + varName + 'Pub = nh.advertise<' + type + '>("' + topic[
                        'name'] + '", 10);\n')
            elif topic['opType'] == 'Subscribe':
                rosStr.append('\t' + varName + 'Sub = nh.subscribe("' + topic['name'] + '", 10, &RosNode::'+varName+'Callback, this);\n')

        # set inital values of variables
        for state in self.getAllStates():
            types, varNames, initialValues = CPPParser.parseVariables(state.getVariables())
            for i in range(len(types)):
                if initialValues[i] is not None:
                    rosStr.append('\t' + varNames[i] + ' = ' + initialValues[i] + ';\n')

        rosStr.append('}\n\n')

        rosStr.append('void* RosNode::threadRunner(void* owner) {\n')
        rosStr.append('\t((RosNode*)owner)->run();\n')
        rosStr.append('}\n\n')

        rosStr.append('void RosNode::startThread() {\n')
        rosStr.append('\tpthread_create(&thread, NULL, &RosNode::threadRunner, this);\n')
        rosStr.append('}\n\n')

        rosStr.append('void RosNode::run() {\n')
        rosStr.append('\twhile(nh.ok()) {\n')
        rosStr.append('\t\tros::spinOnce();\n')
        rosStr.append('\t\trate.sleep();\n')
        rosStr.append('\t}\n')
        rosStr.append('}\n\n')

        rosStr.append('void RosNode::join() {\n')
        rosStr.append('\tpthread_join(thread, NULL);\n')
        rosStr.append('}\n\n')

        for topic in config.getTopics():
            varName = topic['name'].replace('/', '_')
            if varName[0] == '_':
                varName = varName[1:]

            if topic['opType'] == 'Subscribe':
                type = topic['type']
                types = type.split('/')
                if len(types) == 2:
                    rosStr.append('void RosNode::' + varName + 'Callback(const ' + types[0] + '::' + types[1] + '& ' + varName + ') {\n')
                else:
                    rosStr.append('void RosNode::' + varName + 'Callback(const ' + type + '& ' + varName + ') {\n')
                rosStr.append('\tlast' + varName + ' = ' + varName + ';\n')
                rosStr.append('}\n\n')

                if len(types) == 2:
                    rosStr.append(types[0] + '::' + types[1] + '& RosNode::get' + varName + '() {\n')
                else:
                    rosStr.append(type + '& RosNode::get' + varName + '() {\n')
                rosStr.append('\treturn last' + varName + ';\n')
                rosStr.append('}\n\n')

            elif topic['opType'] == 'Publish':
                type = topic['type']
                types = type.split('/')
                if len(types) == 2:
                    rosStr.append('void RosNode::publish' + varName + '(' + types[0] + '::' + types[
                        1] + '& ' + varName + ') {\n')
                else:
                    rosStr.append('void RosNode::publish' + varName + '(' + type + '& ' + varName + ') {\n')
                rosStr.append('\t' + varName + 'Pub.publish(' + varName + ');\n')
                rosStr.append('}\n\n')

        for state in self.getAllStates():
            returnTypes, funcNames, codes = CPPParser.parseFunctions(state.getFunctions())
            for i in range(len(returnTypes)):
                rosStr.append(returnTypes[i] + ' RosNode::' + funcNames[i] + '\n')
                rosStr.append(codes[i])
                rosStr.append('\n\n')
예제 #8
0
    def generateRosNodeClass(self, classStr, config):
        classStr.append('class RosNode {\n')
        classStr.append('private:\n')
        classStr.append('\tros::NodeHandle nh;\n')
        classStr.append('\tros::Rate rate;\n')
        classStr.append('\tpthread_t thread;\n\n')

        for topic in config.getTopics():
            varName = topic['name'].replace('/', '_')
            if varName[0] == '_':
                varName = varName[1:]

            if topic['opType'] == 'Publish':
                classStr.append('\tros::Publisher ' + varName + 'Pub;\n')
            elif topic['opType'] == 'Subscribe':
                classStr.append('\tros::Subscriber ' + varName + 'Sub;\n')
                type = topic['type']
                types = type.split('/')
                if len(types) == 2:
                    classStr.append('\t' + types[0] + '::' + types[1] + ' last' + varName + ';\n')
                    classStr.append('\t void ' + varName + 'Callback(const ' + types[0] + '::' + types[1] + '& ' + varName + ');\n')
                else:
                    classStr.append('\t' + type + ' last' + varName + ';\n')
                    classStr.append(
                        '\t void ' + varName + 'Callback(const ' + type + '& ' + varName + ');\n')
        classStr.append('\n\n')
        classStr.append('public:\n')
        classStr.append('\tRosNode(int nodeRate);\n')
        classStr.append('\tvoid startThread();\n')
        classStr.append('\tstatic void* threadRunner(void*);\n')
        classStr.append('\tvoid run();\n')
        classStr.append('\tvoid join();\n\n')

        for topic in config.getTopics():
            varName = topic['name'].replace('/', '_')
            if varName[0] == '_':
                varName = varName[1:]

            if topic['opType'] == 'Subscribe':
                type = topic['type']
                types = type.split('/')
                if len(types) == 2:
                    classStr.append('\t' + types[0] + '::' + types[1] + '& get' + varName + '();\n')
                else:
                    classStr.append('\t' + type + ' get' + varName + '();\n')
            elif topic['opType'] == 'Publish':
                type = topic['type']
                types = type.split('/')
                if len(types) == 2:
                    classStr.append('\tvoid publish' + varName + '(' + types[0] + '::' + types[1] + '& ' + varName + ');\n')
                else:
                    classStr.append('\tvoid publish' + varName + '(' + type + '& ' + varName + ');\n')
        classStr.append('\n')

        for state in self.getAllStates():
            # define variables
            types, varNames, initialValues = CPPParser.parseVariables(state.getVariables())
            for i in range(len(types)):
                classStr.append('\t' + types[i] + ' ' + varNames[i] + ';\n')
            classStr.append('\n')
            returnTypes, funcNames, codes = CPPParser.parseFunctions(state.getFunctions())
            for i in range(len(returnTypes)):
                classStr.append('\t' + returnTypes[i] + ' ' + funcNames[i] + ';\n')

        classStr.append('};\n\n')