diff --git a/main.go b/main.go index 19b0b68..1fc7aa0 100644 --- a/main.go +++ b/main.go @@ -63,9 +63,13 @@ func init() { panic("failed to read config file:" + err.Error()) } for _, device := range proto.Config.DeviceInfo { - service.DeviceRWMap[device.ID] = sync.RWMutex{} - service.DeviceCurrentFrameMap[device.ID] = gocv.NewMat() - service.DeviceIsGettingFrame[device.ID] = false + //service.DeviceRWMap[device.ID] = sync.RWMutex{} + //service.DeviceCurrentFrameMap[device.ID] = gocv.NewMat() + //service.DeviceIsGettingFrame[device.ID] = false + service.DeviceRWMap.Store(device.ID, &sync.RWMutex{}) + service.DeviceCurrentFrameMap.Store(device.ID, gocv.NewMat()) + service.DeviceFrameCount.Store(device.ID, 0) + service.DeviceIsGettingFrame.Store(device.ID, false) } } @@ -83,7 +87,15 @@ func ReadConfigAndSetSystem() { } //检测是否需要获取设备流,如果需要则开启 for _, device := range proto.Config.DeviceInfo { - if service.DeviceIsGettingFrame[device.ID] == false && device.NextStop == false { //如果设备流已经停止且不暂停,则开启 + is_get, ok := service.DeviceIsGettingFrame.Load(device.ID) + if !ok { + //说明没有这个设备,需初始化添加 + service.DeviceRWMap.Store(device.ID, &sync.RWMutex{}) + service.DeviceCurrentFrameMap.Store(device.ID, gocv.NewMat()) + service.DeviceFrameCount.Store(device.ID, 0) + service.DeviceIsGettingFrame.Store(device.ID, false) + } + if is_get == false && device.NextStop == false { //如果设备流已经停止且不暂停,则开启 go service.GetVideoStream(device.ID) fmt.Println("device:", device.ID, " has started!") } diff --git a/service/tool.go b/service/tool.go index 7b61985..1ed98f1 100644 --- a/service/tool.go +++ b/service/tool.go @@ -14,35 +14,45 @@ import ( "time" ) -var DeviceRWMap = make(map[int]sync.RWMutex) -var DeviceCurrentFrameMap = make(map[int]gocv.Mat) -var DeviceFrameCount = make(map[int]int) -var DeviceIsGettingFrame = make(map[int]bool) +var DeviceRWMap = &sync.Map{} +var DeviceCurrentFrameMap = &sync.Map{} +var DeviceFrameCount = &sync.Map{} +var DeviceIsGettingFrame = &sync.Map{} func SetDeviceCurrentFrame(frame gocv.Mat, device_id int) error { //获取读写锁 - mutex, ok := DeviceRWMap[device_id] + mutex_, ok := DeviceRWMap.Load(device_id) if !ok { return fmt.Errorf("设备:%s 读写锁不存在", device_id) } + mutex := mutex_.(*sync.RWMutex) mutex.Lock() defer mutex.Unlock() //设置当前帧 - DeviceCurrentFrameMap[device_id] = frame - DeviceFrameCount[device_id]++ + DeviceCurrentFrameMap.Store(device_id, frame) + frame_count, ok := DeviceFrameCount.Load(device_id) + if !ok { + return fmt.Errorf("设备:%s 当前帧计数不存在", device_id) + } + frame_count_ := frame_count.(int) + frame_count_++ + DeviceFrameCount.Store(device_id, frame_count_) return nil } func GetDeviceCurrentFrame(device_id int) (gocv.Mat, int) { //获取读写锁 - mutex, ok := DeviceRWMap[device_id] + mutex_, ok := DeviceRWMap.Load(device_id) if !ok { return gocv.NewMat(), -1 } + mutex := mutex_.(*sync.RWMutex) mutex.RLock() defer mutex.RUnlock() //获取当前帧 - return DeviceCurrentFrameMap[device_id], DeviceFrameCount[device_id] + frame, ok := DeviceCurrentFrameMap.Load(device_id) + frame_count, ok := DeviceFrameCount.Load(device_id) + return frame.(gocv.Mat), frame_count.(int) } func getVideoFrame(device proto.DeviceInfo) { @@ -86,9 +96,9 @@ func getVideoFrame(device proto.DeviceInfo) { currentTime := time.Now().Format("2006-01-02 15:04:05") gocv.PutText(&frame, currentTime, image.Point{10, 20}, font, fontScale, fontColor, lineType) //需要将帧付给全局变量 - err := SetDeviceCurrentFrame(frame, device.ID) - if err != nil { - fmt.Printf("设备:%s 错误: 无法设置当前帧\n", device) + err3 := SetDeviceCurrentFrame(frame, device.ID) + if err3 != nil { + fmt.Printf("设备:%d 错误: 无法设置当前帧,err:%s \n", device.ID, err3.Error()) } z++ err2 := frame.Close() @@ -113,7 +123,12 @@ func Get(url string) int { } func GetVideoStream(id int) { - if DeviceIsGettingFrame[id] == true { + is_get, ok := DeviceIsGettingFrame.Load(id) + if !ok { + fmt.Println("device:", id, " not found") + return + } + if is_get == true { fmt.Println("device:", id, " is running!") return } @@ -133,22 +148,22 @@ func GetVideoStream(id int) { log.Println("device:", id, " not found") break } - - if DeviceIsGettingFrame[id] == true { + is_get, ok = DeviceIsGettingFrame.Load(id) + if is_get == true { log.Println("for device:", id, " is running!") break } if device.NextStop { - DeviceIsGettingFrame[id] = false + DeviceIsGettingFrame.Store(id, false) break } //设置设备控制信息 status := Get(device.Control) - DeviceIsGettingFrame[id] = true + DeviceIsGettingFrame.Store(id, true) log.Println("device:", device.ID, " set control info status:", status) getVideoFrame(device) - DeviceIsGettingFrame[id] = false //停止之后,设置已停止信息 + DeviceIsGettingFrame.Store(id, false) //等待1s time.Sleep(1 * time.Second) }