def __init__(self,node): if isinstance(node, apx.Node): self.node=node context=apx.Context() context.append(node) apx_text=context.dumps() elif isinstance(node, str): parser = apx.Parser() apx_text=node self.node = parser.loads(apx_text) else: raise NotImplementedError(type(node)) compiler = apx.compiler.Compiler() self.name=self.node.name self.inPortByteMap = [] #length: length of self.inPortDataFile self.inPortDataMap = [] #length: number of require ports self.outPortDataMap = [] #length: number of provide ports self.inPortPrograms = [] #length: number of require ports self.outPortPrograms = [] #length: number of provide ports self.outPortValues = [] #length: number of provide ports self.inPortDataFile = self._createInPortDataFile(self.node, compiler) if len(self.node.requirePorts)>0 else None self.outPortDataFile = self._createOutPortDataFile(self.node, compiler) if len(self.node.providePorts)>0 else None self.definitionFile = self._createDefinitionFile(node.name,apx_text) self.vm = apx.VM() self.lock=threading.Lock() #the virtual machine is not thread-safe, use this lock to protect it in case users try to read/write ports from multiple threads if self.inPortDataFile is not None: self.inPortDataFile.nodeDataHandler=self self.nodeDataClient=None
def create_node(self, apxText): """ Creates new APX node from a string """ parser = apx.Parser() node = parser.loads(apxText) if node is not None: self.attach_node(node)
def test_parse_node2(self): apx_text = """APX/1.2 N"TestNode" T"VehicleSpeed_T"S T"EngineSpeed_T"S T"InactiveActive_T"C(0,3):VT("InactiveActive_Inactive","InactiveActive_Active","InactiveActive_Error","InactiveActive_NotAvailable") R"VehicleSpeed"T[0]:=0xFFFF R"EngineSpeed"T[1]:=0xFFFF R"ParkBrakeState"T["InactiveActive_T"]:=3 """ apx_parser = apx.Parser() node = apx_parser.loads(apx_text) self.assertIsInstance(node, apx.Node) self.assertEqual(node.name, "TestNode")
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_parse_comments(self): apx_text = """APX/1.2 N"TestNode" T"VehicleSpeed_T"S T"EngineSpeed_T"S T"InactiveActive_T"C(0,3):VT("InactiveActive_Inactive","InactiveActive_Active","InactiveActive_Error","InactiveActive_NotAvailable") #Line Comment1 #Line Comment2 R"VehicleSpeed"T[0]:=0xFFFF #A Comment R"EngineSpeed"T[1]:=0xFFFF R"ParkBrakeState"T["InactiveActive_T"]:=3 """ apx_parser = apx.Parser() node = apx_parser.loads(apx_text) self.assertIsInstance(node, apx.Node) self.assertEqual(node.name, "TestNode") port = node.find('ParkBrakeState') self.assertIsInstance(port, apx.RequirePort)
def test_parse_node(self): text = """APX/1.2 N"TestSWC" T"Percent_T"C T"CoolantTemp_T"C T"InactiveActive_T"C(0,3):VT("InactiveActive_Inactive","InactiveActive_Active","InactiveActive_Error","InactiveActive_NotAvailable") T"OnOff_T"C(0,3):VT("OnOff_Off","OnOff_On","OnOff_Error","OnOff_NotAvailable") T"EngineSpeed_T"S T"VehicleSpeed_T"S R"FuelLevel"T[0]:=255 R"CoolantTemp"T[1]:=255 R"ParkBrakeState"T[2]:=3 R"MainBeamState"T[3]:=3 P"EngineSpeed"T[4]:=0xFFFF P"VehicleSpeed"T[5]:=0xFFFF """ apx_parser = apx.Parser() node = apx_parser.loads(text) self.assertIsInstance(node, apx.Node) self.assertEqual(node.name, "TestSWC") self.assertEqual(len(node.dataTypes), 6) self.assertEqual(len(node.requirePorts), 4) self.assertEqual(len(node.providePorts), 2) self.assertIs(node.requirePorts[0].dsg.dataElement.typeReference, node.dataTypes[0]) self.assertIs(node.requirePorts[1].dsg.dataElement.typeReference, node.dataTypes[1]) self.assertIs(node.requirePorts[2].dsg.dataElement.typeReference, node.dataTypes[2]) self.assertIs(node.requirePorts[3].dsg.dataElement.typeReference, node.dataTypes[3]) self.assertIs(node.providePorts[0].dsg.dataElement.typeReference, node.dataTypes[4]) self.assertIs(node.providePorts[1].dsg.dataElement.typeReference, node.dataTypes[5]) self.assertEqual(node.find('FuelLevel').id, 0) self.assertEqual(node.find('CoolantTemp').id, 1) self.assertEqual(node.find('ParkBrakeState').id, 2) self.assertEqual(node.find('MainBeamState').id, 3) self.assertEqual(node.find('EngineSpeed').id, 0) self.assertEqual(node.find('VehicleSpeed').id, 1)
#!/usr/bin/env python3 import apx import argparse if __name__ == '__main__': arg_parser = argparse.ArgumentParser() arg_parser.add_argument('input_files', nargs='+', help='List of APX files') arg_parser.add_argument('-n', '--name', help='Name of the new APX node', required=True) arg_parser.add_argument('--sort', help='Name of the new APX node', action='store_true', default=False) arg_parser.add_argument('--normalize', help='Forces APX to be generated in normalized form', action='store_true', default=False) args = arg_parser.parse_args() node_list =[] parser = apx.Parser() for file in args.input_files: node_list.append(parser.parse(file)) if len(node_list) > 0: apx_node = apx.Node(args.name) for other_node in node_list: apx_node.extend(other_node) apx_node.finalize(sort=args.sort) apx_node.save_apx(normalized=args.normalize)
import argparse if __name__ == '__main__': arg_parser = argparse.ArgumentParser() arg_parser.add_argument('input_file', nargs='*', help='Path to input file (.apx)') arg_parser.add_argument( '-o', dest='output_file', help='Output file name (default is to overwrite input file)', default=None) arg_parser.add_argument('-p', '--pipe', help='Uses stdin and stdout instead of files', action='store_true', default=False) args = arg_parser.parse_args() if len(args.input_file) == 0 and not args.pipe: arg_parser.print_help() sys.exit(1) output_file = args.output_file if args.output_file is not None else args.input_file[ 0] if args.pipe: node = apx.Parser().load(sys.stdin) print(node.dumps(normalized=False)) else: node = apx.Parser().parse(args.input_file[0]) node.save_apx(output_file=output_file, normalized=False)
'--mirror', help='Forces output of head and tail to be mirrored', action='store_true', default=False) args = arg_parser.parse_args() if args.file is None and len(args.port_names) == 0: arg_parser.print_help() sys.exit(1) head_node = create_apx_node_from_file_name(args.head, args.head_name) if args.tail is not None: tail_node = create_apx_node_from_file_name(args.tail, args.tail_name) else: tail_node = None source_node = apx.Parser().parse(args.input_file) if args.file is not None: port_names = parse_lines_in_file(args.file) else: port_names = args.port_names processed = set() for name in port_names: source_port = source_node.find(name) if (source_port is not None) and (source_port.name not in processed): processed.add(source_port.name) head_node.add_port_from_node(source_node, source_port) if args.mirror: head_node = head_node.mirror()