def test_code_generator(self): node = apx.Node("TestSimple") node.append(apx.RequirePort('RS32Port', 'l', '=-2147483648')) node.append(apx.RequirePort('RU8Port', 'C', '=255')) node.append(apx.RequirePort('PS16ARPort256', 's[256]')) node.append(apx.ProvidePort('PS16ARPort256', 's[256]')) node.append(apx.ProvidePort('PS8Port', 'c', '=-1')) node.append(apx.ProvidePort('PU32Port', 'L', '=4294967295')) output_dir = 'derived' output_dir_full = os.path.join(os.path.dirname(__file__), output_dir) if not os.path.exists(output_dir_full): os.makedirs(output_dir_full) time.sleep(0.1) apx.NodeGenerator().generate(output_dir_full, node) with open( os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}.h'.format(node)), "r") as fp: generated = fp.read() with open( os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}.h'.format(node)), "r") as fp: expected = fp.read() self.assertEqual(expected, generated) with open( os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}.c'.format(node)), "r") as fp: generated = fp.read() with open( os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}.c'.format(node)), "r") as fp: expected = fp.read() self.assertEqual(expected, generated) shutil.rmtree(output_dir_full)
def test_raw_ports_2(self): node = apx.Node('TestSWC') datatype = node.append(apx.DataType('InactiveActive_T', 'C(0,3)')) self.assertIsInstance(datatype, apx.DataType) port = node.append(apx.ProvidePort('VehicleSpeed', 'S', '=65535')) self.assertIsInstance(port, apx.ProvidePort) port = node.append(apx.ProvidePort('MainBeam', 'T[0]', '=3')) self.assertIsInstance(port, apx.ProvidePort) port = node.append(apx.ProvidePort('FuelLevel', 'C')) self.assertIsInstance(port, apx.ProvidePort) port = node.append(apx.ProvidePort('ParkBrakeActive', 'T[0]', '=3')) self.assertIsInstance(port, apx.ProvidePort) port = node.append(apx.RequirePort('RheostatLevelRqst', 'C', '=255')) self.assertIsInstance(port, apx.RequirePort) port = node.append(apx.RequirePort('StrSignal', 'a[4]', '=""')) self.assertIsInstance(port, apx.RequirePort) port = node.append( apx.RequirePort('RecordSignal', '{"Name"a[8]"Id"L"Data"S[3]}', '={"",0xFFFFFFFF,{0,0,0}}')) self.assertIsInstance(port, apx.RequirePort) node.finalize(sort=False) lines = node.lines() self.assertEqual(len(lines), 9) self.assertEqual(lines[0], 'N"TestSWC"') self.assertEqual(lines[1], 'T"InactiveActive_T"C(0,3)') self.assertEqual(lines[2], 'P"VehicleSpeed"S:=65535') self.assertEqual(lines[3], 'P"MainBeam"T[0]:=3') self.assertEqual(lines[4], 'P"FuelLevel"C') self.assertEqual(lines[5], 'P"ParkBrakeActive"T[0]:=3') self.assertEqual(lines[6], 'R"RheostatLevelRqst"C:=255') self.assertEqual(lines[7], 'R"StrSignal"a[4]:=""') self.assertEqual( lines[8], 'R"RecordSignal"{"Name"a[8]"Id"L"Data"S[3]}:={"",0xFFFFFFFF,{0,0,0}}' )
def append(self, item): """ Adds the item to the node. Item can be of type DataType, RequirePort and ProvidePort returns the object (port or datatype) """ if isinstance(item, apx.DataType): return self.add_type(item) if isinstance(item, apx.RequirePort): return self.add_require_port(item) elif isinstance(item, apx.ProvidePort): return self.add_provide_port(item) elif isinstance(item, autosar.component.Port): return self.add_autosar_port(item) elif isinstance(item, str): parts = apx_split_line(item) if len(parts) != 4: raise ValueError("invalid APX string: '%s'" % item) if parts[0] == 'R': newPort = apx.RequirePort(parts[1], parts[2], parts[3]) if newPort is not None: return self.add_require_port(newPort) else: raise ValueError('apx.RequirePort() returned None') elif parts[0] == 'P': newPort = apx.ProvidePort(parts[1], parts[2], parts[3]) if newPort is not None: return self.add_provide_port(newPort) else: raise ValueError('apx.ProvidePort() returned None') else: raise ValueError(parts[0]) else: raise ValueError(type(item))
def test_compile_record_provide_port(self): compiler = apx.Compiler() node = apx.Node('TestNode') node.append(apx.DataType('SoundId_T', 'S')) node.append(apx.DataType('Volume_T', 'C')) node.append(apx.DataType('Repetitions_T', 'C')) node.append( apx.DataType( 'SoundRequest_T', '{"SoundId"T["SoundId_T"]"Volume"T["Volume_T"]"Repetitions"T["Repetitions_T"]}' )) node.append( apx.ProvidePort('SoundRequest', 'T["SoundRequest_T"]', '={65535,255,255}')) prog = compiler.exec(node.find('SoundRequest')) expected = bytes([ apx.OPCODE_PACK_PROG, (apx.UINT16_LEN + apx.UINT8_LEN + apx.UINT8_LEN), 0, 0, 0, apx.OPCODE_RECORD_ENTER, apx.OPCODE_RECORD_SELECT ]) + "SoundId\0".encode('ascii') + bytes([ apx.OPCODE_PACK_U16, apx.OPCODE_RECORD_SELECT ]) + "Volume\0".encode('ascii') + bytes([ apx.OPCODE_PACK_U8, apx.OPCODE_RECORD_SELECT ]) + "Repetitions\0".encode('ascii') + bytes([ apx.OPCODE_PACK_U8, apx.OPCODE_RECORD_LEAVE, ]) self.assertEqual(prog, expected)
def create_node_and_data(): node = apx.Node('TestNode') node.add_type(apx.DataType('InactiveActive_T', 'C(0,3)')) node.append(apx.ProvidePort('VehicleSpeed', 'S', '=65535')) node.append(apx.ProvidePort('MainBeam', 'T[0]', '=3')) node.append(apx.ProvidePort('TotalDistance', 'L', '=0xFFFFFFFF')) node.append( apx.ProvidePort('ComplexRecordSignal', '{"SensorData"{"x"S"y"S"z"S}"TimeStamp"L}', '={{65535,65535,65535},0xFFFFFFFF}')) node.append(apx.RequirePort('RheostatLevelRqst', 'C', '=255')) node.append(apx.RequirePort('StrSignal', 'a[8]', '=""')) node.append( apx.RequirePort('RecordSignal', '{"Name"a[8]"Id"L"Data"S[3]}', '={"",0xFFFFFFFF,{0,0,0}}')) return node
def test_code_generator(self): node = apx.Node("TestSimpleOnlyP") node.append(apx.ProvidePort('PS8Port', 'c', '=-1')) output_dir = 'derived' output_dir_full = os.path.join(os.path.dirname(__file__), output_dir) if not os.path.exists(output_dir_full): os.makedirs(output_dir_full) time.sleep(0.1) apx.NodeGenerator().generate(output_dir_full, node) with open( os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}.h'.format(node)), "r") as fp: generated = fp.read() with open( os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}.h'.format(node)), "r") as fp: expected = fp.read() self.assertEqual(expected, generated) with open( os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}.c'.format(node)), "r") as fp: generated = fp.read() with open( os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}.c'.format(node)), "r") as fp: expected = fp.read() self.assertEqual(expected, generated) shutil.rmtree(output_dir_full)
def test_load_dumped_apx_text(self): node1 = apx.Node('Simulator') node1.dataTypes.append(apx.DataType('InactiveActive_T','C(0,3)')) node1.providePorts.append(apx.ProvidePort('VehicleSpeed','S','=65535')) node1.providePorts.append(apx.ProvidePort('MainBeam','T[0]','=3')) node1.providePorts.append(apx.ProvidePort('FuelLevel','C')) node1.providePorts.append(apx.ProvidePort('ParkBrakeActive','T[0]','=3')) node1.requirePorts.append(apx.RequirePort('RheostatLevelRqst','C','=255')) self.assertFalse(node1.providePorts[0].dsg.isComplexType()) node1.finalize() context = apx.Context() context.append(node1) text=context.dumps() apx_parser = apx.Parser() node2 = apx_parser.loads(text) self.assertFalse(node2.providePorts[0].dsg.isComplexType())
def test_fileManagerWithNode(self): node = apx.Node('Simulator') node.dataTypes.append(apx.DataType('InactiveActive_T','C(0,3)')) node.append(apx.ProvidePort('VehicleSpeed','S','=65535')) node.append(apx.ProvidePort('MainBeam','T[0]','=3')) node.append(apx.ProvidePort('FuelLevel','C')) node.append(apx.ProvidePort('ParkBrakeActive','T[0]','=3')) node.append(apx.RequirePort('RheostatLevelRqst','C','=255')) nodeData = apx.NodeData(node) with apx.FileManager() as file_manager: file_manager.attachNodeData(nodeData) self.assertEqual(len(file_manager.localFileMap), 2) self.assertEqual(len(file_manager.requestedFiles), 1) file_manager.start() mockHandler = MockTransmitHandler() file_manager.onConnected(mockHandler) time.sleep(0.1) self.assertEqual(len(mockHandler.transmittedData), 4+63*2)
def test_code_generator(self): node = apx.Node("Test") node.append(apx.DataType('SoundRequest_T', '{"SoundId"S"Volume"C}')) node.append(apx.RequirePort('U8Port', 'C', '=255')) node.append(apx.RequirePort('U8ARPort', 'C[3]', '={255, 255, 255}')) node.append( apx.RequirePort('SoundRequest', 'T["SoundRequest_T"]', '={65535,255}')) node.append( apx.ProvidePort('U16ARPort', 'S[4]', '={65535, 65535, 65535, 65535}')) node.append(apx.ProvidePort('U32Port', 'L', '=4294967295')) output_dir = 'derived' output_dir_full = os.path.join(os.path.dirname(__file__), output_dir) if not os.path.exists(output_dir_full): os.makedirs(output_dir_full) time.sleep(0.1) apx.NodeGenerator().generate(output_dir_full, node) with open( os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}.h'.format(node)), "r") as fp: generated = fp.read() with open( os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}.h'.format(node)), "r") as fp: expected = fp.read() self.assertEqual(expected, generated) with open( os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}.c'.format(node)), "r") as fp: generated = fp.read() with open( os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}.c'.format(node)), "r") as fp: expected = fp.read() self.assertEqual(expected, generated) shutil.rmtree(output_dir_full)
def test_dumps_from_raw(self): node = apx.Node('Simulator') node.dataTypes.append(apx.DataType('InactiveActive_T','C(0,3)')) node.providePorts.append(apx.ProvidePort('VehicleSpeed','S','=65535')) node.providePorts.append(apx.ProvidePort('MainBeam','T[0]','=3')) node.providePorts.append(apx.ProvidePort('FuelLevel','C')) node.providePorts.append(apx.ProvidePort('ParkBrakeActive','T[0]','=3')) node.requirePorts.append(apx.RequirePort('RheostatLevelRqst','C','=255')) node.finalize() context = apx.Context() context.append(node) text=context.dumps() lines=re.compile(r'\r\n|\n').split(text) self.assertEqual(len(lines),9) self.assertEqual(lines[0],'APX/1.2') self.assertEqual(lines[1],'N"Simulator"') self.assertEqual(lines[2],'T"InactiveActive_T"C(0,3)') self.assertEqual(lines[3],'P"VehicleSpeed"S:=65535') self.assertEqual(lines[4],'P"MainBeam"T[0]:=3') self.assertEqual(lines[5],'P"FuelLevel"C') self.assertEqual(lines[6],'P"ParkBrakeActive"T[0]:=3') self.assertEqual(lines[7],'R"RheostatLevelRqst"C:=255') self.assertEqual(lines[8],'')
def test_compile_provide_ports(self): compiler = apx.Compiler() node = apx.Node('TestNode') node.append(apx.DataType('TestType1_T', 'C')) node.append(apx.DataType('TestType2_T', 'C[10]')) node.append(apx.DataType('TestType3_T', 'S')) node.append(apx.DataType('TestType4_T', 'S[10]')) node.append(apx.DataType('TestType5_T', 'L')) node.append(apx.DataType('TestType6_T', 'L[10]')) node.append(apx.ProvidePort('U8Signal', 'T["TestType1_T"]')) node.append(apx.ProvidePort('U8ArraySignal', 'T["TestType2_T"]')) node.append(apx.ProvidePort('U16Signal', 'T["TestType3_T"]')) node.append(apx.ProvidePort('U16ArraySignal', 'T["TestType4_T"]')) node.append(apx.ProvidePort('U32Signal', 'T["TestType5_T"]')) node.append(apx.ProvidePort('U32ArraySignal', 'T["TestType6_T"]')) prog = compiler.exec(node.find('U8Signal')) expected = bytes( [apx.OPCODE_PACK_PROG, apx.UINT8_LEN, 0, 0, 0, apx.OPCODE_PACK_U8]) self.assertEqual(prog, expected) prog = compiler.exec(node.find('U8ArraySignal')) expected = bytes([ apx.OPCODE_PACK_PROG, apx.UINT8_LEN * 10, 0, 0, 0, apx.OPCODE_PACK_U8AR, 10, 0 ]) self.assertEqual(prog, expected) prog = compiler.exec(node.find('U16Signal')) expected = bytes([ apx.OPCODE_PACK_PROG, apx.UINT16_LEN, 0, 0, 0, apx.OPCODE_PACK_U16 ]) self.assertEqual(prog, expected) prog = compiler.exec(node.find('U16ArraySignal')) expected = bytes([ apx.OPCODE_PACK_PROG, apx.UINT16_LEN * 10, 0, 0, 0, apx.OPCODE_PACK_U16AR, 10, 0 ]) self.assertEqual(prog, expected) prog = compiler.exec(node.find('U32Signal')) expected = bytes([ apx.OPCODE_PACK_PROG, apx.UINT32_LEN, 0, 0, 0, apx.OPCODE_PACK_U32 ]) self.assertEqual(prog, expected) prog = compiler.exec(node.find('U32ArraySignal')) expected = bytes([ apx.OPCODE_PACK_PROG, apx.UINT32_LEN * 10, 0, 0, 0, apx.OPCODE_PACK_U32AR, 10, 0 ]) self.assertEqual(prog, expected)
def test_write_string(self): node = apx.Node('TestNode') port = node.append(apx.ProvidePort('StrSignal', 'a[6]', '=""')) node_data = apx.NodeData(node) signal_offset = 0 signal_length = 6 output_file = node_data.outPortDataFile #verify init value self.assertEqual(output_file.read(signal_offset, signal_length), bytes(6)) #write value node_data.write_provide_port(port, "Hello") self.assertEqual(output_file.read(signal_offset, signal_length), "Hello\0".encode('utf-8')) node_data.write_provide_port(port, "Abc") self.assertEqual(output_file.read(signal_offset, signal_length), "Abc\0\0\0".encode('utf-8')) node_data.write_provide_port(port, "") self.assertEqual(output_file.read(signal_offset, signal_length), bytes(6))
def add_autosar_port(self, port, ws=None): """ adds an autosar port to the node returns the port ID of the newly added port """ if ws is None: ws = port.rootWS() assert (ws is not None) dataType = self._updateDataType(ws, port) if dataType is not None: if isinstance(port, autosar.component.RequirePort): apx_port = apx.RequirePort( port.name, "T[%s]" % dataType.id, self._calcAttributeFromAutosarPort(ws, port)) return self.add_require_port(apx_port) elif isinstance(port, autosar.component.ProvidePort): apx_port = apx.ProvidePort( port.name, "T[%s]" % dataType.id, self._calcAttributeFromAutosarPort(ws, port)) return self.add_provide_port(apx_port) else: raise ValueError('invalid type ' + str(type(port)))
def compact(self, name=None): """ clones the node in a version where all type definitions are removed """ if name is None: name = self.name compact = Node(name) compact.requirePorts = [ apx.RequirePort( port.name, port.dsg.resolve_data_element().to_string(normalized=True), str(port.attr) if port.attr is not None else None) for port in self.requirePorts ] compact.providePorts = [ apx.ProvidePort( port.name, port.dsg.resolve_data_element().to_string(normalized=True), str(port.attr) if port.attr is not None else None) for port in self.providePorts ] return compact
def test_write_s32(self): node = apx.Node('TestNode') port = node.append(apx.ProvidePort('S32Signal', 'l', '=0')) node_data = apx.NodeData(node) signal_offset = 0 signal_length = 4 output_file = node_data.outPortDataFile #verify init value self.assertEqual(output_file.read(signal_offset, signal_length), bytes(signal_length)) #write value node_data.write_provide_port(port, -1) self.assertEqual(output_file.read(signal_offset, signal_length), struct.pack('<i', -1)) node_data.write_provide_port(port, -2147483648) self.assertEqual(output_file.read(signal_offset, signal_length), struct.pack('<i', -2147483648)) node_data.write_provide_port(port, 2147483647) self.assertEqual(output_file.read(signal_offset, signal_length), struct.pack('<i', 2147483647)) node_data.write_provide_port(port, 0) self.assertEqual(output_file.read(signal_offset, signal_length), struct.pack('<i', 0))
def test_write_s16(self): node = apx.Node('TestNode') port = node.append(apx.ProvidePort('S16Signal', 's', '=0')) node_data = apx.NodeData(node) signal_offset = 0 signal_length = 2 output_file = node_data.outPortDataFile #verify init value self.assertEqual(output_file.read(signal_offset, signal_length), bytes(signal_length)) #write value node_data.write_provide_port(port, -1) self.assertEqual(output_file.read(signal_offset, signal_length), struct.pack('<h', -1)) node_data.write_provide_port(port, -32768) self.assertEqual(output_file.read(signal_offset, signal_length), struct.pack('<h', -32768)) node_data.write_provide_port(port, 32767) self.assertEqual(output_file.read(signal_offset, signal_length), struct.pack('<h', 32767)) node_data.write_provide_port(port, 0) self.assertEqual(output_file.read(signal_offset, signal_length), struct.pack('<H', 0))
@apx.DataListener.register class MyDataListener(apx.DataListener): def on_data(self, port, data): global value global client print("%s: %s" % (port.name, str(data))) if port.name == 'TestSignal2' and value is not None: value = (value + 1) & 0xFFFF #wraparound to zero after 65535 client.write_port('TestSignal1', value) if __name__ == '__main__': node = apx.Node('TestNode1') node.append(apx.ProvidePort('TestSignal1', 'S')) node.append(apx.RequirePort('TestSignal2', 'S')) value = 1 with apx.Client(node) as client: client.set_listener(MyDataListener()) client.write_port('TestSignal1', value) if client.connect_tcp('localhost', 5000): while True: try: time.sleep(10) value = None break except (KeyboardInterrupt, SystemExit): value = None break
self.lock.acquire() self.PTestSignal1 = (self.PTestSignal1 + 1) & 0xFFFF self.PTestSignal2 = (self.PTestSignal2 + 1) & 0xFFFF self.PTestSignal3 = (self.PTestSignal3 + 1) & 0xFFFF self.lock.release() self.client.write_port('PTestSignal1', self.PTestSignal1) self.client.write_port('PTestSignal2', self.PTestSignal2) self.client.write_port('PTestSignal3', self.PTestSignal3) def stop(self): self.client.stop() if __name__ == '__main__': node = apx.Node('StressNode1') node.append(apx.ProvidePort('PTestSignal1', 'S')) node.append(apx.ProvidePort('PTestSignal2', 'S')) node.append(apx.ProvidePort('PTestSignal3', 'S')) node.append(apx.ProvidePort('PTestSignal4', 'C[4]')) node.append(apx.ProvidePort('PTestSignal5', '{"Name"a[10]"Id"S}')) node.append(apx.RequirePort('QTestSignal1', 'S')) node.append(apx.RequirePort('QTestSignal2', 'S')) node.append(apx.RequirePort('QTestSignal3', 'S')) node.append(apx.RequirePort('QTestSignal4', 'S[4]')) node.append(apx.RequirePort('QTestSignal5', '{"Name"a[10]"Id"S}')) with apx.Client(node) as client: worker = MyApxWorker(client) if worker.connect(): while True: try:
import apx node = apx.Node('Example') node.append(apx.DataType('BatteryVoltage_T', 'S')) node.append(apx.DataType('Date_T', '{"Year"C"Month"C(1,13)"Day"C(1,32)}')) node.append( apx.DataType( 'InactiveActive_T', 'C(0,3)', 'VT("InactiveActive_Inactive", "InactiveActive_Active", "InactiveActive_Error", "InactiveActive_NotAvailable")' )) node.append( apx.ProvidePort('BatteryVoltage', 'T["BatteryVoltage_T"]', '=65535')) node.append(apx.RequirePort('CurrentDate', 'T["Date_T"]', '={255, 13, 32}')) node.append( apx.RequirePort('ExteriorLightsActive', 'T["InactiveActive_T"]', '=3')) print(apx.Context().append(node).dumps())
def _processLine(self, line): parts = apx_split_line(line) if parts is None: return if len(parts) > 0: if self.cs == START_SECTION: if parts[0] == 'N': #Node Line self.cs = NODE_SECTION apxNode = apx.Node(parts[1]) self._applyNode(apxNode) else: raise apx.ParseError( 'Syntax error on line {:d}. Expected Node definition'. format(self.lineNumber, line)) elif self.cs == NODE_SECTION: if parts[0] == 'T': self.cs = TYPE_SECTION apxType = apx.DataType(parts[1], parts[2], parts[3]) self._applyType(apxType) elif parts[0] == 'P': self.cs = PROVIDE_SECTION portLine = apx.ProvidePort(parts[1], parts[2], parts[3]) self._applyPort(portLine) elif parts[0] == 'R': self.cs = REQUIRE_SECTION portLine = apx.RequirePort(parts[1], parts[2], parts[3]) self._applyPort(portLine) else: raise apx.ParseError( 'Syntax error on line {:d}: {}'.format( self.lineNumber, line)) elif self.cs == TYPE_SECTION: if parts[0] == 'T': typeLine = apx.DataType(parts[1], parts[2], parts[3]) self._applyType(typeLine) elif parts[0] == 'P': self.cs = PROVIDE_SECTION portLine = apx.ProvidePort(parts[1], parts[2], parts[3]) self._applyPort(portLine) elif parts[0] == 'R': self.cs = REQUIRE_SECTION portLine = apx.RequirePort(parts[1], parts[2], parts[3]) self._applyPort(portLine) else: raise apx.ParseError( 'Syntax error on line {:d}: {}'.format( self.lineNumber, line)) elif self.cs == PROVIDE_SECTION: if parts[0] == 'P': portLine = apx.ProvidePort(parts[1], parts[2], parts[3]) self._applyPort(portLine) elif parts[0] == 'R': self.cs = REQUIRE_SECTION portLine = apx.RequirePort(parts[1], parts[2], parts[3]) self._applyPort(portLine) elif self.cs == REQUIRE_SECTION: if parts[0] == 'R': portLine = apx.RequirePort(parts[1], parts[2], parts[3]) self._applyPort(portLine) elif parts[0] == 'P': self.cs = PROVIDE_SECTION portLine = apx.ProvidePort(parts[1], parts[2], parts[3]) self._applyPort(portLine) else: raise apx.ParseError( 'Syntax error on line {:d}: {}'.format( self.lineNumber, line)) else: raise RuntimeError("Internal parser error, line={:d}".format( self.lineNumber)) else: raise apx.ParseError('Syntax error on line {:d}: {}'.format( self.lineNumber, line))
'FuelLevelPercent_I', autosar.DataElement('FuelLevelPercent', 'Percent_T')) portInterfaces.createSenderReceiverInterface( 'VehicleSpeed_I', autosar.DataElement('VehicleSpeed', 'VehicleSpeed_T')) components = ws.createPackage('ComponentType', role='ComponentType') swc = components.createApplicationSoftwareComponent('test_client') swc.createRequirePort('EngineRunningStatus', 'EngineRunningStatus_I', initValueRef=constants['C_EngineRunningStatus_IV'].ref) swc.createRequirePort('FuelLevelPercent', 'FuelLevelPercent_I', initValueRef=constants['C_FuelLevelPercent_IV'].ref) swc.createRequirePort('VehicleSpeed', 'VehicleSpeed_I', initValueRef=constants['C_VehicleSpeed_IV'].ref) swc.behavior.createRunnable(swc.name + '_Init', portAccess=[x.name for x in swc.providePorts]) swc.behavior.createRunnable( swc.name + '_Run', portAccess=[x.name for x in swc.requirePorts + swc.providePorts]) partition = autosar.rte.Partition() partition.addComponent(swc) typeGenerator = autosar.rte.TypeGenerator(partition) typeGenerator.generate() node = apx.Node() node.import_autosar_swc(swc) node.append(apx.ProvidePort('VehicleMode', 'C(0,15)', '=15')) apx.NodeGenerator().generate('.', node, includes=['Rte_Type.h']) apx.Context().append(node).generateAPX('.')
def test_code_generator(self): node = apx.Node("Test") node.append(apx.DataType('SoundRequest_T', '{"SoundId"S"Volume"C}')) node.append(apx.DataType('LightRequest_T', '{"LightId"S"Intensity"C}')) node.append( apx.DataType('HapticRequest_T', '{"HapticId"S"Intensity"C}')) node.append(apx.RequirePort('RU8FirstPort', 'C', '=12')) node.append(apx.RequirePort('RS16ARPort', 's[3]', '={32767, 1, 0}')) node.append(apx.RequirePort('RS32Port', 'l', '=1')) node.append(apx.RequirePort('RU8Port', 'C', '=255')) node.append(apx.RequirePort('RU8ARPort', 'C[3]', '={255, 255, 255}')) node.append( apx.RequirePort('LightRequest', 'T["LightRequest_T"]', '={65535,255}')) node.append( apx.RequirePort('SoundRequest', 'T["SoundRequest_T"]', '={65535,255}')) node.append(apx.RequirePort('RU8LastPort', 'C', '=210')) node.append( apx.ProvidePort('SoundRequestAck', 'T["SoundRequest_T"]', '={65535,255}')) node.append( apx.ProvidePort('HapticRequest', 'T["HapticRequest_T"]', '={65535,255}')) node.append(apx.ProvidePort('PS8ARPort', 'c[1]', '={1}')) node.append(apx.ProvidePort('PS8Port', 'c', '=0')) node.append( apx.ProvidePort('PU16ARPort', 'S[4]', '={65535, 65535, 65535, 65535}')) node.append(apx.ProvidePort('PU32Port', 'L', '=4294967295')) callback_map = { 'RU8Port': 'RU8Port_cb_func', 'RS16ARPort': 'RS16ARPort_cb_func', 'SoundRequest': 'SoundRequest_cb_func' } output_dir = 'derived' output_dir_full = os.path.join(os.path.dirname(__file__), output_dir) if not os.path.exists(output_dir_full): os.makedirs(output_dir_full) time.sleep(0.1) # If we want ports in the order appended; explicitly finalize the node before generator node.finalize(sort=False, compact=True) apx.NodeGenerator().generate(output_dir_full, node, callbacks=callback_map) with open( os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}.h'.format(node)), "r") as fp: generated = fp.read() with open( os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}.h'.format(node)), "r") as fp: expected = fp.read() self.assertEqual(expected, generated) with open( os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}.c'.format(node)), "r") as fp: generated = fp.read() with open( os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}.c'.format(node)), "r") as fp: expected = fp.read() self.assertEqual(expected, generated) with open( os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}_Cbk.h'.format(node)), "r") as fp: generated = fp.read() with open( os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}_Cbk.h'.format(node)), "r") as fp: expected = fp.read() self.assertEqual(expected, generated) node.name = "Test_compact" apx.NodeGenerator().generate(output_dir_full, node, callbacks=callback_map, compact=True) with open( os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}.h'.format(node)), "r") as fp: generated = fp.read() with open( os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}.h'.format(node)), "r") as fp: expected = fp.read() self.assertEqual(expected, generated) with open( os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}.c'.format(node)), "r") as fp: generated = fp.read() with open( os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}.c'.format(node)), "r") as fp: expected = fp.read() self.assertEqual(expected, generated) with open( os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}_Cbk.h'.format(node)), "r") as fp: generated = fp.read() with open( os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}_Cbk.h'.format(node)), "r") as fp: expected = fp.read() self.assertEqual(expected, generated) shutil.rmtree(output_dir_full)
#!/usr/bin/env python3 import apx if __name__ == '__main__': node1 = apx.Node('TestNode1') node1.append(apx.ProvidePort('WheelBasedVehicleSpeed','S')) node1.append(apx.ProvidePort('CabTiltLockWarning','C(0,7)')) node1.append(apx.RequirePort('VehicleMode','C(0,15)')) node1.append(apx.RequirePort('GearSelectionMode','C(0,7)')) apx.NodeGenerator().generate('.', node1, includes=['Std_Types.h']) node2 = apx.Node('TestNode2') node2.append(apx.ProvidePort('ParkBrakeAlert','C(0,3)','=3')) apx.NodeGenerator().generate('.', node2, includes=['Std_Types.h'])
import apx node = apx.Node('TestNode') node.append(apx.ProvidePort('TestSignal2', 'C')) node.append(apx.RequirePort('TestSignal1', 'S')) apx.NodeGenerator().generate('.', node, includes=['Rte_Type.h'])
import apx if __name__ == '__main__': node = apx.Node('ButtonStatus') node.append(apx.DataType('PushButtonStatus_T', 'C(0,1)')) node.append(apx.DataType('VehicleMode_T', 'C(0,15)')) node.append( apx.ProvidePort('SWS_PushbuttonStatus_Back', 'T["PushButtonStatus_T"]', '=0')) node.append( apx.ProvidePort('SWS_PushbuttonStatus_Down', 'T["PushButtonStatus_T"]', '=0')) node.append( apx.ProvidePort('SWS_PushbuttonStatus_Enter', 'T["PushButtonStatus_T"]', '=0')) node.append( apx.ProvidePort('SWS_PushbuttonStatus_Home', 'T["PushButtonStatus_T"]', '=0')) node.append( apx.ProvidePort('SWS_PushbuttonStatus_Left', 'T["PushButtonStatus_T"]', '=0')) node.append( apx.ProvidePort('SWS_PushbuttonStatus_Right', 'T["PushButtonStatus_T"]', '=0')) node.append( apx.ProvidePort('SWS_PushbuttonStatus_Up', 'T["PushButtonStatus_T"]', '=0')) node.append(apx.RequirePort('VehicleMode', 'T["VehicleMode_T"]', '=15')) node.finalize() apx.NodeGenerator().generate('.', node, includes=['ApxTypeDefs.h']) apx.NodeGenerator().generate('.',