def items_to_bytes(self, items, descriptors=None, max_packet_size=1500): if descriptors is None: descriptors = items heap = send.Heap(self) for descriptor in descriptors: heap.add_descriptor(descriptor) for item in items: heap.add_item(item) gen = send.PacketGenerator(heap, 0x123456, max_packet_size) return list(gen)
def test_lifetime(self): """Heap must hold references to item values""" item = spead2.Item(id=0x2345, name='name', description='description', shape=(2, 3), dtype=np.uint16) item.value = np.array([[6, 7, 8], [10, 11, 12000]], dtype=np.uint16) weak = weakref.ref(item.value) heap = send.Heap(self.flavour) heap.add_item(item) del item packets = list(send.PacketGenerator(heap, 0x123456, 1472)) # noqa: F841 assert weak() is not None del heap # pypy needs multiple gc passes to wind it all up for i in range(10): gc.collect() assert weak() is None
def test_lifetime(self): """Heap must hold references to item values""" item = spead2.Item(id=0x2345, name='name', description='description', shape=(2, 3), dtype=np.uint16) item.value = np.array([[6, 7, 8], [10, 11, 12000]], dtype=np.uint16) weak = weakref.ref(item.value) heap = send.Heap(self.flavour) heap.add_item(item) del item packets = list(send.PacketGenerator(heap, 0x123456, 1472)) assert_is_not_none(weak()) del heap assert_is_none(weak())
def test_end(self): """Tests sending an end-of-stream marker.""" expected = [ b''.join([ self.flavour.make_header(6), self.flavour.make_immediate(spead2.HEAP_CNT_ID, 0x123456), self.flavour.make_immediate(spead2.HEAP_LENGTH_ID, 1), self.flavour.make_immediate(spead2.PAYLOAD_OFFSET_ID, 0), self.flavour.make_immediate(spead2.PAYLOAD_LENGTH_ID, 1), self.flavour.make_immediate(spead2.STREAM_CTRL_ID, spead2.CTRL_STREAM_STOP), self.flavour.make_address(spead2.NULL_ID, 0), struct.pack('B', 0) ]) ] heap = send.Heap(self.flavour) heap.add_end() packet = list(send.PacketGenerator(heap, 0x123456, 1500)) assert hexlify(packet) == hexlify(expected)
def test_zero_copy(self): """Test that heaps can reference original data. This allows heaps to be updated by just changing the data. """ id = 0x2345 data = np.arange(8, dtype=np.uint8) imm = np.zeros((), dtype='>u8') item1 = spead2.Item(id=id, name='item1', description='addressed item', shape=data.shape, dtype=data.dtype, value=data) item2 = spead2.Item(id=id + 1, name='item2', description='inline item', shape=(), format=[('u', self.flavour.heap_address_bits)], value=imm) heap = spead2.send.Heap(self.flavour) heap.add_item(item1) heap.add_item(item2) # Now change the values after they've been added to the heap. data *= 2 imm[()] = 0xdeadbeef expected = [ b''.join([ self.flavour.make_header(6), self.flavour.make_immediate(spead2.HEAP_CNT_ID, 0x123456), self.flavour.make_immediate(spead2.HEAP_LENGTH_ID, 8), self.flavour.make_immediate(spead2.PAYLOAD_OFFSET_ID, 0), self.flavour.make_immediate(spead2.PAYLOAD_LENGTH_ID, 8), self.flavour.make_address(id, 0), self.flavour.make_immediate(id + 1, 0xdeadbeef), data.tobytes() ]) ] gen = send.PacketGenerator(heap, 0x123456, 1500) packets = list(gen) assert hexlify(packets) == hexlify(expected)