|
|
@@ -7,10 +7,13 @@ from .BaseClass import BaseClass
|
|
|
from sockets import ConnectionManager
|
|
|
from collections import defaultdict
|
|
|
import threading
|
|
|
+import settings
|
|
|
+
|
|
|
|
|
|
# mcu命令
|
|
|
-class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
+class DeviceControl(BaseClass, metaclass=SingletonType):
|
|
|
lock = threading.Lock()
|
|
|
+
|
|
|
def __init__(self, websocket_manager: ConnectionManager):
|
|
|
super().__init__(websocket_manager)
|
|
|
self.msg_type = "mcu"
|
|
|
@@ -25,7 +28,7 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
self.last_from_mcu_move_respond_data = None
|
|
|
self.camera_motor_speed = 0
|
|
|
self.camera_motor_value = 0
|
|
|
-
|
|
|
+ self.init_state = False
|
|
|
self.port_name = ""
|
|
|
self.t_n = 0
|
|
|
self.serial_ins = None
|
|
|
@@ -99,7 +102,9 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
|
|
|
async def initDevice(self):
|
|
|
if not self.is_running:
|
|
|
- self.sendSocketMessage(code=1,msg="mcu设备未连接,请先连接设备")
|
|
|
+ self.sendSocketMessage(
|
|
|
+ code=1, msg="mcu设备未连接,请先连接设备", device_status=0
|
|
|
+ )
|
|
|
return False
|
|
|
self.serial_ins.clearn_flush()
|
|
|
self.to_init_device_origin_point(device_name="mcu")
|
|
|
@@ -124,7 +129,7 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
# {"_type": "show_info", "plugins_mode": "mcu", "data": "MCU 连接失败"}
|
|
|
# )
|
|
|
message = {"_type": "show_info", "plugins_mode": "mcu", "data": "MCU 连接失败"}
|
|
|
- self.sendSocketMessage(code=1, msg="MCU 连接失败", data=message)
|
|
|
+ self.sendSocketMessage(code=1, msg="MCU 连接失败", data=message,device_status=-1)
|
|
|
self.close_connect()
|
|
|
|
|
|
def stop_mcu(self):
|
|
|
@@ -139,7 +144,7 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
self.add_send_data_queue(buf)
|
|
|
|
|
|
def query_remote_control_battery(self):
|
|
|
- '''查询遥控器电量'''
|
|
|
+ """查询遥控器电量"""
|
|
|
buf = [self.command["query_remote_control_battery"]]
|
|
|
buf.extend(self.encapsulation_data(data=1, len_data=1))
|
|
|
buf.extend(self.encapsulation_data(data=1, len_data=1))
|
|
|
@@ -212,22 +217,27 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
def send_cmd(self):
|
|
|
self.lock.acquire()
|
|
|
if self.send_data_queue:
|
|
|
+ self.sendSocketMessage(msg="正在发送命令", device_status=1)
|
|
|
data = self.send_data_queue.pop(0)
|
|
|
self.serial_ins.write_cmd(data)
|
|
|
- else:
|
|
|
- self.t_n += 1
|
|
|
- # 加大发送获取基础数据的时间间隔
|
|
|
- # 默认为0.01秒一个循环,每隔1.5秒发送数据
|
|
|
- if self.t_n > 150:
|
|
|
- self.t_n = 0
|
|
|
- data = [self.command["get_all_info"], 1]
|
|
|
- self.serial_ins.write_cmd(data)
|
|
|
+ self.sendSocketMessage(msg="命令发送完成", device_status=2)
|
|
|
+ # else:
|
|
|
+ # self.t_n += 1
|
|
|
+ # # 加大发送获取基础数据的时间间隔
|
|
|
+ # # 默认为0.01秒一个循环,每隔1.5秒发送数据
|
|
|
+ # if self.t_n > 150:
|
|
|
+ # self.t_n = 0
|
|
|
+ # data = [self.command["get_all_info"], 1]
|
|
|
+ # self.serial_ins.write_cmd(data)
|
|
|
self.lock.release()
|
|
|
|
|
|
def print_mcu_error_data(self, receive_data):
|
|
|
# 扫码数据
|
|
|
try:
|
|
|
data = receive_data[1:].decode()
|
|
|
+ if "设备初始化完成" in data:
|
|
|
+ self.init_state = True
|
|
|
+ self.sendSocketMessage(msg=data, device_status=2)
|
|
|
print("115 print_mcu_error_data:", data)
|
|
|
except BaseException as e:
|
|
|
print("117 error {}".format(e))
|
|
|
@@ -250,7 +260,7 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
print("接收链接信息")
|
|
|
return
|
|
|
|
|
|
- def to_init_device_origin_point(self, device_name, is_force=True):
|
|
|
+ def to_init_device_origin_point(self, device_name, is_force=False):
|
|
|
device_id = self.device_name_dict[device_name]
|
|
|
cmd = 2
|
|
|
data = [cmd, device_id, 0 if is_force is False else 1]
|
|
|
@@ -311,6 +321,7 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
# )
|
|
|
message = {"_type": "mcu_button", "plugins_mode": "mcu", "data": "todo_3"}
|
|
|
self.sendSocketMessage(code=0, msg="", data=message)
|
|
|
+
|
|
|
# 获取偏移量信息
|
|
|
def get_from_mcu_deviation_info(self, receive_data):
|
|
|
if len(receive_data) == 18:
|
|
|
@@ -390,6 +401,7 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
self.sendSocketMessage(msg="接收偏移量信息", data=message)
|
|
|
print("接收偏移量信息")
|
|
|
return
|
|
|
+
|
|
|
# 获取其他信息
|
|
|
def get_from_mcu_other_info(self, receive_data):
|
|
|
is_auto_send_base_info = self.get_data_from_receive_data(
|
|
|
@@ -556,6 +568,9 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
"state_move_turntable_steering": self.state_move_turntable_steering,
|
|
|
},
|
|
|
}
|
|
|
+ # if self.state_camera_motor
|
|
|
+ if all(value == 2 for value in [self.state_camera_motor, self.state_camera_steering, self.state_turntable_steering, self.state_overturn_steering]):
|
|
|
+ self.init_state = True
|
|
|
self.sendSocketMessage(msg="获取mcu设备运行状态信息", data=message)
|
|
|
# 检查是否成功初始化
|
|
|
if self.is_just_init_time is False:
|
|
|
@@ -596,6 +611,7 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
if len(ports_dict) <= 0:
|
|
|
return {}
|
|
|
return ports_dict
|
|
|
+
|
|
|
def remove_port(self, port_name):
|
|
|
"""移除串口"""
|
|
|
print("remove", port_name)
|
|
|
@@ -616,8 +632,9 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
"plugins_mode": "auto_select_com",
|
|
|
"data": {"text": "开始识别接口:{}".format(port_name)},
|
|
|
}
|
|
|
-
|
|
|
- self.sendSocketMessage(msg="开始识别接口:{}".format(port_name), data=message_data)
|
|
|
+ self.sendSocketMessage(
|
|
|
+ msg="开始识别接口:{}".format(port_name), data=message_data, device_status=1
|
|
|
+ )
|
|
|
time.sleep(1)
|
|
|
"""
|
|
|
步骤:
|
|
|
@@ -636,6 +653,7 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
1,
|
|
|
msg="串口:{} 被占用,或无法识别".format(port_name).format(port_name),
|
|
|
data=message_data,
|
|
|
+ device_status=3,
|
|
|
)
|
|
|
print("串口:{} 被占用".format(port_name))
|
|
|
return
|
|
|
@@ -691,8 +709,7 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
"data": {"text": "MCU开始连接"},
|
|
|
}
|
|
|
self.sendSocketMessage(
|
|
|
- msg="MCU开始连接",
|
|
|
- data=message_data,
|
|
|
+ msg="MCU开始连接", data=message_data, device_status=1
|
|
|
)
|
|
|
self.connected_ports_dict[port_name] = "MCU"
|
|
|
message_data = {
|
|
|
@@ -704,8 +721,7 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
},
|
|
|
}
|
|
|
self.sendSocketMessage(
|
|
|
- msg="MCU连接成功",
|
|
|
- data=message_data,
|
|
|
+ msg="MCU连接成功", data=message_data, device_status=2
|
|
|
)
|
|
|
else:
|
|
|
print("串口无法识别")
|
|
|
@@ -725,38 +741,37 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
try:
|
|
|
self.serial_ins = SerialIns(port_name=port_name, baud=115200, timeout=0.1)
|
|
|
if not self.serial_ins.serial_handle:
|
|
|
- message_data= {
|
|
|
- "_type": "show_info",
|
|
|
- "plugins_mode": "mcu",
|
|
|
- "data": "MCU 打开串口失败",
|
|
|
- }
|
|
|
+ message_data = {
|
|
|
+ "_type": "show_info",
|
|
|
+ "plugins_mode": "mcu",
|
|
|
+ "data": "MCU 打开串口失败",
|
|
|
+ }
|
|
|
self.sendSocketMessage(
|
|
|
- msg="MCU 打开串口失败",
|
|
|
- data=message_data,
|
|
|
+ msg="MCU 打开串口失败", data=message_data, device_status=-1
|
|
|
)
|
|
|
self.serial_ins = None
|
|
|
self.connect_state = False
|
|
|
return False
|
|
|
|
|
|
except:
|
|
|
- message_data={
|
|
|
+ message_data = {
|
|
|
"_type": "show_info",
|
|
|
"plugins_mode": "mcu",
|
|
|
"data": "MCU 打开串口失败",
|
|
|
}
|
|
|
self.sendSocketMessage(
|
|
|
- msg="MCU 打开串口失败",
|
|
|
- data=message_data,
|
|
|
+ msg="MCU 打开串口失败", data=message_data, device_status=-1
|
|
|
)
|
|
|
self.serial_ins = None
|
|
|
self.connect_state = False
|
|
|
return False
|
|
|
|
|
|
- message_data={"_type": "show_info", "plugins_mode": "mcu", "data": "MCU 开始连接"}
|
|
|
- self.sendSocketMessage(
|
|
|
- msg="MCU 开始连接",
|
|
|
- data=message_data,
|
|
|
- )
|
|
|
+ message_data = {
|
|
|
+ "_type": "show_info",
|
|
|
+ "plugins_mode": "mcu",
|
|
|
+ "data": "MCU 开始连接",
|
|
|
+ }
|
|
|
+ self.sendSocketMessage(msg="MCU 开始连接", data=message_data, device_status=1)
|
|
|
# =======================发送连接请求=================================
|
|
|
cmd = 90
|
|
|
data = [cmd, 1]
|
|
|
@@ -790,8 +805,7 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
"data": "MCU 已连接",
|
|
|
}
|
|
|
self.sendSocketMessage(
|
|
|
- msg="MCU 已连接",
|
|
|
- data=message_data,
|
|
|
+ msg="MCU 已连接", data=message_data, device_status=1
|
|
|
)
|
|
|
self.connect_state = True
|
|
|
self.is_running = True
|
|
|
@@ -805,10 +819,7 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
"plugins_mode": "mcu",
|
|
|
"data": "MCU 连接失败",
|
|
|
}
|
|
|
- self.sendSocketMessage(
|
|
|
- msg="MCU 连接失败",
|
|
|
- data=message_data,
|
|
|
- )
|
|
|
+ self.sendSocketMessage(msg="MCU 连接失败", data=message_data, device_status=-1)
|
|
|
self.close_connect()
|
|
|
|
|
|
def close_connect(self):
|
|
|
@@ -820,6 +831,7 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
self.connected_ports_dict = {} # 已连接的ports
|
|
|
self.p_list = []
|
|
|
self.temp_ports_dict = {}
|
|
|
+ self.init_state = False
|
|
|
print("关闭MCU")
|
|
|
|
|
|
@property
|
|
|
@@ -849,6 +861,204 @@ class DeviceControl(BaseClass,metaclass=SingletonType):
|
|
|
# self._mcu_move_state = 2
|
|
|
return self._mcu_move_state
|
|
|
|
|
|
+ def to_deal_device(self, device_name, value=1, _type=0, times=1, delay=0):
|
|
|
+ """
|
|
|
+ value 激光0关 1开
|
|
|
+ mp3_player value 表示0表示关,1表示开,_type 表示歌曲切换到指定歌曲
|
|
|
+ delay:延迟处理,单位为0.1秒,即delay=100时,表示延迟10秒
|
|
|
+ """
|
|
|
+ device_id = self.device_name_dict[device_name]
|
|
|
+ if device_name == "buzzer":
|
|
|
+ value = int(value)
|
|
|
+
|
|
|
+ cmd = 3
|
|
|
+ data = [
|
|
|
+ cmd,
|
|
|
+ device_id,
|
|
|
+ value,
|
|
|
+ _type,
|
|
|
+ times,
|
|
|
+ delay,
|
|
|
+ ]
|
|
|
+
|
|
|
+ self.add_send_data_queue(data)
|
|
|
+ # if self.serial_ins:
|
|
|
+ # self.serial_ins.write_cmd(data)
|
|
|
+ return True
|
|
|
+
|
|
|
+ def to_device_move(
|
|
|
+ self,
|
|
|
+ device_name,
|
|
|
+ value=0,
|
|
|
+ max_speed=None,
|
|
|
+ up_speed=None,
|
|
|
+ down_speed=None,
|
|
|
+ _is_debug=0,
|
|
|
+ is_relative=0,
|
|
|
+ is_deviation=1,
|
|
|
+ ):
|
|
|
+ """
|
|
|
+ 此处输入单位为 毫米,以及度 需要先缩小,再放大
|
|
|
+ """
|
|
|
+
|
|
|
+ speed = settings.moveSpeed()
|
|
|
+
|
|
|
+ cmd = 1
|
|
|
+ device_id = self.device_name_dict[device_name]
|
|
|
+ match device_name:
|
|
|
+ case "camera_high_motor":
|
|
|
+ # value 单位毫米
|
|
|
+ # max_speed = 10000 if max_speed is None else max_speed
|
|
|
+ # up_speed = 800 if up_speed is None else up_speed
|
|
|
+ # down_speed = 700 if down_speed is None else down_speed
|
|
|
+
|
|
|
+ max_speed = (
|
|
|
+ speed[device_name]["max_speed"] if max_speed is None else max_speed
|
|
|
+ )
|
|
|
+ up_speed = (
|
|
|
+ speed[device_name]["up_speed"] if up_speed is None else up_speed
|
|
|
+ )
|
|
|
+ down_speed = (
|
|
|
+ speed[device_name]["down_speed"]
|
|
|
+ if down_speed is None
|
|
|
+ else down_speed
|
|
|
+ )
|
|
|
+
|
|
|
+ value = value / 10 # value 单位毫米
|
|
|
+ assert 0 <= value <= 40
|
|
|
+ assert 0 <= max_speed <= 10000
|
|
|
+ case "camera_steering":
|
|
|
+ # 角度为度 未放大 精确到0.1度
|
|
|
+ max_speed = 6000 if max_speed is None else max_speed
|
|
|
+ up_speed = 500 if up_speed is None else up_speed
|
|
|
+ down_speed = 500 if down_speed is None else down_speed
|
|
|
+ assert -360 <= value <= 360
|
|
|
+ case "turntable_steering":
|
|
|
+ # 角度为度 未放大 精确到0.1度
|
|
|
+ # max_speed = 6000 if max_speed is None else max_speed
|
|
|
+ # up_speed = 500 if up_speed is None else up_speed
|
|
|
+ # down_speed = 400 if down_speed is None else down_speed
|
|
|
+ max_speed = (
|
|
|
+ speed[device_name]["max_speed"] if max_speed is None else max_speed
|
|
|
+ )
|
|
|
+ up_speed = (
|
|
|
+ speed[device_name]["up_speed"] if up_speed is None else up_speed
|
|
|
+ )
|
|
|
+ down_speed = (
|
|
|
+ speed[device_name]["down_speed"]
|
|
|
+ if down_speed is None
|
|
|
+ else down_speed
|
|
|
+ )
|
|
|
+
|
|
|
+ assert -720 <= value <= 720
|
|
|
+
|
|
|
+ case "overturn_steering":
|
|
|
+ # 角度为度 未放大 精确到0.1度
|
|
|
+ max_speed = 2 if max_speed is None else max_speed
|
|
|
+ up_speed = 1 if up_speed is None else up_speed
|
|
|
+ down_speed = 1 if down_speed is None else down_speed
|
|
|
+ assert 0 <= value <= 360
|
|
|
+
|
|
|
+ case "turntable_position_motor":
|
|
|
+ # value 单位毫米
|
|
|
+ max_speed = 11000 if max_speed is None else max_speed
|
|
|
+ up_speed = 900 if up_speed is None else up_speed
|
|
|
+ down_speed = 900 if down_speed is None else down_speed
|
|
|
+ value = value / 10 # value 单位毫米
|
|
|
+ assert 0 <= value <= 900
|
|
|
+ assert 0 <= max_speed <= 15000
|
|
|
+
|
|
|
+ _dir = True if value >= 0 else False
|
|
|
+
|
|
|
+ value = int(abs(value * 10)) # 此处value赋值后,单位为mm以及0.1度
|
|
|
+ print("准备执行",device_name, value)
|
|
|
+ data = [
|
|
|
+ cmd,
|
|
|
+ device_id,
|
|
|
+ 1 if _dir else 0,
|
|
|
+ 0xFF & value >> 8,
|
|
|
+ 0xFF & value,
|
|
|
+ 0xFF & max_speed >> 8,
|
|
|
+ 0xFF & max_speed,
|
|
|
+ 0xFF & up_speed >> 8,
|
|
|
+ 0xFF & up_speed,
|
|
|
+ 0xFF & down_speed >> 8,
|
|
|
+ 0xFF & down_speed,
|
|
|
+ _is_debug,
|
|
|
+ is_deviation,
|
|
|
+ is_relative,
|
|
|
+ ]
|
|
|
+ self.add_send_data_queue(data)
|
|
|
+
|
|
|
+ def controlDevice(self, device_name, value):
|
|
|
+ '''控制设备移动等'''
|
|
|
+ if not self.is_running:
|
|
|
+ self.sendSocketMessage(
|
|
|
+ code=1, msg="mcu设备未连接,请先连接设备", device_status=0
|
|
|
+ )
|
|
|
+ return False
|
|
|
+ if not self.init_state:
|
|
|
+ self.sendSocketMessage(
|
|
|
+ code=1, msg="mcu设备未初始化", device_status=4
|
|
|
+ )
|
|
|
+ return False
|
|
|
+ _is_debug = 1
|
|
|
+ match device_name:
|
|
|
+ case "camera_high_motor":
|
|
|
+ # 相机电机
|
|
|
+ print(device_name, value)
|
|
|
+ self.to_device_move(
|
|
|
+ device_name=device_name,
|
|
|
+ value=value,
|
|
|
+ max_speed=1400,
|
|
|
+ up_speed=400,
|
|
|
+ down_speed=100,
|
|
|
+ _is_debug=_is_debug,
|
|
|
+ is_deviation=0,
|
|
|
+ )
|
|
|
+ case "camera_steering":
|
|
|
+ print(device_name, value)
|
|
|
+ # 相机舵机
|
|
|
+ self.to_device_move(
|
|
|
+ device_name=device_name,
|
|
|
+ value=value,
|
|
|
+ _is_debug=_is_debug,
|
|
|
+ is_deviation=0,
|
|
|
+ )
|
|
|
+ case "turntable_steering":
|
|
|
+ # 转盘舵机
|
|
|
+ self.to_device_move(
|
|
|
+ device_name=device_name,
|
|
|
+ value=value,
|
|
|
+ _is_debug=_is_debug,
|
|
|
+ is_deviation=0,
|
|
|
+ )
|
|
|
+ case "turntable_position_motor":
|
|
|
+ # 转盘舵机
|
|
|
+ self.to_device_move(
|
|
|
+ device_name=device_name,
|
|
|
+ value=value,
|
|
|
+ max_speed=1400,
|
|
|
+ up_speed=400,
|
|
|
+ down_speed=100,
|
|
|
+ _is_debug=_is_debug,
|
|
|
+ is_deviation=0,
|
|
|
+ )
|
|
|
+ case "overturn_steering":
|
|
|
+ # 翻板舵机中位
|
|
|
+ self.to_device_move(
|
|
|
+ device_name="overturn_steering",
|
|
|
+ value=value,
|
|
|
+ _is_debug=_is_debug,
|
|
|
+ is_deviation=0,
|
|
|
+ )
|
|
|
+ case "to_deal_device":
|
|
|
+ self.to_deal_device(device_name, value=value, _type=0, times=1)
|
|
|
+ case _:
|
|
|
+ pass
|
|
|
+ # case "photograph":
|
|
|
+ # self.photograph(goods_art_no=None)
|
|
|
+
|
|
|
|
|
|
async def checkMcuConnection(device_ctrl: DeviceControl):
|
|
|
if device_ctrl.is_running == True:
|
|
|
@@ -857,6 +1067,7 @@ async def checkMcuConnection(device_ctrl: DeviceControl):
|
|
|
"plugins_mode": "auto_select_com",
|
|
|
"data": device_ctrl.temp_ports_dict,
|
|
|
}
|
|
|
+ device_ctrl.device_status = 2
|
|
|
device_ctrl.sendSocketMessage(code=0, msg="MCU连接成功", data=message)
|
|
|
return
|
|
|
"""实时检测串口是否连接"""
|
|
|
@@ -870,7 +1081,7 @@ async def checkMcuConnection(device_ctrl: DeviceControl):
|
|
|
_p = device_ctrl.p_list.pop()
|
|
|
device_ctrl.remove_port(_p)
|
|
|
print("串口未连接,请检查")
|
|
|
- device_ctrl.sendSocketMessage(code=1, msg="串口未连接,请检查")
|
|
|
+ device_ctrl.sendSocketMessage(code=1, msg="串口未连接,请检查",device_status=-1)
|
|
|
continue
|
|
|
if ports_dict:
|
|
|
for index, _i in enumerate(device_ctrl.p_list):
|