Files
Handcontrol_LYT_Version_Win…/cap_read.py
2024-12-10 16:19:49 +08:00

182 lines
6.6 KiB
Python

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
# 定义一个全局的队列,用于线程间通信
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(5):
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.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 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
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 += ','
_log1 += str(0)
_log1 += '\r\n'
#print(_log1)
if self.socketConnected == 1:
self.vofaClient.send(_log1.encode())
# 大于1个传感器连接需要设置接近采集序列
if connectedSensorCnt > 1 and (time.time() - self.syncTimer) > DEF_CDC_SYNC_MS:
self.syncTimer = time.time()
self.set_sensor_enable(connectedSensorChan)
if self.connectStatus == EnumCh341ConnectStatus.CH341_CONNECT_CHECK:
capReadTime = time.time()
difftime = int(capReadTime*1000-ms_capReadTime*1000)
print(f"diffTime={difftime}")
#定时器在任务完成后重新启动
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()
while True:
cap.ch341Connect()
time.sleep(DEF_PRO_CYC/1000)
def main():
capReadThread()
if __name__ == "__main__":
main()