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_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_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_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 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_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 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_record_init_value(self): port = apx.RequirePort('TestPort1', '{"x"S"y"S"z"S}', '={3, 5, 8}') init_data = port.data_element.createInitData(port.init_value) self.assertEqual(init_data, struct.pack("<HHH", 3, 5, 8)) port = apx.RequirePort('TestPort1', '{"SensorData"{"x"S"y"S"z"S}"TimeStamp"L}', '={{3, 5, 8},0xFFFFFFFF}') init_data = port.data_element.createInitData(port.init_value) self.assertEqual(init_data, struct.pack("<HHHL", 3, 5, 8, 0xFFFFFFFF)) port = apx.RequirePort( 'TestPort1', '{"name"a[6]"Rectangle"{"x"L"y"L"width"L"height"L}}', '={"",{0,0,0,0}}') init_data = port.data_element.createInitData(port.init_value) self.assertEqual(init_data, bytes(6) + struct.pack("<LLLL", 0, 0, 0, 0))
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_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_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("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 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_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],'')
@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.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: time.sleep(0.005) worker.run() except (KeyboardInterrupt, SystemExit): break worker.stop()
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))
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_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'])
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('.', node, name='ButtonStatusDirect', includes=['ApxTypeDefs.h'], direct_write=[ 'SWS_PushbuttonStatus_Back', 'SWS_PushbuttonStatus_Down', 'SWS_PushbuttonStatus_Back', 'SWS_PushbuttonStatus_Enter', 'SWS_PushbuttonStatus_Home', 'SWS_PushbuttonStatus_Left', 'SWS_PushbuttonStatus_Back', 'SWS_PushbuttonStatus_Right',