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')
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')
def generateStateMethods(self, stateStr): for state in self.getAllStates(): stateStr.append('void State' + str(state.id) + '::runCode() {\n') for codeLine in state.getCode().split('\n'): stateStr.append('\t' + codeLine + '\n') stateStr.append('}\n\n') returnTypes, funcNames, codes = CPPParser.parseFunctions(state.getFunctions()) for i in range(len(returnTypes)): stateStr.append(returnTypes[i] + ' State' + str(state.id) + '::' + funcNames[i] + '\n') stateStr.append(codes[i]) stateStr.append('\n\n')
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')
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')
def generateStateMethods(self, stateStr): for state in self.getAllStates(): stateStr.append('void State' + str(state.id) + '::runCode() {\n') for codeLine in state.getCode().split('\n'): stateStr.append('\t' + codeLine + '\n') stateStr.append('}\n\n') returnTypes, funcNames, codes = CPPParser.parseFunctions( state.getFunctions()) for i in range(len(returnTypes)): stateStr.append(returnTypes[i] + ' State' + str(state.id) + '::' + funcNames[i] + '\n') stateStr.append(codes[i]) stateStr.append('\n\n')
def generateStateClasses(self, classStr): for state in self.getAllStates(): classStr.append('class State' + str(state.id) + ' : public State {\n') classStr.append('public:\n') classStr.append('\tRosNode* node;\n') classStr.append(state.getVariables()) classStr.append('\tState' + str(state.id) + '(int id, bool initial, RosNode* node, int cycleDuration, State* parent, RunTimeGui* gui):\n') classStr.append('\t\tState(id, initial, cycleDuration, parent, gui) {this->node = node;}\n') classStr.append('\tvirtual void runCode();\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')
def generateStateClasses(self, classStr): for state in self.getAllStates(): classStr.append('class State' + str(state.id) + ' : public State {\n') classStr.append('public:\n') classStr.append('\tRosNode* node;\n') classStr.append(state.getVariables()) classStr.append( '\tState' + str(state.id) + '(int id, bool initial, RosNode* node, int cycleDuration, State* parent, RunTimeGui* gui):\n' ) classStr.append( '\t\tState(id, initial, cycleDuration, parent, gui) {this->node = node;}\n' ) classStr.append('\tvirtual void runCode();\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')
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')
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')
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')
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')