a
    TCi&.                     @   s`   d Z ddlZddlZddlZddlmZ G dd dZeedddZ	d	d
 Z
edkr\e
  dS )u.  
TCA9548A. I2C мультиплексор
- I2C интерфейс
- I2C адрес: 0x70 (заводское значение). Изменяется путем притягивания 3 контактов к земле или питанию.
- Питание модуля: от 1,65 В до 5,5 В постоянного тока
- Потребляемый ток: до 100 мА.
- Количество каналов: 8 шт. с поддержкой горячей замены устройств
- Datasheet: https://download.mikroe.com/documents/datasheets/tca9548a_datasheet.pdf

	Назначение: 
		Позволяет использовать 8 двунаправленных каналов, которыми можно управлять через шину I2C. 
		Например, если в приложении требуется восемь идентичных цифровых датчиков температуры, можно подключить 
		по одному датчику к каждому каналу: 0-7.
	Возможности:
		1. Использование как класса, используемого приложением
		2. Использование как самостоятельного приложения
	Синтаксис:
		tca9548a.py [--uid] [--bus] [-a address] [-c channel] [-o output]
		где:
			--uid       	- 	Уникальный идентификатор. 
								Параметр не обязательный. 
							  	В коде никак не обрабатывается.
							  	Предназначен скорее для источника, запросившего данные с датчика, может быть использован 
							  	при синхронном запросе в источнике и последующей обработке результата в источнике.
			--bus			-   Номер шины I2C на Raspberry Pi. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - по умолчанию номер шины = 0
									- 0|1 - номер шины. 
  			-a address 		- 	I2C адрес на котором расположена микросхема tca9548a. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - будет установлено значение по умолчанию, в соответствии 
									с установленным TCA9548A_ADDRESS;
									- адрес в десятичном или шестнадцатеричном представлении.
									Допускается значение от 0х70 до 0х77.
			-c channel		- 	Номер инициализируемого/активного канала. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - будет запрошен номер текущего активного канала
									- n - номер инициализируемого канала от 0 до 7.
			-o output		- 	Тип результата. 
								Параметр не обязательный.
								Допускается	следующий формат:
									- параметр не указан - тихий режим, без вывода результата
									- text - тип text
									- json - тип json
	Ответ в формате:
	json 
		{
			status: код ответа от сервиса (например 200 - ок|400 - не коррекнтый запрос|520 - неизвестная ошибка| и т.д.)
			message: описание ответа
			request: {
				uid: уникальный идентификатор
				bus: номер I2C шины 		
				address: адрес на котором расположена микросхема tca9548a.
				channel: номер инициализируемого канала
				output: тип результата
			}
			response: {
				channel: номер активного канала
			}
		}                                                    
	text
		status<код ответа> - <описание ответа>
		uid<уникальный идентификатор> bus<номер I2C шины> address<адрес> channel<номер инициализируемого канала> output<тип результата>
		channel<номер активного канала>
	
	Модуль написан в 2025 году.
	Основой для создания модуля послужила статья 
	https://stackoverflow.com/questions/41335921/how-to-read-from-multiplexer-with-python-i2c-tca9548a
    N)Anyc                   @   sx   e Zd ZdZdZg dZdefeeddddZdeddd	d
Z	efeddddZ
eddddZedddZdS )TCA9548Az0.2p   )                   @      N)i2caddressreturnc                 C   s   || _ || _d S N)i2cbusr   )selfr   r    r   1/var/aqua_controller/devices/tca9548a/tca9548a.py__init__]   s    zTCA9548A.__init__)r   r   c                 C   s
   || _ d S r   )r   )r   r   r   r   r   set_i2cc   s    zTCA9548A.set_i2c)r   r   c                 C   s
   || _ d S r   )r   )r   r   r   r   r   set_addressh   s    zTCA9548A.set_address)channelr   c              
   C   s|   zHd|  krdks&n t d| | j| jtj|  td W n. tyv } zt	d|W Y d }~n
d }~0 0 d S )Nr      u@   Указан не допустимый номер канала: g{Gz?u+   Ошибка записи в шину I2C: )

ValueErrorr   
write_byter   r   CHANNELtimesleep	ExceptionRuntimeError)r   r   er   r   r   set_channelm   s    zTCA9548A.set_channel)r   c              
   C   sp   z8| j | j}tdD ]}||? d@ r|  W S qW dS  tyj } ztd| W Y d }~n
d }~0 0 d S )Nr   r   u(   Ошибка чтения канала: )r   	read_byter   ranger   r    )r   Zcontrol_registerir!   r   r   r   get_channely   s    zTCA9548A.get_channel)N)__name__
__module____qualname__VERSIONADDRESSr   r   intr   r   r   r"   r'   r   r   r   r   r   R   s   r   )valuer   c                 C   s6   zt | dW S  ty0   td|  dY n0 d S )Nr   u#   Неверное значение: u+   . Ожидается целое число.)r-   r   argparseArgumentTypeError)r.   r   r   r   __fn_to_int   s    r1   c            
   
   C   s  d} d}d }d }zt jdd}|jdtdd dd |jd	tdd
dd |jddtdd dd |jddtdd dd |jddtdddgd dd | }W n4 t jy } zd} d| }W Y d }~n
d }~0 0 zd
d l}||j	}W n< t
y" } z"d} d|j	 d| }W Y d }~n
d }~0 0 | dkrz,t }|| |jd urX||j W n4 t
y } zd} d| }W Y d }~n
d }~0 0 | dkr|jd urz||j W n4 t
y } zd} d| }W Y d }~n
d }~0 0 | dkr8z| }W n4 t
y6 } zd} d | }W Y d }~n
d }~0 0 |d urz|  W n4 t
y } zd!} d"| }W Y d }~n
d }~0 0 z|jd ur|j dkr }	|	d#|  d$| d%7 }	|	|jd urd&|j d'nd(7 }	|	|j	d urd)|j	 d'nd(7 }	|	|jd ur"d*t|j d'nd(7 }	|	|jd urDd+|j d'nd(7 }	|	|jd urfd,|j d'nd(7 }	|	d-7 }	|	d+|d.kr|nd/ d%7 }	t|	 |jd ur|j dkri }	| |	d0< t||	d1< i |	d2< |jd urt|j|	d2 d3< |j	d ur|j	|	d2 d4< |jd ur,t|j|	d2 d5< |jd urF|j|	d2 d6< |jd ur`|j|	d2 d7< i |	d8< |d.krv|nd |	d8 d6< ttj|	dd9d: W nV t
y } z<d!} d;t|j d<| }td#|  d$| d= W Y d }~n
d }~0 0 d S )>N   okuE   Установка канала мультиплексора TCA9548A)descriptionz--uidFu>   Уникальный идентификатор запроса)typerequireddefaulthelpz--busr   uE   Номер шины I2C на Raspberry Pi (по умолчанию 0)z-az	--addressu'   Адрес мультиплексораz-cz	--channeluW   Номер инициализируемого канала мультиплексораz-oz--outputtextjsonu+   Формат вывода: text или json)r5   r6   choicesr7   r8   i  uA   Ошибка обработки командной строки: i  u   i2c шина u    недоступна: i  u>   Ошибка инициализации устройства: uS   Ошибка инициализации канала мультиплексора: ub   Ошибка определения активного канала мультиплексора: i  u1   Не удалось закрыть шину i2c: zstatus<z> - <z>
zuid<z>  zbus<zaddress<zchannel<zoutput<
r#   Nonestatusmessagerequestuidbusr   r   outputresponser   )ensure_asciiindentu4   Ошибка формирования ответа: z => >)r/   ArgumentParseradd_argumentstrr1   
parse_argsArgumentErrorsmbusSMBusrC   r   r   r   r   r   r   r"   r'   closerD   lowerrB   hexprintr:   dumpsr5   r(   )
_status_status_message_resultmy_i2cparserargsr!   rN   Zmy_TCA9548A	_responser   r   r   main   s     (

 
 
 
 ""&""r\   __main__)__doc__r/   r   r:   typingr   r   rK   r-   r1   r\   r(   r   r   r   r   <module>   s   I4p