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 } } c.data.PushBack(data) // 数据库保存一份 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 } } }