devmgr.go 6.0 KB

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