panlei
2019-07-10 40c09c362a2b8edab8e52ec2cc09dd7e0c883a4c
修改定时器
3个文件已修改
46 ■■■■ 已修改文件
main.go 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/ruleToformula.go 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/timeTicker.go 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.go
@@ -44,11 +44,6 @@
    go ruleserver.TimeTicker()
    nReciever("ipc:///tmp/sdk-2-rules-process.ipc", deliver.PushPull, 1)
    wg.Wait()
    //resp,err := DrawPolygonOnImage()
    //if err != nil {
    //    logger.Println("画框或者上传有问题")
    //}
    //logger.Println(resp["fileUrl"].(string))
}
func nReciever(url string, m deliver.Mode, count int) {
    c := deliver.NewServer(m, url)
ruleserver/ruleToformula.go
@@ -197,7 +197,7 @@
    }
}
// 对单帧图像的判断 是舍弃(或者说对于某些需求可以放ES数据库一份)还是返回
// 对单帧图像的判断 thisSdkDatas  当前传入的这帧数据,cacheSdkData 定时器里缓存的一帧数据 没有就返回nil  (thisSdkDatas SdkDatas, cacheSdkDatas SdkDatas)
func Judge(args *SdkDatas) {
    if len(args.Sdkdata) > 0 {
        // 拿到本摄像机的区域
@@ -404,7 +404,7 @@
            ipcId := sdk.IpcId
            if ipcId == sdkData.IpcId {
                for _, areaMap := range sdkData.AreaMapList {
                    duration(groupRule.Rules[j], &areaMap)
                    duration(groupRule.Rules[j], &areaMap, args)
                }
            }
        }
@@ -661,9 +661,9 @@
                if result.(bool) {
                    logger.Info("___________________________________________________________________联动任务报警")
                    args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, "", groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText, []Rect{}})
                    logger.Info("-------------------yolo结果标签", args.RuleResult["yolo"].([]Result))
                    logger.Info("-------------------yolo结果标签有几个", len(args.RuleResult["yolo"].([]Result)))
                    if args.RuleResult["face"] != nil {
                        logger.Info("-------------------face结果标签", args.RuleResult["face"].([]Arg))
                        logger.Info("-------------------face结果标签有几个", len(args.RuleResult["face"].([]Arg)))
                    }
                    //os.Exit(0)
                }
@@ -675,7 +675,7 @@
        logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为false")
        // 所以也要去结果数组里放值或更新
        for _, va := range timeEle.RuleResults {
            if args.CameraId != "" && va.CameraId == args.CameraId { // arg.CameraId 随便找一个数据
            if args.CameraId != "" && va.CameraId == args.CameraId {
                va.Result = strconv.FormatBool(isOk)
            }
        }
@@ -824,7 +824,7 @@
}
// 都过滤完条件之后看看是否要创建一个定时器元素 创建定时器的条件:是否有靠右行,个体静止等自带定时器含义的算法以及是否有持续时间
func duration(rule *protomsg.Rule, am *AreaMap) {
func duration(rule *protomsg.Rule, am *AreaMap, args *SdkDatas) {
    if rule.PolygonId == am.areaId { // 首先规则所对应的区域id要跟区域数据的id对的上  配置的算法要对的上
        if rule.SdkArgAlias == "duration" { //
            // 先看看定时器元素队列中是否有这个摄像机这个区域的定时器,如果有就不能再次创建了
@@ -838,7 +838,7 @@
            if flag {
                timeLength, _ := strconv.Atoi(rule.SdkArgValue)
                timeEle := TimeElement{N: timeLength, InitN: timeLength} // 扔进去一个定时器元素
                timeEle := TimeElement{N: timeLength, InitN: timeLength, AlarmFlag: false, CacheSdkData: *args} // 扔进去一个定时器元素
                //TimeEleList = make(map[string]timeElement)
                TimeEleList[am.taskId+" "+am.sdkId+" "+am.areaId] = &timeEle // 定时器元素以摄像机id拼接区域id为键
                logger.Info("创建了计数器并且计数器集合为:", TimeEleList)
ruleserver/timeTicker.go
@@ -13,13 +13,15 @@
// 定时器元素
type TimeElement struct {
    N           int     // 按时间依次递减的当前值
    InitN       int     // 赋值后就不变的初始值
    Data        AreaMap //
    GroupId     string  // 联动规则需要记录下此时的规则组id
    RuleResults []*RuleResult
    N            int      // 按时间依次递减的当前值
    InitN        int      // 赋值后就不变的初始值
    AlarmFlag     bool      // 报警标志位 定时器开启后第一次报警时会被置为true 往后再来报警也不会插进ES
    CacheSdkData SdkDatas // 定时器的缓存数据 持续时间类的开启定时器时要缓存一帧
    GroupId      string   // 联动规则需要记录下此时的规则组id
    RuleResults  []*RuleResult
}
type RuleResult struct { // 每个摄像机一个结构体
type RuleResult struct {
    // 每个摄像机一个结构体
    CameraId    string // 摄像机id
    Sort        int32  // 摄像机在规则组中序号
    Result      string // 摄像机过滤数据得出的结果
@@ -35,13 +37,17 @@
        for {
            select {
            case <-ticker.C:
                logger.Info("定时器执行单元",time.Now().Unix())
                fmt.Println("定时器执行单元",time.Now().Unix())
                logger.Info("定时器执行单元", time.Now().Unix())
                fmt.Println("定时器执行单元", time.Now().Unix())
                // 每秒钟计数器池子里所有的计数器元素都减一,减到0的是该报警的
                for _, timeEle := range TimeEleList {
                for k, timeEle := range TimeEleList {
                    if timeEle.N > 0 {
                        timeEle.N = timeEle.N - 1
                        logger.Info("-------------------------------------打印定时器元素当前值-----------------------------------------:",timeEle.N)
                        logger.Info("-------------------------------------打印定时器元素当前值-----------------------------------------:", timeEle.N)
                    }
                    if timeEle.GroupId != "" && timeEle.N == 0{
                        // 说明是联动任务的时间窗口 到点儿了该销毁了,再来了再开启
                        delete(TimeEleList,k)
                    }
                }
            case stop := <-stopChan:
@@ -102,4 +108,3 @@
func (p resultList) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
func (p resultList) Len() int           { return len(p) }
func (p resultList) Less(i, j int) bool { return p[i].Sort < p[j].Sort }