devmgr.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package service
  2. import (
  3. "encoding/json"
  4. "smart_tunnel_edge/protocol/envSensor"
  5. "smart_tunnel_edge/protocol/lampControl"
  6. "smart_tunnel_edge/protocol/switchRelay"
  7. "smart_tunnel_edge/util/config"
  8. "smart_tunnel_edge/util/logger"
  9. "sync"
  10. "time"
  11. )
  12. var mu sync.Mutex
  13. //var RelayStatus = "1000" //四路开关继电器状态
  14. const (
  15. RegulateLight = "regulateLight"
  16. RegulateSwitch = "regulateSwitch"
  17. FullPower = "fullPower"
  18. LowPower = "lowPower"
  19. MediumPower = "mediumPower"
  20. LowLightLevel = 30
  21. MediumLightLevel = 60
  22. FullLightLevel = 90
  23. )
  24. // 初始化时单灯或者开关继电器
  25. func InitControl() {
  26. if config.Instance().Policy.Control == RegulateLight {
  27. go SetLampBright([]int8{1, 2}, LowLightLevel)
  28. } else {
  29. go SetSwitchRelay([]int8{1, 2}, 1, 1)
  30. }
  31. }
  32. func StartDeviceCollection(dev *config.EnvDev) {
  33. coverTime := dev.TaskTime
  34. ticker := time.NewTicker(time.Duration(coverTime) * time.Minute)
  35. defer ticker.Stop()
  36. for {
  37. select {
  38. case <-ticker.C:
  39. if dev.WaitTime > 0 {
  40. time.Sleep(time.Duration(dev.WaitTime) * time.Second)
  41. }
  42. //获取指令
  43. dataPack := envSensor.DataPack{Address: dev.Address, Start: []byte{0x01, 0xF8}, DataLen: []byte{0x00, 0x08}}
  44. if dev.Name == "光传感器" {
  45. dataPack = envSensor.DataPack{Address: dev.Address, Start: []byte{0x00, 0x06}, DataLen: []byte{0x00, 0x01}}
  46. }
  47. if dev.Name == "光感" {
  48. dataPack = envSensor.DataPack{Address: dev.Address, Start: []byte{0x00, 0x00}, DataLen: []byte{0x00, 0x28}}
  49. }
  50. buffer := dataPack.GetEnvGatherCommand()
  51. mu.Lock()
  52. port, err := GetSerialPort(dev.SerialId)
  53. if err != nil {
  54. logger.Logger.Infof(err.Error())
  55. continue
  56. }
  57. write, err := port.Write(buffer.Bytes())
  58. mu.Unlock()
  59. if write < 0 || err != nil {
  60. logger.Logger.Errorf("设备:%v采集数据失败,错误:%v", dev.Sn, err)
  61. continue
  62. }
  63. }
  64. }
  65. }
  66. // 处理灯光开关逻辑
  67. func OperationLampSwitchJudge(radarId []int8, brightness int, power string) {
  68. switch config.Instance().Policy.Control {
  69. case RegulateLight:
  70. // 如果是单灯控制器,直接调整亮度
  71. SetLampBright(radarId, brightness)
  72. case RegulateSwitch:
  73. // 对于开关继电器控制,根据亮度调整回路状态
  74. switch power {
  75. case FullPower:
  76. // 满功率:打开回路1和回路2
  77. go SetSwitchRelay(radarId, 1, 1) // 打开回路1
  78. go SetSwitchRelay(radarId, 2, 1) // 打开回路2
  79. case LowPower:
  80. // 三分之一功率:打开回路1,关闭回路2
  81. go SetSwitchRelay(radarId, 1, 1)
  82. go SetSwitchRelay(radarId, 2, 0)
  83. case MediumPower:
  84. // 三分之二功率:打开回路2,关闭回路1
  85. go SetSwitchRelay(radarId, 2, 1) // 打开回路2
  86. go SetSwitchRelay(radarId, 1, 0) // 关闭回路1
  87. }
  88. }
  89. }
  90. // 单灯控制器调光方法
  91. func SetLampBright(radarId []int8, brightness int) {
  92. var wg sync.WaitGroup
  93. for _, id := range radarId {
  94. for _, dev := range config.DevConfig.LampDevs {
  95. if dev.RadarId != id {
  96. continue
  97. }
  98. wg.Add(1)
  99. newDev := dev
  100. go func() {
  101. defer wg.Done()
  102. // 获取对应的串口
  103. port, err := GetSerialPort(newDev.SerialId)
  104. if err != nil {
  105. logger.Logger.Infof("获取串口失败,设备编号:%v,错误:%v", newDev.Sn, err)
  106. return
  107. }
  108. buffer := lampControl.DataPack{Addr: newDev.Address}.GetLampSetBrightCommand(brightness)
  109. mu.Lock() // 锁定串口操作
  110. write, err := port.Write(buffer.Bytes())
  111. mu.Unlock()
  112. if write < 0 || err != nil {
  113. logger.Logger.Errorf("单灯:%v操作失败,错误:%v", newDev.Sn, err)
  114. return
  115. }
  116. //上报单灯亮度 根据路数
  117. topic := MqttService.GetTopic(TopicLampBrightNess)
  118. state := LampBrightNess{Way: id, BrightNess: brightness}
  119. jsonData, _ := json.Marshal(state)
  120. err = MqttService.Publish(topic, jsonData)
  121. if err != nil {
  122. logger.Logger.Errorf("MQTT Publish err = %s", err.Error())
  123. }
  124. }()
  125. time.Sleep(time.Millisecond * 150)
  126. }
  127. }
  128. wg.Wait()
  129. }
  130. // 开关继电器开关方法(单路)
  131. func SetSwitchRelay(radarId []int8, way, turnOf int) {
  132. for _, id := range radarId {
  133. for _, dev := range config.DevConfig.SwitchDevs {
  134. if dev.RadarId != id {
  135. continue
  136. }
  137. port, err := GetSerialPort(dev.SerialId)
  138. if err != nil {
  139. logger.Logger.Infof("获取串口失败,设备编号:%v,错误:%v", dev.Sn, err)
  140. return
  141. }
  142. command := switchRelay.DataPack{Address: dev.Address, Way: way, Command: turnOf}.GetSwitchRelayCommand()
  143. mu.Lock() // 锁定串口操作
  144. write, err := port.Write(command.Bytes())
  145. mu.Unlock() // 锁定串口操作
  146. if write < 0 || err != nil {
  147. logger.Logger.Errorf("控制单路开关继电器:%v操作失败,错误:%v", dev.Sn, err)
  148. continue
  149. }
  150. time.Sleep(time.Millisecond * 150)
  151. //上报回路状态
  152. topic := MqttService.GetTopic(TopicSwitchStates)
  153. state := RelayState{Sn: dev.Sn, Way: way, TurnOf: turnOf}
  154. jsonData, _ := json.Marshal(state)
  155. err = MqttService.Publish(topic, jsonData)
  156. if err != nil {
  157. logger.Logger.Errorf("MQTT Publish err = %s", err.Error())
  158. }
  159. }
  160. }
  161. }
  162. // 开关继电器开关方法(多路)
  163. func SetSwitchMultiRelay(radarId int8, turnOf int, ways []int) {
  164. for _, dev := range config.DevConfig.SwitchDevs {
  165. if dev.RadarId != radarId {
  166. continue
  167. }
  168. port, err := GetSerialPort(dev.SerialId)
  169. if err != nil {
  170. logger.Logger.Infof("获取串口失败,设备编号:%v,错误:%v", dev.Sn, err)
  171. return
  172. }
  173. command := switchRelay.MultiLoopDataPack{Address: dev.Address, TurnOff: turnOf, State: ways}.GetControlMuchSwitchRelayCommand()
  174. mu.Lock() // 锁定串口操作
  175. write, err := port.Write(command.Bytes())
  176. mu.Unlock() // 锁定串口操作
  177. if write < 0 || err != nil {
  178. logger.Logger.Errorf("控制多路开关继电器:%v操作失败,错误:%v", dev.Sn, err)
  179. continue
  180. }
  181. time.Sleep(time.Millisecond * 150)
  182. }
  183. }