zhangzengfei
2024-10-20 4f04056f8b70a467fe17cd989f284b5d23d34ed4
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
86
87
88
89
90
91
92
93
94
95
96
97
package nvcs
 
import (
    "container/list"
    "fmt"
    "time"
 
    "gat1400Exchange/config"
    "gat1400Exchange/models"
    "gat1400Exchange/pkg/logger"
)
 
type simpleCache struct {
    data       *list.List
    expiration time.Duration
}
 
func newCache(expiration time.Duration) *simpleCache {
    return &simpleCache{
        data:       list.New(),
        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
    }
 
    lastData := c.data.Back()
 
    // 如果楼层相同,并且数据在1秒内,则忽略
    if lastData != nil && lastData.Value.(elevatorRunData).Timestamp == data.Timestamp {
        if lastData.Value.(elevatorRunData).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.PushBack(data)
}
 
// 删除过期数据
func (c *simpleCache) cleanExpired() {
    now := time.Now()
 
    // 从队列头部开始检查是否有过期数据
    for c.data.Len() > 0 {
        elem := c.data.Front() // 获取队列头部的元素
        item := elem.Value.(elevatorRunData)
        if now.Sub(time.Unix(item.Timestamp, 0)) > c.expiration {
            // 如果数据已经过期,则从队列中删除
            c.data.Remove(elem)
        } else {
            // 因为数据按时间顺序存储,遇到不过期的数据后就可以停止检查
            break
        }
    }
}