def _create_apx_context_from_autosar_workspace(ws): context = apx.Context() for swc in ws.findall('/ComponentType/*'): if isinstance(swc, autosar.component.AtomicSoftwareComponent): node = apx.Node().import_autosar_swc(swc) context.append(node) return context
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_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_compile_record_require_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.RequirePort('SoundRequest', 'T["SoundRequest_T"]', '={65535,255,255}')) prog = compiler.exec(node.find('SoundRequest')) expected = bytes([ apx.OPCODE_UNPACK_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_UNPACK_U16, apx.OPCODE_RECORD_SELECT ]) + "Volume\0".encode('ascii') + bytes([ apx.OPCODE_UNPACK_U8, apx.OPCODE_RECORD_SELECT ]) + "Repetitions\0".encode('ascii') + bytes([ apx.OPCODE_UNPACK_U8, apx.OPCODE_RECORD_LEAVE, ]) self.assertEqual(prog, expected)
def test_compile_require_ports(self): compiler = apx.Compiler() node = apx.Node('TestNode') node.append(apx.DataType('TestType1_T', 'S(0,1000)')) node.append(apx.DataType('TestType2_T', 'a[32]')) port = node.append(apx.RequirePort('Signal1', 'C', '=255')) prog = compiler.exec(port) expected = bytes([ apx.OPCODE_UNPACK_PROG, 1, 0, 0, 0, apx.OPCODE_UNPACK_U8, ]) self.assertEqual(prog, expected) port = node.append(apx.RequirePort('Signal2', 'T[0]', '=255')) prog = compiler.exec(port) expected = bytes([ apx.OPCODE_UNPACK_PROG, 2, 0, 0, 0, apx.OPCODE_UNPACK_U16, ]) self.assertEqual(prog, expected) port = node.append( apx.RequirePort('Signal3', 'T["TestType2_T"]', '=""')) prog = compiler.exec(port) expected = bytes([ apx.OPCODE_UNPACK_PROG, 32, 0, 0, 0, apx.OPCODE_UNPACK_STR, 32, 0 ]) self.assertEqual(prog, expected)
def test_code_generator(self): node = apx.Node("TestCallbackFirst") node.append(apx.RequirePort('RS32Port', 'l', '=-2147483648')) node.append(apx.RequirePort('RU8Port', 'C', '=255')) callback_map = {'RS32Port': 'RS32Port_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) 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) 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 test_copy_ports_between_nodes(self): apx_text = """APX/1.2 N"TestNode1" T"Repetitions_T"C T"SoundId_T"S T"Volume_T"C T"SoundRequest_T"{"SoundId"T["SoundId_T"]"Volume"T["Volume_T"]"Repetitions"T["Repetitions_T"]} P"SoundRequest"T["SoundRequest_T"]:={65535,255,255} """ node1 = apx.Node.from_text(apx_text) self.assertIsInstance(node1, apx.Node) node1.finalize() node2 = apx.Node('MyCopy') self.assertIsInstance(node2, apx.Node) port1 = node1.find('SoundRequest') self.assertIsInstance(port1, apx.ProvidePort) port2 = node2.add_port_from_node(node1, port1) self.assertIsInstance(port2, apx.ProvidePort) node2.finalize(sort=True) result = apx.Context().append(node2).dumps() expected = """APX/1.2 N"MyCopy" T"Repetitions_T"C T"SoundId_T"S T"SoundRequest_T"{"SoundId"T[1]"Volume"T[3]"Repetitions"T[0]} T"Volume_T"C P"SoundRequest"T[2]:={65535,255,255} """ self.assertEqual(expected, result)
def create_apx_node_from_file_name(file_name, default_name): if file_name is None: node_name = default_name else: node_name = os.path.basename(file_name) if '.apx' in node_name: node_name = os.path.splitext(node_name)[0] return apx.Node(node_name)
def test_missing_end_brace(self): node = apx.Node("TestSWC") with self.assertRaises(apx.ParseError) as context: port = apx.RequirePort( 'TestPort1', '{"name"a[6]"Rectangle"{"x"L"y"L"width"L"height"L}', '={"",{0,0,0,0}}') self.assertEqual(str(context.exception), "Missing '}' in data signature")
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 createContextfromPartition(autosar_partition): context = Context() for component in autosar_partition.components: if (component.swc is not None) and (isinstance(component.swc, autosar.component.ApplicationSoftwareComponent)): swc = component.swc ws = swc.rootWS() apx_node = apx.Node(swc.name) for port in swc.requirePorts + swc.providePorts: portInterface = ws.find(port.portInterfaceRef) if portInterface is None: print('Warning (port=%s): PortInterface with ref %s not found in ECU extract'%(port.name, port.portInterfaceRef)) else: if (type(portInterface) is autosar.portinterface.SenderReceiverInterface) and (len(portInterface.dataElements)>0): apx_node.append(port) context.append(apx_node) return context
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_copy_data_type_between_nodes_when_type_is_record_with_references( self): apx_text = """APX/1.2 N"TestNode1" T"Repetitions_T"C T"SoundId_T"S T"Volume_T"C T"SoundRequest_T"{"SoundId"T["SoundId_T"]"Volume"T["Volume_T"]"Repetitions"T["Repetitions_T"]} P"SoundRequest"T["SoundRequest_T"]:={65535,255,255} """ node1 = apx.Node.from_text(apx_text) self.assertIsInstance(node1, apx.Node) node2 = apx.Node('MyCopy') self.assertIsInstance(node2, apx.Node) type1 = node1.find('SoundRequest_T') self.assertIsInstance(type1, apx.DataType) type2 = node2.add_data_type_from_node(node1, type1) self.assertIsInstance(type2, apx.DataType)
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_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 test_code_generator(self): node = apx.Node("TestSimpleOnlyR") node.append(apx.RequirePort('RU16Port','S','=0xffFF')) 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_inport_synced_status_flags=False) 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_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_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))
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_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],'')
import time @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
def test_raw_ports_1(self): node = apx.Node('TestNode') port = node.append(apx.RequirePort('U8Signal', 'C', '=255')) self.assertIsInstance(port, apx.RequirePort) self.assertIsInstance(port.data_element, apx.DataElement) self.assertEqual(port.data_element.typeCode, apx.UINT8_TYPE_CODE)
def test_autosar_ports(self): ws = autosar.workspace() dataTypes = ws.createPackage('DataType', role='DataType') dataTypes.createSubPackage('DataTypeSemantics', role='CompuMethod') dataTypes.createSubPackage('DataTypeUnits', role='Unit') dataTypes.createIntegerDataType('EngineSpeed_T', min=0, max=65535, offset=0, scaling=1 / 8, unit='rpm') dataTypes.createIntegerDataType('VehicleSpeed_T', min=0, max=65535, offset=0, scaling=1 / 64, unit='kph') dataTypes.createIntegerDataType('Percent_T', min=0, max=255, offset=0, scaling=0.4, unit='Percent') dataTypes.createIntegerDataType('CoolantTemp_T', min=0, max=255, offset=-40, scaling=0.5, unit='DegreeC') dataTypes.createIntegerDataType( 'InactiveActive_T', valueTable=[ 'InactiveActive_Inactive', #0 'InactiveActive_Active', #1 'InactiveActive_Error', #2 'InactiveActive_NotAvailable' ]) #3 dataTypes.createIntegerDataType( 'OnOff_T', valueTable=[ "OnOff_Off", #0 "OnOff_On", #1 "OnOff_Error", #2 "OnOff_NotAvailable" ]) #3 package = ws.createPackage('Constant', role='Constant') package.createConstant('EngineSpeed_IV', 'EngineSpeed_T', 65535) package.createConstant('VehicleSpeed_IV', 'VehicleSpeed_T', 65535) package.createConstant('FuelLevel_IV', 'Percent_T', 255) package.createConstant('CoolantTemp_IV', 'CoolantTemp_T', 255) package.createConstant('ParkBrakeState_IV', 'InactiveActive_T', 3) #3=NotAvailable package.createConstant('MainBeamState_IV', 'OnOff_T', 3) #3=NotAvailable package = ws.createPackage('PortInterface', role='PortInterface') package.createSenderReceiverInterface( 'EngineSpeed_I', autosar.DataElement('EngineSpeed', '/DataType/EngineSpeed_T')) package.createSenderReceiverInterface( 'VehicleSpeed_I', autosar.DataElement('VehicleSpeed', '/DataType/VehicleSpeed_T')) package.createSenderReceiverInterface( 'FuelLevel_I', autosar.DataElement('FuelLevel', '/DataType/Percent_T')) package.createSenderReceiverInterface( 'CoolantTemp_I', autosar.DataElement('CoolantTemp', '/DataType/CoolantTemp_T')) package.createSenderReceiverInterface( 'ParkBrakeState_I', autosar.DataElement('InactiveActive', '/DataType/InactiveActive_T')) package.createSenderReceiverInterface( 'MainBeamState_I', autosar.DataElement('OnOff', '/DataType/OnOff_T')) package = ws.createPackage('ComponentType', role='ComponentType') swc = package.createApplicationSoftwareComponent('TestSWC') swc.createProvidePort('EngineSpeed', 'EngineSpeed_I', initValueRef='EngineSpeed_IV') swc.createProvidePort('VehicleSpeed', 'VehicleSpeed_I', initValueRef='VehicleSpeed_IV') swc.createRequirePort('FuelLevel', 'FuelLevel_I', initValueRef='FuelLevel_IV') swc.createRequirePort('CoolantTemp', 'CoolantTemp_I', initValueRef='CoolantTemp_IV') swc.createRequirePort('ParkBrakeState', 'ParkBrakeState_I', initValueRef='ParkBrakeState_IV') swc.createRequirePort('MainBeamState', 'MainBeamState_I', initValueRef='MainBeamState_IV') apx_node = apx.Node(swc.name) apx_node.import_autosar_swc(swc) lines = apx_node.lines() self.assertEqual(len(lines), 13) self.assertEqual(lines[0], 'N"TestSWC"') self.assertEqual(lines[1], 'T"EngineSpeed_T"S') self.assertEqual(lines[2], 'T"VehicleSpeed_T"S') self.assertEqual(lines[3], 'T"Percent_T"C') self.assertEqual(lines[4], 'T"CoolantTemp_T"C') self.assertEqual( lines[5], 'T"InactiveActive_T"C(0,3):VT("InactiveActive_Inactive","InactiveActive_Active","InactiveActive_Error","InactiveActive_NotAvailable")' ) self.assertEqual( lines[6], 'T"OnOff_T"C(0,3):VT("OnOff_Off","OnOff_On","OnOff_Error","OnOff_NotAvailable")' ) self.assertEqual(lines[7], 'P"EngineSpeed"T[0]:=0xFFFF') self.assertEqual(lines[8], 'P"VehicleSpeed"T[1]:=0xFFFF') self.assertEqual(lines[9], 'R"FuelLevel"T[2]:=255') self.assertEqual(lines[10], 'R"CoolantTemp"T[3]:=255') self.assertEqual(lines[11], 'R"ParkBrakeState"T[4]:=3') self.assertEqual(lines[12], 'R"MainBeamState"T[5]:=3')
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('.',
#!/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'])
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)
'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('.')