Files
Handcontrol_LYT_Version_Win…/cap_read.py
2026-07-16 15:24:40 +08:00

205 lines
7.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from enum import *
import threading
import queue # 导入 queue 模块
from class_ch341 import *
from class_sensorcmd import *
from class_finger import *
from collections import namedtuple
import socket
DEF_CDC_SYNC_MS = 1000 #电容同步间隔
DEF_GET_CAP_MS = (30) #读取电容间隔
DEF_PRO_CYC = 100
DEF_MAX_FINGER_NUM = 1 #需要连接的手指数量最大5个
# 定义一个全局的队列,用于线程间通信
capReadQueue = queue.Queue()
# 341通信
class EnumCh341ConnectStatus(Enum):
CH341_CONNECT_INIT = 0
CH341_CONNECT_OPEN = 1
CH341_CONNECT_SET_SPEED = 2
CH341_CONNECT_SAMPLE_START = 3
CH341_CONNECT_CHECK = 4
CH341_CONNECT_SAMPLE_STOP = 5
class ClassCapRead:
def __init__(self):
self.ch341 = ClassCh341()
# 最大连接5个手指
self.fingers = list() # 传感器列表
for i in range(DEF_MAX_FINGER_NUM):
self.fingers.append(ClassFinger(2+i, self.ch341))
self.currCh341State = 0 # 当前ch341连接状态
self.prevCh341State = 0 # 上次ch341连接状态
self.ch341CheckTimer = 0
self.mcuInit = 0
self.pcaAddr = 0x70 # iic控制芯片地址
self.ch341Init = 0 # ch341初始化标志位
self.syncTimer = 0
self.connectStatus = EnumCh341ConnectStatus.CH341_CONNECT_INIT
self.running = True # <-- 新增这一行
self.connectDebug()
def __del__(self):
self.disConnectDebug()
self.ch341.disconnect()
print("ch341释放")
pass
def connectDebug(self):
#连接到调试的服务器
self.vofaClient = socket.socket()
addr = ('127.0.0.1', 1347)
try:
self.vofaClient.connect(addr)
# client.send('hello world\r\n'.encode())
self.socketConnected = True
print('连接服务器成功')
except Exception as e:
self.socketConnected = False
print('连接服务器失败')
def disConnectDebug(self):
if self.vofaClient:
self.vofaClient.close()
def debugPrint(self):
if self.socketConnected == True:
fingerIndex = 0
_log1 = ""
# 输出原始通道数值
# for index in range(0, self.fingers[fingerIndex].projectPara.sensor_num):
# _log1 += str(self.fingers[fingerIndex].readData.channelCapData[index])
# _log1 += ','
for index in range(0, self.fingers[fingerIndex].projectPara.ydds_num):
_log1 += str(int(self.fingers[fingerIndex].readData.nf[index]*1000))
_log1 += ','
_log1 += str(int(self.fingers[fingerIndex].readData.tf[index]*1000))
_log1 += ','
_log1 += str(self.fingers[fingerIndex].readData.tfDir[index])
_log1 += ','
for index in range(0, self.fingers[fingerIndex].projectPara.s_prox_num):
_log1 += str(self.fingers[fingerIndex].readData.sProxCapData[index])
_log1 += ','
for index in range(0, self.fingers[fingerIndex].projectPara.m_prox_num):
_log1 += str(self.fingers[fingerIndex].readData.mProxCapData[index])
_log1 += ','
_log1 += str(0)
_log1 += '\r\n'
#print(_log1)
if self.socketConnected == 1:
self.vofaClient.send(_log1.encode())
def set_sensor_enable(self, idx):
_pack = list()
_pack.append(idx)
self.ch341.write(self.pcaAddr, _pack)
def ch341Connect(self):
if self.connectStatus == EnumCh341ConnectStatus.CH341_CONNECT_INIT:
if(True == self.ch341.init()):
self.connectStatus = EnumCh341ConnectStatus.CH341_CONNECT_OPEN
elif self.connectStatus == EnumCh341ConnectStatus.CH341_CONNECT_OPEN:
if(True == self.ch341.open()):
self.connectStatus = EnumCh341ConnectStatus.CH341_CONNECT_SET_SPEED
else:
self.connectStatus = EnumCh341ConnectStatus.CH341_CONNECT_INIT
elif self.connectStatus == EnumCh341ConnectStatus.CH341_CONNECT_SET_SPEED:
if(True == self.ch341.set_speed(self.ch341.IIC_SPEED_400)):
self.connectStatus = EnumCh341ConnectStatus.CH341_CONNECT_SAMPLE_START
else:
print("set speed err")
self.connectStatus = EnumCh341ConnectStatus.CH341_CONNECT_SAMPLE_START
elif self.connectStatus == EnumCh341ConnectStatus.CH341_CONNECT_SAMPLE_START:
self.connectStatus = EnumCh341ConnectStatus.CH341_CONNECT_CHECK
self.timer = threading.Timer(DEF_GET_CAP_MS/1000, self.capRead)
self.timer.start()
elif self.connectStatus == EnumCh341ConnectStatus.CH341_CONNECT_CHECK:
self.ch341CheckTimer += DEF_PRO_CYC
if(self.ch341CheckTimer >= 1000):
self.ch341CheckTimer = 0
if(False == self.ch341.connectCheck()):
print("ch341 拔出")
self.connectStatus = EnumCh341ConnectStatus.CH341_CONNECT_SAMPLE_STOP
elif self.connectStatus == EnumCh341ConnectStatus.CH341_CONNECT_SAMPLE_STOP:
self.syncTimer = 0
for i in range(0, len(self.fingers)):
self.fingers[i].disconnected()
self.connectStatus = EnumCh341ConnectStatus.CH341_CONNECT_INIT
else:
self.connectStatus = EnumCh341ConnectStatus.CH341_CONNECT_INIT
def capRead(self):
capReadTime = time.time()
ms_capReadTime = capReadTime
connectedSensorChan = 0
connectedSensorCnt = 0
for fingerIndex in range(0, len(self.fingers)):
self.set_sensor_enable(1 << (self.fingers[fingerIndex].pcaIdx))
connectedSensorChan |= 1 << (self.fingers[fingerIndex].pcaIdx)
if self.fingers[fingerIndex].connect == False:
if True == self.fingers[fingerIndex].checkSensor():
print(f"sensor[{fingerIndex}] connected")
else:
print(f"addr = {fingerIndex}, connected false")
else:
self.fingers[fingerIndex].capRead()
connectedSensorCnt += 1
self.debugPrint()
# 大于1个传感器连接需要设置接近采集序列
if connectedSensorCnt > 1 and (time.time() - self.syncTimer) > DEF_CDC_SYNC_MS:
self.syncTimer = time.time()
self.set_sensor_enable(connectedSensorChan)
for fingerIndex in range(0, len(self.fingers)):
if self.fingers[fingerIndex].connect is True:
self.fingers[fingerIndex].snsCmd.setSensorSync(0)
break
if self.connectStatus == EnumCh341ConnectStatus.CH341_CONNECT_CHECK:
capReadTime = time.time()
difftime = int(capReadTime*1000-ms_capReadTime*1000)
#print(f"diffTime={difftime}")
#定时器在任务完成后重新启动
if self.running: # 新增判断
if(difftime>DEF_GET_CAP_MS):
timer = threading.Timer(DEF_GET_CAP_MS/1000, self.capRead)
else:
timer = threading.Timer((DEF_GET_CAP_MS-difftime)/1000, self.capRead)
timer.start()
def capReadThread():
cap = ClassCapRead()
try:
while True:
cap.ch341Connect()
time.sleep(DEF_PRO_CYC/1000)
except KeyboardInterrupt:
print("\nStopping sensor read...")
cap.running = False
cap.disConnectDebug()
cap.ch341.disconnect()
print("CH341 released.")
def main():
capReadThread()
if __name__ == "__main__":
main()