package lc import ( "github.com/sirupsen/logrus" "lc-smartX/util" "lc-smartX/util/gopool" "time" ) type SmartXServer interface { Serve() } type IntersectionServer struct { RadarEventServer *RadarServer CameraEventServer *CameraServer State byte MainDevices []IDevice SubDevices []IDevice ReTicker *time.Ticker Main *time.Ticker Sub *time.Ticker } func StartIntersectionServer() { is := &IntersectionServer{ Main: time.NewTicker(5 * time.Second), //主路状态回滚 ReTicker: time.NewTicker(30 * time.Second), //重连 } if util.Config.Server.SupportCamera { is.CameraEventServer = NewCameraEventServer() gopool.Go(is.CameraEventServer.Start) } if util.Config.Server.SupportRadar { is.RadarEventServer = NewRadarEventServer() gopool.Go(is.RadarEventServer.Start) } //等事件服务先启动 time.Sleep(1 * time.Second) is.Serve() } type MainNotifier struct{ s *IntersectionServer } // 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) 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() { if util.Config.Server.SupportCamera { is.CameraEventServer.RegisterCallback(0, &MainNotifier{is}) } //先创建响应设备 for _, c := range util.Config.Screens { iDevice := &IntersectionDevice{ Info: OutputDeviceInfo{ Name: c.Name, Ip: c.Ip, Port: c.Port, Branch: c.Branch, }, Screen: NewScreen(c.Name, c.Ip, c.Port, c.Branch), } if c.Branch == 1 { is.MainDevices = append(is.MainDevices, iDevice) } else { is.SubDevices = append(is.SubDevices, iDevice) } } for _, c := range util.Config.Speakers { iDevice := &IntersectionDevice{ Info: OutputDeviceInfo{ Name: c.Name, Ip: c.Ip, Branch: c.Branch, Audio: c.Audio, }, Speaker: NewIpCast(c.Name, c.Ip, c.Audio, c.Speed, c.Volume), } if c.Branch == 1 { is.MainDevices = append(is.MainDevices, iDevice) } else { is.SubDevices = append(is.SubDevices, iDevice) } } for { select { case <-is.Main.C: //检查主路状态->支路输出设备回到初始状态 for _, v := range is.SubDevices { if is.State == 1 { gopool.Go(v.Rollback) } } for _, v := range is.MainDevices { if is.State == 1 { gopool.Go(v.Rollback) } } is.State = 0 } } }