def generate_on_exit_code(self, event, callback_name): code = C.sequence() else_str = 'else ' if len(self.calls) > 0 else '' code.append(C.line(else_str+'if ( (previousMode == RTE_MODE_{0}) && (newMode != RTE_MODE_{0}) )'.format(event.mode+'_'+event.modeDeclaration))) block = C.block(innerIndent = innerIndentDefault) block.append(C.statement(C.fcall(callback_name))) code.append(block) self.add_event_to_call(event, callback_name) self.body.extend(code)
def _genWrite(self, fp, prototypes): for proto in prototypes: hasComSignal = False body = C.block(innerIndent=3) if proto.data_element.name in self.com_access['send']: func = self.com_access['send'][proto.data_element.name] body.code.append(C.statement('return '+str(C.fcall(func.name, params=[proto.func.args[0].name])))) else: body.code.append(C.statement('return RTE_E_OK')) fp.write(str(proto.func)+'\n') fp.write('\n'.join(body.lines())+'\n\n')
def _generate_runnable_calls(self, code, matching_runnables): events = matching_runnables[0].event_triggers if len(events) == 1: event = events[0] if not isinstance(event, autosar.rte.base.OperationInvokedEvent): code.append(C.line('if (eventMask & %s)' % event.symbol)) block = C.block(innerIndent=innerIndentDefault) for runnable in matching_runnables: block.append(C.statement(C.fcall(runnable.symbol))) code.append(block) elif len(events) > 1: raise NotImplementedError('multiple events')
def _genRead(self, fp, prototypes): """Generates all Rte_Read functions""" for proto in prototypes: body = C.block(innerIndent=3) #body.code.append(C.statement('*%s = %s'%(proto.func.args[0].name, proto.rte_var.name))) #print(proto.rte_var.typename) if proto.data_element.name in self.com_access['receive']: func = self.com_access['receive'][proto.data_element.name] body.code.append(C.statement('return '+str(C.fcall(func.name, params=[proto.func.args[0].name])))) else: body.code.append(C.statement('return RTE_E_OK')) fp.write(str(proto.func)+'\n') fp.write('\n'.join(body.lines())+'\n\n')
def _printf(): print("Generate printf function...") body = C.block(innerIndent=3) body.append(C.statement(C.fcall('printf').add_arg('\"%d\"').add_arg('p0'))) head = C.function( 'f_printf', 'void', ).add_param(C.variable('p0', 'int')) func = C.sequence() func.append(head) func.append(body) print(str(func)) return func
def _generate_mode_switch_func(self, callback_name, events): code = C.sequence() generated=set() code.append(C.function(callback_name, 'void')) block = C.block(innerIndent = innerIndentDefault) for event in events: task = self.cfg.find_os_task_by_runnable(event.runnable) if task is not None: if (task.name, event.name) not in generated: block.append(C.statement(C.fcall('os_task_setEvent', params=['&m_os_task_%s'%task.name, 'EVENT_MASK_%s_%s'%(task.name, event.name)]))) generated.add((task.name, event.name)) code.append(block) return code
def _createMockServerCallFunction(self, proto, var_name): body = C.block(innerIndent=innerIndentDefault) body.append(C.line('if (%s != 0)' % (var_name))) inner = C.block(innerIndent=innerIndentDefault) fcall = C.fcall(var_name) for arg in proto.args: fcall.add_param(arg.name) if proto.typename != 'void': inner.append(C.statement('return %s' % str(fcall))) else: inner.append(C.statement(fcall)) body.append(inner) if proto.typename != 'void': body.append(C.statement('return RTE_E_OK')) return body
def _scanf_no_pointer(): print("Generate scanf function...") body = C.block(innerIndent=3) body.append(C.statement(C.variable('var0', 'int'))) body.append( C.statement(C.fcall('scanf').add_arg('\"%d\"').add_arg('&var0'))) body.append(C.statement("return var0")) head = C.function( 'f_scanf_nop', 'int', ) func = C.sequence() func.append(head) func.append(body) print(str(func)) return func
def _generate_mode_switch_func(self, callback_name, events): code = C.sequence() generated = set() code.append(C.function(callback_name, 'void')) block = C.block(innerIndent=innerIndentDefault) for event in events: task = self.cfg.find_os_task_by_runnable(event.runnable) if task is not None: if (task.name, event.name) not in generated: block.append( C.statement( C.fcall('os_task_setEvent', params=[ '&m_os_task_%s' % task.name, 'EVENT_MASK_%s_%s' % (task.name, event.name) ]))) generated.add((task.name, event.name)) code.append(block) return code
def _genWrite(self, fp, prototypes): for port_func in prototypes: hasComSignal = False body = C.block(innerIndent=innerIndentDefault) if port_func.data_element.symbol is not None: body.code.append( C.statement('%s = %s' % (port_func.data_element.symbol, port_func.proto.args[0].name))) if port_func.data_element.com_access['Send'] is not None: com_func = port_func.data_element.com_access['Send'] body.code.append( C.statement('return ' + str( C.fcall(com_func.name, params=[port_func.proto.args[0].name])))) else: if port_func.data_element.result_var is not None: body.code.append( C.statement('return %s' % port_func.data_element.result_var.name)) else: body.code.append(C.statement('return RTE_E_OK')) fp.write(str(port_func.proto) + '\n') fp.write('\n'.join(body.lines()) + '\n\n')
def _genRead(self, fp, prototypes): """Generates all Rte_Read functions""" for port_func in prototypes: body = C.block(innerIndent=innerIndentDefault) if port_func.data_element.com_access['Receive'] is not None: com_func = port_func.data_element.com_access['Receive'] body.code.append( C.statement('return ' + str( C.fcall(com_func.name, params=[port_func.proto.args[0].name])))) else: body.code.append( C.statement('*%s = %s' % (port_func.proto.args[0].name, port_func.data_element.symbol))) if port_func.data_element.result_var is not None: body.code.append( C.statement('return %s' % port_func.data_element.result_var.name)) else: body.code.append(C.statement('return RTE_E_OK')) fp.write(str(port_func.proto) + '\n') fp.write('\n'.join(body.lines()) + '\n\n')
import cfile as C hello = C.cfile('hello.c') hello.code.append(C.sysinclude('stdio.h')) hello.code.append(C.blank()) hello.code.append( C.function( 'main', 'int', ).add_param(C.variable('argc', 'int')).add_param( C.variable('argv', 'char', pointer=2))) body = C.block(innerIndent=3) body.append(C.statement(C.fcall('printf').add_arg(r'"Hello World!\n"'))) body.append(C.statement('return 0')) hello.code.append(body) print(str(hello))