a
    "8i#                     @   sf   d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	 d dl
mZ d dlmZ G dd dZdS )	    N)import_module)DictAnySet)logger)config)ResilientI2CBusc                   @   sF   e Zd Zdd ZeeeedddZedddd	Zdd
ddZ	dS )DeviceLoaderc                 C   s   i | _ i | _t | _d S )N)spi_handlesdevicessetavailable_devices)self r   */var/aqua_controller/core/device_loader.py__init__   s    zDeviceLoader.__init__)portdevicespeedreturnc           	      C   s   ||f}|| j vrzTdd l}| }||| ||_d|_|| j |< td| d| d| d W q ty } z"t	d| d| |W Y d }~qd }~0 0 n8| j | j}||krt
d| d| d| d	| d
	 | j | S )Nr   u.   Инициализирована spi-шина :z @ z HzuB   Не удалось инициализировать spi-шину u8   Конфликт скоростей для spi-шины u   : запрошено u@    Hz, но шина уже инициализирована на z Hz.)r
   spidevZSpiDevopenZmax_speed_hzmoder   info	ExceptionRuntimeErrorwarning)	r   r   r   r   keyr   spieZcached_speedr   r   r   _create_spi_obj    s,    

".zDeviceLoader._create_spi_objN)devices_configr   c                    s8  i | _ t | _|s td d S t|}d}t|dD ]\}  dd| }z: fdddD }|rtd	d
	|  d fdddD }|rtdd
	| t
d }t|d }| }	 d}
|
d urFd|
v r|
d }t||
d< d|
v rFd|
v rF|
d }|
d }|
dd}| ||||
d< |	|
 |	| j |< | j| |d7 }td| d| d| d W nl ty } zRtd| d| d| d|  tdtjdd   W Y d }~q6W Y d }~n
d }~0 0 td! q6td"| d| d# |dkr4td$ d S )%Nu)   Список устройств пуст.r      nameZunnamed_c                    s   g | ]}| vr|qS r   r   .0k)itemr   r   
<listcomp>I       z%DeviceLoader.load.<locals>.<listcomp>)r$   moduleu)   Необходимы параметры: z, r+   c                    s   g | ]}| vr|qS r   r   r%   )module_infor   r   r)   N   r*   )pathclassu9   В модуле необходимы параметры: r-   r.   optionsZi2c_busZi2c_objspi_port
spi_device	spi_speedi  Z
spi_handle   Устройство 'z' (/u!   ) запущено успешноu4   Ошибка загрузки устройства 'z): u   Трассировка: )limitg?u%   Загрузка завершена: uC    устройств успешно инициализированоuS   НИ ОДНО устройство не было успешно загружено!)r   r   r   r   r   len	enumerategetKeyErrorjoinr   getattrr   r!   runaddr   r   errordebug	traceback
format_exctimesleep)r   r"   Ztotal_countZloaded_countidxZdevice_nameZmissing_keysZ
tmp_moduleZ	tmp_classZ
tmp_deviceZtmp_optionsZbus_numr0   r1   r2   r    r   )r(   r,   r   load:   sV    





"""
zDeviceLoader.load)r   c                 C   s  | j  D ]b\}}z|  td| d W q
 tyj } z"td| d|  W Y d }~q
d }~0 0 q
| j D ]r\\}}}z$|  td| d| d W qx ty } z(td| d| d	|  W Y d }~qxd }~0 0 qx| j 	  | j
	  | j	  d S )
Nr3   u(   ' остановлено успешно.u!   Ошибка остановки 'z': u   spi-шина r   u    закрытаu+   Ошибка закрытия spi-шины z: )r   itemsstopr   r   r   r>   r
   closeclearr   )r   r$   r   r    r   devr   r   r   r   rG   }   s    .4

zDeviceLoader.stop)
__name__
__module____qualname__r   intr   r!   listrE   rG   r   r   r   r   r	      s   Cr	   )r@   rB   	importlibr   typingr   r   r   core.loggerr   core.config_handlerr   Zcore.resilient_i2c_busr   r	   r   r   r   r   <module>
   s   