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) { var floorChanged = true // 取RFID楼层 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 } if data.Floor == "" { return } lastData := c.data.Back() // 如果楼层相同,并且数据在1秒内,则忽略 if lastData != nil { if lastData.Value.(ElevatorRunData).Floor == data.Floor { floorChanged = false if lastData.Value.(ElevatorRunData).Timestamp == data.Timestamp { return } } } c.data.PushBack(data) if !floorChanged { return } // 数据库保存一份 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的左下角 err = addFloorToOSD(floorText) if err != nil { logger.Warn("%s", err.Error()) } } } // 删除过期数据 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 } } } 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 }