64 lines
1.6 KiB
Go
64 lines
1.6 KiB
Go
package tool
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log/slog"
|
|
|
|
"bj_power_mes/internal/robot"
|
|
)
|
|
|
|
// ScannerTool 扫码器,实现 HandheldTool 接口
|
|
// 通过 RobotManager 控制机器人执行扫码动作并读取扫码结果
|
|
type ScannerTool struct {
|
|
robotMgr *robot.Manager // 机器人管理器,用于控制扫码动作
|
|
}
|
|
|
|
// NewScannerTool 创建扫码器工具
|
|
func NewScannerTool(robotMgr *robot.Manager) *ScannerTool {
|
|
return &ScannerTool{robotMgr: robotMgr}
|
|
}
|
|
|
|
// ID 返回扫码器唯一标识
|
|
func (t *ScannerTool) ID() string { return "scanner-1" }
|
|
|
|
// Type 返回工具类型编码
|
|
func (t *ScannerTool) Type() string { return "SCANNER" }
|
|
|
|
// Name 返回工具显示名称
|
|
func (t *ScannerTool) Name() string { return "扫码器" }
|
|
|
|
// Execute 执行扫码操作:启动扫码→读取结果→清除数据
|
|
func (t *ScannerTool) Execute(ctx context.Context, cmd ToolCommand) error {
|
|
wt := extractWorkpieceType(cmd.Params)
|
|
round := 1
|
|
if v, ok := cmd.Params["round"]; ok {
|
|
if n, ok := v.(int); ok {
|
|
round = n
|
|
}
|
|
}
|
|
|
|
rc, exist := t.robotMgr.GetRobot()
|
|
if !exist || rc == nil {
|
|
return fmt.Errorf("robot controller not available")
|
|
}
|
|
|
|
slog.Info("scanner: start scan", "workpieceType", wt, "round", round)
|
|
if err := rc.StartScanCode(ctx, wt, round); err != nil {
|
|
return fmt.Errorf("start scan code: %w", err)
|
|
}
|
|
|
|
code, err := t.robotMgr.ReadScanCodeData(ctx)
|
|
if err != nil {
|
|
return fmt.Errorf("read scan code: %w", err)
|
|
}
|
|
|
|
if clearErr := t.robotMgr.ClearScanCodeData(ctx); clearErr != nil {
|
|
slog.Warn("scanner: failed to clear scan data", "error", clearErr)
|
|
}
|
|
|
|
slog.Info("scanner: scan complete", "code", code)
|
|
cmd.Params["scanCode"] = code
|
|
return nil
|
|
}
|