From 5ddd4f4ba6aaf1fe52f93c0966315d0424bd2a5f Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期日, 20 十月 2024 20:30:57 +0800
Subject: [PATCH] 调整楼层获取方式
---
nvcs/a3.go | 2
nvcs/a2.go | 2
nvcs/a1.go | 2
nvcs/osd.go | 22 ++---
nvcs/rfid.go | 13 +++
repository/captureRepo.go | 45 +++-------
nvcs/queue.go | 8 +-
nvcs/nvcs.go | 16 +++
nvcs/cache.go | 84 +++++++++++++++++++-
9 files changed, 136 insertions(+), 58 deletions(-)
diff --git a/nvcs/a1.go b/nvcs/a1.go
index 9dd2d3f..4e72d45 100644
--- a/nvcs/a1.go
+++ b/nvcs/a1.go
@@ -209,7 +209,7 @@
elevator.Name = "1"
}
- var runState = elevatorRunData{
+ var runState = ElevatorRunData{
Device: elevator.Name,
Timestamp: time.Now().Unix(),
Floor: elevator.Status.FloorName,
diff --git a/nvcs/a2.go b/nvcs/a2.go
index 1fe6954..2ffd4fd 100644
--- a/nvcs/a2.go
+++ b/nvcs/a2.go
@@ -103,7 +103,7 @@
iRunState = RunDown
}
- var runState = elevatorRunData{
+ var runState = ElevatorRunData{
Device: req.Id,
Timestamp: time.Now().Unix(),
Floor: req.State.Floor,
diff --git a/nvcs/a3.go b/nvcs/a3.go
index e69067d..8131cbc 100644
--- a/nvcs/a3.go
+++ b/nvcs/a3.go
@@ -38,7 +38,7 @@
floor := fmt.Sprintf("%dF", req.Floor)
- var runState = elevatorRunData{
+ var runState = ElevatorRunData{
Device: req.Id,
Timestamp: time.Now().Unix(),
Floor: floor,
diff --git a/nvcs/cache.go b/nvcs/cache.go
index 011ebf6..18c2b0b 100644
--- a/nvcs/cache.go
+++ b/nvcs/cache.go
@@ -23,7 +23,7 @@
}
// 瀛樺偍鏁版嵁鍒扮紦瀛樹腑
-func (c *simpleCache) store(data elevatorRunData) {
+func (c *simpleCache) store(data ElevatorRunData) {
var floorChanged = true
// 鍙朢FID妤煎眰
@@ -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
+}
diff --git a/nvcs/nvcs.go b/nvcs/nvcs.go
index 2f7ccf6..e8cd45f 100644
--- a/nvcs/nvcs.go
+++ b/nvcs/nvcs.go
@@ -13,7 +13,7 @@
)
// 鏁版嵁缁撴瀯
-type elevatorRunData struct {
+type ElevatorRunData struct {
Device string
Timestamp int64
Floor string
@@ -50,14 +50,26 @@
return "", 0
}
- return runState.(elevatorRunData).Floor, runState.(elevatorRunData).RunState
+ return runState.(ElevatorRunData).Floor, runState.(ElevatorRunData).RunState
+}
+
+func FindPositionByTime(timestamp int64) ElevatorRunData {
+ return cache.getPositionByTime(timestamp)
+}
+
+func FindMovePosition(timestamp int64, floor string) ElevatorRunData {
+ return cache.getMovePosition(timestamp, floor)
}
func listenQueue() {
for {
data := queue.get()
+
+ //t := time.Now()
cache.store(data)
+ //logger.Debug("process queue data %+v, use time %v", data, time.Since(t))
+
// 娓呯悊杩囨湡鏁版嵁
cache.cleanExpired()
}
diff --git a/nvcs/osd.go b/nvcs/osd.go
index ee7ce0e..1046498 100644
--- a/nvcs/osd.go
+++ b/nvcs/osd.go
@@ -2,9 +2,8 @@
import (
"encoding/xml"
+ "fmt"
"io/ioutil"
-
- "gat1400Exchange/pkg/logger"
dac "github.com/xinsnake/go-http-digest-auth-client"
)
@@ -18,9 +17,9 @@
cameraWebPassword = "a1234567"
)
-var overlayText textOverlay
+var overlayText TextOverlay
-type textOverlay struct {
+type TextOverlay struct {
Id int64 `xml:"id"`
Enabled bool `xml:"enabled"`
PositionX int64 `xml:"positionX"`
@@ -42,33 +41,32 @@
return ioutil.ReadAll(resp.Body)
}
-func addFloorToOSD(osdText string) {
+func addFloorToOSD(osdText string) error {
overlay7Url := cameraWebAddr + hikISAPIOverlay7SetUrl
// 鑾峰彇宸︿笅瑙掔涓�涓瓧绗︾殑浣嶇疆
if overlayText.DisplayText == "" {
rsp, err := hikISAPIRequest(cameraWebUser, cameraWebPassword, "GET", overlay7Url, "")
if err != nil {
- logger.Warn("Get osd info failure")
- return
+ return fmt.Errorf("get osd info. %s", err.Error())
}
err = xml.Unmarshal(rsp, &overlayText)
if err != nil {
- logger.Warn("%s", err.Error())
- return
+ return fmt.Errorf("xml unmarshal. %s", err.Error())
}
}
if overlayText.DisplayText == osdText {
- return
+ return nil
}
overlayText.DisplayText = osdText
body, _ := xml.Marshal(overlayText)
_, err := hikISAPIRequest(cameraWebUser, cameraWebPassword, "PUT", overlay7Url, string(body))
if err != nil {
- logger.Warn("Camera osd set failure!!")
- return
+ return fmt.Errorf("set osd. %s", err.Error())
}
+
+ return nil
}
diff --git a/nvcs/queue.go b/nvcs/queue.go
index f1857e5..71a9ef3 100644
--- a/nvcs/queue.go
+++ b/nvcs/queue.go
@@ -1,20 +1,20 @@
package nvcs
type chQueue struct {
- data chan elevatorRunData
+ data chan ElevatorRunData
}
func newChQueue(size int) *chQueue {
return &chQueue{
- data: make(chan elevatorRunData, size),
+ data: make(chan ElevatorRunData, size),
}
}
-func (q *chQueue) put(data elevatorRunData) {
+func (q *chQueue) put(data ElevatorRunData) {
q.data <- data
}
-func (q *chQueue) get() elevatorRunData {
+func (q *chQueue) get() ElevatorRunData {
data := <-q.data
return data
}
diff --git a/nvcs/rfid.go b/nvcs/rfid.go
index 0a39412..0e1fd9e 100644
--- a/nvcs/rfid.go
+++ b/nvcs/rfid.go
@@ -39,8 +39,19 @@
if floor != gRFIDFloor {
gRFIDFloor = floor
logger.Debug("rfid read epc floor %s", gRFIDFloor)
- }
+ cacheData := cache.data.Back()
+ if cacheData != nil {
+ runState := cacheData.Value.(ElevatorRunData)
+ runState.Floor = floor
+ runState.Timestamp = time.Now().Unix()
+ runState.Device = "rfid-reader"
+
+ queue.put(runState)
+ }
+ }
+ } else {
+ gRFIDFloor = ""
}
time.Sleep(200 * time.Millisecond)
diff --git a/repository/captureRepo.go b/repository/captureRepo.go
index 9941a4a..73f0347 100644
--- a/repository/captureRepo.go
+++ b/repository/captureRepo.go
@@ -3,12 +3,12 @@
import (
"encoding/base64"
"encoding/json"
- "gat1400Exchange/nvcs"
"time"
"gat1400Exchange/client"
"gat1400Exchange/config"
"gat1400Exchange/models"
+ "gat1400Exchange/nvcs"
"gat1400Exchange/pkg"
"gat1400Exchange/pkg/logger"
"gat1400Exchange/util"
@@ -214,16 +214,12 @@
// 鍒ゆ柇鏄惁闇�瑕佸尮閰嶆ゼ灞�
if config.NVCSConf.Model != "" {
- // 鍖归厤妤煎眰
- var devPos models.Positions
- _ = devPos.FindDevicePosition(deviceId, faceAppearTime.Unix()+5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿
-
- floor = devPos.Pos
+ runState := nvcs.FindPositionByTime(faceAppearTime.Unix() + 3) // 鍔�3绉掔數姊叧闂ㄧ殑鏃堕棿
+ floor = runState.Floor
for i := 0; i < config.NVCSConf.WaitRunTime; i++ {
- var dbPos models.Positions
- if err := dbPos.FindMovePosition(faceAppearTime.Unix()+5, floor); err == nil {
- switch dbPos.RunDir {
+ if runState = nvcs.FindMovePosition(faceAppearTime.Unix()+3, floor); runState.Floor != "" {
+ switch runState.RunState {
case nvcs.RunUp:
runDir = "in"
case nvcs.RunDown:
@@ -268,6 +264,7 @@
func (c CaptureRepository) VIIDFaceMsgForward(msg *vo.RequestFaceList) {
faceInfo := msg.FaceListObject.FaceObject[0]
+ var floor, runDir string
// 鍒ゆ柇鏄惁寮�鍚簡姊帶
if config.NVCSConf.Model != "" {
@@ -278,25 +275,18 @@
faceAppearTime = time.Now()
}
- var floor, runDir string
- var devPos models.Positions
- _ = devPos.FindPositionByTime(faceAppearTime.Unix() + 5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿
- if devPos.Pos == "" {
- devPos.Pos = "1F"
- }
-
- floor = devPos.Pos
+ runState := nvcs.FindPositionByTime(faceAppearTime.Unix() + 3) // 鍔�3绉掔數姊叧闂ㄧ殑鏃堕棿
+ floor = runState.Floor
for i := 0; i < config.NVCSConf.WaitRunTime; i++ {
- var dbPos models.Positions
- if err := dbPos.FindMovePosition(faceAppearTime.Unix()+5, floor); err == nil {
- switch dbPos.RunDir {
+ if runState = nvcs.FindMovePosition(faceAppearTime.Unix()+3, floor); runState.Floor != "" {
+ switch runState.RunState {
case nvcs.RunUp:
- runDir = "1"
+ runDir = "in"
case nvcs.RunDown:
- runDir = "2"
+ runDir = "out"
case nvcs.RunStop:
- runDir = "0"
+ runDir = ""
}
break
@@ -311,7 +301,6 @@
// msg.FaceListObject.FaceObject[idx].FaceID = pkg.GenerateFaceIdContainFloor(face.FaceID, devPos.Pos)
//}
}
-
}
b, _ := json.Marshal(msg)
@@ -333,14 +322,10 @@
appearTime = time.Now()
}
- var devPos models.Positions
- _ = devPos.FindPositionByTime(appearTime.Unix() + 5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿
- if devPos.Pos == "" {
- devPos.Pos = "1F"
- }
+ runState := nvcs.FindPositionByTime(appearTime.Unix() + 3) // 鍔�3绉掔數姊叧闂ㄧ殑鏃堕棿
for idx, _ := range msg.PersonListObject.PersonObject {
- msg.PersonListObject.PersonObject[idx].BehaviorDescription = devPos.Pos
+ msg.PersonListObject.PersonObject[idx].BehaviorDescription = runState.Floor
//if config.ClientConf.AddFloorToFaceId {
// msg.PersonListObject.PersonObject[idx].PersonID = pkg.GenerateFaceIdContainFloor(v.PersonID, devPos.Pos)
//}
--
Gitblit v1.8.0