zhangzengfei
2024-10-20 5ddd4f4ba6aaf1fe52f93c0966315d0424bd2a5f
nvcs/cache.go
@@ -23,7 +23,7 @@
}
// 存储数据到缓存中
func (c *simpleCache) store(data elevatorRunData) {
func (c *simpleCache) store(data ElevatorRunData) {
   var floorChanged = true
   // 取RFID楼层
@@ -35,13 +35,17 @@
      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
         }
      }
@@ -82,9 +86,11 @@
      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())
      }
   }
}
// 删除过期数据
@@ -94,7 +100,7 @@
   // 从队列头部开始检查是否有过期数据
   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)
@@ -104,3 +110,69 @@
      }
   }
}
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
}