zhangzengfei
2024-10-20 2fc94ba7b517125a7ed9771b48bb5d383021bc91
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package nvcs
 
import (
    "fmt"
    "time"
 
    "gat1400Exchange/config"
    "gat1400Exchange/models"
    "gat1400Exchange/pkg/logger"
)
 
type simpleCache struct {
    data       map[int64]elevatorRunData
    expiration time.Duration
}
 
func newCache(expiration time.Duration) *simpleCache {
    return &simpleCache{
        data:       make(map[int64]elevatorRunData),
        expiration: expiration,
    }
}
 
// 存储数据到缓存中
func (c *simpleCache) store(data elevatorRunData) {
    if config.RFIDConf.ReadFloor && gRFIDFloor != data.Floor {
        if data.RunState == RunStop {
            logger.Warn("A floor error has occurred rfid epc %s, nvcs floor %s", gRFIDFloor, data.Floor)
        }
 
        data.Floor = gRFIDFloor
    }
 
    // 如果楼层相同,并且数据在1秒内,则忽略
    if existingData, ok := c.data[data.Timestamp]; ok {
        if existingData.Floor == data.Floor {
            return
        }
    }
 
    // 数据库保存一份
    go func() {
        var d = models.Positions{
            DeviceId:   data.Device,
            Pos:        data.Floor,
            RunDir:     data.RunState,
            CreateTime: time.Now().Unix(),
            TimeString: time.Now().Format("2006-01-02 15:04:05"),
        }
 
        err := d.Save()
        if err != nil {
            logger.Warn("Device position update error:%s", err.Error())
        }
    }()
 
    // 写OSD
    var runStateStr string
    if config.NVCSConf.RunState {
        if data.RunState == RunUp {
            runStateStr = "上"
        } else if data.RunState == RunDown {
            runStateStr = "下"
        }
    }
 
    // 设置osd  格式 "1F上 固 枪"
    if config.NVCSConf.OSD != "" {
        floorText := fmt.Sprintf("%s%s %s", data.Floor, runStateStr, config.NVCSConf.OSD)
 
        // 调用hik api 将文字添加到osd的左下角
        go addFloorToOSD(floorText)
    }
 
    c.data[data.Timestamp] = data
}
 
// 删除过期数据
func (c *simpleCache) cleanExpired() {
    for t := range c.data {
        if time.Since(time.Unix(t, 0)) > c.expiration {
            delete(c.data, t)
        }
    }
}