Esempio n. 1
0
 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)
Esempio n. 2
0
 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)
Esempio n. 5
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))
Esempio n. 6
0
 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)
Esempio n. 7
0
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
Esempio n. 8
0
    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))
Esempio n. 9
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")
Esempio n. 10
0
    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)
Esempio n. 11
0
   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())
Esempio n. 12
0
   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)         
Esempio n. 13
0
    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)
Esempio n. 14
0
 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)))
Esempio n. 15
0
 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
Esempio n. 16
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],'')
Esempio n. 17
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
Esempio n. 18
0
        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()
Esempio n. 19
0
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())
Esempio n. 20
0
 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))
Esempio n. 21
0
 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)
Esempio n. 22
0
    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)
Esempio n. 23
0
#!/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'])
    
Esempio n. 24
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('.',
                              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',