def resolve_command(self): """解析来自控制端口的数据 首先寻找指令起始标记,找不到就从 buffer 头删除一个字节,再继续寻找。 然后调用 resolve_command_from_begin() 从 buffer 的开头开始解析,直到遇到结尾标记为止。 """ if self.is_transparency and len(self.buffer) > 0: # 透传模式 command = b'send:' + bytes(self.buffer[:]) self.buffer.clear() log.info('control command: %s' % command) self.got_command_cb(command) while len(self.buffer) >= 4: # 解析指令 try: if self.is_in_command: # 指令从 buffer[0] 开始 command = self.resolve_command_from_begin() if self.is_in_command: # 没有遇到结尾,收到的指令还不完整 break elif command is not None: # 收到了指令 log.info('control command: %s' % command) self.got_command_cb(command) if command == b'%MODE1': # 透传模式 self.is_transparency = True break elif self.buffer[:4] == CMD_BEGIN: # begin of command self.is_in_command = True else: del self.buffer[0] # 出队一个字节 except Exception as e: log.warning('control thread resolve: %s' % e)
def update_rcv_time(name): """接收到 rtk 数据,更新时间戳 Args: name (str): rtk 服务名 """ try: # 此处可能不是很线程安全 if name in RtkStatus.rtk_last_rcv_time.keys(): RtkStatus.rtk_last_rcv_time[name] = get_time_string() RtkStatus.update_status(name, RtkStatus.S_RECEIVING) except Exception as e: log.warning('Failed when update rcv time: %s' % e)
def update_rcv_time(name): """接收到 rtk 数据,更新时间戳 Args: name (str): rtk 服务名 """ try: # 此处可能不是很线程安全 if name in RtkStatus.rtk_last_rcv_time.keys(): RtkStatus.rtk_last_rcv_time[name] = get_time_string() RtkStatus.update_status(name, RtkStatus.S_RECEIVING) except Exception as e: log.warning("Failed when update rcv time: %s" % e)
def update_status(name, status): """接收到 rtk 状态更新 Args: name (str): rtk 服务名 status (str): 服务当前状态, None 表示只 update_rcv_time """ if status is None: RtkStatus.update_rcv_time(name) else: try: if name in RtkStatus.rtk_status.keys(): if status == RtkStatus.S_CONNECTED: if RtkStatus.rtk_status[name] not in (RtkStatus.S_UNKNOWN, RtkStatus.S_DISCONNECTED): # 特殊处理 S_CONNECTED,如果已经有连接,就不更新状态 return RtkStatus.rtk_status[name] = status except Exception as e: log.warning('Failed when update status: %s' % e)
def update_status(name, status): """接收到 rtk 状态更新 Args: name (str): rtk 服务名 status (str): 服务当前状态, None 表示只 update_rcv_time """ if status is None: RtkStatus.update_rcv_time(name) else: try: if name in RtkStatus.rtk_status.keys(): if status == RtkStatus.S_CONNECTED: if RtkStatus.rtk_status[name] not in (RtkStatus.S_UNKNOWN, RtkStatus.S_DISCONNECTED): # 特殊处理 S_CONNECTED,如果已经有连接,就不更新状态 return RtkStatus.rtk_status[name] = status except Exception as e: log.warning("Failed when update status: %s" % e)