import time
import json
import cv2
from queue import Queue, Full
from threading import Thread
from log import logger

with open('cfg.json', 'r') as f:
    cfg_dict = json.load(f)

CAMERA_QUEUE = {camera_name: Queue(1) for camera_name in cfg_dict['camera']}


def camera_start(camera_name, camera_source):
    """
    启动摄像头
    Args:
        camera_name:
        camera_source:

    Returns:

    """
    for line in range(1, 4):
        try:
            capture_obj = cv2.VideoCapture(camera_source)
            result, _ = capture_obj.read()
            if not result:
                raise Exception
        except Exception as e:
            logger.error(f'{camera_name} {camera_source}:第{line}次启动失败')
            continue

        logger.info(f'{camera_name} {camera_source}:第{line}次启动成功')
        return True, capture_obj
    return False, None


def camera_add_queue(camera_name, camera_source, camera_queue):
    """
    启动摄像头,添加帧到队列
    Args:
        camera_name:
        camera_source:
        camera_queue:

    Returns:

    """
    logger.info(f'{camera_name}线程启动')
    start_flag, capture_obj = camera_start(camera_name, camera_source)

    if not start_flag:
        return
    logger.info(f'开始添加帧到队列')

    while True:
        result, frame_picture = capture_obj.read()
        if not result:
            continue
        try:
            camera_queue.put_nowait(frame_picture)
        except Full:
            time.sleep(0.01)
            continue


def camera_mul_thread():
    """
    摄像头对应拉起线程
    Returns:

    """
    thread_pool = []
    for camera_name in cfg_dict['camera']:
        camera_th = Thread(target=camera_add_queue,
                           args=(camera_name, cfg_dict['camera']['camera_name'], CAMERA_QUEUE[camera_name]))
        thread_pool.append(camera_th)

    for camera_thread in thread_pool:
        camera_thread.start()


if __name__ == '__main__':
    camera_mul_thread()