panlei
2019-09-29 7a06bb3e7e47e9b67adfd1fcbe025491819b2970
ruleserver/ruleToformula.go
@@ -2,10 +2,11 @@
import (
   "ruleprocess/cache"
   "ruleprocess/logger"
   "basic.com/valib/logger.git"
   "sort"
   "strconv"
   "strings"
   "sync"
   "time"
   "basic.com/pubsub/protomsg.git"
@@ -111,8 +112,15 @@
   Sort    int32
}
var rw sync.RWMutex // 读写锁
// 对单帧图像的判断 thisSdkDatas  当前传入的这帧数据,cacheSdkData 定时器里缓存的一帧数据 没有就返回nil  (thisSdkDatas SdkDatas, cacheSdkDatas SdkDatas)
func Judge(args *SdkDatas, message *protomsg.SdkMessage) {
   defer func() {
      if err := recover(); err != nil {
         logger.Error("规则模块儿的异常捕获:",err)
      }
   }()
   if len(args.Sdkdata) > 0 {
      // 拿到本摄像机的区域
      cameraPolygons := GetPolygons(args.CameraId)
@@ -197,9 +205,8 @@
                  // 如果此结果为真且当前过的是yolo算法,应记下此规则所对应的sdkName,另外,还要去重 (后加:把此条触碰的区域id也记录下来)
                  if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(sdkNames, sdkName) {
                     sdkNames = sdkName + ","
                     polygonId = groupRule.Rules[j].PolygonId + ","
                  }
                  if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(polygonId, groupRule.Rules[j].PolygonId) {
                  if strings.Contains(ruleResult.Result, "true") && !strings.Contains(polygonId, groupRule.Rules[j].PolygonId) {
                     polygonId = groupRule.Rules[j].PolygonId + ","
                  }
                  resultSplice = append(resultSplice, &ruleResult)
@@ -420,11 +427,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} // 扔进去一个定时器元素
@@ -434,7 +445,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
            }
@@ -444,6 +457,7 @@
         }
      }
   }
   rw.Unlock()
   // 往数组里赋值
   isOk,labelTypes := RunRule(args, groupRule, taskId, message, label)
   if isOk {
@@ -495,6 +509,7 @@
            result, _ := expression.Evaluate(nil) // 得到数学公式的结果
            if result.(bool) {
               logger.Info("___________________________________________________________________联动任务报警")
               rw.RLock()
               if TimeEleList[groupRule.GroupId] != nil {  // 极偶尔有情况会等于nil,不知道为啥,做个判断以防宕机
                  // 把数组里缓存的数据取出来一起报警
                  label.LinkCache = []ResultMsg{}
@@ -513,6 +528,7 @@
                     }
                  }
               }
               rw.RUnlock()
            }
         }
      } else {
@@ -520,13 +536,13 @@
         // 倒是把打的组规则标签给去掉了啊
         for _,val := range labelTypes {
            if val == 0 {
               if len(args.RuleResult["yolo"].([]Result)) > 1 {
               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 {
               if len(args.RuleResult["face"].([]FaceResult)) >= 1 {
                  lens := len(args.RuleResult["face"].([]FaceResult))-1
                  args.RuleResult["face"] = args.RuleResult["face"].([]FaceResult)[0:lens]
               }
@@ -543,12 +559,14 @@
      //      va.Result = strconv.FormatBool(isOk)
      //   }
      //}
      rw.Lock()
      for k, _ := range TimeEleList {
         if k == groupRule.GroupId {
            delete(TimeEleList, k)
            logger.Debug("因为定时器的一帧数据结果为false,干掉定时器")
         }
      }
      rw.Unlock()
      // 因为本帧数据不符合规则,所以也不用统计结果数组里的东西
   }
@@ -561,7 +579,7 @@
      //logger.Info("规则的算法id和区域的算法id:", rule.SdkId, "===", am.sdkId)
      if rule.PolygonId == am.areaId { // 算法和区域都得对的上
         if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a972" && rule.SdkArgAlias != "time_rule"{
         if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a972" && rule.SdkArgAlias != "time_rule" {
            if rule.RuleWithPre == "||" {
               return LittleRuleResult{}
            } else {
@@ -629,17 +647,15 @@
                  } else {
                     return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort}
                  }
               } else {
                  return LittleRuleResult{}
               }
            } else {
               return LittleRuleResult{}
            } else if rule.SdkArgAlias == "" { // 什么参数都不配的情况
               if am.targetNum > 0 {
                  return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "true", rule.Sort}
               } else {
                  return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort}
               }
            }
         } else {
            return LittleRuleResult{}
         }
      } else {
         return LittleRuleResult{}
      }
   } else {
      // 处理的都是yolo数据
@@ -679,14 +695,16 @@
               return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort}
            }
         } else {
            return LittleRuleResult{}
         } else if rule.SdkArgAlias == "" {
            if am.targetNum > 0 {
               return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "true", rule.Sort}
            } else {
               return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort}
            }
         }
      } else {
         return LittleRuleResult{}
      }
   }
   return LittleRuleResult{}
}
// 如果有持续时间条件维护开启一个定时器
@@ -695,6 +713,7 @@
      if rule.SdkArgAlias == "duration" { //
         logger.Info("当前小规则是:---------", rule)
         // 先看看定时器元素队列中是否有这条规则的定时器,如果有就不能再次创建了
         rw.Lock()
         var flag bool = true
         for k, _ := range TimeEleList {
            if k == groupId+"+"+rule.Id {
@@ -710,6 +729,7 @@
            TimeEleList[groupId+"+"+rule.Id] = &timeEle // 定时器元素以当前持续时间小规则id为键
            logger.Info("创建了计数器")
         }
         rw.Unlock()
      }
   }
}
@@ -735,18 +755,6 @@
         result, _ := expression.Evaluate(nil)                      // 得到数学公式的结果
         return LittleRuleResult{am.sdkName, rule.RuleWithPre + " " + strconv.FormatBool(result.(bool)), rule.Sort}
         // 加上关于算法的判断条件,不能只有关于规则的,有的算法本身就是一个规则,如个体静止,靠右行,所以,拿到当前子规则的sdkid来判断是否是那些特殊的规则
      } else if rule.SdkId == "IsStatic" { // 静止算法
         if am.isStatic {
            return LittleRuleResult{}
         } else {
            return LittleRuleResult{}
         }
      } else if rule.SdkId == "KeepRight" { // 靠右行算法
         if am.keepRight {
            return LittleRuleResult{}
         } else {
            return LittleRuleResult{}
         }
      }
   }
   return LittleRuleResult{}