Files
bj_power/bj_power_mes/internal/camera/manager.go
T

106 lines
1.9 KiB
Go
Raw Normal View History

package camera
import (
"fmt"
"log"
"sync"
"time"
"github.com/zeromicro/go-zero/core/logx"
)
type CameraEventHandler func(*Manager, string) []byte
type Config struct {
Addr string
Timeout time.Duration
MaxRetries int
RetryInterval time.Duration
}
type Manager struct {
client *Client
config Config
mu sync.Mutex
listeners map[string]CameraEventHandler
}
func NewManager(config Config) *Manager {
return &Manager{
config: config,
listeners: make(map[string]CameraEventHandler),
}
}
func (m *Manager) Start() error {
m.client = NewClient(m.config.Addr, m.config.Timeout)
err := m.client.ConnectWithRetry(m.config.MaxRetries, m.config.RetryInterval)
if err != nil {
return err
}
// 启动监听
go m.listenLoop()
return nil
}
func (m *Manager) listenLoop() {
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
m.pollEvents()
}
}
}
func (m *Manager) pollEvents() {
// 模拟检测事件,实际应由 Client 提供事件检测接口
result, err := m.client.GetDetectionResult()
if err != nil {
log.Printf("获取检测结果失败: %v", err)
return
}
if result != "" {
m.handleEvent("detection_result", result)
}
}
func (m *Manager) handleEvent(event string, data string) {
m.mu.Lock()
handler, exists := m.listeners[event]
m.mu.Unlock()
if !exists {
log.Printf("未注册事件处理器: %s", event)
return
}
logx.Infof("触发相机事件: %s, 数据: %s", event, data)
resp := handler(m, data)
if resp != nil {
// 可选:写回响应
fmt.Println("响应:", string(resp))
}
}
func (m *Manager) AddListener(event string, handler CameraEventHandler) {
m.mu.Lock()
defer m.mu.Unlock()
m.listeners[event] = handler
}
func (m *Manager) GetClient() *Client {
return m.client
}
func (m *Manager) Close() {
if m.client != nil {
m.client.Close()
}
}