예제 #1
0
    def test_byte_to_port_all(self):
        node = create_node_and_data()
        node_data = apx.NodeData(node)
        input_file = node_data.inPortDataFile
        RheostatLevelRqst_data_offset = 0
        RheostatLevelRqst_data_len = 1
        StrSignal_data_offset = 1
        StrSignal_data_len = 8
        RecordSignal_data_offset = 9
        RecordSignal_data_len = 18
        total_len = RheostatLevelRqst_data_len + StrSignal_data_len + RecordSignal_data_len
        self.assertEqual(len(input_file.data), total_len)
        self.assertEqual(len(node_data.inPortByteMap), total_len)
        result = list(node_data.byte_to_port(0, total_len))

        self.assertEqual(len(result), 3)
        self.assertIs(result[0][0], node.find('RheostatLevelRqst'))
        self.assertIs(result[1][0], node.find('StrSignal'))
        self.assertIs(result[2][0], node.find('RecordSignal'))
        self.assertEqual(result[0][1], RheostatLevelRqst_data_offset)
        self.assertEqual(result[1][1], StrSignal_data_offset)
        self.assertEqual(result[2][1], RecordSignal_data_offset)
        self.assertEqual(result[0][2], RheostatLevelRqst_data_len)
        self.assertEqual(result[1][2], StrSignal_data_len)
        self.assertEqual(result[2][2], RecordSignal_data_len)
예제 #2
0
    def test_create_port_with_unicode_initializer(self):
        apx_definition = """APX/1.2
N"TestNode"
R"EquipmentValue"a[20]:="°"
"""
        node = apx.Node.from_text(apx_definition)
        node_data = apx.NodeData(node)
        self.assertEqual(
            node_data.inPortDataFile.data.decode(encoding='utf-8'),
            '°\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        )
        self.assertEqual(node_data.definitionFile.data.decode('utf-8'),
                         apx_definition)
예제 #3
0
    def test_callback(self):

        call_history = []

        @apx.NodeDataClient.register
        class Listener:
            def on_require_port_data(self, port, value):
                call_history.append((port, value))

        listener_obj = Listener()
        node = create_node_and_data()
        node_data = apx.NodeData(node)
        node_data.nodeDataClient = listener_obj
        input_file = node_data.inPortDataFile
        RheostatLevelRqst_data_offset = 0
        RheostatLevelRqst_data_len = 1
        StrSignal_data_offset = 1
        StrSignal_data_len = 8
        RecordSignal_data_offset = 9
        RecordSignal_data_len = 18
        #test write RheostatLevelRqst
        self.assertEqual(len(call_history), 0)
        input_file.write(0, bytes([0]))
        self.assertEqual(len(call_history), 1)
        self.assertEqual(call_history[-1][0], node.find('RheostatLevelRqst'))
        self.assertEqual(call_history[-1][1], 0)

        input_file.write(0, bytes([255]))
        self.assertEqual(len(call_history), 2)
        self.assertEqual(call_history[-1][0], node.find('RheostatLevelRqst'))
        self.assertEqual(call_history[-1][1], 255)

        #test write RecordSignal
        input_file.write(RecordSignal_data_offset, "Test".encode('utf-8'))
        self.assertEqual(len(call_history), 3)
        self.assertEqual(call_history[-1][0], node.find('RecordSignal'))
        self.assertEqual(call_history[-1][1], {
            'Name': "Test",
            'Id': 0xFFFFFFFF,
            'Data': [0, 0, 0]
        })
        input_file.write(
            RecordSignal_data_offset, "Abc\0\0\0\0\0".encode('utf-8') +
            struct.pack('<L', 918) + struct.pack('<HHH', 1000, 2000, 4000))
        self.assertEqual(len(call_history), 4)
        self.assertEqual(call_history[-1][0], node.find('RecordSignal'))
        self.assertEqual(call_history[-1][1], {
            'Name': "Abc",
            'Id': 918,
            'Data': [1000, 2000, 4000]
        })
예제 #4
0
    def test_byte_to_port_RecordSignal(self):
        node = create_node_and_data()
        node_data = apx.NodeData(node)

        RecordSignal_data_offset = 9
        RecordSignal_data_len = 18
        for offset in range(RecordSignal_data_offset,
                            RecordSignal_data_offset + RecordSignal_data_len):
            result = list(node_data.byte_to_port(offset, 1))
            self.assertEqual(len(result), 1)
            port, offset, length = result[0]
            self.assertIs(port, node.find('RecordSignal'))
            self.assertEqual(offset, RecordSignal_data_offset)
            self.assertEqual(length, RecordSignal_data_len)
예제 #5
0
    def test_byte_to_port_RheostatLevelRqst(self):
        node = create_node_and_data()
        node_data = apx.NodeData(node)

        RheostatLevelRqst_data_offset = 0
        RheostatLevelRqst_data_len = 1
        result = list(
            node_data.byte_to_port(RheostatLevelRqst_data_offset,
                                   RheostatLevelRqst_data_len))
        self.assertEqual(len(result), 1)
        port, offset, length = result[0]
        self.assertIs(port, node.find('RheostatLevelRqst'))
        self.assertEqual(offset, RheostatLevelRqst_data_offset)
        self.assertEqual(length, RheostatLevelRqst_data_len)
예제 #6
0
 def test_write_VehicleSpeed(self):
     node = create_node_and_data()
     node_data = apx.NodeData(node)
     VehicleSpeed_port = node.find('VehicleSpeed')
     VehicleSpeed_offset = 0
     VehicleSpeed_length = 2
     output_file = node_data.outPortDataFile
     #verify init value
     self.assertEqual(
         output_file.read(VehicleSpeed_offset, VehicleSpeed_length),
         bytes([0xFF, 0xFF]))
     node_data.write_provide_port(VehicleSpeed_port, 0x1234)
     self.assertEqual(
         output_file.read(VehicleSpeed_offset, VehicleSpeed_length),
         bytes([0x34, 0x12]))
예제 #7
0
 def test_write_MainBeam(self):
     node = create_node_and_data()
     node_data = apx.NodeData(node)
     MainBeam_port = node.find('MainBeam')
     MainBeam_offset = 2
     MainBeam_length = 1
     output_file = node_data.outPortDataFile
     #verify init value
     self.assertEqual(output_file.read(MainBeam_offset, MainBeam_length),
                      bytes([3]))
     node_data.write_provide_port(MainBeam_port, 0)
     self.assertEqual(output_file.read(MainBeam_offset, MainBeam_length),
                      bytes([0]))
     node_data.write_provide_port(MainBeam_port, 3)
     self.assertEqual(output_file.read(MainBeam_offset, MainBeam_length),
                      bytes([3]))
예제 #8
0
 def attach_node(self, node):
     """
     Attaches existing APX node to the client
     """
     self.node = node if isinstance(node, apx.Node) else None
     if self.node is not None:
         self.nodeData = apx.NodeData(node)
         inPortDataFile = self.nodeData.inPortDataFile
         outPortDataFile = self.nodeData.outPortDataFile
         definitionDataFile = self.nodeData.definitionFile
         if inPortDataFile is not None:
             self.fileManager.requestRemoteFile(inPortDataFile)
         if outPortDataFile is not None:
             self.fileManager.attachLocalFile(outPortDataFile)
         if definitionDataFile is not None:
             self.fileManager.attachLocalFile(definitionDataFile)
         self.nodeData.nodeDataClient = self
예제 #9
0
 def test_read_port_RheostatLevelRqst(self):
     node = create_node_and_data()
     port_RheostatLevelRqst = node.find('RheostatLevelRqst')
     node_data = apx.NodeData(node)
     input_file = node_data.inPortDataFile
     #verify init value
     self.assertEqual(node_data.read_require_port(port_RheostatLevelRqst),
                      255)
     #write to input file
     input_file.write(0, bytes([0]))
     self.assertEqual(node_data.read_require_port(port_RheostatLevelRqst),
                      0)
     input_file.write(0, bytes([10]))
     self.assertEqual(node_data.read_require_port(port_RheostatLevelRqst),
                      10)
     input_file.write(0, bytes([255]))
     self.assertEqual(node_data.read_require_port(port_RheostatLevelRqst),
                      255)
예제 #10
0
    def test_read_port_StrSignal(self):
        node = create_node_and_data()
        port_StrSignal = node.find('StrSignal')
        node_data = apx.NodeData(node)
        input_file = node_data.inPortDataFile
        #verify init value
        self.assertEqual(node_data.read_require_port(port_StrSignal), "")
        #write to input file
        input_file.write(1, 'Hello\0\0\0'.encode('utf-8'))
        self.assertEqual(node_data.read_require_port(port_StrSignal), "Hello")

        input_file.write(1, 'Selected'.encode('utf-8'))
        self.assertEqual(node_data.read_require_port(port_StrSignal),
                         "Selected")

        input_file.write(1, 'a\0\0\0\0\0\0'.encode('utf-8'))
        self.assertEqual(node_data.read_require_port(port_StrSignal), "a")
        input_file.write(1, bytes(8))
        self.assertEqual(node_data.read_require_port(port_StrSignal), "")
예제 #11
0
 def test_write_TotalDistance(self):
     node = create_node_and_data()
     node_data = apx.NodeData(node)
     TotalDistance_port = node.find('TotalDistance')
     TotalDistance_offset = 3
     TotalDistance_length = 4
     output_file = node_data.outPortDataFile
     #verify init value
     self.assertEqual(
         output_file.read(TotalDistance_offset, TotalDistance_length),
         bytes([0xFF, 0xFF, 0xFF, 0xFF]))
     node_data.write_provide_port(TotalDistance_port, 0)
     self.assertEqual(
         output_file.read(TotalDistance_offset, TotalDistance_length),
         bytes([0, 0, 0, 0]))
     node_data.write_provide_port(TotalDistance_port, 0x12345678)
     self.assertEqual(
         output_file.read(TotalDistance_offset, TotalDistance_length),
         bytes([0x78, 0x56, 0x34, 0x12]))
예제 #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)         
예제 #13
0
 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))
예제 #14
0
 def test_write_ComplexRecordSignal(self):
     node = create_node_and_data()
     node_data = apx.NodeData(node)
     ComplexRecordSignal_port = node.find('ComplexRecordSignal')
     ComplexRecordSignal_offset = 7
     ComplexRecordSignal_length = 10
     output_file = node_data.outPortDataFile
     #verify init value
     self.assertEqual(
         output_file.read(ComplexRecordSignal_offset,
                          ComplexRecordSignal_length),
         struct.pack("<HHHL", 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFFFFFF))
     #write some values
     node_data.write_provide_port(ComplexRecordSignal_port, {
         "SensorData": dict(x=1, y=2, z=3),
         'TimeStamp': 0
     })
     self.assertEqual(
         output_file.read(ComplexRecordSignal_offset,
                          ComplexRecordSignal_length),
         struct.pack("<HHHL", 1, 2, 3, 0))
예제 #15
0
    def test_byte_to_port_invalid_args(self):
        node = create_node_and_data()
        node_data = apx.NodeData(node)
        self.assertEqual(len(node_data.inPortByteMap), 27)

        with self.assertRaises(ValueError) as context:
            result = list(node_data.byte_to_port(28, 1))
        self.assertEqual(str(context.exception),
                         "start_offset (28) is beyond length of file (27)")

        with self.assertRaises(ValueError) as context:
            result = list(node_data.byte_to_port(25, 5))
        self.assertEqual(str(context.exception),
                         "end_offset (30) is beyond length of file (27)")

        RecordSignal_data_offset = 9
        RecordSignal_data_len = 18
        result = list(node_data.byte_to_port(25, 2))
        port, offset, length = result[0]
        self.assertIs(port, node.find('RecordSignal'))
        self.assertEqual(offset, RecordSignal_data_offset)
        self.assertEqual(length, RecordSignal_data_len)
예제 #16
0
 def test_read_RecordSignal(self):
     node = create_node_and_data()
     port_RecordSignal = node.find('RecordSignal')
     node_data = apx.NodeData(node)
     input_file = node_data.inPortDataFile
     #verify init value
     self.assertEqual(node_data.read_require_port(port_RecordSignal), {
         'Name': "",
         'Id': 0xFFFFFFFF,
         'Data': [0, 0, 0]
     })
     name_offset = 9
     id_offset = 17
     data_offset = 21
     input_file.write(name_offset, "abcdefgh".encode('utf-8'))
     self.assertEqual(node_data.read_require_port(port_RecordSignal), {
         'Name': "abcdefgh",
         'Id': 0xFFFFFFFF,
         'Data': [0, 0, 0]
     })
     input_file.write(id_offset, struct.pack("<L", 0x12345678))
     self.assertEqual(node_data.read_require_port(port_RecordSignal), {
         'Name': "abcdefgh",
         'Id': 0x12345678,
         'Data': [0, 0, 0]
     })
     input_file.write(data_offset, struct.pack("<HHH", 0, 0, 1))
     self.assertEqual(node_data.read_require_port(port_RecordSignal), {
         'Name': "abcdefgh",
         'Id': 0x12345678,
         'Data': [0, 0, 1]
     })
     input_file.write(data_offset, struct.pack("<HHH", 18000, 2, 10))
     self.assertEqual(node_data.read_require_port(port_RecordSignal), {
         'Name': "abcdefgh",
         'Id': 0x12345678,
         'Data': [18000, 2, 10]
     })
예제 #17
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))
예제 #18
0
 def test_write_s16(self):
     node = apx.Node('TestNode')
     port = node.append(apx.ProvidePort('S16Signal', 's', '=0'))
     node_data = apx.NodeData(node)
     signal_offset = 0
     signal_length = 2
     output_file = node_data.outPortDataFile
     #verify init value
     self.assertEqual(output_file.read(signal_offset, signal_length),
                      bytes(signal_length))
     #write value
     node_data.write_provide_port(port, -1)
     self.assertEqual(output_file.read(signal_offset, signal_length),
                      struct.pack('<h', -1))
     node_data.write_provide_port(port, -32768)
     self.assertEqual(output_file.read(signal_offset, signal_length),
                      struct.pack('<h', -32768))
     node_data.write_provide_port(port, 32767)
     self.assertEqual(output_file.read(signal_offset, signal_length),
                      struct.pack('<h', 32767))
     node_data.write_provide_port(port, 0)
     self.assertEqual(output_file.read(signal_offset, signal_length),
                      struct.pack('<H', 0))
예제 #19
0
    def test_port_map_and_compiled_programs(self):
        node = create_node_and_data()

        self.assertEqual(node.find('VehicleSpeed').id, 0)
        self.assertEqual(node.find('RheostatLevelRqst').id, 0)

        node_data = apx.NodeData(node)
        self.assertEqual(len(node_data.inPortByteMap), 27)
        self.assertEqual(node_data.inPortByteMap[0].name, 'RheostatLevelRqst')
        self.assertEqual(node_data.inPortByteMap[0].id, 0)
        for i in range(1, 9):
            self.assertEqual(node_data.inPortByteMap[i].name, 'StrSignal')
            self.assertEqual(node_data.inPortByteMap[i].id, 1)
        for i in range(9, 27):
            self.assertEqual(node_data.inPortByteMap[i].name, 'RecordSignal')
            self.assertEqual(node_data.inPortByteMap[i].id, 2)

        self.assertEqual(len(node_data.outPortDataMap), 4)
        elem = node_data.outPortDataMap[0]
        self.assertEqual(elem.data_offset, 0)
        self.assertEqual(elem.data_len, 2)
        self.assertIs(elem.port, node.find('VehicleSpeed'))
        elem = node_data.outPortDataMap[1]
        self.assertEqual(elem.data_offset, 2)
        self.assertEqual(elem.data_len, 1)
        self.assertIs(elem.port, node.find('MainBeam'))
        elem = node_data.outPortDataMap[2]
        self.assertEqual(elem.data_offset, 3)
        self.assertEqual(elem.data_len, 4)
        self.assertIs(elem.port, node.find('TotalDistance'))
        elem = node_data.outPortDataMap[3]
        self.assertEqual(elem.data_offset, 7)
        self.assertEqual(elem.data_len, 10)
        self.assertIs(elem.port, node.find('ComplexRecordSignal'))

        expected = bytes([
            apx.OPCODE_PACK_PROG, apx.UINT16_LEN, 0, 0, 0, apx.OPCODE_PACK_U16
        ])
        self.assertEqual(node_data.outPortPrograms[0], expected)
        expected = bytes(
            [apx.OPCODE_PACK_PROG, apx.UINT8_LEN, 0, 0, 0, apx.OPCODE_PACK_U8])
        self.assertEqual(node_data.outPortPrograms[1], expected)
        expected = bytes([
            apx.OPCODE_PACK_PROG, apx.UINT32_LEN, 0, 0, 0, apx.OPCODE_PACK_U32
        ])
        self.assertEqual(node_data.outPortPrograms[2], expected)
        expected = bytes([
            apx.OPCODE_PACK_PROG, (3 * apx.UINT16_LEN + apx.UINT32_LEN), 0, 0,
            0, apx.OPCODE_RECORD_ENTER, apx.OPCODE_RECORD_SELECT
        ]) + "SensorData\0".encode('ascii') + bytes([
            apx.OPCODE_RECORD_ENTER, apx.OPCODE_RECORD_SELECT
        ]) + "x\0".encode('ascii') + bytes([
            apx.OPCODE_PACK_U16, apx.OPCODE_RECORD_SELECT
        ]) + "y\0".encode('ascii') + bytes([
            apx.OPCODE_PACK_U16, apx.OPCODE_RECORD_SELECT
        ]) + "z\0".encode('ascii') + bytes([
            apx.OPCODE_PACK_U16, apx.OPCODE_RECORD_LEAVE,
            apx.OPCODE_RECORD_SELECT
        ]) + "TimeStamp\0".encode('ascii') + bytes(
            [apx.OPCODE_PACK_U32, apx.OPCODE_RECORD_LEAVE])
        self.assertEqual(node_data.outPortPrograms[3], expected)

        expected = bytes([
            apx.OPCODE_UNPACK_PROG, apx.UINT8_LEN, 0, 0, 0,
            apx.OPCODE_UNPACK_U8
        ])
        self.assertEqual(node_data.inPortPrograms[0], expected)
        expected = bytes(
            [apx.OPCODE_UNPACK_PROG, 8, 0, 0, 0, apx.OPCODE_UNPACK_STR, 8, 0])
        self.assertEqual(node_data.inPortPrograms[1], expected)
        expected = bytes([
            apx.OPCODE_UNPACK_PROG, (8 + apx.UINT32_LEN + apx.UINT16_LEN * 3),
            0, 0, 0, apx.OPCODE_RECORD_ENTER, apx.OPCODE_RECORD_SELECT
        ]) + "Name\0".encode('ascii') + bytes([
            apx.OPCODE_UNPACK_STR, 8, 0, apx.OPCODE_RECORD_SELECT
        ]) + "Id\0".encode('ascii') + bytes([
            apx.OPCODE_UNPACK_U32, apx.OPCODE_RECORD_SELECT
        ]) + "Data\0".encode('ascii') + bytes(
            [apx.OPCODE_UNPACK_U16AR, 3, 0, apx.OPCODE_RECORD_LEAVE])
        self.assertEqual(node_data.inPortPrograms[2], expected)