| | |
| | | |
| | | import ( |
| | | "ruleprocess/cache" |
| | | "ruleprocess/logger" |
| | | "basic.com/valib/logger.git" |
| | | "sort" |
| | | "strconv" |
| | | "strings" |
| | | "sync" |
| | | "time" |
| | | |
| | | "basic.com/pubsub/protomsg.git" |
| | |
| | | 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) |
| | |
| | | // 如果此结果为真且当前过的是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) |
| | |
| | | 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} // 扔进去一个定时器元素 |
| | |
| | | // 得出这组完整规则里涉及到几个摄像机,决定着数组里有几个结构体,去重添加方式 |
| | | 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 |
| | | } |
| | |
| | | } |
| | | } |
| | | } |
| | | rw.Unlock() |
| | | // 往数组里赋值 |
| | | isOk,labelTypes := RunRule(args, groupRule, taskId, message, label) |
| | | if isOk { |
| | |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | if result.(bool) { |
| | | logger.Info("___________________________________________________________________联动任务报警") |
| | | rw.RLock() |
| | | if TimeEleList[groupRule.GroupId] != nil { // 极偶尔有情况会等于nil,不知道为啥,做个判断以防宕机 |
| | | // 把数组里缓存的数据取出来一起报警 |
| | | label.LinkCache = []ResultMsg{} |
| | |
| | | } |
| | | } |
| | | } |
| | | rw.RUnlock() |
| | | } |
| | | } |
| | | } else { |
| | |
| | | // va.Result = strconv.FormatBool(isOk) |
| | | // } |
| | | //} |
| | | rw.Lock() |
| | | for k, _ := range TimeEleList { |
| | | if k == groupRule.GroupId { |
| | | delete(TimeEleList, k) |
| | | logger.Debug("因为定时器的一帧数据结果为false,干掉定时器") |
| | | } |
| | | } |
| | | rw.Unlock() |
| | | // 因为本帧数据不符合规则,所以也不用统计结果数组里的东西 |
| | | |
| | | } |
| | |
| | | //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 { |
| | |
| | | } 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数据 |
| | |
| | | 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{} |
| | | } |
| | | |
| | | // 如果有持续时间条件维护开启一个定时器 |
| | |
| | | if rule.SdkArgAlias == "duration" { // |
| | | logger.Info("当前小规则是:---------", rule) |
| | | // 先看看定时器元素队列中是否有这条规则的定时器,如果有就不能再次创建了 |
| | | rw.Lock() |
| | | var flag bool = true |
| | | for k, _ := range TimeEleList { |
| | | if k == groupId+"+"+rule.Id { |
| | |
| | | TimeEleList[groupId+"+"+rule.Id] = &timeEle // 定时器元素以当前持续时间小规则id为键 |
| | | logger.Info("创建了计数器") |
| | | } |
| | | rw.Unlock() |
| | | } |
| | | } |
| | | } |
| | |
| | | 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{} |