FrontVehicleBrakeInJunction.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package main
  2. import (
  3. "cicv-data-closedloop/pjisuv_ticker"
  4. "fmt"
  5. "math"
  6. "sync"
  7. "time"
  8. )
  9. type Point struct {
  10. Latitude float64
  11. Longitude float64
  12. }
  13. var (
  14. Maxlenobj int32 = 0
  15. //定义园区T字路口的经纬度坐标值
  16. )
  17. // 定时任务触发器固定的
  18. func Topic() string {
  19. return pjisuv_ticker.TickerTopic
  20. }
  21. // ******* 禁止存在下划线_
  22. // 触发器标记
  23. func Label() string {
  24. return "FrontVehicleBrakeInJunction"
  25. }
  26. func Rule(shareVars *sync.Map) {
  27. defer func() {
  28. if r := recover(); r != nil {
  29. fmt.Println("Recovered from panic:", r)
  30. }
  31. }()
  32. // 1 使用goroutine
  33. go func(shareVars *sync.Map) {
  34. // 2 定义触发器的间隔时间
  35. ticker := time.NewTicker(time.Duration(3) * time.Second)
  36. defer ticker.Stop()
  37. // 3 运行一个无限循环
  38. for {
  39. select {
  40. // 定时器触发时执行的代码
  41. case <-ticker.C:
  42. FinalCallback(shareVars)
  43. }
  44. }
  45. }(shareVars)
  46. }
  47. func isBrake(ObjectList [][]float32) bool {
  48. for i, speed := range ObjectList[3] {
  49. if math.Abs(float64(ObjectList[1][i])) <= 5.3 && speed >= 6/3.6 && ObjectList[0][i] >= 1.3 {
  50. for j := 0; j < len(ObjectList[0])-i-1; j++ {
  51. if math.Abs(float64(ObjectList[1][1+i+j])) <= 5.3 && ObjectList[3][1+i+j] <= 1/3.6 {
  52. return true
  53. }
  54. }
  55. }
  56. }
  57. return false
  58. }
  59. func FinalCallback(shareVars *sync.Map) {
  60. OutsideWorkshopFlag, ok := shareVars.Load("OutsideWorkshopFlag")
  61. ObjDicOfTpperception, ok1 := shareVars.Load("objDicOfTpperception")
  62. ObjDic := ObjDicOfTpperception.(map[uint32][][]float32)
  63. EnterJunctionFlag, ok4 := shareVars.Load("EnterJunctionFlag")
  64. if ok && ok1 && ok4 && OutsideWorkshopFlag.(bool) == true {
  65. enterflag := EnterJunctionFlag.(bool)
  66. if enterflag {
  67. for _, objValue := range ObjDic {
  68. Maxlenobj = max(Maxlenobj, int32(len(objValue[0])))
  69. if len(ObjDic[0]) <= 10 || !isBrake(objValue) {
  70. continue
  71. }
  72. event_lable := "FrontVehicleBrakeInJunction"
  73. fmt.Println(event_lable)
  74. //ObjDicOfTpperception = make(map[uint32][][]float32)
  75. pjisuv_ticker.TickerChan <- pjisuv_ticker.TickInfo{FaultLabel: Label(), FaultHappenTime: pjisuv_ticker.GetNowTimeCustom()}
  76. }
  77. }
  78. if Maxlenobj >= 100 {
  79. ObjDicOfTpperception = make(map[uint32][][]float32)
  80. shareVars.Store("ObjDicOfTpperception", ObjDicOfTpperception)
  81. Maxlenobj = 0
  82. }
  83. }
  84. }