feat: add presets manager

This commit is contained in:
Eli Yip 2025-05-28 17:10:22 +08:00
parent a3958b79ec
commit ea1dfc4e0e
No known key found for this signature in database
GPG Key ID: C98B69D4CF7D7EC5
4 changed files with 177 additions and 0 deletions

View File

@ -21,6 +21,11 @@ type Device interface {
// --- 新增 ---
PoseExecutor // 嵌入 PoseExecutor 接口Device 需实现它
GetAnimationEngine() *AnimationEngine // 获取设备的动画引擎
// --- 预设姿势相关方法 ---
GetSupportedPresets() []string // 获取支持的预设姿势列表
ExecutePreset(presetName string) error // 执行预设姿势
GetPresetDescription(presetName string) string // 获取预设姿势描述
}
// Command 代表一个发送给设备的指令

View File

@ -24,6 +24,7 @@ type L10Hand struct {
mutex sync.RWMutex
canInterface string // CAN 接口名称,如 "can0"
animationEngine *device.AnimationEngine // 动画引擎
presetManager *device.PresetManager // 预设姿势管理器
}
// 在 base 基础上进行 ±delta 的扰动,范围限制在 [0, 255]
@ -91,6 +92,14 @@ func NewL10Hand(config map[string]any) (device.Device, error) {
hand.animationEngine.Register(NewL10WaveAnimation())
hand.animationEngine.Register(NewL10SwayAnimation())
// 初始化预设姿势管理器
hand.presetManager = device.NewPresetManager()
// 注册 L10 的预设姿势
for _, preset := range GetL10Presets() {
hand.presetManager.RegisterPreset(preset)
}
// 初始化组件
if err := hand.initializeComponents(config); err != nil {
return nil, fmt.Errorf("初始化组件失败:%w", err)
@ -333,3 +342,39 @@ func (h *L10Hand) Disconnect() error {
log.Printf("🔌 设备 %s 已断开", h.id)
return nil
}
// --- 预设姿势相关方法 ---
// GetSupportedPresets 获取支持的预设姿势列表
func (h *L10Hand) GetSupportedPresets() []string { return h.presetManager.GetSupportedPresets() }
// ExecutePreset 执行预设姿势
func (h *L10Hand) ExecutePreset(presetName string) error {
preset, exists := h.presetManager.GetPreset(presetName)
if !exists {
return fmt.Errorf("预设姿势 '%s' 不存在", presetName)
}
log.Printf("🎯 设备 %s (%s) 执行预设姿势: %s", h.id, h.GetHandType().String(), presetName)
// 执行手指姿态
if err := h.SetFingerPose(preset.FingerPose); err != nil {
return fmt.Errorf("执行预设姿势 '%s' 的手指姿态失败: %w", presetName, err)
}
// 如果有手掌姿态数据,也执行
if len(preset.PalmPose) > 0 {
time.Sleep(20 * time.Millisecond) // 短暂延时
if err := h.SetPalmPose(preset.PalmPose); err != nil {
return fmt.Errorf("执行预设姿势 '%s' 的手掌姿态失败: %w", presetName, err)
}
}
log.Printf("✅ 设备 %s 预设姿势 '%s' 执行完成", h.id, presetName)
return nil
}
// GetPresetDescription 获取预设姿势描述
func (h *L10Hand) GetPresetDescription(presetName string) string {
return h.presetManager.GetPresetDescription(presetName)
}

View File

@ -0,0 +1,82 @@
package models
import "hands/device"
// GetL10Presets 获取 L10 设备的所有预设姿势
func GetL10Presets() []device.PresetPose {
return []device.PresetPose{
// 基础姿势
{
Name: "fist",
Description: "握拳姿势",
FingerPose: []byte{64, 64, 64, 64, 64, 64},
},
{
Name: "open",
Description: "完全张开姿势",
FingerPose: []byte{192, 192, 192, 192, 192, 192},
},
{
Name: "pinch",
Description: "捏取姿势",
FingerPose: []byte{120, 120, 64, 64, 64, 64},
},
{
Name: "thumbsup",
Description: "竖起大拇指姿势",
FingerPose: []byte{64, 192, 192, 192, 192, 64},
},
{
Name: "point",
Description: "食指指点姿势",
FingerPose: []byte{192, 64, 192, 192, 192, 64},
},
// 数字手势
{
Name: "1",
Description: "数字 1 手势",
FingerPose: []byte{192, 64, 192, 192, 192, 64},
},
{
Name: "2",
Description: "数字 2 手势",
FingerPose: []byte{192, 64, 64, 192, 192, 64},
},
{
Name: "3",
Description: "数字 3 手势",
FingerPose: []byte{192, 64, 64, 64, 192, 64},
},
{
Name: "4",
Description: "数字 4 手势",
FingerPose: []byte{192, 64, 64, 64, 64, 64},
},
{
Name: "5",
Description: "数字 5 手势",
FingerPose: []byte{192, 192, 192, 192, 192, 192},
},
{
Name: "6",
Description: "数字 6 手势",
FingerPose: []byte{64, 192, 192, 192, 192, 64},
},
{
Name: "7",
Description: "数字 7 手势",
FingerPose: []byte{64, 64, 192, 192, 192, 64},
},
{
Name: "8",
Description: "数字 8 手势",
FingerPose: []byte{64, 64, 64, 192, 192, 64},
},
{
Name: "9",
Description: "数字 9 手势",
FingerPose: []byte{64, 64, 64, 64, 192, 64},
},
}
}

45
device/preset.go Normal file
View File

@ -0,0 +1,45 @@
package device
// PresetPose 定义预设姿势的结构
type PresetPose struct {
Name string // 姿势名称
Description string // 姿势描述
FingerPose []byte // 手指姿态数据
PalmPose []byte // 手掌姿态数据(可选)
}
// PresetManager 预设姿势管理器
type PresetManager struct{ presets map[string]PresetPose }
// NewPresetManager 创建新的预设姿势管理器
func NewPresetManager() *PresetManager {
return &PresetManager{
presets: make(map[string]PresetPose),
}
}
// RegisterPreset 注册一个预设姿势
func (pm *PresetManager) RegisterPreset(preset PresetPose) { pm.presets[preset.Name] = preset }
// GetPreset 获取指定名称的预设姿势
func (pm *PresetManager) GetPreset(name string) (PresetPose, bool) {
preset, exists := pm.presets[name]
return preset, exists
}
// GetSupportedPresets 获取所有支持的预设姿势名称列表
func (pm *PresetManager) GetSupportedPresets() []string {
presets := make([]string, 0, len(pm.presets))
for name := range pm.presets {
presets = append(presets, name)
}
return presets
}
// GetPresetDescription 获取预设姿势的描述
func (pm *PresetManager) GetPresetDescription(name string) string {
if preset, exists := pm.presets[name]; exists {
return preset.Description
}
return ""
}