zhangzengfei
2024-10-20 c8a641dd784c071f83a0d90c35f617607fd0811b
修改楼层缓存为双向链表
3个文件已修改
44 ■■■■ 已修改文件
controller/nvcsCtl.go 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
nvcs/cache.go 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
nvcs/nvcs.go 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controller/nvcsCtl.go
@@ -18,9 +18,11 @@
func (n NVCSController) RunStatus(c *gin.Context) {
    var runStatus = make(map[string]string, 0)
    runStatus["floor"] = nvcs.ElevatorRunFloor
    var floor, runState = nvcs.CurrentRunState()
    switch nvcs.ElevatorRunState {
    runStatus["floor"] = floor
    switch runState {
    case 0:
        runStatus["status"] = "停"
    case 1:
nvcs/cache.go
@@ -1,6 +1,7 @@
package nvcs
import (
    "container/list"
    "fmt"
    "time"
@@ -10,13 +11,13 @@
)
type simpleCache struct {
    data       map[int64]elevatorRunData
    data       *list.List
    expiration time.Duration
}
func newCache(expiration time.Duration) *simpleCache {
    return &simpleCache{
        data:       make(map[int64]elevatorRunData),
        data:       list.New(),
        expiration: expiration,
    }
}
@@ -31,9 +32,12 @@
        data.Floor = gRFIDFloor
    }
    lastData := c.data.Back()
    c.data.PushBack(data)
    // 如果楼层相同,并且数据在1秒内,则忽略
    if existingData, ok := c.data[data.Timestamp]; ok {
        if existingData.Floor == data.Floor {
    if lastData.Value.(elevatorRunData).Timestamp == data.Timestamp {
        if lastData.Value.(elevatorRunData).Floor == data.Floor {
            return
        }
    }
@@ -72,14 +76,23 @@
        go addFloorToOSD(floorText)
    }
    c.data[data.Timestamp] = data
    c.data.PushBack(data)
}
// 删除过期数据
func (c *simpleCache) cleanExpired() {
    for t := range c.data {
        if time.Since(time.Unix(t, 0)) > c.expiration {
            delete(c.data, t)
    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
        }
    }
}
nvcs/nvcs.go
@@ -44,6 +44,15 @@
    }
}
func CurrentRunState() (string, int) {
    runState := cache.data.Back().Value
    if runState == nil {
        return "", 0
    }
    return runState.(elevatorRunData).Floor, runState.(elevatorRunData).RunState
}
func listenQueue() {
    for {
        data := queue.dequeue()