Files
bj_power/bj_power_mes/internal/processor/tool/scanner.go
T

64 lines
1.6 KiB
Go
Raw Normal View History

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
}