From c8a641dd784c071f83a0d90c35f617607fd0811b Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期日, 20 十月 2024 02:26:01 +0800
Subject: [PATCH] 修改楼层缓存为双向链表

---
 controller/nvcsCtl.go |    6 ++++--
 nvcs/nvcs.go          |    9 +++++++++
 nvcs/cache.go         |   29 +++++++++++++++++++++--------
 3 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/controller/nvcsCtl.go b/controller/nvcsCtl.go
index c1ef35d..f3ed2bc 100644
--- a/controller/nvcsCtl.go
+++ b/controller/nvcsCtl.go
@@ -18,9 +18,11 @@
 
 func (n NVCSController) RunStatus(c *gin.Context) {
 	var runStatus = make(map[string]string, 0)
-	runStatus["floor"] = nvcs.ElevatorRunFloor
+	var floor, runState = nvcs.CurrentRunState()
 
-	switch nvcs.ElevatorRunState {
+	runStatus["floor"] = floor
+
+	switch runState {
 	case 0:
 		runStatus["status"] = "鍋�"
 	case 1:
diff --git a/nvcs/cache.go b/nvcs/cache.go
index e792c55..1c78d93 100644
--- a/nvcs/cache.go
+++ b/nvcs/cache.go
@@ -1,6 +1,7 @@
 package nvcs
 
 import (
+	"container/list"
 	"fmt"
 	"time"
 
@@ -10,13 +11,13 @@
 )
 
 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,
 	}
 }
@@ -31,9 +32,12 @@
 		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
 		}
 	}
@@ -72,14 +76,23 @@
 		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
 		}
 	}
 }
diff --git a/nvcs/nvcs.go b/nvcs/nvcs.go
index bf6ccd8..a6d5c0b 100644
--- a/nvcs/nvcs.go
+++ b/nvcs/nvcs.go
@@ -44,6 +44,15 @@
 	}
 }
 
+func CurrentRunState() (string, int) {
+	runState := cache.data.Back().Value
+	if runState == nil {
+		return "", 0
+	}
+
+	return runState.(elevatorRunData).Floor, runState.(elevatorRunData).RunState
+}
+
 func listenQueue() {
 	for {
 		data := queue.dequeue()

--
Gitblit v1.8.0