更新UCD-API库及文档
This commit is contained in:
1
UniTAP/dev/ports/modules/packet_generator/__init__.py
Normal file
1
UniTAP/dev/ports/modules/packet_generator/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .packet_generator import PacketGenerator
|
||||
@@ -0,0 +1,92 @@
|
||||
from ctypes import c_byte
|
||||
from typing import Union, List, Optional
|
||||
|
||||
from UniTAP.libs.lib_tsi import ci, p_ci
|
||||
from UniTAP.libs.lib_tsi.tsi_io import PortIO
|
||||
from UniTAP.dev.modules import MemoryManager
|
||||
|
||||
|
||||
class PacketGenerator:
|
||||
class Status:
|
||||
def __init__(self, value: int):
|
||||
self.enabled = bool(value & 0x1)
|
||||
self.active = bool(value & 0x2)
|
||||
self.error = bool(value & 0x4)
|
||||
self.overflow = bool(value & 0x8)
|
||||
|
||||
def __str__(self):
|
||||
return f"Packet Generator Status: Enabled: {self.enabled}; Active: {self.active}; Error: {self.error}; Overflow: {self.overflow};"
|
||||
"""
|
||||
|
||||
Main class `PacketGenerator` allows working with PG functionality on the device: set different types of pattern
|
||||
`set_pattern`, set different video modes `set_vm`, set additional parameters for some patterns `set_pattern_params`,
|
||||
get information about current video mode on stream `get_stream_video_mode`, `apply` all transferred setting,
|
||||
`reset` settings and read pattern generator `status`.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, port_io: PortIO, memory_manager: MemoryManager):
|
||||
self.__io = port_io
|
||||
self.__memory_manager = memory_manager
|
||||
self.__packets = []
|
||||
|
||||
def reset(self):
|
||||
"""
|
||||
|
||||
Reset static packet generator settings to default values.
|
||||
|
||||
"""
|
||||
self.stop()
|
||||
self.__packets = []
|
||||
|
||||
def start(self):
|
||||
"""
|
||||
|
||||
Start packet generator with current settings.
|
||||
|
||||
"""
|
||||
self.stop()
|
||||
self.__upload_data()
|
||||
if self.__io.set(ci.TSI_PACKETGEN_CONTROL_W, 1) < ci.TSI_SUCCESS:
|
||||
raise Exception("Failed to start packet generator")
|
||||
|
||||
def stop(self):
|
||||
"""
|
||||
|
||||
Stop packet generator.
|
||||
|
||||
"""
|
||||
self.__io.set(ci.TSI_PACKETGEN_CONTROL_W, 2)
|
||||
|
||||
def status(self) -> Status:
|
||||
"""
|
||||
|
||||
Get current status of packet generator.
|
||||
|
||||
Returns:
|
||||
Status - current status of packet generator
|
||||
"""
|
||||
return PacketGenerator.Status(self.__io.get(ci.TSI_PACKETGEN_STATUS_R)[1])
|
||||
|
||||
def add_packet(self, raw_packet_data: bytearray):
|
||||
self.__packets.append(raw_packet_data)
|
||||
|
||||
def load_packet(self, file_path: str):
|
||||
with open(file_path, "rb") as f:
|
||||
packet_data = f.read()
|
||||
self.__packets.append(bytearray(packet_data))
|
||||
|
||||
def __upload_data(self):
|
||||
mem_layout = self.__memory_manager.get_memory_layout()
|
||||
if len(mem_layout) <= MemoryManager.MemoryOwner.MO_Events.value or mem_layout[MemoryManager.MemoryOwner.MO_Events.value] == 0:
|
||||
self.__memory_manager.make_default()
|
||||
|
||||
if self.__io.set(ci.TSI_PACKETGEN_PACKETS_NUMBER, len(self.__packets)) < ci.TSI_SUCCESS:
|
||||
raise Exception("Failed to set packets number for packet generator")
|
||||
for index, packet in enumerate(self.__packets):
|
||||
if self.__io.set(ci.TSI_PACKETGEN_PACKET_DATA, packet, data_type=c_byte, data_count=len(packet)) < ci.TSI_SUCCESS:
|
||||
raise Exception(f"Failed to set packet data for packet {index} in packet generator")
|
||||
|
||||
if self.__io.set(ci.TSI_PACKETGEN_MEM_BLOCK, int(MemoryManager.MemoryOwner.MO_Events)) < ci.TSI_SUCCESS:
|
||||
raise Exception("Failed to set memory block for packet generator")
|
||||
|
||||
Reference in New Issue
Block a user