import gxipy as gx
import cv2
import numpy as np


def main():
    print("Инициализация камер...")
    
    # Создаем менеджер устройств
    device_manager = gx.DeviceManager()
    dev_num, dev_info_list = device_manager.update_all_device_list()
    
    if dev_num < 2:
        print("Найдено только %d камер. Нужно 2 камеры!" % dev_num)
        return

    # Открываем обе камеры
    cam1 = device_manager.open_device_by_index(1)
    cam2 = device_manager.open_device_by_index(2)
    
    # Устанавливаем разрешение для каждой камеры отдельно
    try:
        cam1.Width.set(1440)
        cam1.Height.set(1080)
        #print("Камера 1: установлено разрешение 640x480")
    except Exception as e:
        print("Ошибка установки разрешения камеры 1: %s" % str(e))
    
    try:
        cam2.Width.set(1440)
        cam2.Height.set(1080)
        #print("Камера 2: установлено разрешение 640x480")
    except Exception as e:
        print("Ошибка установки разрешения камеры 2: %s" % str(e))
    
    remote_device_feature1 = cam1.get_remote_device_feature_control()
    remote_device_feature2 = cam2.get_remote_device_feature_control()    
    
    # Только читаем текущие значения для каждой камеры
    exposure_time_feature1 = remote_device_feature1.get_float_feature("ExposureTime") 
    exposure_time_feature2 = remote_device_feature2.get_float_feature("ExposureTime")    
    print("Камера 1 экспозиция: %s" % exposure_time_feature1.get())
    print("Камера 2 экспозиция: %s" % exposure_time_feature2.get())    
    gain_value1 = remote_device_feature1.get_float_feature("Gain")
    gain_value2 = remote_device_feature2.get_float_feature("Gain")
    print("Камера 1 gain: %s" % gain_value1.get())
    print("Камера 2 gain: %s" % gain_value2.get())
    
    # Настраиваем обе камеры
    for cam in [cam1, cam2]:
        cam.TriggerMode.set(0)  # Непрерывный режим
    
    # Включаем потоки данных
    cam1.stream_on()
    cam2.stream_on()

    print("Запуск видеопотоков с двух камер. Нажмите 'q' для выхода...")
    
    try:
        while True:
            # Получаем изображения с обеих камер
            raw_image1 = cam1.data_stream[0].get_image()
            raw_image2 = cam2.data_stream[0].get_image()
            
            # Обрабатываем первую камеру
            if raw_image1 is not None:
                numpy_image1 = raw_image1.get_numpy_array()
                if numpy_image1 is not None:
                    cv2.imshow('Camera 1', numpy_image1)
            
            # Обрабатываем вторую камеру
            if raw_image2 is not None:
                numpy_image2 = raw_image2.get_numpy_array()
                if numpy_image2 is not None:
                    cv2.imshow('Camera 2', numpy_image2)
            
            # Выход по нажатию 'q'
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
                
    except KeyboardInterrupt:
        print("Прервано пользователем")
    
    finally:
        # Очистка
        cv2.destroyAllWindows()
        cam1.stream_off()
        cam2.stream_off()
        cam1.close_device()
        cam2.close_device()
        print("Камеры отключены")


if __name__ == "__main__":
    main()