80 lines
2.3 KiB
Python
80 lines
2.3 KiB
Python
import ctypes
|
|
import time
|
|
import numpy as np
|
|
|
|
# === DLL 加载 ===
|
|
dll = ctypes.WinDLL(r"D:\BodyBalanceEvaluation\backend\dll\smitsense\SMiTSenseUsbWrapper.dll")
|
|
|
|
# === DLL 函数声明 ===
|
|
dll.SMiTSenseUsb_Init.argtypes = [ctypes.c_int]
|
|
dll.SMiTSenseUsb_Init.restype = ctypes.c_int
|
|
|
|
dll.SMiTSenseUsb_ScanDevices.argtypes = [ctypes.POINTER(ctypes.c_int)]
|
|
dll.SMiTSenseUsb_ScanDevices.restype = ctypes.c_int
|
|
|
|
dll.SMiTSenseUsb_OpenAndStart.argtypes = [
|
|
ctypes.c_int,
|
|
ctypes.POINTER(ctypes.c_uint16),
|
|
ctypes.POINTER(ctypes.c_uint16)
|
|
]
|
|
dll.SMiTSenseUsb_OpenAndStart.restype = ctypes.c_int
|
|
|
|
dll.SMiTSenseUsb_GetLatestFrame.argtypes = [
|
|
ctypes.POINTER(ctypes.c_uint16),
|
|
ctypes.c_int
|
|
]
|
|
dll.SMiTSenseUsb_GetLatestFrame.restype = ctypes.c_int
|
|
|
|
dll.SMiTSenseUsb_StopAndClose.argtypes = []
|
|
dll.SMiTSenseUsb_StopAndClose.restype = ctypes.c_int
|
|
|
|
# === 初始化设备 ===
|
|
ret = dll.SMiTSenseUsb_Init(0)
|
|
if ret != 0:
|
|
raise RuntimeError(f"Init failed: {ret}")
|
|
|
|
count = ctypes.c_int()
|
|
ret = dll.SMiTSenseUsb_ScanDevices(ctypes.byref(count))
|
|
if ret != 0 or count.value == 0:
|
|
raise RuntimeError("No devices found")
|
|
|
|
# 打开设备
|
|
rows = ctypes.c_uint16()
|
|
cols = ctypes.c_uint16()
|
|
ret = dll.SMiTSenseUsb_OpenAndStart(0, ctypes.byref(rows), ctypes.byref(cols))
|
|
if ret != 0:
|
|
raise RuntimeError("OpenAndStart failed")
|
|
|
|
rows_val, cols_val = rows.value, cols.value
|
|
frame_size = rows_val * cols_val
|
|
buf_type = ctypes.c_uint16 * frame_size
|
|
buf = buf_type()
|
|
|
|
# 创建一个 NumPy 数组视图,复用内存
|
|
data_array = np.ctypeslib.as_array(buf).reshape((rows_val, cols_val))
|
|
|
|
print(f"设备已打开: {rows_val}x{cols_val}")
|
|
|
|
try:
|
|
while True:
|
|
ret = dll.SMiTSenseUsb_GetLatestFrame(buf, frame_size)
|
|
time.sleep(1)
|
|
# while True:
|
|
# ret = dll.SMiTSenseUsb_GetLatestFrame(buf, frame_size)
|
|
# if ret == 0:
|
|
# # data_array 已经复用缓冲区内存,每次直接访问即可
|
|
# # 例如打印最大值和前5行前5列的数据
|
|
# print("最大压力值:", data_array.max())
|
|
# print("前5x5数据:\n", data_array[:5, :5])
|
|
# else:
|
|
# print("读取数据帧失败")
|
|
|
|
# time.sleep(1) # 每秒读取一帧
|
|
|
|
except KeyboardInterrupt:
|
|
print("退出中...")
|
|
|
|
finally:
|
|
dll.SMiTSenseUsb_StopAndClose()
|
|
print("设备已关闭")
|