From 98fa37952d810d071dd2763d7d2e95b62d6a9535 Mon Sep 17 00:00:00 2001 From: Eli Yip Date: Tue, 3 Jun 2025 09:58:13 +0800 Subject: [PATCH] feat(legacy): implement preset handler --- api/legacy/handlers.go | 73 ++++++++++++++++++++++++++++++++++++++++++ device/device.go | 7 ++-- device/models/l10.go | 5 +++ docs/contribute_CN.md | 1 + 4 files changed, 83 insertions(+), 3 deletions(-) diff --git a/api/legacy/handlers.go b/api/legacy/handlers.go index 5075e6f..269d383 100644 --- a/api/legacy/handlers.go +++ b/api/legacy/handlers.go @@ -257,3 +257,76 @@ func (s *LegacyServer) handlePalm(c *gin.Context) { Data: map[string]any{"interface": req.Interface, "pose": req.Pose}, }) } + +// handlePreset 预设姿势处理函数 +func (s *LegacyServer) handlePreset(c *gin.Context) { + pose := c.Param("pose") + + // 从查询参数获取接口名称和手型 + ifName := c.Query("interface") + // handType := c.Query("handType") // TODO: 旧版 API 中声明但未使用,先放着,等 reivew 时候看看 + + if ifName == "" { + ifName = config.Config.DefaultInterface + } + + // 验证接口 + if !s.mapper.IsValidInterface(ifName) { + c.JSON(http.StatusBadRequest, define.ApiResponse{ + Status: "error", + Error: fmt.Sprintf("无效的接口 %s,可用接口: %v", ifName, config.Config.AvailableInterfaces), + }) + return + } + + // 获取对应的设备 + dev, err := s.mapper.GetDeviceForInterface(ifName) + if err != nil { + c.JSON(http.StatusInternalServerError, define.ApiResponse{ + Status: "error", + Error: "获取设备失败:" + err.Error(), + }) + return + } + + // 停止当前动画 + if err := s.mapper.StopAllAnimations(ifName); err != nil { + c.JSON(http.StatusInternalServerError, define.ApiResponse{ + Status: "error", + Error: "停止动画失败:" + err.Error(), + }) + return + } + + // 获取预设姿势详细信息(用于返回具体参数) + presetDetails, exists := dev.GetPresetDetails(pose) + if !exists { + c.JSON(http.StatusBadRequest, define.ApiResponse{ + Status: "error", + Error: "无效的预设姿势", + }) + return + } + + // 使用设备的预设姿势方法 + if err := dev.ExecutePreset(pose); err != nil { + c.JSON(http.StatusBadRequest, define.ApiResponse{ + Status: "error", + Error: "无效的预设姿势", + }) + return + } + + // 获取预设姿势的描述 + description := dev.GetPresetDescription(pose) + message := fmt.Sprintf("已设置预设姿势: %s", pose) + if description != "" { + message = fmt.Sprintf("已设置%s", description) + } + + c.JSON(http.StatusOK, define.ApiResponse{ + Status: "success", + Message: message, + Data: map[string]any{"interface": ifName, "pose": presetDetails.FingerPose}, + }) +} diff --git a/device/device.go b/device/device.go index 2f9d54f..a8e2f05 100644 --- a/device/device.go +++ b/device/device.go @@ -23,9 +23,10 @@ type Device interface { GetAnimationEngine() *AnimationEngine // 获取设备的动画引擎 // --- 预设姿势相关方法 --- - GetSupportedPresets() []string // 获取支持的预设姿势列表 - ExecutePreset(presetName string) error // 执行预设姿势 - GetPresetDescription(presetName string) string // 获取预设姿势描述 + GetSupportedPresets() []string // 获取支持的预设姿势列表 + ExecutePreset(presetName string) error // 执行预设姿势 + GetPresetDescription(presetName string) string // 获取预设姿势描述 + GetPresetDetails(presetName string) (PresetPose, bool) // 获取预设姿势详细信息 } // Command 代表一个发送给设备的指令 diff --git a/device/models/l10.go b/device/models/l10.go index 221853e..558b23f 100644 --- a/device/models/l10.go +++ b/device/models/l10.go @@ -378,3 +378,8 @@ func (h *L10Hand) ExecutePreset(presetName string) error { func (h *L10Hand) GetPresetDescription(presetName string) string { return h.presetManager.GetPresetDescription(presetName) } + +// GetPresetDetails 获取预设姿势详细信息 +func (h *L10Hand) GetPresetDetails(presetName string) (device.PresetPose, bool) { + return h.presetManager.GetPreset(presetName) +} diff --git a/docs/contribute_CN.md b/docs/contribute_CN.md index 2eeb08f..6a7d339 100644 --- a/docs/contribute_CN.md +++ b/docs/contribute_CN.md @@ -27,6 +27,7 @@ type Device interface { GetSupportedPresets() []string ExecutePreset(presetName string) error GetPresetDescription(presetName string) string + GetPresetDetails(presetName string) (PresetPose, bool) } ```