a
    \gh)                     @   st   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ G dd	 d	eZdS )
    N)Thread)import_module)	TaskQueue)logger)config)SQLitec                       sp   e Zd Zedd fddZdd Zdeeddd	Zee	e
d
ddZdeddddZddddZ  ZS )DevicesManagerN)queuereturnc                    s0   t  jdd t | _|| _i | _t | _d S )NT)daemon)	super__init__	threadingEvent
stop_eventr	   	i2c_busesdictdevices)selfr	   	__class__ //var/aqua_controller/workers/devices_manager.pyr      s
    
zDevicesManager.__init__c                 C   s&  | j D ]}z$| j |   td| d W q ty } zFtd| d|  tdtjdd  W Y d }~qW Y d }~qd }~0 0 q| j	
 D ]|\}}z|  td| d	 W q ty } z:td
| d|  tdtjdd  W Y d }~qd }~0 0 q| j  d S )N   Устройство 'u(   ' остановлено успешно.u6   Ошибка остановки устройства 'z': %   Трассировка ошибки:    limitu   i2c-шина #u    закрытаu,   Ошибка закрытия i2c-шины #z: )r   stopr   info	Exceptionerrordebug	traceback
format_excr   itemscloser   set)r   item_deviceseZbus_numZbusr   r   r   r      s     
$0zDevicesManager.stop)optionsr
   c              
   C   s   |d u sd|vr|S d|v r$|d nd}|| j vrz,dd l}||| j |< td|  W n4 ty } ztd| |W Y d }~n
d }~0 0 | j | |d< |S )NZi2c_addressZi2c_busr   u/   Инициализирована i2c-шина #uC   Не удалось инициализировать i2c-шину #)r   smbusZSMBusr   r   r    RuntimeError)r   r*   Z
bus_numberr+   r)   r   r   r   Z__i2c_create3   s    
&zDevicesManager.__i2c_create)codevaluer
   c              
   C   s   t jddd d}|d u r tdzFd}||g}t|}||| W d    n1 sX0    Y  W dS  ty } z6td|  tdt	j
d	d
  W Y d }~dS d }~0 0 d S )N
controllersqlite_databases)sectionkeydefaultu1   Не указан путь к хранилищу.z
				INSERT INTO t_result (
					r_code, 
					r_create_datetime, 
					r_value
				) 
				SELECT ?, strftime('%Y-%m-%d %H:%M:00', 'now', 'localtime'), ?;
			TuK   Не удалось сохранить запись в хранилище: r   r   r   F)r   	get_value
ValueErrorr   executer    r   r!   r"   r#   r$   )r   r-   r.   "config_controller_sqlite_databasesqueryparamdbr)   r   r   r   Z__save_to_sqliteF   s    
*zDevicesManager.__save_to_sqlite)r   r
   c                    sf  |st d d S |D ]H z fdddD }|rTtd  dd| d n d } d	 fd
ddD }|rtd  dd| d nd }d }zt|}t||}W n@ ty } z(td  d| d| |W Y d }~n
d }~0 0 z
| }	W nB tyL } z(td  d| d| |W Y d }~n
d }~0 0 z`d v rb d nd }
t d  d|
d ur|
nd  |
d ur| 	|
nd }
|	
|
 W n8 ty } ztd  d|W Y d }~n
d }~0 0 |	| j|< t d| d W nN tyT } z4t d|  t dtjdd  W Y d }~n
d }~0 0 td qd S )Nu(   Cписок устройств пуст.c                    s   g | ]}| vr|qS r   r   .0r2   )r(   r   r   
<listcomp>i       z1DevicesManager.__load_devices.<locals>.<listcomp>)namemoduler   uh   ' не может быть подключено. Необходмо наличие параметров ,r?   r@   c                    s   g | ]}| vr|qS r   r   r;   )item_devices_moduler   r   r=   q   r>   )pathclassrC   rD   uF   ' не подключено. Ошибка импорта модуля .u]   ' не подключено. Ошибка создания экземпляра класса r*   u   Устройство: 'u   ' => Параметры: u   отсутствуютuD   ' не подключено. Ошибка инициализацииu!   ' запущено успешноu4   Ошибка загрузки устройства: r   r   r   g?)r   warningKeyErrorjoinr   getattrr    r,   r"   _DevicesManager__i2c_createrunr   r   r!   r#   r$   timesleep)r   r   Zmissing_keysZitem_devices_nameZitem_devices_module_pathZitem_devices_module_classZ
tmp_moduleZtmp_class_objr)   Ztmp_devicesZtmp_optionsr   )r(   rB   r   Z__load_devicesa   sJ    

2
2$(
.zDevicesManager.__load_devices)r
   c           	         s  t d zvztd}|d ur.| | t| jdkrDtd| j	 s$| j
 }|s`qDd|vrjqDd}|d D ]F t fddd	D rv d
 | jvrvt d d
  d d} qqv|sqD|d D ]H  d
 } d  }dd   D }|dkrz| j| | W nf ty| } zLt d| d| d t dtjdd  W Y d }~ qW Y d }~n
d }~0 0 q|dkrz$| j| |}| |d | W nf ty } zLt d| d| d t dtjdd  W Y d }~ qW Y d }~n
d }~0 0 qqtd qDW nN tyt } z4t d|  t dtjdd  W Y d }~n
d }~0 0 W t d nt d 0 d S )Nu   Поток запущен.r   r   u|   Cписок доступных устройств пуст. Вероятно есть ошибки конфигурации.actionsTc                 3   s   | ]}| v V  qd S )Nr   r;   item_actionsr   r   	<genexpr>   r>   z%DevicesManager.run.<locals>.<genexpr>devicemethodrS   r   uN   ' не доступно. Выполнение задания прервано.FrT   c                 S   s   i | ]\}}|d vr||qS )rR   r   )r<   kvr   r   r   
<dictcomp>   r>   z&DevicesManager.run.<locals>.<dictcomp>r'   u/   Ошибка выполнения метода z.set()r   r   r   getr-   u<   Ошибка функциональности потока: u    Поток остановлен.)r   r   r   get_section_DevicesManager__load_deviceslenr   r,   r   is_setr	   get_taskallcriticallowerr%   r'   r    r!   r"   r#   r$   rY   _DevicesManager__save_to_sqliterL   rM   )	r   Zconfig_devicesZ	self_taskZis_all_devices_actualZitem_actions_deviceZitem_actions_methodZitem_actions_paramsr)   resultr   rO   r   rK      s^    




((0zDevicesManager.run)N)N)__name__
__module____qualname__r   r   r   r   rJ   strfloatboolrb   r[   rK   __classcell__r   r   r   r   r      s   >r   )rL   r#   r   r   	importlibr   core.task_queuer   core.loggerr      core.сonfig_handlerr   core.sqliter   r   r   r   r   r   <module>   s   