|
@@ -1,6 +1,7 @@
|
|
package lc
|
|
package lc
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
+ "github.com/sirupsen/logrus"
|
|
"lc-smartX/util"
|
|
"lc-smartX/util"
|
|
"lc-smartX/util/gopool"
|
|
"lc-smartX/util/gopool"
|
|
"time"
|
|
"time"
|
|
@@ -13,8 +14,7 @@ type SmartXServer interface {
|
|
type IntersectionServer struct {
|
|
type IntersectionServer struct {
|
|
RadarEventServer *RadarServer
|
|
RadarEventServer *RadarServer
|
|
CameraEventServer *CameraServer
|
|
CameraEventServer *CameraServer
|
|
- MainState byte
|
|
|
|
- SubState byte
|
|
|
|
|
|
+ State byte
|
|
MainDevices []IDevice
|
|
MainDevices []IDevice
|
|
SubDevices []IDevice
|
|
SubDevices []IDevice
|
|
ReTicker *time.Ticker
|
|
ReTicker *time.Ticker
|
|
@@ -25,7 +25,6 @@ type IntersectionServer struct {
|
|
func StartIntersectionServer() {
|
|
func StartIntersectionServer() {
|
|
is := &IntersectionServer{
|
|
is := &IntersectionServer{
|
|
Main: time.NewTicker(5 * time.Second), //主路状态回滚
|
|
Main: time.NewTicker(5 * time.Second), //主路状态回滚
|
|
- Sub: time.NewTicker(5 * time.Second), //支路状态回滚
|
|
|
|
ReTicker: time.NewTicker(30 * time.Second), //重连
|
|
ReTicker: time.NewTicker(30 * time.Second), //重连
|
|
}
|
|
}
|
|
if util.Config.Server.SupportCamera {
|
|
if util.Config.Server.SupportCamera {
|
|
@@ -44,38 +43,29 @@ func StartIntersectionServer() {
|
|
type MainNotifier struct{ s *IntersectionServer }
|
|
type MainNotifier struct{ s *IntersectionServer }
|
|
|
|
|
|
// Notify 主路来车,通知支路设备
|
|
// Notify 主路来车,通知支路设备
|
|
-func (m MainNotifier) Notify() {
|
|
|
|
|
|
+func (m MainNotifier) Notify(id string) {
|
|
|
|
+ logrus.Errorf("Noitfy m.s.State = %d", m.s.State)
|
|
|
|
+ logrus.Errorf("Noitfy dev = %v", m.s.SubDevices)
|
|
|
|
+ logrus.Errorf("Noitfy dev = %v", m.s.MainDevices)
|
|
m.s.Main.Reset(5 * time.Second)
|
|
m.s.Main.Reset(5 * time.Second)
|
|
- if m.s.MainState != 1 {
|
|
|
|
- m.s.MainState = 1
|
|
|
|
- for _, v := range m.s.SubDevices {
|
|
|
|
- gopool.Go(v.Call)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-type SubNotifier struct{ s *IntersectionServer }
|
|
|
|
-
|
|
|
|
-// Notify 支路来车,通知主路设备
|
|
|
|
-func (sub SubNotifier) Notify() {
|
|
|
|
- sub.s.Sub.Reset(5 * time.Second)
|
|
|
|
- if sub.s.SubState != 1 {
|
|
|
|
- sub.s.SubState = 1
|
|
|
|
- for _, v := range sub.s.MainDevices {
|
|
|
|
- gopool.Go(v.Call)
|
|
|
|
|
|
+ if m.s.State != 1 {
|
|
|
|
+ m.s.State = 1
|
|
|
|
+ if id == "1" || id == "2" {
|
|
|
|
+ for _, v := range m.s.SubDevices {
|
|
|
|
+ gopool.Go(v.Call)
|
|
|
|
+ }
|
|
|
|
+ } else if id == "3" || id == "4" {
|
|
|
|
+ for _, v := range m.s.MainDevices {
|
|
|
|
+ gopool.Go(v.Call)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
func (is *IntersectionServer) Serve() {
|
|
func (is *IntersectionServer) Serve() {
|
|
if util.Config.Server.SupportCamera {
|
|
if util.Config.Server.SupportCamera {
|
|
- is.CameraEventServer.RegisterCallback(1, &SubNotifier{is})
|
|
|
|
is.CameraEventServer.RegisterCallback(0, &MainNotifier{is})
|
|
is.CameraEventServer.RegisterCallback(0, &MainNotifier{is})
|
|
}
|
|
}
|
|
- if util.Config.Server.SupportRadar {
|
|
|
|
- is.RadarEventServer.RegisterCallback(1, &SubNotifier{is})
|
|
|
|
- is.RadarEventServer.RegisterCallback(0, &MainNotifier{is})
|
|
|
|
- }
|
|
|
|
|
|
|
|
//先创建响应设备
|
|
//先创建响应设备
|
|
for _, c := range util.Config.Screens {
|
|
for _, c := range util.Config.Screens {
|
|
@@ -86,7 +76,7 @@ func (is *IntersectionServer) Serve() {
|
|
Port: c.Port,
|
|
Port: c.Port,
|
|
Branch: c.Branch,
|
|
Branch: c.Branch,
|
|
},
|
|
},
|
|
- Screen: NewScreen(c.Name, c.Ip, c.Port),
|
|
|
|
|
|
+ Screen: NewScreen(c.Name, c.Ip, c.Port, c.Branch),
|
|
}
|
|
}
|
|
if c.Branch == 1 {
|
|
if c.Branch == 1 {
|
|
is.MainDevices = append(is.MainDevices, iDevice)
|
|
is.MainDevices = append(is.MainDevices, iDevice)
|
|
@@ -115,29 +105,16 @@ func (is *IntersectionServer) Serve() {
|
|
select {
|
|
select {
|
|
case <-is.Main.C: //检查主路状态->支路输出设备回到初始状态
|
|
case <-is.Main.C: //检查主路状态->支路输出设备回到初始状态
|
|
for _, v := range is.SubDevices {
|
|
for _, v := range is.SubDevices {
|
|
- if is.MainState == 1 {
|
|
|
|
|
|
+ if is.State == 1 {
|
|
gopool.Go(v.Rollback)
|
|
gopool.Go(v.Rollback)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- is.MainState = 0
|
|
|
|
- case <-is.Sub.C: //检查支路状态->主路输出设备作出响应
|
|
|
|
for _, v := range is.MainDevices {
|
|
for _, v := range is.MainDevices {
|
|
- if is.SubState == 1 {
|
|
|
|
|
|
+ if is.State == 1 {
|
|
gopool.Go(v.Rollback)
|
|
gopool.Go(v.Rollback)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- is.SubState = 0
|
|
|
|
- case <-is.ReTicker.C: //每19s检查并尝试重连
|
|
|
|
- gopool.Go(func() {
|
|
|
|
- for _, v := range is.MainDevices {
|
|
|
|
- gopool.Go(v.Reconnect)
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- gopool.Go(func() {
|
|
|
|
- for _, v := range is.SubDevices {
|
|
|
|
- gopool.Go(v.Reconnect)
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
|
|
+ is.State = 0
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|