From b4a86051e9bf4888fd5d01c12232a26f3874e03b Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期四, 17 十月 2024 21:30:18 +0800
Subject: [PATCH] 完善epc读取楼层

---
 service/nvcs.go |  166 ++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 140 insertions(+), 26 deletions(-)

diff --git a/service/nvcs.go b/service/nvcs.go
index 3e21a84..6c331de 100644
--- a/service/nvcs.go
+++ b/service/nvcs.go
@@ -2,6 +2,7 @@
 
 import (
 	"bytes"
+	"context"
 	"encoding/binary"
 	"encoding/hex"
 	"encoding/json"
@@ -73,6 +74,7 @@
 )
 
 var ElevatorRunState int
+var ElevatorRunFloor string
 var RunningCorrectTaskId string
 
 func A1CorrectFloor() {
@@ -98,9 +100,9 @@
 		address := "192.168.10.253:50000"
 		err := A1SendFrame(frame, address)
 		if err != nil {
-			logger.Debug("The floor has been calibrated.")
-		} else {
 			logger.Warn(err.Error())
+		} else {
+			logger.Debug("The floor has been calibrated.")
 		}
 	}
 }
@@ -185,6 +187,28 @@
 
 	logger.Info("UDP server listening on port %s...", port)
 
+	rfidReader := rfid.NewReader(config.RFIDConf.DevName, 115200, 5)
+	if config.RFIDConf.ReadFloor {
+		defer rfidReader.CloseSerial()
+
+		err := rfidReader.OpenSerial()
+		if err != nil {
+			logger.Error("open rfid. %s", err.Error())
+			return
+		}
+
+		ctx, _ := context.WithCancel(context.Background())
+
+		go func() {
+			err := rfidReader.ReadEPCData(ctx)
+			if err != nil {
+				logger.Error("rfid read. %s", err.Error())
+			}
+		}()
+	}
+
+	var lastFloor int
+	var lastSaveTime int64
 	// 鏃犻檺寰幆绛夊緟鎺ユ敹鏁版嵁
 	for {
 		// 鍒涘缓涓�涓紦鍐插尯鏉ュ瓨鍌ㄦ帴鏀剁殑鏁版嵁
@@ -216,9 +240,6 @@
 
 		elevator := data.Elevator[0]
 
-		// 璁板綍鐢垫杩愯鐘舵��
-		ElevatorRunState = elevator.Status.RunDir
-
 		var runStateStr string
 		if config.NVCSConf.RunState {
 			if elevator.Status.RunDir == RunUp {
@@ -232,38 +253,56 @@
 			runStateStr = ""
 		}
 
-		// 璁剧疆osd  鏍煎紡 "1F涓� 鍥� 鏋�"
-		if config.NVCSConf.OSD != "" {
-			floorText := fmt.Sprintf("%s%s %s", data.Elevator[0].Status.FloorName, runStateStr, config.NVCSConf.OSD)
-
-			// 璋冪敤hik api 灏嗘枃瀛楁坊鍔犲埌osd鐨勫乏涓嬭
-			AddFloorToOSD(floorText)
-		}
-
 		// correct floor when elevator stopped.
-		if ElevatorRunState == 0 {
-			A1CorrectFloor()
-		} else {
-			RunningCorrectTaskId = ""
+		//if elevator.Status.RunDir == 0 {
+		//	go A1CorrectFloor()
+		//} else {
+		//	RunningCorrectTaskId = ""
+		//}
+
+		if lastFloor == elevator.Status.Floor && (time.Now().Unix()-lastSaveTime < 2) {
+			continue
 		}
+		lastFloor = elevator.Status.Floor
+		lastSaveTime = time.Now().Unix()
 
 		// 绋嬪簭閮ㄧ讲鍦ㄨ澶囩, 瀛楃鍙犲姞鍣ㄤ笂鎶ョ殑鍚嶇О鍏佽涓虹┖. 鍦ㄤ簯绔�, 鍚嶇О蹇呴』涓庢憚鍍忔満鐩稿悓
 		if elevator.Name == "" {
 			elevator.Name = "1"
 		}
 
-		var d = models.Positions{
-			DeviceId:   elevator.Name,
-			Pos:        elevator.Status.FloorName,
-			RunDir:     elevator.Status.RunDir,
-			CreateTime: time.Now().Unix(),
-			TimeString: time.Now().Format("2006-01-02 15:04:05"),
+		ElevatorRunState = elevator.Status.RunDir
+		ElevatorRunFloor = elevator.Status.FloorName
+		if config.RFIDConf.ReadFloor && rfidReader.EPCData != "" {
+			ElevatorRunFloor, _ = rfid.Parse2Floor(rfidReader.EPCData)
+			logger.Debug("rfid read epc floor %s", ElevatorRunFloor)
+			if elevator.Status.RunDir == RunStop && ElevatorRunFloor != elevator.Status.FloorName {
+				logger.Warn("A floor error has occurred rfid epc %s, nvcs floor %s", ElevatorRunFloor, elevator.Status.FloorName)
+			}
 		}
 
-		err = d.Save()
-		if err != nil {
-			logger.Warn("Device position update error:%s", err.Error())
+		// 璁剧疆osd  鏍煎紡 "1F涓� 鍥� 鏋�"
+		if config.NVCSConf.OSD != "" {
+			floorText := fmt.Sprintf("%s%s %s", ElevatorRunFloor, runStateStr, config.NVCSConf.OSD)
+
+			// 璋冪敤hik api 灏嗘枃瀛楁坊鍔犲埌osd鐨勫乏涓嬭
+			AddFloorToOSD(floorText)
 		}
+
+		go func() {
+			var d = models.Positions{
+				DeviceId:   elevator.Name,
+				Pos:        ElevatorRunFloor,
+				RunDir:     ElevatorRunState,
+				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())
+			}
+		}()
 	}
 }
 
@@ -359,6 +398,9 @@
 			iRunState = RunDown
 		}
 
+		ElevatorRunState = iRunState
+		ElevatorRunFloor = req.State.Floor
+
 		//// 宸插埌鏈�涓嬪眰
 		//if req.State.Floor == A2BottomFloor {
 		//	runState = "涓�"
@@ -402,11 +444,83 @@
 	}
 }
 
+type A3ElevatorData struct {
+	Id     string `json:"id"`
+	Time   string `json:"time"`
+	Total  int    `json:"total"`
+	Status int    `json:"status"`
+	Floor  int    `json:"floor"`
+}
+
+func NVCSA3WebServer() {
+	r := gin.Default()
+
+	r.POST("/", func(c *gin.Context) {
+		var req A3ElevatorData
+		var runState string
+		var iRunState int
+
+		err := c.BindJSON(&req)
+		if err != nil {
+			c.JSON(http.StatusBadRequest, nil)
+			return
+		}
+
+		iRunState = req.Status
+		ElevatorRunState = req.Status
+		ElevatorRunFloor = fmt.Sprintf("%dF", req.Floor)
+		logger.Debug("Received A2 report data %+v", req)
+
+		// 璁板綍鐢垫杩愯鐘舵��
+		if iRunState == RunUp {
+			runState = "涓�"
+		} else if iRunState == RunDown {
+			runState = "涓�"
+		}
+
+		if !config.NVCSConf.RunState {
+			runState = ""
+		}
+
+		if config.NVCSConf.OSD != "" {
+			floorText := fmt.Sprintf("%dF%s %s", req.Floor, runState, config.NVCSConf.OSD)
+
+			// 璋冪敤hik api 灏嗘枃瀛楁坊鍔犲埌osd鐨勫乏涓嬭
+			AddFloorToOSD(floorText)
+		}
+
+		var d = models.Positions{
+			DeviceId:   req.Id,
+			Pos:        fmt.Sprintf("%dF", req.Floor),
+			RunDir:     iRunState,
+			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())
+		}
+
+		c.JSON(http.StatusOK, "ok")
+	})
+
+	err := r.Run(fmt.Sprintf(":%s", config.NVCSConf.Port))
+	if err != nil {
+		logger.Warn("Start NVCS WebServer error, %s", err.Error())
+	}
+}
+
 func StartNVCSServer() {
 	if config.NVCSConf.Model == "A1" {
 		go NVCSA1UDPServer()
 	}
+
 	if config.NVCSConf.Model == "A2" {
 		go NVCSA2WebServer()
 	}
+
+	if config.NVCSConf.Model == "A3" {
+		go NVCSA3WebServer()
+	}
 }

--
Gitblit v1.8.0