2025-05-28 17:16:59 +08:00

184 lines
4.5 KiB
Go

package main
import (
"flag"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"time"
"hands/pkg/config"
"hands/pkg/control"
"hands/pkg/control/modes"
"hands/pkg/device"
_ "hands/pkg/device/models" // 导入以注册设备类型
)
func main() {
// 解析命令行参数
configPath := flag.String("config", "config.json", "配置文件路径")
flag.Parse()
// 加载配置
cfg, err := loadOrCreateConfig(*configPath)
if err != nil {
log.Fatalf("加载配置失败: %v", err)
}
// 创建设备管理器
deviceManager := device.NewDeviceManager()
// 创建并注册设备
for _, deviceCfg := range cfg.Devices {
dev, err := createDevice(deviceCfg, cfg.CanServiceURL)
if err != nil {
log.Printf("创建设备 %s 失败: %v", deviceCfg.ID, err)
continue
}
if err := deviceManager.RegisterDevice(dev); err != nil {
log.Printf("注册设备 %s 失败: %v", deviceCfg.ID, err)
continue
}
log.Printf("成功注册设备: %s (%s)", deviceCfg.ID, deviceCfg.Model)
}
// 创建操作模式管理器
modeManager := control.NewModeManager()
// 注册操作模式
modeManager.RegisterMode(modes.NewDirectPoseMode())
animFactory := modes.NewAnimationFactory()
for _, animType := range animFactory.GetSupportedAnimations() {
anim, _ := animFactory.CreateAnimation(animType)
modeManager.RegisterMode(anim)
}
// 设置默认设备
if len(cfg.Devices) > 0 {
defaultDev, err := deviceManager.GetDevice(cfg.DefaultDevice.ID)
if err != nil {
log.Printf("获取默认设备失败: %v", err)
} else {
modeManager.SetDevice(defaultDev)
// 连接设备
if err := defaultDev.Connect(); err != nil {
log.Printf("连接设备失败: %v", err)
} else {
log.Printf("成功连接设备: %s", cfg.DefaultDevice.ID)
}
}
}
// 启动默认模式
if err := modeManager.SwitchMode("DirectPose", nil); err != nil {
log.Printf("启动默认模式失败: %v", err)
} else {
log.Println("成功启动直接姿态控制模式")
}
// 演示功能
demonstrateFeatures(modeManager, deviceManager)
// 等待中断信号
waitForShutdown()
log.Println("应用程序正在关闭...")
}
func loadOrCreateConfig(configPath string) (*config.Config, error) {
if _, err := os.Stat(configPath); os.IsNotExist(err) {
// 配置文件不存在,创建默认配置
cfg := config.GetDefaultConfig()
if err := config.SaveConfig(cfg, configPath); err != nil {
return nil, fmt.Errorf("保存默认配置失败:%w", err)
}
log.Printf("创建默认配置文件: %s", configPath)
return cfg, nil
}
return config.LoadConfig(configPath)
}
func createDevice(deviceCfg config.DeviceConfig, canServiceURL string) (device.Device, error) {
deviceConfig := map[string]interface{}{
"id": deviceCfg.ID,
"can_service_url": canServiceURL,
"can_interface": deviceCfg.CanInterface,
}
// 合并设备特定参数
for k, v := range deviceCfg.Parameters {
deviceConfig[k] = v
}
return device.CreateDevice(deviceCfg.Model, deviceConfig)
}
func demonstrateFeatures(modeManager *control.ModeManager, deviceManager *device.DeviceManager) {
log.Println("开始功能演示...")
// 演示直接姿态控制
log.Println("演示直接姿态控制...")
if activeMode := modeManager.GetActiveMode(); activeMode != nil {
if poseMode, ok := activeMode.(*modes.DirectPoseMode); ok {
// 获取设备
devices := deviceManager.GetAllDevices()
if len(devices) > 0 {
dev := devices[0]
// 发送手指姿态
fingerPoses := map[string][]byte{
"thumb": {45},
"index": {30},
"middle": {60},
"ring": {45},
"pinky": {30},
}
inputs := map[string]interface{}{
"finger_poses": fingerPoses,
}
if err := poseMode.Update(dev, inputs); err != nil {
log.Printf("发送手指姿态失败: %v", err)
} else {
log.Println("成功发送手指姿态")
}
time.Sleep(2 * time.Second)
}
}
}
// 演示动画模式
log.Println("演示波浪动画...")
params := map[string]interface{}{
"duration": 3 * time.Second,
"frames": 30,
}
if err := modeManager.SwitchMode("Animation_wave", params); err != nil {
log.Printf("切换到波浪动画失败: %v", err)
} else {
log.Println("成功启动波浪动画")
time.Sleep(4 * time.Second)
}
// 切换回直接控制模式
if err := modeManager.SwitchMode("DirectPose", nil); err != nil {
log.Printf("切换回直接控制模式失败: %v", err)
}
}
func waitForShutdown() {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
<-sigChan
}