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