123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- package lc
- import (
- "github.com/sirupsen/logrus"
- "lc-smartX/util"
- "lc-smartX/util/gopool"
- "time"
- )
- type SmartXServer interface {
- Serve()
- }
- func StartSmartXServer(s SmartXServer) {
- s.Serve()
- }
- type IntersectionServer struct {
- MainState byte
- SubState byte
- MainDevices []IDevice
- SubDevices []IDevice
- ReTicker *time.Ticker
- Main *time.Ticker
- Sub *time.Ticker
- }
- type MainNotifier struct{ s *IntersectionServer }
- // Notify 主路来车,通知支路设备
- func (m MainNotifier) Notify() {
- 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 (s SubNotifier) Notify() {
- s.s.Sub.Reset(5 * time.Second)
- if s.s.SubState != 1 {
- s.s.SubState = 1
- for _, v := range s.s.MainDevices {
- gopool.Go(v.Call)
- }
- }
- }
- func (is *IntersectionServer) Serve() {
- RegisterCallback(1, &SubNotifier{is})
- RegisterCallback(0, &MainNotifier{is})
- //先创建响应设备
- for _, v := range util.Config.OutputDevices {
- iDevice := &IntersectionDevice{
- Info: v,
- }
- iDevice.ReConnect() //初次连接
- if iDevice.Info.Branch == 1 {
- is.MainDevices = append(is.MainDevices, iDevice)
- } else {
- is.SubDevices = append(is.SubDevices, iDevice)
- }
- }
- logrus.Info("主路输出设备列表:", is.MainDevices)
- logrus.Info("支路输出设备列表:", is.SubDevices)
- for {
- select {
- case <-is.Main.C: //检查主路状态->支路输出设备回到初始状态
- for _, v := range is.SubDevices {
- if is.MainState == 1 {
- gopool.Go(v.Back)
- }
- }
- is.MainState = 0
- case <-is.Sub.C: //检查支路状态->主路输出设备作出响应
- for _, v := range is.MainDevices {
- if is.SubState == 1 {
- gopool.Go(v.Back)
- }
- }
- is.SubState = 0
- case <-is.ReTicker.C: //每19s检查并尝试重连
- gopool.Go(func() {
- for _, v := range is.MainDevices {
- v.ReConnect()
- }
- })
- gopool.Go(func() {
- for _, v := range is.SubDevices {
- v.ReConnect()
- }
- })
- }
- }
- }
- // LServer ###
- // ===
- // ===
- // ===
- // === todo 服务器模式没测通,屏没有连接服务器
|