devmgr.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package main
  2. import (
  3. "sync"
  4. "github.com/sirupsen/logrus"
  5. "lc/common/protocol"
  6. )
  7. type ModelInfo struct {
  8. TID uint16
  9. Flag int
  10. }
  11. type Device interface {
  12. Start()
  13. Stop()
  14. UpdateInfo(devinfo protocol.DevInfo)
  15. GetDevInfo() *protocol.DevInfo
  16. UpdateModel(tid uint16, flag int)
  17. }
  18. func CreateDevice(t uint8, devinfo *protocol.DevInfo) Device {
  19. var device Device
  20. switch t {
  21. case 0:
  22. device = NewModbusRtu(devinfo)
  23. case 1:
  24. device = NewConcentrator(devinfo)
  25. case 2:
  26. device = NewYmLampController(devinfo)
  27. default:
  28. logrus.Errorf("AddDevices:不支持的协议的设备:mode=%d", t)
  29. }
  30. return device
  31. }
  32. var _onceGetDeviceMgr sync.Once
  33. var _singleSerialMgr *DeviceMgr
  34. func GetDeviceMgr() *DeviceMgr {
  35. _onceGetDeviceMgr.Do(func() {
  36. _singleSerialMgr = &DeviceMgr{mapDevice: make(map[string]Device)}
  37. })
  38. return _singleSerialMgr
  39. }
  40. type DeviceMgr struct {
  41. mu sync.Mutex
  42. mapDevice map[string]Device
  43. }
  44. // AddDevices 新增
  45. func (o *DeviceMgr) AddDevices(infos []protocol.DevInfo) {
  46. o.mu.Lock()
  47. defer o.mu.Unlock()
  48. for _, v := range infos {
  49. if _, ok := o.mapDevice[v.DevCode]; ok {
  50. logrus.Errorf("AddDevices:已添加该设备,不可重复添加:devcode=%s", v.DevCode)
  51. continue
  52. }
  53. di := v
  54. if device := CreateDevice(v.ProtocolType, &di); device != nil {
  55. device.Start()
  56. o.mapDevice[v.DevCode] = device
  57. }
  58. }
  59. }
  60. // RemoveDevice 删除
  61. func (o *DeviceMgr) RemoveDevice(devCode string) {
  62. o.mu.Lock()
  63. defer o.mu.Unlock()
  64. if device, ok := o.mapDevice[devCode]; ok {
  65. device.Stop()
  66. delete(o.mapDevice, devCode)
  67. }
  68. }
  69. // UpdateDevices 新增或修改
  70. func (o *DeviceMgr) UpdateDevices(code uint8, infos []protocol.DevInfo) {
  71. //先遍历devinfos
  72. deviceInfos := make(map[string]*protocol.DevInfo)
  73. for _, v := range infos {
  74. deviceInfos[v.DevCode] = &v
  75. }
  76. o.mu.Lock()
  77. defer o.mu.Unlock()
  78. if len(infos) == 0 {
  79. for k, v := range o.mapDevice {
  80. if v.GetDevInfo().Code == code {
  81. v.Stop()
  82. delete(o.mapDevice, k)
  83. }
  84. }
  85. return
  86. }
  87. //先删除不再用的设备
  88. for k, v := range o.mapDevice {
  89. if v.GetDevInfo().Code != code {
  90. continue
  91. }
  92. if _, ok := deviceInfos[k]; !ok {
  93. v.Stop()
  94. delete(o.mapDevice, k)
  95. }
  96. }
  97. //再添加新的设备或更新设备
  98. for _, v := range infos {
  99. if device, ok := o.mapDevice[v.DevCode]; ok {
  100. old := device.GetDevInfo()
  101. if v.ProtocolType == old.ProtocolType { //设备类型没变
  102. device.UpdateInfo(v) //更新设备信息
  103. if v.TID != old.TID { //更新物模型信息
  104. device.UpdateModel(v.TID, 3)
  105. }
  106. continue
  107. } else {
  108. device.Stop()
  109. delete(o.mapDevice, v.DevCode)
  110. }
  111. }
  112. if device := CreateDevice(v.ProtocolType, &v); device != nil {
  113. device.Start()
  114. o.mapDevice[v.DevCode] = device
  115. }
  116. }
  117. }
  118. // GetDevice 查询
  119. func (o *DeviceMgr) GetDevice(devcode string) Device {
  120. o.mu.Lock()
  121. defer o.mu.Unlock()
  122. if device, ok := o.mapDevice[devcode]; ok {
  123. return device
  124. }
  125. return nil
  126. }
  127. // StopDevice 停止
  128. func (o *DeviceMgr) StopDevice(devCode string) {
  129. o.mu.Lock()
  130. defer o.mu.Unlock()
  131. if device, ok := o.mapDevice[devCode]; ok {
  132. device.Stop()
  133. delete(o.mapDevice, devCode)
  134. }
  135. }
  136. // StopAllDevice 停止所有
  137. func (o *DeviceMgr) StopAllDevice() {
  138. o.mu.Lock()
  139. defer o.mu.Unlock()
  140. for k, v := range o.mapDevice {
  141. v.Stop()
  142. delete(o.mapDevice, k)
  143. }
  144. }
  145. // UpdateModel 更新模型
  146. func (o *DeviceMgr) UpdateModel(tid uint16, flag int) {
  147. o.mu.Lock()
  148. defer o.mu.Unlock()
  149. for _, v := range o.mapDevice {
  150. v.UpdateModel(tid, flag)
  151. }
  152. }