fix: rebuild MES as compilable go-zero+ent backend (renamed bj_power_mes), restore 3 workstation projects from pristine original, align naming; all Go projects go build clean
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
package robot
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"bj_power_mes/internal/alarm"
|
||||
"bj_power_mes/internal/sse"
|
||||
|
||||
"bj_power_mes/ent"
|
||||
|
||||
goplc "bjhardman.cn/bjhardman/goplc"
|
||||
)
|
||||
|
||||
type Controller struct {
|
||||
plcClient goplc.Client
|
||||
entClient *ent.Client
|
||||
sseHandler *sse.Handler
|
||||
alarmSvc *alarm.Service
|
||||
maxRetries int
|
||||
checkSignalDuration time.Duration
|
||||
mtx sync.Mutex
|
||||
activity string // 当前持有锁的Action名称
|
||||
waitingQueue []string // 等待队列
|
||||
queueLock sync.Mutex // 保护等待队列的锁
|
||||
}
|
||||
|
||||
func NewRobotController(plcClient goplc.Client, entClient *ent.Client, sseHandler *sse.Handler, alarmSvc *alarm.Service) *Controller {
|
||||
return &Controller{
|
||||
plcClient: plcClient,
|
||||
entClient: entClient,
|
||||
sseHandler: sseHandler,
|
||||
alarmSvc: alarmSvc,
|
||||
maxRetries: 3,
|
||||
checkSignalDuration: 1 * time.Second,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Controller) Lock(activity string) {
|
||||
c.queueLock.Lock()
|
||||
c.waitingQueue = append(c.waitingQueue, activity)
|
||||
c.queueLock.Unlock()
|
||||
|
||||
c.mtx.Lock()
|
||||
|
||||
c.queueLock.Lock()
|
||||
defer c.queueLock.Unlock()
|
||||
// 从等待队列移除
|
||||
for i, name := range c.waitingQueue {
|
||||
if name == activity {
|
||||
c.waitingQueue = append(c.waitingQueue[:i], c.waitingQueue[i+1:]...)
|
||||
break
|
||||
}
|
||||
}
|
||||
c.activity = activity
|
||||
}
|
||||
|
||||
func (c *Controller) UnLock() {
|
||||
c.queueLock.Lock()
|
||||
defer c.queueLock.Unlock()
|
||||
c.activity = ""
|
||||
c.mtx.Unlock()
|
||||
}
|
||||
|
||||
// Status 获取当前锁状态
|
||||
func (c *Controller) Status() (current string, queue []string) {
|
||||
c.queueLock.Lock()
|
||||
defer c.queueLock.Unlock()
|
||||
return c.activity, append([]string(nil), c.waitingQueue...) // 返回副本
|
||||
}
|
||||
|
||||
func (c *Controller) SetAction(activity string) {
|
||||
c.activity = activity
|
||||
}
|
||||
|
||||
func (c *Controller) ClearAction() {
|
||||
c.activity = ""
|
||||
}
|
||||
Reference in New Issue
Block a user