package lc import "github.com/sirupsen/logrus" // 设备参数 var DeviceInitData DeviceData type DeviceData struct { //雷达 LowSpeed int //低速 OverSpeed int //超速 // 屏幕 Brightness int // 亮度 //语音 Volume int // 声音大小 NormalVoice string // 正常语音 OverSpeedVoice string // 超速语音 } // 通知接口 type Notifier interface { Notify(text string, isProgram, speed int) } // 校时接口 type CorrectTimer interface { Correct() } func DoCorrectTime(a any) { if c, ok := a.(CorrectTimer); ok { c.Correct() } } // 重连接口 type ReConnector interface { Reconnect() } func DoReconnect(a any) { if c, ok := a.(ReConnector); ok { c.Reconnect() } } // 单个设备接口 type IDevice interface { Call(text string, isProgram, speed int) // 触发警告 Rollback() // 恢复初始状态 ReConnector // 重连 CorrectTimer // 校时 } // 设备信息 type DeviceInfo struct { Name string Ip string Port string Audio string // 扬声器音频 } // 单个哨兵设备组合(屏幕+喇叭) type SentinelDevice struct { Info DeviceInfo Screen Screener Speaker Loudspeaker } // 触发警告(屏幕显示+喇叭发声) func (s *SentinelDevice) Call(text string, isProgram, speed int) { if s.Screen != nil { if isProgram == 1 || isProgram == 0 { if speed <= DeviceInitData.OverSpeed { //小于等于超速显示绿色 s.Screen.Display(Green, DefaultRunMode, DefaultDisplayMode, isProgram, speed, text) // 显示警告 } else { s.Screen.Display(Red, DefaultRunMode, DefaultDisplayMode, isProgram, speed, text) // 显示警告 } } else if isProgram == 2 { s.Screen.Display(Red, LoopAndOff, MoveLeft, isProgram, speed, text) // 显示警告 } } if s.Speaker != nil { if speed > DeviceInitData.OverSpeed { logrus.Info("触发语音----------------------------------") s.Speaker.Speak(DeviceInitData.OverSpeedVoice) // 语音提示 } else if speed > DeviceInitData.LowSpeed { s.Speaker.Speak(DeviceInitData.NormalVoice) // 语音提示 } } } // 恢复初始状态 func (s *SentinelDevice) Rollback() { if s.Screen != nil { s.Screen.Display(Red, DefaultRunMode, DefaultDisplayMode, 0, 0, "") //恢复默认 //s.Screen.Display(Yellow, DefaultRunMode, DefaultDisplayMode, 1, 0, "减速慢行") // 恢复默认显示 } } // 重连设备 func (s *SentinelDevice) Reconnect() { DoReconnect(s.Screen) //DoReconnect(s.Speaker) } // 校时 func (s *SentinelDevice) Correct() { DoCorrectTime(s.Screen) }