| | |
| | | |
| | | import ( |
| | | "fmt" |
| | | "os" |
| | | "ruleprocess/cache" |
| | | "ruleprocess/logger" |
| | | "sort" |
| | |
| | | CameraId string |
| | | TaskId string |
| | | Sdkdata []*SdkData |
| | | RuleResult map[string]interface{} // 过完规则后打的标签 face: []Arg, yolo: []Result, cacheData: SdkDatas, timeLabel: 0,1,2,3,4,5 |
| | | RuleResult map[string]interface{} // 过完规则后打的标签 face: []FaceResult, yolo: []Result, cacheData: []ResultMsg, timeLabel: 0,1,2,3,4,5 |
| | | } |
| | | |
| | | type ResultMsg struct { |
| | |
| | | logger.Error("比对规则有误", err.(string)) |
| | | } |
| | | }() |
| | | logger.Info("+++++++++++规则开始运行+++++++++++++++++当前大规则--:", *groupRule) |
| | | logger.Info("+++++++++++规则开始运行+++++++++++++++++当前大规则--:", (*groupRule).GroupText) |
| | | //logger.Warn("传进去之后是什么德行:",args.RuleResult["yolo"]) |
| | | Compare(args, groupRule) |
| | | resultSplice := []*LittleRuleResult{} |
| | |
| | | // new一个定时器,如果以此groupId为标志的定时器不存在的话 |
| | | logger.Info("------------------------------------------当前是联动任务,规则是:", groupRule.GroupText) |
| | | var flag bool = true |
| | | var timeEle = TimeElement{N: 3, InitN: 3, GroupId: groupRule.GroupId} |
| | | var timeEle = TimeElement{N: 2, InitN: 2, GroupId: groupRule.GroupId} |
| | | for k, timeEle1 := range TimeEleList { |
| | | if k == groupRule.GroupId { |
| | | flag = false // 已经有了这个定时器就置为false 不再新增 |
| | |
| | | } |
| | | } |
| | | if flag { // 如果还没有这个定时器元素就新增一个 |
| | | timeEle := TimeElement{N: 3, InitN: 3, GroupId: groupRule.GroupId} // 扔进去一个定时器元素 |
| | | //timeEle := TimeElement{N: 2, InitN: 2, GroupId: groupRule.GroupId} // 扔进去一个定时器元素 |
| | | //TimeEleList = make(map[string]timeElement) |
| | | TimeEleList[groupRule.GroupId] = &timeEle // 定时器元素以规则组id为键 |
| | | logger.Info("---------------------------------------------联动任务创建了计数器并且计数器集合为:", TimeEleList) |
| | |
| | | } |
| | | } |
| | | if flag1 { |
| | | TimeEleList[groupRule.GroupId].RuleResults = append(TimeEleList[groupRule.GroupId].RuleResults, &RuleResult{groupRule.Rules[j].CameraId, groupRule.Rules[j].Sort, "", groupRule.Rules[j].RuleWithPre}) |
| | | TimeEleList[groupRule.GroupId].RuleResults = append(TimeEleList[groupRule.GroupId].RuleResults, &RuleResult{groupRule.Rules[j].CameraId, groupRule.Rules[j].Sort, "", groupRule.Rules[j].RuleWithPre,&ResultMsg{message,args.RuleResult}}) |
| | | } |
| | | } |
| | | } |
| | |
| | | // 判断结果数组是否完满(即被赋值完毕)可得出报警结果 |
| | | var isPerfect = true |
| | | for _, va := range timeEle.RuleResults { |
| | | logger.Info("---------------------瞅瞅当前数组________________:", *va) |
| | | //logger.Info("---------------------瞅瞅当前数组________________:", *va) |
| | | if va.Result == "" && va.RuleWithPre != "||" { |
| | | isPerfect = false |
| | | } |
| | | } |
| | | if isPerfect { |
| | | logger.Debug("数组完满了,联动任务可以成功报警了!") |
| | | // 将数组按sort排序 |
| | | sort.Sort(SubList(timeEle.RuleResults)) |
| | | // 排序后取各自的结果和连接符拼出规则表达式得出结果 |
| | |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | if result.(bool) { |
| | | logger.Info("___________________________________________________________________联动任务报警") |
| | | args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, "", groupRule.GroupId, groupRule.DefenceState,groupRule.AlarmLevel, groupRule.GroupText, []Rect{}, ""}) |
| | | //logger.Info("-------------------yolo结果标签有几个", len(args.RuleResult["yolo"].([]Result))) |
| | | if args.RuleResult["face"] != nil { |
| | | //logger.Info("-------------------face结果标签有几个", len(args.RuleResult["face"].([]FaceResult))) |
| | | // 把数组里缓存的数据取出来一起报警 |
| | | args.RuleResult["linkCache"] = []*ResultMsg{} |
| | | for _, ruleRes := range TimeEleList[groupRule.GroupId].RuleResults { |
| | | args.RuleResult["linkCache"] = append(args.RuleResult["linkCache"].([]*ResultMsg),ruleRes.CacheData) |
| | | } |
| | | //os.Exit(0) |
| | | logger.Debug("联动任务缓存了几个数据",len(args.RuleResult["linkCache"].([]*ResultMsg))) |
| | | os.Exit(1) |
| | | } |
| | | } |
| | | } else { |
| | |
| | | } |
| | | } else { // 没有报警, |
| | | //logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为false") |
| | | // 所以也要去结果数组里放值或更新 |
| | | for _, va := range timeEle.RuleResults { |
| | | if args.CameraId != "" && va.CameraId == args.CameraId { |
| | | va.Result = strconv.FormatBool(isOk) |
| | | // 所以也要去结果数组里放值或更新 07/30备注: 不应放值,应删除定时器,等为true时再度开启 |
| | | //for _, va := range timeEle.RuleResults { |
| | | // if args.CameraId != "" && va.CameraId == args.CameraId { |
| | | // va.Result = strconv.FormatBool(isOk) |
| | | // } |
| | | //} |
| | | for k,_ := range TimeEleList { |
| | | if k == groupRule.GroupId { |
| | | delete(TimeEleList,k) |
| | | logger.Debug("因为定时器的一帧数据结果为false,干掉定时器") |
| | | } |
| | | } |
| | | // 因为本帧数据不符合规则,所以也不用统计结果数组里的东西 |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | timeLength, _ := strconv.Atoi(rule.SdkArgValue) |
| | | timeEle := TimeElement{N: timeLength, InitN: timeLength, AlarmFlag: false, BufferFlag: 10, CacheSdkData: ResultMsg{message, args.RuleResult}} // 扔进去一个定时器元素(并缓存当前画面帧数据) |
| | | //TimeEleList = make(map[string]timeElement) |
| | | TimeEleList[groupId+" "+rule.Id] = &timeEle // 定时器元素以组规则id和当前持续时间小规则id为键 |
| | | TimeEleList[rule.Id] = &timeEle // 定时器元素以当前持续时间小规则id为键 |
| | | //logger.Info("创建了计数器并且计数器集合为:", TimeEleList) |
| | | } |
| | | } |