| | |
| | | package nvcs |
| | | |
| | | import ( |
| | | "container/list" |
| | | "fmt" |
| | | "time" |
| | | |
| | |
| | | ) |
| | | |
| | | 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, |
| | | } |
| | | } |
| | |
| | | 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 |
| | | } |
| | | } |
| | |
| | | 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 |
| | | } |
| | | } |
| | | } |