333 lines
8.6 KiB
Go
333 lines
8.6 KiB
Go
package legacy
|
||
|
||
import (
|
||
"fmt"
|
||
"net/http"
|
||
"time"
|
||
|
||
"hands/config"
|
||
"hands/define"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// handleHealth 健康检查处理函数
|
||
func (s *LegacyServer) handleHealth(c *gin.Context) {
|
||
c.JSON(http.StatusOK, define.ApiResponse{
|
||
Status: "success",
|
||
Message: "CAN Control Service is running",
|
||
Data: map[string]any{
|
||
"timestamp": time.Now(),
|
||
"availableInterfaces": config.Config.AvailableInterfaces,
|
||
"defaultInterface": config.Config.DefaultInterface,
|
||
"serviceVersion": "1.0.0-hand-type-support",
|
||
},
|
||
})
|
||
}
|
||
|
||
// handleInterfaces 获取可用接口列表处理函数
|
||
func (s *LegacyServer) handleInterfaces(c *gin.Context) {
|
||
responseData := map[string]any{
|
||
"availableInterfaces": config.Config.AvailableInterfaces,
|
||
"defaultInterface": config.Config.DefaultInterface,
|
||
}
|
||
|
||
c.JSON(http.StatusOK, define.ApiResponse{
|
||
Status: "success",
|
||
Data: responseData,
|
||
})
|
||
}
|
||
|
||
// handleHandConfigs 获取手型配置处理函数
|
||
func (s *LegacyServer) handleHandConfigs(c *gin.Context) {
|
||
allHandConfigs := s.mapper.GetAllHandConfigs()
|
||
|
||
result := make(map[string]any)
|
||
for _, ifName := range config.Config.AvailableInterfaces {
|
||
if handConfig, exists := allHandConfigs[ifName]; exists {
|
||
result[ifName] = map[string]any{
|
||
"handType": handConfig.HandType,
|
||
"handId": handConfig.HandId,
|
||
}
|
||
} else {
|
||
// 返回默认配置
|
||
result[ifName] = map[string]any{
|
||
"handType": "right",
|
||
"handId": define.HAND_TYPE_RIGHT,
|
||
}
|
||
}
|
||
}
|
||
|
||
c.JSON(http.StatusOK, define.ApiResponse{
|
||
Status: "success",
|
||
Data: result,
|
||
})
|
||
}
|
||
|
||
// handleHandType 手型设置处理函数
|
||
func (s *LegacyServer) handleHandType(c *gin.Context) {
|
||
var req HandTypeRequest
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
c.JSON(http.StatusBadRequest, define.ApiResponse{
|
||
Status: "error",
|
||
Error: "无效的手型设置请求:" + err.Error(),
|
||
})
|
||
return
|
||
}
|
||
|
||
// 验证接口
|
||
if !s.mapper.IsValidInterface(req.Interface) {
|
||
c.JSON(http.StatusBadRequest, define.ApiResponse{
|
||
Status: "error",
|
||
Error: fmt.Sprintf("无效的接口 %s,可用接口: %v", req.Interface, config.Config.AvailableInterfaces),
|
||
})
|
||
return
|
||
}
|
||
|
||
// 验证手型 ID
|
||
if req.HandType == "left" && req.HandId != uint32(define.HAND_TYPE_LEFT) {
|
||
req.HandId = uint32(define.HAND_TYPE_LEFT)
|
||
} else if req.HandType == "right" && req.HandId != uint32(define.HAND_TYPE_RIGHT) {
|
||
req.HandId = uint32(define.HAND_TYPE_RIGHT)
|
||
}
|
||
|
||
// 设置手型配置
|
||
if err := s.mapper.SetHandConfig(req.Interface, req.HandType, req.HandId); err != nil {
|
||
c.JSON(http.StatusInternalServerError, define.ApiResponse{
|
||
Status: "error",
|
||
Error: "设置手型失败:" + err.Error(),
|
||
})
|
||
return
|
||
}
|
||
|
||
handTypeName := "右手"
|
||
if req.HandType == "left" {
|
||
handTypeName = "左手"
|
||
}
|
||
|
||
c.JSON(http.StatusOK, define.ApiResponse{
|
||
Status: "success",
|
||
Message: fmt.Sprintf("接口 %s 手型已设置为%s (0x%X)", req.Interface, handTypeName, req.HandId),
|
||
Data: map[string]any{
|
||
"interface": req.Interface,
|
||
"handType": req.HandType,
|
||
"handId": req.HandId,
|
||
},
|
||
})
|
||
}
|
||
|
||
// handleFingers 手指姿态处理函数
|
||
func (s *LegacyServer) handleFingers(c *gin.Context) {
|
||
var req FingerPoseRequest
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
c.JSON(http.StatusBadRequest, define.ApiResponse{
|
||
Status: "error",
|
||
Error: "无效的手指姿态数据:" + err.Error(),
|
||
})
|
||
return
|
||
}
|
||
|
||
// 验证每个值是否在范围内
|
||
for _, v := range req.Pose {
|
||
if v < 0 || v > 255 {
|
||
c.JSON(http.StatusBadRequest, define.ApiResponse{
|
||
Status: "error",
|
||
Error: "手指姿态值必须在 0-255 范围内",
|
||
})
|
||
return
|
||
}
|
||
}
|
||
|
||
// 如果未指定接口,使用默认接口
|
||
if req.Interface == "" {
|
||
req.Interface = config.Config.DefaultInterface
|
||
}
|
||
|
||
// 验证接口
|
||
if !s.mapper.IsValidInterface(req.Interface) {
|
||
c.JSON(http.StatusBadRequest, define.ApiResponse{
|
||
Status: "error",
|
||
Error: fmt.Sprintf("无效的接口 %s,可用接口: %v", req.Interface, config.Config.AvailableInterfaces),
|
||
})
|
||
return
|
||
}
|
||
|
||
// 获取对应的设备
|
||
dev, err := s.mapper.GetDeviceForInterface(req.Interface)
|
||
if err != nil {
|
||
c.JSON(http.StatusInternalServerError, define.ApiResponse{
|
||
Status: "error",
|
||
Error: "获取设备失败:" + err.Error(),
|
||
})
|
||
return
|
||
}
|
||
|
||
// 停止当前动画
|
||
if err := s.mapper.StopAllAnimations(req.Interface); err != nil {
|
||
c.JSON(http.StatusInternalServerError, define.ApiResponse{
|
||
Status: "error",
|
||
Error: "停止动画失败:" + err.Error(),
|
||
})
|
||
return
|
||
}
|
||
|
||
// 设置手指姿态
|
||
if err := dev.SetFingerPose(req.Pose); err != nil {
|
||
c.JSON(http.StatusInternalServerError, define.ApiResponse{
|
||
Status: "error",
|
||
Error: "发送手指姿态失败:" + err.Error(),
|
||
})
|
||
return
|
||
}
|
||
|
||
c.JSON(http.StatusOK, define.ApiResponse{
|
||
Status: "success",
|
||
Message: "手指姿态指令发送成功",
|
||
Data: map[string]any{"interface": req.Interface, "pose": req.Pose},
|
||
})
|
||
}
|
||
|
||
// handlePalm 掌部姿态处理函数
|
||
func (s *LegacyServer) handlePalm(c *gin.Context) {
|
||
var req PalmPoseRequest
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
c.JSON(http.StatusBadRequest, define.ApiResponse{
|
||
Status: "error",
|
||
Error: "无效的掌部姿态数据:" + err.Error(),
|
||
})
|
||
return
|
||
}
|
||
|
||
// 验证每个值是否在范围内
|
||
for _, v := range req.Pose {
|
||
if v < 0 || v > 255 {
|
||
c.JSON(http.StatusBadRequest, define.ApiResponse{
|
||
Status: "error",
|
||
Error: "掌部姿态值必须在 0-255 范围内",
|
||
})
|
||
return
|
||
}
|
||
}
|
||
|
||
// 如果未指定接口,使用默认接口
|
||
if req.Interface == "" {
|
||
req.Interface = config.Config.DefaultInterface
|
||
}
|
||
|
||
// 验证接口
|
||
if !s.mapper.IsValidInterface(req.Interface) {
|
||
c.JSON(http.StatusBadRequest, define.ApiResponse{
|
||
Status: "error",
|
||
Error: fmt.Sprintf("无效的接口 %s,可用接口: %v", req.Interface, config.Config.AvailableInterfaces),
|
||
})
|
||
return
|
||
}
|
||
|
||
// 获取对应的设备
|
||
dev, err := s.mapper.GetDeviceForInterface(req.Interface)
|
||
if err != nil {
|
||
c.JSON(http.StatusInternalServerError, define.ApiResponse{
|
||
Status: "error",
|
||
Error: "获取设备失败:" + err.Error(),
|
||
})
|
||
return
|
||
}
|
||
|
||
// 停止当前动画
|
||
if err := s.mapper.StopAllAnimations(req.Interface); err != nil {
|
||
c.JSON(http.StatusInternalServerError, define.ApiResponse{
|
||
Status: "error",
|
||
Error: "停止动画失败:" + err.Error(),
|
||
})
|
||
return
|
||
}
|
||
|
||
// 设置掌部姿态
|
||
if err := dev.SetPalmPose(req.Pose); err != nil {
|
||
c.JSON(http.StatusInternalServerError, define.ApiResponse{
|
||
Status: "error",
|
||
Error: "发送掌部姿态失败:" + err.Error(),
|
||
})
|
||
return
|
||
}
|
||
|
||
c.JSON(http.StatusOK, define.ApiResponse{
|
||
Status: "success",
|
||
Message: "掌部姿态指令发送成功",
|
||
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},
|
||
})
|
||
}
|