| | |
| | | "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) |
| | |
| | | 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 不再新增 |
| | |
| | | } |
| | | } |
| | | } |
| | | logger.Info("") |
| | | 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() |
| | | // 因为本帧数据不符合规则,所以也不用统计结果数组里的东西 |
| | | |
| | | } |
| | |
| | | return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort} |
| | | } |
| | | |
| | | } 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{} |
| | | } |
| | |
| | | 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() |
| | | } |
| | | } |
| | | } |