2026-01-20 18:40:54 +08:00
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
"""
|
|
|
|
|
|
射箭ID生成器
|
|
|
|
|
|
为每次射箭生成唯一ID,格式:{timestamp_ms}_{counter}
|
|
|
|
|
|
"""
|
|
|
|
|
|
from maix import time
|
|
|
|
|
|
import threading
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ShotIDGenerator:
|
|
|
|
|
|
"""射箭ID生成器(单例)"""
|
|
|
|
|
|
_instance = None
|
|
|
|
|
|
_lock = threading.Lock()
|
|
|
|
|
|
|
|
|
|
|
|
def __new__(cls):
|
|
|
|
|
|
if cls._instance is None:
|
|
|
|
|
|
with cls._lock:
|
|
|
|
|
|
if cls._instance is None:
|
|
|
|
|
|
cls._instance = super(ShotIDGenerator, cls).__new__(cls)
|
|
|
|
|
|
cls._instance._initialized = False
|
|
|
|
|
|
return cls._instance
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
|
if self._initialized:
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
self._counter = 0
|
|
|
|
|
|
self._last_timestamp_ms = 0
|
|
|
|
|
|
self._lock = threading.Lock()
|
|
|
|
|
|
|
|
|
|
|
|
self._initialized = True
|
|
|
|
|
|
|
|
|
|
|
|
def generate_id(self, device_id=None):
|
|
|
|
|
|
"""
|
|
|
|
|
|
生成唯一的射箭ID
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
device_id: 可选的设备ID,如果提供则包含在ID中(格式:{device_id}_{timestamp_ms}_{counter})
|
|
|
|
|
|
如果不提供,则使用简单格式(格式:{timestamp_ms}_{counter})
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
str: 唯一的射箭ID
|
|
|
|
|
|
"""
|
|
|
|
|
|
with self._lock:
|
|
|
|
|
|
current_timestamp_ms = time.ticks_ms()
|
|
|
|
|
|
|
|
|
|
|
|
# 如果时间戳相同,增加计数器;否则重置计数器
|
|
|
|
|
|
if current_timestamp_ms == self._last_timestamp_ms:
|
|
|
|
|
|
self._counter += 1
|
|
|
|
|
|
else:
|
|
|
|
|
|
self._counter = 0
|
|
|
|
|
|
self._last_timestamp_ms = current_timestamp_ms
|
|
|
|
|
|
|
|
|
|
|
|
# 生成ID
|
|
|
|
|
|
if device_id:
|
|
|
|
|
|
shot_id = f"{device_id}_{current_timestamp_ms}_{self._counter}"
|
|
|
|
|
|
else:
|
|
|
|
|
|
shot_id = f"{current_timestamp_ms}_{self._counter}"
|
|
|
|
|
|
|
|
|
|
|
|
return shot_id
|
|
|
|
|
|
|
|
|
|
|
|
def reset(self):
|
|
|
|
|
|
"""重置计数器(通常不需要调用)"""
|
|
|
|
|
|
with self._lock:
|
|
|
|
|
|
self._counter = 0
|
|
|
|
|
|
self._last_timestamp_ms = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 创建全局单例实例
|
|
|
|
|
|
shot_id_generator = ShotIDGenerator()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|