B
    g^                 @   sN   d Z ddlZddlZddlmZ ddlmZ ddlmZ eZ	G dd dZ
dS )zManage group of cameras that are set up as a master and slaves.

Original author: Mark Zvilius, 20-July-2019
For: The Sexton Corp
    N)E2Camera)Dict)Anyc               @   s   e Zd ZdZd+ddZdd Zeeee	f ddd	Z
d
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# ZG d$d% d%eZG d&d' d'eZG d(d) d)eZd*S ),CameraGroupz1A group of cameras set up as a master and slaves.Fc             C   s   || _ g | _d| _|| _dS )zConstructor.FN)ipscameras	recordingno_lens)selfr   r	    r   -/home/pi/sexton-multicamera/e2/CameraGroup.py__init__   s    zCameraGroup.__init__c       	      C   s   t | jdkrtdd}d}x| jD ]}d| d| d}td| t|t||| jd	}| |}|	|\}}|dkrt
| d
| | j| |d }d}q(W t  dS )z3Create camera objects, connect and initialize them.r   zno cameras are configured   Tzcamera z ()Zconnect)masterr	   z: FN)lenr   r   ConfigErrorprintr   strr	   build_camera_settingsZstart_cameraConnectionErrorr   append)	r
   idr   ipZcam_strZcamsettingsstatuserrmsgr   r   r   start_cameras    s     


zCameraGroup.start_cameras)r   returnc             C   s:   t j}|t jkr6t j| }||tj< t| d|  |S )Nz focus )	E2Configscamera_settingscamera_focusE2KEY_LENS_FOCUS_POSr   )r
   r   r   posr   r   r   r   D   s    


z!CameraGroup.build_camera_settingsc             C   s6   |t | jks|dk r2td| dt | j ddS )z:Verify that idx is a valid index into the list of cameras.r   zcamera index z invalid (# cams=r   N)r   r   	Exception)r
   idxr   r   r   validate_indexM   s    zCameraGroup.validate_indexc             C   s(   |  | |d }|t| jkr$d}|S )z(Decrement a camera index, with wrapping.r   r   )r'   r   r   )r
   r&   next_idxr   r   r   wrap_index_decrementS   s
    
z CameraGroup.wrap_index_decrementc             C   s,   |  | |d }|dk r(t| jd }|S )z(Increment a camera index, with wrapping.r   r   )r'   r   r   )r
   r&   r(   r   r   r   wrap_index_increment\   s
    
z CameraGroup.wrap_index_incrementc             C   s8   d}d}x&| j D ]}||\}}|dkrP qW ||fS )zChange white-balance setting.r    )r   Zcommand_set_wb)r
   	new_valuer   r   cr   r   r   	change_wbk   s    zCameraGroup.change_wbc             C   s8   d}d}x&| j D ]}||\}}|dkrP qW ||fS )zChange iso setting.r   r+   )r   Zcommand_set_iso)r
   r,   r   r   r-   r   r   r   
change_isov   s    zCameraGroup.change_isoc             C   s8   d}d}x&| j D ]}||\}}|dkrP qW ||fS )zChange shutter setting.r   r+   )r   Zcommand_set_shutter)r
   r,   r   r   r-   r   r   r   change_shutter   s    zCameraGroup.change_shutterc             C   s8   d}d}x&| j D ]}||\}}|dkrP qW ||fS )zChange video-encoder setting.r   r+   )r   Zcommand_set_encoder)r
   r,   r   r   r-   r   r   r   change_encoder   s    zCameraGroup.change_encoderc             C   s8   d}d}x&| j D ]}||\}}|dkrP qW ||fS )zChange f-stop (iris) setting.r   r+   )r   Zcommand_set_fstop)r
   r,   r   r   r-   r   r   r   change_fstop   s    zCameraGroup.change_fstopc             C   s   | j r|  S |  S dS )zRecording start/stop.N)r   stop_recordingstart_recording)r
   r   r   r   command_record_toggle   s    z!CameraGroup.command_record_togglec             C   s~   t | jdkr d| _td dS d| _| jd d\}}|dkrJ||fS | d\}}|dkrh||fS d| _td ||fS )zStart cameras recording.r   Tzstart recording)r   r+   FstartZrec_ing)r   r   r   r   command_recordpoll_record_status)r
   r   r   r   r   r   r4      s      zCameraGroup.start_recordingc             C   sN   d| _ td t| jdkr dS | jd d\}}|dkrD||fS | dS )zStop cameras recording.Fzstop recordingr   )r   r+   stopZrec)r   r   r   r   r7   r8   )r
   r   r   r   r   r   r3      s     zCameraGroup.stop_recordingc             C   s8   d}d}x&| j D ]}||\}}|dkrP qW ||fS )z/Poll all cameras for expected recording status.r   r+   )r   Zcheck_record_mode)r
   Zexpected_statusr   r   r-   r   r   r   r8      s    zCameraGroup.poll_record_statusc             C   s$   t | jdkrdS | jd  S dS )zGet camera temperature.

        returns -- (status,result)
                   success: status=0 and result=temperature
                   error: status!=0 and result=errmsg
        r   )r   c   N)r   r   get_temperature)r
   r   r   r   r;      s    
zCameraGroup.get_temperaturec               @   s   e Zd ZdZdS )zCameraGroup.Errorz)Base class for exceptions in CameraGroup.N)__name__
__module____qualname____doc__r   r   r   r   Error   s   r@   c               @   s   e Zd ZdZdd ZdS )zCameraGroup.ConfigErrorz"Exception for configuration error.c             C   s
   || _ dS )zConstructor.N)message)r
   rA   r   r   r   r      s    z CameraGroup.ConfigError.__init__N)r<   r=   r>   r?   r   r   r   r   r   r      s   r   c               @   s   e Zd ZdZdd ZdS )zCameraGroup.ConnectionErrorzException for connection error.c             C   s
   || _ dS )zConstructor.N)rA   )r
   rA   r   r   r   r     s    z$CameraGroup.ConnectionError.__init__N)r<   r=   r>   r?   r   r   r   r   r   r      s   r   N)F)r<   r=   r>   r?   r   r   IpTyper   r   r   r   r'   r)   r*   r.   r/   r0   r1   r2   r5   r4   r3   r8   r;   r%   r@   r   r   r   r   r   r   r      s(   
$		r   )r?   
E2Protocolr"   r   r   typingr   r   r   rB   r   r   r   r   r   <module>   s   