| | |
| | | } |
| | | |
| | | // 存储数据到缓存中 |
| | | func (c *simpleCache) store(data elevatorRunData) { |
| | | func (c *simpleCache) store(data ElevatorRunData) { |
| | | var floorChanged = true |
| | | |
| | | // 取RFID楼层 |
| | |
| | | data.Floor = gRFIDFloor |
| | | } |
| | | |
| | | if data.Floor == "" { |
| | | return |
| | | } |
| | | |
| | | lastData := c.data.Back() |
| | | |
| | | // 如果楼层相同,并且数据在1秒内,则忽略 |
| | | if lastData != nil { |
| | | if lastData.Value.(elevatorRunData).Floor == data.Floor { |
| | | if lastData.Value.(ElevatorRunData).Floor == data.Floor { |
| | | floorChanged = false |
| | | if lastData.Value.(elevatorRunData).Timestamp == data.Timestamp { |
| | | if lastData.Value.(ElevatorRunData).Timestamp == data.Timestamp { |
| | | return |
| | | } |
| | | } |
| | |
| | | floorText := fmt.Sprintf("%s%s %s", data.Floor, runStateStr, config.NVCSConf.OSD) |
| | | |
| | | // 调用hik api 将文字添加到osd的左下角 |
| | | addFloorToOSD(floorText) |
| | | err = addFloorToOSD(floorText) |
| | | if err != nil { |
| | | logger.Warn("%s", err.Error()) |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | // 删除过期数据 |
| | |
| | | // 从队列头部开始检查是否有过期数据 |
| | | for c.data.Len() > 0 { |
| | | elem := c.data.Front() // 获取队列头部的元素 |
| | | item := elem.Value.(elevatorRunData) |
| | | item := elem.Value.(ElevatorRunData) |
| | | if now.Sub(time.Unix(item.Timestamp, 0)) > c.expiration { |
| | | // 如果数据已经过期,则从队列中删除 |
| | | c.data.Remove(elem) |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | func (c *simpleCache) getPositionByTime(timestamp int64) (runData ElevatorRunData) { |
| | | node := c.data.Back() |
| | | if node == nil { |
| | | return |
| | | } |
| | | |
| | | for { |
| | | if node.Prev() == nil { |
| | | break |
| | | } |
| | | |
| | | if node.Prev().Value.(ElevatorRunData).Timestamp >= timestamp { |
| | | node = node.Prev() |
| | | } else { |
| | | break |
| | | } |
| | | } |
| | | |
| | | if node.Value.(ElevatorRunData).Timestamp >= timestamp { |
| | | runData = node.Value.(ElevatorRunData) |
| | | } |
| | | |
| | | return |
| | | } |
| | | |
| | | func (c *simpleCache) getMovePosition(timestamp int64, floor string) (runData ElevatorRunData) { |
| | | node := c.data.Back() |
| | | if node == nil { |
| | | return |
| | | } |
| | | |
| | | // 先找到最近节点 |
| | | for { |
| | | if node.Prev() == nil { |
| | | break |
| | | } |
| | | |
| | | if node.Prev().Value.(ElevatorRunData).Timestamp >= timestamp { |
| | | node = node.Prev() |
| | | } else { |
| | | break |
| | | } |
| | | } |
| | | |
| | | if node.Value.(ElevatorRunData).Timestamp >= timestamp { |
| | | for { |
| | | if node.Next() == nil { |
| | | break |
| | | } |
| | | |
| | | if node.Next().Value.(ElevatorRunData).Floor == floor { |
| | | node = node.Next() |
| | | } else { |
| | | break |
| | | } |
| | | } |
| | | } |
| | | |
| | | if node.Value.(ElevatorRunData).Timestamp >= timestamp && |
| | | node.Next().Value.(ElevatorRunData).Floor != floor { |
| | | runData = node.Value.(ElevatorRunData) |
| | | } |
| | | |
| | | return |
| | | } |