zhangzengfei
2024-10-17 b4a86051e9bf4888fd5d01c12232a26f3874e03b
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()
   }
}