| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- package main
- import (
- "lc/common/models"
- "math"
- "sync"
- "time"
- "github.com/thinkgos/timing/v3"
- "lc/common/protocol"
- "lc/common/util"
- )
- func Precision(f float64, prec int, round bool) float64 {
- pow10N := math.Pow10(prec)
- if round {
- return math.Trunc((f+0.5/pow10N)*pow10N) / pow10N
- }
- return math.Trunc((f)*pow10N) / pow10N
- }
- var mapRtuUploadManager sync.Map
- type RtuUploadManager struct {
- DataLock sync.Mutex
- DevInfo *protocol.DevInfo
- DateTime time.Time
- Data map[uint16]float64
- Timer *timing.Timing
- }
- func NewRtuUploadManager(rtuinfo *protocol.DevInfo) *RtuUploadManager {
- o := RtuUploadManager{
- DevInfo: rtuinfo,
- Data: make(map[uint16]float64),
- Timer: timing.New().Run(),
- }
- o.Timer.AddJobFunc(o.SendData, time.Duration(o.DevInfo.SendCloud)*time.Millisecond)
- return &o
- }
- func (o *RtuUploadManager) Stop() {
- o.Timer.Close()
- o.DataLock.Lock()
- defer o.DataLock.Unlock()
- o.DevInfo = nil
- o.Data = nil
- }
- func (o *RtuUploadManager) AddData(data map[uint16]float64) {
- o.DataLock.Lock()
- defer o.DataLock.Unlock()
- for k, v := range data {
- o.Data[k] = v
- }
- o.DateTime = util.MlNow()
- }
- func (o *RtuUploadManager) SendData() {
- o.DataLock.Lock()
- defer func() {
- o.Data = make(map[uint16]float64)
- o.DataLock.Unlock()
- o.Timer.AddJobFunc(o.SendData, time.Duration(o.DevInfo.SendCloud)*time.Millisecond)
- }()
- if len(o.Data) == 0 {
- return
- }
- var obj protocol.Pack_UploadData
- if str, err := obj.EnCode(o.DevInfo.DevCode, appConfig.GID, GetNextUint64(), nil, o.DevInfo.TID, o.Data); err == nil {
- topic := GetTopic(o.GetDevType(), o.DevInfo.DevCode, protocol.TP_MODBUS_DATA)
- GetMQTTMgr().Publish(topic, str, 0, ToAll) //上传消息 modbus rtu
- }
- }
- func (o *RtuUploadManager) GetDevType() string {
- if o.DevInfo.DevType == 1 {
- return protocol.DT_CONCENTRATOR
- } else if o.DevInfo.DevType == 2 {
- return protocol.DT_ENVIRONMENT
- } else if o.DevInfo.DevType == 4 {
- return protocol.DT_LIQUID
- } else if o.DevInfo.DevType == 5 {
- return protocol.DT_ROAD_COND
- } else if o.DevInfo.DevType == uint8(models.CableGuardian) {
- return protocol.DT_CableGuardian
- }
- return "unknown"
- }
|