panlei
2019-09-17 6351ababead17e120b146a4b3f37c4e49ca64268
ruleserver/ruleToformula.go
@@ -6,6 +6,7 @@
   "sort"
   "strconv"
   "strings"
   "sync"
   "time"
   "basic.com/pubsub/protomsg.git"
@@ -111,6 +112,8 @@
   Sort    int32
}
var rw sync.RWMutex // 读写锁
// 对单帧图像的判断 thisSdkDatas  当前传入的这帧数据,cacheSdkData 定时器里缓存的一帧数据 没有就返回nil  (thisSdkDatas SdkDatas, cacheSdkDatas SdkDatas)
func Judge(args *SdkDatas, message *protomsg.SdkMessage) {
   if len(args.Sdkdata) > 0 {
@@ -161,7 +164,7 @@
   }
}
func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label Others) bool {
func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label Others) (bool,[]int) {
   defer func() {
      if err := recover(); err != nil {
         logger.Error("比对规则有误", err.(string))
@@ -357,27 +360,30 @@
            } else {
               islink = false
            }
            var labelTypes []int // 0为yolo标签,1为face标签 2为两者标签
            if sdkNames != "" {
               args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, locations, polygonId, islink,label,})
               labelTypes = append(labelTypes,0)
               //logger.Info("-------------------yolo结果标签长度", len(args.RuleResult["yolo"].([]Result)))
            }
            if faceFlag {
               args.RuleResult["face"] = append(args.RuleResult["face"].([]FaceResult), FaceResult{Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, []Rect{}, polygonId, islink,label,}, faces})
               //logger.Info("-------------------face结果标签", len(args.RuleResult["face"].([]FaceResult)))
               labelTypes = append(labelTypes,1)
            }
            return true
            return true,labelTypes
         } else {
            return false
            return false,[]int{}
         }
      } else {
         // 结果为假时也要走,有杀死定时器的操作
         TimerAlarm(&label, groupRule.GroupId, result.(bool))
         //fmt.Println(timeFlag)
         return false
         return false,[]int{}
      }
   } else {
      return false
      return false,[]int{}
   }
}
@@ -417,11 +423,15 @@
   logger.Info("------------------------------------------当前是联动任务,规则是:", groupRule.GroupText)
   var flag bool = true
   var timeEle = TimeElement{N: 2, InitN: 2, GroupId: groupRule.GroupId}
   rw.Lock()
   for k, timeEle1 := range TimeEleList {
      if k == groupRule.GroupId {
         flag = false // 已经有了这个定时器就置为false 不再新增
         timeEle = *timeEle1
      }
   }
   for _,ruleRe := range timeEle.RuleResults {
      logger.Info("联动数组里的数据----",ruleRe.CameraId,ruleRe.Sort)
   }
   if flag { // 如果还没有这个定时器元素就新增一个
      //timeEle := TimeElement{N: 2, InitN: 2, GroupId: groupRule.GroupId} // 扔进去一个定时器元素
@@ -431,7 +441,9 @@
      // 得出这组完整规则里涉及到几个摄像机,决定着数组里有几个结构体,去重添加方式
      for j := 0; j < len(groupRule.Rules); j++ {
         var flag1 bool = true
         logger.Info("规则组信息:",groupRule.Rules[j].CameraId)
         for _, ruleRes := range TimeEleList[groupRule.GroupId].RuleResults {
            logger.Info("联动数组里的数据:",ruleRes.CameraId,ruleRes.Sort)
            if groupRule.Rules[j].CameraId == ruleRes.CameraId {
               flag1 = false
            }
@@ -441,8 +453,9 @@
         }
      }
   }
   rw.Unlock()
   // 往数组里赋值
   isOk := RunRule(args, groupRule, taskId, message, label)
   isOk,labelTypes := RunRule(args, groupRule, taskId, message, label)
   if isOk {
      logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为true")
      // 根据cameraId去更新或者插入结果,然后判断是否数组是否可以得出报警的结论
@@ -492,6 +505,7 @@
            result, _ := expression.Evaluate(nil) // 得到数学公式的结果
            if result.(bool) {
               logger.Info("___________________________________________________________________联动任务报警")
               rw.RLock()
               if TimeEleList[groupRule.GroupId] != nil {  // 极偶尔有情况会等于nil,不知道为啥,做个判断以防宕机
                  // 把数组里缓存的数据取出来一起报警
                  label.LinkCache = []ResultMsg{}
@@ -510,13 +524,28 @@
                     }
                  }
               }
               rw.RUnlock()
            }
         }
      } else {
         logger.Warn("数组不圆满不打标签")
         // 倒是把打的组规则标签给去掉了啊
         lens := len(args.RuleResult["yolo"].([]Result))-1
         args.RuleResult["yolo"] = args.RuleResult["yolo"].([]Result)[0:lens]
         for _,val := range labelTypes {
            if val == 0 {
               if len(args.RuleResult["yolo"].([]Result)) >= 1 {
                  lens := len(args.RuleResult["yolo"].([]Result))-1
                  args.RuleResult["yolo"] = args.RuleResult["yolo"].([]Result)[0:lens]
               }
            }
            if val == 1 {
               if len(args.RuleResult["face"].([]FaceResult)) >= 1 {
                  lens := len(args.RuleResult["face"].([]FaceResult))-1
                  args.RuleResult["face"] = args.RuleResult["face"].([]FaceResult)[0:lens]
               }
            }
         }
      }
   } else { // 没有报警,
      //logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为false")
@@ -526,12 +555,14 @@
      //      va.Result = strconv.FormatBool(isOk)
      //   }
      //}
      rw.Lock()
      for k, _ := range TimeEleList {
         if k == groupRule.GroupId {
            delete(TimeEleList, k)
            logger.Debug("因为定时器的一帧数据结果为false,干掉定时器")
         }
      }
      rw.Unlock()
      // 因为本帧数据不符合规则,所以也不用统计结果数组里的东西
   }
@@ -577,14 +608,14 @@
                  var args []*Arg
                  if rule.RuleWithPre == "&&" {
                     args = am.filterData
                     // 先清空过滤后的数据,再往里塞本次过滤后的数据
                     am.filterData = am.filterData[0:0]
                     //logger.Info("过滤后的args的长度为:",len(args))
                  } else {
                     args = am.args
                     //不清空之前的过滤数据,继续塞
                     //logger.Info("没过滤的args的长度为:",len(args))
                  }
                  // 先清空过滤后的数据,再往里塞本次过滤后的数据
                  am.filterData = am.filterData[0:0]
                  //logger.Info("-----------------------人脸过滤的args里的数量:", len(args))
                  for _, arg := range args {
                     var formula string
@@ -678,6 +709,7 @@
      if rule.SdkArgAlias == "duration" { //
         logger.Info("当前小规则是:---------", rule)
         // 先看看定时器元素队列中是否有这条规则的定时器,如果有就不能再次创建了
         rw.Lock()
         var flag bool = true
         for k, _ := range TimeEleList {
            if k == groupId+"+"+rule.Id {
@@ -693,6 +725,7 @@
            TimeEleList[groupId+"+"+rule.Id] = &timeEle // 定时器元素以当前持续时间小规则id为键
            logger.Info("创建了计数器")
         }
         rw.Unlock()
      }
   }
}