uploaddata.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/sirupsen/logrus"
  5. "lc/common/models"
  6. "math"
  7. "sort"
  8. "sync"
  9. "time"
  10. "github.com/thinkgos/timing/v3"
  11. "lc/common/protocol"
  12. "lc/common/util"
  13. )
  14. func truncateNaive(f float64, unit float64) float64 {
  15. return math.Trunc(f/unit) * unit
  16. }
  17. func Precision(f float64, prec int, round bool) float64 {
  18. pow10N := math.Pow10(prec)
  19. if round {
  20. return math.Trunc((f+0.5/pow10N)*pow10N) / pow10N
  21. }
  22. return math.Trunc((f)*pow10N) / pow10N
  23. }
  24. var mapRtuUploadManager sync.Map
  25. type RtuUploadManager struct {
  26. DataLock sync.Mutex
  27. Rtuinfo *protocol.DevInfo
  28. Datatime time.Time
  29. Data map[uint16]float64
  30. Timer *timing.Timing
  31. LiguidDataMgr *LiguidDataMgr //液位计专用
  32. }
  33. func NewRtuUploadManager(rtuinfo *protocol.DevInfo) *RtuUploadManager {
  34. o := RtuUploadManager{
  35. Rtuinfo: rtuinfo,
  36. Data: make(map[uint16]float64),
  37. Timer: timing.New().Run(),
  38. }
  39. if rtuinfo.DevType == 4 && (rtuinfo.TID == 3 || rtuinfo.TID == 5) {
  40. o.LiguidDataMgr = &LiguidDataMgr{}
  41. }
  42. logrus.Infof("NewRtuUploadManager rtuinfo = %v \n", rtuinfo)
  43. o.Timer.AddJobFunc(o.SendData, time.Duration(o.Rtuinfo.SendCloud)*time.Millisecond)
  44. return &o
  45. }
  46. func (o *RtuUploadManager) Stop() {
  47. o.Timer.Close()
  48. o.DataLock.Lock()
  49. defer o.DataLock.Unlock()
  50. o.Rtuinfo = nil
  51. o.Data = nil
  52. }
  53. func (o *RtuUploadManager) AddData(data map[uint16]float64) {
  54. o.DataLock.Lock()
  55. defer o.DataLock.Unlock()
  56. //液位计需要追加深度数据
  57. if o.Rtuinfo.DevType == 4 && (o.Rtuinfo.TID == 3 || o.Rtuinfo.TID == 5) {
  58. for k, v := range data {
  59. o.Data[k] = v
  60. if k == 1 {
  61. fval := o.LiguidDataMgr.Adjust(o.Rtuinfo.Height, v)
  62. o.Data[2] = fval
  63. }
  64. }
  65. } else {
  66. for k, v := range data {
  67. o.Data[k] = v
  68. }
  69. }
  70. // PrintMap(o.Data)
  71. o.Datatime = util.MlNow()
  72. }
  73. func (o *RtuUploadManager) SendData() {
  74. o.DataLock.Lock()
  75. defer func() {
  76. o.Data = make(map[uint16]float64)
  77. o.DataLock.Unlock()
  78. o.Timer.AddJobFunc(o.SendData, time.Duration(o.Rtuinfo.SendCloud)*time.Millisecond)
  79. }()
  80. if len(o.Data) == 0 {
  81. return
  82. }
  83. var obj protocol.Pack_UploadData
  84. if str, err := obj.EnCode(o.Rtuinfo.DevCode, appConfig.GID, GetNextUint64(), nil, o.Rtuinfo.TID, o.Data); err == nil {
  85. topic := GetTopic(o.GetDevType(), o.Rtuinfo.DevCode, protocol.TP_MODBUS_DATA)
  86. GetMQTTMgr().Publish(topic, str, 0, ToAll) //上传消息 modbus rtu
  87. }
  88. }
  89. func (o *RtuUploadManager) GetDevType() string {
  90. if o.Rtuinfo.DevType == 1 {
  91. return protocol.DT_CONCENTRATOR
  92. } else if o.Rtuinfo.DevType == 2 {
  93. return protocol.DT_ENVIRONMENT
  94. } else if o.Rtuinfo.DevType == 4 {
  95. return protocol.DT_LIQUID
  96. } else if o.Rtuinfo.DevType == 5 {
  97. return protocol.DT_ROAD_COND
  98. } else if o.Rtuinfo.DevType == uint8(models.CableGuardian) {
  99. return protocol.DT_CableGuardian
  100. }
  101. return "unknown"
  102. }
  103. type kv struct {
  104. Key uint16
  105. Value float64
  106. }
  107. func PrintMap(m map[uint16]float64) {
  108. var ss []kv
  109. for k, v := range m {
  110. ss = append(ss, kv{k, v})
  111. }
  112. sort.Slice(ss, func(i, j int) bool {
  113. //return ss[i].Key > ss[j].Key // 降序
  114. return ss[i].Key < ss[j].Key // 升序
  115. })
  116. for _, kv := range ss {
  117. fmt.Printf("%d, %0.3f\n", kv.Key, kv.Value)
  118. }
  119. }