feat: add animation handlers

This commit is contained in:
Eli Yip 2025-05-28 16:59:36 +08:00
parent d9d67c2b26
commit 58b6900f9f
No known key found for this signature in database
GPG Key ID: C98B69D4CF7D7EC5

197
api2/animation_handlers.go Normal file
View File

@ -0,0 +1,197 @@
package api2
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
// handleGetAnimations 获取可用动画列表
func (s *Server) handleGetAnimations(c *gin.Context) {
deviceId := c.Param("deviceId")
// 获取设备
dev, err := s.deviceManager.GetDevice(deviceId)
if err != nil {
c.JSON(http.StatusNotFound, ApiResponse{
Status: "error",
Error: fmt.Sprintf("设备 %s 不存在", deviceId),
})
return
}
// 获取动画引擎
animEngine := dev.GetAnimationEngine()
// 获取已注册的动画列表
availableAnimations := animEngine.GetRegisteredAnimations()
// 获取当前动画状态
isRunning := animEngine.IsRunning()
currentName := animEngine.GetCurrentAnimation()
response := AnimationStatusResponse{
IsRunning: isRunning,
CurrentName: currentName,
AvailableList: availableAnimations,
}
c.JSON(http.StatusOK, ApiResponse{
Status: "success",
Data: response,
})
}
// handleStartAnimation 启动动画
func (s *Server) handleStartAnimation(c *gin.Context) {
deviceId := c.Param("deviceId")
var req AnimationStartRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, ApiResponse{
Status: "error",
Error: "无效的动画请求:" + err.Error(),
})
return
}
// 获取设备
dev, err := s.deviceManager.GetDevice(deviceId)
if err != nil {
c.JSON(http.StatusNotFound, ApiResponse{
Status: "error",
Error: fmt.Sprintf("设备 %s 不存在", deviceId),
})
return
}
// 获取动画引擎
animEngine := dev.GetAnimationEngine()
// 验证动画名称是否已注册
availableAnimations := animEngine.GetRegisteredAnimations()
validAnimation := false
for _, name := range availableAnimations {
if name == req.Name {
validAnimation = true
break
}
}
if !validAnimation {
c.JSON(http.StatusBadRequest, ApiResponse{
Status: "error",
Error: fmt.Sprintf("无效的动画类型:%s可用动画%v", req.Name, availableAnimations),
})
return
}
// 处理速度参数
speedMs := req.SpeedMs
if speedMs <= 0 {
speedMs = 500 // 默认速度
}
// 启动动画
if err := animEngine.Start(req.Name, speedMs); err != nil {
c.JSON(http.StatusInternalServerError, ApiResponse{
Status: "error",
Error: fmt.Sprintf("启动动画失败:%v", err),
})
return
}
c.JSON(http.StatusOK, ApiResponse{
Status: "success",
Message: fmt.Sprintf("设备 %s 的 %s 动画已启动", deviceId, req.Name),
Data: map[string]any{
"deviceId": deviceId,
"name": req.Name,
"speedMs": speedMs,
},
})
}
// handleStopAnimation 停止动画
func (s *Server) handleStopAnimation(c *gin.Context) {
deviceId := c.Param("deviceId")
// 获取设备
dev, err := s.deviceManager.GetDevice(deviceId)
if err != nil {
c.JSON(http.StatusNotFound, ApiResponse{
Status: "error",
Error: fmt.Sprintf("设备 %s 不存在", deviceId),
})
return
}
// 获取动画引擎
animEngine := dev.GetAnimationEngine()
// 检查是否有动画在运行
if !animEngine.IsRunning() {
c.JSON(http.StatusOK, ApiResponse{
Status: "success",
Message: fmt.Sprintf("设备 %s 当前没有动画在运行", deviceId),
Data: map[string]any{
"deviceId": deviceId,
},
})
return
}
// 停止动画
if err := animEngine.Stop(); err != nil {
c.JSON(http.StatusInternalServerError, ApiResponse{
Status: "error",
Error: fmt.Sprintf("停止动画失败:%v", err),
})
return
}
c.JSON(http.StatusOK, ApiResponse{
Status: "success",
Message: fmt.Sprintf("设备 %s 的动画已停止", deviceId),
Data: map[string]any{
"deviceId": deviceId,
},
})
}
// handleAnimationStatus 获取动画状态
func (s *Server) handleAnimationStatus(c *gin.Context) {
deviceId := c.Param("deviceId")
// 获取设备
dev, err := s.deviceManager.GetDevice(deviceId)
if err != nil {
c.JSON(http.StatusNotFound, ApiResponse{
Status: "error",
Error: fmt.Sprintf("设备 %s 不存在", deviceId),
})
return
}
// 获取动画引擎
animEngine := dev.GetAnimationEngine()
// 获取已注册的动画列表
availableAnimations := animEngine.GetRegisteredAnimations()
// 获取当前状态
isRunning := animEngine.IsRunning()
currentName := animEngine.GetCurrentAnimation()
response := AnimationStatusResponse{
IsRunning: isRunning,
CurrentName: currentName,
AvailableList: availableAnimations,
}
c.JSON(http.StatusOK, ApiResponse{
Status: "success",
Data: response,
})
}