B
    ȑ^i                 @   s<   d dl Z d dlZd dlZG dd deZG dd deZdS )    Nc               @   sL   e Zd ZdddddZdd Zdd	 Zd
d Zdd Zdd Zdd Z	dS )
ErgManager   g      ?)
check_rateupdate_ratec            C   s   || _ || _|| _|| _|| _g | _g | _d| _t	 | _
tj| jdtj| jdd| _x$| j D ]\}}||_|  qfW dS )z
        Sets up erg manager
        Creates threads for detecting ergs and getting their status'
        The callbaks are for the addition and update events of the ergs
        F)target)Z	erg_checkZ
status_getN)_pyrowadd_callbackupdate_callbackr   r   _devicesergsexit_requestedqueueZQueue	_status_q	threadingThread_erg_checker_status_getter_threadsitemsnamestart)selfpyrowr   r	   r   r   r   t r   "/var/underergo/pyrow/ergmanager.py__init__   s    
zErgManager.__init__c             C   sZ   | j d  d| _xB| jD ]8}d|_x,| j D ]\}}td| |  q0W qW d S )NTzWaiting on thread-{})	r   putr   r   r   r   printformatjoin)r   _ergr   r   r   r   r   stop/   s    zErgManager.stopc             K   s    x| j D ]}|jf | qW d S )N)r   set_workout)r   kwargsr!   r   r   r   r#   8   s    zErgManager.set_workoutc             C   s    x| j D ]}|j|d qW d S )N)distance)r   r#   )r   r%   r!   r   r   r   set_distance<   s    zErgManager.set_distancec             C   s   dd | j D S )Nc             S   s   g | ]
}|j qS r   )r   ).0r!   r   r   r   
<listcomp>A   s    z(ErgManager.get_names.<locals>.<listcomp>)r   )r   r   r   r   	get_names@   s    zErgManager.get_namesc             C   s   x| j syt| j }|sx|D ]x}| | jkr"| j|  t| j|| j| j	d}| j
| | |}|d k	r"||  kr||_q"td|q"W W n tk
r    Y nX t| j qW d S )N)r   devicestatus_qratezName {} already exists)r   listr   find__repr__r
   appendErgr   r   r   r   r)   r   
ValueErrorr   ConnectionErrortimesleepr   )r   devicesr*   Znew_ergnew_namer   r   r   r   C   s,    


zErgManager._erg_checkerc             C   s8   x2| j s2| j }|d krP | | | j  qW d S )N)r   r   getr	   Z	task_done)r   itemr   r   r   r   c   s    

zErgManager._status_getterN)
__name__
__module____qualname__r   r"   r#   r&   r)   r   r   r   r   r   r   r      s   	 r   c               @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )r1      c             C   sx   || _ || _| j || _| j | _| j | _i | _|| _|| _	d| _
tj| jd| _d| j| j_| j  dS )z
        Sets up erg
        F)r   zerg_monitor - {}N)r   Z_devicePyErg_pyergr/   idr   datar   r,   r   r   r   erg_monitor_threadr   r   )r   r   r*   r+   r,   r   r   r   r   o   s    zErg.__init__c             C   s   | j S )N)r   )r   r   r   r   r/      s    zErg.__repr__c          
   C   s   d}d}d}x| j syz| jjddd}| jjdd}| jjdd}| j| | j| | j| |d dkrtd|  | j	
|  W n* tk
r } ztdW d d }~X Y nX t| j qW d S )	NT)pretty	forceplot)rE   statezWorkout endzWorkout erg {} finishedzErgmanager line 139)r   r?   get_monitorget_workoutget_ergrA   updater   r   r   r   r3   r4   r5   r,   )r   ZcstateZcstrokeZcworkoutmonitorZworkouterger   r   r   rB      s"    zErg.erg_monitorc             K   s   | j jf | d S )N)r?   r#   )r   r$   r   r   r   r#      s    zErg.set_workoutN)r=   )r:   r;   r<   r   r/   rB   r#   r   r   r   r   r1   l   s   
r1   )r   r   r4   objectr   r1   r   r   r   r   <module>
   s   ]